From faf5ddaceb1d603f3159b95bff62ca5a0abd5325 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sun, 15 Nov 2015 19:18:24 -0500 Subject: [PATCH] Holodeck refactor and Enchancements Moves holodeck code to modules/holodeck. Repaths holodeck structures a little. Cleans holodeck code and prepares for additional features (multiple holodecks, etc). Should fix #4828. Necessary map bugfixen for Asteroid, Disc, Dream, Meta, and TG. Adds Lounge, Emergency Medical, pet center, and holdout room to the rec holodeck. All items spawned by the holodeck will do only stamina damage, except when emagged. This allows emergency medical to be staffed with scalpels and bonesaws and such. Emergency medical has some functioning equipment but the only drugs available are in the sleeper. --- .../AsteroidStation/AsteroidStation.dmm | 6 +- _maps/map_files/DiscStation/DiscStation.dmm | 4 +- .../map_files/DreamStation/dreamstation04.dmm | 4 +- .../MetaStation/MetaStation.v41I.dmm | 4 +- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 4 +- _maps/map_files/generic/z2.dmm | 266 +++++---- code/__HELPERS/unsorted.dm | 177 +----- code/game/area/Space Station 13 areas.dm | 52 -- .../machinery/computer/HolodeckControl.dm | 528 ------------------ .../game/machinery/computer/buildandrepair.dm | 4 +- code/game/objects/items/toys.dm | 3 + code/modules/holodeck/area_copy.dm | 111 ++++ code/modules/holodeck/areas.dm | 97 ++++ code/modules/holodeck/computer.dm | 210 +++++++ code/modules/holodeck/computer_funcs.dm | 109 ++++ code/modules/holodeck/holo_effect.dm | 87 +++ code/modules/holodeck/items.dm | 220 ++++++++ code/modules/holodeck/tables.dm | 68 +++ code/modules/holodeck/turfs.dm | 80 +++ code/modules/holodeck/windows.dm | 44 ++ .../simple_animal/friendly/farm_animals.dm | 4 + tgstation.dme | 10 +- 22 files changed, 1229 insertions(+), 863 deletions(-) delete mode 100644 code/game/machinery/computer/HolodeckControl.dm create mode 100644 code/modules/holodeck/area_copy.dm create mode 100644 code/modules/holodeck/areas.dm create mode 100644 code/modules/holodeck/computer.dm create mode 100644 code/modules/holodeck/computer_funcs.dm create mode 100644 code/modules/holodeck/holo_effect.dm create mode 100644 code/modules/holodeck/items.dm create mode 100644 code/modules/holodeck/tables.dm create mode 100644 code/modules/holodeck/turfs.dm create mode 100644 code/modules/holodeck/windows.dm diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm index 3776763707f..17ad0d78b11 100644 --- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm +++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm @@ -3606,7 +3606,7 @@ "brr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"},/area/hallway/primary/starboard{name = "Starboard Hallway"}) "brs" = (/turf/simulated/wall,/area/crew_quarters/fitness) "brt" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/fitness) -"bru" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) +"bru" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/rec_center) "brv" = (/turf/simulated/wall,/area/maintenance/asmaint2) "brw" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "brx" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -3640,7 +3640,7 @@ "brZ" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 1},/area/hallway/primary/starboard{name = "Starboard Hallway"}) "bsa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{icon_state = "1-2"},/obj/machinery/alarm{dir = 8; pixel_x = 22},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"},/area/hallway/primary/starboard{name = "Starboard Hallway"}) "bsb" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Maintenance Access"; req_access_txt = "0"; req_one_access_txt = "12; 19"},/turf/simulated/floor/plating,/area/maintenance/maintcentral) -"bsc" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) +"bsc" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/rec_center) "bsd" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bse" = (/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bsf" = (/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -3772,7 +3772,7 @@ "buB" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/fitness) "buC" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 4},/area/crew_quarters/fitness) "buD" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"buE" = (/obj/machinery/computer/HolodeckControl,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/crew_quarters/fitness) +"buE" = (/obj/machinery/computer/holodeck,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/crew_quarters/fitness) "buF" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/machinery/camera{c_tag = "Brig Atmospheric Control"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "buG" = (/obj/machinery/atmospherics/components/binary/pump/on{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "buH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/atmos{name = "Brig Atmospheric Control"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) diff --git a/_maps/map_files/DiscStation/DiscStation.dmm b/_maps/map_files/DiscStation/DiscStation.dmm index 41af593fbe2..6bd8d1d4f51 100644 --- a/_maps/map_files/DiscStation/DiscStation.dmm +++ b/_maps/map_files/DiscStation/DiscStation.dmm @@ -5571,7 +5571,7 @@ "cdg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "cdh" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "cdi" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"cdj" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) +"cdj" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/rec_center) "cdk" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel,/area/storage/testroom) "cdl" = (/turf/simulated/floor/plasteel,/area/storage/testroom) "cdm" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel,/area/storage/testroom) @@ -5836,7 +5836,7 @@ "cil" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/fitness) "cim" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness) "cin" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"cio" = (/obj/machinery/computer/HolodeckControl,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) +"cio" = (/obj/machinery/computer/holodeck,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "cip" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "ciq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint{name = "Aft Starboard Maintenance"}) "cir" = (/turf/simulated/floor/plating,/area/maintenance/asmaint{name = "Aft Starboard Maintenance"}) diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm index 78f818b81f4..973051aaeee 100644 --- a/_maps/map_files/DreamStation/dreamstation04.dmm +++ b/_maps/map_files/DreamStation/dreamstation04.dmm @@ -6174,7 +6174,7 @@ "coL" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating,/area/construction) "coM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "coN" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/crew_quarters/fitness) -"coO" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) +"coO" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/rec_center) "coP" = (/turf/simulated/floor/plasteel/darkblue,/obj/machinery/door/poddoor/shutters{id = "stationawaygate"; name = "Gateway Access Shutters"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel/warningline{tag = "icon-warningline (NORTH)"; icon_state = "warningline"; dir = 1},/area/gateway) "coQ" = (/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "coR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) @@ -6388,7 +6388,7 @@ "csR" = (/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/fore) "csS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/crew_quarters/fitness) "csT" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"csU" = (/obj/machinery/computer/HolodeckControl,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) +"csU" = (/obj/machinery/computer/holodeck,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "csV" = (/obj/effect/spawner/structure/window,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "csW" = (/obj/effect/spawner/structure/window,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "csX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) diff --git a/_maps/map_files/MetaStation/MetaStation.v41I.dmm b/_maps/map_files/MetaStation/MetaStation.v41I.dmm index 47dbd3b7729..8c44223d832 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41I.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41I.dmm @@ -293,7 +293,7 @@ "afG" = (/turf/simulated/floor/plasteel{icon_state = "vault"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "afH" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "afI" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) -"afJ" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) +"afJ" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/rec_center) "afK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "afL" = (/obj/structure/flora/kirbyplants{icon_state = "applebush"; layer = 4.1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/prison) "afM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) @@ -471,7 +471,7 @@ "ajc" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "ajd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "aje" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) -"ajf" = (/obj/machinery/computer/HolodeckControl,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"ajf" = (/obj/machinery/computer/holodeck,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "ajg" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "ajh" = (/turf/simulated/wall/r_wall,/area/engine/gravity_generator) "aji" = (/obj/machinery/conveyor{dir = 2; id = "garbage"; layer = 2.7},/obj/machinery/door/poddoor/preopen{id = "Disposal Exit"; layer = 3.1; name = "disposal exit vent"},/turf/simulated/floor/plating,/area/maintenance/disposal) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 06f86dcaea2..2ffe17605c1 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -896,7 +896,7 @@ "arl" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 9},/area/crew_quarters/fitness) "arm" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/crew_quarters/fitness) "arn" = (/obj/structure/closet/athletic_mixed,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) -"aro" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) +"aro" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/rec_center) "arp" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "arq" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8; name = "8maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "arr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -1119,7 +1119,7 @@ "avA" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness) "avB" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/crew_quarters/fitness) "avC" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"avD" = (/obj/machinery/computer/HolodeckControl,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) +"avD" = (/obj/machinery/computer/holodeck,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "avE" = (/obj/machinery/door/poddoor/preopen{id = "maint3"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "avF" = (/obj/machinery/door/poddoor/preopen{id = "maint3"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "avG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm index a659a755965..cd30e04891b 100644 --- a/_maps/map_files/generic/z2.dmm +++ b/_maps/map_files/generic/z2.dmm @@ -4,92 +4,92 @@ "ad" = (/turf/indestructible/riveted,/area/space) "ae" = (/obj/structure/window/reinforced,/turf/indestructible/riveted,/area/space) "af" = (/obj/structure/window/reinforced{dir = 4},/turf/indestructible/riveted,/area/space) -"ag" = (/turf/simulated/floor/holofloor{icon_state = "engine"; name = "Holodeck Projector Floor"},/area/holodeck/source_wildlife) +"ag" = (/obj/structure/foamedmetal,/obj/structure/window/holo{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/bunker) "ah" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/indestructible/riveted,/area/space) -"ai" = (/turf/simulated/floor/holofloor{icon_state = "engine"; name = "Holodeck Projector Floor"},/area/holodeck/source_plating) -"aj" = (/turf/simulated/floor/holofloor{icon_state = "engine"; name = "Burn-Mix Floor"; nitrogen = 0; oxygen = 2500; temperature = 370; toxins = 5000},/area/holodeck/source_burntest) -"ak" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_emptycourt) -"al" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_emptycourt) +"ai" = (/obj/structure/foamedmetal,/obj/structure/window/holo/opaque{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/holo{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/bunker) +"aj" = (/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/bunker) +"ak" = (/obj/structure/table/holo,/obj/item/stack/medical/ointment{heal_burn = 10},/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/bunker) +"al" = (/obj/structure/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) "am" = (/obj/structure/window/reinforced{dir = 8},/turf/indestructible/riveted,/area/space) -"an" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_emptycourt) -"ao" = (/obj/effect/landmark{name = "Holocarp Spawn"},/turf/simulated/floor/holofloor{icon_state = "engine"; name = "Holodeck Projector Floor"},/area/holodeck/source_wildlife) -"ap" = (/obj/effect/landmark{name = "Atmospheric Test Start"},/turf/simulated/floor/holofloor{icon_state = "engine"; name = "Burn-Mix Floor"; nitrogen = 0; oxygen = 2500; temperature = 370; toxins = 5000},/area/holodeck/source_burntest) -"aq" = (/turf/simulated/floor/holofloor,/area/holodeck/source_emptycourt) -"ar" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_emptycourt) -"as" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_emptycourt) -"at" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_emptycourt) -"au" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_emptycourt) +"an" = (/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"ao" = (/obj/structure/table/holo/poker,/obj/item/clothing/mask/cigarette/pipe,/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"ap" = (/obj/structure/table/holo/poker,/obj/effect/holodeck_effect/cards,/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"aq" = (/obj/structure/bed/chair/wood/normal{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"ar" = (/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/wildlife) +"as" = (/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/offline) +"at" = (/turf/simulated/floor/holofloor{icon_state = "engine"; name = "Burn-Mix Floor"; nitrogen = 0; oxygen = 2500; temperature = 370; toxins = 5000},/area/holodeck/rec_center/burn) +"au" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/rec_center/court) "av" = (/obj/docking_port/stationary/transit{dheight = 0; dir = 2; dwidth = 11; height = 22; id = "whiteship_transit"; width = 35},/turf/space/transit/horizontal,/area/space) "aw" = (/obj/docking_port/stationary/transit{dir = 4; dwidth = 1; height = 4; id = "pod3_transit"; turf_type = /turf/space/transit/horizontal; width = 3},/turf/space/transit/horizontal,/area/space) -"ax" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_emptycourt) -"ay" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/source_emptycourt) -"az" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/source_emptycourt) +"ax" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/rec_center/court) +"ay" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/rec_center/court) +"az" = (/obj/structure/foamedmetal,/obj/structure/window/holo{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/bunker) "aA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/indestructible/riveted,/area/space) -"aB" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_basketball) -"aC" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_basketball) -"aD" = (/obj/structure/holohoop,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_basketball) -"aE" = (/turf/simulated/floor/plating/beach/sand,/area/holodeck/source_beach) -"aF" = (/obj/structure/table/holotable,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/under/color/red,/obj/item/weapon/holo/esword/red,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"aG" = (/obj/structure/table/holotable,/obj/machinery/readybutton,/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"aH" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"aI" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_boxingcourt) -"aJ" = (/obj/machinery/readybutton,/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_boxingcourt) -"aK" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_boxingcourt) -"aL" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_basketball) -"aM" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_basketball) -"aN" = (/turf/simulated/floor/holofloor,/area/holodeck/source_basketball) -"aO" = (/obj/effect/overlay/palmtree_r,/turf/simulated/floor/plating/beach/sand,/area/holodeck/source_beach) -"aP" = (/obj/effect/overlay/palmtree_l,/obj/effect/overlay/coconut,/turf/simulated/floor/plating/beach/sand,/area/holodeck/source_beach) -"aQ" = (/turf/simulated/floor/holofloor,/area/holodeck/source_thunderdomecourt) -"aR" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"aS" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"aT" = (/turf/simulated/floor/holofloor,/area/holodeck/source_boxingcourt) -"aU" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_boxingcourt) -"aV" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_boxingcourt) -"aW" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_basketball) -"aX" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/holodeck/source_boxingcourt) +"aB" = (/obj/structure/table/holo,/obj/machinery/recharger,/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/bunker) +"aC" = (/obj/structure/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"aD" = (/obj/effect/holodeck_effect/mobspawner,/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/wildlife) +"aE" = (/obj/effect/holodeck_effect/sparks,/turf/simulated/floor/holofloor{icon_state = "engine"; name = "Burn-Mix Floor"; nitrogen = 0; oxygen = 2500; temperature = 370; toxins = 5000},/area/holodeck/rec_center/burn) +"aF" = (/turf/simulated/floor/holofloor,/area/holodeck/rec_center/court) +"aG" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/rec_center/court) +"aH" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/rec_center/court) +"aI" = (/obj/structure/table/holo,/obj/item/weapon/gun/energy/laser,/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/bunker) +"aJ" = (/obj/structure/window/holo/opaque{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/turf/simulated/floor/holofloor{tag = "icon-wood (NORTHWEST)"; icon_state = "wood"; dir = 9},/area/holodeck/rec_center/lounge) +"aK" = (/obj/item/device/instrument/violin,/obj/structure/table/holo/wood,/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"aL" = (/obj/structure/bed/chair/comfy/brown{buildstackamount = 0},/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"aM" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/rec_center/court) +"aN" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/rec_center/court) +"aO" = (/obj/structure/table/holo/wood,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"aP" = (/obj/structure/bed/chair/comfy/brown{buildstackamount = 0; dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"aQ" = (/obj/structure/bed/chair/wood/normal,/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"aR" = (/obj/structure/table/holo,/obj/item/stack/medical/bruise_pack{heal_brute = 10},/turf/simulated/floor/holofloor/plating,/area/holodeck/rec_center/bunker) +"aS" = (/obj/structure/table/holo/poker,/turf/simulated/floor/holofloor/carpet,/area/holodeck/rec_center/lounge) +"aT" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/rec_center/court) +"aU" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/rec_center/court) +"aV" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/rec_center/court) +"aW" = (/turf/simulated/floor/holofloor/grass,/area/holodeck/rec_center/pet_lounge) +"aX" = (/obj/effect/holodeck_effect/mobspawner/pet,/turf/simulated/floor/holofloor/grass,/area/holodeck/rec_center/pet_lounge) "aY" = (/obj/docking_port/stationary/transit{dir = 4; dwidth = 1; height = 4; id = "pod4_transit"; turf_type = /turf/space/transit/horizontal; width = 3},/turf/space/transit/horizontal,/area/space) -"aZ" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/holodeck/source_basketball) -"ba" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/holodeck/source_basketball) -"bb" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "red"},/area/holodeck/source_basketball) -"bc" = (/obj/item/clothing/under/color/rainbow,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plating/beach/sand,/area/holodeck/source_beach) -"bd" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor,/area/holodeck/source_thunderdomecourt) -"be" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"bf" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"bg" = (/obj/structure/holowindow{dir = 1},/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/holodeck/source_boxingcourt) -"bh" = (/obj/structure/holowindow{dir = 1},/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/holodeck/source_boxingcourt) -"bi" = (/obj/structure/holowindow{dir = 1},/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 6; icon_state = "red"},/area/holodeck/source_boxingcourt) -"bj" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "green"},/area/holodeck/source_basketball) -"bk" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "green"},/area/holodeck/source_basketball) -"bl" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "green"},/area/holodeck/source_basketball) -"bm" = (/obj/item/toy/beach_ball,/turf/simulated/floor/plating/beach/sand,/area/holodeck/source_beach) -"bn" = (/obj/structure/holowindow{dir = 1},/turf/simulated/floor/holofloor,/area/holodeck/source_thunderdomecourt) -"bo" = (/obj/structure/holowindow{dir = 1},/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"bp" = (/obj/structure/holowindow{dir = 1},/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"bq" = (/obj/structure/holowindow,/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 1; icon_state = "green"},/area/holodeck/source_boxingcourt) -"br" = (/obj/structure/holowindow,/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 9; icon_state = "green"},/area/holodeck/source_boxingcourt) -"bs" = (/obj/structure/holowindow,/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 5; icon_state = "green"},/area/holodeck/source_boxingcourt) +"aZ" = (/obj/structure/table/holo/glass,/obj/item/weapon/hemostat,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/holodeck/rec_center/medical) +"ba" = (/obj/structure/table/holo/glass,/obj/item/weapon/surgicaldrill,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (NORTHWEST)"; icon_state = "warnwhite"; dir = 9},/area/holodeck/rec_center/medical) +"bb" = (/obj/structure/table/holo/glass,/obj/item/weapon/retractor,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/holodeck/rec_center/medical) +"bc" = (/obj/structure/table/holo/glass,/obj/item/weapon/scalpel{pixel_y = 10},/obj/item/weapon/circular_saw,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/holodeck/rec_center/medical) +"bd" = (/obj/structure/table/holo/glass,/obj/item/weapon/cautery,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/holodeck/rec_center/medical) +"be" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/rec_center/basketball) +"bf" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/rec_center/basketball) +"bg" = (/obj/structure/holohoop,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/rec_center/basketball) +"bh" = (/turf/simulated/floor/holofloor/beach,/area/holodeck/rec_center/beach) +"bi" = (/obj/structure/table/holo,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/under/color/red,/obj/item/weapon/holo/esword/red,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/rec_center/thunderdome) +"bj" = (/obj/structure/table/holo,/obj/machinery/readybutton,/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/rec_center/thunderdome) +"bk" = (/obj/structure/table/holo,/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/rec_center/thunderdome) +"bl" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/rec_center/dodgeball) +"bm" = (/obj/machinery/readybutton,/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/rec_center/dodgeball) +"bn" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/rec_center/dodgeball) +"bo" = (/turf/simulated/floor/holofloor{icon_state = "white"; tag = "icon-bluespace"},/area/holodeck/rec_center/medical) +"bp" = (/obj/structure/table/holo/glass,/obj/item/weapon/surgical_drapes,/obj/item/weapon/razor,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (WEST)"; icon_state = "warnwhite"; dir = 8},/area/holodeck/rec_center/medical) +"bq" = (/turf/simulated/floor/holofloor{tag = "icon-warnwhite (EAST)"; icon_state = "warnwhite"; dir = 4},/area/holodeck/rec_center/medical) +"br" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/rec_center/basketball) +"bs" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/rec_center/basketball) "bt" = (/obj/docking_port/stationary/transit{dir = 4; dwidth = 9; height = 11; id = "emergency_transit"; width = 22},/turf/space/transit,/area/space) -"bu" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_basketball) -"bv" = (/obj/item/toy/beach_ball/holoball,/turf/simulated/floor/holofloor,/area/holodeck/source_basketball) -"bw" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_basketball) -"bx" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"by" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"bz" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_boxingcourt) -"bA" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_boxingcourt) -"bB" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_basketball) -"bC" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "green"},/area/holodeck/source_boxingcourt) -"bD" = (/turf/simulated/floor/plating/beach/coastline,/area/holodeck/source_beach) -"bE" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/source_basketball) -"bF" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/source_basketball) -"bG" = (/obj/structure/holohoop{dir = 1},/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_basketball) -"bH" = (/turf/simulated/floor/plating/beach/water,/area/holodeck/source_beach) -"bI" = (/obj/structure/table/holotable,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/under/color/green,/obj/item/weapon/holo/esword/green,/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"bJ" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"bK" = (/obj/structure/table/holotable,/obj/machinery/readybutton,/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"bL" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_boxingcourt) -"bM" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/source_boxingcourt) -"bN" = (/obj/machinery/readybutton,/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/source_boxingcourt) +"bu" = (/turf/simulated/floor/holofloor,/area/holodeck/rec_center/basketball) +"bv" = (/obj/effect/overlay/palmtree_r,/turf/simulated/floor/holofloor/beach,/area/holodeck/rec_center/beach) +"bw" = (/obj/effect/overlay/palmtree_l,/obj/effect/overlay/coconut,/turf/simulated/floor/holofloor/beach,/area/holodeck/rec_center/beach) +"bx" = (/turf/simulated/floor/holofloor,/area/holodeck/rec_center/thunderdome) +"by" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/rec_center/thunderdome) +"bz" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/rec_center/thunderdome) +"bA" = (/turf/simulated/floor/holofloor,/area/holodeck/rec_center/dodgeball) +"bB" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/rec_center/dodgeball) +"bC" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/rec_center/dodgeball) +"bD" = (/turf/simulated/floor/holofloor{tag = "icon-warnwhite"; icon_state = "warnwhite"},/area/holodeck/rec_center/medical) +"bE" = (/turf/simulated/floor/holofloor{tag = "icon-warnwhite (SOUTHWEST)"; icon_state = "warnwhite"; dir = 10},/area/holodeck/rec_center/medical) +"bF" = (/obj/machinery/computer/operating,/turf/simulated/floor/holofloor{tag = "icon-warnwhite"; icon_state = "warnwhite"},/area/holodeck/rec_center/medical) +"bG" = (/obj/structure/table/optable,/turf/simulated/floor/holofloor{tag = "icon-warnwhite"; icon_state = "warnwhite"},/area/holodeck/rec_center/medical) +"bH" = (/obj/structure/table/holo/glass,/obj/item/clothing/gloves/color/latex/nitrile,/obj/item/clothing/suit/apron/surgical,/obj/item/clothing/mask/surgical,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (SOUTHEAST)"; icon_state = "warnwhite"; dir = 6},/area/holodeck/rec_center/medical) +"bI" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/rec_center/basketball) +"bJ" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/holodeck/rec_center/dodgeball) +"bK" = (/obj/structure/window/holo{dir = 1},/turf/simulated/floor/holofloor{icon_state = "white"; tag = "icon-bluespace"},/area/holodeck/rec_center/medical) +"bL" = (/turf/simulated/floor/holofloor{tag = "icon-warnwhite (WEST)"; icon_state = "warnwhite"; dir = 8},/area/holodeck/rec_center/medical) +"bM" = (/obj/structure/table/holo/glass,/obj/machinery/reagentgrinder,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (NORTHWEST)"; icon_state = "warnwhite"; dir = 9},/area/holodeck/rec_center/medical) +"bN" = (/obj/structure/table/holo/glass,/obj/item/weapon/storage/box/beakers,/turf/simulated/floor/holofloor{icon_state = "white"; tag = "icon-bluespace"},/area/holodeck/rec_center/medical) "bO" = (/obj/structure/window/reinforced{dir = 1},/turf/indestructible/riveted,/area/space) "bP" = (/turf/indestructible/riveted,/area/tdome/arena_source) "bQ" = (/turf/simulated/floor/plasteel,/area/tdome/arena_source) @@ -228,44 +228,86 @@ "et" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin,/turf/simulated/floor/carpet,/area/centcom/ferry) "eu" = (/turf/simulated/floor/carpet,/area/centcom/ferry) "ev" = (/obj/structure/table/wood,/obj/item/weapon/pen,/turf/simulated/floor/carpet,/area/centcom/ferry) -"ew" = (/obj/structure/table/optable/abductor,/turf/simulated/floor/plating/abductor,/area/abductor_ship) +"ew" = (/obj/machinery/washing_machine,/turf/simulated/floor/holofloor{icon_state = "white"; tag = "icon-bluespace"},/area/holodeck/rec_center/medical) "ex" = (/turf/indestructible/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry) "ey" = (/obj/machinery/button/door{id = "adminshut"; name = "Administrative Shutter-Control"; pixel_y = 26},/turf/simulated/floor/carpet,/area/centcom/ferry) "ez" = (/obj/machinery/door/poddoor/shutters/preopen{id = "adminshut"; name = "Administrative Shutters"},/turf/indestructible/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry) "eA" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet,/area/centcom/ferry) +"eB" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/holodeck/rec_center/basketball) +"eC" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/holodeck/rec_center/basketball) +"eD" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "red"},/area/holodeck/rec_center/basketball) +"eE" = (/obj/item/clothing/under/color/rainbow,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/holofloor/beach,/area/holodeck/rec_center/beach) +"eF" = (/obj/structure/window/holo,/turf/simulated/floor/holofloor,/area/holodeck/rec_center/thunderdome) "eG" = (/turf/indestructible/fakeglass{icon_state = "fakewindows"; dir = 9},/area/centcom/ferry) "eH" = (/turf/indestructible/fakeglass{icon_state = "fakewindows"; dir = 6},/area/centcom/ferry) "eI" = (/obj/structure/showcase/fakesec,/turf/simulated/floor/carpet,/area/centcom/ferry) "eJ" = (/obj/machinery/door/poddoor/shutters/preopen{id = "adminshut"; name = "Administrative Shutters"},/turf/indestructible/fakeglass,/area/centcom/ferry) "eK" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/carpet,/area/centcom/ferry) "eL" = (/obj/structure/filingcabinet,/turf/simulated/floor/carpet,/area/centcom/ferry) +"eM" = (/obj/structure/window/holo,/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/rec_center/thunderdome) +"eN" = (/obj/structure/window/holo,/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/rec_center/thunderdome) +"eO" = (/obj/structure/window/holo{dir = 1},/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/holodeck/rec_center/dodgeball) +"eP" = (/obj/structure/window/holo{dir = 1},/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/holodeck/rec_center/dodgeball) "eQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/indestructible/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/ferry) "eR" = (/obj/machinery/computer/shuttle/ferry,/turf/simulated/floor/plasteel/darkwarning{dir = 8},/area/centcom/ferry) +"eS" = (/obj/structure/window/holo{dir = 1},/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 6; icon_state = "red"},/area/holodeck/rec_center/dodgeball) +"eT" = (/obj/machinery/chem_master,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (SOUTHWEST)"; icon_state = "warnwhite"; dir = 10},/area/holodeck/rec_center/medical) +"eU" = (/obj/structure/table/holo/glass,/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/holofloor{icon_state = "white"; tag = "icon-bluespace"},/area/holodeck/rec_center/medical) "eV" = (/turf/simulated/floor/plasteel/delivery,/area/centcom/ferry) "eW" = (/obj/machinery/door/airlock/external{name = "Ferry Airlock"; req_access_txt = "0"},/turf/simulated/floor/plasteel/delivery,/area/centcom/ferry) "eX" = (/turf/simulated/floor/plasteel/darkwarning{dir = 8},/area/centcom/ferry) "eY" = (/turf/simulated/floor/plasteel/darkgreen/corner{dir = 4},/area/centcom/ferry) "eZ" = (/obj/structure/mirror{pixel_y = 32},/obj/structure/dresser,/turf/simulated/floor/wood,/area/centcom/ferry) "fa" = (/obj/machinery/vending/autodrobe,/turf/simulated/floor/wood,/area/centcom/ferry) +"fb" = (/obj/structure/closet/wardrobe/white,/turf/simulated/floor/holofloor{icon_state = "white"; tag = "icon-bluespace"},/area/holodeck/rec_center/medical) +"fc" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "green"},/area/holodeck/rec_center/basketball) +"fd" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "green"},/area/holodeck/rec_center/basketball) +"fe" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "green"},/area/holodeck/rec_center/basketball) +"ff" = (/obj/item/toy/beach_ball,/turf/simulated/floor/holofloor/beach,/area/holodeck/rec_center/beach) +"fg" = (/obj/structure/window/holo{dir = 1},/turf/simulated/floor/holofloor,/area/holodeck/rec_center/thunderdome) +"fh" = (/obj/structure/window/holo{dir = 1},/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/rec_center/thunderdome) "fi" = (/turf/indestructible/fakeglass{icon_state = "fakewindows"; dir = 5},/area/centcom/ferry) "fj" = (/obj/machinery/door/airlock/centcom{name = "Dressing Room"; opacity = 1; req_access_txt = "0"},/turf/simulated/floor/wood,/area/centcom/ferry) "fk" = (/obj/machinery/vending/clothing,/turf/simulated/floor/wood,/area/centcom/ferry) "fl" = (/turf/indestructible/riveted,/area/centcom/evac) +"fm" = (/obj/structure/window/holo{dir = 1},/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/rec_center/thunderdome) +"fn" = (/obj/structure/window/holo,/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 1; icon_state = "green"},/area/holodeck/rec_center/dodgeball) +"fo" = (/obj/structure/window/holo,/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 9; icon_state = "green"},/area/holodeck/rec_center/dodgeball) +"fp" = (/obj/structure/window/holo,/obj/item/toy/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 5; icon_state = "green"},/area/holodeck/rec_center/dodgeball) +"fq" = (/obj/structure/window/holo,/turf/simulated/floor/holofloor{icon_state = "white"; tag = "icon-bluespace"},/area/holodeck/rec_center/medical) +"fr" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/rec_center/basketball) +"fs" = (/obj/item/toy/beach_ball/holoball,/turf/simulated/floor/holofloor,/area/holodeck/rec_center/basketball) "ft" = (/turf/indestructible/fakeglass{icon_state = "fakewindows"; dir = 10},/area/centcom/ferry) "fu" = (/turf/simulated/floor/plasteel/darkgreen/corner,/area/centcom/ferry) "fv" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_y = 4},/obj/item/weapon/pen,/turf/simulated/floor/wood,/area/centcom/ferry) "fw" = (/turf/simulated/floor/plasteel/darkred/side{dir = 1},/area/centcom/evac) "fx" = (/turf/simulated/floor/plasteel/darkred/side{dir = 9},/area/centcom/evac) "fy" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/simulated/floor/plasteel/darkred/side{dir = 5},/area/centcom/evac) +"fz" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/rec_center/basketball) +"fA" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/rec_center/thunderdome) +"fB" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/rec_center/thunderdome) +"fC" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/rec_center/dodgeball) +"fD" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/rec_center/dodgeball) +"fE" = (/obj/structure/window/holo{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/holodeck/rec_center/medical) "fF" = (/turf/indestructible/fakeglass,/area/centcom/ferry) "fG" = (/obj/structure/table/wood,/turf/simulated/floor/wood,/area/centcom/ferry) "fH" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/wood,/area/centcom/ferry) "fI" = (/turf/indestructible/fakedoor{name = "Centcom Security"},/area/centcom/evac) "fJ" = (/turf/simulated/floor/plasteel/black,/area/centcom/evac) +"fK" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (NORTHWEST)"; icon_state = "warnwhite"; dir = 9},/area/holodeck/rec_center/medical) +"fL" = (/obj/structure/window/holo{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/structure/window/holo,/obj/machinery/computer/pandemic,/turf/simulated/floor/holofloor{icon_state = "white"; tag = "icon-bluespace"},/area/holodeck/rec_center/medical) +"fM" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/rec_center/basketball) +"fN" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "green"},/area/holodeck/rec_center/dodgeball) +"fO" = (/obj/machinery/door/window/westleft,/turf/simulated/floor/holofloor{tag = "icon-warnwhitecorner (WEST)"; icon_state = "warnwhitecorner"; dir = 8},/area/holodeck/rec_center/medical) "fP" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "101"},/turf/simulated/floor/plasteel/darkgreen/side{dir = 2},/area/centcom/ferry) "fQ" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/turf/simulated/floor/plasteel/darkred/side{dir = 8},/area/centcom/evac) "fR" = (/obj/structure/showcase/fakesec,/turf/simulated/floor/plasteel/black,/area/centcom/evac) "fS" = (/obj/structure/bed/chair/office/dark,/turf/simulated/floor/plasteel/black,/area/centcom/evac) +"fT" = (/obj/machinery/door/window/westleft,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (SOUTHEAST)"; icon_state = "warnwhite"; dir = 6},/area/holodeck/rec_center/medical) +"fU" = (/obj/machinery/door/window/westleft,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/holodeck/rec_center/medical) +"fV" = (/obj/structure/window/holo{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/turf/simulated/floor/holofloor{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/holodeck/rec_center/medical) +"fW" = (/turf/simulated/floor/holofloor/beach/coast,/area/holodeck/rec_center/beach) +"fX" = (/obj/structure/window/holo{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/holofloor{tag = "icon-warnwhite"; icon_state = "warnwhite"},/area/holodeck/rec_center/medical) "fY" = (/turf/indestructible/riveted,/area/centcom/control) "fZ" = (/obj/structure/flora/ausbushes/palebush,/turf/simulated/floor/grass,/area/centcom/control) "ga" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/centcom/control) @@ -275,6 +317,10 @@ "ge" = (/obj/machinery/door/window/northleft{dir = 2; name = "Centcom Security"; req_access_txt = "101"},/turf/simulated/floor/plasteel/black,/area/centcom/evac) "gf" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/simulated/floor/plasteel/darkred/side{dir = 2},/area/centcom/evac) "gg" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/simulated/floor/plasteel/darkred/side{dir = 2},/area/centcom/evac) +"gh" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/holofloor{tag = "icon-warnwhite (SOUTHWEST)"; icon_state = "warnwhite"; dir = 10},/area/holodeck/rec_center/medical) +"gi" = (/obj/structure/window/holo{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/machinery/sleeper{tag = "icon-sleeper-open (NORTH)"; icon_state = "sleeper-open"; dir = 1},/turf/simulated/floor/holofloor{tag = "icon-warnwhite"; icon_state = "warnwhite"},/area/holodeck/rec_center/medical) +"gj" = (/obj/machinery/sleeper{tag = "icon-sleeper-open (NORTH)"; icon_state = "sleeper-open"; dir = 1},/turf/simulated/floor/holofloor{tag = "icon-warnwhite (SOUTHEAST)"; icon_state = "warnwhite"; dir = 6},/area/holodeck/rec_center/medical) +"gk" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/rec_center/basketball) "gl" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_away"; name = "unknown"; width = 5},/turf/space,/area/space) "gm" = (/turf/indestructible/fakeglass,/area/centcom/control) "gn" = (/turf/simulated/floor/plasteel,/area/centcom/control) @@ -300,6 +346,12 @@ "gH" = (/obj/machinery/door/poddoor/shuttledock{name = "blast door2"},/turf/simulated/floor/engine,/area/centcom/evac) "gI" = (/obj/machinery/door/poddoor/shuttledock{name = "blast door1"},/turf/simulated/floor/engine,/area/centcom/evac) "gJ" = (/obj/docking_port/stationary{area_type = /area/syndicate_mothership; dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_away"; name = "syndicate recon outpost"; turf_type = /turf/simulated/floor/plating/snow; width = 18},/turf/space,/area/space) +"gK" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/rec_center/basketball) +"gL" = (/obj/structure/holohoop{dir = 1},/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/rec_center/basketball) +"gM" = (/turf/simulated/floor/holofloor/beach/water,/area/holodeck/rec_center/beach) +"gN" = (/obj/structure/table/holo,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/under/color/green,/obj/item/weapon/holo/esword/green,/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/rec_center/thunderdome) +"gO" = (/obj/structure/table/holo,/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/rec_center/thunderdome) +"gP" = (/obj/structure/table/holo,/obj/machinery/readybutton,/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/rec_center/thunderdome) "gQ" = (/turf/simulated/floor/grass,/area/centcom/control) "gR" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plasteel/green/side{dir = 8},/area/centcom/control) "gS" = (/obj/machinery/door/airlock/centcom{name = "Centcom Customs"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor/plasteel/black,/area/centcom/control) @@ -308,6 +360,9 @@ "gV" = (/obj/structure/table,/turf/simulated/floor/plasteel/black,/area/centcom/control) "gW" = (/turf/indestructible/fakeglass{icon_state = "fakewindows"; dir = 10},/area/centcom/evac) "gX" = (/obj/machinery/door/airlock/centcom{name = "Centcom Security"; opacity = 1; req_access_txt = "0"},/turf/simulated/floor/plasteel/black,/area/centcom/evac) +"gY" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/rec_center/dodgeball) +"gZ" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/rec_center/dodgeball) +"ha" = (/obj/machinery/readybutton,/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/rec_center/dodgeball) "hc" = (/turf/indestructible/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/control) "hd" = (/turf/simulated/floor/plasteel/green/corner,/area/centcom/control) "he" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/plasteel/black,/area/centcom/control) @@ -708,6 +763,7 @@ "qQ" = (/obj/effect/landmark/abductor/scientist,/turf/simulated/floor/plating/abductor,/area/abductor_ship) "qR" = (/obj/item/weapon/retractor/alien,/obj/item/weapon/hemostat/alien,/obj/structure/table/abductor,/turf/simulated/floor/plating/abductor,/area/abductor_ship) "qS" = (/obj/effect/landmark/abductor/agent,/turf/simulated/floor/plating/abductor,/area/abductor_ship) +"qT" = (/obj/structure/table/optable/abductor,/turf/simulated/floor/plating/abductor,/area/abductor_ship) "qU" = (/turf/indestructible/abductor{icon_state = "alien13"},/area/abductor_ship) "qV" = (/obj/structure/table/abductor,/obj/item/weapon/storage/box/alienhandcuffs,/turf/simulated/floor/plating/abductor,/area/abductor_ship) "qW" = (/obj/effect/landmark/abductor/scientist{team = 4},/turf/simulated/floor/plating/abductor,/area/abductor_ship) @@ -741,29 +797,29 @@ "ry" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/simulated/floor/plating/abductor,/area/abductor_ship) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaead -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafagagagagagahaiaiaiaiaiahajajajajajahalakakakanam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafagaoagaoagahaiaiaiaiaiahajapajapajaharaqaqaqasam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafagagagagagahaiaiaiaiaiahajajajajajaharaqaqaqasam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafagagagagagahaiaiaiaiaiahajajajajajaharaqaqaqasam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafagagaoagagahaiaiaiaiaiahajajajajajaharaqaqaqasam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafagagaoagagahaiaiaiaiaiahajajajajajahataqaqaqauam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafagagagagagahaiaiaiaiaiahajajajajajahataqaqaqauam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafagagagagagahaiaiaiaiaiahajajajajajahataqaqaqauam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababavabababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafagaoagaoagahaiaiaiaiaiahajapajapajahataqaqaqauam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababawabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafagagagagagahaiaiaiaiaiahajajajajajahayaxaxaxazam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadaAaAaAaAaAadaAaAaAaAaAadaAaAaAaAaAadaAaAaAaAaAad -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaBaBaDaCaCahaEaEaEaEaEahaGaFaFaFaHahaJaIaIaIaKam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaLaLaNaMaMahaEaOaEaPaEahaRaQaQaQaSahaUaTaTaTaVam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaLaWaWaWaMahaEaEaEaEaEahaRaQaQaQaSahaUaXaXaXaVam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababaYabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaLaNaNaNaMahaEaEaEaEaEahaRaQaQaQaSahaUaTaTaTaVam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafbaaZaZaZbbahaEbcaEaEaEahbebdbdbdbfahbhbgbgbgbiam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafbkbjbjbjblahaEaEaEbmaEahbobnbnbnbpahbrbqbqbqbsam -aaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafbuaNbvaNbwahaEaEaEaEaEahbxaQaQaQbyahbzaTaTaTbAam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafbubBbBbBbwahaEaEaEaEaEahbxaQaQaQbyahbzbCbCbCbAam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafbubuaNbwbwahbDbDbDbDbDahbxaQaQaQbyahbzaTaTaTbAam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafbEbEbGbFbFahbHbHbHbHbHahbJbIbIbIbKahbMbLbLbLbNam -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadbObObObObOadbObObObObOadbObObObObOadbObObObObOad +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaead +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaiagajajakahanalapaoaqaharararararahasasasasasahatatatatatahaxauauauayam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafazagajajaBahananaCaCanaharaDaraDarahasasasasasahataEataEatahaGaFaFaFaHam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafazagajajaIahaJananananaharararararahasasasasasahatatatatatahaGaFaFaFaHam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafazagajajajahaJaKaLaLanaharararararahasasasasasahatataEatatahaGaFaFaFaHam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafazagajajaIahaJananananahararaDararahasasasasasahatatatatatahaGaFaFaFaHam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafazagajajaIahaJananananahararaDararahasasasasasahatatatatatahaMaFaFaFaNam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafazagajajajahaJaOaPaPanaharararararahasasasasasahatataEatatahaMaFaFaFaNam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafazagajajaIahaJananananaharararararahasasasasasahatatatatatahaMaFaFaFaNam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababavabababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafazagajajaBahananaQaQanaharaDaraDarahasasasasasahataEataEatahaMaFaFaFaNam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababawabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafazagajajaRahanalaSapaqaharararararahasasasasasahatatatatatahaUaTaTaTaVam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadaAaAaAaAaAadaAaAaAaAaAadaAaAaAaAaAadaAaAaAaAaAadaAaAaAaAaAadaAaAaAaAaAad +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaXaWaXaWaXahbaaZbcbbbdahbebebgbfbfahbhbhbhbhbhahbjbibibibkahbmblblblbnam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaWaXaWaXaWahbpbobobobqahbrbrbubsbsahbhbvbhbwbhahbybxbxbxbzahbBbAbAbAbCam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaXaWaXaWaXahbEbDbGbFbHahbrbIbIbIbsahbhbhbhbhbhahbybxbxbxbzahbBbJbJbJbCam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababaYabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaWaWaWaWaWahbobobKbKbKahbrbubububsahbhbhbhbhbhahbybxbxbxbzahbBbAbAbAbCam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaXaWaXaWaXahbMbLbNboewaheCeBeBeBeDahbheEbhbhbhaheMeFeFeFeNahePeOeOeOeSam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaXaWaXaWaXaheTbLeUbofbahfdfcfcfcfeahbhbhbhffbhahfhfgfgfgfmahfofnfnfnfpam +aaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaWaWaWaWaWahfqfqboboboahfrbufsbufzahbhbhbhbhbhahfAbxbxbxfBahfCbAbAbAfDam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaXaWaXaWaXahfKfEfLboboahfrfMfMfMfzahbhbhbhbhbhahfAbxbxbxfBahfCfNfNfNfDam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaWaXaWaXaWahbLfOfUfTfVahfrfrbufzfzahfWfWfWfWfWahfAbxbxbxfBahfCbAbAbAfDam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafaXaWaXaWaXahghfXfXgigjahgkgkgLgKgKahgMgMgMgMgMahgOgNgNgNgPahgZgYgYgYhaam +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadbObObObObOadbObObObObOadbObObObObOadbObObObObOadbObObObObOadbObObObObOad aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacbPbPbPbPbPbPbPbPbPbRbQbQbQbQbQbQbQbQbQbQbQbQbQbRbPbPbPbPbPbPbPbPbP aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacbPbTbSadadadadadbUbVbQbQbQbQbQbQbQbQbQbQbQbQbQbWbUadadadadadbSbXbP aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacbPbTbSadadadadadbUbVbQbQbQbQbQbQbQbQbQbQbQbQbQbWbUadadadadadbSbXbP @@ -966,7 +1022,7 @@ acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqvquqxqwqyacacacqvquqxqwqyacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqzqBqAqDqCqFqEacqzqBqGqIqHqFqEacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqJqLqKqKqKqNqMacqJqOqKqKqKqNqMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac -acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqPqRqQewqSqVqUacqPqRqWewqXqVqUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac +acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqPqRqQqTqSqVqUacqPqRqWqTqXqVqUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqYqZqKqKqKqNraacqYqZqKqKqKqNraacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacrbrdrcrfrerhrgacrbrdrcrfrerhrgacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacrjrirlrkrmacacacrjrirlrkrmacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac @@ -974,7 +1030,7 @@ acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqvquqxqwqyacacacqvquqxqwqyacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqzqBrnrproqFqEacqzqBrqrsrrqFqEacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqJrtqKqKqKqNqMacqJruqKqKqKqNqMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac -acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqPqRrvewrwqVqUacqPqRrxewryqVqUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac +acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqPqRrvqTrwqVqUacqPqRrxqTryqVqUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacqYqZqKqKqKqNraacqYqZqKqKqKqNraacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacrbrdrcrfrerhrgacrbrdrcrfrerhrgacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacrjrirlrkrmacacacrjrirlrkrmacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 25f1aece752..df8b4bcdcbf 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -693,14 +693,14 @@ Turf and target are seperate in case you want to teleport some distance from a t sleep(timefraction) if(!user || !target) continue_looping = 0 - + if (continue_looping && !uninterruptible && (user.loc != user_loc || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying )) continue_looping = 0 - + cancel_progress_bar(user, progbar)//Clear the way for the next progbar image if(!continue_looping) return 0 - + cancel_progress_bar(user, progbar) return 1 @@ -711,11 +711,11 @@ Turf and target are seperate in case you want to teleport some distance from a t progbar.icon_state = "prog_bar_[round(((current_number / goal_number) * 100), 10)]" progbar.pixel_y = 32 return progbar - + /proc/cancel_progress_bar(mob/user, image/progbar) if(user && user.client && progbar) user.client.images -= progbar - + /proc/assign_progress_bar(mob/user, image/progbar) if(user && user.client && progbar) user.client.images |= progbar @@ -732,22 +732,22 @@ Turf and target are seperate in case you want to teleport some distance from a t Tloc = target.loc var/delayfraction = round(delay/numticks) - + var/atom/Uloc = user.loc - + var/holding = user.get_active_hand() var/holdingnull = 1 //User is not holding anything if(holding) holdingnull = 0 //User is holding a tool of some kind - + var/image/progbar - - var/continue_looping = 1 + + var/continue_looping = 1 for (var/i = 1 to numticks) if(user.client && progress) progbar = make_progress_bar(i, numticks, target) assign_progress_bar(user, progbar) - + sleep(delayfraction) if(!user || user.stat || user.weakened || user.stunned || !(user.loc == Uloc)) continue_looping = 0 @@ -763,11 +763,11 @@ Turf and target are seperate in case you want to teleport some distance from a t continue_looping = 0 if(continue_looping && user.get_active_hand() != holding) continue_looping = 0 - + cancel_progress_bar(user, progbar)//Clear the way for the next progbar image if(!continue_looping) return 0 - + cancel_progress_bar(user,progbar) return 1 @@ -834,157 +834,6 @@ Turf and target are seperate in case you want to teleport some distance from a t atoms += A return atoms -/datum/coords //Simple datum for storing coordinates. - var/x_pos = null - var/y_pos = null - var/z_pos = null - -/proc/DuplicateObject(obj/original, perfectcopy = 0 , sameloc = 0) - if(!original) - return null - - var/obj/O = null - - if(sameloc) - O=new original.type(original.loc) - else - O=new original.type(locate(0,0,0)) - - if(perfectcopy) - if((O) && (original)) - for(var/V in original.vars) - if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key"))) - O.vars[V] = original.vars[V] - return O - - -/area/proc/copy_contents_to(area/A , platingRequired = 0 ) - //Takes: Area. Optional: If it should copy to areas that don't have plating - //Returns: Nothing. - //Notes: Attempts to move the contents of one area to another area. - // Movement based on lower left corner. Tiles that do not fit - // into the new area will not be moved. - - if(!A || !src) return 0 - - var/list/turfs_src = get_area_turfs(src.type) - var/list/turfs_trg = get_area_turfs(A.type) - - var/src_min_x = 0 - var/src_min_y = 0 - for (var/turf/T in turfs_src) - if(T.x < src_min_x || !src_min_x) src_min_x = T.x - if(T.y < src_min_y || !src_min_y) src_min_y = T.y - - var/trg_min_x = 0 - var/trg_min_y = 0 - for (var/turf/T in turfs_trg) - if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x - if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y - - var/list/refined_src = new/list() - for(var/turf/T in turfs_src) - refined_src += T - refined_src[T] = new/datum/coords - var/datum/coords/C = refined_src[T] - C.x_pos = (T.x - src_min_x) - C.y_pos = (T.y - src_min_y) - - var/list/refined_trg = new/list() - for(var/turf/T in turfs_trg) - refined_trg += T - refined_trg[T] = new/datum/coords - var/datum/coords/C = refined_trg[T] - C.x_pos = (T.x - trg_min_x) - C.y_pos = (T.y - trg_min_y) - - var/list/toupdate = new/list() - - var/copiedobjs = list() - - - moving: - for (var/turf/T in refined_src) - var/datum/coords/C_src = refined_src[T] - for (var/turf/B in refined_trg) - var/datum/coords/C_trg = refined_trg[B] - if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) - - var/old_dir1 = T.dir - var/old_icon_state1 = T.icon_state - var/old_icon1 = T.icon - - if(platingRequired) - if(istype(B, /turf/space)) - continue moving - - var/turf/X = new T.type(B) - X.dir = old_dir1 - X.icon_state = old_icon_state1 - X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi - - - var/list/objs = new/list() - var/list/newobjs = new/list() - var/list/mobs = new/list() - var/list/newmobs = new/list() - - for(var/obj/O in T) - - if(!istype(O,/obj)) - continue - - objs += O - - - for(var/obj/O in objs) - newobjs += DuplicateObject(O , 1) - - - for(var/obj/O in newobjs) - O.loc = X - - for(var/mob/M in T) - if(!M.move_on_shuttle) - continue - mobs += M - - for(var/mob/M in mobs) - newmobs += DuplicateObject(M , 1) - - for(var/mob/M in newmobs) - M.loc = X - - copiedobjs += newobjs - copiedobjs += newmobs - - - - for(var/V in T.vars) - if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity"))) - X.vars[V] = T.vars[V] - -// var/area/AR = X.loc - -// if(AR.lighting_use_dynamic) -// X.opacity = !X.opacity -// X.sd_SetOpacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn - - toupdate += X - - refined_src -= T - refined_trg -= B - continue moving - - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - T1.CalculateAdjacentTurfs() - SSair.add_to_active(T1,1) - - - return copiedobjs - /proc/get_cardinal_dir(atom/A, atom/B) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 0592d9e69e8..cdcbfd1526a 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -594,58 +594,6 @@ var/list/teleportlocs = list() name = "Law Office" icon_state = "law" - - - - - - -/area/holodeck - name = "Holodeck" - icon_state = "Holodeck" - luminosity = 1 - lighting_use_dynamic = DYNAMIC_LIGHTING_DISABLED - -/area/holodeck/alphadeck - name = "Holodeck Alpha" - - -/area/holodeck/source_plating - name = "Holodeck - Off" - icon_state = "Holodeck" - -/area/holodeck/source_emptycourt - name = "Holodeck - Empty Court" - -/area/holodeck/source_boxingcourt - name = "Holodeck - Boxing Court" - -/area/holodeck/source_basketball - name = "Holodeck - Basketball Court" - -/area/holodeck/source_thunderdomecourt - name = "Holodeck - Thunderdome Court" - -/area/holodeck/source_beach - name = "Holodeck - Beach" - icon_state = "Holodeck" // Lazy. - -/area/holodeck/source_burntest - name = "Holodeck - Atmospheric Burn Test" - -/area/holodeck/source_wildlife - name = "Holodeck - Wildlife Simulation" - - - - - - - - - - - //Engineering /area/engine diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm deleted file mode 100644 index 0ba57253e61..00000000000 --- a/code/game/machinery/computer/HolodeckControl.dm +++ /dev/null @@ -1,528 +0,0 @@ -/obj/machinery/computer/HolodeckControl - name = "holodeck control console" - desc = "A computer used to control a nearby holodeck." - icon_screen = "holocontrol" - icon_keyboard = "tech_key" - var/area/linkedholodeck = null - var/area/target = null - var/active = 0 - var/list/holographic_items = list() - var/damaged = 0 - var/last_change = 0 - -/obj/machinery/computer/HolodeckControl/attack_hand(mob/user) - - if(..()) - return - user.set_machine(src) - - var/dat = "

