From b251b9dbb0938ed28be12731a4cb2d1525f3e211 Mon Sep 17 00:00:00 2001 From: san7890 Date: Sat, 18 Nov 2023 20:24:32 -0700 Subject: [PATCH] Refactors Parrots into Basic Mobs (ft. Ben10Omintrix/Kobsamobsa) (#79762) --- .../SpaceRuins/russian_derelict.dmm | 6 +- _maps/map_files/Birdshot/birdshot.dmm | 708 +-- .../map_files/Deltastation/DeltaStation2.dmm | 678 +-- .../map_files/IceBoxStation/IceBoxStation.dmm | 196 +- _maps/map_files/MetaStation/MetaStation.dmm | 460 +- _maps/map_files/NorthStar/north_star.dmm | 238 +- _maps/map_files/tramstation/tramstation.dmm | 308 +- _maps/shuttles/emergency_hugcage.dmm | 2 +- _maps/shuttles/ruin_pirate_cutter.dmm | 2 +- _maps/virtual_domains/pirates.dmm | 3820 ++++++++--------- code/__DEFINES/ai/pets.dm | 24 + .../signals_atom/signals_atom_movable.dm | 8 +- .../dcs/signals/signals_mob/signals_mob_ai.dm | 1 + .../signals/signals_mob/signals_mob_basic.dm | 7 + code/__DEFINES/traits/declarations.dm | 2 + code/_globalvars/phobias.dm | 2 +- code/_globalvars/traits/_traits.dm | 1 + .../subsystem/persistence/_persistence.dm | 5 +- .../basic_ai_behaviors/basic_attacking.dm | 11 + .../basic_ai_behaviors/unbuckle_mob.dm | 14 + code/datums/ai/generic/find_and_set.dm | 23 + code/datums/ai/generic/generic_behaviors.dm | 2 + code/datums/components/listen_and_repeat.dm | 83 + code/datums/components/supermatter_crystal.dm | 2 +- code/datums/diseases/parrotpossession.dm | 39 +- code/datums/elements/pet_bonus.dm | 1 + code/datums/memory/_memory.dm | 2 +- .../pirate/pirate_shuttle_equipment.dm | 4 +- .../traitor/objectives/kill_pet.dm | 2 +- code/modules/cargo/packs/livestock.dm | 4 +- code/modules/events/ghost_role/sentience.dm | 2 +- code/modules/events/holiday/halloween.dm | 6 +- code/modules/events/wizard/petsplosion.dm | 2 +- .../mob/living/basic/pets/parrot/_parrot.dm | 458 ++ .../parrot/parrot_ai/_parrot_controller.dm | 40 + .../parrot_ai/ghost_parrot_controller.dm | 37 + .../pets/parrot/parrot_ai/parrot_hoarding.dm | 74 + .../pets/parrot/parrot_ai/parrot_perching.dm | 78 + .../pets/parrot/parrot_ai/parroting_action.dm | 50 + .../living/basic/pets/parrot/parrot_items.dm | 60 + .../basic/pets/parrot/parrot_subtypes.dm | 14 + .../mob/living/basic/pets/parrot/poly.dm | 254 ++ .../mob/living/carbon/human/human_defines.dm | 6 +- code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/living_say.dm | 4 +- .../mob/living/simple_animal/parrot.dm | 1067 ----- code/modules/mob/transform_procs.dm | 2 +- code/modules/research/experimentor.dm | 2 +- code/modules/unit_tests/required_map_items.dm | 7 +- .../unit_tests/simple_animal_freeze.dm | 4 - tgstation.dme | 12 +- .../Scripts/79762_simple_to_basic_parrots.txt | 5 + 52 files changed, 4521 insertions(+), 4320 deletions(-) create mode 100644 code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm create mode 100644 code/datums/components/listen_and_repeat.dm create mode 100644 code/modules/mob/living/basic/pets/parrot/_parrot.dm create mode 100644 code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm create mode 100644 code/modules/mob/living/basic/pets/parrot/parrot_ai/ghost_parrot_controller.dm create mode 100644 code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm create mode 100644 code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm create mode 100644 code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm create mode 100644 code/modules/mob/living/basic/pets/parrot/parrot_items.dm create mode 100644 code/modules/mob/living/basic/pets/parrot/parrot_subtypes.dm create mode 100644 code/modules/mob/living/basic/pets/parrot/poly.dm delete mode 100644 code/modules/mob/living/simple_animal/parrot.dm create mode 100644 tools/UpdatePaths/Scripts/79762_simple_to_basic_parrots.txt diff --git a/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm b/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm index e1671448e34..45eee5cbe8b 100644 --- a/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm @@ -4876,10 +4876,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/singulo) -"IZ" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron/airless, -/area/ruin/space/ks13/engineering/singulo) "Jc" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/mapping_helpers/broken_floor, @@ -11718,7 +11714,7 @@ PI Ex pi FI -IZ +FI FI FI zv diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index d2e8f5c89f7..7775f185c8e 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -418,6 +418,17 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/wood/tile, /area/station/command/bridge) +"ahM" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/mob/living/basic/parrot/poly, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "aid" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -481,17 +492,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/project) -"ajw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "ajG" = ( /obj/machinery/atmospherics/components/tank/oxygen{ dir = 1 @@ -2018,13 +2018,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"aPG" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/engineering/supermatter) "aPM" = ( /obj/structure/chair/sofa/bench/right, /obj/machinery/firealarm/directional/north, @@ -2060,10 +2053,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark/small, /area/station/security/checkpoint/customs) -"aQn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/station/engineering/supermatter) "aQr" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -2078,13 +2067,6 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/engine_smes) -"aQB" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ - dir = 9 - }, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/station/engineering/supermatter) "aQF" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -2303,16 +2285,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"aTA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "aTG" = ( /obj/structure/table/reinforced, /obj/machinery/requests_console/directional/east{ @@ -2325,52 +2297,12 @@ /obj/machinery/recharger, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) -"aTP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"aTW" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "aUA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_edge, /area/station/maintenance/starboard/greater) -"aUQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"aVj" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/corner, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "aVq" = ( /obj/machinery/door/airlock/highsecurity{ name = "Radiation-Proof Airlock" @@ -2559,26 +2491,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"aZP" = ( -/obj/structure/cable, -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure{ - pixel_y = -10 - }, -/obj/item/paper_bin{ - pixel_x = 7; - pixel_y = 7 - }, -/obj/item/pen{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/flashlight/lamp/green{ - pixel_x = -6; - pixel_y = 11 - }, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/hop) "aZS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -2677,16 +2589,6 @@ /obj/effect/turf_decal/stripes/end, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"bcu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "bcv" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2694,14 +2596,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white/small, /area/station/medical/medbay/lobby) -"bcK" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "bcR" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -3285,15 +3179,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/small, /area/station/engineering/main) -"boP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "boW" = ( /obj/structure/table/glass, /obj/machinery/status_display/ai/directional/south, @@ -4479,20 +4364,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"bJL" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "bJZ" = ( /obj/structure/chair/stool/directional/south, /turf/open/floor/iron, @@ -4933,6 +4804,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine) +"bUl" = ( +/obj/effect/landmark/start/station_engineer, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8; + filter_type = list(/datum/gas/nitrogen) + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "bUr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue{ @@ -5488,6 +5367,15 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/disposal/incinerator) +"cdZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "cea" = ( /obj/structure/window/spawner/directional/south, /turf/open/space/basic, @@ -6876,6 +6764,16 @@ }, /turf/open/floor/plating/rust, /area/station/engineering/supermatter) +"cFF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "cFI" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -7744,6 +7642,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"cXF" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter) "cXJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/wood{ @@ -8295,6 +8200,13 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) +"diM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "diO" = ( /obj/effect/turf_decal/tile/yellow, /obj/structure/cable, @@ -8490,15 +8402,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"dla" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "dlc" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8600,6 +8503,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"dnp" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "dnq" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 1 @@ -9184,14 +9094,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal/incinerator) -"dyH" = ( -/obj/effect/landmark/start/station_engineer, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8; - filter_type = list(/datum/gas/nitrogen) - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "dyO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -9884,13 +9786,6 @@ /obj/item/clothing/glasses/meson, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"dLE" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "dLQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -13057,6 +12952,17 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/circuit, /area/station/maintenance/port/aft) +"ePu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "ePw" = ( /obj/machinery/photocopier, /obj/effect/mapping_helpers/broken_floor, @@ -13988,6 +13894,17 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/space/nearstation) +"fiW" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 8 + }, +/obj/structure/secure_safe/directional/north{ + name = "armory safe A" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) "fjh" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -16105,17 +16022,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"fRU" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/mob/living/simple_animal/parrot/poly, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "fSf" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -16230,15 +16136,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"fTx" = ( -/obj/structure/cable, -/obj/structure/bed, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/item/bedsheet/ce, -/obj/effect/landmark/start/chief_engineer, -/obj/structure/secure_safe/directional/south, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/ce) "fTD" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -16525,6 +16422,26 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark/small, /area/station/command/heads_quarters/captain/private) +"gaf" = ( +/obj/structure/cable, +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure{ + pixel_y = -10 + }, +/obj/item/paper_bin{ + pixel_x = 7; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/flashlight/lamp/green{ + pixel_x = -6; + pixel_y = 11 + }, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/hop) "gal" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/saltshaker{ @@ -17189,6 +17106,15 @@ /obj/item/wrench/medical, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) +"gmi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "gmm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17365,13 +17291,6 @@ "gpI" = ( /turf/closed/wall, /area/station/command/heads_quarters/ce) -"gpK" = ( -/obj/structure/closet/secure_closet/engineering_chief, -/obj/item/storage/briefcase/secure, -/obj/item/lighter, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/ce) "gpL" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -18367,11 +18286,6 @@ /obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) -"gIG" = ( -/obj/structure/table/glass, -/obj/item/storage/briefcase/secure, -/turf/open/floor/carpet/executive, -/area/station/command/meeting_room) "gIH" = ( /obj/structure/table, /obj/item/wrench{ @@ -18784,17 +18698,6 @@ /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/carpet/green, /area/station/maintenance/central/lesser) -"gPr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/yellow/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "gPN" = ( /obj/structure/fermenting_barrel, /turf/open/floor/plating, @@ -19592,16 +19495,6 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/wood/tile, /area/station/command/bridge) -"hcG" = ( -/obj/structure/closet{ - name = "Evidence Closet 2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/secure_safe/directional/north{ - name = "evidence safe" - }, -/turf/open/floor/iron/smooth, -/area/station/security/evidence) "hcU" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20684,6 +20577,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"hur" = ( +/obj/structure/table/glass, +/obj/item/storage/briefcase/secure, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room) "huy" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -22871,6 +22769,18 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"ijY" = ( +/obj/structure/closet/secure_closet/chief_medical, +/obj/item/storage/briefcase/secure{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/structure/secure_safe/directional/south{ + pixel_y = -23 + }, +/obj/item/gun/syringe, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/cmo) "ikc" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/fore) @@ -25761,6 +25671,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor/iron_dark, /area/station/security/processing) +"jmm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/meter, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "jmo" = ( /obj/structure/reagent_dispensers/fueltank, /obj/machinery/light/small/directional/west, @@ -28540,6 +28460,16 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white/textured_large, /area/station/command/heads_quarters/cmo) +"kkW" = ( +/obj/structure/closet{ + name = "Evidence Closet 2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/secure_safe/directional/north{ + name = "evidence safe" + }, +/turf/open/floor/iron/smooth, +/area/station/security/evidence) "kla" = ( /obj/structure/closet, /obj/item/clothing/suit/toggle/owlwings, @@ -29138,13 +29068,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) -"kvh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "kvl" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -29154,6 +29077,18 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"kvr" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/obj/structure/secure_safe/hos{ + pixel_x = 15; + pixel_y = 28 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone, +/area/station/command/heads_quarters/hos) "kvI" = ( /obj/docking_port/stationary/random{ dir = 8; @@ -29446,6 +29381,10 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"kBD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/station/engineering/supermatter) "kBH" = ( /turf/open/floor/iron/white/small, /area/station/service/janitor) @@ -29533,6 +29472,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons) +"kDS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "kDV" = ( /obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, @@ -30433,6 +30383,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/office) +"kUy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "kUF" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -30604,16 +30561,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"kYK" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "kYQ" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -31182,6 +31129,25 @@ }, /turf/open/space/basic, /area/space/nearstation) +"lgh" = ( +/obj/structure/table, +/obj/machinery/light_switch/directional/north, +/obj/item/storage/briefcase/secure{ + pixel_x = 3; + pixel_y = 12 + }, +/obj/item/storage/briefcase/secure{ + pixel_x = -1; + pixel_y = 8 + }, +/obj/item/crowbar/large{ + pixel_y = -10 + }, +/obj/item/weldingtool/mini{ + pixel_y = -10 + }, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "lgj" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -33173,10 +33139,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) -"lOh" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "lOi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36229,6 +36191,13 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"mRT" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "mSi" = ( /obj/structure/mannequin/plastic, /turf/open/floor/plating, @@ -38637,17 +38606,6 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"nKf" = ( -/obj/effect/turf_decal/siding/dark_red/corner{ - dir = 8 - }, -/obj/structure/secure_safe/directional/north{ - name = "armory safe A" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) "nKj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39628,6 +39586,16 @@ }, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical/central) +"ofS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "ofZ" = ( /turf/closed/mineral/random/stationside, /area/station/maintenance/port/lesser) @@ -39659,6 +39627,16 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/storage) +"ogB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "ogF" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/closet/firecloset, @@ -40588,6 +40566,11 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"owZ" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/structure/secure_safe/caps_spare/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/bridge) "oxb" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ @@ -42064,6 +42047,20 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"oZS" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 5 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "oZY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42904,13 +42901,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/security/checkpoint/escape) -"poI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "poM" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -43037,6 +43027,12 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"pqJ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 6 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/station/engineering/supermatter) "pqK" = ( /obj/structure/cable, /obj/machinery/door/window/left/directional/south, @@ -43193,11 +43189,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/stone, /area/station/command/corporate_suite) -"ptB" = ( -/obj/item/kirbyplants/organic/applebush, -/obj/structure/secure_safe/caps_spare/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/bridge) "ptN" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/toy/talking/griffin{ @@ -43891,16 +43882,6 @@ /obj/effect/turf_decal/siding/blue, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"pEu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/meter, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "pEy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -46411,12 +46392,6 @@ }, /turf/open/floor/iron/grimy, /area/station/service/theater) -"qrP" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ - dir = 6 - }, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/station/engineering/supermatter) "qrR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47419,6 +47394,13 @@ }, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) +"qHT" = ( +/obj/structure/closet/secure_closet/engineering_chief, +/obj/item/storage/briefcase/secure, +/obj/item/lighter, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/ce) "qHY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51898,6 +51880,10 @@ /obj/effect/landmark/start/research_director, /turf/open/floor/iron/grimy, /area/station/science/cubicle) +"scc" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "scg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -55405,18 +55391,6 @@ "tjj" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai_upload) -"tjQ" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/dark_red{ - dir = 1 - }, -/obj/structure/secure_safe/hos{ - pixel_x = 15; - pixel_y = 28 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/stone, -/area/station/command/heads_quarters/hos) "tkp" = ( /obj/machinery/door/airlock/public/glass{ name = "Services Corridor" @@ -55698,6 +55672,13 @@ /obj/effect/turf_decal/tile/dark_red/half/contrasted, /turf/open/floor/iron, /area/station/security/brig/entrance) +"tpd" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 9 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/station/engineering/supermatter) "tpk" = ( /obj/machinery/vending/wardrobe/law_wardrobe, /obj/effect/turf_decal/siding/wood{ @@ -60355,6 +60336,17 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) +"uRu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "uRF" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -61260,18 +61252,6 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"vgC" = ( -/obj/structure/closet/secure_closet/chief_medical, -/obj/item/storage/briefcase/secure{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/structure/secure_safe/directional/south{ - pixel_y = -23 - }, -/obj/item/gun/syringe, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/cmo) "vgN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -64092,6 +64072,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"vYg" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "vYj" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -64671,6 +64664,15 @@ }, /turf/closed/wall/r_wall, /area/station/security/brig/entrance) +"wiw" = ( +/obj/structure/cable, +/obj/structure/bed, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/item/bedsheet/ce, +/obj/effect/landmark/start/chief_engineer, +/obj/structure/secure_safe/directional/south, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/ce) "wix" = ( /obj/item/kirbyplants/random, /obj/machinery/newscaster/directional/west, @@ -65908,6 +65910,14 @@ /obj/effect/spawner/random/structure/grille, /turf/open/space/basic, /area/space/nearstation) +"wCp" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "wCt" = ( /obj/machinery/flasher/directional/east, /turf/open/floor/iron/half, @@ -66798,6 +66808,15 @@ }, /turf/open/floor/iron, /area/station/medical/chemistry) +"wPV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "wQj" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -71995,25 +72014,6 @@ /obj/effect/spawner/random/aimodule/harmless, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) -"yhk" = ( -/obj/structure/table, -/obj/machinery/light_switch/directional/north, -/obj/item/storage/briefcase/secure{ - pixel_x = 3; - pixel_y = 12 - }, -/obj/item/storage/briefcase/secure{ - pixel_x = -1; - pixel_y = 8 - }, -/obj/item/crowbar/large{ - pixel_y = -10 - }, -/obj/item/weldingtool/mini{ - pixel_y = -10 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) "yhq" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ @@ -81657,9 +81657,9 @@ diK aII dID tKO -kYK -dyH -pEu +ogB +bUl +jmm ayK jZl jZl @@ -81914,9 +81914,9 @@ cFC aJc aME xQr -aTA -poI -kvh +cFF +kUy +diM bfZ bmn bwg @@ -82171,9 +82171,9 @@ qiX jxu buS xQr -aTP -boP -dla +cdZ +gmi +wPV npy bmP bzs @@ -82427,10 +82427,10 @@ oZg geQ aRR pbt -aPG +cXF bAq -dLE -aTW +mRT +dnp bhc bng bzv @@ -82684,9 +82684,9 @@ vFW aAt oES fzl -aQn -gPr -bcu +kBD +uRu +ofS jOb xtX jAw @@ -82940,10 +82940,10 @@ acn iuu iey mwI -qrP -aQB -ajw -bcK +pqJ +tpd +kDS +wCp frj ayK ayK @@ -83199,8 +83199,8 @@ xmb aJn aNe xQr -aUQ -lOh +ePu +scc xYG rQi bGT @@ -83456,8 +83456,8 @@ hzi bEG leh lkU -aVj -bJL +vYg +oZS iQv bhR boL @@ -85616,7 +85616,7 @@ wYW pds kPa vTV -tjQ +kvr ddE tiM qGu @@ -86119,7 +86119,7 @@ rui qVP qop xkt -nKf +fiW mVt gJa huN @@ -87147,7 +87147,7 @@ fEC fEC rui qVP -hcG +kkW jnN gEH nDe @@ -88952,7 +88952,7 @@ nCH xfN daq xFe -yhk +lgh dYc nlf yjd @@ -92733,7 +92733,7 @@ evs bGc fqf fvT -fRU +ahM gnf fpO dDB @@ -93515,7 +93515,7 @@ dDB dDB sUy uOP -gIG +hur mzb gTi pUy @@ -94019,7 +94019,7 @@ eSh fpO fyQ fSW -gpK +qHT fpO blb blb @@ -94275,7 +94275,7 @@ eyv eSo fpO fyT -fTx +wiw fpO fpO dDB @@ -94544,7 +94544,7 @@ pIS uAK anb uFm -ptB +owZ xsh ahE plz @@ -94813,7 +94813,7 @@ uVT tgw lqt ghD -aZP +gaf xQw mvT vrn @@ -99003,7 +99003,7 @@ vDV kkO vDV ntX -vgC +ijY wgL lLH sSQ diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 0c73cb0f482..220e5041462 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -816,13 +816,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) -"ajG" = ( -/obj/structure/secure_safe/directional/west, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "ajP" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment, @@ -1151,23 +1144,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) -"anP" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/machinery/status_display/evac/directional/north, -/obj/item/storage/briefcase{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/briefcase/secure, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/corporate_showroom) "anV" = ( /obj/effect/landmark/start/hangover/closet, /obj/structure/closet/firecloset, @@ -5039,6 +5015,19 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) +"bkE" = ( +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/structure/secure_safe/directional/north, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) "bkN" = ( /obj/structure/table/reinforced, /obj/item/folder/red{ @@ -8212,21 +8201,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/department/science/xenobiology) -"bWn" = ( -/obj/structure/sign/poster/party_game/directional/west, -/obj/structure/table, -/obj/item/storage/briefcase/secure{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/briefcase{ - pixel_y = -2 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "bWD" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -10315,6 +10289,15 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"cxu" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular, +/obj/structure/secure_safe/caps_spare/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "cxM" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, @@ -11550,11 +11533,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/theater) -"cNy" = ( -/obj/item/kirbyplants/random, -/obj/structure/secure_safe/directional/east, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/captain/private) "cNH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13446,6 +13424,21 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"dlU" = ( +/obj/structure/table/wood, +/obj/structure/secure_safe/directional/east, +/obj/machinery/computer/security/wooden_tv, +/obj/machinery/light_switch/directional/south{ + pixel_x = 8 + }, +/obj/machinery/button/door/directional/south{ + id = "detectivewindows"; + name = "Privacy Shutters"; + pixel_x = -6; + req_access = list("detective") + }, +/turf/open/floor/carpet, +/area/station/security/detectives_office) "dmq" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -13522,6 +13515,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"dnK" = ( +/obj/structure/rack, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/storage/briefcase/secure, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/wood, +/area/station/service/lawoffice) "dnM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -16559,19 +16562,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) -"eaL" = ( -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/structure/secure_safe/directional/north, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) "eaO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17410,6 +17400,15 @@ /obj/structure/flora/bush/lavendergrass/style_4, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) +"enF" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/briefcase, +/turf/open/floor/iron/checker, +/area/station/service/theater/abandoned) "enR" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -18004,19 +18003,6 @@ dir = 4 }, /area/station/service/chapel) -"euf" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/east, -/obj/item/storage/briefcase/secure, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/taperecorder{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "eug" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -21706,17 +21692,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/station/security/warden) -"fpe" = ( -/obj/structure/closet/secure_closet/contraband/heads, -/obj/item/storage/briefcase/secure, -/obj/item/storage/box/ids, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/customs/aft) "fpm" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/neutral{ @@ -21826,6 +21801,23 @@ /obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, /turf/open/floor/iron/white, /area/station/medical/medbay) +"fqN" = ( +/obj/structure/table, +/obj/structure/cable, +/obj/machinery/status_display/evac/directional/north, +/obj/item/storage/briefcase{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/briefcase/secure, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/corporate_showroom) "fqO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23313,6 +23305,13 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/station/solars/port/fore) +"fKY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure, +/obj/item/grenade/smokebomb, +/turf/open/floor/wood, +/area/station/maintenance/starboard/aft) "fLc" = ( /obj/structure/table/wood, /obj/item/clothing/neck/tie/red, @@ -25014,6 +25013,13 @@ /obj/effect/spawner/random/entertainment/deck, /turf/open/floor/carpet/black, /area/station/maintenance/port) +"gfY" = ( +/obj/structure/secure_safe/directional/west, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "ggc" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25286,19 +25292,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"gjG" = ( -/obj/structure/table/wood, -/obj/structure/secure_safe/hos{ - pixel_x = 32 - }, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/siding/dark_red{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/item/flashlight/lamp/green, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hos) "gjI" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/north, @@ -26963,6 +26956,17 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) +"gCL" = ( +/obj/structure/closet/secure_closet/contraband/heads, +/obj/item/storage/briefcase/secure, +/obj/item/storage/box/ids, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/aft) "gCQ" = ( /obj/structure/reagent_dispensers/wall/peppertank/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -27227,15 +27231,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"gGh" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/briefcase/secure, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) "gGv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27332,16 +27327,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/carpet/royalblack, /area/station/service/chapel/office) -"gHH" = ( -/obj/structure/cable, -/obj/structure/closet/secure_closet/contraband/heads, -/obj/item/storage/briefcase/secure, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/customs/fore) "gHI" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/landmark/event_spawn, @@ -31711,21 +31696,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark/corner, /area/station/hallway/secondary/exit/departure_lounge) -"hQJ" = ( -/obj/structure/table/wood, -/obj/structure/secure_safe/directional/east, -/obj/machinery/computer/security/wooden_tv, -/obj/machinery/light_switch/directional/south{ - pixel_x = 8 - }, -/obj/machinery/button/door/directional/south{ - id = "detectivewindows"; - name = "Privacy Shutters"; - pixel_x = -6; - req_access = list("detective") - }, -/turf/open/floor/carpet, -/area/station/security/detectives_office) "hQK" = ( /obj/structure/reflector/box, /turf/open/floor/plating, @@ -33281,6 +33251,21 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/port) +"ikn" = ( +/obj/structure/sign/poster/party_game/directional/west, +/obj/structure/table, +/obj/item/storage/briefcase/secure{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/briefcase{ + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "ikx" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -34712,14 +34697,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) -"iDm" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/newscaster/directional/north, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "iDq" = ( /turf/closed/wall/r_wall, /area/station/security/range) @@ -35081,6 +35058,15 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"iIb" = ( +/obj/structure/table/reinforced, +/obj/item/folder/red, +/obj/item/storage/briefcase/secure, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/taperecorder, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/office) "iId" = ( /obj/effect/turf_decal/siding/yellow, /obj/structure/table/glass, @@ -36573,20 +36559,6 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"jbG" = ( -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/storage/briefcase/secure{ - pixel_x = 5; - pixel_y = -3 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/detectives_office) "jbN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/white/warning{ @@ -40801,6 +40773,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"kbL" = ( +/obj/structure/cable, +/obj/structure/closet/secure_closet/contraband/heads, +/obj/item/storage/briefcase/secure, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/fore) "kbN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/north, @@ -41982,16 +41964,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"kqk" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/storage/lockbox/medal, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/captain) "kql" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/grimy, @@ -43734,6 +43706,15 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/commons/locker) +"kPM" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/briefcase/secure, +/turf/open/floor/wood, +/area/station/command/meeting_room/council) "kPQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -45530,22 +45511,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"lmI" = ( -/obj/structure/table/glass, -/obj/machinery/computer/records/medical/laptop, -/obj/structure/secure_safe/directional/north, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Medbay - Chief Medical Officer's Quarters"; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/command/heads_quarters/cmo) "lmJ" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, @@ -45898,6 +45863,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"lrK" = ( +/obj/structure/table, +/obj/item/storage/briefcase/secure, +/obj/machinery/firealarm/directional/north, +/obj/item/clothing/neck/stethoscope, +/obj/item/flashlight/pen, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/command/heads_quarters/cmo) "lrO" = ( /obj/machinery/status_display/ai/directional/south, /obj/machinery/camera/directional/south{ @@ -47630,17 +47604,6 @@ /obj/effect/mapping_helpers/apc/cell_10k, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"lLW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/storage/briefcase/secure, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating, -/area/station/security/detectives_office/private_investigators_office) "lLY" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -52997,16 +52960,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/smooth_large, /area/station/service/chapel/funeral) -"niL" = ( -/obj/structure/rack, -/obj/item/storage/briefcase/secure, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/bot, -/obj/item/reagent_containers/pill/patch/aiuri, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "niN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/carpet/blue, @@ -54714,6 +54667,19 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"nGO" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/east, +/obj/item/storage/briefcase/secure, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/taperecorder{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "nGS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55763,6 +55729,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) +"nUo" = ( +/obj/effect/landmark/start/hangover/closet, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/personal, +/obj/effect/spawner/random/food_or_drink/cups, +/obj/item/storage/briefcase/secure, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/vacant_room) "nUp" = ( /turf/closed/wall/r_wall, /area/station/engineering/gravity_generator) @@ -55992,6 +55974,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"nXR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/storage/briefcase/secure, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) "nXY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56240,6 +56233,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"obB" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/newscaster/directional/north, +/mob/living/basic/parrot/poly, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "obI" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -56771,16 +56772,6 @@ /obj/structure/sign/poster/official/science/directional/north, /turf/open/floor/plating, /area/station/maintenance/space_hut/observatory) -"oit" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/north, -/obj/structure/secure_safe/directional/east, -/obj/item/storage/lockbox/loyalty, -/obj/item/storage/backpack/satchel/leather/withwallet{ - pixel_y = 6 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "oiC" = ( /obj/machinery/computer/records/security{ dir = 8 @@ -57509,6 +57500,22 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"orQ" = ( +/obj/structure/table/glass, +/obj/machinery/computer/records/medical/laptop, +/obj/structure/secure_safe/directional/north, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay - Chief Medical Officer's Quarters"; + name = "medbay camera"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/command/heads_quarters/cmo) "orR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59833,16 +59840,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"pal" = ( -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/briefcase/secure, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/wood, -/area/station/service/lawoffice) "paq" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/wood, @@ -60372,6 +60369,16 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"pgs" = ( +/obj/structure/table/wood, +/obj/machinery/light/directional/north, +/obj/structure/secure_safe/directional/east, +/obj/item/storage/lockbox/loyalty, +/obj/item/storage/backpack/satchel/leather/withwallet{ + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "pgv" = ( /obj/machinery/teleport/station, /obj/machinery/status_display/evac/directional/east, @@ -63407,13 +63414,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/cryo) -"pQR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure, -/obj/item/grenade/smokebomb, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "pQT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64812,6 +64812,20 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/artgallery) +"qhq" = ( +/obj/structure/rack, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/storage/briefcase/secure{ + pixel_x = 5; + pixel_y = -3 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office) "qhA" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -69881,6 +69895,19 @@ }, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"rwF" = ( +/obj/structure/table/wood, +/obj/structure/secure_safe/hos{ + pixel_x = 32 + }, +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/siding/dark_red{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/item/flashlight/lamp/green, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hos) "rwM" = ( /obj/structure/table/wood, /obj/item/paper_bin/construction{ @@ -75512,6 +75539,16 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"sQi" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/briefcase/secure, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron, +/area/station/security/courtroom) "sQn" = ( /obj/machinery/vending/clothing, /obj/effect/turf_decal/bot, @@ -75793,6 +75830,14 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"sTu" = ( +/obj/structure/rack, +/obj/item/aicard, +/obj/item/storage/briefcase/secure, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "sTv" = ( /obj/machinery/status_display/evac/directional/north, /obj/structure/cable, @@ -76884,14 +76929,6 @@ /obj/effect/turf_decal/trimline/green/filled/corner, /turf/open/floor/iron/white, /area/station/medical/virology) -"tip" = ( -/obj/structure/rack, -/obj/item/aicard, -/obj/item/storage/briefcase/secure, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "tiC" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 5 @@ -77370,6 +77407,11 @@ "tqo" = ( /turf/closed/wall, /area/station/engineering/main) +"tqr" = ( +/obj/item/kirbyplants/random, +/obj/structure/secure_safe/directional/east, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/captain/private) "tqw" = ( /obj/effect/turf_decal/bot, /obj/machinery/vending/wardrobe/medi_wardrobe, @@ -83245,15 +83287,6 @@ dir = 1 }, /area/station/science/lobby) -"uLn" = ( -/obj/structure/table, -/obj/item/storage/briefcase/secure, -/obj/machinery/firealarm/directional/north, -/obj/item/clothing/neck/stethoscope, -/obj/item/flashlight/pen, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/command/heads_quarters/cmo) "uLq" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral{ @@ -84992,11 +85025,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/diagonal, /area/station/science/breakroom) -"vhx" = ( -/obj/structure/secure_safe/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "vhH" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -85684,15 +85712,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"vrz" = ( -/obj/structure/table/reinforced, -/obj/item/folder/red, -/obj/item/storage/briefcase/secure, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/taperecorder, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/office) "vrP" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -86975,6 +86994,11 @@ "vGy" = ( /turf/closed/wall/mineral/plastitanium, /area/station/commons/fitness/recreation) +"vGM" = ( +/obj/structure/secure_safe/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "vGP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/railing{ @@ -87516,17 +87540,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"vPv" = ( -/obj/structure/table/reinforced, -/obj/machinery/status_display/ai/directional/east, -/obj/item/storage/briefcase/secure, -/obj/item/aicard, -/obj/item/circuitboard/aicore, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "vPy" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -88247,15 +88260,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"vZw" = ( -/obj/structure/table/reinforced, -/obj/item/storage/medkit/regular, -/obj/structure/secure_safe/caps_spare/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "vZE" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -90616,6 +90620,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"wCn" = ( +/obj/structure/rack, +/obj/item/storage/briefcase/secure, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/bot, +/obj/item/reagent_containers/pill/patch/aiuri, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "wCp" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -91659,15 +91673,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"wRe" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/briefcase, -/turf/open/floor/iron/checker, -/area/station/service/theater/abandoned) "wRf" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -91695,6 +91700,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"wRz" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/storage/lockbox/medal, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/captain) "wRL" = ( /obj/effect/spawner/random/structure/crate, /obj/machinery/light/small/broken/directional/west, @@ -93287,22 +93302,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/range) -"xnh" = ( -/obj/effect/landmark/start/hangover/closet, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/personal, -/obj/effect/spawner/random/food_or_drink/cups, -/obj/item/storage/briefcase/secure, -/obj/effect/turf_decal/bot, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/brown/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/vacant_room) "xnp" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -93688,6 +93687,17 @@ /obj/item/bedsheet/random/double, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"xsp" = ( +/obj/structure/table/reinforced, +/obj/machinery/status_display/ai/directional/east, +/obj/item/storage/briefcase/secure, +/obj/item/aicard, +/obj/item/circuitboard/aicore, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "xsq" = ( /obj/structure/table, /obj/item/storage/box/lights/mixed, @@ -95468,16 +95478,6 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"xOn" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/briefcase/secure, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron, -/area/station/security/courtroom) "xOs" = ( /obj/machinery/light/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -119343,7 +119343,7 @@ kTd wwr rSZ bAR -iDm +obB viB pOz hEL @@ -119864,7 +119864,7 @@ tMl apu swR aHE -niL +wCn gAw qje fbA @@ -126068,7 +126068,7 @@ dyx sIX rzF gAE -ajG +gfY xsl lXI sIX @@ -128124,7 +128124,7 @@ hwS sIX wyK eqh -vPv +xsp sIX sIX sIX @@ -129077,7 +129077,7 @@ juX ueJ nMw csw -xnh +nUo pLx jZj umN @@ -132197,7 +132197,7 @@ xOv nHc fxs lAg -gGh +kPM pRS qLa nLS @@ -133018,7 +133018,7 @@ lhC pdi ikZ dNN -lmI +orQ wRj jBw wRj @@ -134003,7 +134003,7 @@ lAv nAz jce lZx -oit +pgs lbt iVT nuY @@ -134757,7 +134757,7 @@ xms aaa wyH fIx -vZw +cxu cQv drj bog @@ -134818,7 +134818,7 @@ dQT xkU jew rEO -uLn +lrK pMF jDq utz @@ -135275,7 +135275,7 @@ pnV bsC fIg hdZ -tip +sTu ipQ eVl cGR @@ -137098,7 +137098,7 @@ vpK jcB uJm duA -anP +fqN mzL sFu uDj @@ -137536,7 +137536,7 @@ bFV aSO lZz koM -gHH +kbL pzr jwr mxP @@ -139136,7 +139136,7 @@ cBE kDL qxw aby -kqk +wRz aGZ teA nSv @@ -139912,7 +139912,7 @@ ivA hmA wbh sEs -cNy +tqr sim lHx ivA @@ -141984,7 +141984,7 @@ lgf ljT gbt hgJ -eaL +bkE qoR aNG tXA @@ -142013,7 +142013,7 @@ lni xeX qkj qMf -lLW +nXR rKL gnj cjs @@ -142021,7 +142021,7 @@ hJo kfb qQg eBn -fpe +gCL epU hWJ eQo @@ -144029,7 +144029,7 @@ lMk fSg tJt cei -xOn +sQi kgm wan rrF @@ -145046,7 +145046,7 @@ cnp uzz uYp xWR -hQJ +dlU dCk rTO dCd @@ -145556,7 +145556,7 @@ btm aaa aaa dCk -jbG +qhq oHF wRP rku @@ -145827,7 +145827,7 @@ mDR qwP vrP gez -pal +dnK rYA gdA hjQ @@ -147674,7 +147674,7 @@ qMf rev qMf qMf -wRe +enF nbc dtM iLr @@ -149915,7 +149915,7 @@ mif qlN bdx lpI -vrz +iIb sYN wWH vgK @@ -150465,7 +150465,7 @@ pzN uYX pGm jMz -bWn +ikn bvT gVh lmD @@ -150751,7 +150751,7 @@ qEb bBd hDU dhR -pQR +fKY pwM vNa eOt @@ -151729,7 +151729,7 @@ bLs bLs gPh oGM -vhx +vGM gYv lIy uro @@ -153256,7 +153256,7 @@ gIw huI fbW okz -euf +nGO kOA kOA aad @@ -154280,7 +154280,7 @@ aaa aad aaa kOA -gjG +rwF xtj iHy yfO diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 88557af5a94..384ddfa7bae 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -4584,12 +4584,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) -"bup" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "buv" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ color = "#ff0000"; @@ -10740,14 +10734,6 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/smooth_large, /area/station/security/checkpoint/medical) -"dho" = ( -/obj/structure/table/reinforced, -/obj/item/storage/briefcase/secure{ - pixel_y = 5 - }, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/station/command/bridge) "dhq" = ( /turf/closed/mineral/random/labormineral/ice, /area/icemoon/surface/outdoors/labor_camp) @@ -15699,29 +15685,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) -"eJC" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/vodka/badminka{ - pixel_x = 7; - pixel_y = 20 - }, -/obj/item/taperecorder{ - pixel_x = -5; - pixel_y = 1 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = 7; - pixel_y = 8 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = 6 - }, -/obj/structure/secure_safe/hos{ - pixel_x = 35 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/heads_quarters/hos) "eJI" = ( /obj/structure/closet/emcloset, /obj/effect/mapping_helpers/broken_floor, @@ -17153,6 +17116,12 @@ "fiL" = ( /turf/closed/wall/r_wall, /area/station/security/evidence) +"fiN" = ( +/obj/structure/table/wood, +/obj/structure/secure_safe/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain) "fiO" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -18005,6 +17974,14 @@ /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/engineering/atmos) +"fwQ" = ( +/obj/structure/table/reinforced, +/obj/structure/secure_safe/caps_spare/directional/east, +/obj/item/papercutter{ + pixel_x = 7 + }, +/turf/open/floor/iron, +/area/station/command/bridge) "fwS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22007,14 +21984,6 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) -"gKk" = ( -/obj/structure/table/reinforced, -/obj/structure/secure_safe/caps_spare/directional/east, -/obj/item/papercutter{ - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/station/command/bridge) "gKl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23020,14 +22989,6 @@ "hap" = ( /turf/open/floor/vault, /area/station/security/prison/rec) -"haw" = ( -/obj/structure/secure_safe/directional/south, -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/commons/vacant_room/commissary) "hay" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28660,15 +28621,6 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"iOO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/table, -/obj/structure/secure_safe/directional/south, -/obj/item/storage/briefcase/secure, -/turf/open/floor/iron/smooth, -/area/station/command/heads_quarters/rd) "iOS" = ( /obj/machinery/airalarm/directional/east, /obj/structure/table, @@ -30589,6 +30541,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"juH" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/mob/living/basic/parrot/poly, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "juQ" = ( /obj/structure/rack, /obj/item/stack/rods/fifty, @@ -38150,6 +38108,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"lET" = ( +/obj/structure/table/reinforced, +/obj/item/storage/briefcase/secure{ + pixel_y = 5 + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron, +/area/station/command/bridge) "lFe" = ( /obj/structure/bookcase/random/adult, /turf/open/floor/iron/dark/textured, @@ -50765,16 +50731,6 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/miningdock) -"pwc" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/closet/secure_closet/personal, -/obj/item/storage/briefcase/secure, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/effect/turf_decal/tile/brown/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) "pwd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -52225,6 +52181,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/commons/storage/art) +"pRX" = ( +/obj/structure/secure_safe/directional/south, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/commons/vacant_room/commissary) "pRZ" = ( /obj/machinery/shower/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -53308,6 +53272,15 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/science/explab) +"qlO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/table, +/obj/structure/secure_safe/directional/south, +/obj/item/storage/briefcase/secure, +/turf/open/floor/iron/smooth, +/area/station/command/heads_quarters/rd) "qlP" = ( /obj/machinery/door/airlock/external/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59017,6 +58990,17 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) +"rXj" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/structure/secure_safe/directional/south, +/obj/effect/turf_decal/tile/green/full, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/virology) "rXr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -64126,17 +64110,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/work) -"tCM" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/medical{ - dir = 4 - }, -/obj/structure/secure_safe/directional/south, -/obj/effect/turf_decal/tile/green/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/virology) "tCO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -65576,6 +65549,16 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"uao" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/closet/secure_closet/personal, +/obj/item/storage/briefcase/secure, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) "uar" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -69743,6 +69726,29 @@ dir = 10 }, /area/station/science/research) +"vtZ" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/vodka/badminka{ + pixel_x = 7; + pixel_y = 20 + }, +/obj/item/taperecorder{ + pixel_x = -5; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = 7; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = 6 + }, +/obj/structure/secure_safe/hos{ + pixel_x = 35 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/heads_quarters/hos) "vuh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73243,12 +73249,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"wwB" = ( -/obj/structure/table/wood, -/obj/structure/secure_safe/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain) "wwI" = ( /obj/structure/chair, /obj/effect/turf_decal/stripes/line{ @@ -184135,7 +184135,7 @@ hzz gmf jUB gyY -tCM +rXj xDb thA thA @@ -233195,7 +233195,7 @@ gpZ vov cAo gst -pwc +uao plN rTO rTO @@ -233457,7 +233457,7 @@ fXu uOM vzw rTO -haw +pRX gst byl rgl @@ -237817,7 +237817,7 @@ dnq kgD utR uEQ -dho +lET grA cEv nOH @@ -239576,7 +239576,7 @@ jDt wtg diq ehy -eJC +vtZ mgU fUj kcc @@ -240388,7 +240388,7 @@ nfk utR tmQ qnV -gKk +fwQ kBr lhv iGH @@ -240442,7 +240442,7 @@ ami oPU wHj mBB -bup +juH ojv htc mDw @@ -242454,7 +242454,7 @@ eEC aTw iFL hpe -wwB +fiN mBX uEm viQ @@ -254813,7 +254813,7 @@ bHa oMT gaT bZc -iOO +qlO jbU ily hdH diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 74270b3f102..35dc549fcf8 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -152,6 +152,14 @@ "adp" = ( /turf/closed/wall, /area/station/hallway/primary/starboard) +"adz" = ( +/obj/structure/closet/secure_closet/engineering_chief, +/obj/machinery/airalarm/directional/east, +/obj/structure/cable, +/obj/item/storage/briefcase/secure, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "adD" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -1614,12 +1622,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/construction/storage_wing) -"aEP" = ( -/obj/machinery/light_switch/directional/east, -/obj/structure/dresser, -/obj/structure/secure_safe/directional/north, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) "aEW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -2671,22 +2673,6 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"aWR" = ( -/obj/structure/table/glass, -/obj/machinery/light_switch/directional/north, -/obj/item/storage/briefcase/secure{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "aXa" = ( /turf/closed/wall, /area/station/security/prison/mess) @@ -3124,12 +3110,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"bdV" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "beo" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -3334,6 +3314,17 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"bhv" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/camera/directional/north{ + c_tag = "Security - Evidence Storage" + }, +/obj/structure/secure_safe/directional/north{ + name = "evidence safe" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "bhM" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -7428,6 +7419,14 @@ /obj/item/hand_labeler, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"cKW" = ( +/obj/structure/secure_safe/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Chief Engineer's Office" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "cLa" = ( /obj/structure/weightmachine, /obj/effect/turf_decal/tile/dark_red/half/contrasted, @@ -7692,6 +7691,22 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) +"cQz" = ( +/obj/structure/table/glass, +/obj/machinery/light_switch/directional/north, +/obj/item/storage/briefcase/secure{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/storage/medkit/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "cQQ" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ @@ -9253,15 +9268,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"dth" = ( -/obj/structure/table, -/obj/item/storage/briefcase/secure{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/effect/spawner/random/engineering/flashlight, -/turf/open/floor/iron/dark, -/area/station/security/office) "dtB" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 8 @@ -10753,6 +10759,12 @@ /obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, /turf/open/floor/iron, /area/station/cargo/warehouse) +"dXs" = ( +/obj/structure/secure_safe/directional/north{ + name = "armory safe A" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "dXA" = ( /obj/structure/closet/crate/trashcart, /obj/effect/spawner/random/contraband/prison, @@ -11184,6 +11196,19 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"eey" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/rack, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/storage/briefcase/secure{ + pixel_x = 2; + pixel_y = -2 + }, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "eeT" = ( /obj/machinery/vending/hydroseeds{ slogan_delay = 700 @@ -11296,6 +11321,14 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"egp" = ( +/obj/item/storage/briefcase/secure, +/obj/structure/table/wood, +/obj/item/folder/blue, +/obj/item/storage/briefcase/secure, +/obj/item/assembly/flash/handheld, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "egs" = ( /obj/effect/spawner/random/maintenance/two, /obj/structure/rack, @@ -12883,6 +12916,15 @@ "eKP" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/freezerchamber) +"eLa" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure{ + desc = "A large briefcase with a digital locking system, and the Nanotrasen logo emblazoned on the sides."; + name = "\improper Nanotrasen-brand secure briefcase exhibit"; + pixel_y = 2 + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) "eLb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -14688,14 +14730,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"fqC" = ( -/obj/structure/closet/secure_closet/engineering_chief, -/obj/machinery/airalarm/directional/east, -/obj/structure/cable, -/obj/item/storage/briefcase/secure, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "fqD" = ( /obj/structure/chair/stool/directional/south, /turf/open/floor/wood, @@ -15806,14 +15840,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/range) -"fOn" = ( -/obj/structure/secure_safe/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Chief Engineer's Office" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "fOu" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -16523,6 +16549,15 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/white, /area/station/security/prison/visit) +"gem" = ( +/obj/structure/table, +/obj/item/storage/briefcase/secure{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/iron/dark, +/area/station/security/office) "gen" = ( /obj/structure/table/glass, /obj/item/folder/blue{ @@ -17428,6 +17463,17 @@ }, /turf/open/floor/iron, /area/station/service/janitor) +"guO" = ( +/obj/structure/table/wood, +/obj/machinery/light_switch/directional/west, +/obj/item/storage/briefcase/secure{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/storage/lockbox/medal, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) "guR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17708,6 +17754,19 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"gAk" = ( +/obj/machinery/recharger{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/structure/secure_safe/directional/east, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = -12; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "gAt" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -18061,17 +18120,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"gHC" = ( -/obj/structure/table/wood, -/obj/machinery/light_switch/directional/west, -/obj/item/storage/briefcase/secure{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/storage/lockbox/medal, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) "gHE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19639,6 +19687,20 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"hlj" = ( +/obj/structure/table/wood, +/obj/structure/secure_safe/directional/east, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/machinery/button/door/directional/north{ + id = "detective_shutters"; + name = "detective's office shutters control"; + req_access = list("detective") + }, +/turf/open/floor/carpet, +/area/station/security/detectives_office) "hlq" = ( /obj/structure/chair{ dir = 4 @@ -27277,17 +27339,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"jNm" = ( -/obj/effect/landmark/blobstart, -/obj/machinery/camera/directional/north{ - c_tag = "Security - Evidence Storage" - }, -/obj/structure/secure_safe/directional/north{ - name = "evidence safe" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/evidence) "jNo" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -27364,19 +27415,6 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"jOQ" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/storage/briefcase/secure{ - pixel_x = 2; - pixel_y = -2 - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) "jOR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -28968,13 +29006,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"krP" = ( -/obj/structure/secure_safe/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/commons/vacant_room/commissary) "ksg" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -29100,12 +29131,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/satellite) -"ktY" = ( -/obj/structure/secure_safe/directional/north{ - name = "armory safe A" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "kud" = ( /obj/structure/sign/warning/vacuum/external/directional/south, /obj/effect/turf_decal/stripes/line, @@ -37502,6 +37527,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) +"nuB" = ( +/obj/structure/secure_safe/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/commons/vacant_room/commissary) "nuI" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -39558,6 +39590,20 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) +"oha" = ( +/obj/structure/rack, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/storage/briefcase/secure{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/taperecorder, +/obj/item/clothing/glasses/sunglasses, +/turf/open/floor/wood, +/area/station/service/lawoffice) "ohm" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -40032,15 +40078,6 @@ }, /turf/open/floor/iron, /area/station/security/warden) -"ory" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure{ - desc = "A large briefcase with a digital locking system, and the Nanotrasen logo emblazoned on the sides."; - name = "\improper Nanotrasen-brand secure briefcase exhibit"; - pixel_y = 2 - }, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) "orT" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/iron/dark, @@ -40077,6 +40114,15 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space, /area/space/nearstation) +"osH" = ( +/obj/structure/secure_safe/hos{ + pixel_x = 36; + pixel_y = 28 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "ota" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40310,20 +40356,6 @@ }, /turf/closed/wall/r_wall, /area/station/engineering/atmos/storage/gas) -"ovz" = ( -/obj/structure/table/wood, -/obj/structure/secure_safe/directional/east, -/obj/machinery/computer/security/wooden_tv{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/machinery/button/door/directional/north{ - id = "detective_shutters"; - name = "detective's office shutters control"; - req_access = list("detective") - }, -/turf/open/floor/carpet, -/area/station/security/detectives_office) "ovK" = ( /obj/structure/closet/secure_closet/hop, /turf/open/floor/wood, @@ -41172,15 +41204,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"oLL" = ( -/obj/structure/secure_safe/hos{ - pixel_x = 36; - pixel_y = 28 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) "oLS" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/testlab) @@ -41706,20 +41729,6 @@ /obj/machinery/telecomms/server/presets/science, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) -"oXv" = ( -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/storage/briefcase/secure{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/taperecorder, -/obj/item/clothing/glasses/sunglasses, -/turf/open/floor/wood, -/area/station/service/lawoffice) "oXJ" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -41737,6 +41746,25 @@ /obj/item/stack/cable_coil, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) +"oXK" = ( +/obj/structure/safe, +/obj/item/storage/briefcase/secure/riches, +/obj/item/storage/backpack/duffelbag/syndie/hitman, +/obj/item/card/id/advanced/silver/reaper, +/obj/item/lazarus_injector, +/obj/item/gun/energy/disabler, +/obj/item/gun/ballistic/revolver/russian, +/obj/item/ammo_box/a357, +/obj/item/clothing/neck/stethoscope, +/obj/item/book{ + desc = "An undeniably handy book."; + icon_state = "bookknock"; + name = "\improper A Simpleton's Guide to Safe-cracking with Stethoscopes" + }, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "oXL" = ( /obj/machinery/disposal/bin, /obj/structure/cable, @@ -43919,17 +43947,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/research) -"pLv" = ( -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/structure/rack, -/obj/item/storage/briefcase/secure, -/obj/item/clothing/mask/cigarette/cigar, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "pLz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49896,14 +49913,6 @@ "rQw" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) -"rQz" = ( -/obj/item/storage/briefcase/secure, -/obj/structure/table/wood, -/obj/item/folder/blue, -/obj/item/storage/briefcase/secure, -/obj/item/assembly/flash/handheld, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "rQK" = ( /obj/machinery/netpod, /obj/effect/decal/cleanable/robot_debris, @@ -50557,6 +50566,12 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"sby" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/mob/living/basic/parrot/poly, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "sbG" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, @@ -54793,19 +54808,6 @@ /obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"tBV" = ( -/obj/machinery/recharger{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/structure/secure_safe/directional/east, -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = -12; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "tCC" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -55850,6 +55852,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"tVk" = ( +/obj/machinery/light/directional/south, +/obj/machinery/firealarm/directional/south, +/obj/structure/rack, +/obj/item/storage/briefcase/secure, +/obj/item/clothing/mask/cigarette/cigar, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "tVm" = ( /obj/structure/closet/secure_closet/brig, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -57210,6 +57223,18 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"usQ" = ( +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/structure/table/glass, +/obj/structure/secure_safe/caps_spare/directional/west, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "uta" = ( /obj/structure/rack, /obj/item/book/manual/wiki/security_space_law{ @@ -64309,25 +64334,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"wOQ" = ( -/obj/structure/safe, -/obj/item/storage/briefcase/secure/riches, -/obj/item/storage/backpack/duffelbag/syndie/hitman, -/obj/item/card/id/advanced/silver/reaper, -/obj/item/lazarus_injector, -/obj/item/gun/energy/disabler, -/obj/item/gun/ballistic/revolver/russian, -/obj/item/ammo_box/a357, -/obj/item/clothing/neck/stethoscope, -/obj/item/book{ - desc = "An undeniably handy book."; - icon_state = "bookknock"; - name = "\improper A Simpleton's Guide to Safe-cracking with Stethoscopes" - }, -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "wOR" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66980,18 +66986,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"xJl" = ( -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/structure/table/glass, -/obj/structure/secure_safe/caps_spare/directional/west, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "xJv" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron/recharge_floor, @@ -67475,6 +67469,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"xUx" = ( +/obj/machinery/light_switch/directional/east, +/obj/structure/dresser, +/obj/structure/secure_safe/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) "xUB" = ( /obj/structure/sign/directions/security{ dir = 1; @@ -90227,7 +90227,7 @@ rlU vis mCi ixT -wOQ +oXK rlU aaa aEH @@ -92051,7 +92051,7 @@ wvo xCl nMz pJR -rQz +egp kfA rWH oOE @@ -92086,7 +92086,7 @@ ePX svQ duu pKP -aWR +cQz rQd cJm jGw @@ -92306,9 +92306,9 @@ oIa cpn koa srP -krP +nuB pJR -tBV +gAk qAA uFQ eIy @@ -94580,7 +94580,7 @@ aaa aaa aaa rJB -jNm +bhv dxe wTO xxZ @@ -94619,7 +94619,7 @@ tKN aaf dsQ mZL -xJl +usQ aGQ acf hmq @@ -94880,7 +94880,7 @@ nxO qXF qXF aMB -pLv +tVk duI jnt cdC @@ -94896,7 +94896,7 @@ jzN sYh qeZ nBs -ory +eLa vyi nNY htd @@ -95608,7 +95608,7 @@ aaa aaa cTk aeq -ktY +dXs tJE kVU tJE @@ -98479,7 +98479,7 @@ ogL tyY aPs cUX -gHC +guO nOq xDa vwP @@ -98697,7 +98697,7 @@ kxA xXh ooG wxj -dth +gem ipz nOv dgS @@ -99220,7 +99220,7 @@ pBG sOZ uWo jMy -jOQ +eey aHr mhA xNo @@ -99741,7 +99741,7 @@ bHN ilh ilh ilh -oXv +oha fbs itp soX @@ -100013,7 +100013,7 @@ wEG htd qBC syo -aEP +xUx cRU oRn sjS @@ -100248,7 +100248,7 @@ lAM dDe lAM sWV -ovz +hlj dbj jyQ lGj @@ -101515,7 +101515,7 @@ aaa rrt lMJ mxn -oLL +osH gTt sdu fad @@ -108233,7 +108233,7 @@ vHs iBm uXd sqE -fOn +cKW dJP bfO pCt @@ -108494,7 +108494,7 @@ nLz jEh hYE rEd -bdV +sby tUw iqU jLg @@ -108751,7 +108751,7 @@ qtm fyJ qVD cuc -fqC +adz tUw rHq peX diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index a3dcc17b4f4..8f4cd620e91 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -6128,6 +6128,23 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/white/smooth_large, /area/station/science/robotics/lab) +"bxs" = ( +/obj/structure/rack, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/storage/briefcase/secure{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/clothing/glasses/sunglasses, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/parquet, +/area/station/service/lawoffice) "bxG" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/smooth, @@ -6807,16 +6824,6 @@ /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, /area/station/solars/starboard/fore) -"bIL" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/cable, -/obj/machinery/computer/security/telescreen/engine{ - name = "Engineering and atmospherics monitor" - }, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/command/heads_quarters/ce) "bIQ" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/firealarm/directional/east, @@ -7561,14 +7568,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"bSJ" = ( -/obj/structure/rack, -/obj/structure/secure_safe/directional/east, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/effect/spawner/random/armory/bulletproof_armor, -/obj/effect/spawner/random/armory/bulletproof_helmet, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "bSR" = ( /obj/structure/closet/crate/freezer, /obj/effect/spawner/random/medical/memeorgans, @@ -12293,6 +12292,10 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/service/library/garden) +"deK" = ( +/obj/structure/secure_safe/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/station/maintenance/floor2/starboard/aft) "deM" = ( /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) @@ -23365,12 +23368,6 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"ghQ" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) "ghZ" = ( /obj/structure/table, /obj/item/inspector{ @@ -26067,6 +26064,16 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) +"gSr" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/cable, +/obj/machinery/computer/security/telescreen/engine{ + name = "Engineering and atmospherics monitor" + }, +/mob/living/basic/parrot/poly, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/command/heads_quarters/ce) "gSs" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 @@ -28194,19 +28201,6 @@ /obj/machinery/light/red/dim/directional/west, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard) -"hvs" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Antechamber" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/command/minisat, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) "hvv" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28250,6 +28244,16 @@ /obj/structure/girder, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) +"hwd" = ( +/obj/structure/rack, +/obj/item/storage/briefcase/secure, +/obj/item/restraints/handcuffs, +/obj/machinery/light/small/directional/south, +/obj/machinery/camera/directional/east{ + c_tag = "Detective's Backroom" + }, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "hwe" = ( /obj/structure/disposalpipe/trunk, /obj/machinery/disposal/delivery_chute{ @@ -29737,17 +29741,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/cargo/storage) -"hQj" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/command/minisat, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "hQl" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair{ @@ -31085,6 +31078,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/floor2/port) +"iiM" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Access" + }, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/hallway) "iiQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/line{ @@ -33576,6 +33577,10 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"iQe" = ( +/obj/structure/secure_safe/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "iQf" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -33856,6 +33861,11 @@ }, /turf/open/floor/wood, /area/station/service/theater) +"iUb" = ( +/obj/structure/secure_safe/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "iUP" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -42101,16 +42111,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) -"kZi" = ( -/obj/structure/rack, -/obj/item/storage/briefcase/secure, -/obj/item/restraints/handcuffs, -/obj/machinery/light/small/directional/south, -/obj/machinery/camera/directional/east{ - c_tag = "Detective's Backroom" - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) "kZl" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -47423,6 +47423,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) +"mqw" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) "mqx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57434,11 +57440,6 @@ /obj/structure/cable/multilayer/connected, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"oTF" = ( -/obj/structure/secure_safe/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) "oTG" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box{ @@ -60357,6 +60358,19 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"pKc" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Antechamber" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/structure/cable/layer3, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/service) "pKd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64975,14 +64989,6 @@ /obj/effect/spawner/random/engineering/tool, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"qVp" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Access" - }, -/obj/effect/mapping_helpers/airlock/access/any/command/minisat, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "qVv" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -66988,23 +66994,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) -"rxd" = ( -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/storage/briefcase/secure{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/clothing/glasses/sunglasses, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/wood/parquet, -/area/station/service/lawoffice) "rxe" = ( /obj/effect/decal/cleanable/blood/old, /obj/structure/chair{ @@ -72438,11 +72427,6 @@ }, /turf/open/floor/wood, /area/station/commons/dorms/apartment2) -"sXl" = ( -/obj/structure/secure_safe/caps_spare/directional/south, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "sXp" = ( /obj/structure/rack, /obj/item/radio/off{ @@ -74743,11 +74727,6 @@ /obj/effect/mob_spawn/corpse/human/charredskeleton, /turf/open/floor/iron, /area/station/maintenance/floor4/starboard) -"tBe" = ( -/obj/structure/table, -/obj/item/storage/briefcase/secure, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "tBh" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -82266,10 +82245,6 @@ /obj/machinery/duct, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) -"vyv" = ( -/obj/structure/secure_safe/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/station/maintenance/floor2/starboard/aft) "vyz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -87019,6 +86994,17 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, /area/station/command/gateway) +"wIA" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/hallway) "wIC" = ( /obj/structure/railing/corner{ dir = 1 @@ -87626,6 +87612,14 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"wPG" = ( +/obj/structure/rack, +/obj/structure/secure_safe/directional/east, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "wPK" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/ore_silo, @@ -88187,6 +88181,11 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/cytology) +"wWX" = ( +/obj/structure/table, +/obj/item/storage/briefcase/secure, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "wXi" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -90282,6 +90281,11 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"xzS" = ( +/obj/structure/secure_safe/caps_spare/directional/south, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "xzT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -92311,10 +92315,6 @@ }, /turf/open/misc/beach/sand, /area/station/hallway/floor2/fore) -"yaY" = ( -/obj/structure/secure_safe/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "yba" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -135607,7 +135607,7 @@ nPb rCO cjc aRI -bIL +gSr bgs hZt kzE @@ -202144,7 +202144,7 @@ mPw sQa spr aOa -vyv +deK spr pxw edO @@ -203705,7 +203705,7 @@ xAu crK fsJ rQV -hQj +wIA rQV tPm tPm @@ -204731,7 +204731,7 @@ uZF cfH wns kOk -qVp +iiM wmw bXz sZo @@ -263851,7 +263851,7 @@ oRz pfC nqr lRY -ghQ +mqw kux joL tmq @@ -308052,7 +308052,7 @@ rrX shu hwM ukK -sXl +xzS uIx oad uxW @@ -313456,7 +313456,7 @@ uqc rZV pld gLb -tBe +wWX wvq uWl gIl @@ -315510,7 +315510,7 @@ cSF aEm oAe mxO -kZi +hwd mau eae mGT @@ -315766,7 +315766,7 @@ iUT nyL xSQ dzE -oTF +iUb mau mau mau @@ -318831,7 +318831,7 @@ tlZ oaU nPE qPv -yaY +iQe wqP iNA obK @@ -322712,7 +322712,7 @@ dPH vuf jjA gSD -bSJ +wPG iaO gMo jOc @@ -325002,7 +325002,7 @@ hre shW ofD vxy -rxd +bxs oWC rbR ciU @@ -334772,7 +334772,7 @@ kZZ kum kum kum -hvs +pKc fzr iBc jPj diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index ed9f5542c82..8e9c0035532 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -3298,6 +3298,18 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) +"asG" = ( +/obj/structure/table, +/obj/item/storage/fancy/cigarettes{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/storage/briefcase/secure{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/station/security/office) "asQ" = ( /obj/structure/sign/warning/no_smoking, /turf/closed/wall, @@ -3735,13 +3747,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"awY" = ( -/obj/structure/secure_safe/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "axe" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/neutral/filled/corner, @@ -10651,16 +10656,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/warehouse) -"cDX" = ( -/obj/structure/table/reinforced, -/obj/item/storage/briefcase/secure, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/command/bridge) "cDZ" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/freezer, @@ -13503,20 +13498,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /turf/closed/wall/r_wall, /area/station/science/ordnance/storage) -"dDN" = ( -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/briefcase/secure, -/obj/effect/turf_decal/trimline/green/filled/corner, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/security/courtroom) "dEc" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -15259,16 +15240,6 @@ "ekB" = ( /turf/closed/wall, /area/station/service/janitor) -"ekE" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/storage/lockbox/medal, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain) "ekL" = ( /obj/machinery/conveyor{ dir = 1; @@ -15578,6 +15549,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"esf" = ( +/obj/structure/table/reinforced, +/obj/item/storage/briefcase/secure, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/command/bridge) "esi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -17623,6 +17604,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) +"fhK" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/storage/lockbox/medal, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain) "fhL" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -24186,14 +24177,6 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"hGG" = ( -/obj/structure/closet/secure_closet/hos, -/obj/structure/secure_safe/hos{ - pixel_x = 35 - }, -/obj/structure/sign/poster/official/space_cops/directional/north, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) "hGI" = ( /obj/structure/railing/corner{ dir = 1 @@ -24342,11 +24325,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/tram/right) -"hKL" = ( -/obj/structure/secure_safe/directional/east, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/carpet, -/area/station/security/detectives_office) "hKM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/structure/cable/layer1, @@ -24699,6 +24677,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"hPQ" = ( +/obj/structure/secure_safe/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "hPW" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -31026,15 +31011,6 @@ }, /turf/open/floor/carpet, /area/station/service/chapel/monastery) -"kcb" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "kcm" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -32839,6 +32815,33 @@ "kHB" = ( /turf/open/floor/grass, /area/station/medical/virology) +"kHR" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/machinery/button/door/directional/west{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_y = 8; + req_access = list("atmospherics") + }, +/obj/machinery/button/door/directional/west{ + id = "Secure Storage"; + name = "Engineering Secure Storage"; + req_access = list("engine_equip") + }, +/obj/machinery/button/door/directional/west{ + id = "Engineering"; + name = "Engineering Lockdown"; + pixel_y = -8; + req_access = list("engineering") + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/mob/living/basic/parrot/poly, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "kHS" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -39258,12 +39261,6 @@ /obj/item/extinguisher, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"mTX" = ( -/obj/structure/closet/secure_closet/hop, -/obj/structure/sign/clock/directional/west, -/obj/structure/secure_safe/directional/north, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) "mUd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{ dir = 1 @@ -40724,15 +40721,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) -"nug" = ( -/obj/structure/table/reinforced, -/obj/structure/secure_safe/caps_spare/directional/east, -/obj/machinery/cell_charger{ - pixel_y = 4 - }, -/obj/item/stock_parts/cell/high, -/turf/open/floor/iron, -/area/station/command/bridge) "nuj" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -42385,6 +42373,13 @@ /obj/item/stamp/head/cmo, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"nXM" = ( +/obj/structure/table/glass, +/obj/item/storage/briefcase/secure, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "nXP" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44171,6 +44166,11 @@ /obj/structure/sign/warning/fire, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) +"oMh" = ( +/obj/structure/secure_safe/directional/east, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/carpet, +/area/station/security/detectives_office) "oMz" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -46148,6 +46148,14 @@ /obj/structure/closet/toolcloset, /turf/open/floor/iron, /area/station/engineering/main) +"pxf" = ( +/obj/structure/closet/secure_closet/hos, +/obj/structure/secure_safe/hos{ + pixel_x = 35 + }, +/obj/structure/sign/poster/official/space_cops/directional/north, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "pxj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -47528,33 +47536,6 @@ /obj/machinery/light/warm/directional/north, /turf/open/floor/iron/dark, /area/station/service/bar) -"pWa" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/button/door/directional/west{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_y = 8; - req_access = list("atmospherics") - }, -/obj/machinery/button/door/directional/west{ - id = "Secure Storage"; - name = "Engineering Secure Storage"; - req_access = list("engine_equip") - }, -/obj/machinery/button/door/directional/west{ - id = "Engineering"; - name = "Engineering Lockdown"; - pixel_y = -8; - req_access = list("engineering") - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) "pWt" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -48202,6 +48183,15 @@ "qgt" = ( /turf/closed/wall/rock/porous, /area/station/medical/chemistry) +"qgy" = ( +/obj/structure/table/reinforced, +/obj/structure/secure_safe/caps_spare/directional/east, +/obj/machinery/cell_charger{ + pixel_y = 4 + }, +/obj/item/stock_parts/cell/high, +/turf/open/floor/iron, +/area/station/command/bridge) "qgB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48538,6 +48528,14 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"qmC" = ( +/obj/structure/closet{ + name = "Evidence Closet 1" + }, +/obj/structure/secure_safe/directional/east, +/obj/effect/spawner/random/contraband/cannabis, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "qmH" = ( /obj/structure/closet/secure_closet/quartermaster, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -50890,6 +50888,14 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"rdm" = ( +/obj/structure/displaycase/captain{ + pixel_y = 5 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/structure/secure_safe/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain) "rdo" = ( /obj/machinery/computer/shuttle/labor, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -57196,14 +57202,6 @@ /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, /area/space/nearstation) -"tqS" = ( -/obj/structure/displaycase/captain{ - pixel_y = 5 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/structure/secure_safe/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain) "tqT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel{ @@ -57974,6 +57972,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"tDR" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "tDT" = ( /turf/open/openspace, /area/station/commons/fitness/recreation) @@ -59144,14 +59151,6 @@ /obj/item/paper/monitorkey, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"tYg" = ( -/obj/structure/closet{ - name = "Evidence Closet 1" - }, -/obj/structure/secure_safe/directional/east, -/obj/effect/spawner/random/contraband/cannabis, -/turf/open/floor/iron/dark, -/area/station/security/evidence) "tYp" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/rd) @@ -60219,6 +60218,12 @@ /obj/machinery/telecomms/processor/preset_three, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"uqs" = ( +/obj/structure/closet/secure_closet/hop, +/obj/structure/sign/clock/directional/west, +/obj/structure/secure_safe/directional/north, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) "uqA" = ( /obj/effect/turf_decal/siding/thinplating/dark/corner, /obj/machinery/duct, @@ -60877,6 +60882,20 @@ }, /turf/open/floor/engine/hull, /area/station/solars/starboard/fore) +"uBi" = ( +/obj/structure/rack, +/obj/item/storage/briefcase{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/briefcase/secure, +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/courtroom) "uBo" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -61949,18 +61968,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/engine_smes) -"uQq" = ( -/obj/structure/table, -/obj/item/storage/fancy/cigarettes{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/storage/briefcase/secure{ - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/iron, -/area/station/security/office) "uQS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62156,13 +62163,6 @@ "uVo" = ( /turf/open/floor/carpet, /area/station/command/meeting_room) -"uVB" = ( -/obj/structure/table/glass, -/obj/item/storage/briefcase/secure, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "uVO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -99186,7 +99186,7 @@ aaa hFr nMu hFr -dDN +uBi abZ ycB jyA @@ -102592,7 +102592,7 @@ fXQ srY roB roB -pWa +kHR tga rnf xBD @@ -150871,7 +150871,7 @@ aBV aBV aBV wHT -mTX +uqs kcw ruV wHT @@ -151905,7 +151905,7 @@ umf qjW dCk iDR -kcb +tDR wHT omH jKZ @@ -155757,7 +155757,7 @@ uvu aCC ukE hhc -cDX +esf lPY eaT kiU @@ -156011,7 +156011,7 @@ aQO rup wzm rAh -nug +qgy eUy mgq nhV @@ -157511,7 +157511,7 @@ aaa aaa aaa rmB -hGG +pxf bWb toY wpM @@ -157522,7 +157522,7 @@ avl fBk myB vhl -uQq +asG vhl gnL lvm @@ -157803,9 +157803,9 @@ ltw pbx pyA ltw -tqS +rdm vjq -ekE +fhK ktl mjd mjI @@ -158838,7 +158838,7 @@ phl sSx xJH xEo -hKL +oMh ixO urP kOE @@ -159575,7 +159575,7 @@ aaa abM abM tFJ -tYg +qmC fsQ jil fsQ @@ -166592,7 +166592,7 @@ aOF wdj wao cHU -uVB +nXM wdj oGJ oGJ @@ -184809,7 +184809,7 @@ ebY aGn brm nSI -awY +hPQ vDI nSd rMB diff --git a/_maps/shuttles/emergency_hugcage.dmm b/_maps/shuttles/emergency_hugcage.dmm index 80211ed6092..fc474764401 100644 --- a/_maps/shuttles/emergency_hugcage.dmm +++ b/_maps/shuttles/emergency_hugcage.dmm @@ -31,7 +31,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "dz" = ( -/mob/living/simple_animal/parrot/natural{ +/mob/living/basic/parrot{ melee_damage_upper = 5 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 7dd4be59ba7..77c4e37bc03 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -702,7 +702,7 @@ "Ry" = ( /obj/structure/rack, /obj/item/storage/bag/money/vault, -/mob/living/simple_animal/parrot{ +/mob/living/basic/parrot{ faction = list("pirate"); name = "Pegwing" }, diff --git a/_maps/virtual_domains/pirates.dmm b/_maps/virtual_domains/pirates.dmm index 145b633bed9..e5cb091e409 100644 --- a/_maps/virtual_domains/pirates.dmm +++ b/_maps/virtual_domains/pirates.dmm @@ -1,43 +1,43 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ag" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/decal/cleanable/garbage, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"by" = ( -/obj/effect/turf_decal/weather/sand{ - dir = 5 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"bz" = ( -/obj/structure/flora/bush/grassy{ - pixel_y = 8 - }, -/obj/structure/flora/bush/lavendergrass{ - pixel_y = -10 - }, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"bP" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"cl" = ( -/obj/structure/flora/rock/style_3, +"af" = ( +/obj/structure/flora/rock/pile/style_2, /turf/open/water/beach, /area/virtual_domain/fullbright) -"ct" = ( -/obj/structure/closet/cabinet, -/obj/item/clothing/head/costume/pirate/armored, -/obj/item/clothing/suit/costume/pirate/captain/armored, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood/parquet, -/area/virtual_domain) -"cx" = ( -/turf/template_noop, -/area/virtual_domain/safehouse) -"cJ" = ( +"al" = ( +/obj/structure/flora/bush/sunny, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"bb" = ( +/obj/effect/turf_decal/weather/sand, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"bc" = ( +/turf/open/misc/beach/coast{ + dir = 10 + }, +/area/virtual_domain/fullbright) +"be" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/rock/pile, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"bI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/gun/energy/laser/musket{ + pixel_y = 7 + }, +/obj/item/gun/energy/laser/musket{ + pixel_y = 2 + }, +/obj/item/gun/energy/laser/musket{ + pixel_y = -3 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"cr" = ( /obj/item/stack/cannonball/shellball{ pixel_x = 13; pixel_y = 11 @@ -49,7 +49,349 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/virtual_domain/fullbright) -"cQ" = ( +"cX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/claymore/cutlass, +/obj/item/clothing/head/costume/pirate/bandana/armored{ + pixel_x = -9; + pixel_y = 7 + }, +/obj/structure/table/wood, +/obj/item/gun/energy/laser{ + pixel_y = -3 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"db" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"dc" = ( +/turf/open/misc/beach/coast/corner, +/area/virtual_domain/fullbright) +"dN" = ( +/obj/machinery/door/airlock/vault{ + color = "#825427"; + name = "Ye Olde Strong Door" + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"eO" = ( +/obj/structure/flora/rock/pile, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"eP" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/virtual_domain/fullbright) +"eS" = ( +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"fd" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"fh" = ( +/obj/structure/flora/bush/sparsegrass, +/obj/structure/flora/bush/lavendergrass, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"fk" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"fw" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"fR" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/virtual_domain/fullbright) +"gf" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 5 + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"gu" = ( +/obj/structure/flora/bush/stalky, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"gx" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"gB" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 9 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"gK" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/ferny, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"hb" = ( +/turf/closed/indestructible/binary, +/area/virtual_domain/fullbright) +"hn" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"hq" = ( +/obj/structure/closet/crate/grave, +/obj/structure/flora/grass/jungle/b, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"jp" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"jE" = ( +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"jH" = ( +/obj/structure/headpike/bone, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"jN" = ( +/obj/structure/flora/tree/jungle, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"lF" = ( +/obj/structure/table/wood, +/obj/item/melee/energy/sword/pirate{ + pixel_y = 10 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 4 + }, +/obj/item/lighter{ + pixel_x = 10; + pixel_y = -8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/blue, +/area/virtual_domain) +"lK" = ( +/obj/item/stack/cannonball{ + pixel_x = 7; + pixel_y = 8 + }, +/obj/item/stack/cannonball{ + pixel_x = 11; + pixel_y = -4 + }, +/obj/effect/turf_decal/weather/sand{ + dir = 1 + }, +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"mp" = ( +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"mR" = ( +/obj/machinery/smartfridge/drying_rack, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"nb" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 9 + }, +/obj/structure/fermenting_barrel{ + pixel_x = 6; + pixel_y = 11 + }, +/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"nr" = ( +/mob/living/basic/trooper/pirate/melee, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"nN" = ( +/obj/structure/flora/rock, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"oB" = ( +/obj/structure/flora/grass/jungle, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"oL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/bed/maint, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"oM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"pi" = ( +/obj/structure/flora/rock/style_3, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"pn" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"qk" = ( +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"qE" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/ordnance, +/turf/open/floor/carpet/blue, +/area/virtual_domain) +"qS" = ( +/obj/effect/decal/cleanable/ants, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"ri" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/trooper/pirate/ranged/space, +/turf/open/floor/carpet/blue, +/area/virtual_domain) +"rm" = ( +/obj/structure/closet/crate/goldcrate, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"rn" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/flashlight/flare/torch{ + pixel_y = 10; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = -16; + pixel_x = 12 + }, +/obj/machinery/recharger{ + pixel_y = 6; + pixel_x = -5 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"ru" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/bed/maint{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/item/toy/plush/beeplushie, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"sj" = ( +/obj/effect/mine/explosive/light, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"td" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/carpet/blue, +/area/virtual_domain) +"tw" = ( +/obj/structure/bookcase/random/adult, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"tH" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/head/costume/pirate/armored, +/obj/item/clothing/suit/costume/pirate/captain/armored, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"tQ" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/weather/sand{ + dir = 10 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"ub" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"uk" = ( +/obj/structure/flora/rock{ + pixel_x = 7 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"uG" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/weather/sand{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"uH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/wood, +/obj/item/flashlight/flare/torch{ + pixel_y = 10 + }, +/obj/item/flashlight/flare/torch{ + pixel_x = 8; + pixel_y = 6 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"vR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"wj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"wu" = ( /obj/structure/flora/grass/jungle/b{ pixel_x = -15; pixel_y = 9 @@ -60,61 +402,368 @@ }, /turf/open/misc/dirt/jungle, /area/virtual_domain/fullbright) -"dp" = ( -/turf/closed/wall/mineral/wood/nonmetal, -/area/virtual_domain/fullbright) -"dA" = ( -/obj/structure/bonfire/prelit, -/turf/open/misc/beach/sand, -/area/virtual_domain/fullbright) -"dQ" = ( -/obj/structure/flora/rock/style_4, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"eb" = ( -/obj/structure/flora/bush/sparsegrass, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"eD" = ( -/obj/structure/flora/coconuts{ - pixel_x = 9; - pixel_y = -14 - }, -/obj/structure/flora/tree/palm/style_2, -/turf/open/misc/beach/sand, -/area/virtual_domain/fullbright) -"eQ" = ( -/turf/open/floor/carpet/blue, -/area/virtual_domain) -"eW" = ( -/obj/effect/turf_decal/weather/sand{ - dir = 6 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"fx" = ( +"wH" = ( /obj/structure/fluff/beach_umbrella{ pixel_x = -7; pixel_y = -10 }, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"gk" = ( +"wP" = ( +/obj/structure/railing{ + color = "#4C3117"; + name = "wooden railing" + }, +/obj/effect/turf_decal/weather/sand{ + dir = 9 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"xg" = ( +/turf/template_noop, +/area/template_noop) +"xp" = ( +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"zc" = ( +/obj/item/gun/energy/laser/hellgun{ + pixel_y = 10 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"zj" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"zk" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/melee/sabre{ + pixel_y = 12; + pixel_x = -10 + }, +/obj/item/gun/energy/laser/retro, /obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"zR" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"zU" = ( +/obj/structure/flora/coconuts{ + pixel_x = 12 + }, +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"zW" = ( +/obj/structure/flora/bush/grassy{ + pixel_y = 8 + }, +/obj/structure/flora/bush/lavendergrass{ + pixel_y = -10 + }, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"AB" = ( +/obj/structure/headpike/bone{ + pixel_y = 24 + }, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"AF" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/rack{ + icon = 'icons/obj/fluff/general.dmi'; + icon_state = "minibar"; + name = "skeletal minibar" + }, +/obj/item/storage/bag/money/dutchmen{ + pixel_y = 13 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"AP" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Bu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/bed/maint{ + pixel_x = 2; + pixel_y = 13 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"BU" = ( +/turf/open/floor/carpet/blue, +/area/virtual_domain) +"BV" = ( +/obj/structure/bonfire/prelit, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"BX" = ( +/obj/structure/flora/bush/sunny/style_3{ + pixel_y = 22 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"Ci" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/virtual_domain/fullbright) +"Cu" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -8 + }, +/obj/structure/filingcabinet{ + pixel_x = 11 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"CL" = ( +/obj/structure/flora/rock/pile/jungle/large, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"Dd" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"DM" = ( +/turf/closed/mineral/random/jungle, +/area/virtual_domain/fullbright) +"Eb" = ( +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"EL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/trooper/pirate/melee/space, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"ER" = ( +/obj/effect/turf_decal/siding/wood, +/mob/living/basic/trooper/pirate/ranged, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"Fl" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/weather/sand, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"FP" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/jukebox, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"Gl" = ( +/obj/structure/flora/rock/pile/style_3, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"Gy" = ( +/obj/structure/flora/rock/style_2, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Hn" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/wall/mineral/wood/nonmetal, +/area/virtual_domain) +"HO" = ( +/obj/structure/table/wood, +/mob/living/basic/parrot{ + name = "pepper" + }, +/turf/open/floor/carpet/blue, +/area/virtual_domain) +"ID" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"IW" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Jf" = ( +/obj/structure/flora/bush/sparsegrass, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"Jq" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/bed/maint{ + pixel_x = -10; + pixel_y = 9 + }, +/obj/effect/decal/cleanable/wrapping, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"Jx" = ( +/obj/item/bedsheet/rainbow/double, +/obj/structure/bed/double, +/turf/open/floor/carpet/blue, +/area/virtual_domain) +"JK" = ( +/obj/structure/flora/bush/stalky{ + pixel_y = 13; + pixel_x = -8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"JX" = ( +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/virtual_domain/fullbright) +"KS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, /obj/effect/landmark/bitrunning/cache_spawn, /turf/open/floor/carpet/blue, /area/virtual_domain) -"gw" = ( +"KV" = ( +/obj/structure/flora/rock/pile/jungle/style_3{ + pixel_x = -15; + pixel_y = -4 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"LC" = ( +/mob/living/basic/trooper/pirate/melee, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"LK" = ( +/obj/structure/fermenting_barrel/gunpowder{ + pixel_x = -4; + pixel_y = 17 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"LP" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"Mf" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood_large" }, /area/virtual_domain/fullbright) -"ht" = ( -/obj/structure/bookcase/random/fiction, -/turf/open/floor/wood/parquet, +"MG" = ( +/obj/structure/barricade/sandbags, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"MP" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"NE" = ( +/obj/effect/mob_spawn/corpse/human/damaged, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"NN" = ( +/obj/structure/flora/bush/fullgrass, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"NP" = ( +/obj/effect/mapping_helpers/burnt_floor, +/mob/living/basic/trooper/pirate/ranged, +/obj/structure/chair/wood, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"NU" = ( +/obj/structure/flora/grass/jungle/b/style_random{ + pixel_x = -13; + pixel_y = 18 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"Oi" = ( +/obj/effect/mob_spawn/corpse/human/pirate, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"Ov" = ( +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/virtual_domain/fullbright) +"Ox" = ( +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/blue, /area/virtual_domain) -"hH" = ( +"Oz" = ( +/obj/structure/flora/rock/pile/jungle/style_2, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"OD" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 6 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"OW" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Qc" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"QF" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"QG" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"QN" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/weather/sand{ + dir = 6 + }, +/obj/item/binoculars{ + pixel_x = -1; + pixel_y = 1 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) +"QU" = ( +/obj/effect/mob_spawn/corpse/human/pirate/melee, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"QX" = ( /obj/item/clothing/suit/armor/militia{ pixel_x = -5; pixel_y = 12 @@ -145,198 +794,7 @@ /obj/structure/closet/cabinet, /turf/open/floor/wood, /area/virtual_domain/fullbright) -"hM" = ( -/obj/structure/closet/crate/goldcrate, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"hW" = ( -/obj/structure/chair/comfy/carp{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/carpet/blue, -/area/virtual_domain) -"iM" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt/dust, -/mob/living/basic/trooper/pirate/ranged/space, -/turf/open/floor/carpet/blue, -/area/virtual_domain) -"iO" = ( -/obj/effect/turf_decal/weather/sand{ - dir = 4 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"jl" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/flashlight/flare/torch{ - pixel_y = 10; - pixel_x = 7 - }, -/obj/item/reagent_containers/cup/bucket/wooden{ - pixel_y = -16; - pixel_x = 12 - }, -/obj/machinery/recharger{ - pixel_y = 6; - pixel_x = -5 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"jz" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"jB" = ( -/obj/effect/turf_decal/weather/sand{ - dir = 4 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/jukebox, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"jC" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/item/reagent_containers/cup/glass/bottle/rum{ - desc = "Rum with ghostly properties that can help the drinker enter the spirit realm. It has fermented under the sea of space for ages."; - name = "Ghost Pirate Rum"; - pixel_x = -4; - pixel_y = 12 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = -7; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = 3; - pixel_y = 7 - }, -/turf/open/floor/carpet/blue, -/area/virtual_domain) -"jQ" = ( -/obj/item/gun/energy/laser/hellgun{ - pixel_y = 10 - }, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"kg" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"kl" = ( -/obj/structure/cannon, -/obj/effect/turf_decal/siding/wood, -/obj/effect/decal/cleanable/ash/large{ - pixel_y = -5; - pixel_x = 8 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"lC" = ( -/obj/item/stack/cannonball{ - pixel_x = 7; - pixel_y = 8 - }, -/obj/item/stack/cannonball{ - pixel_x = 11; - pixel_y = -4 - }, -/obj/effect/turf_decal/weather/sand{ - dir = 1 - }, -/obj/effect/decal/cleanable/oil/streak, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"me" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"mw" = ( -/obj/structure/flora/grass/jungle/b/style_random{ - pixel_x = -13; - pixel_y = 18 - }, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"mP" = ( -/obj/structure/flora/bush/fullgrass, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"nz" = ( -/obj/effect/mob_spawn/corpse/human/pirate, -/turf/open/misc/beach/coast{ - dir = 8 - }, -/area/virtual_domain/fullbright) -"nQ" = ( -/obj/machinery/loot_locator, -/turf/open/floor/carpet/blue, -/area/virtual_domain) -"nS" = ( -/obj/structure/flora/rock/pile/jungle/large, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"nX" = ( -/obj/effect/decal/cleanable/dirt/dust, -/mob/living/basic/trooper/pirate/melee/space, -/turf/open/floor/wood/parquet, -/area/virtual_domain) -"oo" = ( -/obj/machinery/smartfridge/drying_rack, -/turf/open/misc/beach/sand, -/area/virtual_domain/fullbright) -"oU" = ( -/turf/open/misc/beach/coast{ - dir = 10 - }, -/area/virtual_domain/fullbright) -"pq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"px" = ( -/obj/structure/headpike/bone{ - pixel_y = 24 - }, -/turf/open/misc/beach/coast, -/area/virtual_domain/fullbright) -"pP" = ( -/turf/open/misc/beach/coast, -/area/virtual_domain/fullbright) -"pU" = ( -/obj/effect/mob_spawn/corpse/human/pirate, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"qj" = ( -/obj/structure/barricade/wooden, -/turf/open/misc/beach/sand, -/area/virtual_domain/fullbright) -"qm" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/melee/sabre{ - pixel_y = 12; - pixel_x = -10 - }, -/obj/item/gun/energy/laser/retro, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"qx" = ( +"RJ" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 }, @@ -345,97 +803,85 @@ /mob/living/basic/trooper/pirate/ranged, /turf/open/floor/wood, /area/virtual_domain/fullbright) -"qN" = ( -/obj/structure/flora/bush/sunny/style_3{ - pixel_y = 22 +"RO" = ( +/obj/structure/flora/coconuts{ + pixel_x = 9; + pixel_y = -14 }, -/turf/open/misc/dirt/jungle, +/obj/structure/flora/tree/palm/style_2, +/turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"qQ" = ( -/turf/closed/indestructible/binary, +"Sc" = ( +/obj/structure/flora/bush/jungle, +/turf/open/misc/grass, /area/virtual_domain/fullbright) -"qX" = ( +"SD" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/weather/sand{ + dir = 10 + }, /obj/effect/turf_decal/weather/sand{ dir = 9 }, -/obj/structure/fermenting_barrel{ - pixel_x = 6; - pixel_y = 11 +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"SK" = ( +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"ST" = ( +/obj/structure/bed/maint{ + pixel_x = -5; + pixel_y = 9 + }, +/obj/effect/turf_decal/weather/sand{ + dir = 6 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"Ta" = ( +/obj/structure/flora/bush/flowers_pp, +/turf/open/misc/grass, +/area/virtual_domain/fullbright) +"Th" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 10 }, -/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton, /turf/open/floor/wood{ icon_state = "wood_large" }, /area/virtual_domain/fullbright) -"sn" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/ordnance, -/turf/open/floor/carpet/blue, +"To" = ( +/obj/structure/bookcase/random/fiction, +/turf/open/floor/wood/parquet, /area/virtual_domain) -"so" = ( +"Ul" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/virtual_domain) +"Uw" = ( +/obj/structure/cannon{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"Vx" = ( +/obj/structure/flora/rock/style_4, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"VE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"VG" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/carpet/blue, /area/virtual_domain) -"th" = ( -/obj/effect/turf_decal/weather/sand, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"tk" = ( -/obj/structure/flora/bush/flowers_pp, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"to" = ( -/mob/living/basic/trooper/pirate/melee, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"ub" = ( -/turf/template_noop, -/area/virtual_domain/fullbright) -"uw" = ( -/obj/structure/barricade/sandbags, -/obj/effect/turf_decal/weather/sand{ - dir = 4 - }, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"uM" = ( -/obj/structure/flora/bush/stalky{ - pixel_y = 13; - pixel_x = -8 - }, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"uT" = ( -/obj/structure/closet/crate/grave, -/obj/structure/flora/grass/jungle/b, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"wb" = ( -/obj/structure/flora/rock, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"we" = ( -/obj/effect/mine/explosive/light, -/turf/open/misc/beach/sand, -/area/virtual_domain/fullbright) -"xc" = ( -/turf/open/misc/beach/coast{ - dir = 4 - }, -/area/virtual_domain/fullbright) -"xg" = ( -/turf/template_noop, -/area/template_noop) -"xm" = ( -/obj/structure/barricade/wooden/crude, -/turf/closed/wall/mineral/wood/nonmetal, -/area/virtual_domain/fullbright) -"xB" = ( +"Wu" = ( /obj/structure/fermenting_barrel/gunpowder{ pixel_x = -4; pixel_y = 17 @@ -456,228 +902,65 @@ }, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"xC" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/obj/effect/turf_decal/weather/dirt, -/turf/open/water/beach, +"Wx" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, /area/virtual_domain/fullbright) -"xI" = ( -/obj/structure/flora/rock/pile/style_2, -/turf/open/water/beach, +"WW" = ( +/turf/template_noop, /area/virtual_domain/fullbright) -"yc" = ( -/obj/effect/turf_decal/weather/dirt, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"ye" = ( -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"yi" = ( -/mob/living/basic/trooper/pirate/melee, -/turf/open/misc/beach/sand, -/area/virtual_domain/fullbright) -"yq" = ( -/obj/structure/barricade/sandbags, -/turf/open/misc/beach/sand, -/area/virtual_domain/fullbright) -"yw" = ( -/obj/effect/mapping_helpers/burnt_floor, -/mob/living/basic/trooper/pirate/ranged, -/obj/structure/chair/wood, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"yA" = ( -/obj/item/bedsheet/rainbow/double, -/obj/structure/bed/double, -/turf/open/floor/carpet/blue, -/area/virtual_domain) -"zf" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/ferny, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"zg" = ( -/obj/structure/flora/rock/pile/style_3, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"zR" = ( -/obj/effect/baseturf_helper/virtual_domain, +"Xn" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, /turf/template_noop, /area/virtual_domain/safehouse) -"Ax" = ( -/obj/effect/turf_decal/weather/dirt, -/obj/effect/turf_decal/weather/dirt, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"AU" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"BC" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"BL" = ( -/obj/effect/baseturf_helper/virtual_domain, +"XP" = ( +/obj/structure/barricade/wooden/crude, /turf/closed/wall/mineral/wood/nonmetal, -/area/virtual_domain) -"BO" = ( -/obj/structure/bookcase/random/adult, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/wood/parquet, -/area/virtual_domain) -"Cc" = ( -/obj/structure/flora/tree/palm, -/turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"Ct" = ( -/turf/open/misc/beach/coast/corner, -/area/virtual_domain/fullbright) -"Dm" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table/wood, -/obj/item/flashlight/flare/torch{ - pixel_y = 10 - }, -/obj/item/flashlight/flare/torch{ - pixel_x = 8; - pixel_y = 6 - }, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"DJ" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/bed/maint{ - pixel_x = -10; - pixel_y = 9 - }, -/obj/effect/decal/cleanable/wrapping, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"DL" = ( -/obj/structure/flora/bush/sunny, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"ED" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/weather/sand{ - dir = 10 - }, -/obj/effect/turf_decal/weather/sand{ - dir = 9 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"EZ" = ( -/obj/effect/turf_decal/weather/sand{ - dir = 9 - }, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"FG" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/claymore/cutlass, -/obj/item/clothing/head/costume/pirate/bandana/armored{ - pixel_x = -9; - pixel_y = 7 - }, -/obj/structure/table/wood, -/obj/item/gun/energy/laser{ - pixel_y = -3 - }, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"FT" = ( -/turf/closed/mineral/random/jungle, -/area/virtual_domain/fullbright) -"GF" = ( -/obj/effect/turf_decal/weather/dirt, -/obj/structure/flora/rock/pile, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"GG" = ( -/obj/structure/barricade/sandbags, -/obj/effect/turf_decal/weather/sand{ - dir = 6 - }, -/obj/item/binoculars{ - pixel_x = -1; - pixel_y = 1 - }, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"Hp" = ( -/obj/effect/turf_decal/siding/wood, -/mob/living/basic/trooper/pirate/ranged, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"HY" = ( +"XW" = ( +/obj/effect/mob_spawn/corpse/human/pirate, /turf/open/misc/beach/coast{ - dir = 6 + dir = 8 }, /area/virtual_domain/fullbright) -"It" = ( -/obj/structure/flora/bush/sparsegrass, -/obj/structure/flora/bush/lavendergrass, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"Iz" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/bed/maint, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"IF" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 4 - }, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"IG" = ( +"Yf" = ( +/obj/machinery/loot_locator, +/turf/open/floor/carpet/blue, +/area/virtual_domain) +"Yr" = ( /obj/effect/mob_spawn/corpse/human/pirate, /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"IM" = ( -/obj/effect/turf_decal/weather/sand{ - dir = 10 - }, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"Jo" = ( -/obj/effect/landmark/bitrunning/cache_spawn, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"Jr" = ( -/obj/structure/headpike/bone, -/turf/open/misc/beach/coast, -/area/virtual_domain/fullbright) -"Jv" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/mapping_helpers/broken_floor, +"Yy" = ( /turf/open/floor/wood, /area/virtual_domain/fullbright) -"JT" = ( -/obj/effect/decal/cleanable/ants, -/turf/open/misc/grass, +"YJ" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/reagent_containers/cup/glass/bottle/rum{ + desc = "Rum with ghostly properties that can help the drinker enter the spirit realm. It has fermented under the sea of space for ages."; + name = "Ghost Pirate Rum"; + pixel_x = -4; + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = 3; + pixel_y = 7 + }, +/turf/open/floor/carpet/blue, +/area/virtual_domain) +"Za" = ( +/obj/structure/barricade/wooden, +/turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"Kb" = ( +"Zq" = ( /obj/structure/railing{ color = "#4C3117"; name = "wooden railing" @@ -688,298 +971,15 @@ }, /turf/open/floor/wood, /area/virtual_domain/fullbright) -"Kl" = ( -/turf/open/misc/beach/sand, -/area/virtual_domain/fullbright) -"Kw" = ( -/obj/machinery/door/airlock/vault{ - color = "#825427"; - name = "Ye Olde Strong Door" - }, -/turf/open/floor/wood/parquet, -/area/virtual_domain) -"KC" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 5 - }, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"KG" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/gun/energy/laser/musket{ - pixel_y = 7 - }, -/obj/item/gun/energy/laser/musket{ - pixel_y = 2 - }, -/obj/item/gun/energy/laser/musket{ - pixel_y = -3 +"Zt" = ( +/obj/structure/cannon, +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/ash/large{ + pixel_y = -5; + pixel_x = 8 }, /turf/open/floor/wood, /area/virtual_domain/fullbright) -"KQ" = ( -/obj/structure/flora/rock/style_2, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"Ld" = ( -/obj/structure/flora/rock/pile, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"Ma" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"Mi" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"MW" = ( -/obj/effect/turf_decal/weather/sand{ - dir = 5 - }, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"Nh" = ( -/obj/structure/flora/rock/pile/jungle/style_3{ - pixel_x = -15; - pixel_y = -4 - }, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"Nk" = ( -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"Nz" = ( -/obj/structure/flora/bush/jungle, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"NI" = ( -/obj/structure/railing{ - color = "#4C3117"; - name = "wooden railing" - }, -/obj/effect/turf_decal/weather/sand{ - dir = 9 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"ON" = ( -/obj/item/kirbyplants/organic/plant21{ - pixel_x = -8 - }, -/obj/structure/filingcabinet{ - pixel_x = 11 - }, -/turf/open/floor/wood/parquet, -/area/virtual_domain) -"OP" = ( -/obj/structure/flora/bush/stalky, -/turf/open/misc/beach/coast, -/area/virtual_domain/fullbright) -"Pq" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/bed/maint{ - pixel_x = 2; - pixel_y = 13 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"Pz" = ( -/obj/structure/table/wood, -/mob/living/simple_animal/parrot{ - name = "pepper" - }, -/turf/open/floor/carpet/blue, -/area/virtual_domain) -"PQ" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"Qb" = ( -/obj/structure/flora/rock{ - pixel_x = 7 - }, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"Rr" = ( -/obj/structure/bed/maint{ - pixel_x = -5; - pixel_y = 9 - }, -/obj/effect/turf_decal/weather/sand{ - dir = 6 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"RR" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"Sm" = ( -/obj/structure/flora/tree/jungle, -/obj/structure/flora/bush/fullgrass/style_random, -/turf/open/misc/grass, -/area/virtual_domain/fullbright) -"St" = ( -/obj/structure/table/wood, -/obj/item/melee/energy/sword/pirate{ - pixel_y = 10 - }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = 4 - }, -/obj/item/lighter{ - pixel_x = 10; - pixel_y = -8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/carpet/blue, -/area/virtual_domain) -"Tp" = ( -/turf/open/misc/beach/coast/corner{ - dir = 1 - }, -/area/virtual_domain/fullbright) -"Tt" = ( -/obj/structure/cannon{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"TO" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/landmark/bitrunning/cache_spawn, -/turf/open/floor/carpet/blue, -/area/virtual_domain) -"TP" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 4 - }, -/turf/open/misc/beach/coast{ - dir = 6 - }, -/area/virtual_domain/fullbright) -"TQ" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/bed/maint{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/item/toy/plush/beeplushie, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"Uy" = ( -/obj/effect/baseturf_helper/virtual_domain, -/turf/closed/indestructible/binary, -/area/virtual_domain/fullbright) -"UE" = ( -/obj/structure/barricade/sandbags, -/obj/effect/turf_decal/weather/sand{ - dir = 10 - }, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"Vg" = ( -/obj/effect/mob_spawn/corpse/human/pirate/melee, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"Vk" = ( -/obj/structure/barricade/sandbags, -/obj/effect/turf_decal/weather/sand, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) -"Vw" = ( -/turf/closed/wall/mineral/wood/nonmetal, -/area/virtual_domain) -"VC" = ( -/obj/effect/mob_spawn/corpse/human/damaged, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"VF" = ( -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"VX" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, -/obj/item/storage/bag/money/dutchmen{ - pixel_y = 13 - }, -/turf/open/floor/wood/parquet, -/area/virtual_domain) -"WM" = ( -/obj/structure/flora/rock/pile/jungle/style_2, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"WP" = ( -/turf/open/floor/wood/parquet, -/area/virtual_domain) -"Xn" = ( -/obj/effect/landmark/bitrunning/safehouse_spawn, -/turf/template_noop, -/area/virtual_domain/safehouse) -"XG" = ( -/obj/structure/fermenting_barrel/gunpowder{ - pixel_x = -4; - pixel_y = 17 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"Yj" = ( -/obj/effect/landmark/bitrunning/cache_spawn, -/turf/open/misc/beach/sand, -/area/virtual_domain/fullbright) -"Yk" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood/parquet, -/area/virtual_domain) -"Yq" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"Zk" = ( -/obj/structure/flora/coconuts{ - pixel_x = 12 - }, -/obj/structure/flora/tree/palm, -/turf/open/misc/beach/sand, -/area/virtual_domain/fullbright) -"ZZ" = ( -/obj/structure/flora/grass/jungle, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) (1,1,1) = {" xg @@ -996,14 +996,14 @@ xg xg xg xg -qQ -qQ -qQ -qQ -qQ -qQ -qQ -qQ +hb +hb +hb +hb +hb +hb +hb +hb xg xg xg @@ -1039,17 +1039,17 @@ xg xg xg xg -qQ -qQ -FT -FT -FT -FT -FT -FT -qQ -qQ -qQ +hb +hb +DM +DM +DM +DM +DM +DM +hb +hb +hb xg xg xg @@ -1081,19 +1081,19 @@ xg xg xg xg -qQ -qQ -qQ -FT -FT -FT -FT -FT -FT -FT -FT -FT -qQ +hb +hb +hb +DM +DM +DM +DM +DM +DM +DM +DM +DM +hb xg xg xg @@ -1124,20 +1124,20 @@ xg xg xg xg -qQ -qQ -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -qQ +hb +hb +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +hb xg xg xg @@ -1168,20 +1168,20 @@ xg xg xg xg -qQ -FT -FT -FT -FT -FT -FT -zf -eb -we -FT -FT -FT -qQ +hb +DM +DM +DM +DM +DM +DM +gK +Jf +sj +DM +DM +DM +hb xg xg xg @@ -1210,28 +1210,28 @@ xg xg xg xg -qQ -qQ -qQ -FT -FT -FT -Sm -Ma -bz -JT -Kl -Kl -Kl -FT -FT -qQ -qQ -qQ -qQ -qQ -qQ -qQ +hb +hb +hb +DM +DM +DM +jN +fk +zW +qS +eS +eS +eS +DM +DM +hb +hb +hb +hb +hb +hb +hb xg xg xg @@ -1251,31 +1251,31 @@ xg xg xg xg -qQ -qQ -qQ -qQ -FT -FT -FT -FT -It -tk -DL -Kl -Kl -Kl -Cc -Kl -IG -FT -qQ -qQ -FT -FT -FT -FT -qQ +hb +hb +hb +hb +DM +DM +DM +DM +fh +Ta +al +eS +eS +eS +Eb +eS +Yr +DM +hb +hb +DM +DM +DM +DM +hb xg xg xg @@ -1294,32 +1294,32 @@ xg xg xg xg -qQ -qQ -FT -FT -FT -FT -FT -Nz -bP -mP -to -Kl -Kl -we -Kl -Kl -Kl -Kl -we -qQ -qQ -FT -FT -FT -FT -qQ +hb +hb +DM +DM +DM +DM +DM +Sc +pn +NN +LC +eS +eS +sj +eS +eS +eS +eS +sj +hb +hb +DM +DM +DM +DM +hb xg xg xg @@ -1337,36 +1337,36 @@ xg xg xg xg -qQ -qQ -FT -dp -dp -dp -dp -xB -yq -yq -Kl -Kl -Ct -xc -xc -xc -xc -xc -xc -xc -HY -VF -VF -VF -VF -VF -qQ -qQ -qQ -qQ +hb +hb +DM +Ci +Ci +Ci +Ci +Wu +MG +MG +eS +eS +dc +mp +mp +mp +mp +mp +mp +mp +Ov +xp +xp +xp +xp +xp +hb +hb +hb +hb xg xg xg @@ -1381,38 +1381,38 @@ xg xg xg xg -qQ -FT -dp -dp -Pq -qx -Mi -th -Kl -yq -Kl -IG -OP -uM -VF -VF -VF -VF -VF -VF -VF -VF -VC -VF -VF -VF -VF -VF -dp -qQ -qQ -qQ +hb +DM +Ci +Ci +Bu +RJ +wj +bb +eS +MG +eS +Yr +gu +JK +xp +xp +xp +xp +xp +xp +xp +xp +NE +xp +xp +xp +xp +xp +Ci +hb +hb +hb xg xg xg @@ -1424,705 +1424,705 @@ xg (11,1,1) = {" xg xg -qQ -qQ -FT -dp -TQ -Iz -DJ -ag -eW -Kl -Kl -ED -Kl -Jr -VF -VF -VF -VF -VF -VF -VF -VF -VF -KQ -VF -VF -VF -VF -VF -dp -KG -pq -qQ -qQ -qQ -qQ -qQ -qQ -qQ -Uy +hb +hb +DM +Ci +ru +oL +Jq +zj +OD +eS +eS +SD +eS +jH +xp +xp +xp +xp +xp +xp +xp +xp +xp +Gy +xp +xp +xp +xp +xp +Ci +bI +VE +hb +hb +hb +hb +hb +hb +hb +fR "} (12,1,1) = {" xg xg -qQ -FT -FT -dp -Yj -MW -iO -Rr -qj -Kl -NI -xm -Ct -HY -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -wb -dp -jl -pq -BC -cx -cx -cx -cx -cx +hb +DM +DM +Ci +jp +gf +MP +ST +Za +eS +wP +XP +dc +Ov +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +nN +Ci +rn +VE +fw +ub +ub +ub +ub +ub Xn -qQ +hb "} (13,1,1) = {" -qQ -qQ -qQ -FT -FT -FT -qj -Kl -Kl -Kl -Kl -Kl -lC -kl -pP -VF -VF -VF -VF -VF -VF -Vg -VF -VF -VF -VF -VF -VF -VF -VF -cl -dp -hH -Nk -qm -cx -cx -cx -cx -cx -cx -qQ +hb +hb +hb +DM +DM +DM +Za +eS +eS +eS +eS +eS +lK +Zt +SK +xp +xp +xp +xp +xp +xp +QU +xp +xp +xp +xp +xp +xp +xp +xp +pi +Ci +QX +Yy +zk +ub +ub +ub +ub +ub +ub +hb "} (14,1,1) = {" -qQ -Vw -Vw -Vw -Vw -Vw -BL -oo -Kl -Kl -Kl -Kl -Kb -dp -px -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -dp -dp -Nk -Jv -cx -cx -cx -cx -cx -cx -qQ +hb +Ul +Ul +Ul +Ul +Ul +Hn +mR +eS +eS +eS +eS +Zq +Ci +AB +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +Ci +Ci +Yy +Dd +ub +ub +ub +ub +ub +ub +hb "} (15,1,1) = {" -qQ -Vw -BO -ht -VX -ct -Vw -yi -Kl -dA -Kl -Kl -by -Hp -pP -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -me -cx -cx -cx -cx -cx -cx -qQ +hb +Ul +tw +To +AF +tH +Ul +nr +eS +BV +eS +eS +LP +ER +SK +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +Wx +ub +ub +ub +ub +ub +ub +hb "} (16,1,1) = {" -qQ -Vw -ON -WP -nX -Yk -Kw -Kl -Kl -Kl -Kl -Kl -Kl -dp -px -VF -VF -VF -VF -Qb -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -cx -cx -cx -cx -cx -cx -qQ +hb +Ul +Cu +jE +EL +AP +dN +eS +eS +eS +eS +eS +eS +Ci +AB +xp +xp +xp +xp +uk +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +ub +ub +ub +ub +ub +ub +hb "} (17,1,1) = {" -qQ -Vw -jC -iM -so -TO -Vw -Kl -Kl -EZ -IM -Kl -Kl -Kl -pP -VF -VF -VF -VF -cl -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -cx -cx -cx -cx -cx -cx -qQ +hb +Ul +YJ +ri +VG +KS +Ul +eS +eS +gB +Th +eS +eS +eS +SK +xp +xp +xp +xp +pi +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +ub +ub +ub +ub +ub +ub +hb "} (18,1,1) = {" -qQ -Vw -sn -hW -eQ -gk -Vw -dp -qX -gw -jz -UE -Kl -Zk -pP -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -me -VF -cx -cx -cx -cx -cx +hb +Ul +qE +Ox +BU +td +Ul +Ci +nb +Mf +gx +tQ +eS +zU +SK +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +Wx +xp +ub +ub +ub +ub +ub zR -qQ +hb "} (19,1,1) = {" -qQ -Vw -St -Pz -nQ -yA -Vw -dp -Dm -jz -jz -Vk -Kl -Kl -pP -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -dp -BC -VF -VF -VF -VF -VF -VF -qQ -qQ +hb +Ul +lF +HO +Yf +Jx +Ul +Ci +uH +gx +gx +Fl +eS +eS +SK +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +Ci +fw +xp +xp +xp +xp +xp +xp +hb +hb "} (20,1,1) = {" -qQ -Vw -Vw -Vw -Vw -Vw -Vw -xm -FG -RR -yw -Vk -Kl -Kl -pP -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -Tt -cJ -Yq -VF -VF -VF -VF -VF -qQ +hb +Ul +Ul +Ul +Ul +Ul +Ul +XP +cX +Qc +NP +Fl +eS +eS +SK +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +Uw +cr +vR +xp +xp +xp +xp +xp +hb xg "} (21,1,1) = {" -qQ -qQ -qQ -FT -FT -Kl -Kl -dp -dp -jB -uw -GG -Kl -Kl -pP -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -xI -dp -XG -BC -VF -VF -VF -VF -VF -qQ +hb +hb +hb +DM +DM +eS +eS +Ci +Ci +FP +uG +QN +eS +eS +SK +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +af +Ci +LK +fw +xp +xp +xp +xp +xp +hb xg "} (22,1,1) = {" xg xg -qQ -FT -FT -fx -Kl -Kl -dp -dp -Kl -Kl -Kl -Kl -pP -VF -VF -VF -VF -VF -VF -dQ -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -kg -pq -Ld -VF -VF -VF -VF -VF -qQ +hb +DM +DM +wH +eS +eS +Ci +Ci +eS +eS +eS +eS +SK +xp +xp +xp +xp +xp +xp +Vx +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +oM +VE +eO +xp +xp +xp +xp +xp +hb xg "} (23,1,1) = {" xg xg -qQ -FT -FT -FT -Kl -Kl -Kl -Kl -Kl -Kl -Kl -Kl -Tp -oU -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -FT -FT -qQ +hb +DM +DM +DM +eS +eS +eS +eS +eS +eS +eS +eS +JX +bc +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +DM +DM +hb xg "} (24,1,1) = {" xg xg -qQ -FT -FT -FT -FT -dp -Kl -eD -Kl -Kl -Kl -Kl -Kl -Tp -nz -oU -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -FT -FT -qQ +hb +DM +DM +DM +DM +Ci +eS +RO +eS +eS +eS +eS +eS +JX +XW +bc +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +DM +DM +hb xg "} (25,1,1) = {" xg xg -qQ -qQ -FT -FT -FT -FT -Kl -Kl -Kl -Kl -Kl -Kl -yi -Kl -Kl -pP -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -FT -FT -FT -qQ +hb +hb +DM +DM +DM +DM +eS +eS +eS +eS +eS +eS +nr +eS +eS +SK +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +DM +DM +DM +hb xg "} (26,1,1) = {" xg xg xg -qQ -qQ -qQ -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -TP -VF -FT -FT -qQ -qQ -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -qQ -FT -FT -FT -FT -qQ +hb +hb +hb +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +eP +xp +DM +DM +hb +hb +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +hb +DM +DM +DM +DM +hb xg "} (27,1,1) = {" @@ -2130,43 +2130,43 @@ xg xg xg xg -ub -qQ -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -PQ -AU -FT -FT -FT -qQ -qQ -VF -VF -VF -VF -VF -VF -VF -VF -VF -VF -qQ -qQ -FT -FT -FT -qQ -qQ +WW +hb +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +fd +OW +DM +DM +DM +hb +hb +xp +xp +xp +xp +xp +xp +xp +xp +xp +xp +hb +hb +DM +DM +DM +hb +hb xg "} (28,1,1) = {" @@ -2175,41 +2175,41 @@ xg xg xg xg -qQ -qQ -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -Nh -AU -FT -FT -FT -FT -qQ -qQ -qQ -qQ -VF -VF -VF -VF -VF -VF -qQ -qQ -qQ -qQ -qQ -qQ -qQ +hb +hb +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +KV +OW +DM +DM +DM +DM +hb +hb +hb +hb +xp +xp +xp +xp +xp +xp +hb +hb +hb +hb +hb +hb +hb xg xg "} @@ -2220,34 +2220,34 @@ xg xg xg xg -qQ -qQ -qQ -qQ -qQ -qQ -FT -FT -FT -FT -FT -ye -KC -VF -FT -FT -FT -FT -FT -FT -qQ -qQ -qQ -qQ -qQ -qQ -qQ -qQ +hb +hb +hb +hb +hb +hb +DM +DM +DM +DM +DM +qk +IW +xp +DM +DM +DM +DM +DM +DM +hb +hb +hb +hb +hb +hb +hb +hb xg xg xg @@ -2268,25 +2268,25 @@ xg xg xg xg -qQ -qQ -FT -FT -FT -FT -FT -zg -ye -KC -IF -VF -FT -FT -FT -FT -FT -qQ -qQ +hb +hb +DM +DM +DM +DM +DM +Gl +qk +IW +hn +xp +DM +DM +DM +DM +DM +hb +hb xg xg xg @@ -2313,25 +2313,25 @@ xg xg xg xg -qQ -qQ -FT -FT -FT -FT -FT -ye -ye -pU -AU -VF -GF -WM -FT -FT -FT -qQ -qQ +hb +hb +DM +DM +DM +DM +DM +qk +qk +Oi +OW +xp +be +Oz +DM +DM +DM +hb +hb xg xg xg @@ -2358,24 +2358,24 @@ xg xg xg xg -qQ -qQ -FT -FT -FT -FT -FT -ye -nS -KC -VF -Ax -ye -hM -FT -FT -FT -qQ +hb +hb +DM +DM +DM +DM +DM +qk +CL +IW +xp +QG +qk +rm +DM +DM +DM +hb xg xg xg @@ -2403,23 +2403,23 @@ xg xg xg xg -qQ -qQ -FT -FT -FT -FT -ZZ -ye -cQ -KC -yc -qN -ye -hM -FT -FT -qQ +hb +hb +DM +DM +DM +DM +oB +qk +wu +IW +QF +BX +qk +rm +DM +DM +hb xg xg xg @@ -2448,22 +2448,22 @@ xg xg xg xg -qQ -qQ -FT -FT -FT -FT -ye -ye -mw -xC -uT -jQ -Jo -FT -FT -qQ +hb +hb +DM +DM +DM +DM +qk +qk +NU +db +hq +zc +ID +DM +DM +hb xg xg xg @@ -2493,21 +2493,21 @@ xg xg xg xg -qQ -qQ -qQ -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -qQ +hb +hb +hb +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +hb xg xg xg @@ -2539,19 +2539,19 @@ xg xg xg xg -qQ -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -FT -qQ +hb +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +DM +hb xg xg xg @@ -2583,19 +2583,19 @@ xg xg xg xg -qQ -qQ -qQ -qQ -qQ -qQ -qQ -qQ -qQ -qQ -qQ -qQ -qQ +hb +hb +hb +hb +hb +hb +hb +hb +hb +hb +hb +hb +hb xg xg xg diff --git a/code/__DEFINES/ai/pets.dm b/code/__DEFINES/ai/pets.dm index b3ad67ecc06..e41c9ac0c3f 100644 --- a/code/__DEFINES/ai/pets.dm +++ b/code/__DEFINES/ai/pets.dm @@ -27,3 +27,27 @@ #define BB_FIND_MOM_TYPES "BB_find_mom_types" ///list of types of mobs we must ignore #define BB_IGNORE_MOM_TYPES "BB_ignore_mom_types" + +/// The current string that this parrot will repeat back to someone +#define BB_PARROT_REPEAT_STRING "BB_parrot_repeat_string" +/// The odds that this parrot will repeat back a string +#define BB_PARROT_REPEAT_PROBABILITY "BB_parrot_repeat_probability" +/// The odds that this parrot will choose another string to repeat +#define BB_PARROT_PHRASE_CHANGE_PROBABILITY "BB_parrot_phrase_change_probability" +/// A copy of the string buffer that we end the shift with. DO NOT ACCESS THIS DIRECTLY - YOU SHOULD USE THE COMPONENT IN MOST CASES +#define BB_EXPORTABLE_STRING_BUFFER_LIST "BB_parrot_repeat_string_buffer" +/// The types of perches we desire to use +#define BB_PARROT_PERCH_TYPES "BB_parrot_perch_types" +/// key that holds our perch target +#define BB_PERCH_TARGET "perch_target" +/// key that holds our theft item target +#define BB_HOARD_ITEM_TARGET "hoard_item_target" +/// key that holds the mob we will steal from +#define BB_THEFT_VICTIM "theft_victim" +/// key that holds the turf we will be hauling stolen items to +#define BB_HOARD_LOCATION "hoard_location" +/// key that holds the minimum range we must be from the hoard spot +#define BB_HOARD_LOCATION_RANGE "hoard_location_range" +/// key that holds items we arent interested in hoarding +#define BB_IGNORE_ITEMS "ignore_items" + diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm index d26dd4e8c86..b836c811667 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -47,13 +47,17 @@ #define COMSIG_MOVABLE_THROW_LANDED "movable_throw_landed" ///from base of atom/movable/on_changed_z_level(): (turf/old_turf, turf/new_turf, same_z_layer) #define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" +///called before hearing a message from atom/movable/Hear(): +#define COMSIG_MOVABLE_PRE_HEAR "movable_pre_hear" + ///cancel hearing the message because we're doing something else presumably + #define COMSIG_MOVABLE_CANCEL_HEARING (1<<0) ///from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)) #define COMSIG_MOVABLE_HEAR "movable_hear" - //#define HEARING_MESSAGE 1 - (I'm pretty sure this is never really used and can be gutted) + #define HEARING_MESSAGE 1 #define HEARING_SPEAKER 2 #define HEARING_LANGUAGE 3 #define HEARING_RAW_MESSAGE 4 - //#define HEARING_RADIO_FREQ 5 + #define HEARING_RADIO_FREQ 5 #define HEARING_SPANS 6 #define HEARING_MESSAGE_MODE 7 #define HEARING_RANGE 8 diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm index 85630c8e8f0..a04b8e751a0 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm @@ -3,3 +3,4 @@ /// Signal sent when a blackboard key is cleared #define COMSIG_AI_BLACKBOARD_KEY_CLEARED(blackboard_key) "ai_blackboard_key_clear_[blackboard_key]" + diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm index 18c6c651435..8420a486417 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm @@ -5,3 +5,10 @@ ///from the ranged_attacks component for basic mobs: (mob/living/basic/firer, atom/target, modifiers) #define COMSIG_BASICMOB_POST_ATTACK_RANGED "basicmob_post_attack_ranged" + +/// Sent from /datum/ai_planning_subtree/parrot_as_in_repeat() : () +#define COMSIG_NEEDS_NEW_PHRASE "parrot_needs_new_phrase" + #define NO_NEW_PHRASE_AVAILABLE (1<<0) //! Cancel to try again later for when we actually get a new phrase + +/// Called whenever an animal is pet via the /datum/element/pet_bonus element: (mob/living/petter, modifiers) +#define COMSIG_ANIMAL_PET "animal_pet" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 23cf2f83826..d52a94db64f 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -86,6 +86,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_TRANSFORM "block_transformations" /// Tracks whether we're gonna be a baby alien's mummy. #define TRAIT_XENO_HOST "xeno_host" +/// This parrot is currently perched +#define TRAIT_PARROT_PERCHED "parrot_perched" /// This mob is immune to stun causing status effects and stamcrit. /// Prefer to use [/mob/living/proc/check_stun_immunity] over checking for this trait exactly. #define TRAIT_STUNIMMUNE "stun_immunity" diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 5bb8b4bf314..3aa6c41de4f 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -61,8 +61,8 @@ GLOBAL_LIST_INIT(phobia_mobs, list( "birds" = typecacheof(list( /mob/living/basic/chick, /mob/living/basic/chicken, + /mob/living/basic/parrot, /mob/living/basic/pet/penguin, - /mob/living/simple_animal/parrot, )), "conspiracies" = typecacheof(list( /mob/living/basic/drone, diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index c32e576bda4..11a04a86aa7 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -325,6 +325,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG, "TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM, "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG, + "TRAIT_PARROT_PERCHED" = TRAIT_PARROT_PERCHED, "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, "TRAIT_PERMANENTLY_MORTAL" = TRAIT_PERMANENTLY_MORTAL, diff --git a/code/controllers/subsystem/persistence/_persistence.dm b/code/controllers/subsystem/persistence/_persistence.dm index 586723c92e5..8d00c778121 100644 --- a/code/controllers/subsystem/persistence/_persistence.dm +++ b/code/controllers/subsystem/persistence/_persistence.dm @@ -59,8 +59,9 @@ SUBSYSTEM_DEF(persistence) ///Loads up Poly's speech buffer. /datum/controller/subsystem/persistence/proc/load_poly() - for(var/mob/living/simple_animal/parrot/poly/P in GLOB.alive_mob_list) - twitterize(P.speech_buffer, "polytalk") + for(var/mob/living/basic/parrot/poly/bird in GLOB.alive_mob_list) + var/list/list_to_read = bird.get_static_list_of_phrases() + twitterize(list_to_read, "polytalk") break //Who's been duping the bird?! /// Loads up the amount of times maps appeared to alter their appearance in voting and rotation. diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm index 21b141feff8..0f7fe6ef142 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm @@ -1,6 +1,8 @@ /datum/ai_behavior/basic_melee_attack action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + ///do we finish this action after hitting once? + var/terminate_after_action = FALSE /datum/ai_behavior/basic_melee_attack/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) . = ..() @@ -39,12 +41,21 @@ else basic_mob.melee_attack(target) + if(terminate_after_action) + finish_action(controller, TRUE, target_key) /datum/ai_behavior/basic_melee_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key) . = ..() if(!succeeded) controller.clear_blackboard_key(target_key) +/datum/ai_behavior/basic_melee_attack/interact_once + terminate_after_action = TRUE + +/datum/ai_behavior/basic_melee_attack/interact_once/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key) + . = ..() + controller.clear_blackboard_key(target_key) + /datum/ai_behavior/basic_ranged_attack action_cooldown = 0.6 SECONDS behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm new file mode 100644 index 00000000000..d0fb7e3e8c7 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm @@ -0,0 +1,14 @@ +/datum/ai_behavior/unbuckle_mob + +/datum/ai_behavior/unbuckle_mob/perform(seconds_per_tick, datum/ai_controller/controller) + . = ..() + + var/mob/living/living_pawn = controller.pawn + var/atom/movable/buckled_too = living_pawn.buckled + + if(isnull(buckled_too)) + finish_action(controller, FALSE) + return + + buckled_too.unbuckle_mob(living_pawn) + finish_action(controller, TRUE) diff --git a/code/datums/ai/generic/find_and_set.dm b/code/datums/ai/generic/find_and_set.dm index f54ba33e6e3..d368641ce0c 100644 --- a/code/datums/ai/generic/find_and_set.dm +++ b/code/datums/ai/generic/find_and_set.dm @@ -72,6 +72,16 @@ if(length(found)) return pick(found) +/// Like find_and_set/in_list, but we return the turf location of the item instead of the item itself. +/datum/ai_behavior/find_and_set/in_list/turf_location + +/datum/ai_behavior/find_and_set/in_list/turf_location/search_tactic(datum/ai_controller/controller, locate_paths, search_range) + . = ..() + if(isnull(.)) + return null + + return get_turf(.) + /** * Variant of find and set which returns an object which can be animated with a staff of change */ @@ -148,3 +158,16 @@ return pick(customers) return null + +/datum/ai_behavior/find_and_set/nearby_friends + action_cooldown = 2 SECONDS + +/datum/ai_behavior/find_and_set/nearby_friends/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/atom/friend = locate(/mob/living/carbon/human) in oview(search_range, controller.pawn) + + if(isnull(friend)) + return null + + var/mob/living/living_pawn = controller.pawn + var/potential_friend = living_pawn.faction.Find(REF(friend)) ? friend : null + return potential_friend diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm index 4f816de4be3..962c8d141cd 100644 --- a/code/datums/ai/generic/generic_behaviors.dm +++ b/code/datums/ai/generic/generic_behaviors.dm @@ -299,6 +299,8 @@ /datum/ai_behavior/perform_speech /datum/ai_behavior/perform_speech/perform(seconds_per_tick, datum/ai_controller/controller, speech, speech_sound) + . = ..() + var/mob/living/living_pawn = controller.pawn if(!istype(living_pawn)) return diff --git a/code/datums/components/listen_and_repeat.dm b/code/datums/components/listen_and_repeat.dm new file mode 100644 index 00000000000..44a914a1b90 --- /dev/null +++ b/code/datums/components/listen_and_repeat.dm @@ -0,0 +1,83 @@ +/// The maximum number of phrases we can store in our speech buffer +#define MAX_SPEECH_BUFFER_SIZE 500 +/// Tendency we have to ignore radio chatter +#define RADIO_IGNORE_CHANCE 10 + +/// Simple element that will deterministically set a value based on stuff that the source has heard and will then compel the source to repeat it. +/// Requires a valid AI Blackboard. +/datum/component/listen_and_repeat + /// List of things that we start out having in our speech buffer + var/list/desired_phrases = null + /// The AI Blackboard Key we assign the value to. + var/blackboard_key = null + /// Probability we speak + var/speech_probability = null + /// Probabiliy we switch our phrase + var/switch_phrase_probability = null + /// List of things that we've heard and will repeat. + var/list/speech_buffer = null + +/datum/component/listen_and_repeat/Initialize(list/desired_phrases, blackboard_key) + . = ..() + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + if(!isnull(desired_phrases)) + LAZYADD(speech_buffer, desired_phrases) + + src.blackboard_key = blackboard_key + + RegisterSignal(parent, COMSIG_MOVABLE_PRE_HEAR, PROC_REF(on_hear)) + RegisterSignal(parent, COMSIG_NEEDS_NEW_PHRASE, PROC_REF(set_new_blackboard_phrase)) + RegisterSignal(parent, COMSIG_LIVING_WRITE_MEMORY, PROC_REF(on_write_memory)) + + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/listen_and_repeat/Destroy(force, silent) + REMOVE_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + return ..() + +/// Called when we hear something. +/datum/component/listen_and_repeat/proc/on_hear(datum/source, list/passed_arguments) + SIGNAL_HANDLER + + var/message = passed_arguments[HEARING_RAW_MESSAGE] + var/speaker = passed_arguments[HEARING_SPEAKER] + var/over_radio = !!passed_arguments[HEARING_RADIO_FREQ] + if(speaker == source) // don't parrot ourselves + return + + if(over_radio && prob(RADIO_IGNORE_CHANCE)) + return + + var/number_of_excess_strings = LAZYLEN(speech_buffer) - MAX_SPEECH_BUFFER_SIZE + if(number_of_excess_strings > 0) // only remove if we're overfull + for(var/i in 1 to number_of_excess_strings) + LAZYREMOVE(speech_buffer, pick(speech_buffer)) + + LAZYOR(speech_buffer, html_decode(message)) + +/// Called to set a new value for the blackboard key. +/datum/component/listen_and_repeat/proc/set_new_blackboard_phrase(datum/source) + SIGNAL_HANDLER + var/atom/movable/atom_source = source + var/datum/ai_controller/controller = atom_source.ai_controller + if(!LAZYLEN(speech_buffer)) + controller.clear_blackboard_key(blackboard_key) + return NO_NEW_PHRASE_AVAILABLE + + var/selected_phrase = pick(speech_buffer) + controller.set_blackboard_key(blackboard_key, selected_phrase) + +/// Exports all the speech buffer data to a dedicated blackboard key on the source. +/datum/component/listen_and_repeat/proc/on_write_memory(datum/source, dead, gibbed) + SIGNAL_HANDLER + var/atom/movable/atom_source = source + var/datum/ai_controller/controller = atom_source.ai_controller + if(LAZYLEN(speech_buffer)) // what? well whatever let's just move on + return + + controller.set_blackboard_key(BB_EXPORTABLE_STRING_BUFFER_LIST, speech_buffer.Copy()) + +#undef MAX_SPEECH_BUFFER_SIZE +#undef RADIO_IGNORE_CHANCE diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index 3c37bba33cb..14a0122dcf5 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -300,7 +300,7 @@ message_admins("[atom_source] has consumed [key_name_admin(consumed_mob)] [ADMIN_JMP(atom_source)].") atom_source.investigate_log("has consumed [key_name(consumed_mob)].", INVESTIGATE_ENGINE) consumed_mob.investigate_log("has been dusted by [atom_source].", INVESTIGATE_DEATHS) - if(istype(consumed_mob, /mob/living/simple_animal/parrot/poly)) // Dusting Poly creates a power surge + if(istype(consumed_mob, /mob/living/basic/parrot/poly)) // Dusting Poly creates a power surge force_event(/datum/round_event_control/supermatter_surge/poly, "Poly's revenge") notify_ghosts( "[consumed_mob] has been dusted by [atom_source]!", diff --git a/code/datums/diseases/parrotpossession.dm b/code/datums/diseases/parrotpossession.dm index 23f68e1a42f..bbe587b2a8d 100644 --- a/code/datums/diseases/parrotpossession.dm +++ b/code/datums/diseases/parrotpossession.dm @@ -13,24 +13,41 @@ severity = DISEASE_SEVERITY_MEDIUM infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD|MOB_ROBOTIC|MOB_MINERAL bypasses_immunity = TRUE //2spook - var/mob/living/simple_animal/parrot/poly/ghost/parrot + ///chance we speak + var/speak_chance = 5 + ///controller we speak from + var/datum/ai_controller/basic_controller/parrot_controller /datum/disease/parrot_possession/stage_act(seconds_per_tick, times_fired) . = ..() - if(!.) + + if(!. || isnull(parrot_controller)) return - if(QDELETED(parrot) || parrot.loc != affected_mob) - cure() - return FALSE + var/potential_phrase = parrot_controller.blackboard[BB_PARROT_REPEAT_STRING] - if(length(parrot.speech_buffer) && SPT_PROB(parrot.speak_chance, seconds_per_tick)) // I'm not going to dive into polycode trying to adjust that probability. Enjoy doubled ghost parrot speach - affected_mob.say(pick(parrot.speech_buffer), forced = "parrot possession") + if(SPT_PROB(speak_chance, seconds_per_tick) && !isnull(potential_phrase)) + affected_mob.say(potential_phrase, forced = "parrot possession") /datum/disease/parrot_possession/cure() - if(parrot && parrot.loc == affected_mob) - parrot.forceMove(affected_mob.drop_location()) - affected_mob.visible_message(span_danger("[parrot] is violently driven out of [affected_mob]!"), span_userdanger("[parrot] bursts out of your chest!")) - ..() + var/atom/movable/inside_parrot = locate(/mob/living/basic/parrot/poly/ghost) in affected_mob + if(inside_parrot) + UnregisterSignal(inside_parrot, list(COMSIG_PREQDELETED, COMSIG_MOVABLE_MOVED)) + inside_parrot.forceMove(affected_mob.drop_location()) + affected_mob.visible_message( + span_danger("[inside_parrot] is violently driven out of [affected_mob]!"), + span_userdanger("[inside_parrot] bursts out of your chest!"), + ) + parrot_controller = null + return ..() + +/datum/disease/parrot_possession/proc/set_parrot(mob/living/parrot) + parrot_controller = parrot.ai_controller + RegisterSignals(parrot, list(COMSIG_PREQDELETED, COMSIG_MOVABLE_MOVED), PROC_REF(on_parrot_exit)) + +/datum/disease/parrot_possession/proc/on_parrot_exit(datum/source) + SIGNAL_HANDLER + UnregisterSignal(source, list(COMSIG_PREQDELETED, COMSIG_MOVABLE_MOVED)) + cure() diff --git a/code/datums/elements/pet_bonus.dm b/code/datums/elements/pet_bonus.dm index 41977da31c0..5ef8b515077 100644 --- a/code/datums/elements/pet_bonus.dm +++ b/code/datums/elements/pet_bonus.dm @@ -33,6 +33,7 @@ return new /obj/effect/temp_visual/heart(pet.loc) + SEND_SIGNAL(pet, COMSIG_ANIMAL_PET, petter, modifiers) if(emote_message && prob(33)) pet.manual_emote(emote_message) petter.add_mood_event("petting_bonus", moodlet, pet) diff --git a/code/datums/memory/_memory.dm b/code/datums/memory/_memory.dm index 2b3e250a3fb..dd571c85746 100644 --- a/code/datums/memory/_memory.dm +++ b/code/datums/memory/_memory.dm @@ -266,6 +266,7 @@ /mob/living/basic/morph, /mob/living/basic/mouse, /mob/living/basic/mushroom, + /mob/living/basic/parrot, /mob/living/basic/pet/dog/breaddog, /mob/living/basic/pet/dog/corgi, /mob/living/basic/pet/dog/pug, @@ -276,7 +277,6 @@ /mob/living/basic/stickman, /mob/living/basic/stickman/dog, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/cat/cak, /obj/item/food/sausage/american, diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index 3ea6488b2d4..7521ff15549 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -404,10 +404,10 @@ /datum/export/pirate/parrot cost = 2000 unit_name = "alive parrot" - export_types = list(/mob/living/simple_animal/parrot) + export_types = list(/mob/living/basic/parrot) /datum/export/pirate/parrot/find_loot() - for(var/mob/living/simple_animal/parrot/current_parrot in GLOB.alive_mob_list) + for(var/mob/living/basic/parrot/current_parrot in GLOB.alive_mob_list) var/turf/parrot_turf = get_turf(current_parrot) if(parrot_turf && is_station_level(parrot_turf.z)) return current_parrot diff --git a/code/modules/antagonists/traitor/objectives/kill_pet.dm b/code/modules/antagonists/traitor/objectives/kill_pet.dm index 8ea89cb44d0..01ab042f11b 100644 --- a/code/modules/antagonists/traitor/objectives/kill_pet.dm +++ b/code/modules/antagonists/traitor/objectives/kill_pet.dm @@ -24,7 +24,7 @@ ), JOB_CAPTAIN = /mob/living/basic/pet/fox/renault, JOB_CHIEF_MEDICAL_OFFICER = /mob/living/simple_animal/pet/cat/runtime, - JOB_CHIEF_ENGINEER = /mob/living/simple_animal/parrot/poly, + JOB_CHIEF_ENGINEER = /mob/living/basic/parrot/poly, JOB_QUARTERMASTER = list( /mob/living/basic/gorilla/cargorilla, /mob/living/basic/sloth/citrus, diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm index ef9fb961823..942b1414cf9 100644 --- a/code/modules/cargo/packs/livestock.dm +++ b/code/modules/cargo/packs/livestock.dm @@ -6,13 +6,13 @@ name = "Bird Crate" desc = "Contains five expert telecommunication birds." cost = CARGO_CRATE_VALUE * 8 - contains = list(/mob/living/simple_animal/parrot) + contains = list(/mob/living/basic/parrot) crate_name = "parrot crate" /datum/supply_pack/critter/parrot/generate() . = ..() for(var/i in 1 to 4) - new /mob/living/simple_animal/parrot(.) + new /mob/living/basic/parrot(.) /datum/supply_pack/critter/butterfly name = "Butterflies Crate" diff --git a/code/modules/events/ghost_role/sentience.dm b/code/modules/events/ghost_role/sentience.dm index abc57d33a07..f33333ddb1b 100644 --- a/code/modules/events/ghost_role/sentience.dm +++ b/code/modules/events/ghost_role/sentience.dm @@ -7,6 +7,7 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( /mob/living/basic/goat, /mob/living/basic/lizard, /mob/living/basic/mouse/brown/tom, + /mob/living/basic/parrot, /mob/living/basic/pet, /mob/living/basic/pig, /mob/living/basic/rabbit, @@ -16,7 +17,6 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( /mob/living/basic/spider/giant/sgt_araneus, /mob/living/simple_animal/bot/secbot/beepsky, /mob/living/simple_animal/hostile/retaliate/goose/vomit, - /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet, ))) diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index d52dd1b9c50..8eb29fa706c 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -18,9 +18,9 @@ for(var/mob/living/basic/pet/dog/corgi/ian/Ian in GLOB.mob_living_list) Ian.place_on_head(new /obj/item/bedsheet(Ian)) - for(var/mob/living/simple_animal/parrot/poly/Poly in GLOB.mob_living_list) - new /mob/living/simple_animal/parrot/poly/ghost(Poly.loc) - qdel(Poly) + for(var/mob/living/basic/parrot/poly/bird in GLOB.mob_living_list) + new /mob/living/basic/parrot/poly/ghost(bird.loc) + qdel(bird) /datum/round_event/spooky/announce(fake) priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm index e670fa910a1..9de7fffcc3a 100644 --- a/code/modules/events/wizard/petsplosion.dm +++ b/code/modules/events/wizard/petsplosion.dm @@ -9,6 +9,7 @@ GLOBAL_LIST_INIT(petsplosion_candidates, typecacheof(list( /mob/living/basic/lizard, /mob/living/basic/mothroach, /mob/living/basic/mouse/brown/tom, + /mob/living/basic/parrot, /mob/living/basic/pet, /mob/living/basic/pig, /mob/living/basic/rabbit, @@ -17,7 +18,6 @@ GLOBAL_LIST_INIT(petsplosion_candidates, typecacheof(list( /mob/living/basic/snake, /mob/living/basic/spider/giant/sgt_araneus, /mob/living/simple_animal/hostile/retaliate/goose/vomit, - /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet, ))) diff --git a/code/modules/mob/living/basic/pets/parrot/_parrot.dm b/code/modules/mob/living/basic/pets/parrot/_parrot.dm new file mode 100644 index 00000000000..42aa0884816 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/_parrot.dm @@ -0,0 +1,458 @@ +#define FORCED_SPEECH_COOLDOWN_DURATION 5 SECONDS + +GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( + /datum/strippable_item/parrot_headset, +))) + + +/// Parrots! Klepto bastards that imitate your speech and hoard your shit. +/mob/living/basic/parrot + name = "parrot" + desc = "The parrot squawks, \"They're a Parrot! BAWWK!\"" + icon = 'icons/mob/simple/animal.dmi' + icon_state = "parrot_fly" + icon_living = "parrot_fly" + icon_dead = "parrot_dead" + density = FALSE + health = 80 + maxHealth = 80 + pass_flags = PASSTABLE | PASSMOB + + guaranteed_butcher_results = list(/obj/item/food/cracker = 1) + melee_damage_upper = 10 + melee_damage_lower = 5 + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently moves aside" + response_disarm_simple = "gently move aside" + response_harm_continuous = "swats" + response_harm_simple = "swat" + combat_mode = TRUE //parrots now start "aggressive" since only player parrots will nuzzle. + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + attack_vis_effect = ATTACK_EFFECT_BITE + friendly_verb_continuous = "grooms" + friendly_verb_simple = "groom" + mob_size = MOB_SIZE_SMALL + gold_core_spawnable = FRIENDLY_SPAWN + + ai_controller = /datum/ai_controller/basic_controller/parrot + + /// Icon we use while sitting + var/icon_sit = "parrot_sit" + + ///Headset for Poly to yell at engineers :) + var/obj/item/radio/headset/ears = null + + ///Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding. + var/obj/item/held_item = null + + /// The blackboard key we use to store the string we're repeating + var/speech_blackboard_key = BB_PARROT_REPEAT_STRING + /// The generic probability odds we have to do a speech-related action + var/speech_probability_rate = 5 + /// The generic probability odds we have to switch out our speech string + var/speech_shuffle_rate = 30 + + /// Contains all of the perches that parrots will generally sit on until something catches their eye. + var/static/list/desired_perches = typecacheof(list( + /obj/machinery/computer, + /obj/machinery/dna_scannernew, + /obj/machinery/nuclearbomb, + /obj/machinery/recharge_station, + /obj/machinery/smartfridge, + /obj/machinery/suit_storage_unit, + /obj/machinery/telecomms, + /obj/machinery/teleport, + /obj/structure/displaycase, + /obj/structure/filingcabinet, + /obj/structure/frame/computer, + )) + ///items we wont pick up + var/static/list/ignore_items = typecacheof(list(/obj/item/radio)) + + /// Food that Poly loves to eat (spoiler alert it's just crackers) + var/static/list/edibles = list( + /obj/item/food/cracker, + ) + + /// Tracks the times when we send a phrase through either being pet or attack to ensure it's not abused to flood + COOLDOWN_DECLARE(forced_speech_cooldown) + +/mob/living/basic/parrot/Initialize(mapload) + . = ..() + setup_headset() + update_speech_blackboards() + ai_controller.set_blackboard_key(BB_PARROT_PERCH_TYPES, desired_perches) + ai_controller.set_blackboard_key(BB_IGNORE_ITEMS, ignore_items) + AddElement(/datum/element/pet_bonus) // parrots will listen for the signal this element sends in order to say something in response to the pat + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/strippable, GLOB.strippable_parrot_items) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/listen_and_repeat, desired_phrases = get_static_list_of_phrases(), blackboard_key = BB_PARROT_REPEAT_STRING) + AddComponent(\ + /datum/component/tameable,\ + food_types = edibles,\ + tame_chance = 100,\ + bonus_tame_chance = 0,\ + after_tame = CALLBACK(src, PROC_REF(tamed)),\ + ) + + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attacking)) + RegisterSignal(src, COMSIG_MOB_CLICKON, PROC_REF(on_click)) + RegisterSignal(src, COMSIG_ATOM_ATTACKBY_SECONDARY, PROC_REF(on_attacked)) // this means we could have a peaceful interaction, like getting a cracker + RegisterSignal(src, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_injured)) // this means we got hurt and it's go time + RegisterSignal(src, COMSIG_ANIMAL_PET, PROC_REF(on_pet)) + RegisterSignal(src, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(drop_item_on_signal)) + +/mob/living/basic/parrot/Destroy() + // should have cleaned these up on death, but let's be super safe in case that didn't happen + if(!QDELETED(ears)) + QDEL_NULL(ears) + if(!QDELETED(held_item)) + QDEL_NULL(held_item) + return ..() + +/mob/living/basic/parrot/death(gibbed) + if(held_item) + held_item.forceMove(drop_location()) + held_item = null + + if(ears) + ears.forceMove(drop_location()) + ears = null + + if(!isnull(buckled)) + buckled.unbuckle_mob(src, force = TRUE) + buckled = null + pixel_x = base_pixel_x + pixel_y = base_pixel_y + + return ..() + +/mob/living/basic/parrot/examine(mob/user) + . = ..() + . += "It appears to [isnull(held_item) ? "not be holding anything." : "be holding \a [held_item]."]" + + if(stat != DEAD) + return + + if(HAS_MIND_TRAIT(user, TRAIT_NAIVE)) + . += pick( + "It seems tired and shagged out after a long squawk.", + "It seems to be pining for the fjords.", + "It's resting. It's a beautiful bird. Lovely plumage.", + ) + else + . += pick( + "This is a late parrot.", + "This is an ex-parrot.", + "This parrot is no more.", + ) + +/mob/living/basic/parrot/say_dead(message) + return // this is so flarped + +/mob/living/basic/parrot/get_status_tab_items() + . = ..() + . += "Held Item: [held_item]" + +/mob/living/basic/parrot/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) + if(stat != DEAD) // parrots have evolved to let them fly in space because fucking uhhhhhhhhhh + return TRUE + return ..() + +/mob/living/basic/parrot/radio(message, list/message_mods = list(), list/spans, language) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be. + . = ..() + if(. != NONE) + return + + if(message_mods[MODE_HEADSET]) + if(ears) + ears.talk_into(src, message, , spans, language, message_mods) + return ITALICS | REDUCE_RANGE + else if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT) + if(ears) + ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) + return ITALICS | REDUCE_RANGE + else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels) + if(ears) + ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) + return ITALICS | REDUCE_RANGE + + return NONE + +/mob/living/basic/parrot/update_icon_state() + . = ..() + if(HAS_TRAIT(src, TRAIT_PARROT_PERCHED)) + icon_state = icon_sit + else + icon_state = icon_living + +/// Proc that we just use to see if we're rightclicking something for perch behavior or dropping the item we currently ahve +/mob/living/basic/parrot/proc/on_click(mob/living/basic/source, atom/target, params) + SIGNAL_HANDLER + if(!LAZYACCESS(params, RIGHT_CLICK) || !CanReach(target)) + return + if(start_perching(target) && !isnull(held_item)) + drop_held_item(gently = TRUE) + +/// Proc that handles sending the signal and returning a valid phrase to say. Will not do anything if we don't have a stat or if we're cliented. +/// Will return either a string or null. +/mob/living/basic/parrot/proc/get_phrase() + if(!isnull(client) || stat != CONSCIOUS) + return null + + if(!COOLDOWN_FINISHED(src, forced_speech_cooldown)) + return null + + var/return_value = SEND_SIGNAL(src, COMSIG_NEEDS_NEW_PHRASE) + if(return_value & NO_NEW_PHRASE_AVAILABLE) + return null + + COOLDOWN_START(src, forced_speech_cooldown, FORCED_SPEECH_COOLDOWN_DURATION) + return ai_controller.blackboard[BB_PARROT_REPEAT_STRING] + +/// Proc that listens for when a parrot is pet so we can dispatch a voice line. +/mob/living/basic/parrot/proc/on_pet(mob/living/basic/source, mob/living/petter, modifiers) + SIGNAL_HANDLER + var/return_value = get_phrase() + if(isnull(return_value)) + return + + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, say), message = return_value, forced = "parrot oneliner on pet") + +/// Proc that ascertains the type of perch we're dealing with and starts the perching process. +/// Returns TRUE if we started perching, FALSE otherwise. +/mob/living/basic/parrot/proc/start_perching(atom/target) + if(HAS_TRAIT(src, TRAIT_PARROT_PERCHED)) + balloon_alert(src, "already perched!") + return FALSE + + if(ishuman(target)) + return perch_on_human(target) + + if(!is_type_in_typecache(target, desired_perches)) + return FALSE + + forceMove(get_turf(target)) + drop_held_item(gently = TRUE) // comfy :) + toggle_perched(perched = TRUE) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(after_move)) + return TRUE + +/mob/living/basic/parrot/proc/after_move(atom/source) + SIGNAL_HANDLER + + UnregisterSignal(src, COMSIG_MOVABLE_MOVED) + toggle_perched(perched = FALSE) + +/// Proc that will perch us on a human. Returns TRUE if we perched, FALSE otherwise. +/mob/living/basic/parrot/proc/perch_on_human(mob/living/carbon/human/target) + if(LAZYLEN(target.buckled_mobs) >= target.max_buckled_mobs) + balloon_alert(src, "can't perch on them!") + return FALSE + + forceMove(get_turf(target)) + if(!target.buckle_mob(src, TRUE)) + return FALSE + + to_chat(src, span_notice("You sit on [target]'s shoulder.")) + toggle_perched(perched = TRUE) + RegisterSignal(src, COMSIG_LIVING_SET_BUCKLED, PROC_REF(on_unbuckle)) + return TRUE + +/mob/living/basic/parrot/proc/on_unbuckle(mob/living/source, atom/movable/new_buckled) + SIGNAL_HANDLER + + if(new_buckled) + return + UnregisterSignal(src, COMSIG_LIVING_SET_BUCKLED) + toggle_perched(perched = FALSE) + +/mob/living/basic/parrot/proc/toggle_perched(perched) + if(!perched) + REMOVE_TRAIT(src, TRAIT_PARROT_PERCHED, TRAIT_GENERIC) + else + ADD_TRAIT(src, TRAIT_PARROT_PERCHED, TRAIT_GENERIC) + update_appearance(UPDATE_ICON_STATE) + +/// Master proc which will determine the intent of OUR attacks on an object and summon the relevant procs accordingly. +/// This is pretty much meant for players, AI will use the task-specific procs instead. +/mob/living/basic/parrot/proc/pre_attacking(mob/living/basic/source, atom/target) + SIGNAL_HANDLER + if(stat != CONSCIOUS) + return + + if(isitem(target) && steal_from_ground(target)) + return COMPONENT_HOSTILE_NO_ATTACK + + if(iscarbon(target) && steal_from_mob(target)) + return COMPONENT_HOSTILE_NO_ATTACK + +/// Picks up an item from the ground and puts it in our claws. Returns TRUE if we picked it up, FALSE otherwise. +/mob/living/basic/parrot/proc/steal_from_ground(obj/item/target) + if(!isnull(held_item)) + balloon_alert(src, "already holding something!") + return FALSE + + if(target.w_class > WEIGHT_CLASS_SMALL) + balloon_alert(src, "too big to pick up!") + return FALSE + + pick_up_item(target) + visible_message( + span_notice("[src] grabs [held_item]!"), + span_notice("You grab [held_item]!"), + span_hear("You hear the sounds of wings flapping furiously."), + ) + return TRUE + +/// Looks for an item that we can snatch and puts it in our claws. Returns TRUE if we picked it up, FALSE otherwise. +/mob/living/basic/parrot/proc/steal_from_mob(mob/living/carbon/victim) + if(!isnull(held_item)) + balloon_alert(src, "already holding something!") + return FALSE + + for(var/obj/item/stealable in victim.held_items) + if(stealable.w_class > WEIGHT_CLASS_SMALL) + continue + + if(!victim.temporarilyRemoveItemFromInventory(stealable)) + continue + + visible_message( + span_notice("[src] grabs [held_item] out of [victim]'s hand!"), + span_notice("You snag [held_item] out of [victim]'s hand!"), + span_hear("You hear the sounds of wings flapping furiously."), + ) + pick_up_item(stealable) + return TRUE + + return FALSE + +/// If we're right-clicked on with a cracker, we eat the cracker. +/mob/living/basic/parrot/proc/on_attacked(mob/living/basic/source, obj/item/thing, mob/living/attacker, params) + SIGNAL_HANDLER + if(!istype(thing, /obj/item/food/cracker)) // Poly wants a cracker + return + + consume_cracker(thing) // potential clash with the tameable element so we'll leave it to that to handle qdeling the cracker. + return COMPONENT_NO_AFTERATTACK + +/// Eats a cracker (or anything i guess). This would be nice to eventually fold into the basic_eating element but we do too much snowflake inventory code stuff for this to be reliable presently. +/// We don't qdel the item here, we assume the invoking proc will have handled that somehow. +/// Returns TRUE if we ate the thing. +/mob/living/basic/parrot/proc/consume_cracker(obj/item/thing) + to_chat(src, span_notice("[src] eagerly devours \the [thing].")) + if(!istype(thing, /obj/item/food/cracker)) + return TRUE // we still ate it + + if(health < maxHealth) + adjustBruteLoss(-10) + speech_probability_rate *= 1.27 + speech_shuffle_rate += 10 + update_speech_blackboards() + return TRUE + +/// Handles special behavior whenever we are injured. +/mob/living/basic/parrot/proc/on_injured(mob/living/basic/source, mob/living/attacker, attack_flags) + SIGNAL_HANDLER + if(!isnull(client) || stat == CONSCIOUS) + return + + drop_held_item(gently = FALSE) + + var/return_value = get_phrase() + if(isnull(return_value)) + return + + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, say), message = return_value, forced = "parrot oneliner on attack") + +/// Handles picking up the item we're holding, done in its own proc because of a snowflake edge case we need to account for. No additional logic beyond that. +/// Returns TRUE if we picked it up, FALSE otherwise. +/mob/living/basic/parrot/proc/pick_up_item(obj/item/target) + if(istype(target, /obj/item/food/cracker)) + consume_cracker(target) + qdel(target) + return + + target.forceMove(src) + held_item = target + +/// Handles dropping items we're holding. Gently is a special modifier we can use for special interactions. +/mob/living/basic/parrot/proc/drop_held_item(gently = TRUE) + if(isnull(held_item)) + balloon_alert(src, "nothing to drop!") + return + + if(stat != CONSCIOUS) // don't gotta do shit + return + + if(!gently && isgrenade(held_item)) + var/obj/item/grenade/bomb = held_item + balloon_alert(src, "bombs away!") // you'll likely die too so we can get away with the `!` here + bomb.forceMove(drop_location()) + bomb.detonate() + return + + balloon_alert(src, "dropped item") + held_item.forceMove(drop_location()) + +/mob/living/basic/parrot/Exited(atom/movable/gone, direction) + . = ..() + if(gone != held_item) + return + held_item = null + +/mob/living/basic/parrot/vv_edit_var(var_name, vval) + . = ..() // give admins an easier time when it comes to fucking with poly + switch(var_name) + if(NAMEOF(src, speech_probability_rate)) + update_speech_blackboards() + if(NAMEOF(src, speech_shuffle_rate)) + update_speech_blackboards() + +/// Updates our speech blackboards mob-side to reflect the current speech on the controller to ensure everything is synchronized. +/mob/living/basic/parrot/proc/update_speech_blackboards() + ai_controller.set_blackboard_key(BB_PARROT_REPEAT_PROBABILITY, speech_probability_rate) + ai_controller.set_blackboard_key(BB_PARROT_PHRASE_CHANGE_PROBABILITY, speech_shuffle_rate) + +/// Will simply set up the headset for the parrot to use. Stub, implemented on subtypes. +/mob/living/basic/parrot/proc/setup_headset() + return + +/// Gets a static list of phrases we wish to pass to the element. +/mob/living/basic/parrot/proc/get_static_list_of_phrases() + var/static/list/default_phrases = list( + "BAWWWWK george mellons griffing me!", + "Cracker?", + "Hello!", + "Hi!", + ) + + return default_phrases + +/// Gets the available channels that this parrot has access to. Returns a list of the channels we can use. +/mob/living/basic/parrot/proc/get_available_channels() + var/list/returnable_list = list() + if(isnull(ears)) + return returnable_list + + var/list/headset_channels = ears.channels + for(var/channel in headset_channels) + returnable_list += GLOB.channel_tokens[channel] // will return something like ":e" or ":c" y'know + + return returnable_list + +/mob/living/basic/parrot/proc/tamed() + new /obj/effect/temp_visual/heart(drop_location()) + +/mob/living/basic/parrot/proc/drop_item_on_signal(mob/living/user) + SIGNAL_HANDLER + + drop_held_item() + return COMSIG_KB_ACTIVATED + +#undef FORCED_SPEECH_COOLDOWN_DURATION diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm new file mode 100644 index 00000000000..ea0b9a71011 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm @@ -0,0 +1,40 @@ +/datum/ai_controller/basic_controller/parrot + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_HOARD_LOCATION_RANGE = 9, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/parrot + + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/perch_on_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/hoard_items, + /datum/ai_planning_subtree/parrot_as_in_repeat, // always get a witty oneliner in when you can + ) + +/datum/idle_behavior/idle_random_walk/parrot + ///chance of us moving while perched + var/walk_chance_when_perched = 5 + +/datum/idle_behavior/idle_random_walk/parrot/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + var/mob/living/living_pawn = controller.pawn + walk_chance = HAS_TRAIT(living_pawn, TRAIT_PARROT_PERCHED) ? walk_chance_when_perched : initial(walk_chance) + return ..() + +/datum/ai_behavior/travel_towards/and_drop + +/datum/ai_behavior/travel_towards/and_drop/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + var/mob/living/living_mob = controller.pawn + var/obj/drop_item = locate(/obj/item) in (living_mob.contents - typecache_filter_list(living_mob.contents, controller.blackboard[BB_IGNORE_ITEMS])) + drop_item?.forceMove(get_turf(living_mob)) + +/datum/ai_behavior/basic_melee_attack/interact_once/parrot + +/datum/ai_behavior/basic_melee_attack/interact_once/parrot/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.set_blackboard_key(BB_ALWAYS_IGNORE_FACTION, FALSE) diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/ghost_parrot_controller.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/ghost_parrot_controller.dm new file mode 100644 index 00000000000..58bdef408a5 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/ghost_parrot_controller.dm @@ -0,0 +1,37 @@ +/// Used for ghost poly. +/datum/ai_controller/basic_controller/parrot/ghost + planning_subtrees = list( + /datum/ai_planning_subtree/parrot_as_in_repeat, + /datum/ai_planning_subtree/possess_humans, + /datum/ai_planning_subtree/hoard_items, + ) + +///subtree to possess humans +/datum/ai_planning_subtree/possess_humans + ///chance we go possess humans + var/possess_chance = 2 + +/datum/ai_planning_subtree/possess_humans/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + + if(controller.blackboard_key_exists(BB_PERCH_TARGET)) + controller.queue_behavior(/datum/ai_behavior/perch_on_target/haunt, BB_PERCH_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + + + if(!SPT_PROB(possess_chance, seconds_per_tick)) + if(ishuman(living_pawn.loc)) + return SUBTREE_RETURN_FINISH_PLANNING + return + + if(ishuman(living_pawn.loc)) + controller.set_blackboard_key(living_pawn.loc) + return + + controller.queue_behavior(/datum/ai_behavior/find_and_set/conscious_person, BB_PERCH_TARGET) + + +/datum/ai_behavior/perch_on_target/haunt + +/datum/ai_behavior/perch_on_target/haunt/check_human_conditions(mob/living/living_human) + return (living_human.stat != DEAD) diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm new file mode 100644 index 00000000000..7484cbfe675 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm @@ -0,0 +1,74 @@ +///subtree to steal items +/datum/ai_planning_subtree/hoard_items + var/theft_chance = 5 + +/datum/ai_planning_subtree/hoard_items/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + + var/turf/myspace = controller.blackboard[BB_HOARD_LOCATION] + + if(isnull(myspace) || myspace.is_blocked_turf(source_atom = controller.pawn) || get_dist(myspace, controller.pawn) > controller.blackboard[BB_HOARD_LOCATION_RANGE]) + controller.queue_behavior(/datum/ai_behavior/find_and_set/hoard_location, BB_HOARD_LOCATION, /turf/open) + return + + //we have an item, go drop! + var/list/our_contents = living_pawn.contents - typecache_filter_list(living_pawn.contents, controller.blackboard[BB_IGNORE_ITEMS]) + if(length(our_contents)) + controller.queue_behavior(/datum/ai_behavior/travel_towards/and_drop, BB_HOARD_LOCATION) + return SUBTREE_RETURN_FINISH_PLANNING + + if(controller.blackboard_key_exists(BB_HOARD_ITEM_TARGET)) + controller.queue_behavior(/datum/ai_behavior/basic_melee_attack/interact_once, BB_HOARD_ITEM_TARGET, BB_TARGETING_STRATEGY) + return SUBTREE_RETURN_FINISH_PLANNING + + if(!SPT_PROB(theft_chance, seconds_per_tick)) + return + controller.queue_behavior(/datum/ai_behavior/find_and_set/hoard_item, BB_HOARD_ITEM_TARGET) + +/datum/ai_behavior/find_and_set/hoard_location + +/datum/ai_behavior/find_and_set/hoard_location/search_tactic(datum/ai_controller/controller, locate_path, search_range) + for(var/turf/open/candidate in oview(search_range, controller.pawn)) + if(isspaceturf(candidate) || isopenspaceturf(candidate)) + continue + if(candidate.is_blocked_turf(source_atom = controller.pawn)) + continue + return candidate + + return null + +/datum/ai_behavior/find_and_set/hoard_item + action_cooldown = 5 SECONDS + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/find_and_set/hoard_item/search_tactic(datum/ai_controller/controller, locate_path, search_range) + if(!controller.blackboard_key_exists(BB_HOARD_LOCATION)) + return null + var/turf/nest_turf = controller.blackboard[BB_HOARD_LOCATION] + var/mob/living/living_pawn = controller.pawn + for(var/atom/potential_victim in oview(search_range, controller.pawn)) + if(is_type_in_typecache(potential_victim, controller.blackboard[BB_IGNORE_ITEMS])) + continue + if(potential_victim.loc == nest_turf) + continue + if(isitem(potential_victim)) + var/obj/item/item_steal = potential_victim + if(item_steal.w_class <= WEIGHT_CLASS_SMALL) + return potential_victim + if(!ishuman(potential_victim)) + continue + if(living_pawn.faction.Find(REF(potential_victim))) + continue //dont steal from friends + if(holding_valuable(controller, potential_victim)) + controller.set_blackboard_key(BB_ALWAYS_IGNORE_FACTION, TRUE) + return potential_victim + + return null + +/datum/ai_behavior/find_and_set/hoard_item/proc/holding_valuable(datum/ai_controller/controller, mob/living/human_target) + for(var/obj/item/potential_item in human_target.held_items) + if(is_type_in_typecache(potential_item, controller.blackboard[BB_IGNORE_ITEMS])) + continue + if(potential_item.w_class <= WEIGHT_CLASS_SMALL) + return TRUE + return FALSE diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm new file mode 100644 index 00000000000..1bb5c6fc960 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm @@ -0,0 +1,78 @@ +///subtree to perch on targets +/datum/ai_planning_subtree/perch_on_target + ///perchance... + var/perch_chance = 5 + ///chance we unbuckle + var/unperch_chance = 15 + + +/datum/ai_planning_subtree/perch_on_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + var/atom/buckled_too = living_pawn.buckled + + //do we have a current target or is chance to unbuckle has passed? then unbuckle! + if(buckled_too) + if((SPT_PROB(unperch_chance, seconds_per_tick) || controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET))) + controller.queue_behavior(/datum/ai_behavior/unbuckle_mob) + return + return SUBTREE_RETURN_FINISH_PLANNING + + //if we are perched, we can go find something else to perch too + var/final_chance = HAS_TRAIT(living_pawn, TRAIT_PARROT_PERCHED) ? unperch_chance : perch_chance + + if(!SPT_PROB(final_chance, seconds_per_tick) || controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) + return + + if(controller.blackboard_key_exists(BB_PERCH_TARGET)) + controller.queue_behavior(/datum/ai_behavior/perch_on_target, BB_PERCH_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + + //50 50 chance to look for an object, or a friend + if(prob(50)) + controller.queue_behavior(/datum/ai_behavior/find_and_set/nearby_friends, BB_PERCH_TARGET) + return + + controller.queue_behavior(/datum/ai_behavior/find_and_set/in_list, BB_PERCH_TARGET, controller.blackboard[BB_PARROT_PERCH_TYPES]) + +/// Parrot behavior that allows them to perch on a target. +/datum/ai_behavior/perch_on_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/perch_on_target/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + + set_movement_target(controller, target) + +/datum/ai_behavior/perch_on_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + + var/mob/living/basic/parrot/living_pawn = controller.pawn + + if(!ishuman(target)) + living_pawn.start_perching(target) + finish_action(controller, TRUE, target_key) + return + + if(!check_human_conditions(target)) + finish_action(controller, FALSE, target_key) + return + + living_pawn.start_perching(target) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/perch_on_target/proc/check_human_conditions(mob/living/living_human) + if(living_human.stat == DEAD || LAZYLEN(living_human.buckled_mobs) >= living_human.max_buckled_mobs) + return FALSE + + return TRUE + +/datum/ai_behavior/perch_on_target/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm new file mode 100644 index 00000000000..d1488a60b3b --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm @@ -0,0 +1,50 @@ +/// When a parrot... parrots... +/datum/ai_planning_subtree/parrot_as_in_repeat + operational_datums = list(/datum/component/listen_and_repeat) + +/datum/ai_planning_subtree/parrot_as_in_repeat/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/speaking_pawn = controller.pawn + + var/switch_up_probability = controller.blackboard[BB_PARROT_PHRASE_CHANGE_PROBABILITY] + if(SPT_PROB(switch_up_probability, seconds_per_tick) || isnull(controller.blackboard[BB_PARROT_REPEAT_STRING])) + if(SEND_SIGNAL(speaking_pawn, COMSIG_NEEDS_NEW_PHRASE) & NO_NEW_PHRASE_AVAILABLE) + return + + if(!SPT_PROB(controller.blackboard[BB_PARROT_REPEAT_PROBABILITY], seconds_per_tick)) + return + + var/potential_string = controller.blackboard[BB_PARROT_REPEAT_STRING] + if(isnull(potential_string)) + stack_trace("Parrot As In Repeat Subtree somehow is getting a null potential string while not getting `NO_NEW_PHRASE_AVAILABLE`!") + return + + controller.queue_behavior(/datum/ai_behavior/perform_speech/parrot, potential_string) + +/datum/ai_behavior/perform_speech/parrot + action_cooldown = 7.5 SECONDS // gets really annoying (moreso than usual) really fast otherwise + +/datum/ai_behavior/perform_speech/parrot/perform(seconds_per_tick, datum/ai_controller/controller, speech, speech_sound) + var/mob/living/basic/parrot/speaking_pawn = controller.pawn + var/list/available_channels = speaking_pawn.get_available_channels() + var/modified_speech = speech + var/use_radio = prob(50) // we might not even use the radio if we even have a channel + +#define HAS_CHANNEL_PREFIX (speech[1] in GLOB.department_radio_prefixes) && (copytext_char(speech, 2, 3) in GLOB.department_radio_keys) // determine if we need to crop the channel prefix + + if(!length(available_channels)) // might not even use the radio at all + if(HAS_CHANNEL_PREFIX) + modified_speech = copytext_char(speech, 3) + + else + if(HAS_CHANNEL_PREFIX) + modified_speech = "[use_radio ? pick(available_channels) : ""][copytext_char(speech, 3)]" + else + modified_speech = "[use_radio ? pick(available_channels) : ""][speech]" + + + speaking_pawn.say(modified_speech, forced = "AI Controller") + if(speech_sound) + playsound(speaking_pawn, speech_sound, 80, vary = TRUE) + finish_action(controller, TRUE) + +#undef HAS_CHANNEL_PREFIX diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_items.dm b/code/modules/mob/living/basic/pets/parrot/parrot_items.dm new file mode 100644 index 00000000000..c071bf7fdbe --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_items.dm @@ -0,0 +1,60 @@ +/datum/strippable_item/parrot_headset + key = STRIPPABLE_ITEM_PARROT_HEADSET + +/datum/strippable_item/parrot_headset/get_item(atom/source) + var/mob/living/basic/parrot/poly/parrot_source = source + return istype(parrot_source) ? parrot_source.ears : null + +/datum/strippable_item/parrot_headset/try_equip(atom/source, obj/item/equipping, mob/user) + . = ..() + if (!.) + return FALSE + + if (!istype(equipping, /obj/item/radio/headset)) + to_chat(user, span_warning("[equipping] won't fit!")) + return FALSE + + return TRUE + +// There is no delay for putting a headset on a parrot. +/datum/strippable_item/parrot_headset/start_equip(atom/source, obj/item/equipping, mob/user) + return TRUE + +/datum/strippable_item/parrot_headset/finish_equip(atom/source, obj/item/equipping, mob/user) + var/obj/item/radio/headset/radio = equipping + if (!istype(radio)) + return + + var/mob/living/basic/parrot/parrot_source = source + if (!istype(parrot_source)) + return + + if (!user.transferItemToLoc(radio, source)) + return + + parrot_source.ears = radio + + to_chat(user, span_notice("You fit [radio] onto [source].")) + +/datum/strippable_item/parrot_headset/start_unequip(atom/source, mob/user) + . = ..() + if (!.) + return FALSE + + var/mob/living/basic/parrot/parrot_source = source + if (!istype(parrot_source)) + return + + if (parrot_source.stat == CONSCIOUS) + var/list/list_of_channels = parrot_source.get_available_channels() + parrot_source.say("[list_of_channels ? "[pick(list_of_channels)] " : null]BAWWWWWK LEAVE THE HEADSET BAWKKKKK!", forced = "attempted headset removal") + + return TRUE + +/datum/strippable_item/parrot_headset/finish_unequip(atom/source, mob/user) + var/mob/living/basic/parrot/parrot_source = source + if (!istype(parrot_source)) + return + + parrot_source.ears.forceMove(parrot_source.drop_location()) + parrot_source.ears = null diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_subtypes.dm b/code/modules/mob/living/basic/pets/parrot/parrot_subtypes.dm new file mode 100644 index 00000000000..a0e8a4b5294 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_subtypes.dm @@ -0,0 +1,14 @@ +// this file is for parrots that aren't poly + +/// Parrot that will just randomly spawn with a headset. Nothing too special beyond that. +/mob/living/basic/parrot/headsetted + +/mob/living/basic/parrot/headsetted/setup_headset() + var/headset = pick( + /obj/item/radio/headset/headset_cargo, + /obj/item/radio/headset/headset_eng, + /obj/item/radio/headset/headset_med, + /obj/item/radio/headset/headset_sci, + /obj/item/radio/headset/headset_sec, + ) + ears = new headset(src) diff --git a/code/modules/mob/living/basic/pets/parrot/poly.dm b/code/modules/mob/living/basic/pets/parrot/poly.dm new file mode 100644 index 00000000000..ecd6e054609 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/poly.dm @@ -0,0 +1,254 @@ +/// Default poly, presumably died the last shift and has no special traits. +#define POLY_DEFAULT "default" +/// Poly has survived a number of rounds equivalent to the longest survival of his being. +#define POLY_LONGEST_SURVIVAL "longest_survival" +/// Poly has survived a number of rounds equivalent to the longest deathstreak of his being. +#define POLY_BEATING_DEATHSTREAK "longest_deathstreak" +/// Poly has only just survived a round, and is doing a consecutive one. +#define POLY_CONSECUTIVE_ROUND "consecutive_round" +/// haunt filter we apply to who we possess +#define POLY_POSSESS_FILTER +/// haunt filter color we apply to who we possess +#define POLY_POSSESS_GLOW "#522059" + +/// The classically famous compadre to the Chief Engineer, Poly. +/mob/living/basic/parrot/poly + name = "Poly" + desc = "Poly the Parrot. An expert on quantum cracker theory." + gold_core_spawnable = NO_SPAWN + speech_probability_rate = 13 + + /// Callback to save our memory at the end of the round. + var/datum/callback/roundend_callback = null + /// Did we write the memory to disk? + var/memory_saved = FALSE + /// How long has this bird been alive for? + var/rounds_survived = 0 + /// How long have we survived for at max? + var/longest_survival = 0 + /// How many rounds in a row have we been dead for? + var/longest_deathstreak = 0 + +/mob/living/basic/parrot/poly/Initialize(mapload) + . = ..() + + if(!memory_saved) + roundend_callback = CALLBACK(src, PROC_REF(Write_Memory)) + SSticker.OnRoundend(roundend_callback) + + REGISTER_REQUIRED_MAP_ITEM(1, 1) // every map needs a poly! + update_appearance() + + if(!SStts.tts_enabled) + return + + voice = pick(SStts.available_speakers) + if(SStts.pitch_enabled) + if(findtext(voice, "Woman")) + pitch = 12 // up-pitch by one octave + else + pitch = 24 // up-pitch by 2 octaves + else + voice_filter = "rubberband=pitch=1.5" // Use the filter to pitch up if we can't naturally pitch up. + +/mob/living/basic/parrot/poly/Destroy() + LAZYREMOVE(SSticker.round_end_events, roundend_callback) // we do the memory writing stuff on death, but this is important to yeet as fast as we can if we need to destroy + roundend_callback = null + return ..() + +/mob/living/basic/parrot/poly/death(gibbed) + if(HAS_TRAIT(src, TRAIT_DONT_WRITE_MEMORY)) + return ..() // Don't read memory either. + if(!memory_saved) + Write_Memory(TRUE) + var/special_status = determine_special_poly() + if(special_status == POLY_LONGEST_SURVIVAL || special_status == POLY_BEATING_DEATHSTREAK || prob(0.666)) + var/mob/living/basic/parrot/poly/ghost/specter = new(loc) + if(mind) + mind.transfer_to(specter) + else + specter.key = key + return ..() + +/mob/living/basic/parrot/poly/get_static_list_of_phrases() // there's only one poly, so there should only be one ongoing list of phrases. i guess + var/static/list/phrases_to_return = list() + if(length(phrases_to_return)) + return phrases_to_return + + phrases_to_return += read_memory() // must come first!!! + // now add some valuable lines every poly should have + phrases_to_return += list( + ":e Check the crystal, you chucklefucks!", + ":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE", + ":e WHO TOOK THE DAMN MODSUITS?", + ":e Wire the solars, you lazy bums!", + "Poly wanna cracker!", + ) + switch(determine_special_poly()) + if(POLY_DEFAULT) + phrases_to_return += pick("...alive?", "This isn't parrot heaven!", "I live, I die, I live again!", "The void fades!") + if(POLY_LONGEST_SURVIVAL) + phrases_to_return += pick("...[longest_survival].", "The things I've seen!", "I have lived many lives!", "What are you before me?") + if(POLY_BEATING_DEATHSTREAK) + phrases_to_return += pick("What are you waiting for!", "Violence breeds violence!", "Blood! Blood!", "Strike me down if you dare!") + if(POLY_CONSECUTIVE_ROUND) + phrases_to_return += pick("...again?", "No, It was over!", "Let me out!", "It never ends!") + + return phrases_to_return + +/mob/living/basic/parrot/poly/update_desc() + . = ..() + switch(determine_special_poly()) + if(POLY_LONGEST_SURVIVAL) + desc += " Old as sin, and just as loud. Claimed to be [rounds_survived]." + if(POLY_BEATING_DEATHSTREAK) + desc += " The squawks of [-rounds_survived] dead parrots ring out in your ears..." + if(POLY_CONSECUTIVE_ROUND) + desc += " Over [rounds_survived] shifts without a \"terrible\" \"accident\"!" + +/mob/living/basic/parrot/poly/update_icon() + . = ..() + switch(determine_special_poly()) + if(POLY_LONGEST_SURVIVAL) + add_atom_colour("#EEEE22", FIXED_COLOUR_PRIORITY) + if(POLY_BEATING_DEATHSTREAK) + add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY) + +/// Reads the memory of the parrot, and updates the necessary variables. Returns a list of phrases to add to the parrot's speech buffer. +/mob/living/basic/parrot/poly/proc/read_memory() + RETURN_TYPE(/list) + var/list/returnable_list = list() + if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new + var/savefile/legacy = new /savefile("data/npc_saves/Poly.sav") + legacy["phrases"] >> returnable_list + legacy["roundssurvived"] >> rounds_survived + legacy["longestsurvival"] >> longest_survival + legacy["longestdeathstreak"] >> longest_deathstreak + fdel("data/npc_saves/Poly.sav") + + else + var/json_file = file("data/npc_saves/Poly.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + returnable_list = json["phrases"] + rounds_survived = json["roundssurvived"] + longest_survival = json["longestsurvival"] + longest_deathstreak = json["longestdeathstreak"] + + return returnable_list + +/// Determines the type of Poly we might have here based on the statistics we got from the memory. +/mob/living/basic/parrot/poly/proc/determine_special_poly() + if(rounds_survived == longest_survival) + return POLY_LONGEST_SURVIVAL + else if(rounds_survived == longest_deathstreak) + return POLY_BEATING_DEATHSTREAK + else if(rounds_survived > 0) + return POLY_CONSECUTIVE_ROUND + else + return POLY_DEFAULT + +/mob/living/basic/parrot/poly/Write_Memory(dead, gibbed) + . = ..() + if(!. || memory_saved) // if we die, no more memory + return FALSE + + if(!dead && (stat != DEAD)) + dead = FALSE + + var/file_path = "data/npc_saves/Poly.json" + var/list/file_data = list() + + var/list/exportable_speech_buffer = ai_controller.blackboard[BB_EXPORTABLE_STRING_BUFFER_LIST] // should have been populated when we sent the signal out on parent + if(!!length(exportable_speech_buffer)) + file_data["phrases"] = exportable_speech_buffer + + if(dead) + file_data["roundssurvived"] = min(rounds_survived - 1, 0) + file_data["longestsurvival"] = longest_survival + if(rounds_survived - 1 < longest_deathstreak) + file_data["longestdeathstreak"] = rounds_survived - 1 + else + file_data["longestdeathstreak"] = longest_deathstreak + else + + file_data["roundssurvived"] = max(rounds_survived, 0) + 1 + if(rounds_survived + 1 > longest_survival) + file_data["longestsurvival"] = rounds_survived + 1 + else + file_data["longestsurvival"] = longest_survival + file_data["longestdeathstreak"] = longest_deathstreak + + var/formatted_data +#if DM_VERSION >= 515 + formatted_data = json_encode(file_data, JSON_PRETTY_PRINT) +#else + formatted_data = json_encode(file_data) +#endif + + rustg_file_write(formatted_data, file_path) + memory_saved = TRUE + return TRUE + +/mob/living/basic/parrot/poly/setup_headset() + ears = new /obj/item/radio/headset/headset_eng(src) + +/mob/living/basic/parrot/poly/ghost + name = "The Ghost of Poly" + desc = "Doomed to squawk the Earth." + color = "#FFFFFF77" + status_flags = GODMODE + sentience_type = SENTIENCE_BOSS //This is so players can't mindswap into ghost poly to become a literal god + incorporeal_move = INCORPOREAL_MOVE_BASIC + butcher_results = list(/obj/item/ectoplasm = 1) + ai_controller = /datum/ai_controller/basic_controller/parrot/ghost + speech_probability_rate = 1 + +/mob/living/basic/parrot/poly/ghost/Initialize(mapload) + // block anything and everything that could possibly happen with writing memory for ghosts + memory_saved = TRUE + ADD_TRAIT(src, TRAIT_DONT_WRITE_MEMORY, INNATE_TRAIT) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + return ..() + +//we perch on human souls +/mob/living/basic/parrot/poly/ghost/perch_on_human(mob/living/carbon/human/target) + if(loc == target) //dismount + forceMove(get_turf(target)) + return FALSE + if(ishuman(loc)) + balloon_alert(src, "already possessing!") + return FALSE + forceMove(target) + return TRUE + +/mob/living/basic/parrot/poly/ghost/proc/on_moved(atom/movable/movable, atom/old_loc) + SIGNAL_HANDLER + + if(ishuman(old_loc)) + var/mob/living/unpossessed_human = old_loc + unpossessed_human.remove_filter(POLY_POSSESS_FILTER) + return + + if(!ishuman(loc)) + return + + var/mob/living/possessed_human = loc + possessed_human.add_filter(POLY_POSSESS_FILTER, 2, list("type" = "outline", "color" = POLY_POSSESS_GLOW, "size" = 2)) + var/filter = possessed_human.get_filter(POLY_POSSESS_FILTER) + + if(filter) + animate(filter, alpha = 200, time = 2 SECONDS, loop = -1) + animate(alpha = 60, time = 2 SECONDS) + + var/datum/disease/parrot_possession/on_possession = new /datum/disease/parrot_possession + on_possession.set_parrot(src) + possessed_human.ForceContractDisease(on_possession, make_copy = FALSE, del_on_fail = TRUE) + +#undef POLY_DEFAULT +#undef POLY_LONGEST_SURVIVAL +#undef POLY_BEATING_DEATHSTREAK +#undef POLY_CONSECUTIVE_ROUND +#undef POLY_POSSESS_FILTER +#undef POLY_POSSESS_GLOW diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 88e5941b5e5..9f1517962e9 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -67,7 +67,11 @@ var/list/datum/bioware/biowares /// What types of mobs are allowed to ride/buckle to this mob - var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot)) + var/static/list/can_ride_typecache = typecacheof(list( + /mob/living/basic/parrot, + /mob/living/carbon/human, + /mob/living/simple_animal/slime, + )) var/lastpuke = 0 var/account_id diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5d4eea36d75..8a990a359aa 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1439,6 +1439,7 @@ /mob/living/basic/morph, /mob/living/basic/mouse, /mob/living/basic/mushroom, + /mob/living/basic/parrot, /mob/living/basic/pet/dog/breaddog, /mob/living/basic/pet/dog/corgi, /mob/living/basic/pet/dog/pug, @@ -1449,7 +1450,6 @@ /mob/living/basic/stickman, /mob/living/basic/stickman/dog, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/cat/cak, ) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 1cd72a3cc40..6cf82771444 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -250,7 +250,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( /mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range=0) - if(!GET_CLIENT(src)) + if((SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_HEAR, args) & COMSIG_MOVABLE_CANCEL_HEARING) || !GET_CLIENT(src)) return FALSE var/deaf_message @@ -526,7 +526,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( I.talk_into(src, message, , spans, language, message_mods) return ITALICS | REDUCE_RANGE - return 0 + return NONE /mob/living/say_mod(input, list/message_mods = list()) if(message_mods[WHISPER_MODE] == MODE_WHISPER) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm deleted file mode 100644 index 01c96e053ae..00000000000 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ /dev/null @@ -1,1067 +0,0 @@ -/* Parrots! - * Contains - * Defines - * Inventory (headset stuff) - * Attack responces - * AI - * Procs / Verbs (usable by players) - * Sub-types - * Hear & say (the things we do for gimmicks) - */ - -/* - * Defines - */ - -//Only a maximum of one action and one intent should be active at any given time. -//Actions -#define PARROT_PERCH (1<<0) //Sitting/sleeping, not moving -#define PARROT_SWOOP (1<<1) //Moving towards or away from a target -#define PARROT_WANDER (1<<2) //Moving without a specific target in mind - -//Intents -#define PARROT_STEAL (1<<3) //Flying towards a target to steal it/from it -#define PARROT_ATTACK (1<<4) //Flying towards a target to attack it -#define PARROT_RETURN (1<<5) //Flying towards its perch -#define PARROT_FLEE (1<<6) //Flying away from its attacker - - -/mob/living/simple_animal/parrot - name = "parrot" - desc = "The parrot squawks, \"They're a Parrot! BAWWK!\"" //' - icon = 'icons/mob/simple/animal.dmi' - icon_state = "parrot_fly" - icon_living = "parrot_fly" - icon_dead = "parrot_dead" - var/icon_sit = "parrot_sit" - density = FALSE - health = 80 - maxHealth = 80 - pass_flags = PASSTABLE | PASSMOB - - speak = list("Hi!","Hello!","Cracker?","BAWWWWK george mellons griffing me!") - speak_emote = list("squawks","says","yells") - emote_hear = list("squawks.","bawks!") - emote_see = list("flutters their wings.") - - speak_chance = 1 //1% (1 in 100) chance every tick; So about once per 150 seconds, assuming an average tick is 1.5s - turns_per_move = 5 - butcher_results = list(/obj/item/food/cracker = 1) - melee_damage_upper = 10 - melee_damage_lower = 5 - - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently moves aside" - response_disarm_simple = "gently move aside" - response_harm_continuous = "swats" - response_harm_simple = "swat" - stop_automated_movement = 1 - combat_mode = TRUE //parrots now start "aggressive" since only player parrots will nuzzle. - attack_verb_continuous = "chomps" - attack_verb_simple = "chomp" - attack_vis_effect = ATTACK_EFFECT_BITE - friendly_verb_continuous = "grooms" - friendly_verb_simple = "groom" - mob_size = MOB_SIZE_SMALL - gold_core_spawnable = FRIENDLY_SPAWN - - var/parrot_damage_upper = 10 - var/parrot_state = PARROT_WANDER //Hunt for a perch when created - var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick. - var/parrot_sleep_dur = 25 //Same as above, this is the var that physically counts down - var/parrot_dam_zone = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG) //For humans, select a bodypart to attack - - var/parrot_speed = 5 //"Delay in world ticks between movement." according to byond. Yeah, that's BS but it does directly affect movement. Higher number = slower. - var/parrot_lastmove = null //Updates/Stores position of the parrot while it's moving - var/parrot_stuck = 0 //If parrot_lastmove hasn't changed, this will increment until it reaches parrot_stuck_threshold - var/parrot_stuck_threshold = 10 //if this == parrot_stuck, it'll force the parrot back to wandering - - var/list/speech_buffer = list() - var/speech_shuffle_rate = 20 - var/list/available_channels = list() - - //Headset for Poly to yell at engineers :) - var/obj/item/radio/headset/ears = null - - //Wheter the Parrot should come with a headset - var/spawn_headset = TRUE - - //The thing the parrot is currently interested in. This gets used for items the parrot wants to pick up, mobs it wants to steal from, - //mobs it wants to attack or mobs that have attacked it - var/atom/movable/parrot_interest = null - - //Parrots will generally sit on their perch unless something catches their eye. - //These vars store their preffered perch and if they dont have one, what they can use as a perch - var/obj/parrot_perch = null - var/obj/desired_perches = list(/obj/structure/frame/computer, - /obj/structure/displaycase, - /obj/structure/filingcabinet, - /obj/machinery/teleport, - /obj/machinery/dna_scannernew, - /obj/machinery/telecomms, - /obj/machinery/nuclearbomb, - /obj/machinery/recharge_station, - /obj/machinery/smartfridge, - /obj/machinery/computer, - /obj/machinery/suit_storage_unit, - ) - - //Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding. - var/obj/item/held_item = null - - -/mob/living/simple_animal/parrot/Initialize(mapload) - . = ..() - parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var - - add_verb(src, list(/mob/living/simple_animal/parrot/proc/steal_from_ground, \ - /mob/living/simple_animal/parrot/proc/steal_from_mob, \ - /mob/living/simple_animal/parrot/verb/drop_held_item_player, \ - /mob/living/simple_animal/parrot/proc/perch_player, \ - /mob/living/simple_animal/parrot/proc/toggle_mode, - /mob/living/simple_animal/parrot/proc/perch_mob_player)) - - AddElement(/datum/element/strippable, GLOB.strippable_parrot_items) - AddElement(/datum/element/simple_flying) - if(!spawn_headset) - return - if(!ears) - var/headset = pick(/obj/item/radio/headset/headset_sec, \ - /obj/item/radio/headset/headset_eng, \ - /obj/item/radio/headset/headset_med, \ - /obj/item/radio/headset/headset_sci, \ - /obj/item/radio/headset/headset_cargo) - ears = new headset(src) - -/mob/living/simple_animal/parrot/Destroy() - QDEL_NULL(ears) - return ..() - -/mob/living/simple_animal/parrot/examine(mob/user) - . = ..() - if(stat != DEAD) - return - - if(HAS_MIND_TRAIT(user, TRAIT_NAIVE)) - . += pick( - "It seems tired and shagged out after a long squawk.", - "It seems to be pining for the fjords.", - "It's resting. It's a beautiful bird. Lovely plumage.", - ) - else - . += pick( - "This parrot is no more.", - "This is a late parrot.", - "This is an ex-parrot.", - ) - -/mob/living/simple_animal/parrot/death(gibbed) - if(held_item) - held_item.forceMove(drop_location()) - held_item = null - SSmove_manager.stop_looping(src) - - if(buckled) - buckled.unbuckle_mob(src,force=1) - buckled = null - pixel_x = base_pixel_x - pixel_y = base_pixel_y - - return ..() - - -/mob/living/simple_animal/parrot/get_status_tab_items() - . = ..() - . += "Held Item: [held_item]" - -/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) - . = ..() - if(speaker != src && prob(50)) //Dont imitate ourselves - if(!radio_freq || prob(10)) - if(speech_buffer.len >= 500) - speech_buffer -= pick(speech_buffer) - speech_buffer |= html_decode(raw_message) - if(speaker == src && !client) //If a parrot squawks in the woods and no one is around to hear it, does it make a sound? This code says yes! - return message - -/mob/living/simple_animal/parrot/radio(message, list/message_mods = list(), list/spans, language) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be. - . = ..() - if(.) - return - - if(message_mods[MODE_HEADSET]) - if(ears) - ears.talk_into(src, message, , spans, language, message_mods) - return ITALICS | REDUCE_RANGE - else if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT) - if(ears) - ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) - return ITALICS | REDUCE_RANGE - else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels) - if(ears) - ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) - return ITALICS | REDUCE_RANGE - - return FALSE - -GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( - /datum/strippable_item/parrot_headset, -))) - -/datum/strippable_item/parrot_headset - key = STRIPPABLE_ITEM_PARROT_HEADSET - -/datum/strippable_item/parrot_headset/get_item(atom/source) - var/mob/living/simple_animal/parrot/parrot_source = source - return istype(parrot_source) ? parrot_source.ears : null - -/datum/strippable_item/parrot_headset/try_equip(atom/source, obj/item/equipping, mob/user) - . = ..() - if (!.) - return FALSE - - if (!istype(equipping, /obj/item/radio/headset)) - to_chat(user, span_warning("[equipping] won't fit!")) - return FALSE - - return TRUE - -// There is no delay for putting a headset on a parrot. -/datum/strippable_item/parrot_headset/start_equip(atom/source, obj/item/equipping, mob/user) - return TRUE - -/datum/strippable_item/parrot_headset/finish_equip(atom/source, obj/item/equipping, mob/user) - var/obj/item/radio/headset/radio = equipping - if (!istype(radio)) - return - - var/mob/living/simple_animal/parrot/parrot_source = source - if (!istype(parrot_source)) - return - - if (!user.transferItemToLoc(radio, source)) - return - - parrot_source.ears = radio - - to_chat(user, span_notice("You fit [radio] onto [source].")) - - parrot_source.available_channels.Cut() - - for (var/channel in radio.channels) - var/channel_to_add - - switch (channel) - if (RADIO_CHANNEL_ENGINEERING) - channel_to_add = RADIO_TOKEN_ENGINEERING - if (RADIO_CHANNEL_COMMAND) - channel_to_add = RADIO_TOKEN_COMMAND - if (RADIO_CHANNEL_SECURITY) - channel_to_add = RADIO_TOKEN_SECURITY - if (RADIO_CHANNEL_SCIENCE) - channel_to_add = RADIO_TOKEN_SCIENCE - if (RADIO_CHANNEL_MEDICAL) - channel_to_add = RADIO_TOKEN_MEDICAL - if (RADIO_CHANNEL_SUPPLY) - channel_to_add = RADIO_TOKEN_SUPPLY - if (RADIO_CHANNEL_SERVICE) - channel_to_add = RADIO_TOKEN_SERVICE - - if (channel_to_add) - parrot_source.available_channels += channel_to_add - - if (radio.translate_binary) - parrot_source.available_channels.Add(MODE_TOKEN_BINARY) - -/datum/strippable_item/parrot_headset/start_unequip(atom/source, mob/user) - . = ..() - if (!.) - return FALSE - - var/mob/living/simple_animal/parrot/parrot_source = source - if (!istype(parrot_source)) - return - - if (!parrot_source.stat) - parrot_source.say("[parrot_source.available_channels.len ? "[pick(parrot_source.available_channels)] " : null]BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") - - return TRUE - -/datum/strippable_item/parrot_headset/finish_unequip(atom/source, mob/user) - var/mob/living/simple_animal/parrot/parrot_source = source - if (!istype(parrot_source)) - return - - parrot_source.ears.forceMove(parrot_source.drop_location()) - parrot_source.ears = null - -/* - * Attack responces - */ -//Humans, monkeys, aliens -/mob/living/simple_animal/parrot/attack_hand(mob/living/carbon/user, list/modifiers) - ..() - if(client) - return - if(!stat && user.combat_mode) - - icon_state = icon_living //It is going to be flying regardless of whether it flees or attacks - - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - set_parrot_interest(user) - parrot_state = PARROT_SWOOP //The parrot just got hit, it WILL move, now to pick a direction.. - - if(health > 30) //Let's get in there and squawk it up! - parrot_state |= PARROT_ATTACK - else - parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell! - drop_held_item(0) - if(stat != DEAD && !user.combat_mode) - handle_automated_speech(1) //assured speak/emote - return - -/mob/living/simple_animal/parrot/attack_paw(mob/living/carbon/human/user, list/modifiers) - return attack_hand(user, modifiers) - -//Simple animals -/mob/living/simple_animal/parrot/attack_animal(mob/living/simple_animal/user, list/modifiers) - . = ..() //goodbye immortal parrots - if(client) - return - - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - if(. > 0 && stat == CONSCIOUS) - set_parrot_interest(user) - parrot_state = PARROT_SWOOP | PARROT_ATTACK //Attack other animals regardless - icon_state = icon_living - -//Mobs with objects -/mob/living/simple_animal/parrot/attackby(obj/item/O, mob/living/user, params) - if(!stat && !client && !istype(O, /obj/item/stack/medical) && !istype(O, /obj/item/food/cracker)) - if(O.force) - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - set_parrot_interest(user) - parrot_state = PARROT_SWOOP - if(health > 30) //Let's get in there and squawk it up! - parrot_state |= PARROT_ATTACK - else - parrot_state |= PARROT_FLEE - icon_state = icon_living - drop_held_item(0) - else if(istype(O, /obj/item/food/cracker)) //Poly wants a cracker. - qdel(O) - if(health < maxHealth) - adjustBruteLoss(-10) - speak_chance *= 1.27 // 20 crackers to go from 1% to 100% - speech_shuffle_rate += 10 - to_chat(user, span_notice("[src] eagerly devours the cracker.")) - ..() - return - -//Bullets -/mob/living/simple_animal/parrot/bullet_act(obj/projectile/Proj) - . = ..() - if(!stat && !client) - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - set_parrot_interest(null) - parrot_state = PARROT_WANDER | PARROT_FLEE //Been shot and survived! RUN LIKE HELL! - //parrot_been_shot += 5 - icon_state = icon_living - drop_held_item(0) - -/mob/living/simple_animal/parrot/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) - if(!stat) //Birds can fly, fun fact. No I don't care that space doesn't have air. Space parrots bitch - return TRUE - return ..() -/* - * AI - Not really intelligent, but I'm calling it AI anyway. - */ -/mob/living/simple_animal/parrot/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - - //Sprite update for when a parrot gets pulled - if(pulledby && !stat && parrot_state != PARROT_WANDER) - if(buckled) - buckled.unbuckle_mob(src, TRUE) - buckled = null - icon_state = icon_living - parrot_state = PARROT_WANDER - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) - return - - -//-----SPEECH - /* Parrot speech mimickry! - Phrases that the parrot Hear()s get added to speach_buffer. - Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list. */ -/mob/living/simple_animal/parrot/handle_automated_speech() - ..() - if(speech_buffer.len && prob(speech_shuffle_rate)) //shuffle out a phrase and add in a new one - if(speak.len) - speak.Remove(pick(speak)) - - speak.Add(pick(speech_buffer)) - - -/mob/living/simple_animal/parrot/handle_automated_movement() - if(!isturf(src.loc) || !(mobility_flags & MOBILITY_MOVE) || buckled) - return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove) - - if(client && stat == CONSCIOUS && parrot_state != icon_living) - icon_state = icon_living - -//-----SLEEPING - if(parrot_state == PARROT_PERCH) - if(parrot_perch && parrot_perch.loc != src.loc) //Make sure someone hasn't moved our perch on us - if(parrot_perch in view(src)) - parrot_state = PARROT_SWOOP | PARROT_RETURN - icon_state = icon_living - return - else - parrot_state = PARROT_WANDER - icon_state = icon_living - return - - parrot_sleep_dur-- - if(parrot_sleep_dur) //Zzz - return - - else - //This way we only call the stuff below once every [sleep_max] ticks. - parrot_sleep_dur = parrot_sleep_max - - //Cycle through message modes for the headset - if(speak.len) - var/list/newspeak = list() - - if(available_channels.len && src.ears) - for(var/possible_phrase in speak) - - //50/50 chance to not use the radio at all - var/useradio = 0 - if(prob(50)) - useradio = 1 - - if((possible_phrase[1] in GLOB.department_radio_prefixes) && (copytext_char(possible_phrase, 2, 3) in GLOB.department_radio_keys)) - possible_phrase = "[useradio?pick(available_channels):""][copytext_char(possible_phrase, 3)]" //crop out the channel prefix - else - possible_phrase = "[useradio?pick(available_channels):""][possible_phrase]" - - newspeak.Add(possible_phrase) - - else //If we have no headset or channels to use, dont try to use any! - for(var/possible_phrase in speak) - if((possible_phrase[1] in GLOB.department_radio_prefixes) && (copytext_char(possible_phrase, 2, 3) in GLOB.department_radio_keys)) - possible_phrase = copytext_char(possible_phrase, 3) //crop out the channel prefix - newspeak.Add(possible_phrase) - speak = newspeak - - //Search for item to steal - set_parrot_interest(search_for_item()) - if(parrot_interest) - manual_emote("looks in [parrot_interest]'s direction and takes flight.") - parrot_state = PARROT_SWOOP | PARROT_STEAL - icon_state = icon_living - return - -//-----WANDERING - This is basically a 'I dont know what to do yet' state - else if(parrot_state == PARROT_WANDER) - //Stop movement, we'll set it later - SSmove_manager.stop_looping(src) - set_parrot_interest(null) - - //Wander around aimlessly. This will help keep the loops from searches down - //and possibly move the mob into a new are in view of something they can use - if(prob(90)) - step(src, pick(GLOB.cardinals)) - return - - if(!held_item && !parrot_perch) //If we've got nothing to do.. look for something to do. - var/atom/movable/AM = search_for_perch_and_item() //This handles checking through lists so we know it's either a perch or stealable item - if(AM) - if(isitem(AM) || isliving(AM)) //If stealable item - set_parrot_interest(AM) - manual_emote("turns and flies towards [parrot_interest].") - parrot_state = PARROT_SWOOP | PARROT_STEAL - return - else //Else it's a perch - parrot_perch = AM - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - return - - if(parrot_interest && (parrot_interest in view(src))) - parrot_state = PARROT_SWOOP | PARROT_STEAL - return - - if(parrot_perch && (parrot_perch in view(src))) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - else //Have an item but no perch? Find one! - parrot_perch = search_for_perch() - if(parrot_perch) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return -//-----STEALING - else if(parrot_state == (PARROT_SWOOP | PARROT_STEAL)) - SSmove_manager.stop_looping(src) - if(!parrot_interest || held_item) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - if(!(parrot_interest in view(src))) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - if(Adjacent(parrot_interest)) - - if(isliving(parrot_interest)) - steal_from_mob() - - else //This should ensure that we only grab the item we want, and make sure it's not already collected on our perch - if(!parrot_perch || parrot_interest.loc != parrot_perch.loc) - held_item = parrot_interest - parrot_interest.forceMove(src) - visible_message(span_notice("[src] grabs [held_item]!"), span_notice("You grab [held_item]!"), span_hear("You hear the sounds of wings flapping furiously.")) - - set_parrot_interest(null) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - SSmove_manager.move_to(src, parrot_interest, 1, parrot_speed) - if(isStuck()) - return - - return - -//-----RETURNING TO PERCH - else if(parrot_state == (PARROT_SWOOP | PARROT_RETURN)) - SSmove_manager.stop_looping(src) - if(!parrot_perch || !isturf(parrot_perch.loc)) //Make sure the perch exists and somehow isn't inside of something else. - parrot_perch = null - parrot_state = PARROT_WANDER - return - - if(Adjacent(parrot_perch)) - forceMove(parrot_perch.loc) - drop_held_item() - parrot_state = PARROT_PERCH - icon_state = icon_sit - return - - SSmove_manager.move_to(src, parrot_perch, 1, parrot_speed) - if(isStuck()) - return - - return - -//-----FLEEING - else if(parrot_state == (PARROT_SWOOP | PARROT_FLEE)) - SSmove_manager.stop_looping(src) - if(!parrot_interest || !isliving(parrot_interest)) //Sanity - parrot_state = PARROT_WANDER - - SSmove_manager.move_away(src, parrot_interest, 1, parrot_speed) - if(isStuck()) - return - - return - -//-----ATTACKING - else if(parrot_state == (PARROT_SWOOP | PARROT_ATTACK)) - - //If we're attacking a nothing, an object, a turf or a ghost for some stupid reason, switch to wander - if(!parrot_interest || !isliving(parrot_interest)) - set_parrot_interest(null) - parrot_state = PARROT_WANDER - return - - var/mob/living/L = parrot_interest - if(melee_damage_upper == 0) - melee_damage_upper = parrot_damage_upper - set_combat_mode(TRUE) - - //If the mob is close enough to interact with - if(Adjacent(parrot_interest)) - - //If the mob we've been chasing/attacking dies or falls into crit, check for loot! - if(L.stat) - set_parrot_interest(null) - if(!held_item) - held_item = steal_from_ground() - if(!held_item) - held_item = steal_from_mob() //Apparently it's possible for dead mobs to hang onto items in certain circumstances. - if(parrot_perch in view(src)) //If we have a home nearby, go to it, otherwise find a new home - parrot_state = PARROT_SWOOP | PARROT_RETURN - else - parrot_state = PARROT_WANDER - return - - attack_verb_continuous = pick("claws at", "chomps") - attack_verb_simple = pick("claw at", "chomp") - L.attack_animal(src)//Time for the hurt to begin! - //Otherwise, fly towards the mob! - else - SSmove_manager.move_to(src, parrot_interest, 1, parrot_speed) - if(isStuck()) - return - - return -//-----STATE MISHAP - else //This should not happen. If it does lets reset everything and try again - SSmove_manager.stop_looping(src) - set_parrot_interest(null) - parrot_perch = null - drop_held_item() - parrot_state = PARROT_WANDER - return - -/* - * Procs - */ - -/mob/living/simple_animal/parrot/proc/set_parrot_interest(atom/movable/shiny) - if(parrot_interest) - UnregisterSignal(parrot_interest, COMSIG_QDELETING) - parrot_interest = shiny - if(parrot_interest) - RegisterSignal(parrot_interest, COMSIG_QDELETING, PROC_REF(shiny_deleted)) - -/mob/living/simple_animal/parrot/proc/shiny_deleted(datum/source) - SIGNAL_HANDLER - set_parrot_interest(null) - -/mob/living/simple_animal/parrot/proc/isStuck() - //Check to see if the parrot is stuck due to things like windows or doors or windowdoors - if(parrot_lastmove) - if(parrot_lastmove == src.loc) - if(parrot_stuck_threshold >= ++parrot_stuck) //If it has been stuck for a while, go back to wander. - parrot_state = PARROT_WANDER - parrot_stuck = 0 - parrot_lastmove = null - return TRUE - else - parrot_lastmove = null - else - parrot_lastmove = src.loc - return FALSE - -/mob/living/simple_animal/parrot/proc/search_for_item() - var/item - for(var/atom/movable/AM in view(src)) - //Skip items we already stole or are wearing or are too big - if(parrot_perch && AM.loc == parrot_perch.loc || AM.loc == src) - continue - if(isitem(AM)) - var/obj/item/I = AM - if(I.w_class < WEIGHT_CLASS_SMALL) - item = I - else if(iscarbon(AM)) - var/mob/living/carbon/C = AM - for(var/obj/item/I in C.held_items) - if(I.w_class <= WEIGHT_CLASS_SMALL) - item = I - break - if(item) - if(!length(get_path_to(src, item))) // WHY DO WE DISREGARD THE PATH AHHHHHH - item = null - continue - return item - -/mob/living/simple_animal/parrot/proc/search_for_perch() - for(var/obj/O in view(src)) - for(var/path in desired_perches) - if(istype(O, path)) - return O - return null - -//This proc was made to save on doing two 'in view' loops seperatly -/mob/living/simple_animal/parrot/proc/search_for_perch_and_item() - for(var/atom/movable/AM in view(src)) - for(var/perch_path in desired_perches) - if(istype(AM, perch_path)) - return AM - - //Skip items we already stole or are wearing or are too big - if(parrot_perch && AM.loc == parrot_perch.loc || AM.loc == src) - continue - - if(isitem(AM)) - var/obj/item/I = AM - if(I.w_class <= WEIGHT_CLASS_SMALL) - return I - - if(iscarbon(AM)) - var/mob/living/carbon/C = AM - for(var/obj/item/I in C.held_items) - if(I.w_class <= WEIGHT_CLASS_SMALL) - return C - return null - - -/* - * Verbs - These are actually procs, but can be used as verbs by player-controlled parrots. - */ -/mob/living/simple_animal/parrot/proc/steal_from_ground() - set name = "Steal from ground" - set category = "Parrot" - set desc = "Grabs a nearby item." - - if(stat) - return -1 - - if(held_item) - to_chat(src, span_warning("You are already holding [held_item]!")) - return 1 - - for(var/obj/item/I in view(1,src)) - //Make sure we're not already holding it and it's small enough - if(I.loc != src && I.w_class <= WEIGHT_CLASS_SMALL) - - //If we have a perch and the item is sitting on it, continue - if(!client && parrot_perch && I.loc == parrot_perch.loc) - continue - - held_item = I - I.forceMove(src) - visible_message(span_notice("[src] grabs [held_item]!"), span_notice("You grab [held_item]!"), span_hear("You hear the sounds of wings flapping furiously.")) - return held_item - - to_chat(src, span_warning("There is nothing of interest to take!")) - return 0 - -/mob/living/simple_animal/parrot/proc/steal_from_mob() - set name = "Steal from mob" - set category = "Parrot" - set desc = "Steals an item right out of a person's hand!" - - if(stat) - return -1 - - if(held_item) - to_chat(src, span_warning("You are already holding [held_item]!")) - return 1 - - var/obj/item/stolen_item = null - - for(var/mob/living/carbon/C in view(1,src)) - for(var/obj/item/I in C.held_items) - if(I.w_class <= WEIGHT_CLASS_SMALL) - stolen_item = I - break - - if(stolen_item) - C.transferItemToLoc(stolen_item, src, TRUE) - held_item = stolen_item - visible_message(span_notice("[src] grabs [held_item] out of [C]'s hand!"), span_notice("You snag [held_item] out of [C]'s hand!"), span_hear("You hear the sounds of wings flapping furiously.")) - return held_item - - to_chat(src, span_warning("There is nothing of interest to take!")) - return 0 - -/mob/living/simple_animal/parrot/verb/drop_held_item_player() - set name = "Drop held item" - set category = "Parrot" - set desc = "Drop the item you're holding." - - if(stat) - return - - src.drop_held_item() - - return - -/mob/living/simple_animal/parrot/proc/drop_held_item(drop_gently = 1) - set name = "Drop held item" - set category = "Parrot" - set desc = "Drop the item you're holding." - - if(stat) - return -1 - - if(!held_item) - if(src == usr) //So that other mobs won't make this message appear when they're bludgeoning you. - to_chat(src, span_warning("You have nothing to drop!")) - return 0 - - -//parrots will eat crackers instead of dropping them - if(istype(held_item, /obj/item/food/cracker) && (drop_gently)) - qdel(held_item) - held_item = null - if(health < maxHealth) - adjustBruteLoss(-10) - manual_emote("[src] eagerly downs the cracker.") - return 1 - - - if(!drop_gently) - if(isgrenade(held_item)) - var/obj/item/grenade/G = held_item - G.forceMove(drop_location()) - G.detonate() - to_chat(src, span_danger("You let go of [held_item]!")) - held_item = null - return 1 - - to_chat(src, span_notice("You drop [held_item].")) - - held_item.forceMove(drop_location()) - held_item = null - return 1 - -/mob/living/simple_animal/parrot/proc/perch_player() - set name = "Sit" - set category = "Parrot" - set desc = "Sit on a nice comfy perch." - - if(stat || !client) - return - - if(icon_state == icon_living) - for(var/atom/movable/AM in view(src,1)) - for(var/perch_path in desired_perches) - if(istype(AM, perch_path)) - src.forceMove(AM.loc) - icon_state = icon_sit - parrot_state = PARROT_PERCH - return - to_chat(src, span_warning("There is no perch nearby to sit on!")) - return - -/mob/living/simple_animal/parrot/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(. && !stat && client && parrot_state == PARROT_PERCH) - parrot_state = PARROT_WANDER - icon_state = icon_living - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) - -/mob/living/simple_animal/parrot/proc/perch_mob_player() - set name = "Sit on Human's Shoulder" - set category = "Parrot" - set desc = "Sit on a nice comfy human being!" - - if(stat || !client) - return - - if(!buckled) - for(var/mob/living/carbon/human/H in view(src,1)) - if(H.has_buckled_mobs() && H.buckled_mobs.len >= H.max_buckled_mobs) //Already has a parrot, or is being eaten by a slime - continue - perch_on_human(H) - return - to_chat(src, span_warning("There is nobody nearby that you can sit on!")) - else - icon_state = icon_living - parrot_state = PARROT_WANDER - if(buckled) - to_chat(src, span_notice("You are no longer sitting on [buckled]'s shoulder.")) - buckled.unbuckle_mob(src, TRUE) - buckled = null - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) - - - -/mob/living/simple_animal/parrot/proc/perch_on_human(mob/living/carbon/human/H) - if(!H) - return - forceMove(get_turf(H)) - if(H.buckle_mob(src, TRUE)) - pixel_y = 9 - pixel_x = pick(-8,8) //pick left or right shoulder - icon_state = icon_sit - parrot_state = PARROT_PERCH - to_chat(src, span_notice("You sit on [H]'s shoulder.")) - - -/mob/living/simple_animal/parrot/proc/toggle_mode() - set name = "Toggle mode" - set category = "Parrot" - set desc = "Time to bear those claws!" - - if(stat || !client) - return - - if(combat_mode) - melee_damage_upper = 0 - set_combat_mode(FALSE) - else - melee_damage_upper = parrot_damage_upper - set_combat_mode(TRUE) - to_chat(src, span_notice("You will now [combat_mode ? "Harm" : "Help"] others.")) - return - -/mob/living/simple_animal/parrot/natural - spawn_headset = FALSE -/* - * Sub-types - */ -/mob/living/simple_animal/parrot/poly - name = "Poly" - desc = "Poly the Parrot. An expert on quantum cracker theory." - speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN MODSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE") - gold_core_spawnable = NO_SPAWN - speak_chance = 3 - - var/memory_saved = FALSE - var/rounds_survived = 0 - var/longest_survival = 0 - var/longest_deathstreak = 0 - - -/mob/living/simple_animal/parrot/poly/Initialize(mapload) - ears = new /obj/item/radio/headset/headset_eng(src) - if(SStts.tts_enabled) - voice = pick(SStts.available_speakers) - if(SStts.pitch_enabled) - if(findtext(voice, "Woman")) - pitch = 12 // up-pitch by one octave - else - pitch = 24 // up-pitch by 2 octaves - else - voice_filter = "rubberband=pitch=1.5" // Use the filter to pitch up if we can't naturally pitch up. - - available_channels = list(":e") - Read_Memory() - if(rounds_survived == longest_survival) - speak += pick("...[longest_survival].", "The things I've seen!", "I have lived many lives!", "What are you before me?") - desc += " Old as sin, and just as loud. Claimed to be [rounds_survived]." - speak_chance = 20 //His hubris has made him more annoying/easier to justify killing - add_atom_colour("#EEEE22", FIXED_COLOUR_PRIORITY) - else if(rounds_survived == longest_deathstreak) - speak += pick("What are you waiting for!", "Violence breeds violence!", "Blood! Blood!", "Strike me down if you dare!") - desc += " The squawks of [-rounds_survived] dead parrots ring out in your ears..." - add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY) - else if(rounds_survived > 0) - speak += pick("...again?", "No, It was over!", "Let me out!", "It never ends!") - desc += " Over [rounds_survived] shifts without a \"terrible\" \"accident\"!" - else - speak += pick("...alive?", "This isn't parrot heaven!", "I live, I die, I live again!", "The void fades!") - - . = ..() - - // Ensure 1 Poly exists - REGISTER_REQUIRED_MAP_ITEM(1, 1) - -/mob/living/simple_animal/parrot/poly/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) - Write_Memory(FALSE) - memory_saved = TRUE - ..() - -/mob/living/simple_animal/parrot/poly/death(gibbed) - if(HAS_TRAIT(src, TRAIT_DONT_WRITE_MEMORY)) - return ..() // Don't read memory either. - if(!memory_saved) - Write_Memory(TRUE) - if(rounds_survived == longest_survival || rounds_survived == longest_deathstreak || prob(0.666)) - var/mob/living/simple_animal/parrot/poly/ghost/G = new(loc) - if(mind) - mind.transfer_to(G) - else - G.key = key - return ..() - -/mob/living/simple_animal/parrot/poly/proc/Read_Memory() - if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new - var/savefile/S = new /savefile("data/npc_saves/Poly.sav") - S["phrases"] >> speech_buffer - S["roundssurvived"] >> rounds_survived - S["longestsurvival"] >> longest_survival - S["longestdeathstreak"] >> longest_deathstreak - fdel("data/npc_saves/Poly.sav") - else - var/json_file = file("data/npc_saves/Poly.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - speech_buffer = json["phrases"] - rounds_survived = json["roundssurvived"] - longest_survival = json["longestsurvival"] - longest_deathstreak = json["longestdeathstreak"] - if(!islist(speech_buffer)) - speech_buffer = list() - -/mob/living/simple_animal/parrot/poly/Write_Memory(dead, gibbed) - . = ..() - if(!.) - return - var/json_file = file("data/npc_saves/Poly.json") - var/list/file_data = list() - if(islist(speech_buffer)) - file_data["phrases"] = speech_buffer - if(dead) - file_data["roundssurvived"] = min(rounds_survived - 1, 0) - file_data["longestsurvival"] = longest_survival - if(rounds_survived - 1 < longest_deathstreak) - file_data["longestdeathstreak"] = rounds_survived - 1 - else - file_data["longestdeathstreak"] = longest_deathstreak - else - file_data["roundssurvived"] = max(rounds_survived, 0) + 1 - if(rounds_survived + 1 > longest_survival) - file_data["longestsurvival"] = rounds_survived + 1 - else - file_data["longestsurvival"] = longest_survival - file_data["longestdeathstreak"] = longest_deathstreak - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/mob/living/simple_animal/parrot/poly/ghost - name = "The Ghost of Poly" - desc = "Doomed to squawk the Earth." - color = "#FFFFFF77" - speak_chance = 20 - status_flags = GODMODE - sentience_type = SENTIENCE_BOSS //This is so players can't mindswap into ghost poly to become a literal god - incorporeal_move = INCORPOREAL_MOVE_BASIC - butcher_results = list(/obj/item/ectoplasm = 1) - -/mob/living/simple_animal/parrot/poly/ghost/Initialize(mapload) - memory_saved = TRUE //At this point nothing is saved - . = ..() - -/mob/living/simple_animal/parrot/poly/ghost/handle_automated_speech() - if(ismob(loc)) - return - ..() - -/mob/living/simple_animal/parrot/poly/ghost/handle_automated_movement() - if(isliving(parrot_interest)) - if(!ishuman(parrot_interest)) - set_parrot_interest(null) - else if(parrot_state == (PARROT_SWOOP | PARROT_ATTACK) && Adjacent(parrot_interest)) - SSmove_manager.move_to(src, parrot_interest, 0, parrot_speed) - Possess(parrot_interest) - ..() - -/mob/living/simple_animal/parrot/poly/ghost/proc/Possess(mob/living/carbon/human/H) - if(!ishuman(H)) - return - var/datum/disease/parrot_possession/P = new - P.parrot = src - forceMove(H) - H.ForceContractDisease(P, FALSE) - set_parrot_interest(null) - H.visible_message(span_danger("[src] dive bombs into [H]'s chest and vanishes!"), span_userdanger("[src] dive bombs into your chest, vanishing! This can't be good!")) - -#undef PARROT_PERCH -#undef PARROT_SWOOP -#undef PARROT_WANDER -#undef PARROT_STEAL -#undef PARROT_ATTACK -#undef PARROT_RETURN -#undef PARROT_FLEE diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 790f9312ea1..6136f8c8189 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -398,7 +398,7 @@ return TRUE if(ispath(MP, /mob/living/basic/bear)) return TRUE - if(ispath(MP, /mob/living/simple_animal/parrot)) + if(ispath(MP, /mob/living/basic/parrot)) return TRUE //Parrots are no longer unfinished! -Nodrak //Not in here? Must be untested! diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 9d2e200b672..51f6c65a856 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -641,10 +641,10 @@ /mob/living/basic/crab, /mob/living/basic/lizard, /mob/living/basic/mouse, + /mob/living/basic/parrot, /mob/living/basic/pet/dog/corgi, /mob/living/basic/pet/dog/pug, /mob/living/basic/pet/fox, - /mob/living/simple_animal/parrot/natural, /mob/living/simple_animal/pet/cat, ) for(var/counter in 1 to rand(1, 25)) diff --git a/code/modules/unit_tests/required_map_items.dm b/code/modules/unit_tests/required_map_items.dm index 39930afd822..5cbef645391 100644 --- a/code/modules/unit_tests/required_map_items.dm +++ b/code/modules/unit_tests/required_map_items.dm @@ -15,10 +15,11 @@ /datum/unit_test/required_map_items/proc/setup_expected_types() expected_types += subtypesof(/obj/item/stamp/head) expected_types += subtypesof(/obj/machinery/computer/department_orders) - expected_types += /obj/machinery/computer/communications - expected_types += /mob/living/carbon/human/species/monkey/punpun + + expected_types += /mob/living/basic/parrot/poly expected_types += /mob/living/basic/pet/dog/corgi/ian - expected_types += /mob/living/simple_animal/parrot/poly + expected_types += /mob/living/carbon/human/species/monkey/punpun + expected_types += /obj/machinery/computer/communications expected_types += /obj/machinery/drone_dispenser /datum/unit_test/required_map_items/Run() diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 5bc4e7d82b4..3066ed2f498 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -92,10 +92,6 @@ /mob/living/simple_animal/hostile/retaliate/goose/vomit, /mob/living/simple_animal/hostile/vatbeast, /mob/living/simple_animal/hostile/zombie, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/parrot/natural, - /mob/living/simple_animal/parrot/poly, - /mob/living/simple_animal/parrot/poly/ghost, /mob/living/simple_animal/pet, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/cat/_proc, diff --git a/tgstation.dme b/tgstation.dme index 6a47c073a52..a57a38ed139 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -856,6 +856,7 @@ #include "code\datums\ai\basic_mobs\basic_ai_behaviors\targeting.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\tipped_reaction.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\travel_towards.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\unbuckle_mob.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\ventcrawling.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\wounded_targeting.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\write_on_paper.dm" @@ -1081,6 +1082,7 @@ #include "code\datums\components\life_link.dm" #include "code\datums\components\light_eater.dm" #include "code\datums\components\ling_decoy_brain.dm" +#include "code\datums\components\listen_and_repeat.dm" #include "code\datums\components\lock_on_cursor.dm" #include "code\datums\components\lockable_storage.dm" #include "code\datums\components\magnet.dm" @@ -4597,6 +4599,15 @@ #include "code\modules\mob\living\basic\pets\dog\corgi.dm" #include "code\modules\mob\living\basic\pets\dog\dog_subtypes.dm" #include "code\modules\mob\living\basic\pets\dog\strippable_items.dm" +#include "code\modules\mob\living\basic\pets\parrot\_parrot.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_items.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_subtypes.dm" +#include "code\modules\mob\living\basic\pets\parrot\poly.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_ai\_parrot_controller.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_ai\ghost_parrot_controller.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parrot_hoarding.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parrot_perching.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parroting_action.dm" #include "code\modules\mob\living\basic\ruin_defender\flesh.dm" #include "code\modules\mob\living\basic\ruin_defender\living_floor.dm" #include "code\modules\mob\living\basic\ruin_defender\skeleton.dm" @@ -4846,7 +4857,6 @@ #include "code\modules\mob\living\silicon\robot\robot_say.dm" #include "code\modules\mob\living\simple_animal\animal_defense.dm" #include "code\modules\mob\living\simple_animal\damage_procs.dm" -#include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" #include "code\modules\mob\living\simple_animal\bot\bot_announcement.dm" diff --git a/tools/UpdatePaths/Scripts/79762_simple_to_basic_parrots.txt b/tools/UpdatePaths/Scripts/79762_simple_to_basic_parrots.txt new file mode 100644 index 00000000000..2f2e9c19a0f --- /dev/null +++ b/tools/UpdatePaths/Scripts/79762_simple_to_basic_parrots.txt @@ -0,0 +1,5 @@ +/mob/living/simple_animal/parrot : /mob/living/basic/parrot{@OLD} +/mob/living/simple_animal/parrot/natural : /mob/living/basic/parrot{@OLD} +/mob/living/simple_animal/parrot/poly : /mob/living/basic/parrot/poly{@OLD} + +