Current Loaded Programs

" - dat += "((Empty Court))
" - dat += "((Dodgeball Arena))
" - dat += "((Basketball Court))
" - dat += "((Thunderdome Court))
" - dat += "((Beach))
" -// dat += "((Shutdown System))
" - - dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
" - - if(emagged) - dat += "(Begin Atmospheric Burn Simulation)
" - dat += "Ensure the holodeck is empty before testing.
" - dat += "
" - dat += "(Begin Wildlife Simulation)
" - dat += "Ensure the holodeck is empty before testing.
" - dat += "
" - if(issilicon(user)) - dat += "(Re-Enable Safety Protocols?)
" - dat += "Safety Protocols are DISABLED
" - else - if(issilicon(user)) - dat += "(Override Safety Protocols?)
" - dat += "
" - dat += "Safety Protocols are ENABLED
" - - //user << browse(dat, "window=computer;size=400x500") - //onclose(user, "computer") - var/datum/browser/popup = new(user, "computer", name, 400, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - - -/obj/machinery/computer/HolodeckControl/Topic(href, href_list) - if(..()) - return - if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - - if(href_list["emptycourt"]) - target = locate(/area/holodeck/source_emptycourt) - if(target) - loadProgram(target) - - else if(href_list["boxingcourt"]) - target = locate(/area/holodeck/source_boxingcourt) - if(target) - loadProgram(target) - - else if(href_list["basketball"]) - target = locate(/area/holodeck/source_basketball) - if(target) - loadProgram(target) - - else if(href_list["thunderdomecourt"]) - target = locate(/area/holodeck/source_thunderdomecourt) - if(target) - loadProgram(target) - - else if(href_list["beach"]) - target = locate(/area/holodeck/source_beach) - if(target) - loadProgram(target) - - else if(href_list["turnoff"]) - target = locate(/area/holodeck/source_plating) - if(target) - loadProgram(target) - - else if(href_list["burntest"]) - if(!emagged) return - target = locate(/area/holodeck/source_burntest) - if(target) - loadProgram(target) - - else if(href_list["wildlifecarp"]) - if(!emagged) return - target = locate(/area/holodeck/source_wildlife) - if(target) - loadProgram(target) - - else if(href_list["AIoverride"]) - if(!issilicon(usr)) return - emagged = !emagged - if(emagged) - message_admins("[key_name_admin(usr)] overrode the holodeck's safeties") - log_game("[key_name(usr)] overrided the holodeck's safeties") - else - message_admins("[key_name_admin(usr)] restored the holodeck's safeties") - log_game("[key_name(usr)] restored the holodeck's safeties") - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - - - -/obj/machinery/computer/HolodeckControl/emag_act(mob/user) - if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 - user << "You vastly increase projector power and override the safety and security protocols." - user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator." - log_game("[key_name(user)] emagged the Holodeck Control Console") - src.updateUsrDialog() - -/obj/machinery/computer/HolodeckControl/New() - ..() - linkedholodeck = locate(/area/holodeck/alphadeck) - //if(linkedholodeck) - // target = locate(/area/holodeck/source_emptycourt) - // if(target) - // loadProgram(target) - -//This could all be done better, but it works for now. -/obj/machinery/computer/HolodeckControl/Destroy() - emergencyShutdown() - return ..() - - -/obj/machinery/computer/HolodeckControl/emp_act(severity) - emergencyShutdown() - ..() - - -/obj/machinery/computer/HolodeckControl/ex_act(severity, target) - emergencyShutdown() - ..() - - -/obj/machinery/computer/HolodeckControl/blob_act() - emergencyShutdown() - ..() - - -/obj/machinery/computer/HolodeckControl/process() - - if(!..()) - return - if(active) - - if(!checkInteg(linkedholodeck)) - damaged = 1 - target = locate(/area/holodeck/source_plating) - if(target) - loadProgram(target) - active = 0 - for(var/mob/M in ultra_range(10,src)) - M.show_message("The holodeck overloads!") - - - for(var/turf/T in linkedholodeck) - if(prob(30)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(2, 1, T) - s.start() - T.ex_act(3) - T.hotspot_expose(1000,500,1) - - - for(var/item in holographic_items) - if(!(get_turf(item) in linkedholodeck)) - derez(item, 0) - - - -/obj/machinery/computer/HolodeckControl/proc/derez(obj/obj , silent = 1) - holographic_items.Remove(obj) - - if(obj == null) - return - - if(isobj(obj)) - var/mob/M = obj.loc - if(ismob(M)) - M.unEquip(obj, 1) //Holoweapons should always drop. - - if(!silent) - var/obj/oldobj = obj - visible_message("The [oldobj.name] fades away!") - qdel(obj) - -/obj/machinery/computer/HolodeckControl/proc/checkInteg(area/A) - for(var/turf/T in A) - if(istype(T, /turf/space)) - return 0 - - return 1 - -/obj/machinery/computer/HolodeckControl/power_change() - ..() - if(stat & NOPOWER) - emergencyShutdown() - -/obj/machinery/computer/HolodeckControl/proc/loadProgram(area/A) - - if(world.time < (last_change + 25)) - if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve - return - for(var/mob/M in range(3,src)) - M.show_message("\b ERROR. Recalibrating projection apparatus.") - last_change = world.time - return - - last_change = world.time - active = 1 - - for(var/item in holographic_items) - derez(item) - - holographic_items = A.copy_contents_to(linkedholodeck , 1) - - if(emagged) - for(var/obj/item/weapon/holo/esword/H in linkedholodeck) - H.damtype = BRUTE - - spawn(30) - for(var/obj/effect/landmark/L in linkedholodeck) - if(L.name=="Atmospheric Test Start") - spawn(20) - if(istype(target,/area/holodeck/source_burntest)) - var/turf/T = get_turf(L) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(2, 1, T) - s.start() - if(T) - T.temperature = 5000 - T.hotspot_expose(50000,50000,1) - if(L.name=="Holocarp Spawn") - new /mob/living/simple_animal/hostile/carp/holocarp(L.loc) - - -/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown() - if(!istype(target,/area/holodeck/source_plating)) - //Get rid of any items - for(var/item in holographic_items) - derez(item) - //Turn it back to the regular non-holographic room - target = locate(/area/holodeck/source_plating) - if(target) - loadProgram(target) - - var/area/targetsource = locate(/area/holodeck/source_plating) - targetsource.copy_contents_to(linkedholodeck , 1) - active = 0 - - - - - - - -// Holographic Items! - -/turf/simulated/floor/holofloor - icon_state = "floor" - thermal_conductivity = 0 - -/turf/simulated/floor/holofloor/attackby(obj/item/weapon/W, mob/user, params) - return - // HOLOFLOOR DOES NOT GIVE A FUCK - -/turf/simulated/floor/grass/holo - thermal_conductivity = 0 - gender = PLURAL - name = "lush grass" - -/turf/simulated/floor/grass/holo/attackby(obj/item/weapon/W, mob/user, params) - return - // HOLOGRASS DOES NOT GIVE A FUCK - -/obj/structure/table/holotable - name = "table" - -/obj/structure/table/holotable/attack_paw(mob/user) - return attack_hand(user) - -/obj/structure/table/holotable/attack_alien(mob/user) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N - return attack_hand(user) - -/obj/structure/table/holotable/attack_animal(mob/living/simple_animal/user) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N - return attack_hand(user) - -/obj/structure/table/holotable/attack_hand(mob/user) - return // HOLOTABLE DOES NOT GIVE A FUCK - - -/obj/structure/table/holotable/attackby(obj/item/weapon/W, mob/user, params) - if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) - var/obj/item/weapon/grab/G = W - if(G.state < GRAB_AGGRESSIVE) - user << "You need a better grip to do that!" - return - G.affecting.loc = src.loc - G.affecting.Weaken(5) - visible_message("[G.assailant] puts [G.affecting] on the table.") - qdel(W) - return - - if (istype(W, /obj/item/weapon/wrench)) - user << "It's a holotable! There are no bolts!" - return - - if(isrobot(user)) - return - -/obj/structure/holowindow - name = "reinforced window" - icon = 'icons/obj/structures.dmi' - icon_state = "rwindow" - desc = "A window." - density = 1 - layer = 3.2//Just above doors - pressure_resistance = 4*ONE_ATMOSPHERE - anchored = 1 - flags = ON_BORDER - - -/obj/item/weapon/holo - damtype = STAMINA - -/obj/item/weapon/holo/esword - name = "holographic energy sword" - desc = "May the force be with you. Sorta" - icon_state = "sword0" - force = 3 - throw_speed = 2 - throw_range = 5 - throwforce = 0 - w_class = 2 - hitsound = "swing_hit" - flags = NOSHIELD - var/active = 0 - -/obj/item/weapon/holo/esword/green - New() - item_color = "green" - -/obj/item/weapon/holo/esword/red - New() - item_color = "red" - -/obj/item/weapon/holo/esword/IsShield() - if(active) - return 1 - return 0 - -/obj/item/weapon/holo/esword/attack(mob/target, mob/user) - ..() - -/obj/item/weapon/holo/esword/New() - item_color = pick("red","blue","green","purple") - -/obj/item/weapon/holo/esword/attack_self(mob/living/user) - active = !active - if (active) - force = 30 - icon_state = "sword[item_color]" - w_class = 4 - hitsound = 'sound/weapons/blade1.ogg' - playsound(user, 'sound/weapons/saberon.ogg', 20, 1) - user << "[src] is now active." - else - force = 3 - icon_state = "sword0" - w_class = 2 - hitsound = "swing_hit" - playsound(user, 'sound/weapons/saberoff.ogg', 20, 1) - user << "[src] can now be concealed." - return - -//BASKETBALL OBJECTS - -/obj/item/toy/beach_ball/holoball - name = "basketball" - icon = 'icons/obj/basketball.dmi' - icon_state = "basketball" - item_state = "basketball" - desc = "Here's your chance, do your dance at the Space Jam." - -/obj/item/toy/beach_ball/holoball/dodgeball - name = "dodgeball" - icon_state = "dodgeball" - item_state = "dodgeball" - desc = "Used for playing the most violent and degrading of childhood games." - -/obj/item/toy/beach_ball/holoball/dodgeball/throw_impact(atom/hit_atom) - ..() - if((ishuman(hit_atom))) - var/mob/living/carbon/M = hit_atom - playsound(src, 'sound/items/dodgeball.ogg', 50, 1) - M.apply_damage(10, STAMINA) - loc = get_turf(hit_atom) //drop at the target's feet - if(prob(5)) - M.Weaken(3) - visible_message("[M] is knocked right off \his feet!", 3) - -/obj/structure/holohoop - name = "basketball hoop" - desc = "Boom, shakalaka!" - icon = 'icons/obj/basketball.dmi' - icon_state = "hoop" - anchored = 1 - density = 1 - -/obj/structure/holohoop/attackby(obj/item/weapon/W, mob/user, params) - if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) - var/obj/item/weapon/grab/G = W - if(G.state < GRAB_AGGRESSIVE) - user << "You need a better grip to do that!" - return - G.affecting.loc = src.loc - G.affecting.Weaken(5) - visible_message("[G.assailant] dunks [G.affecting] into \the [src]!", 3) - qdel(W) - return - else if (istype(W, /obj/item) && get_dist(src,user)<2) - user.drop_item(src) - visible_message("[user] dunks [W] into \the [src]!", 3) - return - -/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0) - if (istype(mover,/obj/item) && mover.throwing) - var/obj/item/I = mover - if(istype(I, /obj/item/projectile)) - return - if(prob(50)) - I.loc = src.loc - visible_message("Swish! \the [I] lands in \the [src].", 3) - else - visible_message("\the [I] bounces off of \the [src]'s rim!", 3) - return 0 - else - return ..(mover, target, height) - - -/obj/machinery/readybutton - name = "ready declaration device" - desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!" - icon = 'icons/obj/monitors.dmi' - icon_state = "auth_off" - var/ready = 0 - var/area/currentarea = null - var/eventstarted = 0 - - anchored = 1 - use_power = 1 - idle_power_usage = 2 - active_power_usage = 6 - power_channel = ENVIRON - -/obj/machinery/readybutton/attack_ai(mob/user) - user << "The station AI is not to interact with these devices" - return - -/obj/machinery/readybutton/attack_paw(mob/user) - user << "You are too primitive to use this device!" - return - -/obj/machinery/readybutton/New() - ..() - - -/obj/machinery/readybutton/attackby(obj/item/weapon/W, mob/user, params) - user << "The device is a solid button, there's nothing you can do with it!" - -/obj/machinery/readybutton/attack_hand(mob/user) - if(user.stat || stat & (NOPOWER|BROKEN)) - user << "This device is not powered!" - return - - currentarea = get_area(src.loc) - if(!currentarea) - qdel(src) - - if(eventstarted) - usr << "The event has already begun!" - return - - ready = !ready - - update_icon() - - var/numbuttons = 0 - var/numready = 0 - for(var/obj/machinery/readybutton/button in currentarea) - numbuttons++ - if (button.ready) - numready++ - - if(numbuttons == numready) - begin_event() - -/obj/machinery/readybutton/update_icon() - if(ready) - icon_state = "auth_on" - else - icon_state = "auth_off" - -/obj/machinery/readybutton/proc/begin_event() - - eventstarted = 1 - - for(var/obj/structure/holowindow/W in currentarea) - qdel(W) - - for(var/mob/M in currentarea) - M << "FIGHT!" diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 61edbb6fcd6..dffd5241c8c 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -216,9 +216,9 @@ /obj/item/weapon/circuitboard/white_ship name = "circuit Board (White Ship)" build_path = /obj/machinery/computer/shuttle/white_ship -/obj/item/weapon/circuitboard/HolodeckControl // Not going to let people get this, but it's just here for future +/obj/item/weapon/circuitboard/holodeck// Not going to let people get this, but it's just here for future name = "circuit board (Holodeck Control)" - build_path = /obj/machinery/computer/HolodeckControl + build_path = /obj/machinery/computer/holodeck origin_tech = "programming=4" /obj/item/weapon/circuitboard/aifixer name = "circuit board (AI Integrity Restorer)" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 24e7ce32755..c05fdfcf195 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -732,6 +732,7 @@ icon_state = "deck_nanotrasen_full" w_class = 2 var/cooldown = 0 + var/obj/machinery/computer/holodeck/holo = null // Holodeck cards should not be infinite var/list/cards = list() /obj/item/toy/cards/deck/New() @@ -769,6 +770,8 @@ user << "There are no more cards to draw!" return var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(user.loc) + if(holo) + holo.spawned += H // track them leaving the holodeck choice = cards[1] H.cardname = choice H.parentdeck = src diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm new file mode 100644 index 00000000000..ae6236381f6 --- /dev/null +++ b/code/modules/holodeck/area_copy.dm @@ -0,0 +1,111 @@ +/proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0, var/atom/newloc = null, var/nerf = 0) + if(!original) + return null + var/obj/O + + if(sameloc) + O = new original.type(original.loc) + else + O = new original.type(newloc) + + if(perfectcopy && O && original) + var/global/list/forbidden_vars = list("type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group") + + for(var/V in original.vars - forbidden_vars) + if(istype(original.vars[V],/list)) + var/list/L = original.vars[V] + O.vars[V] = L.Copy() + else if(istype(original.vars[V],/datum)) + continue // this would reference the original's object, that will break when it is used or deleted. + else + O.vars[V] = original.vars[V] + + if(istype(O)) + O.burn_state = -1 // holoitems do not burn + if(nerf && istype(O,/obj/item)) + var/obj/item/I = O + I.damtype = STAMINA // thou shalt not + if(istype(O,/obj/machinery)) + var/obj/machinery/M = O + M.power_change() + O.update_icon() + return O + + +/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0, var/nerf_weapons = 0 ) + //Takes: Area. Optional: If it should copy to areas that don't have plating + //Returns: Nothing. + //Notes: Attempts to move the contents of one area to another area. + // Movement based on lower left corner. Tiles that do not fit + // into the new area will not be moved. + + if(!A || !src) return 0 + + var/list/turfs_src = get_area_turfs(src.type) + var/list/turfs_trg = get_area_turfs(A.type) + + var/src_min_x = 99999 + var/src_min_y = 99999 + var/list/refined_src = new/list() + + for (var/turf/T in turfs_src) + src_min_x = min(src_min_x,T.x) + src_min_y = min(src_min_y,T.y) + for (var/turf/T in turfs_src) + refined_src[T] = "[T.x - src_min_x].[T.y - src_min_y]" + + var/trg_min_x = 99999 + var/trg_min_y = 99999 + var/list/refined_trg = new/list() + + for (var/turf/T in turfs_trg) + trg_min_x = min(trg_min_x,T.x) + trg_min_y = min(trg_min_y,T.y) + for (var/turf/T in turfs_trg) + refined_trg["[T.x - trg_min_x].[T.y - trg_min_y]"] = T + + var/list/toupdate = new/list() + + var/copiedobjs = list() + + for (var/turf/T in refined_src) + //var/datum/coords/C_src = refined_src[T] + var/coordstring = refined_src[T] + var/turf/B = refined_trg[coordstring] + if(!istype(B)) + continue + + if(platingRequired) + if(istype(B, /turf/space)) + continue + + var/old_dir1 = T.dir + var/old_icon_state1 = T.icon_state + var/old_icon1 = T.icon + + var/turf/X = new T.type(B) + X.dir = old_dir1 + X.icon = old_icon1 + X.icon_state = old_icon_state1 + + for(var/obj/O in T) + var/obj/O2 = DuplicateObject(O , 1, newloc = X, nerf=nerf_weapons) + if(!O2) continue + copiedobjs += O2.contents + O2 + + for(var/mob/M in T) + if(istype(M, /mob/camera)) continue // If we need to check for more mobs, I'll add a variable + copiedobjs += DuplicateObject(M , 1, newloc = X) + + var/global/list/forbidden_vars = list("type","stat","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity") + for(var/V in T.vars - forbidden_vars) + X.vars[V] = T.vars[V] + toupdate += X + + if(toupdate.len) + for(var/turf/simulated/T1 in toupdate) + T1.CalculateAdjacentTurfs() + SSair.add_to_active(T1,1) + + + return copiedobjs diff --git a/code/modules/holodeck/areas.dm b/code/modules/holodeck/areas.dm new file mode 100644 index 00000000000..04a469569cb --- /dev/null +++ b/code/modules/holodeck/areas.dm @@ -0,0 +1,97 @@ +/area/holodeck + name = "Holodeck" + icon_state = "Holodeck" + luminosity = 1 + lighting_use_dynamic = 0 + + var/obj/machinery/computer/holodeck/linked + var/restricted = 0 // if true, program goes on emag list + +/* + Power tracking: Use the holodeck computer's power grid + Asserts are to avoid the inevitable infinite loops +*/ + +/area/holodeck/powered(var/chan) + if(!master.requires_power) + return 1 + if(master.always_unpowered) + return 0 + if(!linked) + return 0 + var/area/A = get_area(linked) + ASSERT(!istype(A,/area/holodeck)) + return A.powered(chan) + +/area/holodeck/usage(var/chan) + if(!linked) + return 0 + var/area/A = get_area(linked) + ASSERT(!istype(A,/area/holodeck)) + return A.usage(chan) + +/area/holodeck/addStaticPower(value, powerchannel) + if(!linked) + return + var/area/A = get_area(linked) + ASSERT(!istype(A,/area/holodeck)) + return A.addStaticPower(value,powerchannel) + +/area/holodeck/use_power(var/amount, var/chan) + if(!linked) + return 0 + var/area/A = get_area(linked) + ASSERT(!istype(A,/area/holodeck)) + return A.use_power(amount,chan) + + +/* + This is the standard holodeck. It is intended to allow you to + blow off steam by doing stupid things like laying down, throwing + spheres at holes, or bludgeoning people. +*/ +/area/holodeck/rec_center + name = "\improper Recreational Holodeck" + +/area/holodeck/rec_center/offline + name = "Holodeck - Offline" + +/area/holodeck/rec_center/court + name = "Holodeck - Empty Court" + +/area/holodeck/rec_center/dodgeball + name = "Holodeck - Dodgeball Court" + +/area/holodeck/rec_center/basketball + name = "Holodeck - Basketball Court" + +/area/holodeck/rec_center/thunderdome + name = "Holodeck - Thunderdome Court" + +/area/holodeck/rec_center/beach + name = "Holodeck - Beach" + +/area/holodeck/rec_center/lounge + name = "Holodeck - Lounge" + +/area/holodeck/rec_center/medical + name = "Holodeck - Emergency Medical" + +/area/holodeck/rec_center/pet_lounge + name = "Holodeck - Pet Playground" + + +// Bad programs + +/area/holodeck/rec_center/burn + name = "Holodeck - Atmospheric Burn Test" + restricted = 1 + +/area/holodeck/rec_center/wildlife + name = "Holodeck - Wildlife Simulation" + restricted = 1 + +/area/holodeck/rec_center/bunker + name = "Holodeck - Holdout Bunker" + restricted = 1 + diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm new file mode 100644 index 00000000000..78b73eaa337 --- /dev/null +++ b/code/modules/holodeck/computer.dm @@ -0,0 +1,210 @@ +/* + Holodeck Update + + The on-station holodeck area is of type [holodeck_type]. + All subtypes of [program_type] are loaded into the program cache or emag programs list. + If init_program is null, a random program will be loaded on startup. + If you don't wish this, set it to the offline program or another of your choosing. + + You can use this to add holodecks with minimal code: + 1) Define new areas for the holodeck programs + 2) Map them + 3) Create a new control console that uses those areas + + Non-mapped areas should be skipped but you should probably comment them out anyway. + The base of program_type will always be ignored; only subtypes will be loaded. +*/ + +/obj/machinery/computer/holodeck + name = "holodeck control console" + desc = "A computer used to control a nearby holodeck." + icon_screen = "holocontrol" + idle_power_usage = 10 + active_power_usage = 50 + var/area/holodeck/linked + var/area/holodeck/program + var/area/holodeck/last_program + var/area/offline_program = /area/holodeck/rec_center/offline + + var/list/program_cache = list() + var/list/emag_programs = list() + + // Splitting this up allows two holodecks of the same size + // to use the same source patterns. Y'know, if you want to. + var/holodeck_type = /area/holodeck/rec_center // locate(this) to get the target holodeck + var/program_type = /area/holodeck/rec_center // subtypes of this (but not this itself) are loadable programs + + // set this if you want it to start with some particular program. + var/init_program = null + // or this to get anything + var/random_program = 0 + + var/active = 0 + var/damaged = 0 + var/list/spawned = list() + var/list/effects = list() + var/last_change = 0 + +/obj/machinery/computer/holodeck/New() + + if(ispath(holodeck_type,/area)) + linked = locate(holodeck_type) + if(ispath(offline_program,/area)) + offline_program = locate(offline_program) + // the following is necessary for power reasons + var/area/AS = get_area(src) + if(istype(AS,/area/holodeck)) + world.log << "### MAPPING ERROR" + world.log << "Holodeck computer cannot be in a holodeck." + world.log << "This would cause circular power dependency." + qdel(src) // todo handle constructed computers + return + else + linked.linked = src // todo detect multiple/constructed computers + + if(ticker && ticker.current_state >= GAME_STATE_PLAYING) + initialize() + ..() + +/obj/machinery/computer/holodeck/initialize() + program_cache = list() + emag_programs = list() + for(var/typekey in typesof(program_type) - program_type) + var/area/holodeck/A = locate(typekey) + if(!A || A == offline_program) continue + if(A.contents.len == 0) continue // not loaded + if(A.restricted) + emag_programs += A + else + program_cache += A + if(typekey == init_program) + load_program(A,force=1) + if(random_program && program_cache.len && init_program == null) + load_program(pick(program_cache),force=1) + else if(!program) + load_program(offline_program) + +/obj/machinery/computer/holodeck/power_change() + ..() + toggle_power(!stat) + +/obj/machinery/computer/holodeck/proc/toggle_power(toggleOn = 0) + if(active == toggleOn) return + + if(toggleOn) + if(last_program && last_program != offline_program) + load_program(last_program, delay = 1) + active = 1 + else + last_program = program + load_program(offline_program,force=1) + active = 0 + +/obj/machinery/computer/holodeck/proc/emergency_shutdown() + last_program = program + load_program(offline_program,1) + active = 0 + +/obj/machinery/computer/holodeck/process() + if(damaged) + if(prob(10)) + for(var/turf/simulated/T in linked) + if(prob(5)) + var/datum/effect_system/spark_spread/s = new + s.set_up(2, 1, T) + s.start() + return + + if(!..() || !active) + return + + if(!floorcheck()) + emergency_shutdown() + damaged = 1 + for(var/mob/M in ultra_range(10,src)) + M.show_message("The holodeck overloads!") + + for(var/turf/T in linked) + if(prob(30)) + var/datum/effect_system/spark_spread/s = new + s.set_up(2, 1, T) + s.start() + T.ex_act(3) + T.hotspot_expose(1000,500,1) + + if(!emagged) + for(var/item in spawned) + if(!(get_turf(item) in linked)) + derez(item, 0) + for(var/obj/effect/holodeck_effect/HE in effects) + HE.tick() + + active_power_usage = 50 + spawned.len * 3 + effects.len * 5 + +/obj/machinery/computer/holodeck/proc/floorcheck() + for(var/turf/T in linked) + if(!T.intact || istype(T,/turf/space)) + return 0 + return 1 + +/obj/machinery/computer/holodeck/Topic(href, list/href_list) + if(..()) + return + if(Adjacent(usr) || istype(usr, /mob/living/silicon)) + usr.set_machine(src) + src.add_fingerprint(usr) + if(href_list["loadarea"]) + var/typepath = text2path(href_list["loadarea"]) + if(ispath(typepath,/area)) + var/area/target = locate(typepath) + if(istype(target)) + load_program(target) + else + world.log << "area not ready: [typepath]" + else + world.log << "bad area argument: [href_list["loadarea"]]" + else if("safety" in href_list) + var/oe = emagged + emagged = !text2num(href_list["safety"]) + if(oe == emagged) return + if(program && !stat) + if(!emagged && program.restricted) + load_program(offline_program) + else + nerf(!emagged) + src.updateUsrDialog() + +/obj/machinery/computer/holodeck/proc/nerf(active) + for(var/obj/item/I in spawned) + I.damtype = (active? STAMINA : initial(I.damtype) ) + for(var/obj/effect/holodeck_effect/HE in effects) + HE.safety(active) + +/obj/machinery/computer/holodeck/emag_act(mob/user as mob) + if(!emagged) + if(!emag_programs.len) + user << "[src] does not seem to have a card swipe port. It must be an inferior model." + return + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "You vastly increase projector power and override the safety and security protocols." + user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator." + log_game("[key_name(user)] emagged the Holodeck Control Console") + src.updateUsrDialog() + nerf(!emagged) + +/obj/machinery/computer/holodeck/Destroy() + emergency_shutdown() + ..() + +/obj/machinery/computer/holodeck/emp_act(severity) + emergency_shutdown() + ..() + +/obj/machinery/computer/holodeck/ex_act(severity, target) + emergency_shutdown() + ..() + +/obj/machinery/computer/holodeck/blob_act() + emergency_shutdown() + ..() \ No newline at end of file diff --git a/code/modules/holodeck/computer_funcs.dm b/code/modules/holodeck/computer_funcs.dm new file mode 100644 index 00000000000..0913af05f55 --- /dev/null +++ b/code/modules/holodeck/computer_funcs.dm @@ -0,0 +1,109 @@ +/obj/machinery/computer/holodeck/attack_hand(var/mob/user as mob) + user.set_machine(src) + + var/dat = "

Current Loaded Programs

" + dat += "Power Off
" + for(var/area/A in program_cache) + dat += "[A.name]
" + if(emagged && emag_programs.len) + dat += "SUPERVISOR ACCESS - SAFETY PROTOCOLS DISABLED - CAUTION: EMITTER ANOMALY
" + for(var/area/A in emag_programs) + dat += "[A.name]
" + + var/datum/browser/popup = new(user, "computer", name, 400, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/computer/holodeck/attack_ai(var/mob/user as mob) + var/dat = "

Current Loaded Programs

" + + dat += "Power Off
" + for(var/area/A in program_cache) + dat += "[A.name]
" + + if(emag_programs.len) + dat += "
" + if(emagged) + dat += "Safety protocol: Offline Engage
" + for(var/area/A in emag_programs) + dat += "[A.name]
" + else + dat += "Safety protocol: Online Disengage
" + + var/datum/browser/popup = new(user, "computer", name, 400, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + + +/obj/machinery/computer/holodeck/proc/load_program(var/area/A, var/force = 0, var/delay = 0) + if(stat) + A = offline_program + force = 1 + delay = 0 + if(program == A) + return + if(world.time < (last_change + 25 + (damaged?500:0)) && !force) + if(delay) + sleep(25) + else + if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve + return + if(get_dist(usr,src) <= 3) + usr << "ERROR. Recalibrating projection apparatus." + return + + last_change = world.time + active = (A != offline_program) + use_power = active+1 + + for(var/obj/effect/holodeck_effect/HE in effects) + HE.deactivate(src) + + for(var/item in spawned) + derez(item, forced=force) + + program = A + // note nerfing does not yet work on guns, should + // should also remove/limit/filter reagents? + // this is an exercise left to others I'm afraid. -Sayu + spawned = A.copy_contents_to(linked, 1, nerf_weapons = !emagged) + effects = list() + + spawn(30) + for(var/obj/effect/holodeck_effect/HE in spawned) + effects += HE + spawned -= HE + var/atom/x = HE.activate(src) + if(istype(x) || islist(x)) + spawned += x // holocarp are not forever + +/obj/machinery/computer/holodeck/proc/derez(var/obj/obj, var/silent = 1, var/forced = 0) + // Emagging a machine creates an anomaly in the derez systems. + if(obj && src.emagged && !src.stat && !forced) + if((ismob(obj) || istype(obj.loc,/mob)) && prob(50)) + spawn(50) .(obj,silent) // may last a disturbingly long time + return + spawned.Remove(obj) + + if(!obj) + return + var/turf/T = get_turf(obj) + for(var/atom/movable/AM in obj.contents) // these should be derezed if they were generated + AM.loc = T // otherwise make sure they are dropped + + if(istype(obj)) + var/mob/M = obj.loc + if(ismob(M)) + M.unEquip(obj, 1) //Holoweapons should always drop. + + for(var/mob/M in obj.contents) + M.loc = obj.loc + silent = 0 + + if(!silent) + var/obj/oldobj = obj + visible_message("The [oldobj.name] fades away!") + qdel(obj) \ No newline at end of file diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm new file mode 100644 index 00000000000..e547b1ca813 --- /dev/null +++ b/code/modules/holodeck/holo_effect.dm @@ -0,0 +1,87 @@ +/* + The holodeck activates these shortly after the program loads, + and deactivates them immediately before changing or disabling the holodeck. + + These remove snowflake code for special holodeck functions. +*/ +/obj/effect/holodeck_effect + icon = 'icons/mob/screen_gen.dmi' + icon_state = "x2" + invisibility = 101 + proc/activate(var/obj/machinery/computer/holodeck/HC) + return + proc/deactivate(var/obj/machinery/computer/holodeck/HC) + qdel(src) + return + // Called by the holodeck computer as long as the program is running + proc/tick(var/obj/machinery/computer/holodeck/HC) + return + + proc/safety(var/active) + return + + +// Generates a holodeck-tracked card deck +/obj/effect/holodeck_effect/cards + icon = 'icons/obj/toy.dmi' + icon_state = "deck_nanotrasen_full" + var/obj/item/toy/cards/deck/D + +/obj/effect/holodeck_effect/cards/activate(var/obj/machinery/computer/holodeck/HC) + D = new(loc) + safety(!HC.emagged) + D.holo = HC + return D + +/obj/effect/holodeck_effect/cards/safety(active) + if(!D) return + if(active) + D.card_hitsound = null + D.card_force = 0 + D.card_throwforce = 0 + D.card_throw_speed = 3 + D.card_throw_range = 7 + D.card_attack_verb = list("attacked") + else + D.card_hitsound = 'sound/weapons/bladeslice.ogg' + D.card_force = 5 + D.card_throwforce = 10 + D.card_throw_speed = 3 + D.card_throw_range = 7 + D.card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut") + + +/obj/effect/holodeck_effect/sparks/activate(var/obj/machinery/computer/holodeck/HC) + var/turf/T = get_turf(src) + if(T) + var/datum/effect_system/spark_spread/s = new + s.set_up(3, 1, T) + s.start() + T.temperature = 5000 + T.hotspot_expose(50000,50000,1) + + + +/obj/effect/holodeck_effect/mobspawner + var/mobtype = /mob/living/simple_animal/hostile/carp/holocarp + var/mob/mob = null + +/obj/effect/holodeck_effect/mobspawner/activate(var/obj/machinery/computer/holodeck/HC) + if(islist(mobtype)) mobtype = pick(mobtype) + mob = new mobtype(loc) + + // these vars are not really standardized but all would theoretically create stuff on death + for(var/v in list("butcher_results","corpse","weapon1","weapon2") & mob.vars) + mob.vars[v] = null + return mob + +/obj/effect/holodeck_effect/mobspawner/deactivate(var/obj/machinery/computer/holodeck/HC) + if(mob) HC.derez(mob) + qdel(src) + +/obj/effect/holodeck_effect/mobspawner/pet + mobtype = list( + /mob/living/simple_animal/butterfly, /mob/living/simple_animal/chick/holo, + /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/cat/kitten, + /mob/living/simple_animal/pet/dog/corgi, /mob/living/simple_animal/pet/dog/corgi/puppy, + /mob/living/simple_animal/pet/dog/pug, /mob/living/simple_animal/pet/fox) \ No newline at end of file diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm new file mode 100644 index 00000000000..755fcfcca20 --- /dev/null +++ b/code/modules/holodeck/items.dm @@ -0,0 +1,220 @@ +/* + Items, Structures, Machines +*/ + + +// +// Items +// + +/obj/item/weapon/holo + damtype = STAMINA + +/obj/item/weapon/holo/esword + name = "holographic energy sword" + desc = "May the force be with you. Sorta" + icon_state = "sword0" + force = 3.0 + throw_speed = 2 + throw_range = 5 + throwforce = 0 + w_class = 2.0 + hitsound = "swing_hit" + flags = NOSHIELD + var/active = 0 + +/obj/item/weapon/holo/esword/green + New() + item_color = "green" + +/obj/item/weapon/holo/esword/red + New() + item_color = "red" + +/obj/item/weapon/holo/esword/IsShield() + if(active) + return 1 + return 0 + +/obj/item/weapon/holo/esword/attack(target as mob, mob/user as mob) + ..() + +/obj/item/weapon/holo/esword/New() + item_color = pick("red","blue","green","purple") + +/obj/item/weapon/holo/esword/attack_self(mob/living/user as mob) + active = !active + if (active) + force = 30 + icon_state = "sword[item_color]" + w_class = 4 + hitsound = 'sound/weapons/blade1.ogg' + playsound(user, 'sound/weapons/saberon.ogg', 20, 1) + user << "[src] is now active." + else + force = 3 + icon_state = "sword0" + w_class = 2 + hitsound = "swing_hit" + playsound(user, 'sound/weapons/saberoff.ogg', 20, 1) + user << "[src] can now be concealed." + return + +//BASKETBALL OBJECTS + +/obj/item/toy/beach_ball/holoball + name = "basketball" + icon = 'icons/obj/basketball.dmi' + icon_state = "basketball" + item_state = "basketball" + desc = "Here's your chance, do your dance at the Space Jam." + w_class = 4 //Stops people from hiding it in their bags/pockets + +/obj/item/toy/beach_ball/holoball/dodgeball + name = "dodgeball" + icon_state = "dodgeball" + item_state = "dodgeball" + desc = "Used for playing the most violent and degrading of childhood games." + +/obj/item/toy/beach_ball/holoball/dodgeball/throw_impact(atom/hit_atom) + ..() + if((ishuman(hit_atom))) + var/mob/living/carbon/M = hit_atom + playsound(src, 'sound/items/dodgeball.ogg', 50, 1) + M.apply_damage(10, STAMINA) + if(prob(5)) + M.Weaken(3) + visible_message("[M] is knocked right off \his feet!", 3) + +// +// Structures +// + +/obj/structure/stool/bed/chair/holo/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/weapon/wrench)) + user << "It's holographic! There's no taking it apart." + return + ..() + +/obj/structure/stool/bed/chair/holo/comfy + name = "comfy chair" + desc = "It looks comfy." + icon_state = "comfychair" + color = rgb(255,113,0) + +/obj/structure/holohoop + name = "basketball hoop" + desc = "Boom, shakalaka!" + icon = 'icons/obj/basketball.dmi' + icon_state = "hoop" + anchored = 1 + density = 1 + +/obj/structure/holohoop/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) + var/obj/item/weapon/grab/G = W + if(G.state < GRAB_AGGRESSIVE) + user << "You need a better grip to do that!" + return + G.affecting.loc = src.loc + G.affecting.Weaken(5) + visible_message("[G.assailant] dunks [G.affecting] into \the [src]!", 3) + qdel(W) + return + else if (istype(W, /obj/item) && get_dist(src,user)<2) + user.drop_item(src) + visible_message(" [user] dunks [W] into \the [src]!", 3) + return + +/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0) + if (istype(mover,/obj/item) && mover.throwing) + var/obj/item/I = mover + if(istype(I, /obj/item/projectile)) + return + if(prob(50)) + I.loc = src.loc + visible_message(" Swish! \the [I] lands in \the [src].", 3) + else + visible_message(" \the [I] bounces off of \the [src]'s rim!", 3) + return 0 + else + return ..(mover, target, height) + + + +// +// Machines +// + +/obj/machinery/readybutton + name = "ready declaration device" + desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!" + icon = 'icons/obj/monitors.dmi' + icon_state = "auth_off" + var/ready = 0 + var/area/currentarea = null + var/eventstarted = 0 + + anchored = 1.0 + use_power = 1 + idle_power_usage = 2 + active_power_usage = 6 + power_channel = ENVIRON + +/obj/machinery/readybutton/attack_ai(mob/user as mob) + user << "The station AI is not to interact with these devices" + return + +/obj/machinery/readybutton/attack_paw(mob/user as mob) + user << "You are too primitive to use this device!" + return + +/obj/machinery/readybutton/New() + ..() + + +/obj/machinery/readybutton/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + user << "The device is a solid button, there's nothing you can do with it!" + +/obj/machinery/readybutton/attack_hand(mob/user as mob) + if(user.stat || stat & (NOPOWER|BROKEN)) + user << "This device is not powered!" + return + + currentarea = get_area(src.loc) + if(!currentarea) + qdel(src) + + if(eventstarted) + usr << "The event has already begun!" + return + + ready = !ready + + update_icon() + + var/numbuttons = 0 + var/numready = 0 + for(var/obj/machinery/readybutton/button in currentarea) + numbuttons++ + if (button.ready) + numready++ + + if(numbuttons == numready) + begin_event() + +/obj/machinery/readybutton/update_icon() + if(ready) + icon_state = "auth_on" + else + icon_state = "auth_off" + +/obj/machinery/readybutton/proc/begin_event() + + eventstarted = 1 + + for(var/obj/structure/window/holo/W in currentarea) + qdel(W) + + for(var/mob/M in currentarea) + M << "FIGHT!" diff --git a/code/modules/holodeck/tables.dm b/code/modules/holodeck/tables.dm new file mode 100644 index 00000000000..b91731b33e8 --- /dev/null +++ b/code/modules/holodeck/tables.dm @@ -0,0 +1,68 @@ +/obj/structure/table/holo + name = "table" + frame = null + buildstackamount = 0 + framestackamount = 0 + canSmoothWith = null + +/obj/structure/table/holo/glass + name = "glass table" + icon = 'icons/obj/smooth_structures/glass_table.dmi' + icon_state = "glass_table" + +/obj/structure/table/holo/wood + name = "wood table" + icon = 'icons/obj/smooth_structures/wood_table.dmi' + icon_state = "wood_table" + canSmoothWith = list(/obj/structure/table/holo/wood, /obj/structure/table/holo/poker) + +/obj/structure/table/holo/poker + name = "poker table" + icon = 'icons/obj/smooth_structures/poker_table.dmi' + icon_state = "poker_table" + canSmoothWith = list(/obj/structure/table/holo/wood, /obj/structure/table/holo/poker) + +/obj/structure/table/holo/attack_paw(mob/user as mob) + return + +/obj/structure/table/holo/attack_alien(mob/user as mob) + return + +/obj/structure/table/holo/attack_animal(mob/living/simple_animal/user as mob) + return + +/obj/structure/table/holo/attack_hand(mob/user as mob) + return +/obj/structure/table/holo/attack_hulk() + return + +/obj/structure/table/holo/attackby(obj/item/I, mob/user, params) + if (istype(I, /obj/item/weapon/grab)) + tablepush(I, user) + return + if (istype(I, /obj/item/weapon/storage/bag/tray)) + var/obj/item/weapon/storage/bag/tray/T = I + if(T.contents.len > 0) // If the tray isn't empty + var/list/obj/item/oldContents = T.contents.Copy() + T.quick_empty() + + for(var/obj/item/C in oldContents) + C.loc = src.loc + + user.visible_message("[user] empties [I] on [src].") + return + // If the tray IS empty, continue on (tray will be placed on the table like other items) + + if(isrobot(user)) + return + + if(!(I.flags & ABSTRACT)) //rip more parems rip in peace ;_; + if(user.drop_item()) + I.Move(loc) + var/list/click_params = params2list(params) + //Center the icon where the user clicked. + if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) + return + //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) + I.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm new file mode 100644 index 00000000000..b19c5bb019e --- /dev/null +++ b/code/modules/holodeck/turfs.dm @@ -0,0 +1,80 @@ +/turf/simulated/floor/holofloor + icon_state = "floor" + thermal_conductivity = 0 + broken_states = list() + burnt_states = list() + +/turf/simulated/floor/holofloor/attackby(obj/item/weapon/W as obj, mob/user as mob) + return // HOLOFLOOR DOES NOT GIVE A FUCK + +/turf/simulated/floor/holofloor/plating + name = "Holodeck Projector Floor" + icon_state = "engine" + +/turf/simulated/floor/holofloor/grass + gender = PLURAL + name = "lush grass" + icon_state = "grass" + +/turf/simulated/floor/holofloor/beach + name = "sand" + icon = 'icons/misc/beach.dmi' // what + icon_state = "sand" +/turf/simulated/floor/holofloor/beach/coast + name = "coastline" + icon = 'icons/misc/beach2.dmi' // why + icon_state = "sandwater" +/turf/simulated/floor/holofloor/beach/water + name = "water" + icon_state = "water" + +/turf/simulated/floor/holofloor/asteroid + name = "Asteroid" + icon_state = "asteroid0" + +/turf/simulated/floor/holofloor/asteroid/New() + icon_state = "asteroid[pick(0,1,2,3,4,5,6,7,8,9,10,11,12)]" + ..() + +/turf/simulated/floor/holofloor/space + name = "Space" + icon = 'icons/turf/space.dmi' + icon_state = "0" + +/turf/simulated/floor/holofloor/space/New() + icon_state = "[((x + y) ^ ~(x * y) + z) % 25]" // so realistic + ..() + +/turf/simulated/floor/holofloor/hyperspace + name = "Hyperspace" + icon = 'icons/turf/space.dmi' + icon_state = "speedspace_ew_1" + +/turf/simulated/floor/holofloor/hyperspace/New() + icon_state = "speedspace_ew_[(x + 5*y + (y%2+1)*7)%15+1]" + ..() + +/turf/simulated/floor/holofloor/hyperspace/ns/New() + ..() + icon_state = "speedspace_ns_[(x + 5*y + (y%2+1)*7)%15+1]" + +/turf/simulated/floor/holofloor/carpet + name = "Carpet" + desc = "Electrically inviting." + icon = 'icons/turf/floors/carpet.dmi' + icon_state = "carpet" + floor_tile = /obj/item/stack/tile/carpet + broken_states = list("damaged") + smooth = SMOOTH_TRUE + canSmoothWith = null + +/turf/simulated/floor/holofloor/carpet/New() + ..() + spawn(1) + update_icon() + +/turf/simulated/floor/holofloor/carpet/update_icon() + if(!..()) + return 0 + if(intact) + smooth_icon(src) diff --git a/code/modules/holodeck/windows.dm b/code/modules/holodeck/windows.dm new file mode 100644 index 00000000000..41d3de65da7 --- /dev/null +++ b/code/modules/holodeck/windows.dm @@ -0,0 +1,44 @@ +/obj/structure/window/holo + name = "reinforced window" + icon = 'icons/obj/structures.dmi' + icon_state = "rwindow" + desc = "A window. It has an electric hum to it." + density = 1 + layer = 3.2//Just above doors + pressure_resistance = 4*ONE_ATMOSPHERE + anchored = 1.0 + flags = ON_BORDER + maxhealth = 100 + disassembled = 1 // prevents noise on destruction + +/obj/structure/window/holo/New() + ..() + for(var/O in contents) + qdel(O) // standard window code generates stuff no matter what we want + +/obj/structure/window/holo/spawnfragments() + qdel(src) + return + +/obj/structure/window/holo/attackby(var/obj/item/I, var/mob/user) + if(istype(I,/obj/item/weapon/screwdriver)) + user << "You see no screws to unfasten!" + return + return ..() + +/obj/structure/window/holo/hit(var/damage, var/sound_effect = 1) + . = ..() + spawn(50) // self-healing + health += damage + +/obj/structure/window/holo/opaque + name = "tinted window" + opacity = 1 + +/obj/structure/window/holo/fulltile + dir = 5 + maxhealth = 250 + +/obj/structure/window/holo/opaque/fulltile + dir = 5 + maxhealth = 250 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 4692bdd8af2..178bfef7b25 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -177,6 +177,10 @@ new /mob/living/simple_animal/chicken(src.loc) qdel(src) +/mob/living/simple_animal/chick/holo/Life() + ..() + amount_grown = 0 + var/const/MAX_CHICKENS = 50 var/global/chicken_count = 0 diff --git a/tgstation.dme b/tgstation.dme index 848c9d635a3..2f0e67fcdae 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -485,7 +485,6 @@ #include "code\game\machinery\computer\computer.dm" #include "code\game\machinery\computer\crew.dm" #include "code\game\machinery\computer\dna_console.dm" -#include "code\game\machinery\computer\HolodeckControl.dm" #include "code\game\machinery\computer\law.dm" #include "code\game\machinery\computer\medical.dm" #include "code\game\machinery\computer\message.dm" @@ -1089,6 +1088,15 @@ #include "code\modules\games\cards.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\holidays.dm" +#include "code\modules\holodeck\area_copy.dm" +#include "code\modules\holodeck\areas.dm" +#include "code\modules\holodeck\computer.dm" +#include "code\modules\holodeck\computer_funcs.dm" +#include "code\modules\holodeck\holo_effect.dm" +#include "code\modules\holodeck\items.dm" +#include "code\modules\holodeck\tables.dm" +#include "code\modules\holodeck\turfs.dm" +#include "code\modules\holodeck\windows.dm" #include "code\modules\html_interface\html_interface.dm" #include "code\modules\html_interface\html_interface_client.dm" #include "code\modules\html_interface\cards\cards.dm"