diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm new file mode 100644 index 0000000000000..971b958256862 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm @@ -0,0 +1,6550 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/light/warm/directional/east, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/disk/data, +/obj/item/disk/data{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/disk/data{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"ab" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/digital_clock/directional/west, +/obj/machinery/computer{ + dir = 4 + }, +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"ag" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/purple/corner, +/obj/item/kirbyplants/organic/plant22, +/obj/structure/sign/warning/biohazard/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"ah" = ( +/obj/effect/turf_decal/trimline/dark/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"al" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"aC" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/book/manual/wiki/cytology{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_y = 11; + pixel_x = -20 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"ba" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_vent, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/iron/dark/side, +/area/ruin/syndibiodome) +"bb" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"bu" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/item/toy/figure/syndie{ + pixel_x = -9; + pixel_y = 0 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"bv" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"bw" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/structure/flora/bush/reed/style_2, +/turf/open/water/jungle, +/area/ruin/syndibiodome) +"bz" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"bB" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/poddoor/shutters/window/indestructible{ + id = "bsyndidomRD"; + name = "Lockdown Shutters" + }, +/obj/structure/curtain/bounty, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"bC" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"bG" = ( +/obj/effect/turf_decal/trimline/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"bJ" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 8 + }, +/obj/structure/marker_beacon/yellow{ + pixel_x = -6; + pixel_y = -8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"bK" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"bR" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"cb" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"ck" = ( +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"cm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_vent, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"cu" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"cx" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/structure/fluff/fake_scrubber{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"cB" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/machinery/smartfridge/organ, +/obj/item/organ/internal/alien/resinspinner, +/obj/item/organ/internal/eyes/night_vision, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"cE" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/plasma/thirty, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"cG" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/structure/rack, +/obj/item/emergency_bed{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/emergency_bed{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/emergency_bed{ + pixel_x = 3; + pixel_y = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"cI" = ( +/obj/structure/door_assembly/door_assembly_highsecurity, +/obj/structure/fans/tiny, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"cJ" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"cN" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"cO" = ( +/obj/structure/flora/tree/pine/style_2, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"di" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/structure/flora/bush/flowers_pp/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"dk" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/structure/flora/rock/pile/jungle/style_4, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"dl" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"dJ" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/structure/fluff/fake_scrubber, +/obj/effect/turf_decal/trimline/purple/corner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"dS" = ( +/obj/machinery/door/airlock/hatch, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "biosurglockdown"; + name = "Surgery Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"ek" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/closet, +/obj/item/clothing/under/syndicate/bloodred/sleepytime, +/obj/structure/sign/poster/contraband/energy_swords/directional/west, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"el" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_vent, +/obj/effect/turf_decal/trimline/dark/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"eH" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_pp/style_3, +/obj/structure/flora/rock/pile/jungle/style_4, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"eK" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/ruin/syndibiodome) +"eL" = ( +/obj/structure/flora/tree/jungle/small/style_2, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"eM" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"eO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_scrubber, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"fc" = ( +/obj/structure/filingcabinet{ + pixel_x = 8; + pixel_y = 0 + }, +/obj/structure/filingcabinet{ + pixel_x = -8; + pixel_y = 0 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"fp" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"fI" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/obj/structure/marker_beacon/yellow{ + pixel_x = 4; + pixel_y = 8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"fO" = ( +/obj/structure/flora/bush/flowers_pp/style_3, +/obj/effect/decal/cleanable/blood/trails{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"fT" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"fU" = ( +/obj/machinery/door/firedoor, +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/highsecurity{ + name = "Syndicate Biodome Testing Facility" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"fV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/bed, +/obj/item/bedsheet/syndie, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"gf" = ( +/obj/effect/turf_decal/trimline/dark/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"gt" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/structure/flora/bush/reed/style_4{ + pixel_x = 3; + pixel_y = 2 + }, +/turf/open/water/jungle, +/area/ruin/syndibiodome) +"gu" = ( +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/misc/dirt/station, +/area/ruin/syndibiodome) +"gv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"gB" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"gH" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/gibspawner/generic, +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"gX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"ha" = ( +/obj/machinery/exoscanner, +/obj/structure/lattice/catwalk, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"he" = ( +/mob/living/basic/gorilla/genetics, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"hf" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"hj" = ( +/obj/effect/turf_decal/trimline/green/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"hm" = ( +/mob/living/basic/gorilla/genetics, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"hr" = ( +/obj/structure/flora/grass/jungle/b/style_3, +/obj/effect/gibspawner/human, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"hA" = ( +/obj/machinery/computer{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"hF" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/mob_spawn/corpse/human/geneticist, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"hK" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/structure/flora/rock/pile/jungle/style_4, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"hM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/closet/crate/bin{ + pixel_x = 0; + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"hQ" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/fluff/fake_scrubber{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark/corner{ + dir = 2 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"hR" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"hS" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"hU" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 4 + }, +/obj/item/kirbyplants/organic/plant22, +/obj/structure/sign/warning/biohazard/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"hZ" = ( +/obj/effect/gibspawner/human/bodypartless, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"ic" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"io" = ( +/obj/item/lead_pipe, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"ip" = ( +/obj/structure/hedge, +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"iq" = ( +/obj/structure/flora/rock/pile/style_random, +/mob/living/carbon/human/species/monkey/angry, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"ir" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"iG" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 1 + }, +/obj/effect/gibspawner/generic, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"iH" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/grass/jungle/b/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/leafy, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/marker_beacon/lime, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/structure/flora/bush/large{ + pixel_y = -4 + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndibiodome) +"iI" = ( +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"iS" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark/end, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/donk_co/directional/east, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"iV" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"iX" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"iZ" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"ja" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/surgery_tray/full, +/obj/item/clothing/gloves/latex/coroner{ + pixel_x = -1; + pixel_y = 8 + }, +/obj/item/clothing/mask/surgical{ + pixel_x = 6; + pixel_y = 10 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"jd" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/paper_bin, +/obj/item/pen/red{ + pixel_x = 5; + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"je" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"jp" = ( +/obj/structure/flora/bush/jungle/a/style_2, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"jv" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/fluff/fake_vent, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"jA" = ( +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"jQ" = ( +/turf/closed/indestructible/syndicate/nodiagonal, +/area/icemoon/surface/outdoors/noteleport) +"jR" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"jS" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 4 + }, +/obj/structure/marker_beacon/yellow{ + pixel_x = -7; + pixel_y = 9 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"jT" = ( +/obj/structure/mirror/directional/east, +/obj/machinery/light/small/dim/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"jV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/machinery/light/small/red/directional/west, +/obj/item/food/popcorn/salty{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/food/popcorn/caramel{ + pixel_x = 9; + pixel_y = 7 + }, +/turf/open/floor/carpet/black, +/area/ruin/syndibiodome) +"kb" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/machinery/chem_dispenser/drinks{ + dir = 4 + }, +/obj/machinery/button/door/directional/west{ + name = "Kitchen Shutter Control"; + id = "bdomekitch" + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"kd" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/structure/curtain/bounty, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"km" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/siding/wideplating/dark/end{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"kq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/red/directional/north, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"kt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/gibspawner/human/bodypartless, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"kw" = ( +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"kz" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"kA" = ( +/obj/effect/turf_decal/trimline/dark/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/decal/cleanable/blood/trails{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"kH" = ( +/obj/machinery/computer{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"kJ" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"kK" = ( +/obj/machinery/computer/operating{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/structure/fluff/fake_camera{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"kO" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"kQ" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"kX" = ( +/obj/machinery/computer{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"la" = ( +/obj/structure/table/wood, +/obj/item/paper/carbon{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/pen/red{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"lg" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/bodysposal/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"lh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/light/small/red/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/black, +/area/ruin/syndibiodome) +"lm" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/structure/curtain/bounty/start_closed, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"lx" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/machinery/dna_scannernew, +/obj/effect/mapping_helpers/broken_machine, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"lH" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"me" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/black, +/area/ruin/syndibiodome) +"my" = ( +/obj/effect/turf_decal/trimline/green/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"mA" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/grunge, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"mF" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"mK" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/syndibiodome) +"mV" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"mW" = ( +/obj/effect/spawner/random/trash, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"mZ" = ( +/turf/template_noop, +/area/template_noop) +"nk" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 8 + }, +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"nn" = ( +/obj/structure/hedge, +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"nx" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/water/jungle, +/area/ruin/syndibiodome) +"nH" = ( +/obj/structure/fluff/fake_scrubber{ + dir = 4 + }, +/obj/structure/chair/office/tactical{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"nO" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"nP" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/bush/flowers_pp/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"oc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wideplating/dark/corner, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"of" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"oj" = ( +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/effect/turf_decal/trimline/dark_red/line, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"oq" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"ox" = ( +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/effect/decal/cleanable/blood/trails{ + dir = 8 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/misc/dirt/station, +/area/ruin/syndibiodome) +"oA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/gibspawner/generic, +/obj/structure/fluff/fake_vent, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"oG" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 8 + }, +/obj/machinery/light/warm/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/gorilla/genetics, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"oH" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"oK" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/fluff/fake_camera{ + dir = 1 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"oQ" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "biosurglockdown"; + name = "Surgery Lockdown Shutters" + }, +/obj/structure/curtain/bounty/start_closed, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"oV" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/structure/microscope{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/petri_dish/random{ + pixel_x = 7; + pixel_y = 19 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"pg" = ( +/obj/structure/lattice, +/obj/structure/minecart_rail, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"pj" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/poddoor/shutters/window/indestructible{ + id = "biodomearmor"; + name = "Security Post Lockdown Shutters" + }, +/obj/structure/curtain/bounty, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"pA" = ( +/obj/machinery/computer{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"pE" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/hatch{ + name = "Observation Room" + }, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"pN" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"pY" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"qa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"qh" = ( +/obj/machinery/light/warm/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"qi" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"qp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/gibs/up, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/green, +/area/ruin/syndibiodome) +"qx" = ( +/obj/machinery/vending/cigarette/syndicate, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"qy" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"qz" = ( +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/decal/cleanable/blood/trails{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"qB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_scrubber{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"qC" = ( +/obj/structure/chair/office/tactical{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"qN" = ( +/turf/closed/indestructible/syndicate, +/area/ruin/syndibiodome) +"qU" = ( +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"qV" = ( +/obj/structure/flora/bush/flowers_yw/style_3, +/obj/structure/flora/bush/flowers_br/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"rs" = ( +/obj/effect/turf_decal/trimline/dark_red/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"rK" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/mob/living/carbon/human/species/monkey/angry, +/obj/machinery/light/warm/directional/north, +/obj/machinery/digital_clock/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"rQ" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/gorilla/genetics, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"rX" = ( +/obj/effect/turf_decal/siding/wideplating/dark/end{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"rZ" = ( +/obj/machinery/light/small/dim/directional/north, +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"si" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/structure/curtain/bounty/start_closed, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"sj" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_pp/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"sD" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"sJ" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark, +/obj/effect/decal/cleanable/blood/trails{ + dir = 6 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"sM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/gibspawner/generic, +/mob/living/basic/clown/mutant/glutton, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"sN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"sR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/bed/double, +/obj/item/bedsheet/syndie/double, +/turf/open/floor/carpet/green, +/area/ruin/syndibiodome) +"tb" = ( +/obj/machinery/vatgrower{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_machine, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"td" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"tk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"tq" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/item/toy/figure/syndie{ + pixel_x = 11; + pixel_y = -1 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"ts" = ( +/obj/effect/turf_decal/trimline/dark/line, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"tx" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"tK" = ( +/obj/effect/turf_decal/trimline/green/corner, +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"tL" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"ue" = ( +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant22, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"ui" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/obj/structure/fluff/fake_scrubber{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"up" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"uq" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"us" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"ux" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"uD" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"uE" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/machinery/reagentgrinder{ + pixel_x = -3; + pixel_y = 13 + }, +/obj/item/biopsy_tool{ + pixel_x = 24; + pixel_y = 5 + }, +/obj/item/swab{ + pixel_y = -8; + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/petri_dish/random{ + pixel_x = 5; + pixel_y = -1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"uG" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"uH" = ( +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/kirbyplants/organic/plant22, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"uL" = ( +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"uS" = ( +/obj/effect/mob_spawn/corpse/human/geneticist, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"uW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/gibspawner/human/bodypartless, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"vc" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"vg" = ( +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/obj/machinery/light/warm/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"vl" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = -6; + pixel_y = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/suit/hooded/explorer/syndicate{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/pickaxe/drill/diamonddrill{ + pixel_x = 0; + pixel_y = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"vs" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"vu" = ( +/obj/structure/flora/bush/flowers_br/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"vw" = ( +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"vx" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"vA" = ( +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"vF" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"vJ" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/gorilla/genetics, +/obj/effect/turf_decal/trimline/purple/corner, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"vK" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 8 + }, +/obj/structure/fluff/fake_vent, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"vN" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/trimline/dark_red/corner, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"vO" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark_red/line, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"vP" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"vZ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"wd" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/table/reinforced, +/obj/item/knife/butcher, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/glass/reinforced, +/area/ruin/syndibiodome) +"wf" = ( +/obj/structure/hedge, +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"wi" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -3; + pixel_y = 10 + }, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/gloves/latex{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/mask/surgical{ + pixel_x = 1; + pixel_y = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"ws" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mob_spawn/corpse/human/syndicatepilot, +/obj/effect/gibspawner/human/bodypartless, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"wx" = ( +/obj/machinery/computer/operating{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"wL" = ( +/obj/effect/gibspawner/human/bodypartless, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"wQ" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"wR" = ( +/obj/effect/mob_spawn/corpse/human/geneticist, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"wT" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/machinery/light/warm/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/gibspawner/human/bodypartless, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"wY" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"xd" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/water/jungle, +/area/ruin/syndibiodome) +"xf" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/computer{ + dir = 8 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"xh" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"xi" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"xj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/gibspawner/human/bodypartless, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"xk" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_vent, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"xn" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/effect/gibspawner/generic, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"xq" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark_red/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"xr" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/rock/pile/jungle, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"xx" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"xz" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/structure/flora/rock/pile/jungle/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"xB" = ( +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/gibspawner/human/bodypartless, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"xH" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"xL" = ( +/obj/effect/turf_decal/trimline/dark/line{ + dir = 1 + }, +/mob/living/carbon/human/species/monkey/angry, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"xN" = ( +/obj/structure/fluff/tram_rail/electric/anchor{ + dir = 1 + }, +/obj/structure/marker_beacon/burgundy{ + pixel_x = 1; + pixel_y = 6 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"xP" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark/corner, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/clock/directional/west, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"xZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/chair/comfy/shuttle, +/obj/machinery/button/door/directional/west{ + name = "Armory Lockdown"; + id = "biodomearmor" + }, +/turf/open/floor/carpet/green, +/area/ruin/syndibiodome) +"yd" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/flora/bush/flowers_pp/style_3, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"yi" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/bodypart/leg/right/skeleton, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"yj" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/structure/flora/bush/flowers_br/style_3, +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"ym" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/west, +/obj/effect/turf_decal/siding/wideplating/dark/end{ + dir = 8 + }, +/obj/structure/bodycontainer/crematorium/creamatorium{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"ys" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"yt" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigars{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/item/lighter{ + pixel_x = 13; + pixel_y = -2 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet/green, +/area/ruin/syndibiodome) +"yy" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"yH" = ( +/obj/effect/decal/cleanable/blood/splatter/over_window, +/obj/effect/decal/cleanable/blood/trails, +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "biosurglockdown"; + name = "Surgery Lockdown Shutters" + }, +/obj/structure/curtain/bounty/start_closed, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"yL" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/obj/machinery/digital_clock/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"yN" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"yU" = ( +/mob/living/carbon/human/species/monkey/angry, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"zc" = ( +/obj/structure/flora/rock/pile/style_3, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"zd" = ( +/obj/structure/fluff/tram_rail/end, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"ze" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/dresser, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"zl" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/light/warm/directional/east, +/obj/machinery/digital_clock/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"zu" = ( +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"zy" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"zD" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"zF" = ( +/obj/effect/turf_decal/trimline/green/corner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"zG" = ( +/obj/effect/turf_decal/trimline/dark/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"zI" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"zM" = ( +/turf/closed/indestructible/syndicate/nodiagonal, +/area/ruin/syndibiodome) +"zP" = ( +/obj/machinery/door/airlock/hatch{ + name = "Observation Room" + }, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"zT" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"Ab" = ( +/obj/machinery/door/airlock/hatch{ + name = "Surgery Room #1" + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "biosurglockdown"; + name = "Surgery Lockdown Shutters" + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Av" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/structure/curtain/bounty/start_closed, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"Aw" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"Ax" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Ay" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/bananium/five, +/obj/item/stack/sheet/mineral/bananium/five, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"AA" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/computer{ + dir = 4 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"AI" = ( +/obj/structure/fluff/tram_rail/end, +/obj/structure/marker_beacon/yellow{ + pixel_x = 7; + pixel_y = -9 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"AV" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/structure/closet/syndicate, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/belt/security/webbing, +/obj/item/storage/toolbox/syndicate, +/obj/item/gun/ballistic/automatic/pistol, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/ammo_box/magazine/m10mm, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Ba" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/keycard/blue{ + name = "Syndicate Research Directors Room Key" + }, +/obj/item/paperwork/research{ + pixel_x = 7; + pixel_y = 19 + }, +/obj/item/pen/red{ + pixel_x = 5; + pixel_y = 6 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Bl" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/structure/flora/bush/jungle/a/style_2, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Bo" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/decal/cleanable/blood/footprints, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"Br" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Bs" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/flora/bush/flowers_yw/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Bw" = ( +/obj/machinery/light/warm/directional/south, +/obj/effect/turf_decal/trimline/dark_red/corner{ + dir = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"By" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"BY" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Ct" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_red/corner{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"CG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch{ + name = "Security Post" + }, +/obj/machinery/door/poddoor/shutters/window/indestructible{ + id = "biodomearmor"; + name = "Security Post Lockdown Shutters" + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"CK" = ( +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"CS" = ( +/obj/structure/flora/grass/jungle/a/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"CV" = ( +/obj/structure/hedge, +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"CW" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Db" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/space_heater, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"Dc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/dresser, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"Dd" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark/end{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 4 + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"Dg" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"Dl" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"Do" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "biosurglockdown"; + name = "Surgery Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"Dr" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/fluff/fake_camera{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"DI" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/machinery/computer/scan_consolenew, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"DL" = ( +/obj/structure/dresser, +/obj/machinery/digital_clock/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"DS" = ( +/obj/effect/turf_decal/trimline/neutral/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Eq" = ( +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Es" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"Ex" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/machinery/light/warm/directional/west, +/obj/machinery/chem_master, +/obj/structure/sign/poster/contraband/communist_state/directional/west, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"EE" = ( +/mob/living/carbon/human/species/monkey/angry, +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"EO" = ( +/obj/machinery/griddle, +/obj/effect/mob_spawn/corpse/human/charredskeleton{ + pixel_x = 0; + pixel_y = 3 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/end{ + dir = 4 + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"EX" = ( +/obj/machinery/door/poddoor/shutters/window/indestructible{ + id = "biodomearmor"; + name = "Security Post Lockdown Shutters" + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/structure/curtain/bounty, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"EY" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Fd" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark/line, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"Fe" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark_red/line, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Fg" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/structure/flora/bush/flowers_pp/style_3, +/obj/structure/flora/rock/pile/jungle, +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Fl" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_scrubber{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Fn" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/grass/jungle/a/style_random, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Fp" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"FE" = ( +/obj/effect/turf_decal/trimline/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"FH" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/flora/bush/flowers_yw/style_3, +/obj/structure/flora/bush/flowers_br/style_3, +/obj/structure/flora/tree/jungle/small/style_6{ + pixel_x = -33; + pixel_y = -6 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"FL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/bed, +/obj/item/bedsheet/syndie, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"FP" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/turf/closed/indestructible/syndicate, +/area/ruin/syndibiodome) +"FT" = ( +/obj/structure/flora/grass/jungle/a/style_5, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"FW" = ( +/obj/effect/decal/cleanable/blood/gibs/down, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Ga" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"Gh" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/free_key/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Gm" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Gp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/gibspawner/generic, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"Gr" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/template_noop) +"Gx" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/obj/structure/marker_beacon/yellow{ + pixel_x = 6; + pixel_y = 8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"Gz" = ( +/obj/machinery/door/airlock/freezer{ + name = "Kitchen" + }, +/obj/machinery/door/poddoor/shutters/window/indestructible/preopen{ + name = "Syndicate Biodome Kitchen Shutters"; + id = "bdomekitch" + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"GA" = ( +/obj/structure/fake_stairs/wood/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"GD" = ( +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"GM" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Hi" = ( +/obj/structure/fluff/tram_rail/electric/anchor, +/obj/structure/marker_beacon/burgundy{ + pixel_x = 1; + pixel_y = -3 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"Hp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/sign/clock/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/black, +/area/ruin/syndibiodome) +"Hs" = ( +/obj/structure/flora/bush/flowers_br/style_3, +/obj/structure/flora/bush/flowers_yw/style_3, +/mob/living/carbon/human/species/monkey/angry, +/obj/effect/gibspawner/human/bodypartless, +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Hy" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/food/pizza/donkpocket{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/machinery/door/poddoor/shutters/window/indestructible/preopen{ + name = "Syndicate Biodome Kitchen Shutters"; + id = "bdomekitch" + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"HB" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/jungle, +/area/ruin/syndibiodome) +"Ia" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Ib" = ( +/obj/machinery/dna_scannernew, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/effect/mapping_helpers/broken_machine, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Ie" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/black, +/area/ruin/syndibiodome) +"If" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/structure/fluff/fake_scrubber, +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Ii" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/window/indestructible/preopen{ + name = "Syndicate Biodome Kitchen Shutters"; + id = "bdomekitch" + }, +/obj/effect/spawner/random/food_or_drink/salad{ + pixel_x = 0; + pixel_y = 5 + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"Ij" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark_red/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"IF" = ( +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/effect/turf_decal/siding/wideplating/dark/end{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"II" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"IR" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"IU" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/structure/flora/rock/pile/jungle/style_5, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Jg" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/railing/corner, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"Jk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fans/tiny, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark/line{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Jm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wideplating/dark/corner, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Jo" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/ruin/syndibiodome) +"Jz" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"JC" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/light/warm/directional/west, +/obj/machinery/door/poddoor/shutters/window/indestructible/preopen{ + name = "Syndicate Biodome Kitchen Shutters"; + id = "bdomekitch" + }, +/obj/effect/spawner/random/food_or_drink/jelly_donuts{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/effect/spawner/random/food_or_drink/jelly_donuts{ + pixel_x = 7; + pixel_y = 2 + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"JQ" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark_red/line, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"JU" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"JZ" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 8 + }, +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Ki" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"Kn" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Ks" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wideplating/dark/end{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"Kz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"KA" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"KE" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/toy/cards/deck/syndicate{ + pixel_x = 0; + pixel_y = 5 + }, +/obj/machinery/door/poddoor/shutters/window/indestructible/preopen{ + name = "Syndicate Biodome Kitchen Shutters"; + id = "bdomekitch" + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"KF" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"KS" = ( +/obj/structure/table/wood, +/obj/item/documents/syndicate{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/machinery/button/door/directional/west{ + name = "Window Shutter Control"; + id = "bsyndidomRD" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"KX" = ( +/obj/structure/chair/office/tactical{ + dir = 4 + }, +/obj/effect/gibspawner/human/bodypartless, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/ruin/syndibiodome) +"Lc" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/machinery/pdapainter/research, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/item/toy/figure/dsquad{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/item/toy/figure/syndie{ + pixel_x = 3; + pixel_y = -1 + }, +/obj/item/toy/figure/syndie{ + pixel_x = 5; + pixel_y = 10 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"Le" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"Lg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/closet/syndicate, +/obj/item/clothing/mask/gas/syndicate, +/obj/machinery/light/small/dim/directional/west, +/obj/item/polymorph_belt/functioning, +/obj/item/pen/edagger, +/obj/item/clothing/under/costume/schoolgirl/red, +/obj/structure/sign/poster/contraband/communist_state/directional/west, +/turf/open/floor/carpet/green, +/area/ruin/syndibiodome) +"Lm" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/machinery/computer{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Lv" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/obj/machinery/light/warm/dim/directional/north, +/turf/open/floor/stone, +/area/ruin/syndibiodome) +"Ly" = ( +/obj/structure/aquarium/prefilled, +/obj/structure/sign/poster/contraband/blood_geometer/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"LA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"LB" = ( +/obj/machinery/doppler_array, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"LH" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"LJ" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"LN" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"LR" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mob_spawn/corpse/human/skeleton, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"LT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/cup/bucket, +/obj/item/pushbroom, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"LU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"Mb" = ( +/obj/machinery/door/firedoor, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Biodome Entrance" + }, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"Mc" = ( +/obj/structure/hedge, +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"Ml" = ( +/obj/effect/decal/cleanable/blood/splatter/over_window, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"Mo" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"Mp" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 6 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"Mr" = ( +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"Mt" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/item/folder/syndicate/red{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/machinery/light/warm/directional/east, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/obj/item/reagent_containers/cup/tube{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/tube{ + pixel_x = 0; + pixel_y = 2 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Mu" = ( +/obj/structure/flora/tree/jungle/style_6, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"MB" = ( +/obj/effect/mob_spawn/corpse/human/doctor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"MH" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"MK" = ( +/obj/machinery/light/small/dim/directional/south, +/obj/effect/turf_decal/siding/wideplating/dark/end, +/obj/item/toy/plush/nukeplushie, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"MM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"MO" = ( +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/misc/dirt/station, +/area/ruin/syndibiodome) +"MP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/north, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"MR" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_red/line, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"MU" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/mob/living/carbon/human/species/monkey/angry, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark/line, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"MX" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/machinery/computer/scan_consolenew{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Nj" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/grass/jungle/b/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/leafy, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/marker_beacon/lime, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/structure/flora/bush/large{ + pixel_y = -4 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndibiodome) +"Nl" = ( +/obj/machinery/light/warm/dim/directional/west, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/syndibiodome) +"No" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/glass/reinforced, +/area/ruin/syndibiodome) +"Ns" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"Nt" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"NB" = ( +/obj/effect/turf_decal/trimline/neutral/line, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"NE" = ( +/obj/machinery/light/warm/directional/east, +/obj/machinery/vending/dinnerware, +/obj/effect/turf_decal/siding/thinplating_new/dark/end{ + dir = 1 + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"NH" = ( +/obj/structure/flora/bush/flowers_pp/style_3, +/obj/structure/flora/bush/flowers_yw, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/mob/living/basic/gorilla/genetics, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"NN" = ( +/obj/structure/flora/grass/jungle/b/style_2, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"NP" = ( +/obj/effect/turf_decal/trimline/dark_red/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Oi" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/effect/gibspawner/generic, +/obj/machinery/digital_clock/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Ol" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/line, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Os" = ( +/obj/structure/bodycontainer/morgue/beeper_off{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/tram/filled, +/turf/open/floor/pod/dark, +/area/ruin/syndibiodome) +"Oy" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/poddoor/shutters/indestructible{ + name = "Cytology Shutters" + }, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"OD" = ( +/mob/living/carbon/human/species/monkey/angry, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"OH" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 8 + }, +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"OI" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"OK" = ( +/obj/machinery/light/small/dim/directional/south, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"OL" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/structure/closet/syndicate, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/warm/directional/east, +/obj/item/storage/belt/security/webbing, +/obj/item/gun/ballistic/automatic/pistol/contraband, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/ammo_box/magazine/m10mm, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"OM" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark/corner, +/obj/structure/sign/poster/contraband/free_drone/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"ON" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"OO" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/machinery/light/small/dim/directional/south, +/obj/effect/turf_decal/trimline/dark/line, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"OR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/closet, +/obj/item/clothing/under/syndicate/bloodred/sleepytime, +/obj/item/pillow, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"Pq" = ( +/obj/machinery/door/poddoor/shutters{ + name = "Biodome Transport Shutters" + }, +/obj/machinery/door/firedoor, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"Pw" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/surgery_tray/full, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/item/clothing/mask/surgical{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/clothing/gloves/latex{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/item/mmi/syndie{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/clothing/gloves/latex/coroner{ + pixel_x = 0; + pixel_y = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"PB" = ( +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"PC" = ( +/obj/structure/hedge, +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"PM" = ( +/obj/structure/flora/grass/jungle/a/style_2, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"PY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Qc" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/poddoor/shutters/window/indestructible{ + id = "biodomearmor"; + name = "Security Post Lockdown Shutters" + }, +/obj/structure/curtain/bounty/start_closed, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"Qn" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Qs" = ( +/obj/machinery/door/airlock/hatch{ + name = "Surgical Observation Room #1" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"QC" = ( +/obj/effect/turf_decal/trimline/dark/corner{ + dir = 2 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"QE" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"QG" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"QM" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/light/small/dim/directional/north, +/obj/effect/turf_decal/siding/wideplating/dark/end{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"QS" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Ra" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/machinery/light/warm/directional/north, +/obj/item/bodypart/head/monkey, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Ro" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/toolcloset, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"Rv" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Biodome Entrance" + }, +/obj/machinery/door/firedoor, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"RG" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/structure/flora/bush/flowers_yw/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"RH" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/item/bodypart/leg/left/monkey, +/obj/item/bodypart/leg/right/monkey, +/obj/item/scalpel/advanced, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"RK" = ( +/mob/living/carbon/human/species/monkey/angry, +/obj/structure/chair/office/tactical{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/side{ + dir = 6 + }, +/area/ruin/syndibiodome) +"RL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy{ + pixel_x = 1; + pixel_y = 6 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"RX" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/mob/living/basic/gorilla/genetics, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Se" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/structure/flora/bush/flowers_pp/style_3, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Sr" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Ss" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/machinery/light/warm/directional/west, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"St" = ( +/obj/structure/fans/tiny, +/obj/structure/door_assembly/door_assembly_grunge, +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Sv" = ( +/obj/effect/spawner/random/trash, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"SA" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"SE" = ( +/obj/machinery/oven/range, +/obj/effect/turf_decal/siding/thinplating_new/dark/end{ + dir = 8 + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"SH" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"SJ" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/door/airlock/hatch{ + name = "Genetic Testing" + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"SK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"SM" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"SO" = ( +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"SS" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/structure/flora/bush/flowers_br/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"ST" = ( +/obj/structure/flora/grass/jungle/a/style_random, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"SY" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Tc" = ( +/obj/structure/hedge, +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"Te" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/puzzle/keycard/blue_required{ + name = "Syndicate Research Director's Office" + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Tf" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_scrubber{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 6 + }, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/ruin/syndibiodome) +"Tu" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/item/folder/syndicate{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/food/grown/banana/bunch{ + pixel_x = 7; + pixel_y = 5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Tw" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Tx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"Ty" = ( +/obj/effect/turf_decal/trimline/dark/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/decal/cleanable/blood/trails{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"TC" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/decal/cleanable/blood/gibs/down, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"TF" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/item/food/meat/rawcutlet/bear, +/obj/item/food/meat/rawcutlet/bear, +/obj/item/food/meat/rawbacon, +/obj/item/food/meat/rawbacon, +/obj/item/food/meat/rawbacon, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"TJ" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"TL" = ( +/obj/structure/chair/office/tactical, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"TM" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"TQ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"Uc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/fluff/fake_vent, +/obj/effect/gibspawner/generic, +/turf/open/floor/carpet/green, +/area/ruin/syndibiodome) +"Ug" = ( +/obj/structure/flora/bush/flowers_pp/style_3, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Uh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/gibspawner/human/bodypartless, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"Ui" = ( +/obj/structure/rack, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/item/pickaxe/drill, +/obj/item/pickaxe/drill{ + pixel_x = 0; + pixel_y = 8 + }, +/obj/item/pickaxe/drill{ + pixel_x = 1; + pixel_y = -6 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Ut" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor/iron_dark, +/area/ruin/syndibiodome) +"Uu" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"Ux" = ( +/mob/living/basic/gorilla/genetics, +/obj/effect/gibspawner/human/bodypartless, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Uz" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/structure/desk_bell{ + pixel_x = 15; + pixel_y = 7 + }, +/obj/machinery/door/poddoor/shutters/window/indestructible/preopen{ + name = "Syndicate Biodome Kitchen Shutters"; + id = "bdomekitch" + }, +/obj/effect/spawner/random/food_or_drink/soup{ + pixel_x = 0; + pixel_y = 4 + }, +/turf/open/floor/iron/white/small, +/area/ruin/syndibiodome) +"UF" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"UG" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"UI" = ( +/obj/item/flashlight/lantern/on, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"UK" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/computer_disk{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/computer_disk{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/button/door/directional/east{ + name = "Surgery Lockdown"; + id = "biosurglockdown" + }, +/obj/item/assembly/shock_kit{ + pixel_x = -2; + pixel_y = 2 + }, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"UL" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/structure/flora/bush/flowers_pp/style_3, +/obj/effect/decal/cleanable/blood/trails{ + dir = 8 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"UN" = ( +/obj/structure/fluff/tram_rail/electric/anchor{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"UW" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/structure/closet/crate/bin{ + pixel_x = 0; + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"Va" = ( +/obj/machinery/door/airlock/hatch{ + name = "Surgical Observation Room #2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"Vj" = ( +/obj/structure/closet/secure_closet/cytology, +/obj/item/storage/box/swab, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"Vt" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"Vv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Vw" = ( +/obj/effect/decal/cleanable/blood/gibs/down, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"VG" = ( +/obj/machinery/light/warm/directional/east, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/syndibiodome) +"VJ" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 9 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"VK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/red/directional/north, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"VN" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"VT" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen, +/obj/effect/decal/cleanable/blood/trails{ + dir = 8 + }, +/obj/structure/fans/tiny, +/turf/open/misc/dirt/station, +/area/ruin/syndibiodome) +"Wq" = ( +/obj/structure/flora/tree/pine/style_random{ + pixel_x = -15; + pixel_y = -12 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"Wz" = ( +/obj/structure/fluff/tram_rail/electric/anchor, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"WB" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"WC" = ( +/obj/machinery/door/poddoor/shutters{ + name = "Lockdown Shutters" + }, +/obj/machinery/door/firedoor, +/obj/structure/fans/tiny, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark/line{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"WH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"WJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/glass/reinforced, +/area/ruin/syndibiodome) +"WR" = ( +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Xa" = ( +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/noteleport) +"Xt" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/machinery/light/small/dim/directional/west, +/turf/open/water/jungle, +/area/ruin/syndibiodome) +"XC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"XE" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/mob/living/basic/gorilla/genetics, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"XG" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/bush/flowers_pp/style_2, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"XM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/showcase/machinery/tv/broken, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/black, +/area/ruin/syndibiodome) +"Ya" = ( +/obj/effect/turf_decal/trimline/neutral/corner, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Yd" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/ruin/syndibiodome) +"Ye" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"Yh" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/syndibiodome) +"Yi" = ( +/obj/structure/flora/grass/jungle/a/style_5, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Yj" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/ruin/syndibiodome) +"Yz" = ( +/obj/structure/flora/bush/flowers_pp/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"YD" = ( +/obj/structure/flora/bush/flowers_yw/style_3, +/obj/structure/flora/bush/jungle/c/style_2{ + pixel_x = -11; + pixel_y = -6 + }, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"YG" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = 0; + pixel_y = -2 + }, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = 11; + pixel_y = 5 + }, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = -6; + pixel_y = 5 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/item/clothing/suit/hooded/explorer/syndicate{ + pixel_x = 0; + pixel_y = -3 + }, +/obj/item/clothing/suit/hooded/explorer/syndicate{ + pixel_x = 7; + pixel_y = -5 + }, +/obj/item/clothing/suit/hooded/explorer/syndicate{ + pixel_x = -8; + pixel_y = -4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"YI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"YN" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/closed/indestructible/syndicate, +/area/ruin/syndibiodome) +"YS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/small, +/area/ruin/syndibiodome) +"YV" = ( +/obj/effect/turf_decal/trimline/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"YZ" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/mob/living/basic/gorilla/genetics, +/obj/structure/fluff/fake_vent, +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/gibspawner/human/bodypartless, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"Zd" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/rock/pile/jungle/style_3, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Ze" = ( +/obj/machinery/door/airlock/hatch{ + name = "Observation Room" + }, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"Zf" = ( +/obj/structure/flora/bush/flowers_yw/style_3, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/ruin/syndibiodome) +"Zp" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"ZD" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndibiodome) +"ZM" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndibiodome) +"ZR" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/noteleport) +"ZT" = ( +/obj/machinery/light/warm/directional/south, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/syndibiodome) +"ZW" = ( +/obj/structure/curtain/bounty, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/ruin/syndibiodome) + +(1,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +ys +ys +KA +Ns +Ns +JU +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(2,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +ys +ys +ys +zM +zT +zM +ys +tL +JU +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(3,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +ys +ys +ys +zM +zM +IF +zM +zM +LN +tL +UG +UG +JU +ys +mZ +mZ +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(4,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +ys +ys +ck +ys +ys +zM +QM +VJ +MK +zM +ys +ys +ys +ck +zD +ys +ys +ys +ck +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(5,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +ys +ys +ys +ys +ys +zM +zM +zM +OH +zM +zM +zM +ys +ys +LN +tL +JU +ys +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(6,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +ys +ys +ys +ys +zM +zM +zM +zM +Tc +bb +ui +oq +Mc +zM +zM +mK +ys +ys +tL +Ns +Ns +JU +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(7,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +ys +ck +ys +ys +zM +Ut +vx +xi +kw +wL +xi +xH +ZD +oq +zM +zM +ys +ys +ys +ys +ck +tL +JU +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(8,1,1) = {" +mZ +mZ +mZ +mZ +mZ +ys +ys +ys +Hi +zM +zM +mW +zM +Sr +zM +Ui +zl +YG +qN +Ux +Bw +zM +zM +zM +zM +qN +ys +LN +Aw +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(9,1,1) = {" +mZ +mZ +mZ +mZ +ys +ys +jS +ys +ys +zM +Ut +Ut +zM +Sr +zM +zM +zM +zM +qN +Gm +NP +OI +zM +AA +ab +zM +qN +ys +Aw +ys +LN +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(10,1,1) = {" +mZ +mZ +mZ +ys +Wz +RL +pg +pg +zM +zM +Ut +zM +zM +Ab +zM +Lm +kX +zM +qN +WH +JQ +vN +pj +UF +fT +Ly +Qc +ys +Aw +ys +ys +cO +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(11,1,1) = {" +mZ +mZ +mZ +ys +ys +bJ +zd +ys +zM +Db +Ut +zM +kK +MB +oQ +Jo +eK +bC +Tw +EE +oj +MR +CG +hZ +hm +LB +Qc +ys +tL +JU +ys +ys +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(12,1,1) = {" +mZ +mZ +mZ +Wz +ha +pg +pg +pg +zM +ic +Ut +zM +rK +YZ +yH +Tf +ba +Qs +ZM +WH +Fe +Ct +EX +YS +qB +fc +Qc +ys +ys +tL +UG +JU +LN +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(13,1,1) = {" +mZ +mZ +mZ +ys +ys +Gx +uD +ys +zM +wY +Ut +zM +cB +ja +oQ +KX +RK +ZW +sD +Vw +jR +qx +zM +yi +LR +UK +zM +ys +cO +ys +ys +Aw +ys +ys +cO +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(14,1,1) = {" +mZ +mZ +mZ +ys +Wz +RL +pg +pg +zM +zM +mW +zM +zM +Os +zM +xf +oH +zM +qN +Tx +vO +qN +zM +OL +AV +zM +zM +ys +ys +LN +ys +Aw +ys +ys +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(15,1,1) = {" +mZ +mZ +mZ +ys +ys +ys +AI +ys +ys +zM +Ut +Ut +zM +zM +zM +zM +zM +zM +GM +Ax +Ij +ue +zM +zM +zM +zM +zM +zM +ys +ys +ys +tL +Ns +Ns +JU +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(16,1,1) = {" +mZ +mZ +mZ +mZ +ys +ys +ys +ck +Hi +zM +zM +Ut +LA +Ro +zM +qN +qU +Ss +YI +XC +Zp +rs +eO +PY +qh +tk +xq +zM +zM +ys +ys +ys +ys +ys +tL +JU +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(17,1,1) = {" +mZ +mZ +mZ +mZ +mZ +ck +ys +ys +ys +ys +zM +zM +Ut +Ut +Ut +vx +je +kt +XC +Sr +tK +iV +VN +my +Sr +kw +FW +Sr +zM +zM +ys +cO +ys +LN +ys +Aw +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +"} +(18,1,1) = {" +mZ +mZ +mZ +mZ +mZ +ys +ys +zM +zM +zM +zM +zM +zM +zM +zM +YN +rQ +XC +nn +WB +qN +VT +Pq +qN +WB +ip +Sr +Sr +ux +zM +ys +ys +ys +ys +cO +Aw +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +"} +(19,1,1) = {" +mZ +mZ +mZ +mZ +ys +ys +zM +zM +Dd +Ex +kb +zM +km +SH +zM +wf +XC +nn +Ga +WB +hK +UL +bv +Fg +WB +WB +ip +Sr +vg +zM +ys +VG +ys +ys +ys +Aw +ys +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +"} +(20,1,1) = {" +mZ +mZ +mZ +ys +ys +zM +zM +xP +dl +cJ +tx +JC +lH +hQ +WB +FE +zF +Ml +WB +SS +jp +Hs +Yz +Yz +Bl +WB +WB +my +QS +zM +zM +zM +zM +ys +ys +Dg +Ns +uG +ys +ys +mZ +mZ +mZ +mZ +mZ +"} +(21,1,1) = {" +mZ +mZ +ys +ys +ys +lm +SE +Yd +No +No +yy +Uz +Yh +MU +iZ +ah +hS +qN +RG +MH +FT +hf +Yi +eH +Zf +di +qN +us +Sr +iH +qN +vl +zM +zM +eM +up +ys +TQ +uG +ys +mZ +mZ +mZ +mZ +mZ +"} +(22,1,1) = {" +mZ +mZ +ys +ys +ck +lm +nO +SA +WJ +wd +Mp +Hy +Vt +OO +WB +Ty +vc +Mb +iX +PB +NN +Mu +NH +xd +zc +yN +WB +xn +jA +QC +WC +zG +qy +cI +Bo +wQ +zy +UI +II +Xa +ys +mZ +mZ +mZ +mZ +"} +(23,1,1) = {" +mZ +mZ +ys +ys +ys +lm +EO +sJ +No +No +iG +KE +Vt +Fd +Ki +kA +vc +qN +oK +PB +Ug +xr +bw +HB +yd +XG +Le +If +cm +ts +qN +xL +BY +zM +Lv +ys +Wq +ys +zD +ys +mZ +mZ +mZ +mZ +mZ +"} +(24,1,1) = {" +mZ +mZ +mZ +ys +ys +zM +zM +Dr +Mo +gH +td +Ii +LJ +el +WB +YV +TC +Rv +Bs +Yz +ST +nP +nx +gt +PM +yN +MO +SM +Sr +gf +Jk +bG +fp +fU +bR +ys +ys +ys +Jg +ys +mZ +mZ +mZ +mZ +mZ +"} +(25,1,1) = {" +mZ +mZ +mZ +mZ +ys +ys +zM +zM +NE +TF +iS +Gz +rX +bz +qN +PC +Fl +qN +IU +vu +iq +YD +Fp +xz +vu +cN +qN +us +Vv +iH +qN +cu +zM +zM +vZ +JU +ys +KA +ZR +ys +mZ +mZ +mZ +mZ +mZ +"} +(26,1,1) = {" +mZ +mZ +mZ +mZ +ys +ys +zM +zM +zM +zM +zM +zM +qN +vx +qN +FP +hj +Yj +WB +LH +hr +CS +eL +qV +cN +WB +WB +GD +ux +zM +zM +zM +zM +ys +ys +vZ +Dl +ZR +ys +ys +mZ +mZ +mZ +mZ +mZ +"} +(27,1,1) = {" +mZ +mZ +mZ +mZ +ys +ck +zM +zM +mW +Ut +ir +Ut +Ut +Ut +vx +kw +Eq +CV +Yj +WB +yj +fO +sj +dk +WB +WB +wf +xi +vg +zM +ys +Nl +ys +ys +ys +ys +zD +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +"} +(28,1,1) = {" +mZ +mZ +mZ +ys +ys +ys +zM +MP +Ut +zM +zM +Ut +zM +zM +qN +QG +Sr +Eq +CV +WB +qN +ox +gu +qN +WB +wf +kO +Sr +QS +zM +xN +ys +ys +ys +ys +ys +tL +JU +ys +mZ +mZ +mZ +mZ +mZ +mZ +"} +(29,1,1) = {" +mZ +mZ +ys +ys +ys +ys +zM +qa +Ut +zM +zM +dS +zM +pA +qN +VK +Sr +LT +mF +hj +pN +JZ +nk +Jz +CK +uL +xi +jd +zM +zM +ys +ys +ck +ys +ys +ys +ys +xx +ys +mZ +mZ +mZ +mZ +mZ +mZ +"} +(30,1,1) = {" +mZ +ys +ys +ys +ys +zM +zM +Sv +Ut +zM +wx +RH +Do +UF +kd +WH +xi +Sr +Gh +xh +zI +qi +dJ +al +hR +QE +WR +zM +zM +ys +ys +ys +ys +ys +ys +ck +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(31,1,1) = {" +mZ +Gr +ck +ys +zM +zM +rZ +Ut +Ut +zM +Ra +RX +Do +sN +Va +bK +XC +By +zM +zM +Oy +Oy +zM +ag +vF +hU +zM +zM +zM +zM +ys +jS +ys +ys +ys +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(32,1,1) = {" +mZ +mZ +ys +zM +zM +zM +zM +zM +Ut +zM +Pw +Oi +Do +Uu +kd +gv +Vv +zM +zM +zM +uE +oV +zM +zM +Ze +zM +zM +Xt +Se +zM +pg +pg +RL +UN +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(33,1,1) = {" +mZ +ys +ys +zM +Lg +xZ +yt +zM +ON +zM +zM +zM +zM +qN +qN +kq +Vv +zM +ym +zM +aC +ws +Oy +kH +vK +hA +WB +yU +Zd +zM +ys +zd +bJ +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(34,1,1) = {" +mZ +ys +zM +zM +Uc +qp +sR +zM +Ut +Ut +LA +mW +Ut +vx +Nt +uW +Vv +qN +Ks +zM +tb +sM +Oy +hF +cx +kQ +WB +FH +Fn +zM +pg +pg +pg +ha +xN +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(35,1,1) = {" +mZ +ys +bB +KS +he +OK +zM +zM +zM +zM +zM +zM +zM +qN +pY +XC +XC +qN +Ut +zM +Vj +Uh +Oy +Tu +XE +Mt +WB +iX +OD +zM +ys +uD +fI +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(36,1,1) = {" +mZ +ys +bB +la +TM +Es +Te +Vv +OM +yL +CW +oG +Qn +uq +Vv +Kn +Vv +qN +Ut +qN +qN +zP +qN +qN +SJ +qN +zM +kz +zM +zM +pg +pg +RL +UN +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(37,1,1) = {" +mZ +ys +bB +DL +jT +Lc +zM +uH +EY +WJ +Ya +vw +vw +iI +Vv +Vv +Vv +qN +SK +KF +IR +kJ +wT +kJ +uS +gB +pE +cb +zM +ys +ys +AI +ys +ys +ys +ck +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(38,1,1) = {" +mZ +ys +zM +zM +zM +zM +zM +zM +zu +WJ +NB +zM +zM +zM +zM +Vv +zM +zM +LU +qN +lg +vP +wR +vJ +Ye +ZT +zM +zM +zM +xN +ys +ys +ys +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(39,1,1) = {" +mZ +ys +ys +Av +ze +hM +OR +zM +mV +WJ +Ol +zM +ek +Dc +zM +zM +zM +Mr +Ut +qN +Ia +vs +of +xj +TL +MX +zM +zM +ys +ys +ys +ys +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(40,1,1) = {" +mZ +ys +ys +Av +FL +Gp +jv +St +qz +WJ +DS +mA +MM +bu +zM +Kz +gX +Ut +Ut +zM +lx +qC +SY +xk +Jm +Ib +zM +ys +ys +ys +ys +ys +ck +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(41,1,1) = {" +mZ +Gr +ck +zM +zM +zM +tq +zM +SO +xB +vA +zM +oA +fV +zM +Db +io +Ut +cE +zM +DI +Br +nH +oc +cG +zM +zM +ys +ck +ys +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(42,1,1) = {" +mZ +mZ +ys +ys +ys +zM +zM +zM +zM +Nj +GA +zM +UW +zM +zM +qa +TJ +Ay +zM +zM +zM +wi +aa +Ba +zM +zM +ys +ys +ys +ys +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(43,1,1) = {" +mZ +mZ +mZ +ys +ys +ys +zM +zM +jV +Ie +lh +zM +zM +zM +zM +zM +zM +zM +zM +ys +jQ +zM +zM +zM +zM +ys +ys +ys +ys +ck +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(44,1,1) = {" +mZ +mZ +mZ +mZ +ys +ck +ys +zM +XM +me +Hp +zM +zM +ys +ys +ys +ys +ys +ys +ck +ys +ys +ys +ys +ck +ys +mZ +mZ +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(45,1,1) = {" +mZ +mZ +mZ +mZ +mZ +ys +ys +zM +si +si +si +zM +ys +mZ +mZ +ys +ys +ys +mZ +ys +mZ +mZ +mZ +ys +ys +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 1ecd393cc7d4d..6bf42240c855b 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -754,6 +754,7 @@ dir = 8 }, /obj/effect/decal/cleanable/blood, +/obj/item/crusher_trophy/retool_kit/ashenskull, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "mo" = ( diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 465d8fab85f23..b58883b285a9c 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -29069,12 +29069,6 @@ /turf/open/floor/iron, /area/station/security/prison/rec) "jUr" = ( -/obj/item/cigarette, -/obj/item/storage/fancy/cigarettes/cigpack_robust{ - pixel_y = 5; - pixel_x = 6 - }, -/obj/item/lighter, /obj/structure/sign/poster/official/random/directional/east, /obj/structure/table, /obj/effect/turf_decal/tile/neutral/opposingcorners{ @@ -29083,6 +29077,7 @@ /obj/effect/turf_decal/siding/thinplating_new{ dir = 6 }, +/obj/item/aquarium_kit, /turf/open/floor/iron/small, /area/station/hallway/secondary/service) "jUx" = ( @@ -34214,10 +34209,7 @@ /obj/effect/turf_decal/siding/thinplating_new{ dir = 4 }, -/obj/machinery/computer/order_console/cook{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, +/obj/machinery/fishing_portal_generator, /turf/open/floor/iron/small, /area/station/hallway/secondary/service) "lEJ" = ( @@ -40837,6 +40829,9 @@ /obj/effect/turf_decal/siding/thinplating_new{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/iron/small, /area/station/hallway/secondary/service) "nVx" = ( @@ -43165,7 +43160,6 @@ "oPh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 @@ -43174,6 +43168,9 @@ dir = 4 }, /obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, /turf/open/floor/iron/small, /area/station/hallway/secondary/service) "oPj" = ( @@ -48423,9 +48420,6 @@ /turf/open/floor/wood/parquet, /area/station/medical/psychology) "qDL" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 @@ -48436,7 +48430,10 @@ /obj/effect/turf_decal/siding/thinplating_new{ dir = 4 }, -/obj/effect/landmark/start/botanist, +/obj/machinery/computer/order_console/cook{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, /turf/open/floor/iron/small, /area/station/hallway/secondary/service) "qDN" = ( @@ -49653,9 +49650,6 @@ /area/station/maintenance/port/greater) "qYr" = ( /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, @@ -49666,6 +49660,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/small, /area/station/hallway/secondary/service) "qYv" = ( @@ -63696,6 +63691,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, +/obj/effect/landmark/start/botanist, /turf/open/floor/iron/small, /area/station/hallway/secondary/service) "vxM" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index da57feb278136..4200fe13d159d 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -12653,6 +12653,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/machinery/fishing_portal_generator, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) "ddg" = ( diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index ce8f714c0e456..6cbcb15e08eed 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -44654,14 +44654,7 @@ /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) "mYR" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen{ - pixel_x = -5 - }, -/obj/item/hand_labeler{ - pixel_y = -3 - }, +/obj/machinery/fishing_portal_generator, /turf/open/floor/wood, /area/station/hallway/secondary/service) "mZf" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 64fe3288fba40..865e1ea3444b7 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -8621,7 +8621,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/obj/item/storage/test_tube_rack/full, /turf/open/floor/iron, /area/station/hallway/primary/central) "dfh" = ( @@ -11724,29 +11723,10 @@ /turf/open/floor/iron/dark, /area/station/medical/medbay/central) "ejD" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/table, -/obj/item/stack/wrapping_paper, -/obj/item/paper_bin/carbon{ - pixel_y = 8; - pixel_x = 6 - }, -/obj/item/pen/fourcolor{ - pixel_y = 8; - pixel_x = 6 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/decal/cleanable/wrapping, -/obj/item/sales_tagger{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/item/dest_tagger{ - pixel_x = -2; - pixel_y = 4 - }, /turf/open/floor/iron, /area/station/cargo/sorting) "ejF" = ( @@ -12272,9 +12252,10 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 }, -/obj/machinery/computer/cargo/request{ +/obj/structure/chair{ dir = 1 }, +/obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/cargo/lobby) "esd" = ( @@ -16791,20 +16772,9 @@ /area/station/science/ordnance/storage) "gav" = ( /obj/structure/disposalpipe/segment, -/obj/structure/table, -/obj/machinery/photocopier{ - pixel_y = 9 - }, -/obj/item/paper/fluff{ - pixel_y = 8; - pixel_x = 4; - default_raw_text = "Next CT to photocopy their ass is getting thrown under the shuttle. I'm serious here.
- QM"; - name = "note" - }, /obj/machinery/newscaster/directional/east, -/obj/item/pen/screwdriver{ - pixel_x = 1; - pixel_y = 11 +/obj/machinery/modular_computer/preset/cargochat/cargo{ + dir = 8 }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -24327,15 +24297,13 @@ "iJK" = ( /obj/item/radio/intercom/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/plumbed{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/fishing_portal_generator, /turf/open/floor/iron, /area/station/hallway/secondary/service) "iKj" = ( @@ -30340,14 +30308,6 @@ dir = 8 }, /obj/machinery/camera/directional/west, -/obj/item/dest_tagger{ - pixel_x = -9; - pixel_y = 12 - }, -/obj/item/hand_labeler_refill{ - pixel_x = -11; - pixel_y = -3 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -31446,9 +31406,6 @@ /turf/open/floor/iron/dark, /area/station/command/gateway) "lcI" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, /obj/structure/extinguisher_cabinet/directional/north, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -38067,9 +38024,6 @@ /turf/open/floor/wood, /area/station/service/bar/backroom) "nxI" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, /obj/structure/railing{ dir = 4 }, @@ -39507,6 +39461,23 @@ }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) +"nZW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table, +/obj/item/paper_bin/carbon{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/item/pen/fourcolor{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/item/stack/wrapping_paper, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "oac" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -41858,9 +41829,6 @@ /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "oRx" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, /obj/effect/turf_decal/siding/white{ dir = 9 }, @@ -42828,8 +42796,8 @@ }, /obj/machinery/light/small/directional/north, /obj/structure/disposalpipe/segment, -/obj/structure/tank_holder/extinguisher, /obj/structure/sign/clock/directional/north, +/obj/machinery/photocopier, /turf/open/floor/iron, /area/station/cargo/sorting) "pke" = ( @@ -45828,7 +45796,6 @@ /area/station/construction/storage_wing) "qme" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/item/storage/test_tube_rack/full, /turf/open/floor/iron, /area/station/construction/storage_wing) "qmf" = ( @@ -49105,10 +49072,6 @@ /obj/effect/turf_decal/trimline/brown/line{ dir = 6 }, -/obj/effect/landmark/start/assistant, -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/cargo/lobby) @@ -49884,8 +49847,12 @@ /obj/machinery/light/directional/north, /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/modular_computer/preset/cargochat/cargo, /obj/structure/cable, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Cargo Office"; + name = "Cargo Office Fax Machine" + }, /turf/open/floor/iron, /area/station/cargo/sorting) "rGm" = ( @@ -50312,6 +50279,7 @@ /area/station/ai_monitored/turret_protected/aisat_interior) "rNA" = ( /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/station/cargo/sorting) "rNI" = ( @@ -50649,6 +50617,8 @@ "rUd" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/warning, /turf/open/floor/iron, /area/station/cargo/sorting) "rUo" = ( @@ -51382,7 +51352,10 @@ "sgZ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, -/obj/effect/spawner/structure/window, +/obj/machinery/computer/cargo/request{ + dir = 1 + }, +/obj/structure/window/spawner/directional/south, /turf/open/floor/plating, /area/station/cargo/sorting) "shl" = ( @@ -57887,13 +57860,13 @@ /area/station/security/mechbay) "uuW" = ( /obj/structure/table, -/obj/machinery/fax{ - fax_name = "Cargo Office"; - name = "Cargo Office Fax Machine" - }, /obj/item/papercutter{ - pixel_x = 8; - pixel_y = 8 + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/dest_tagger{ + pixel_x = 9; + pixel_y = 4 }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -58082,28 +58055,27 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/brown/opposingcorners, /obj/structure/table, /obj/machinery/light/directional/east, /obj/item/radio/intercom/directional/east, /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/item/stamp/granted{ +/obj/item/stamp/denied{ pixel_x = -7; - pixel_y = 4 + pixel_y = 10 }, -/obj/item/stamp/denied{ +/obj/item/stamp/granted{ pixel_x = -7; - pixel_y = 15 + pixel_y = -1 }, /obj/item/storage/box/lights/mixed{ pixel_x = 5; - pixel_y = 12 + pixel_y = 5 }, /obj/item/storage/box/lights/mixed{ pixel_x = 5; - pixel_y = 24 + pixel_y = 16 }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -62962,6 +62934,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/station/cargo/sorting) "wcf" = ( @@ -67906,6 +67879,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, +/obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/station/cargo/sorting) "xRR" = ( @@ -89489,7 +89463,7 @@ ryV mhM qCx cap -wbW +nZW wbW ygk hld diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index caa7913d2fc20..02b56e53a1e63 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -8037,6 +8037,7 @@ dir = 1 }, /obj/structure/stone_tile, +/obj/item/crusher_trophy/retool_kit/ashenskull, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "TJ" = ( diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index cafc8754cd887..2fc187c626d6d 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -86467,6 +86467,7 @@ /area/station/security/brig) "wms" = ( /obj/machinery/airalarm/directional/east, +/obj/machinery/fishing_portal_generator, /turf/open/floor/iron, /area/station/hallway/secondary/service) "wmt" = ( diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 9480252ff1386..9c97fd61253f4 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -14032,6 +14032,7 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 }, +/obj/machinery/fishing_portal_generator, /turf/open/floor/iron, /area/station/hallway/secondary/service) "dNB" = ( diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 8eca8d06b6112..c1d1929d4d27e 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -5209,6 +5209,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/exam_room) +"bQY" = ( +/obj/effect/turf_decal/tile/dark_green/opposingcorners, +/obj/machinery/fishing_portal_generator, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "bRl" = ( /obj/machinery/suit_storage_unit/captain{ req_access = list("captain") @@ -13201,8 +13206,8 @@ /turf/open/floor/iron, /area/station/engineering/main) "eFP" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, -/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/central/lesser) "eGn" = ( @@ -18088,6 +18093,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) +"gvs" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/dark_green/opposingcorners, +/obj/structure/cable, +/obj/structure/table, +/obj/item/aquarium_kit, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "gvw" = ( /turf/closed/wall, /area/station/command/heads_quarters/cmo) @@ -25270,14 +25283,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"jac" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central/lesser) "jaf" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green, @@ -25481,12 +25486,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron, /area/station/maintenance/department/cargo) -"jdP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/central/lesser) "jdW" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 @@ -31193,6 +31192,13 @@ /obj/machinery/light/directional/north, /turf/open/floor/circuit, /area/station/engineering/storage/tech) +"kYi" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/central/lesser) "kYk" = ( /obj/machinery/door/poddoor/shutters{ id = "secmechbay"; @@ -37544,6 +37550,12 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/exam_room) +"nki" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/central/lesser) "nkA" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 1 @@ -37637,11 +37649,6 @@ /obj/structure/marker_beacon/purple, /turf/open/space/basic, /area/space/nearstation) -"nmS" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/central/lesser) "nmX" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, /obj/structure/disposalpipe/segment, @@ -39249,6 +39256,11 @@ /obj/item/emergency_bed, /turf/open/floor/iron/white, /area/station/maintenance/aft/upper) +"nUL" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, +/turf/open/floor/plating, +/area/station/maintenance/central/lesser) "nUS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -41010,6 +41022,10 @@ /obj/machinery/meter, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) +"oEo" = ( +/obj/effect/turf_decal/tile/dark_green/opposingcorners, +/turf/closed/wall, +/area/station/hallway/secondary/service) "oEp" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -62533,6 +62549,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"wan" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/central/lesser) "war" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -63067,7 +63091,6 @@ /turf/open/floor/plating, /area/station/maintenance/department/engine) "wlf" = ( -/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /obj/effect/turf_decal/tile/dark_green/opposingcorners, /turf/open/floor/iron, @@ -91818,7 +91841,7 @@ acc tQF ewJ uFW -jrX +wan acc acc acc @@ -92073,9 +92096,9 @@ mbZ acc acc acc -acc +wMb eFP -jac +jrX kuP kuP kuP @@ -92330,9 +92353,9 @@ jrn acc nZY ihH -acc -acc -jrX +nUL +eFP +lIr lIr lIr lIr @@ -92587,10 +92610,10 @@ qpb acc jOD uFW -nmS uFW -jrX +nki lIr +bQY lHi dyX uWr @@ -92845,9 +92868,9 @@ mCo ewJ uFW jXL -uFW -jdP +kYi lIr +gvs wlf fvd cik @@ -93103,8 +93126,8 @@ acc jrX siG jrX -jrX lIr +oEo otA xlX bcX diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index 0c682f7d411a8..2b25d0cfb31e1 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -123,6 +123,18 @@ ///list of foods this mob likes #define BB_BASIC_FOODS "BB_basic_foods" +///key holding any food we've found +#define BB_TARGET_FOOD "BB_TARGET_FOOD" + +///key holding emotes we play after eating +#define BB_EAT_EMOTES "BB_eat_emotes" + +///key holding the next time we eat +#define BB_NEXT_FOOD_EAT "BB_next_food_eat" + +///key holding our eating cooldown +#define BB_EAT_FOOD_COOLDOWN "BB_eat_food_cooldown" + /// Blackboard key for a held item #define BB_SIMPLE_CARRY_ITEM "BB_SIMPLE_CARRY_ITEM" @@ -168,5 +180,4 @@ /// For /datum/ai_behavior/find_potential_targets, what if any field are we using currently #define BB_FIND_TARGETS_FIELD(type) "bb_find_targets_field_[type]" -///mothroach next meal key! -#define BB_MOTHROACH_NEXT_EAT "mothroach_next_eat" + diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm index 6696da857c8e3..12ddaa3a68af9 100644 --- a/code/__DEFINES/basic_mobs.dm +++ b/code/__DEFINES/basic_mobs.dm @@ -24,6 +24,9 @@ /// Above this speed we stop gliding because it looks silly #define END_GLIDE_SPEED 10 +///hunger cooldown for basic mobs +#define EAT_FOOD_COOLDOWN 45 SECONDS + ///mook attack status flags #define MOOK_ATTACK_NEUTRAL 0 #define MOOK_ATTACK_WARMUP 1 diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index 18d0a3c7cb87c..19af74fe43db2 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -43,3 +43,7 @@ #define AUGGED_CHEST_EMP_SHAKE_TIME 5 SECONDS /// When hit by an EMP, the time an augged head will make vision fucky for. #define AUGGED_HEAD_EMP_GLITCH_DURATION 6 SECONDS + +// Color priorities for bodyparts +#define LIMB_COLOR_HULK 10 +#define LIMB_COLOR_CARP_INFUSION 20 diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index a9cc41b7d8d8d..53ac323b61cd5 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -15,6 +15,8 @@ /// from /obj/obj_reskin: (mob/user, skin) #define COMSIG_OBJ_RESKIN "obj_reskin" +#define COMSIG_LIONHUNTER_ON_HIT "lionhunter_on_hit" + // /obj/machinery signals ///from /obj/machinery/atom_break(damage_flag): (damage_flag) diff --git a/code/__DEFINES/dcs/signals/signals_spell.dm b/code/__DEFINES/dcs/signals/signals_spell.dm index 08074116be2c3..ebbdcc4e2bee1 100644 --- a/code/__DEFINES/dcs/signals/signals_spell.dm +++ b/code/__DEFINES/dcs/signals/signals_spell.dm @@ -66,6 +66,10 @@ // Touch spells /// Sent from /datum/action/cooldown/spell/touch/do_hand_hit: (atom/hit, mob/living/carbon/caster, obj/item/melee/touch_attack/hand) #define COMSIG_SPELL_TOUCH_HAND_HIT "spell_touch_hand_cast" +/// Sent from /datum/action/cooldown/spell/touch/cast: (mob/living/carbon/cast_on) +#define COMSIG_TOUCH_HANDLESS_CAST "spell_touch_handless_cast" + /// Return this to prevent the hand spawning/unspawning + #define COMPONENT_CAST_HANDLESS (1<<0) // Jaunt Spells /// Sent from datum/action/cooldown/spell/jaunt/before_cast, before the mob enters jaunting as a pre-check: (datum/action/cooldown/spell/spell) diff --git a/code/__DEFINES/living.dm b/code/__DEFINES/living.dm index 340bf3608bb5d..2ac320abdecc7 100644 --- a/code/__DEFINES/living.dm +++ b/code/__DEFINES/living.dm @@ -4,6 +4,12 @@ /// Always does *deathgasp when they die /// If unset mobs will only deathgasp if supplied a death sound or custom death message #define ALWAYS_DEATHGASP (1<<1) +/** + * For carbons, this stops bodypart overlays being added to bodyparts from calling mob.update_body_parts(). + * This is useful for situations like initialization or species changes, where + * update_body_parts() is going to be called ONE time once everything is done. + */ +#define STOP_OVERLAY_UPDATE_BODY_PARTS (1<<2) /// Getter for a mob/living's lying angle, otherwise protected #define GET_LYING_ANGLE(mob) (UNLINT(mob.lying_angle)) diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index 83c7cdd265af0..3cf7548cfc53a 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -29,9 +29,6 @@ // Cyborg defines -/// If an item does this or more throwing damage it will slow a borg down on hit -#define CYBORG_THROW_SLOWDOWN_THRESHOLD 10 - /// Special value to reset cyborg's lamp_cooldown #define BORG_LAMP_CD_RESET -1 /// How many watts per lamp power is consumed while the lamp is on. diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index fcd96cf7a2fe4..5e5945a86d983 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -200,3 +200,14 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_PIG_OINK "pig_oink" #define SFX_VISOR_UP "visor_up" #define SFX_VISOR_DOWN "visor_down" +#define SFX_SIZZLE "sizzle" +#define SFX_GROWL "growl" +#define SFX_POLAROID "polaroid" +#define SFX_HALLUCINATION_TURN_AROUND "hallucination_turn_around" +#define SFX_HALLUCINATION_I_SEE_YOU "hallucination_i_see_you" +#define SFX_HALLUCINATION_OVER_HERE "hallucination_over_here" +#define SFX_HALLUCINATION_I_M_HERE "hallucination_i_m_here" +#define SFX_VOID_DEFLECT "void_deflect" +#define SFX_LOW_HISS "low_hiss" + +#define SFX_INDUSTRIAL_SCAN "industrial_scan" diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index beb2b98944bc0..8b3ac10f950b2 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -293,8 +293,6 @@ /// Trait from an organ being inside a bodypart #define ORGAN_INSIDE_BODY_TRAIT "organ_inside_body" -/// Trait when something was labelled by the /datum/element/tool_renaming element. -#define RENAMING_TOOL_LABEL_TRAIT "renaming_tool_label" /// Trait when a drink was renamed by a shaker #define SHAKER_LABEL_TRAIT "shaker_trait" diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index a83ef71ddc69f..88f46a53fd92c 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -127,6 +127,7 @@ #define VV_HK_GODMODE "godmode" #define VV_HK_DROP_ALL "dropall" #define VV_HK_REGEN_ICONS "regen_icons" +#define VV_HK_REGEN_ICONS_FULL "regen_icons_full" #define VV_HK_PLAYER_PANEL "player_panel" #define VV_HK_BUILDMODE "buildmode" #define VV_HK_DIRECT_CONTROL "direct_control" diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 92c725bd81bb7..1740402e62799 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -285,6 +285,35 @@ return pick(possible_loc) +///Checks to see if `atom/source` is behind `atom/target` +/proc/check_behind(atom/source, atom/target) + // Let's see if source is behind target + // "Behind" is defined as 3 tiles directly to the back of the target + // x . . + // x > . + // x . . + + // No tactical spinning allowed + if(HAS_TRAIT(target, TRAIT_SPINNING)) + return TRUE + + // We'll take "same tile" as "behind" for ease + if(target.loc == source.loc) + return TRUE + + // We'll also assume lying down is behind, as mob directions when lying are unclear + if(isliving(target)) + var/mob/living/living_target = target + if(living_target.body_position == LYING_DOWN) + return TRUE + + // Exceptions aside, let's actually check if they're, yknow, behind + var/dir_target_to_source = get_dir(target, source) + if(target.dir & REVERSE_DIR(dir_target_to_source)) + return TRUE + + return FALSE + ///Disable power in the station APCs /proc/power_fail(duration_min, duration_max) for(var/obj/machinery/power/apc/current_apc as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)) diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index fe2357d6ce422..28bb4c1166262 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -86,7 +86,8 @@ gender = targeted_gender else gender = targeted_atom.gender - var/regex/pronoun_regex = regex("%PRONOUN(_(they|They|their|Their|theirs|Theirs|them|Them|have|are|were|do|theyve|Theyve|theyre|Theyre|s|es))") + ///The pronouns are ordered by their length to avoid %PRONOUN_Theyve being translated to "Heve" instead of "He's", for example + var/regex/pronoun_regex = regex("%PRONOUN(_(theirs|Theirs|theyve|Theyve|theyre|Theyre|their|Their|they|They|them|Them|have|were|are|do|es|s))") while(pronoun_regex.Find(target_string)) target_string = pronoun_regex.Replace(target_string, GET_TARGET_PRONOUN(targeted_atom, pronoun_regex.match, gender)) return target_string diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index e7c4ef3e06790..3d17d9abe894c 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -358,18 +358,6 @@ return FALSE -/mob/living/silicon/robot/attack_effects(damage_done, hit_zone, armor_block, obj/item/attacking_item, mob/living/attacker) - if(damage_done > 0 && attacking_item.damtype != STAMINA && stat != DEAD) - spark_system.start() - . = TRUE - return ..() || . - -/mob/living/silicon/ai/attack_effects(damage_done, hit_zone, armor_block, obj/item/attacking_item, mob/living/attacker) - if(damage_done > 0 && attacking_item.damtype != STAMINA && stat != DEAD) - spark_system.start() - . = TRUE - return ..() || . - /mob/living/carbon/attack_effects(damage_done, hit_zone, armor_block, obj/item/attacking_item, mob/living/attacker) var/obj/item/bodypart/hit_bodypart = get_bodypart(hit_zone) || bodyparts[1] if(!hit_bodypart.can_bleed()) @@ -484,4 +472,3 @@ return " in the [input_area]" return "" - diff --git a/code/controllers/subsystem/map_vote.dm b/code/controllers/subsystem/map_vote.dm index 7d0be38f92072..44aa82172f3f0 100644 --- a/code/controllers/subsystem/map_vote.dm +++ b/code/controllers/subsystem/map_vote.dm @@ -79,15 +79,33 @@ SUBSYSTEM_DEF(map_vote) send_map_vote_notice("No valid maps.") return - var/winner = pick_weight(filter_cache_to_valid_maps()) + var/winner + var/winner_amount = 0 + for(var/map in valid_maps) + if(!winner_amount) + winner = map + winner_amount = map_vote_cache[map] + continue + if(map_vote_cache[map] <= winner_amount) + continue + winner = map + winner_amount = map_vote_cache[map] + + ASSERT(winner, "No winner found in map vote.") set_next_map(config.maplist[winner]) - send_map_vote_notice("Map Selected - [span_bold(next_map_config.map_name)]") + var/list/messages = list("Map Selected - [span_bold(next_map_config.map_name)]") + messages += "Tallies at the time of selection:" + messages += tally_printout // do not reset tallies if only one map is even possible if(length(valid_maps) > 1) map_vote_cache[winner] = CONFIG_GET(number/map_vote_minimum_tallies) write_cache() update_tally_printout() + else + messages += "Only one map was possible, tallies were not reset." + + send_map_vote_notice(arglist(messages)) /// Returns a list of all map options that are invalid for the current population. /datum/controller/subsystem/map_vote/proc/get_valid_map_vote_choices() diff --git a/code/controllers/subsystem/movement/movement.dm b/code/controllers/subsystem/movement/movement.dm index d6043d596bb0e..2b0463db7905f 100644 --- a/code/controllers/subsystem/movement/movement.dm +++ b/code/controllers/subsystem/movement/movement.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(movement) name = "Movement Loops" - flags = SS_NO_INIT|SS_BACKGROUND|SS_TICKER + flags = SS_NO_INIT|SS_TICKER wait = 1 //Fire each tick /* A breif aside about the bucketing system here diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index bcd33f04c98f0..aaca3ef1d574c 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -469,8 +469,8 @@ SUBSYSTEM_DEF(ticker) qdel(player) ADD_TRAIT(living, TRAIT_NO_TRANSFORM, SS_TICKER_TRAIT) if(living.client) - var/atom/movable/screen/splash/S = new(null, living.client, TRUE) - S.Fade(TRUE) + var/atom/movable/screen/splash/fade_out = new(null, living.client, TRUE) + fade_out.Fade(TRUE) living.client.init_verbs() livings += living if(livings.len) diff --git a/code/datums/ai/basic_mobs/base_basic_controller.dm b/code/datums/ai/basic_mobs/base_basic_controller.dm index f21d31b05000c..7ab15437f7d35 100644 --- a/code/datums/ai/basic_mobs/base_basic_controller.dm +++ b/code/datums/ai/basic_mobs/base_basic_controller.dm @@ -9,6 +9,7 @@ update_speed(basic_mob) RegisterSignals(basic_mob, list(POST_BASIC_MOB_UPDATE_VARSPEED, COMSIG_MOB_MOVESPEED_UPDATED), PROC_REF(update_speed)) + RegisterSignal(basic_mob, COMSIG_MOB_ATE, PROC_REF(on_mob_eat)) return ..() //Run parent at end @@ -44,3 +45,8 @@ /datum/ai_controller/basic_controller/proc/update_speed(mob/living/basic/basic_mob) SIGNAL_HANDLER movement_delay = basic_mob.cached_multiplicative_slowdown + +/datum/ai_controller/basic_controller/proc/on_mob_eat() + SIGNAL_HANDLER + var/food_cooldown = blackboard[BB_EAT_FOOD_COOLDOWN] || EAT_FOOD_COOLDOWN + set_blackboard_key(BB_NEXT_FOOD_EAT, world.time + food_cooldown) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/interact_with_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/interact_with_target.dm new file mode 100644 index 0000000000000..3b0c4245656e5 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/interact_with_target.dm @@ -0,0 +1,27 @@ +///behavior for general interactions with any targets +/datum/ai_behavior/interact_with_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH + ///should we be clearing the target after the fact? + var/clear_target = TRUE + +/datum/ai_behavior/interact_with_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/interact_with_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target) || !pre_interact(controller, target)) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + controller.ai_interact(target) + return AI_BEHAVIOR_SUCCEEDED | AI_BEHAVIOR_DELAY + +/datum/ai_behavior/interact_with_target/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + if(clear_target || !succeeded) + controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/interact_with_target/proc/pre_interact(datum/ai_controller/controller, target) + return TRUE diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm index 9e3cd557b6437..f05c357b1a845 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm @@ -4,11 +4,33 @@ var/datum/ai_behavior/finding_behavior = /datum/ai_behavior/find_and_set/in_list ///key of foods list var/food_list_key = BB_BASIC_FOODS + ///key where we store our food + var/found_food_key = BB_TARGET_FOOD + ///key holding any emotes we play after eating food + var/emotes_blackboard_list = BB_EAT_EMOTES /datum/ai_planning_subtree/find_food/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - . = ..() - if(controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) - // Busy with something + if(controller.blackboard[BB_NEXT_FOOD_EAT] > world.time) + return + if(!controller.blackboard_key_exists(found_food_key)) + controller.queue_behavior(finding_behavior, found_food_key, controller.blackboard[food_list_key]) return + controller.queue_behavior(/datum/ai_behavior/interact_with_target/eat_food, found_food_key, emotes_blackboard_list) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/interact_with_target/eat_food + ///default list of actions we take after eating + var/list/food_actions = list( + "eats up happily!", + "chomps with glee!", + ) - controller.queue_behavior(finding_behavior, BB_BASIC_MOB_CURRENT_TARGET, controller.blackboard[food_list_key]) +/datum/ai_behavior/interact_with_target/eat_food/perform(seconds_per_tick, datum/ai_controller/controller, target_key, emotes_blackboard_list) + . = ..() + if(. & AI_BEHAVIOR_FAILED) + return + var/list/emotes_to_pick = controller.blackboard[emotes_blackboard_list] || food_actions + if(!length(emotes_to_pick)) + return + var/mob/living/living_pawn = controller.pawn + living_pawn.manual_emote(pick(emotes_to_pick)) diff --git a/code/datums/ai/dog/dog_behaviors.dm b/code/datums/ai/dog/dog_behaviors.dm index 958b1f3d03de1..6ae1529d47003 100644 --- a/code/datums/ai/dog/dog_behaviors.dm +++ b/code/datums/ai/dog/dog_behaviors.dm @@ -54,4 +54,4 @@ living_pawn.manual_emote("[pick("barks", "growls", "stares")] menacingly at [target]!") if(!SPT_PROB(40, seconds_per_tick)) return - playsound(living_pawn, pick('sound/mobs/non-humanoids/dog/growl1.ogg', 'sound/mobs/non-humanoids/dog/growl2.ogg'), 50, TRUE, -1) + playsound(living_pawn, SFX_GROWL, 50, TRUE, -1) diff --git a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm index 524dd1760561e..344efc0ead064 100644 --- a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm @@ -29,10 +29,6 @@ if(!referenced_bodypart) return ..() referenced_bodypart.remove_bodypart_overlay(src) - if(referenced_bodypart.owner) //Keep in mind that the bodypart could have been severed from the owner by now - referenced_bodypart.owner.update_body_parts() - else - referenced_bodypart.update_icon_dropped() return ..() /** @@ -49,7 +45,6 @@ if(!bodypart) return null bodypart.add_bodypart_overlay(overlay) - src.update_body_parts() return overlay /datum/bodypart_overlay/simple/emote/blush diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index 0bd3194813398..2196a88325ac2 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -643,3 +643,13 @@ /obj/item/clothing/head/fedora/beige = 1, ) category = CAT_CLOTHING + +/datum/crafting_recipe/jonkler + name = "gamer's wig and mask" + result = /obj/item/clothing/mask/gas/jonkler + time = 10 SECONDS + tool_paths = list(/obj/item/toy/crayon/green) + reqs = list( + /obj/item/clothing/mask/gas/clown_hat = 1, + ) + category = CAT_CLOTHING diff --git a/code/datums/components/face_decal.dm b/code/datums/components/face_decal.dm index df70f8a3f4989..6ba57aa2f01f4 100644 --- a/code/datums/components/face_decal.dm +++ b/code/datums/components/face_decal.dm @@ -50,7 +50,6 @@ bodypart_overlay.draw_color = color my_head.add_bodypart_overlay(bodypart_overlay) RegisterSignals(my_head, list(COMSIG_BODYPART_REMOVED, COMSIG_QDELETING), PROC_REF(lost_head)) - carbon_parent.update_body_parts() else normal_overlay = get_normal_overlay() normal_overlay.color = color @@ -79,14 +78,9 @@ if(my_head) if(bodypart_overlay) my_head.remove_bodypart_overlay(bodypart_overlay) - if(!my_head.owner) - my_head.update_icon_dropped() QDEL_NULL(bodypart_overlay) UnregisterSignal(my_head, list(COMSIG_BODYPART_REMOVED, COMSIG_QDELETING)) my_head = null - if(iscarbon(parent)) - var/mob/living/carbon/carbon_parent = parent - carbon_parent.update_body_parts() if(normal_overlay) var/atom/atom_parent = parent UnregisterSignal(atom_parent, COMSIG_ATOM_UPDATE_OVERLAYS) diff --git a/code/datums/components/fish_growth.dm b/code/datums/components/fish_growth.dm index 7c9aed1048c27..7f1e411ed3a3a 100644 --- a/code/datums/components/fish_growth.dm +++ b/code/datums/components/fish_growth.dm @@ -90,12 +90,12 @@ var/message_verb = del_on_grow ? "grows into" : "generates" location.visible_message(span_notice("[source] [message_verb] \a [result]."), vision_distance = 3) - if(inherit_name && source.name != initial(source.name)) + if(inherit_name && HAS_TRAIT(source, TRAIT_WAS_RENAMED)) if(ismob(result)) var/mob/mob = result mob.fully_replace_character_name(mob.name, source.name) else - result.name = source.name + result.AddComponent(/datum/component/rename, source.name, result.desc) SEND_SIGNAL(source, COMSIG_FISH_FINISH_GROWING, result) diff --git a/code/datums/components/irradiated.dm b/code/datums/components/irradiated.dm index 0f70e0d80b717..a798124528c06 100644 --- a/code/datums/components/irradiated.dm +++ b/code/datums/components/irradiated.dm @@ -143,7 +143,7 @@ human_parent.apply_damage(RADIATION_BURN_SPLOTCH_DAMAGE, BURN, affected_limb, wound_clothing = FALSE) playsound( human_parent, - pick('sound/effects/wounds/sizzle1.ogg', 'sound/effects/wounds/sizzle2.ogg'), + SFX_SIZZLE, 50, vary = TRUE, ) diff --git a/code/datums/components/rename.dm b/code/datums/components/rename.dm index ad98c861ddeed..31e1629f314f8 100644 --- a/code/datums/components/rename.dm +++ b/code/datums/components/rename.dm @@ -26,6 +26,7 @@ src.custom_name = custom_name src.custom_desc = custom_desc apply_rename() + ADD_TRAIT(parent, TRAIT_WAS_RENAMED, type) /** This proc will fire after the parent's name or desc is changed with a pen, which is trying to apply another rename component. @@ -62,4 +63,5 @@ /datum/component/rename/Destroy() revert_rename() + REMOVE_TRAIT(parent, TRAIT_WAS_RENAMED, type) return ..() diff --git a/code/datums/components/riding/riding.dm b/code/datums/components/riding/riding.dm index dd3ea01d59cd9..843b7643fbd9a 100644 --- a/code/datums/components/riding/riding.dm +++ b/code/datums/components/riding/riding.dm @@ -195,7 +195,7 @@ if(diroffsets.len == 3) buckled_mob.layer = diroffsets[3] break dir_loop - var/list/static/default_vehicle_pixel_offsets = list(TEXT_NORTH = list(0, 0), TEXT_SOUTH = list(0, 0), TEXT_EAST = list(0, 0), TEXT_WEST = list(0, 0)) + var/static/list/default_vehicle_pixel_offsets = list(TEXT_NORTH = list(0, 0), TEXT_SOUTH = list(0, 0), TEXT_EAST = list(0, 0), TEXT_WEST = list(0, 0)) var/px = default_vehicle_pixel_offsets[AM_dir] var/py = default_vehicle_pixel_offsets[AM_dir] if(directional_vehicle_offsets[AM_dir]) diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index 46388a15e26e8..626668a48e070 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -170,8 +170,10 @@ tracker_owner_ckey = user.ckey if(user.is_holding(parent)) RegisterSignals(user, list(COMSIG_MOB_SWAP_HANDS, COMSIG_QDELETING), PROC_REF(stop_zooming)) + RegisterSignal(user, COMSIG_ATOM_ENTERING, PROC_REF(on_enter_new_loc)) else // The item is likely worn (eg. mothic cap) RegisterSignal(user, COMSIG_QDELETING, PROC_REF(stop_zooming)) + RegisterSignal(user, COMSIG_ATOM_ENTERING, PROC_REF(on_enter_new_loc)) var/static/list/capacity_signals = list( COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_LIVING_STATUS_PARALYZE, @@ -182,6 +184,13 @@ ADD_TRAIT(user, TRAIT_USER_SCOPED, REF(src)) return TRUE +///Stop scoping if the `newloc` we move to is not a turf +/datum/component/scope/proc/on_enter_new_loc(datum/source, atom/newloc, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + + if(!isturf(newloc)) + stop_zooming(tracker.owner) + /datum/component/scope/proc/on_incapacitated(mob/living/source, amount = 0, ignore_canstun = FALSE) SIGNAL_HANDLER @@ -207,6 +216,7 @@ COMSIG_LIVING_STATUS_STUN, COMSIG_MOB_SWAP_HANDS, COMSIG_QDELETING, + COMSIG_ATOM_ENTERING, )) REMOVE_TRAIT(user, TRAIT_USER_SCOPED, REF(src)) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index d64022d22b872..82b12d555ac06 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -191,7 +191,8 @@ data["current_progression_scaling"] = SStraitor.current_progression_scaling data["maximum_potential_objectives"] = uplink_handler.maximum_potential_objectives - if(uplink_handler.has_objectives) + + if(uplink_handler.primary_objectives) var/list/primary_objectives = list() for(var/datum/objective/task as anything in uplink_handler.primary_objectives) var/list/task_data = list() @@ -201,7 +202,9 @@ task_data["task_name"] = "DIRECTIVE [uppertext(GLOB.phonetic_alphabet[length(primary_objectives) + 1])]" task_data["task_text"] = task.explanation_text primary_objectives += list(task_data) + data["primary_objectives"] = primary_objectives + if(uplink_handler.has_objectives) var/list/potential_objectives = list() for(var/index in 1 to uplink_handler.potential_objectives.len) var/datum/traitor_objective/objective = uplink_handler.potential_objectives[index] @@ -216,7 +219,7 @@ objective_data["id"] = index active_objectives += list(objective_data) - data["primary_objectives"] = primary_objectives + data["potential_objectives"] = potential_objectives data["active_objectives"] = active_objectives data["completed_final_objective"] = uplink_handler.final_objective diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm index f0f3136487418..dc475fc887daa 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -46,7 +46,6 @@ /datum/symptom/shedding/proc/baldify(mob/living/carbon/human/baldie, fully_bald) if(fully_bald) baldie.set_facial_hairstyle("Shaved", update = FALSE) - baldie.set_hairstyle("Bald", update = FALSE) + baldie.set_hairstyle("Bald") //this will call update_body_parts() else - baldie.set_hairstyle("Balding Hair", update = FALSE) - baldie.update_body_parts() + baldie.set_hairstyle("Balding Hair") diff --git a/code/datums/elements/organ_set_bonus.dm b/code/datums/elements/organ_set_bonus.dm index 1c75bf7de1486..082933e409e97 100644 --- a/code/datums/elements/organ_set_bonus.dm +++ b/code/datums/elements/organ_set_bonus.dm @@ -59,6 +59,8 @@ var/list/bonus_traits = list() /// Limb overlay to apply upon activation var/limb_overlay + /// Color priority for limb overlay + var/color_overlay_priority /datum/status_effect/organ_set_bonus/proc/set_organs(new_value) organs = new_value @@ -87,7 +89,7 @@ var/mob/living/carbon/carbon_owner = owner for(var/obj/item/bodypart/limb in carbon_owner.bodyparts) limb.add_bodypart_overlay(new limb_overlay()) - limb.variable_color = COLOR_WHITE + limb.add_color_override(COLOR_WHITE, color_overlay_priority) carbon_owner.update_body() return TRUE @@ -105,5 +107,5 @@ var/overlay = locate(limb_overlay) in limb.bodypart_overlays if(overlay) limb.remove_bodypart_overlay(overlay) - limb.variable_color = null + limb.remove_color_override(color_overlay_priority) carbon_owner.update_body() diff --git a/code/datums/elements/tool_renaming.dm b/code/datums/elements/tool_renaming.dm index bd87f1d171c86..729c5fd6a2182 100644 --- a/code/datums/elements/tool_renaming.dm +++ b/code/datums/elements/tool_renaming.dm @@ -51,7 +51,6 @@ return renamed_obj.AddComponent(/datum/component/rename, input, renamed_obj.desc) to_chat(user, span_notice("You have successfully renamed \the [old_name] to [renamed_obj].")) - ADD_TRAIT(renamed_obj, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT) renamed_obj.update_appearance(UPDATE_NAME) if(OPTION_DESCRIPTION) @@ -64,13 +63,11 @@ return renamed_obj.AddComponent(/datum/component/rename, renamed_obj.name, input) to_chat(user, span_notice("You have successfully changed [renamed_obj]'s description.")) - ADD_TRAIT(renamed_obj, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT) renamed_obj.update_appearance(UPDATE_DESC) if(OPTION_RESET) qdel(renamed_obj.GetComponent(/datum/component/rename)) to_chat(user, span_notice("You have successfully reset [renamed_obj]'s name and description.")) - REMOVE_TRAIT(renamed_obj, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT) renamed_obj.update_appearance(UPDATE_NAME | UPDATE_DESC) #undef OPTION_RENAME diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index b74881cd48d66..e3072fcbfd201 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -50,7 +50,7 @@ var/stat_allowed = CONSCIOUS /// Sound to play when emote is called. var/sound - /// Used for the honk borg emote. + /// Does this emote vary in pitch? var/vary = FALSE /// Can only code call this event instead of the player. var/only_forced_audio = FALSE @@ -58,8 +58,10 @@ var/cooldown = 0.8 SECONDS /// Does this message have a message that can be modified by the user? var/can_message_change = FALSE - /// How long is the cooldown on the audio of the emote, if it has one? - var/audio_cooldown = 2 SECONDS + /// How long is the shared emote cooldown triggered by this emote? + var/general_emote_audio_cooldown = 2 SECONDS + /// How long is the specific emote cooldown triggered by this emote? + var/specific_emote_audio_cooldown = 5 SECONDS /// Does this emote's sound ignore walls? var/sound_wall_ignore = FALSE @@ -100,8 +102,9 @@ user.log_message(msg, LOG_EMOTE) var/tmp_sound = get_sound(user) - if(tmp_sound && should_play_sound(user, intentional) && TIMER_COOLDOWN_FINISHED(user, "audible_emote_cooldown")) - TIMER_COOLDOWN_START(user, "audible_emote_cooldown", audio_cooldown) + if(tmp_sound && should_play_sound(user, intentional) && TIMER_COOLDOWN_FINISHED(user, "general_emote_audio_cooldown") && TIMER_COOLDOWN_FINISHED(user, type)) + TIMER_COOLDOWN_START(user, type, specific_emote_audio_cooldown) + TIMER_COOLDOWN_START(user, "general_emote_audio_cooldown", general_emote_audio_cooldown) playsound(source = user,soundin = tmp_sound,vol = 50, vary = vary, ignore_walls = sound_wall_ignore) var/is_important = emote_type & EMOTE_IMPORTANT diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index f52050d8d76d7..d2142b02a8bcf 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -204,7 +204,7 @@ span_danger("[carp_user] effortlessly swats [hitting_projectile] aside! [carp_user.p_They()] can block bullets with [carp_user.p_their()] bare hands!"), span_userdanger("You deflect [hitting_projectile]!"), ) - playsound(carp_user, pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 75, TRUE) + playsound(carp_user, SFX_BULLET_MISS, 75, TRUE) hitting_projectile.firer = carp_user hitting_projectile.set_angle(rand(0, 360))//SHING return COMPONENT_BULLET_PIERCED diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index dd5441476dcfb..93a8f186da6c2 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -76,6 +76,11 @@ mood_change = 4 timeout = 5 MINUTES +/datum/mood_event/shower_hater + description = "I hate being wet!" + mood_change = -2 + timeout = 3 MINUTES + /datum/mood_event/fresh_laundry description = "There's nothing like the feeling of a freshly laundered jumpsuit." mood_change = 2 diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 4eb04cdc03366..66f4924512c1b 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -32,7 +32,7 @@ if(..()) return for(var/obj/item/bodypart/part as anything in owner.bodyparts) - part.variable_color = bodypart_color + part.add_color_override(bodypart_color, LIMB_COLOR_HULK) owner.update_body_parts() owner.add_mood_event("hulk", /datum/mood_event/hulk) RegisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) @@ -94,7 +94,7 @@ if(..()) return for(var/obj/item/bodypart/part as anything in owner.bodyparts) - part.variable_color = null + part.remove_color_override(LIMB_COLOR_HULK) owner.update_body_parts() owner.clear_mood_event("hulk") UnregisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK) diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index b9367cfdcdc81..f487ac56c1330 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -79,7 +79,7 @@ // Used to replace the original later var/og_word = editing_word // Iterating through each replaceable-string in the .json - var/list/static/super_wacky_words = strings("heckacious.json", "heckacious") + var/static/list/super_wacky_words = strings("heckacious.json", "heckacious") // If the word doesn't get replaced we might do something with it later var/word_edited diff --git a/code/datums/quirks/negative_quirks/all_nighter.dm b/code/datums/quirks/negative_quirks/all_nighter.dm index f5288b8221560..cb11ba0d5fa73 100644 --- a/code/datums/quirks/negative_quirks/all_nighter.dm +++ b/code/datums/quirks/negative_quirks/all_nighter.dm @@ -56,15 +56,12 @@ return bodypart_overlay = new() //creates our overlay face.add_bodypart_overlay(bodypart_overlay) - sleepy_head.update_body_parts() //make sure to update icon ///removes the bag overlay /datum/quirk/all_nighter/proc/remove_bags() var/mob/living/carbon/human/sleepy_head = quirk_holder var/obj/item/bodypart/head/face = sleepy_head?.get_bodypart(BODY_ZONE_HEAD) - if(face) - face.remove_bodypart_overlay(bodypart_overlay) - sleepy_head.update_body_parts() + face?.remove_bodypart_overlay(bodypart_overlay) QDEL_NULL(bodypart_overlay) /** diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index 86e4dda381421..ef241d61127ba 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -166,6 +166,12 @@ description = "This is where all of your paychecks went. Signed, the management." suffix = "icemoon_underground_mailroom.dmm" +/datum/map_template/ruin/icemoon/underground/biodome + name = "Ice-Ruin Syndicate Bio-Dome" + id = "biodome" + description = "Unchecked experimention gone awry." + suffix = "icemoon_underground_syndidome.dmm" + /datum/map_template/ruin/icemoon/underground/frozen_comms name = "Ice-Ruin Frozen Communicatons Outpost" id = "frozen_comms" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index cf3d1c88440b3..7a6b263d5893e 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -306,26 +306,12 @@ newRod.activated() if(!itemUser.has_hand_for_held_index(hand)) //If user does not have the corresponding hand anymore, give them one and return the rod to their hand - if(((hand % 2) == 0)) - var/obj/item/bodypart/L = itemUser.newBodyPart(BODY_ZONE_R_ARM, FALSE, FALSE) - if(L.try_attach_limb(itemUser)) - L.update_limb(is_creating = TRUE) - itemUser.update_body_parts() - itemUser.put_in_hand(newRod, hand, forced = TRUE) - else - qdel(L) - consume_owner() //we can't regrow, abort abort - return + var/zone = (hand % 2) ? BODY_ZONE_L_ARM : BODY_ZONE_R_ARM + if(itemUser.regenerate_limb(zone, FALSE)) + itemUser.put_in_hand(newRod, hand, forced = TRUE) else - var/obj/item/bodypart/L = itemUser.newBodyPart(BODY_ZONE_L_ARM, FALSE, FALSE) - if(L.try_attach_limb(itemUser)) - L.update_limb(is_creating = TRUE) - itemUser.update_body_parts() - itemUser.put_in_hand(newRod, hand, forced = TRUE) - else - qdel(L) - consume_owner() //see above comment - return + consume_owner() //we can't regrow, abort abort + return to_chat(itemUser, span_notice("Your arm suddenly grows back with the Rod of Asclepius still attached!")) else //Otherwise get rid of whatever else is in their hand and return the rod to said hand diff --git a/code/datums/status_effects/debuffs/cyborg.dm b/code/datums/status_effects/debuffs/cyborg.dm index 0f95b494197a4..30cea1af74552 100644 --- a/code/datums/status_effects/debuffs/cyborg.dm +++ b/code/datums/status_effects/debuffs/cyborg.dm @@ -1,22 +1,31 @@ -/// Reduce a cyborg's speed when you throw things at it -/datum/status_effect/borg_throw_slow - id = "borg_throw_slowdown" - alert_type = /atom/movable/screen/alert/status_effect/borg_throw_slow +/// Slows down a cyborg for a short time. +/datum/status_effect/borg_slow + id = "borg_slowdown" + alert_type = null duration = 3 SECONDS - status_type = STATUS_EFFECT_REPLACE + status_type = STATUS_EFFECT_REFRESH + remove_on_fullheal = TRUE + heal_flag_necessary = HEAL_CC_STATUS + /// Amount of slowdown being applied + var/slowdown = 1 -/datum/status_effect/borg_throw_slow/on_apply() - . = ..() - owner.add_movespeed_modifier(/datum/movespeed_modifier/borg_throw, update = TRUE) +/datum/status_effect/borg_slow/on_creation(mob/living/new_owner, slowdown = 1) + src.slowdown = slowdown + return ..() -/datum/status_effect/borg_throw_slow/on_remove() - . = ..() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/borg_throw, update = TRUE) +/datum/status_effect/borg_slow/on_apply() + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/borg_slowdown, multiplicative_slowdown = slowdown) + return TRUE -/atom/movable/screen/alert/status_effect/borg_throw_slow - name = "Percussive Maintenance" - desc = "A sudden impact has triggered your collision avoidance routines, reducing movement speed." - icon_state = "weaken" +/datum/status_effect/borg_slow/on_remove() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/borg_slowdown) + +/datum/status_effect/borg_slow/refresh(mob/living/new_owner, slowdown = 1) + . = ..() + if(src.slowdown <= slowdown) + return + src.slowdown = slowdown + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/borg_slowdown, multiplicative_slowdown = src.slowdown) -/datum/movespeed_modifier/borg_throw - multiplicative_slowdown = 0.9 +/datum/movespeed_modifier/borg_slowdown + variable = TRUE diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 8737cacede317..a6607cd7797e2 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -618,7 +618,7 @@ /atom/movable/screen/alert/status_effect/shower_regen/hater name = "Washing" desc = "Waaater... Fuck this WATER!!" - icon_state = "shower_regen_hater" + icon_state = "shower_regen_catgirl" /datum/status_effect/shower_regen id = "shower_regen" @@ -637,10 +637,13 @@ . = ..() var/water_adaptation = HAS_TRAIT(owner, TRAIT_WATER_ADAPTATION) var/heal_or_deal = HAS_TRAIT(owner, TRAIT_WATER_HATER) && !water_adaptation ? 1 : -1 + var/healed = 0 if(water_adaptation) //very mild healing for those with the water adaptation trait (fish infusion) - owner.adjustOxyLoss(-1 * seconds_between_ticks, updating_health = FALSE, required_biotype = MOB_ORGANIC) - owner.adjustFireLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) - owner.adjustToxLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, required_biotype = MOB_ORGANIC) - owner.adjustBruteLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + healed += owner.adjustOxyLoss(-1.5 * seconds_between_ticks, updating_health = FALSE, required_biotype = MOB_ORGANIC) + healed += owner.adjustFireLoss(-1 * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + healed += owner.adjustToxLoss(-1 * seconds_between_ticks, updating_health = FALSE, required_biotype = MOB_ORGANIC) + healed += owner.adjustBruteLoss(-1 * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) heal_or_deal *= 1.5 - owner.adjustStaminaLoss(stamina_heal_per_tick * heal_or_deal * seconds_between_ticks) + healed += owner.adjustStaminaLoss(stamina_heal_per_tick * heal_or_deal * seconds_between_ticks, updating_stamina = FALSE) + if(healed) + owner.updatehealth() diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm index fa87fa832a1fb..69d1e5abf4d5a 100644 --- a/code/game/area/areas/ruins/icemoon.dm +++ b/code/game/area/areas/ruins/icemoon.dm @@ -54,6 +54,16 @@ /area/ruin/pizzeria/kitchen name = "\improper Moffuchi's Kitchen" + +/area/ruin/syndibiodome + name = "\improper Syndicate Biodome" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + ambience_index = AMBIENCE_DANGER + area_flags = NOTELEPORT + mood_bonus = -10 + mood_message = "What the fuck." + + /area/ruin/planetengi name = "\improper Engineering Outpost" diff --git a/code/game/machinery/big_manipulator.dm b/code/game/machinery/big_manipulator.dm index 8d2bde3e145ae..27c927697fc87 100644 --- a/code/game/machinery/big_manipulator.dm +++ b/code/game/machinery/big_manipulator.dm @@ -1,3 +1,11 @@ +#define DROP_ITEM_MODE 1 +#define USE_ITEM_MODE 2 +#define THROW_ITEM_MODE 3 + +#define TAKE_ITEMS 1 +#define TAKE_CLOSETS 2 +#define TAKE_HUMANS 3 + /// Manipulator Core. Main part of the mechanism that carries out the entire process. /obj/machinery/big_manipulator name = "Big Manipulator" @@ -24,10 +32,36 @@ var/turf/take_turf /// Turf where we drop items. var/turf/drop_turf + /// How will manipulator manipulate the object? drop it out by default. + var/manipulate_mode = DROP_ITEM_MODE + /// Priority settings depending on the manipulator mode that are available to this manipulator. Filled during Initialize. + var/list/priority_settings_for_drop = list() + var/list/priority_settings_for_use = list() + /// What priority settings are available to use at the moment. + /// We also use this list to sort priorities from ascending to descending. + var/list/allowed_priority_settings = list() /// Obj inside manipulator. var/datum/weakref/containment_obj + /// Obj used as filter + var/datum/weakref/filter_obj /// Other manipulator component. - var/obj/effect/manipulator_hand + var/obj/effect/big_manipulator_hand/manipulator_hand + /// Here some ui setting we can on/off: + /// If activated: after item was used manipulator will also drop it. + var/drop_item_after_use = TRUE + /// If acrivated: will select only 1 priority and will not continue to look at the priorities below. + var/only_highest_priority = FALSE + /// Var for throw item mode: changes the range from which the manipulator throws an object. + var/manipulator_throw_range = 1 + /// Selected type that manipulator will take for take and drop loop. + var/atom/selected_type + /// Just a lazy number to change selected_type type in array. + var/selected_type_by_number = 1 + /// List where we can set selected type. Taking items by Initialize. + var/list/allowed_types_to_pick_up = list( + /obj/item, + /obj/structure/closet, + ) /obj/machinery/big_manipulator/Initialize(mapload) . = ..() @@ -35,9 +69,19 @@ create_manipulator_hand() RegisterSignal(manipulator_hand, COMSIG_QDELETING, PROC_REF(on_hand_qdel)) manipulator_lvl() + set_up_priority_settings() + selected_type = allowed_types_to_pick_up[selected_type_by_number] if(on) press_on(pressed_by = null) +/// Init priority settings list for all modes. +/obj/machinery/big_manipulator/proc/set_up_priority_settings() + for(var/datum/manipulator_priority/priority_for_drop as anything in subtypesof(/datum/manipulator_priority/for_drop)) + priority_settings_for_drop += new priority_for_drop + for(var/datum/manipulator_priority/priority_for_use as anything in subtypesof(/datum/manipulator_priority/for_use)) + priority_settings_for_use += new priority_for_use + update_priority_list() + /obj/machinery/big_manipulator/examine(mob/user) . = ..() . += "You can change direction with alternative wrench usage." @@ -45,10 +89,12 @@ /obj/machinery/big_manipulator/Destroy(force) . = ..() qdel(manipulator_hand) - if(isnull(containment_obj)) - return - var/obj/obj_resolve = containment_obj?.resolve() - obj_resolve?.forceMove(get_turf(obj_resolve)) + if(!isnull(containment_obj)) + var/obj/containment_resolve = containment_obj?.resolve() + containment_resolve?.forceMove(get_turf(containment_resolve)) + if(!isnull(filter_obj)) + var/obj/filter_resolve = filter_obj?.resolve() + filter_resolve?.forceMove(get_turf(filter_resolve)) /obj/machinery/big_manipulator/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) . = ..() @@ -59,6 +105,15 @@ if(!manipulator_hand) create_manipulator_hand() +/obj/machinery/big_manipulator/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if(obj_flags & EMAGGED) + return FALSE + balloon_alert(user, "overloaded functions installed") + obj_flags |= EMAGGED + allowed_types_to_pick_up += /mob/living + return TRUE + /obj/machinery/big_manipulator/wrench_act(mob/living/user, obj/item/tool) . = ..() default_unfasten_wrench(user, tool, time = 1 SECONDS) @@ -175,7 +230,9 @@ on = !on say("Output blocked") return FALSE - for(var/obj/item/take_item in take_turf.contents) + for(var/take_item in take_turf.contents) + if(!check_filter(take_item)) + continue try_take_thing(take_turf, take_item) break @@ -200,22 +257,121 @@ on = FALSE say("Not enough energy!") return - if(isitem(target)) - start_work(target) + if(!check_filter(target)) + return + start_work(target) /// Second take and drop proc from [take and drop procs loop]: /// Taking our item and start manipulator hand rotate animation. /obj/machinery/big_manipulator/proc/start_work(atom/movable/target) target.forceMove(src) containment_obj = WEAKREF(target) + manipulator_hand.update_claw(containment_obj) on_work = TRUE do_rotate_animation(1) - addtimer(CALLBACK(src, PROC_REF(drop_thing), target), working_speed) - -/// Third take and drop proc from [take and drop procs loop]: -/// Drop our item and start manipulator hand backward animation. + check_next_move(target) + +/// 2.5 take and drop proc from [take and drop procs loop]: +/// Choose what we will do with our item by checking the manipulate_mode. +/obj/machinery/big_manipulator/proc/check_next_move(atom/movable/target) + switch(manipulate_mode) + if(DROP_ITEM_MODE) + addtimer(CALLBACK(src, PROC_REF(drop_thing), target), working_speed) + if(USE_ITEM_MODE) + addtimer(CALLBACK(src, PROC_REF(use_thing), target), working_speed) + if(THROW_ITEM_MODE) + addtimer(CALLBACK(src, PROC_REF(throw_thing), target), working_speed) + +/// 3.1 take and drop proc from [take and drop procs loop]: +/// Drop our item. +/// Checks the priority to drop item not only ground but also in the storage. /obj/machinery/big_manipulator/proc/drop_thing(atom/movable/target) - target.forceMove(drop_turf) + var/where_we_drop = search_type_by_priority_in_drop_turf(allowed_priority_settings) + if(isnull(where_we_drop)) + addtimer(CALLBACK(src, PROC_REF(drop_thing), target), working_speed) + return + if((where_we_drop == drop_turf) || !isitem(target)) + target.forceMove(drop_turf) + target.dir = get_dir(get_turf(target), get_turf(src)) + else + target.forceMove(where_we_drop) + finish_manipulation() + +/// 3.2 take and drop proc from [take and drop procs loop]: +/// Use our item on random atom in drop turf contents then +/// Starts manipulator hand backward animation by defualt, but +/// You can also set the setting in ui so that it does not return to its privious position and continues to use object in its hand. +/// Checks the priority so that you can configure which object it will select: mob/obj/turf. +/// Also can use filter to interact only with obj in filter. +/obj/machinery/big_manipulator/proc/use_thing(atom/movable/target) + var/obj/obj_resolve = containment_obj?.resolve() + if(isnull(obj_resolve)) + finish_manipulation() + return + /// If we forceMoved from manipulator we are free now. + if(obj_resolve.loc != src) + finish_manipulation() + return + if(!isitem(target)) + target.forceMove(drop_turf) /// We use only items + target.dir = get_dir(get_turf(target), get_turf(src)) + finish_manipulation() + return + var/obj/item/im_item = target + var/atom/type_to_use = search_type_by_priority_in_drop_turf(allowed_priority_settings) + if(isnull(type_to_use)) + check_end_of_use(im_item, target, item_was_used = FALSE) + return + var/mob/living/carbon/human/dummy/living_manipulator_lmfao = create_abstract_living() + living_manipulator_lmfao.put_in_active_hand(im_item) + if(!type_to_use.attackby(im_item, living_manipulator_lmfao)) + im_item.melee_attack_chain(living_manipulator_lmfao, type_to_use) + do_attack_animation(drop_turf) + manipulator_hand.do_attack_animation(drop_turf) + if(LAZYLEN(living_manipulator_lmfao.do_afters)) + RegisterSignal(living_manipulator_lmfao, COMSIG_DO_AFTER_ENDED, PROC_REF(manipulator_finish_do_after)) + else + im_item.forceMove(src) + qdel(living_manipulator_lmfao) + check_end_of_use(im_item, item_was_used = TRUE) + +/// Wait whan manipulator finish do_after and kill em. +/obj/machinery/big_manipulator/proc/manipulator_finish_do_after(mob/living/carbon/human/dummy/abstract_manipulator) + SIGNAL_HANDLER + + var/obj/item/my_item = abstract_manipulator.get_active_held_item() + my_item.forceMove(src) + qdel(abstract_manipulator) + +/// Check what we gonna do next with our item. Drop it or use again. +/obj/machinery/big_manipulator/proc/check_end_of_use(obj/item/my_item, item_was_used) + if(drop_item_after_use && item_was_used) + my_item.forceMove(drop_turf) + my_item.dir = get_dir(get_turf(my_item), get_turf(src)) + finish_manipulation() + return + addtimer(CALLBACK(src, PROC_REF(use_thing), my_item), working_speed) + +/// 3.3 take and drop proc from [take and drop procs loop]: +/// Throw item away!!! +/obj/machinery/big_manipulator/proc/throw_thing(atom/movable/target) + if(!(isitem(target) || isliving(target))) + target.forceMove(drop_turf) + target.dir = get_dir(get_turf(target), get_turf(src)) + finish_manipulation() /// We throw only items and living mobs + return + var/obj/item/im_item = target + im_item.forceMove(drop_turf) + im_item.throw_at(get_edge_target_turf(get_turf(src), drop_here), manipulator_throw_range - 1, 2) + src.do_attack_animation(drop_turf) + manipulator_hand.do_attack_animation(drop_turf) + finish_manipulation() + +/// End of thirds take and drop proc from [take and drop procs loop]: +/// Starts manipulator hand backward animation. +/obj/machinery/big_manipulator/proc/finish_manipulation() + containment_obj = null + manipulator_hand.update_claw(null) do_rotate_animation(0) addtimer(CALLBACK(src, PROC_REF(end_work)), working_speed) @@ -234,6 +390,68 @@ /obj/machinery/big_manipulator/proc/finish_rotate_animation(backward) animate(manipulator_hand, transform = matrix(180 * backward, MATRIX_ROTATE), working_speed*0.5) +/obj/machinery/big_manipulator/proc/check_filter(obj/item/what_item) + var/filtered_obj = filter_obj?.resolve() + if(!istype(what_item, selected_type)) + return + /// We use filter only on items. closets, humans and etc don't need filter check. + if(istype(what_item, /obj/item)) + if((filtered_obj && !istype(what_item, filtered_obj))) + return FALSE + return TRUE + +/// Create dummy to force him use our item and then delete him. +/obj/machinery/big_manipulator/proc/create_abstract_living() + var/mob/living/carbon/human/dummy/abstract_living = new /mob/living/carbon/human/dummy(get_turf(src)) + abstract_living.alpha = 0 + abstract_living.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + ADD_TRAIT(abstract_living, TRAIT_UNDENSE, INNATE_TRAIT) + abstract_living.move_resist = INFINITY + abstract_living.invisibility = INVISIBILITY_ABSTRACT + abstract_living.real_name = abstract_living.name = name + abstract_living.mind_initialize() + return abstract_living + +/// Proc called when we changing item interaction mode. +/obj/machinery/big_manipulator/proc/change_mode() + manipulate_mode++ + if(manipulate_mode > THROW_ITEM_MODE) + manipulate_mode = DROP_ITEM_MODE + update_priority_list() + is_work_check() + +/// Update priority list in ui. Creating new list and sort it by priority number. +/obj/machinery/big_manipulator/proc/update_priority_list() + allowed_priority_settings = list() + var/list/priority_mode_list + if(manipulate_mode == DROP_ITEM_MODE) + priority_mode_list = priority_settings_for_drop.Copy() + if(manipulate_mode == USE_ITEM_MODE) + priority_mode_list = priority_settings_for_use.Copy() + if(isnull(priority_mode_list)) + return + for(var/we_need_increasing in 1 to length(priority_mode_list)) + for(var/datum/manipulator_priority/what_priority in priority_mode_list) + if(what_priority.number != we_need_increasing) + continue + allowed_priority_settings += what_priority + +/// Proc thet return item by type in priority list. Selects item and increasing priority number if don't found req type. +/obj/machinery/big_manipulator/proc/search_type_by_priority_in_drop_turf(list/priority_list) + var/lazy_counter = 1 + for(var/datum/manipulator_priority/take_type in priority_list) + /// If we set only_highest_priority on TRUE we don't go to priority below. + if(lazy_counter > 1 && only_highest_priority) + return null + /// If we need turf we don't check turf.contents and just return drop_turf. + if(take_type.what_type == /turf) + return drop_turf + lazy_counter++ + for(var/type_in_priority in drop_turf.contents) + if(!istype(type_in_priority, take_type.what_type)) + continue + return type_in_priority + /// Proc call when we press on/off button /obj/machinery/big_manipulator/proc/press_on(pressed_by) if(pressed_by) @@ -257,7 +475,29 @@ /obj/machinery/big_manipulator/ui_data(mob/user) var/list/data = list() + var/mode + switch(manipulate_mode) + if(DROP_ITEM_MODE) + mode = "Drop" + if(USE_ITEM_MODE) + mode = "Use" + if(THROW_ITEM_MODE) + mode = "Throw" data["active"] = on + data["item_as_filter"] = filter_obj?.resolve() + data["selected_type"] = selected_type.name + data["manipulate_mode"] = mode + data["drop_after_use"] = drop_item_after_use + data["highest_priority"] = only_highest_priority + data["throw_range"] = manipulator_throw_range + var/list/priority_list = list() + data["settings_list"] = list() + for(var/datum/manipulator_priority/allowed_setting as anything in allowed_priority_settings) + var/list/priority_data = list() + priority_data["name"] = allowed_setting.name + priority_data["priority_width"] = allowed_setting.number + priority_list += list(priority_data) + data["settings_list"] = priority_list return data /obj/machinery/big_manipulator/ui_act(action, params, datum/tgui/ui) @@ -268,6 +508,71 @@ if("on") press_on(pressed_by = TRUE) return TRUE + if("drop") + if(isnull(containment_obj)) + return + var/obj/obj_resolve = containment_obj?.resolve() + obj_resolve?.forceMove(get_turf(obj_resolve)) + finish_manipulation() + return TRUE + if("change_take_item_type") + selected_type_by_number++ + if(selected_type_by_number > allowed_types_to_pick_up.len) + selected_type_by_number = 1 + selected_type = allowed_types_to_pick_up[selected_type_by_number] + is_work_check() + return TRUE + if("change_mode") + change_mode() + return TRUE + if("add_filter") + var/mob/living/living_user = ui.user + if(!isliving(living_user)) + return FALSE + var/obj/give_obj_back = filter_obj?.resolve() + if(give_obj_back) + give_obj_back.forceMove(get_turf(src)) + filter_obj = null + is_work_check() + to_chat(living_user, span_warning("Filter removed")) + return TRUE + var/obj/item/get_active_held_item = living_user.get_active_held_item() + if(isnull(get_active_held_item)) + to_chat(living_user, span_warning("You need item in hand to put it as filter")) + return FALSE + filter_obj = WEAKREF(get_active_held_item) + get_active_held_item.forceMove(src) + is_work_check() + return TRUE + if("drop_use_change") + drop_item_after_use = !drop_item_after_use + return TRUE + if("highest_priority_change") + only_highest_priority = !only_highest_priority + return TRUE + if("change_priority") + var/new_priority_number = params["priority"] + for(var/datum/manipulator_priority/new_order as anything in allowed_priority_settings) + if(new_order.number != new_priority_number) + continue + new_order.number-- + check_similarities(new_order.number) + break + update_priority_list() + return TRUE + if("change_throw_range") + manipulator_throw_range++ + if(manipulator_throw_range > 7) + manipulator_throw_range = 1 + return TRUE + +/// Using on change_priority: looks for a setting with the same number that we set earlier and reduce it. +/obj/machinery/big_manipulator/proc/check_similarities(number_we_minus) + for(var/datum/manipulator_priority/similarities as anything in allowed_priority_settings) + if(similarities.number != number_we_minus) + continue + similarities.number++ + break /// Manipulator hand. Effect we animate to show that the manipulator is working and moving something. /obj/effect/big_manipulator_hand @@ -276,7 +581,91 @@ icon = 'icons/obj/machines/big_manipulator_parts/big_manipulator_hand.dmi' icon_state = "hand" layer = LOW_ITEM_LAYER + appearance_flags = KEEP_TOGETHER | LONG_GLIDE | TILE_BOUND | PIXEL_SCALE anchored = TRUE greyscale_config = /datum/greyscale_config/manipulator_hand pixel_x = -32 pixel_y = -32 + /// We get item from big manipulator and takes its icon to create overlay. + var/datum/weakref/item_in_my_claw + /// Var to icon that used as overlay on manipulator claw to show what item it grabs. + var/mutable_appearance/icon_overlay + +/obj/effect/big_manipulator_hand/update_overlays() + . = ..() + if(isnull(item_in_my_claw)) + icon_overlay = null + return + var/atom/movable/item_data = item_in_my_claw.resolve() + icon_overlay = mutable_appearance(item_data.icon, item_data.icon_state, item_data.layer, src, item_data.appearance_flags) + icon_overlay.color = item_data.color + icon_overlay.appearance = item_data.appearance + icon_overlay.pixel_x = 32 + calculate_item_offset(is_x = TRUE) + icon_overlay.pixel_y = 32 + calculate_item_offset(is_x = FALSE) + . += icon_overlay + +/// Updates item that is in the claw. +/obj/effect/big_manipulator_hand/proc/update_claw(clawed_item) + item_in_my_claw = clawed_item + update_appearance() + +/// Calculate x and y coordinates so that the item icon appears in the claw and not somewhere in the corner. +/obj/effect/big_manipulator_hand/proc/calculate_item_offset(is_x = TRUE) + var/offset + switch(dir) + if(NORTH) + offset = is_x ? 0 : 32 + if(SOUTH) + offset = is_x ? 0 : -32 + if(EAST) + offset = is_x ? 32 : 0 + if(WEST) + offset = is_x ? -32 : 0 + return offset + +/// Priorities that manipulator use to choose to work on item with type same with what_type. +/datum/manipulator_priority + /// Name that user will see in ui. + var/name + /// What type carries this priority. + var/what_type + /** + * Place in the priority queue. The lower the number, the more important the priority. + * Doesn’t really matter what number you enter, user can set priority for themselves, + * BUT!!! + * Don't write the same numbers in the same parent otherwise something may go wrong. + */ + var/number + +/datum/manipulator_priority/for_drop/on_floor + name = "Drop on Floor" + what_type = /turf + number = 1 + +/datum/manipulator_priority/for_drop/in_storage + name = "Drop in Storage" + what_type = /obj/item/storage + number = 2 + +/datum/manipulator_priority/for_use/on_living + name = "Use on Living" + what_type = /mob/living + number = 1 + +/datum/manipulator_priority/for_use/on_structure + name = "Use on Structure" + what_type = /obj/structure + number = 2 + +/datum/manipulator_priority/for_use/on_machinery + name = "Use on Machinery" + what_type = /obj/machinery + number = 3 + +#undef DROP_ITEM_MODE +#undef USE_ITEM_MODE +#undef THROW_ITEM_MODE + +#undef TAKE_ITEMS +#undef TAKE_CLOSETS +#undef TAKE_HUMANS diff --git a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm index 13f350f1da192..76af0dc806c96 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm @@ -34,6 +34,18 @@ item_path = /obj/item/kinetic_crusher cost_per_order = 650 +/datum/orderable_item/mining/crusher_retool_kit + item_path = /obj/item/crusher_trophy/retool_kit + cost_per_order = 150 + +/datum/orderable_item/mining/crusher_retool_kit_harpoon + item_path = /obj/item/crusher_trophy/retool_kit/harpoon + cost_per_order = 150 + +/datum/orderable_item/mining/crusher_retool_kit_dagger + item_path = /obj/item/crusher_trophy/retool_kit/dagger + cost_per_order = 150 + /datum/orderable_item/mining/resonator item_path = /obj/item/resonator cost_per_order = 710 diff --git a/code/game/machinery/dna_infuser/dna_infusion.dm b/code/game/machinery/dna_infuser/dna_infusion.dm index 86a8a5f41e9f3..c902240404ca7 100644 --- a/code/game/machinery/dna_infuser/dna_infusion.dm +++ b/code/game/machinery/dna_infuser/dna_infusion.dm @@ -47,8 +47,6 @@ // Valid organ successfully picked. new_organ = new new_organ() new_organ.replace_into(src) - //make sure bodypart overlays are correctly displayed. - update_body_parts() return TRUE /// Picks a random mutated organ from the given infuser entry which is also compatible with this human. diff --git a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm index c551ce0c4e964..622cafaa7bfde 100644 --- a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm @@ -11,6 +11,7 @@ bonus_deactivate_text = span_notice("Your DNA is once again mostly yours, and so fades your ability to space-swim...") bonus_traits = list(TRAIT_SPACEWALK) limb_overlay = /datum/bodypart_overlay/texture/carpskin + color_overlay_priority = LIMB_COLOR_CARP_INFUSION ///Carp lungs! You can breathe in space! Oh... you can't breathe on the station, you need low oxygen environments. /// Inverts behavior of lungs. Bypasses suffocation due to space / lack of gas, but also allows Oxygen to suffocate. diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm index c2eeb0e7521a0..e7c89594e2c0e 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm @@ -223,8 +223,8 @@ icon_state = "gills" safe_oxygen_min = 0 //We don't breathe this - ///The required partial pressure of water_vapor for not drowing - var/safe_water_level = 29 + ///The required partial pressure of water_vapor for not suffocating. + var/safe_water_level = parent_type::safe_oxygen_min /// Bodypart overlay applied to the chest where the lungs are in var/datum/bodypart_overlay/simple/gills/gills @@ -240,6 +240,7 @@ gills = new() AddElement(/datum/element/noticable_organ, "%PRONOUN_Theyve a set of gills on %PRONOUN_their neck.", BODY_ZONE_PRECISE_MOUTH) AddComponent(/datum/component/bubble_icon_override, "fish", BUBBLE_ICON_PRIORITY_ORGAN) + AddComponent(/datum/component/speechmod, replacements = strings("crustacean_replacement.json", "crustacean")) /obj/item/organ/internal/lungs/fish/Destroy() QDEL_NULL(gills) @@ -301,7 +302,6 @@ name = "mutated semi-aquatic lungs" desc = "DNA from an amphibious or semi-aquatic creature infused on a pair lungs. Enjoy breathing underwater without drowning outside water." safe_oxygen_min = /obj/item/organ/internal/lungs::safe_oxygen_min - safe_water_level = 19 has_gills = FALSE /** * If false, we don't breathe air since we've got water instead. diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 8033c697bfa3d..8385a639b7f4a 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -2374,7 +2374,7 @@ new /obj/effect/temp_visual/cult/sac(loc) var/atom/throwtarget throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) - SEND_SOUND(L, sound(pick('sound/effects/hallucinations/turn_around1.ogg','sound/effects/hallucinations/turn_around2.ogg'),0,1,50)) + SEND_SOUND(L, sound(SFX_HALLUCINATION_TURN_AROUND,0,1,50)) flash_color(L, flash_color=COLOR_CULT_RED, flash_time=20) L.Paralyze(40) L.throw_at(throwtarget, 5, 1) diff --git a/code/game/machinery/photobooth.dm b/code/game/machinery/photobooth.dm index d1244bcc85d47..917e28947d1fc 100644 --- a/code/game/machinery/photobooth.dm +++ b/code/game/machinery/photobooth.dm @@ -130,7 +130,7 @@ if(obj_flags & EMAGGED) var/mob/living/carbon/carbon_occupant = occupant for(var/i in 1 to 5) //play a ton of sounds to mimic it blinding you - playsound(src, pick('sound/items/polaroid/polaroid1.ogg', 'sound/items/polaroid/polaroid2.ogg'), 75, TRUE) + playsound(src, SFX_POLAROID, 75, TRUE) if(carbon_occupant) carbon_occupant.flash_act(5) sleep(0.2 SECONDS) diff --git a/code/game/machinery/scanner_gate.dm b/code/game/machinery/scanner_gate.dm index 07df8db82c704..41b84a26ddfb0 100644 --- a/code/game/machinery/scanner_gate.dm +++ b/code/game/machinery/scanner_gate.dm @@ -177,6 +177,7 @@ var/beep = FALSE var/color = null var/detected_thing = null + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) switch(scangate_mode) if(SCANGATE_NONE) return diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 2d1a16986fbe8..ad9e517b11dd7 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -26,6 +26,9 @@ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' w_class = WEIGHT_CLASS_TINY + pickup_sound = 'sound/items/handling/id_card/id_card_pickup1.ogg' + drop_sound = 'sound/items/handling/id_card/id_card_drop1.ogg' + sound_vary = TRUE /// Cached icon that has been built for this card. Intended to be displayed in chat. Cardboards IDs and actual IDs use it. var/icon/cached_flat_icon @@ -1847,6 +1850,8 @@ var/scribbled_trim ///The colors for each of the above variables, for when overlays are updated. var/details_colors = list(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK) + pickup_sound = 'sound/items/handling/materials/cardboard_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/cardboard_drop.ogg' /obj/item/card/cardboard/equipped(mob/user, slot, initial = FALSE) . = ..() diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index dad44d69e7ea7..f2d81ac4bde1d 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -4,12 +4,11 @@ name = "chainsaw" desc = "A versatile power tool. Useful for limbing trees and delimbing humans." icon = 'icons/obj/weapons/chainsaw.dmi' - icon_state = "chainsaw_off" + icon_state = "chainsaw" lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' obj_flags = CONDUCTS_ELECTRICITY force = 13 - var/force_on = 24 w_class = WEIGHT_CLASS_HUGE throwforce = 13 throw_speed = 2 @@ -23,68 +22,28 @@ actions_types = list(/datum/action/item_action/startchainsaw) tool_behaviour = TOOL_SAW toolspeed = 1.5 //Turn it on first you dork - var/on = FALSE - ///The looping sound for our chainsaw when running + var/force_on = 24 + /// The looping sound for our chainsaw when running var/datum/looping_sound/chainsaw/chainsaw_loop - ///how long it takes to behead someone with this chainsaw. + /// How long it takes to behead someone with this chainsaw. var/behead_time = 15 SECONDS -/obj/item/chainsaw/apply_fantasy_bonuses(bonus) - . = ..() - force_on = modify_fantasy_variable("force_on", force_on, bonus) - if(on) - force = force_on - -/obj/item/chainsaw/remove_fantasy_bonuses(bonus) - force_on = reset_fantasy_variable("force_on", force_on) - if(on) - force = force_on - return ..() - /obj/item/chainsaw/Initialize(mapload) . = ..() chainsaw_loop = new(src) apply_components() + AddComponent( \ + /datum/component/transforming, \ + force_on = force_on, \ + throwforce_on = force_on, \ + throw_speed_on = throw_speed, \ + sharpness_on = SHARP_EDGED, \ + hitsound_on = 'sound/items/weapons/chainsawhit.ogg', \ + w_class_on = w_class, \ + ) -/obj/item/chainsaw/suicide_act(mob/living/carbon/user) - if(on) - user.visible_message(span_suicide("[user] begins to tear [user.p_their()] head off with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(src, 'sound/items/weapons/chainsawhit.ogg', 100, TRUE) - var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD) - if(myhead) - myhead.dismember() - else - user.visible_message(span_suicide("[user] smashes [src] into [user.p_their()] neck, destroying [user.p_their()] esophagus! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(src, 'sound/items/weapons/genhit1.ogg', 100, TRUE) - return BRUTELOSS - -/obj/item/chainsaw/attack_self(mob/user) - on = !on - to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]") - force = on ? force_on : initial(force) - throwforce = on ? force_on : initial(force) - icon_state = "chainsaw_[on ? "on" : "off"]" - var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) - butchering.butchering_enabled = on - - if(on) - hitsound = 'sound/items/weapons/chainsawhit.ogg' - chainsaw_loop.start() - else - hitsound = SFX_SWING_HIT - chainsaw_loop.stop() + RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) - toolspeed = on ? 0.5 : initial(toolspeed) //Turning it on halves the speed - if(src == user.get_active_held_item()) //update inhands - user.update_held_items() - update_item_action_buttons() - -/** - * Handles adding components to the chainsaw. Added in Initialize() - * - * Applies components to the chainsaw. Added as a separate proc to allow for - * variance between subtypes - */ /obj/item/chainsaw/proc/apply_components() AddComponent(/datum/component/butchering, \ speed = 3 SECONDS, \ @@ -93,14 +52,34 @@ butcher_sound = 'sound/items/weapons/chainsawhit.ogg', \ disabled = TRUE, \ ) - AddComponent(/datum/component/two_handed, require_twohands=TRUE) + AddComponent(/datum/component/two_handed, require_twohands = TRUE) -/obj/item/chainsaw/doomslayer - name = "THE GREAT COMMUNICATOR" - desc = span_warning("VRRRRRRR!!!") - armour_penetration = 100 - force_on = 30 - behead_time = 2 SECONDS +/obj/item/chainsaw/proc/on_transform(obj/item/source, mob/user, active) + SIGNAL_HANDLER + + to_chat(user, span_notice("As you pull the starting cord dangling from [src], [active ? "it begins to whirr" : "the chain stops moving"].")) + var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering) + butchering.butchering_enabled = active + if (active) + chainsaw_loop.start() + else + chainsaw_loop.stop() + + toolspeed = active ? 0.5 : initial(toolspeed) + update_item_action_buttons() + +/obj/item/chainsaw/suicide_act(mob/living/carbon/user) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + user.visible_message(span_suicide("[user] smashes [src] into [user.p_their()] neck, destroying [user.p_their()] esophagus! It looks like [user.p_theyre()] trying to commit suicide!")) + playsound(src, 'sound/items/weapons/genhit1.ogg', 100, TRUE) + return BRUTELOSS + + user.visible_message(span_suicide("[user] begins to tear [user.p_their()] head off with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) + playsound(src, 'sound/items/weapons/chainsawhit.ogg', 100, TRUE) + var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD) + if(myhead) + myhead.dismember() + return BRUTELOSS /obj/item/chainsaw/attack(mob/living/target_mob, mob/living/user, params) if (target_mob.stat != DEAD) @@ -124,16 +103,30 @@ return TRUE +/obj/item/chainsaw/proc/has_same_head(mob/living/target_mob, obj/item/bodypart/head) + return target_mob.get_bodypart(BODY_ZONE_HEAD) == head + +/** + * Handles adding components to the chainsaw. Added in Initialize() + * + * Applies components to the chainsaw. Added as a separate proc to allow for + * variance between subtypes + */ + +/obj/item/chainsaw/doomslayer + name = "THE GREAT COMMUNICATOR" + desc = span_warning("VRRRRRRR!!!") + armour_penetration = 100 + force_on = 30 + behead_time = 2 SECONDS + /obj/item/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(attack_type == PROJECTILE_ATTACK) owner.visible_message(span_danger("Ranged attacks just make [owner] angrier!")) - playsound(src, pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 75, TRUE) + playsound(src, SFX_BULLET_MISS, 75, TRUE) return TRUE return FALSE -/obj/item/chainsaw/proc/has_same_head(mob/living/target_mob, obj/item/bodypart/head) - return target_mob.get_bodypart(BODY_ZONE_HEAD) == head - /obj/item/chainsaw/mounted_chainsaw name = "mounted chainsaw" desc = "A chainsaw that has replaced your arm." diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 12cb48c3a478d..828da83dc24eb 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -1751,7 +1751,7 @@ build_path = /obj/machinery/power/manufacturing/lathe req_components = list( /obj/item/stack/sheet/iron = 5, - /datum/stock_part/servo = 1, + /datum/stock_part/matter_bin = 1, ) /obj/item/circuitboard/machine/manucrusher diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index aae5e80776720..894d7c9c94e41 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -184,6 +184,7 @@ var/icon = target var/message = list() + playsound(user, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) if(!silent && isliving(user)) user.visible_message(span_notice("[user] uses the analyzer on [icon2html(icon, viewers(user))] [target]."), span_notice("You use the analyzer on [icon2html(icon, user)] [target].")) message += span_boldnotice("Results of analysis of [icon2html(icon, user)] [target].") diff --git a/code/game/objects/items/devices/scanners/slime_scanner.dm b/code/game/objects/items/devices/scanners/slime_scanner.dm index 7f7453bb4b9d7..79050f0a78c67 100644 --- a/code/game/objects/items/devices/scanners/slime_scanner.dm +++ b/code/game/objects/items/devices/scanners/slime_scanner.dm @@ -22,6 +22,7 @@ to_chat(user, span_warning("This device can only scan slimes!")) return ITEM_INTERACT_BLOCKING var/mob/living/basic/slime/scanned_slime = interacting_with + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) slime_scan(scanned_slime, user) return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/devices/scanners/t_scanner.dm b/code/game/objects/items/devices/scanners/t_scanner.dm index 555e6cc88619f..931b69bb7bd37 100644 --- a/code/game/objects/items/devices/scanners/t_scanner.dm +++ b/code/game/objects/items/devices/scanners/t_scanner.dm @@ -21,6 +21,7 @@ return TOXLOSS /obj/item/t_scanner/proc/toggle_on() + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) on = !on icon_state = copytext_char(icon_state, 1, -1) + "[on]" if(on) diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm index db493b341d16a..7a2054e665763 100644 --- a/code/game/objects/items/food/burgers.dm +++ b/code/game/objects/items/food/burgers.dm @@ -255,7 +255,7 @@ var/obj/machinery/light/light = locate(/obj/machinery/light) in view(4, src) light?.flicker() if(62 to 64) - playsound(loc, pick('sound/effects/hallucinations/i_see_you1.ogg', 'sound/effects/hallucinations/i_see_you2.ogg'), 50, TRUE, ignore_walls = FALSE) + playsound(loc, SFX_HALLUCINATION_I_SEE_YOU, 50, TRUE, ignore_walls = FALSE) if(61) visible_message("[src] spews out a glob of ectoplasm!") new /obj/effect/decal/cleanable/greenglow/ecto(loc) diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index 93d4cd65f3452..eb38b5a97836e 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -187,7 +187,7 @@ log_combat(user, target, "given a noogie to", addition = "([damage] brute before armor)") target.apply_damage(damage, BRUTE, BODY_ZONE_HEAD) user.adjustStaminaLoss(iteration + 5) - playsound(get_turf(user), pick('sound/effects/rustle/rustle1.ogg','sound/effects/rustle/rustle2.ogg','sound/effects/rustle/rustle3.ogg','sound/effects/rustle/rustle4.ogg','sound/effects/rustle/rustle5.ogg'), 50) + playsound(get_turf(user), SFX_RUSTLE, 50) if(prob(33)) user.visible_message(span_danger("[user] continues noogie'ing [target]!"), span_warning("You continue giving [target] a noogie!"), vision_distance=COMBAT_MESSAGE_RANGE, ignored_mobs=target) diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index c22bf5d2ac60d..d4abe4c1d1a5b 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -115,7 +115,7 @@ visible_message(span_warning("[user] starts scanning [interacting_with] with [src]")) to_chat(interacting_with, span_userdanger("[user] is trying to scan you for contraband!")) balloon_alert_to_viewers("scanning...") - playsound(src, 'sound/effects/genetics.ogg', 40, FALSE) + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) COOLDOWN_START(src, scanning_person, 4 SECONDS) if(!do_after(user, 4 SECONDS, interacting_with)) return ITEM_INTERACT_BLOCKING diff --git a/code/game/objects/items/kirby_plants/kirbyplants.dm b/code/game/objects/items/kirby_plants/kirbyplants.dm index 3b83839022cdf..59231d86693b7 100644 --- a/code/game/objects/items/kirby_plants/kirbyplants.dm +++ b/code/game/objects/items/kirby_plants/kirbyplants.dm @@ -19,7 +19,7 @@ var/dead = FALSE ///If it's a special named plant, set this to true to prevent dead-name overriding. var/custom_plant_name = FALSE - var/list/static/random_plant_states + var/static/list/random_plant_states /obj/item/kirbyplants/Initialize(mapload) . = ..() @@ -65,23 +65,25 @@ /// Cycle basic plant visuals /obj/item/kirbyplants/proc/change_visual() - if(!random_plant_states) - generate_states() + if(isnull(random_plant_states)) + random_plant_states = generate_states() var/current = random_plant_states.Find(icon_state) var/next = WRAP(current+1,1,length(random_plant_states)) base_icon_state = random_plant_states[next] update_appearance(UPDATE_ICON) /obj/item/kirbyplants/proc/generate_states() - random_plant_states = list() + var/list/plant_states = list() for(var/i in 1 to 24) var/number if(i < 10) number = "0[i]" else number = "[i]" - random_plant_states += "plant-[number]" - random_plant_states += "applebush" + plant_states += "plant-[number]" + plant_states += "applebush" + + return plant_states /obj/item/kirbyplants/random icon = 'icons/obj/fluff/flora/_flora.dmi' diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 7c7f998251c12..cec45a404ab34 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -544,7 +544,7 @@ greyscale_config = /datum/greyscale_config/plush_spacelizard // space lizards can't hit people with their tail, it's stuck in their suit attack_verb_continuous = list("claws", "hisses", "bops") - attack_verb_simple = list("claw", "hiss", "bops") + attack_verb_simple = list("claw", "hiss", "bop") /obj/item/toy/plush/lizard_plushie/space/green desc = "An adorable stuffed toy that resembles a very determined spacefaring green lizardperson. To infinity and beyond, little guy. This one fills you with nostalgia and soul." diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 4520c60bae064..5a9a59b60dceb 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -607,7 +607,13 @@ smoke.start() sleep(0.2 SECONDS) for(var/i in 1 to 4) - playsound(borg, pick('sound/items/tools/drill_use.ogg', 'sound/items/tools/jaws_cut.ogg', 'sound/items/tools/jaws_pry.ogg', 'sound/items/tools/welder.ogg', 'sound/items/tools/ratchet.ogg'), 80, TRUE, -1) + playsound(borg, pick( + 'sound/items/tools/drill_use.ogg', + 'sound/items/tools/jaws_cut.ogg', + 'sound/items/tools/jaws_pry.ogg', + 'sound/items/tools/welder.ogg', + 'sound/items/tools/ratchet.ogg', + ), 80, TRUE, -1) sleep(1.2 SECONDS) if(!prev_lockcharge) borg.SetLockdown(FALSE) diff --git a/code/game/objects/items/stacks/golem_food/golem_status_effects.dm b/code/game/objects/items/stacks/golem_food/golem_status_effects.dm index db77c63d375f4..95c87cbb5dac9 100644 --- a/code/game/objects/items/stacks/golem_food/golem_status_effects.dm +++ b/code/game/objects/items/stacks/golem_food/golem_status_effects.dm @@ -108,17 +108,13 @@ /datum/bodypart_overlay/simple/golem_overlay/proc/add_to_bodypart(prefix, obj/item/bodypart/part) icon_state = "[prefix]_[part.body_zone]" attached_bodypart = WEAKREF(part) - part.add_bodypart_overlay(src) + part.add_bodypart_overlay(src, update = FALSE) /datum/bodypart_overlay/simple/golem_overlay/Destroy(force) var/obj/item/bodypart/referenced_bodypart = attached_bodypart.resolve() if(!referenced_bodypart) return ..() referenced_bodypart.remove_bodypart_overlay(src) - if(referenced_bodypart.owner) //Keep in mind that the bodypart could have been severed from the owner by now - referenced_bodypart.owner.update_body_parts() - else - referenced_bodypart.update_icon_dropped() return ..() /// Freezes hunger for the duration diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 558689f70b048..f410eafcd484e 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -229,6 +229,8 @@ icon_state = "medical" inhand_icon_state = "medical" worn_icon_state = "medical" + drop_sound = 'sound/items/handling/toolbelt_drop.ogg' + pickup_sound = 'sound/items/handling/toolbelt_pickup.ogg' /obj/item/storage/belt/medical/Initialize(mapload) . = ..() @@ -489,6 +491,8 @@ icon_state = "soulstonebelt" inhand_icon_state = "soulstonebelt" worn_icon_state = "soulstonebelt" + drop_sound = 'sound/items/handling/toolbelt_drop.ogg' + pickup_sound = 'sound/items/handling/toolbelt_pickup.ogg' /obj/item/storage/belt/soulstone/Initialize(mapload) . = ..() @@ -624,6 +628,8 @@ icon_state = "grenadebeltnew" inhand_icon_state = "security" worn_icon_state = "grenadebeltnew" + drop_sound = 'sound/items/handling/toolbelt_drop.ogg' + pickup_sound = 'sound/items/handling/toolbelt_pickup.ogg' /obj/item/storage/belt/grenade/Initialize(mapload) . = ..() @@ -687,6 +693,8 @@ icon_state = "janibelt" inhand_icon_state = "janibelt" worn_icon_state = "janibelt" + drop_sound = 'sound/items/handling/toolbelt_drop.ogg' + pickup_sound = 'sound/items/handling/toolbelt_pickup.ogg' /obj/item/storage/belt/janitor/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index c9270b1f67ef6..b622a761c422e 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1815,6 +1815,6 @@ GLOBAL_LIST_EMPTY(intento_players) icon = 'icons/obj/weapons/guns/magic.dmi' slot_flags = ITEM_SLOT_BACK attack_verb_continuous = list("smacks", "clubs", "wacks", "vendors") - attack_verb_simple = list("smack", "club", "wacks", "vendor") + attack_verb_simple = list("smack", "club", "wack", "vendor") w_class = WEIGHT_CLASS_SMALL resistance_flags = FLAMMABLE diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index bddc056b99ef8..65a0dc0e76afb 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -1169,7 +1169,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(attack_type == PROJECTILE_ATTACK) if(HAS_TRAIT(src, TRAIT_WIELDED) || prob(final_block_chance)) owner.visible_message(span_danger("[owner] deflects [attack_text] with [src]!")) - playsound(src, pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 75, TRUE) + playsound(src, SFX_BULLET_MISS, 75, TRUE) return TRUE return FALSE if(prob(final_block_chance * (HAS_TRAIT(src, TRAIT_WIELDED) ? 2 : 1))) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 3aff67f956885..8410fd950160e 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -18,18 +18,31 @@ var/buildstackamount = 1 var/item_chair = /obj/item/chair // if null it can't be picked up ///How much sitting on this chair influences fishing difficulty - var/fishing_modifier = -3 + var/fishing_modifier = -5 + var/has_armrest = FALSE + // The mutable appearance used for the overlay over buckled mobs. + var/mutable_appearance/armrest /obj/structure/chair/Initialize(mapload) . = ..() if(prob(0.2)) ru_names_rename(RU_NAMES_LIST("tactical [name]", "тактический стул", "тактического стула", "тактическому стулу", "тактический стул", "тактическим стулом", "тактическом стуле")) name = "tactical [name]" - fishing_modifier -= 4 + fishing_modifier -= 8 MakeRotate() + if (has_armrest) + gen_armrest() if(can_buckle && fishing_modifier) AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) +/obj/structure/chair/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) + if(same_z_layer || !has_armrest) + return ..() + cut_overlay(armrest) + QDEL_NULL(armrest) + gen_armrest() + return ..() + /obj/structure/chair/examine(mob/user) . = ..() . += span_notice("It's held together by a couple of bolts.") @@ -42,6 +55,7 @@ /obj/structure/chair/Destroy() SSjob.latejoin_trackers -= src //These may be here due to the arrivals shuttle + QDEL_NULL(armrest) return ..() /obj/structure/chair/atom_deconstruct(disassembled) @@ -65,6 +79,19 @@ return . = ..() +/obj/structure/chair/proc/gen_armrest() + armrest = GetArmrest() + armrest.layer = ABOVE_MOB_LAYER + update_armrest() + +/obj/structure/chair/proc/GetArmrest() + return mutable_appearance(icon, "[icon_state]_armrest") + +/obj/structure/chair/proc/update_armrest() + if(has_buckled_mobs()) + add_overlay(armrest) + else + cut_overlay(armrest) ///allows each chair to request the electrified_buckle component with overlays that dont look ridiculous /obj/structure/chair/proc/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs) @@ -113,10 +140,14 @@ /obj/structure/chair/post_buckle_mob(mob/living/M) . = ..() handle_layer() + if (has_armrest) + update_armrest() /obj/structure/chair/post_unbuckle_mob() . = ..() handle_layer() + if (has_armrest) + update_armrest() /obj/structure/chair/setDir(newdir) ..() @@ -140,7 +171,7 @@ buildstacktype = /obj/item/stack/sheet/mineral/wood buildstackamount = 3 item_chair = /obj/item/chair/wood - fishing_modifier = -4 + fishing_modifier = -6 /obj/structure/chair/wood/narsie_act() return @@ -158,47 +189,8 @@ max_integrity = 70 buildstackamount = 2 item_chair = null - fishing_modifier = -5 - // The mutable appearance used for the overlay over buckled mobs. - var/mutable_appearance/armrest - -/obj/structure/chair/comfy/Initialize(mapload) - gen_armrest() - return ..() - -/obj/structure/chair/comfy/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) - if(same_z_layer) - return ..() - cut_overlay(armrest) - QDEL_NULL(armrest) - gen_armrest() - return ..() - -/obj/structure/chair/comfy/proc/gen_armrest() - armrest = GetArmrest() - armrest.layer = ABOVE_MOB_LAYER - update_armrest() - -/obj/structure/chair/comfy/proc/GetArmrest() - return mutable_appearance(icon, "[icon_state]_armrest") - -/obj/structure/chair/comfy/Destroy() - QDEL_NULL(armrest) - return ..() - -/obj/structure/chair/comfy/post_buckle_mob(mob/living/M) - . = ..() - update_armrest() - -/obj/structure/chair/comfy/proc/update_armrest() - if(has_buckled_mobs()) - add_overlay(armrest) - else - cut_overlay(armrest) - -/obj/structure/chair/comfy/post_unbuckle_mob() - . = ..() - update_armrest() + fishing_modifier = -7 + has_armrest = TRUE /obj/structure/chair/comfy/brown color = rgb(70, 47, 28) @@ -234,13 +226,13 @@ desc = "A luxurious chair, the many purple scales reflect the light in a most pleasing manner." icon_state = "carp_chair" buildstacktype = /obj/item/stack/sheet/animalhide/carp - fishing_modifier = -10 + fishing_modifier = -12 /obj/structure/chair/office anchored = FALSE buildstackamount = 5 item_chair = null - fishing_modifier = -4 + fishing_modifier = -6 icon_state = "officechair_dark" /obj/structure/chair/office/Initialize(mapload) @@ -254,10 +246,7 @@ /obj/structure/chair/office/tactical name = "tactical swivel chair" - -/obj/structure/chair/office/tactical/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -10) + fishing_modifier = -10 /obj/structure/chair/office/light icon_state = "officechair_white" @@ -461,7 +450,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) buildstacktype = /obj/item/stack/sheet/bronze buildstackamount = 1 item_chair = null - fishing_modifier = -12 //the pinnacle of Ratvarian technology. + fishing_modifier = -13 //the pinnacle of Ratvarian technology. + has_armrest = TRUE /// Total rotations made var/turns = 0 @@ -480,6 +470,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) if(turns >= 8) STOP_PROCESSING(SSfastprocess, src) +/obj/structure/chair/bronze/MakeRotate() + return + /obj/structure/chair/bronze/click_alt(mob/user) turns = 0 if(!(datum_flags & DF_ISPROCESSING)) @@ -501,7 +494,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) item_chair = null obj_flags = parent_type::obj_flags | NO_DEBRIS_AFTER_DECONSTRUCTION alpha = 0 - fishing_modifier = -20 //it only lives for 25 seconds, so we make them worth it. + fishing_modifier = -21 //it only lives for 25 seconds, so we make them worth it. /obj/structure/chair/mime/wrench_act_secondary(mob/living/user, obj/item/weapon) return NONE @@ -523,7 +516,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) buildstacktype = /obj/item/stack/sheet/plastic buildstackamount = 2 item_chair = /obj/item/chair/plastic - fishing_modifier = -8 + fishing_modifier = -10 /obj/structure/chair/plastic/post_buckle_mob(mob/living/Mob) Mob.pixel_y += 2 diff --git a/code/game/objects/structures/beds_chairs/pew.dm b/code/game/objects/structures/beds_chairs/pew.dm index 6388247e8c426..e6c64d9f36f03 100644 --- a/code/game/objects/structures/beds_chairs/pew.dm +++ b/code/game/objects/structures/beds_chairs/pew.dm @@ -16,83 +16,9 @@ /obj/structure/chair/pew/left name = "left wooden pew end" icon_state = "pewend_left" - var/mutable_appearance/leftpewarmrest - -/obj/structure/chair/pew/left/Initialize(mapload) - gen_armrest() - return ..() - -/obj/structure/chair/pew/left/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) - if(same_z_layer) - return ..() - cut_overlay(leftpewarmrest) - QDEL_NULL(leftpewarmrest) - gen_armrest() - return ..() - -/obj/structure/chair/pew/left/proc/gen_armrest() - leftpewarmrest = GetLeftPewArmrest() - leftpewarmrest.layer = ABOVE_MOB_LAYER - update_leftpewarmrest() - -/obj/structure/chair/pew/left/proc/GetLeftPewArmrest() - return mutable_appearance('icons/obj/chairs_wide.dmi', "pewend_left_armrest") - -/obj/structure/chair/pew/left/Destroy() - QDEL_NULL(leftpewarmrest) - return ..() - -/obj/structure/chair/pew/left/post_buckle_mob(mob/living/M) - . = ..() - update_leftpewarmrest() - -/obj/structure/chair/pew/left/proc/update_leftpewarmrest() - if(has_buckled_mobs()) - add_overlay(leftpewarmrest) - else - cut_overlay(leftpewarmrest) - -/obj/structure/chair/pew/left/post_unbuckle_mob() - . = ..() - update_leftpewarmrest() + has_armrest = TRUE /obj/structure/chair/pew/right name = "right wooden pew end" icon_state = "pewend_right" - var/mutable_appearance/rightpewarmrest - -/obj/structure/chair/pew/right/Initialize(mapload) - gen_armrest() - return ..() - -/obj/structure/chair/pew/right/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) - cut_overlay(rightpewarmrest) - QDEL_NULL(rightpewarmrest) - gen_armrest() - return ..() - -/obj/structure/chair/pew/right/proc/gen_armrest() - rightpewarmrest = GetRightPewArmrest() - rightpewarmrest.layer = ABOVE_MOB_LAYER - update_rightpewarmrest() - -/obj/structure/chair/pew/right/proc/GetRightPewArmrest() - return mutable_appearance('icons/obj/chairs_wide.dmi', "pewend_right_armrest") - -/obj/structure/chair/pew/right/Destroy() - QDEL_NULL(rightpewarmrest) - return ..() - -/obj/structure/chair/pew/right/post_buckle_mob(mob/living/M) - . = ..() - update_rightpewarmrest() - -/obj/structure/chair/pew/right/proc/update_rightpewarmrest() - if(has_buckled_mobs()) - add_overlay(rightpewarmrest) - else - cut_overlay(rightpewarmrest) - -/obj/structure/chair/pew/right/post_unbuckle_mob() - . = ..() - update_rightpewarmrest() + has_armrest = TRUE diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm index 04bb0b1e25e3f..4c1278d38912f 100644 --- a/code/game/objects/structures/beds_chairs/sofa.dm +++ b/code/game/objects/structures/beds_chairs/sofa.dm @@ -19,45 +19,18 @@ path/corner/color_name {\ icon = 'icons/obj/chairs_wide.dmi' buildstackamount = 1 item_chair = null - fishing_modifier = -4 - var/mutable_appearance/armrest + fishing_modifier = -6 + has_armrest = TRUE /obj/structure/chair/sofa/Initialize(mapload) . = ..() - gen_armrest() AddElement(/datum/element/soft_landing) -/obj/structure/chair/sofa/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) - if(same_z_layer) - return ..() - cut_overlay(armrest) - QDEL_NULL(armrest) - gen_armrest() - return ..() - -/obj/structure/chair/sofa/proc/gen_armrest() - armrest = mutable_appearance(initial(icon), "[icon_state]_armrest", ABOVE_MOB_LAYER) - update_armrest() - /obj/structure/chair/sofa/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs) if(!overlays_from_child_procs) overlays_from_child_procs = list(image('icons/obj/chairs.dmi', loc, "echair_over", pixel_x = -1)) . = ..() -/obj/structure/chair/sofa/post_buckle_mob(mob/living/M) - . = ..() - update_armrest() - -/obj/structure/chair/sofa/proc/update_armrest() - if(has_buckled_mobs()) - add_overlay(armrest) - else - cut_overlay(armrest) - -/obj/structure/chair/sofa/post_unbuckle_mob() - . = ..() - update_armrest() - /obj/structure/chair/sofa/corner/handle_layer() //only the armrest/back of this chair should cover the mob. return diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index 1b7143ceabf21..938ea60f9e561 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -60,6 +60,7 @@ /obj/structure/geyser/attackby(obj/item/item, mob/user, params) if(!istype(item, /obj/item/mining_scanner) && !istype(item, /obj/item/t_scanner/adv_mining_scanner)) + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) return ..() //this runs the plunger code if(discovered) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index a0ed1013f549b..5fd3b2b435a4a 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -346,14 +346,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) var/new_hair_color = input(user, "Choose your hair color", "Hair Color", user.hair_color) as color|null if(new_hair_color) - user.set_haircolor(sanitize_hexcolor(new_hair_color), update = FALSE) + user.set_haircolor(sanitize_hexcolor(new_hair_color)) user.dna.update_ui_block(DNA_HAIR_COLOR_BLOCK) if(user.physique == MALE) var/new_face_color = input(user, "Choose your facial hair color", "Hair Color", user.facial_hair_color) as color|null if(new_face_color) - user.set_facial_haircolor(sanitize_hexcolor(new_face_color), update = FALSE) + user.set_facial_haircolor(sanitize_hexcolor(new_face_color)) user.dna.update_ui_block(DNA_FACIAL_HAIR_COLOR_BLOCK) - user.update_body_parts() /obj/structure/mirror/magic/attack_hand(mob/living/carbon/human/user) . = ..() diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 61a82d8f7f61b..0256b2cee30b0 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -260,8 +260,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) return var/mob/living/living_target = target check_heat(living_target) - living_target.add_mood_event("shower", /datum/mood_event/nice_shower) living_target.apply_status_effect(/datum/status_effect/shower_regen) + if(!HAS_TRAIT(target, TRAIT_WATER_HATER) || HAS_TRAIT(target, TRAIT_WATER_ADAPTATION)) + living_target.add_mood_event("shower", /datum/mood_event/nice_shower) + else + living_target.add_mood_event("shower", /datum/mood_event/shower_hater) /** * Toggle whether shower is actually on and outputting water. diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index a30a59e45a2c1..11f4817b94cf7 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -12,7 +12,7 @@ var/charges = INFINITY var/antimagic_flags = MAGIC_RESISTANCE - var/list/static/ignore_typecache + var/static/list/ignore_typecache var/list/mob/immune_minds = list() var/sparks = TRUE @@ -30,7 +30,7 @@ ) AddElement(/datum/element/connect_loc, loc_connections) - if(!ignore_typecache) + if(isnull(ignore_typecache)) ignore_typecache = typecacheof(list( /obj/effect, /mob/dead, diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 5be22d5cb8632..032b86721b0bb 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -867,6 +867,32 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw rad_insulation = RAD_EXTREME_INSULATION glass_material_datum = /datum/material/alloy/plastitaniumglass +/obj/structure/window/reinforced/plasma/plastitanium/indestructible + name = "plastitanium window" + desc = "A durable looking window made of an alloy of of plasma and titanium." + icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' + icon_state = "plastitanium_window-0" + base_icon_state = "plastitanium_window" + max_integrity = 1200 + wtype = "shuttle" + fulltile = TRUE + flags_1 = PREVENT_CLICK_UNDER_1 + obj_flags = CAN_BE_HIT + heat_resistance = 1600 + armor_type = /datum/armor/plasma_plastitanium + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + explosion_block = 3 + damage_deflection = 21 //The same as reinforced plasma windows.3 + glass_type = /obj/item/stack/sheet/plastitaniumglass + glass_amount = 2 + rad_insulation = RAD_EXTREME_INSULATION + glass_material_datum = /datum/material/alloy/plastitaniumglass + name = "hardened shuttle window" + flags_1 = PREVENT_CLICK_UNDER_1 + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + /datum/armor/plasma_plastitanium melee = 95 bomb = 50 diff --git a/code/game/sound.dm b/code/game/sound.dm index 60656e73690c0..0e3c713557772 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -210,36 +210,93 @@ return soundin switch(soundin) if(SFX_SHATTER) - soundin = pick('sound/effects/glass/glassbr1.ogg','sound/effects/glass/glassbr2.ogg','sound/effects/glass/glassbr3.ogg') + soundin = pick( + 'sound/effects/glass/glassbr1.ogg', + 'sound/effects/glass/glassbr2.ogg', + 'sound/effects/glass/glassbr3.ogg', + ) if(SFX_EXPLOSION) - soundin = pick('sound/effects/explosion/explosion1.ogg','sound/effects/explosion/explosion2.ogg') + soundin = pick( + 'sound/effects/explosion/explosion1.ogg', + 'sound/effects/explosion/explosion2.ogg', + ) if(SFX_EXPLOSION_CREAKING) - soundin = pick('sound/effects/explosion/explosioncreak1.ogg', 'sound/effects/explosion/explosioncreak2.ogg') + soundin = pick( + 'sound/effects/explosion/explosioncreak1.ogg', + 'sound/effects/explosion/explosioncreak2.ogg', + ) if(SFX_HULL_CREAKING) - soundin = pick('sound/effects/creak/creak1.ogg', 'sound/effects/creak/creak2.ogg', 'sound/effects/creak/creak3.ogg') + soundin = pick( + 'sound/effects/creak/creak1.ogg', + 'sound/effects/creak/creak2.ogg', + 'sound/effects/creak/creak3.ogg', + ) if(SFX_SPARKS) - soundin = pick('sound/effects/sparks/sparks1.ogg','sound/effects/sparks/sparks2.ogg','sound/effects/sparks/sparks3.ogg','sound/effects/sparks/sparks4.ogg') + soundin = pick( + 'sound/effects/sparks/sparks1.ogg', + 'sound/effects/sparks/sparks2.ogg', + 'sound/effects/sparks/sparks3.ogg', + 'sound/effects/sparks/sparks4.ogg', + ) if(SFX_RUSTLE) - soundin = pick('sound/effects/rustle/rustle1.ogg','sound/effects/rustle/rustle2.ogg','sound/effects/rustle/rustle3.ogg','sound/effects/rustle/rustle4.ogg','sound/effects/rustle/rustle5.ogg') + soundin = pick( + 'sound/effects/rustle/rustle1.ogg', + 'sound/effects/rustle/rustle2.ogg', + 'sound/effects/rustle/rustle3.ogg', + 'sound/effects/rustle/rustle4.ogg', + 'sound/effects/rustle/rustle5.ogg', + ) if(SFX_BODYFALL) - soundin = pick('sound/effects/bodyfall/bodyfall1.ogg','sound/effects/bodyfall/bodyfall2.ogg','sound/effects/bodyfall/bodyfall3.ogg','sound/effects/bodyfall/bodyfall4.ogg') + soundin = pick( + 'sound/effects/bodyfall/bodyfall1.ogg', + 'sound/effects/bodyfall/bodyfall2.ogg', + 'sound/effects/bodyfall/bodyfall3.ogg', + 'sound/effects/bodyfall/bodyfall4.ogg', + ) if(SFX_PUNCH) - soundin = pick('sound/items/weapons/punch1.ogg','sound/items/weapons/punch2.ogg','sound/items/weapons/punch3.ogg','sound/items/weapons/punch4.ogg') + soundin = pick( + 'sound/items/weapons/punch1.ogg', + 'sound/items/weapons/punch2.ogg', + 'sound/items/weapons/punch3.ogg', + 'sound/items/weapons/punch4.ogg', + ) if(SFX_CLOWN_STEP) - soundin = pick('sound/effects/footstep/clownstep1.ogg','sound/effects/footstep/clownstep2.ogg') + soundin = pick( + 'sound/effects/footstep/clownstep1.ogg', + 'sound/effects/footstep/clownstep2.ogg', + ) if(SFX_SUIT_STEP) soundin = pick( 'sound/items/handling/armor_rustle/riot_armor/suitstep1.ogg', 'sound/items/handling/armor_rustle/riot_armor/suitstep2.ogg', ) if(SFX_SWING_HIT) - soundin = pick('sound/items/weapons/genhit1.ogg', 'sound/items/weapons/genhit2.ogg', 'sound/items/weapons/genhit3.ogg') + soundin = pick( + 'sound/items/weapons/genhit1.ogg', + 'sound/items/weapons/genhit2.ogg', + 'sound/items/weapons/genhit3.ogg', + ) if(SFX_HISS) - soundin = pick('sound/mobs/non-humanoids/hiss/hiss1.ogg','sound/mobs/non-humanoids/hiss/hiss2.ogg','sound/mobs/non-humanoids/hiss/hiss3.ogg','sound/mobs/non-humanoids/hiss/hiss4.ogg') + soundin = pick( + 'sound/mobs/non-humanoids/hiss/hiss1.ogg', + 'sound/mobs/non-humanoids/hiss/hiss2.ogg', + 'sound/mobs/non-humanoids/hiss/hiss3.ogg', + 'sound/mobs/non-humanoids/hiss/hiss4.ogg', + ) if(SFX_PAGE_TURN) - soundin = pick('sound/effects/page_turn/pageturn1.ogg', 'sound/effects/page_turn/pageturn2.ogg','sound/effects/page_turn/pageturn3.ogg') + soundin = pick( + 'sound/effects/page_turn/pageturn1.ogg', + 'sound/effects/page_turn/pageturn2.ogg', + 'sound/effects/page_turn/pageturn3.ogg', + ) if(SFX_RICOCHET) - soundin = pick( 'sound/items/weapons/effects/ric1.ogg', 'sound/items/weapons/effects/ric2.ogg','sound/items/weapons/effects/ric3.ogg','sound/items/weapons/effects/ric4.ogg','sound/items/weapons/effects/ric5.ogg') + soundin = pick( + 'sound/items/weapons/effects/ric1.ogg', + 'sound/items/weapons/effects/ric2.ogg', + 'sound/items/weapons/effects/ric3.ogg', + 'sound/items/weapons/effects/ric4.ogg', + 'sound/items/weapons/effects/ric5.ogg', + ) if(SFX_TERMINAL_TYPE) soundin = pick(list( 'sound/machines/terminal/terminal_button01.ogg', @@ -252,15 +309,34 @@ 'sound/machines/terminal/terminal_button08.ogg', )) if(SFX_DESECRATION) - soundin = pick('sound/effects/desecration/desecration-01.ogg', 'sound/effects/desecration/desecration-02.ogg', 'sound/effects/desecration/desecration-03.ogg') + soundin = pick( + 'sound/effects/desecration/desecration-01.ogg', + 'sound/effects/desecration/desecration-02.ogg', + 'sound/effects/desecration/desecration-03.ogg', + ) if(SFX_IM_HERE) - soundin = pick('sound/effects/hallucinations/im_here1.ogg', 'sound/effects/hallucinations/im_here2.ogg') + soundin = pick( + 'sound/effects/hallucinations/im_here1.ogg', + 'sound/effects/hallucinations/im_here2.ogg', + ) if(SFX_CAN_OPEN) - soundin = pick('sound/effects/can/can_open1.ogg', 'sound/effects/can/can_open2.ogg', 'sound/effects/can/can_open3.ogg') + soundin = pick( + 'sound/effects/can/can_open1.ogg', + 'sound/effects/can/can_open2.ogg', + 'sound/effects/can/can_open3.ogg', + ) if(SFX_BULLET_MISS) - soundin = pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg') + soundin = pick( + 'sound/items/weapons/bulletflyby.ogg', + 'sound/items/weapons/bulletflyby2.ogg', + 'sound/items/weapons/bulletflyby3.ogg', + ) if(SFX_REVOLVER_SPIN) - soundin = pick('sound/items/weapons/gun/revolver/spin1.ogg', 'sound/items/weapons/gun/revolver/spin2.ogg', 'sound/items/weapons/gun/revolver/spin3.ogg') + soundin = pick( + 'sound/items/weapons/gun/revolver/spin1.ogg', + 'sound/items/weapons/gun/revolver/spin2.ogg', + 'sound/items/weapons/gun/revolver/spin3.ogg', + ) if(SFX_LAW) soundin = pick(list( 'sound/mobs/non-humanoids/beepsky/creep.ogg', @@ -289,7 +365,12 @@ 'sound/items/weapons/flashbang.ogg', )) if(SFX_GOOSE) - soundin = pick('sound/mobs/non-humanoids/goose/goose1.ogg', 'sound/mobs/non-humanoids/goose/goose2.ogg', 'sound/mobs/non-humanoids/goose/goose3.ogg', 'sound/mobs/non-humanoids/goose/goose4.ogg') + soundin = pick( + 'sound/mobs/non-humanoids/goose/goose1.ogg', + 'sound/mobs/non-humanoids/goose/goose2.ogg', + 'sound/mobs/non-humanoids/goose/goose3.ogg', + 'sound/mobs/non-humanoids/goose/goose4.ogg', + ) if(SFX_WARPSPEED) soundin = 'sound/runtime/hyperspace/hyperspace_begin.ogg' if(SFX_SM_CALM) @@ -437,11 +518,23 @@ 'sound/machines/sm/accent/delam/33.ogg', )) if(SFX_CRUNCHY_BUSH_WHACK) - soundin = pick('sound/effects/bush/crunchybushwhack1.ogg', 'sound/effects/bush/crunchybushwhack2.ogg', 'sound/effects/bush/crunchybushwhack3.ogg') + soundin = pick( + 'sound/effects/bush/crunchybushwhack1.ogg', + 'sound/effects/bush/crunchybushwhack2.ogg', + 'sound/effects/bush/crunchybushwhack3.ogg', + ) if(SFX_TREE_CHOP) - soundin = pick('sound/effects/treechop/treechop1.ogg', 'sound/effects/treechop/treechop2.ogg', 'sound/effects/treechop/treechop3.ogg') + soundin = pick( + 'sound/effects/treechop/treechop1.ogg', + 'sound/effects/treechop/treechop2.ogg', + 'sound/effects/treechop/treechop3.ogg', + ) if(SFX_ROCK_TAP) - soundin = pick('sound/effects/rock/rocktap1.ogg', 'sound/effects/rock/rocktap2.ogg', 'sound/effects/rock/rocktap3.ogg') + soundin = pick( + 'sound/effects/rock/rocktap1.ogg', + 'sound/effects/rock/rocktap2.ogg', + 'sound/effects/rock/rocktap3.ogg', + ) if(SFX_SEAR) soundin = 'sound/items/weapons/sear.ogg' if(SFX_REEL) @@ -595,4 +688,51 @@ 'sound/items/handling/helmet/visor_up1.ogg', 'sound/items/handling/helmet/visor_up2.ogg', ) + if(SFX_GROWL) + soundin = pick( + 'sound/mobs/non-humanoids/dog/growl1.ogg', + 'sound/mobs/non-humanoids/dog/growl2.ogg', + ) + if(SFX_GROWL) + soundin = pick( + 'sound/effects/wounds/sizzle1.ogg', + 'sound/effects/wounds/sizzle2.ogg', + ) + if(SFX_POLAROID) + soundin = pick( + 'sound/items/polaroid/polaroid1.ogg', + 'sound/items/polaroid/polaroid2.ogg', + ) + if(SFX_HALLUCINATION_TURN_AROUND) + soundin = pick( + 'sound/effects/hallucinations/turn_around1.ogg', + 'sound/effects/hallucinations/turn_around2.ogg', + ) + if(SFX_HALLUCINATION_I_SEE_YOU) + soundin = pick( + 'sound/effects/hallucinations/i_see_you1.ogg', + 'sound/effects/hallucinations/i_see_you2.ogg', + ) + if(SFX_LOW_HISS) + soundin = pick( + 'sound/mobs/non-humanoids/hiss/lowHiss2.ogg', + 'sound/mobs/non-humanoids/hiss/lowHiss3.ogg', + 'sound/mobs/non-humanoids/hiss/lowHiss4.ogg', + ) + if(SFX_HALLUCINATION_I_M_HERE) + soundin = pick( + 'sound/effects/hallucinations/im_here1.ogg', + 'sound/effects/hallucinations/im_here2.ogg', + ) + if(SFX_HALLUCINATION_OVER_HERE) + soundin = pick( + 'sound/effects/hallucinations/over_here2.ogg', + 'sound/effects/hallucinations/over_here3.ogg', + ) + if(SFX_INDUSTRIAL_SCAN) + soundin = pick( + 'sound/effects/industrial_scan/industrial_scan1.ogg', + 'sound/effects/industrial_scan/industrial_scan2.ogg', + 'sound/effects/industrial_scan/industrial_scan3.ogg', + ) return soundin diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm index e7c038b22317f..5234586d99d29 100644 --- a/code/game/turfs/closed/indestructible.dm +++ b/code/game/turfs/closed/indestructible.dm @@ -138,6 +138,12 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_SYNDICATE_WALLS canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_SYNDICATE_WALLS +/turf/closed/indestructible/syndicate/nodiagonal + icon = 'icons/turf/walls/plastitanium_wall.dmi' + icon_state = "map-shuttle_nd" + base_icon_state = "plastitanium_wall" + smoothing_flags = SMOOTH_BITMASK + /turf/closed/indestructible/riveted/uranium icon = 'icons/turf/walls/uranium_wall.dmi' icon_state = "uranium_wall-0" diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index bd2dfd4b0da01..c801d3ce6f6e4 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -205,20 +205,44 @@ tastes = list("explosives" = 10) food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) +/obj/item/food/grown/banana/bombanana/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_FOOD_CONSUMED, PROC_REF(on_consumed)) + +/// Log whenever someone eats this with an explicit message since it willspawn a live bomb. +/obj/item/food/grown/banana/bombanana/proc/on_consumed(datum/source, mob/living/eater, mob/feeder) + SIGNAL_HANDLER + var/list/concatable = list("[key_name_and_tag(eater)] has eaten a bombanana!") + if(feeder != eater) + concatable += "This person was fed this by [key_name_and_tag(feeder)]." + + concatable += "As a result of this, a bombanana peel will be spawned at [AREACOORD(src)]." + + var/final_string = jointext(concatable, " ") + log_bomber(details = final_string) // sorta wacks out the traditional "log_bomber" format but it gets the point across better + return NONE + /obj/item/grown/bananapeel/bombanana - desc = "A peel from a banana. Why is it beeping?" + desc = parent_type::desc + " Why is it beeping?" seed = /obj/item/seeds/banana/bombanana - var/det_time = 50 + /// How long we have until we explode. + var/det_time = 5 SECONDS + /// Ref to the bomb we spawn when we explode. var/obj/item/grenade/syndieminibomb/bomb /obj/item/grown/bananapeel/bombanana/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery, det_time) bomb = new /obj/item/grenade/syndieminibomb(src) + bomb.name = "bombanana peel" bomb.det_time = det_time + + var/potential_user = null if(iscarbon(loc)) to_chat(loc, span_danger("[src] begins to beep.")) - bomb.arm_grenade(loc, null, FALSE) + potential_user = loc // just for fingerprint diagnosis in explosion logging, the on_consumed proc will have provided the necessary context already + + bomb.arm_grenade(potential_user, msg = FALSE) /obj/item/grown/bananapeel/bombanana/Destroy() . = ..() diff --git a/code/modules/antagonists/cult/datums/cult_team.dm b/code/modules/antagonists/cult/datums/cult_team.dm index 87ad2ab649101..3554a59c3b4da 100644 --- a/code/modules/antagonists/cult/datums/cult_team.dm +++ b/code/modules/antagonists/cult/datums/cult_team.dm @@ -165,7 +165,7 @@ continue to_chat(cultist.current, span_bold(span_cult_large("[marker] has marked [blood_target] in the [target_area.name] as the cult's top priority, get there immediately!"))) - SEND_SOUND(cultist.current, sound(pick('sound/effects/hallucinations/over_here2.ogg','sound/effects/hallucinations/over_here3.ogg'), 0, 1, 75)) + SEND_SOUND(cultist.current, sound(SFX_HALLUCINATION_OVER_HERE, 0, 1, 75)) cultist.current.client.images += blood_target_image if(duration != INFINITY) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 94ecc0f9d77f1..fcdb1f1945828 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -303,7 +303,7 @@ var/datum/status_effect/eldritch/mark_type /datum/heretic_knowledge/mark/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) + RegisterSignals(user, list(COMSIG_HERETIC_MANSUS_GRASP_ATTACK, COMSIG_LIONHUNTER_ON_HIT), PROC_REF(on_mansus_grasp)) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) /datum/heretic_knowledge/mark/on_lose(mob/user, datum/antagonist/heretic/our_heretic) @@ -327,6 +327,8 @@ /datum/heretic_knowledge/mark/proc/on_eldritch_blade(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) SIGNAL_HANDLER + if(!isliving(target)) + return trigger_mark(source, target) /** diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index 8375c3ae44334..a07150919aa36 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -20,7 +20,7 @@ inhand_icon_state = null flags_inv = HIDESHOES|HIDEJUMPSUIT body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS - allowed = list(/obj/item/melee/sickly_blade) + allowed = list(/obj/item/melee/sickly_blade, /obj/item/gun/ballistic/rifle/lionhunter) hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch // Slightly better than normal cult robes armor_type = /datum/armor/cultrobes_eldritch diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index ab98e1b9e4c7c..6e0d3d7d18659 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -66,13 +66,11 @@ qdel(src) /obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, click_parameters) - if(isliving(target)) - SEND_SIGNAL(user, COMSIG_HERETIC_BLADE_ATTACK, target, src) + SEND_SIGNAL(user, COMSIG_HERETIC_BLADE_ATTACK, target, src) /obj/item/melee/sickly_blade/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - if(isliving(interacting_with)) - SEND_SIGNAL(user, COMSIG_HERETIC_RANGED_BLADE_ATTACK, interacting_with, src) - return ITEM_INTERACT_BLOCKING + SEND_SIGNAL(user, COMSIG_HERETIC_RANGED_BLADE_ATTACK, interacting_with, src) + return ITEM_INTERACT_BLOCKING // Path of Rust's blade /obj/item/melee/sickly_blade/rust @@ -135,8 +133,55 @@ desc = "A galliant blade, sundered and torn. \ Furiously, the blade cuts. Silver scars bind it forever to its dark purpose." icon_state = "dark_blade" + base_icon_state = "dark_blade" inhand_icon_state = "dark_blade" after_use_message = "The Torn Champion hears your call..." + ///If our blade is currently infused with the mansus grasp + var/infused = FALSE + +/obj/item/melee/sickly_blade/dark/afterattack(atom/target, mob/user, click_parameters) + . = ..() + if(!infused || target == user || !isliving(target)) + return + var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) + var/mob/living/living_target = target + if(!heretic_datum) + return + + //Apply our heretic mark + var/datum/heretic_knowledge/mark/blade_mark/mark_to_apply = heretic_datum.get_knowledge(/datum/heretic_knowledge/mark/blade_mark) + if(!mark_to_apply) + return + mark_to_apply.create_mark(user, living_target) + + //Remove the infusion from any blades we own (and update their sprite) + for(var/obj/item/melee/sickly_blade/dark/to_infuse in user.get_all_contents_type(/obj/item/melee/sickly_blade/dark)) + to_infuse.infused = FALSE + to_infuse.update_appearance(UPDATE_ICON) + user.update_held_items() + + if(!check_behind(user, living_target)) + return + // We're officially behind them, apply effects + living_target.AdjustParalyzed(1.5 SECONDS) + living_target.apply_damage(10, BRUTE, wound_bonus = CANT_WOUND) + living_target.balloon_alert(user, "backstab!") + playsound(living_target, 'sound/items/weapons/guillotine.ogg', 100, TRUE) + +/obj/item/melee/sickly_blade/dark/dropped(mob/user, silent) + . = ..() + if(infused) + infused = FALSE + update_appearance(UPDATE_ICON) + +/obj/item/melee/sickly_blade/dark/update_icon_state() + . = ..() + if(infused) + icon_state = base_icon_state + "_infused" + inhand_icon_state = base_icon_state + "_infused" + else + icon_state = base_icon_state + inhand_icon_state = base_icon_state // Path of Cosmos's blade /obj/item/melee/sickly_blade/cosmic diff --git a/code/modules/antagonists/heretic/items/hunter_rifle.dm b/code/modules/antagonists/heretic/items/hunter_rifle.dm index cb8636aed2b14..92ed0d768b306 100644 --- a/code/modules/antagonists/heretic/items/hunter_rifle.dm +++ b/code/modules/antagonists/heretic/items/hunter_rifle.dm @@ -24,6 +24,7 @@ name = "lionhunter rifle internal magazine" ammo_type = /obj/item/ammo_casing/strilka310/lionhunter caliber = CALIBER_STRILKA310 + armour_penetration = 100 max_ammo = 3 multiload = TRUE @@ -32,7 +33,7 @@ /// Whether we're currently aiming this casing at something var/currently_aiming = FALSE /// How many seconds it takes to aim per tile of distance between the target - var/seconds_per_distance = 0.5 SECONDS + var/seconds_per_distance = 0.2 SECONDS /// The minimum distance required to gain a damage bonus from aiming var/min_distance = 4 @@ -115,14 +116,13 @@ // BUT, if we're at a decent range and the target's a living mob, // the projectile's been channel fired. It has full effects and homes in. if(distance > min_distance && isliving(target) && iscarbon(user)) - loaded_projectile.damage *= 2 loaded_projectile.stamina *= 2 loaded_projectile.knockdown = 0.5 SECONDS loaded_projectile.stutter = 6 SECONDS loaded_projectile.projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS loaded_projectile.homing = TRUE - loaded_projectile.homing_turn_speed = 80 + loaded_projectile.homing_turn_speed = 150 loaded_projectile.set_homing_target(target) return ..() @@ -134,6 +134,46 @@ damage = 30 stamina = 30 projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS + ///The mob that is currently inside the bullet + var/mob/stored_mob + +/obj/projectile/bullet/strilka310/lionhunter/fire(angle, atom/direct_target) + . = ..() + if(!isliving(firer) || !isliving(original)) + return + var/mob/living/living_firer = firer + if(IS_HERETIC(living_firer)) + living_firer.forceMove(src) + stored_mob = living_firer + + +/obj/projectile/bullet/strilka310/lionhunter/Exited(atom/movable/gone) + if(gone == stored_mob) + stored_mob = null + return ..() + +/obj/projectile/bullet/strilka310/lionhunter/on_range() + stored_mob?.forceMove(loc) + return ..() + +/obj/projectile/bullet/strilka310/lionhunter/on_hit(atom/target, blocked, pierce_hit) + stored_mob?.forceMove(loc) //Pretty important to get our mob out of the bullet + . = ..() + if(!isliving(target)) + return BULLET_ACT_HIT + var/mob/living/victim = target + var/mob/firing_mob = firer + if(IS_HERETIC_OR_MONSTER(victim) || !IS_HERETIC(firing_mob)) + return BULLET_ACT_HIT + + SEND_SIGNAL(firer, COMSIG_LIONHUNTER_ON_HIT, victim) + return BULLET_ACT_HIT + +/obj/projectile/bullet/strilka310/lionhunter/Destroy() + if(stored_mob) + stack_trace("Lionhunter bullet qdel'd with its firer still inside!") + stored_mob.forceMove(loc) + return ..() // Extra ammunition can be made with a heretic ritual. /obj/item/ammo_box/strilka310/lionhunter diff --git a/code/modules/antagonists/heretic/items/unfathomable_curio.dm b/code/modules/antagonists/heretic/items/unfathomable_curio.dm index eff1fa7ea2fe2..d5f09a1dc27e9 100644 --- a/code/modules/antagonists/heretic/items/unfathomable_curio.dm +++ b/code/modules/antagonists/heretic/items/unfathomable_curio.dm @@ -11,8 +11,8 @@ //Vars used for the shield component var/heretic_shield_icon = "unfathomable_shield" var/max_charges = 1 - var/recharge_start_delay = 60 SECONDS - var/charge_increment_delay = 60 SECONDS + var/recharge_start_delay = 30 SECONDS + var/charge_increment_delay = 30 SECONDS var/charge_recovery = 1 /obj/item/storage/belt/unfathomable_curio/Initialize(mapload) diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index 4f061ca2d6dda..9384a9af4b9d8 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -165,7 +165,7 @@ research_tree_icon_state = "blade_upgrade_ash" /datum/heretic_knowledge/blade_upgrade/ash/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) - if(source == target) + if(source == target || !isliving(target)) return target.adjust_fire_stacks(1) diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index dc76f242c018f..c24ed2c273f3c 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -32,16 +32,16 @@ /datum/heretic_knowledge/limited_amount/starting/base_blade name = "The Cutting Edge" desc = "Opens up the Path of Blades to you. \ - Allows you to transmute a knife with two bars of silver or titanium to create a Sundered Blade. \ - You can create up to five at a time." + Allows you to transmute a knife with one bar of silver or titanium to create a Sundered Blade. \ + You can create up to four at a time." gain_text = "Our great ancestors forged swords and practiced sparring on the eve of great battles." next_knowledge = list(/datum/heretic_knowledge/blade_grasp) required_atoms = list( /obj/item/knife = 1, - list(/obj/item/stack/sheet/mineral/silver, /obj/item/stack/sheet/mineral/titanium) = 2, + list(/obj/item/stack/sheet/mineral/silver, /obj/item/stack/sheet/mineral/titanium) = 1, ) result_atoms = list(/obj/item/melee/sickly_blade/dark) - limit = 5 // It's the blade path, it's a given + limit = 4 // It's the blade path, it's a given route = PATH_BLADE research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "dark_blade" @@ -67,40 +67,16 @@ /datum/heretic_knowledge/blade_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) SIGNAL_HANDLER - // Let's see if source is behind target - // "Behind" is defined as 3 tiles directly to the back of the target - // x . . - // x > . - // x . . - - var/are_we_behind = FALSE - // No tactical spinning allowed - if(HAS_TRAIT(target, TRAIT_SPINNING)) - are_we_behind = TRUE - - // We'll take "same tile" as "behind" for ease - if(target.loc == source.loc) - are_we_behind = TRUE - - // We'll also assume lying down is behind, as mob directions when lying are unclear - if(target.body_position == LYING_DOWN) - are_we_behind = TRUE - - // Exceptions aside, let's actually check if they're, yknow, behind - var/dir_target_to_source = get_dir(target, source) - if(target.dir & REVERSE_DIR(dir_target_to_source)) - are_we_behind = TRUE - - if(!are_we_behind) + if(!check_behind(source, target)) return // We're officially behind them, apply effects target.AdjustParalyzed(1.5 SECONDS) target.apply_damage(10, BRUTE, wound_bonus = CANT_WOUND) target.balloon_alert(source, "backstab!") - playsound(get_turf(target), 'sound/items/weapons/guillotine.ogg', 100, TRUE) + playsound(target, 'sound/items/weapons/guillotine.ogg', 100, TRUE) -/// The cooldown duration between trigers of blade dance +/// The cooldown duration between triggers of blade dance #define BLADE_DANCE_COOLDOWN (20 SECONDS) /datum/heretic_knowledge/blade_dance @@ -315,10 +291,11 @@ #undef BLOOD_FLOW_PER_SEVEIRTY /datum/heretic_knowledge/blade_upgrade/blade - name = "Swift Blades" + name = "Empowered Blades" desc = "Attacking someone with a Sundered Blade in both hands \ will now deliver a blow with both at once, dealing two attacks in rapid succession. \ - The second blow will be slightly weaker." + The second blow will be slightly weaker. \ + You are able to infuse your mansus grasp directly into your blades, and your blades are more effective against structures." gain_text = "I found him cleaved in twain, halves locked in a duel without end; \ a flurry of blades, neither hitting their mark, for the Champion was indomitable." next_knowledge = list(/datum/heretic_knowledge/spell/furious_steel) @@ -330,7 +307,39 @@ /// How much force was the last weapon we offhanded with? If it's different, we need to re-calculate the decrement var/last_weapon_force = -1 -/datum/heretic_knowledge/blade_upgrade/blade/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) +/datum/heretic_knowledge/blade_upgrade/blade/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + . = ..() + RegisterSignal(user, COMSIG_TOUCH_HANDLESS_CAST, PROC_REF(on_grasp_cast)) + RegisterSignal(user, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_blade_equipped)) + RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(do_melee_effects)) + +/datum/heretic_knowledge/blade_upgrade/blade/on_lose(mob/user, datum/antagonist/heretic/our_heretic) + . = ..() + UnregisterSignal(user, list(COMSIG_TOUCH_HANDLESS_CAST, COMSIG_MOB_EQUIPPED_ITEM, COMSIG_HERETIC_BLADE_ATTACK)) + +///Tries to infuse our held blade with our mansus grasp +/datum/heretic_knowledge/blade_upgrade/blade/proc/on_grasp_cast(mob/living/carbon/cast_on) + SIGNAL_HANDLER + + var/held_item = cast_on.get_active_held_item() + if(!istype(held_item, /obj/item/melee/sickly_blade/dark)) + return NONE + var/obj/item/melee/sickly_blade/dark/held_blade = held_item + if(held_blade.infused) + return NONE + held_blade.infused = TRUE + held_blade.update_appearance(UPDATE_ICON) + + //Infuse our off-hand blade just so it's nicer visually + var/obj/item/melee/sickly_blade/dark/off_hand_blade = cast_on.get_inactive_held_item() + if(istype(off_hand_blade, /obj/item/melee/sickly_blade/dark)) + off_hand_blade.infused = TRUE + off_hand_blade.update_appearance(UPDATE_ICON) + cast_on.update_held_items() + + return COMPONENT_CAST_HANDLESS + +/datum/heretic_knowledge/blade_upgrade/blade/do_melee_effects(mob/living/source, atom/target, obj/item/melee/sickly_blade/blade) if(target == source) return @@ -345,7 +354,7 @@ // Give it a short delay (for style, also lets people dodge it I guess) addtimer(CALLBACK(src, PROC_REF(follow_up_attack), source, target, off_hand), 0.25 SECONDS) -/datum/heretic_knowledge/blade_upgrade/blade/proc/follow_up_attack(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) +/datum/heretic_knowledge/blade_upgrade/blade/proc/follow_up_attack(mob/living/source, atom/target, obj/item/melee/sickly_blade/blade) if(QDELETED(source) || QDELETED(target) || QDELETED(blade)) return // Sanity to ensure that the blade we're delivering an offhand attack with is ACTUALLY our offhand @@ -372,13 +381,20 @@ // Save the force as our last weapon force last_weapon_force = blade.force - // Subtract the decrement - blade.force -= offand_force_decrement + // Subtract the decrement, but only if the target is living + if(isliving(target)) + blade.force -= offand_force_decrement // Perform the offhand attack blade.melee_attack_chain(source, target) // Restore the force. blade.force = last_weapon_force +///Modifies our blade demolition modifier so we can take down doors with it +/datum/heretic_knowledge/blade_upgrade/blade/proc/on_blade_equipped(mob/user, obj/item/equipped, slot) + SIGNAL_HANDLER + if(istype(equipped, /obj/item/melee/sickly_blade/dark)) + equipped.demolition_mod = 1.5 + /datum/heretic_knowledge/spell/furious_steel name = "Furious Steel" desc = "Grants you Furious Steel, a targeted spell. Using it will summon three \ diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index f6e364766f6ef..af92a55f499af 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -172,7 +172,7 @@ ORGAN_SLOT_LIVER, ORGAN_SLOT_BRAIN ) - if(source == target) + if(source == target || !isliving(target)) return if(combo_timer) deltimer(combo_timer) diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index 99ee675c8ecab..b23ed148611b6 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -152,7 +152,7 @@ research_tree_icon_state = "blade_upgrade_moon" /datum/heretic_knowledge/blade_upgrade/moon/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) - if(source == target) + if(source == target || !isliving(target)) return target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 100) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index c1c1e2a4a04c9..9d45e8bb55b4b 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -176,6 +176,8 @@ our_heretic.increase_rust_strength() /datum/heretic_knowledge/blade_upgrade/rust/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) + if(source == target || !isliving(target)) + return target.adjust_disgust(50) /datum/heretic_knowledge/spell/area_conversion/on_gain(mob/user, datum/antagonist/heretic/our_heretic) diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index 2bae6ed540296..8a1fe6b5a87e9 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -44,12 +44,12 @@ /datum/heretic_knowledge/rifle name = "Lionhunter's Rifle" - desc = "Allows you to transmute any ballistic weapon, such as a pipegun, with hide \ - from any animal, a plank of wood, and a camera to create the Lionhunter's rifle. \ + desc = "Allows you to transmute a piece of wood, with hide \ + from any animal,and a camera to create the Lionhunter's rifle. \ The Lionhunter's Rifle is a long ranged ballistic weapon with three shots. \ These shots function as normal, albeit weak high-caliber munitions when fired from \ close range or at inanimate objects. You can aim the rifle at distant foes, \ - causing the shot to deal massively increased damage and hone in on them." + causing the shot to mark your victim with your grasp and teleport you directly to them." gain_text = "I met an old man in an antique shop who wielded a very unusual weapon. \ I could not purchase it at the time, but they showed me how they made it ages ago." next_knowledge = list( @@ -58,9 +58,8 @@ /datum/heretic_knowledge/rifle_ammo, ) required_atoms = list( - /obj/item/gun/ballistic = 1, - /obj/item/stack/sheet/animalhide = 1, /obj/item/stack/sheet/mineral/wood = 1, + /obj/item/stack/sheet/animalhide = 1, /obj/item/camera = 1, ) result_atoms = list(/obj/item/gun/ballistic/rifle/lionhunter) @@ -73,12 +72,11 @@ /datum/heretic_knowledge/rifle_ammo name = "Lionhunter Rifle Ammunition" desc = "Allows you to transmute 3 ballistic ammo casings (used or unused) of any caliber, \ - including shotgun shot, with any animal hide to create an extra clip of ammunition for the Lionhunter Rifle." + including shotgun shells to create an extra clip of ammunition for the Lionhunter Rifle." gain_text = "The weapon came with three rough iron balls, intended to be used as ammunition. \ They were very effective, for simple iron, but used up quickly. I soon ran out. \ No replacement munitions worked in their stead. It was peculiar in what it wanted." required_atoms = list( - /obj/item/stack/sheet/animalhide = 1, /obj/item/ammo_casing = 3, ) result_atoms = list(/obj/item/ammo_box/strilka310/lionhunter) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index cc7cc085364c0..6f0f006842d89 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -176,7 +176,7 @@ research_tree_icon_state = "blade_upgrade_void" /datum/heretic_knowledge/blade_upgrade/void/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) - if(source == target) + if(source == target || !isliving(target)) return target.apply_status_effect(/datum/status_effect/void_chill, 2) @@ -341,7 +341,7 @@ span_danger("The void storm surrounding [ascended_heretic] deflects [hitting_projectile]!"), span_userdanger("The void storm protects you from [hitting_projectile]!"), ) - playsound(ascended_heretic, pick('sound/effects/magic/VoidDeflect01.ogg', 'sound/effects/magic/VoidDeflect02.ogg', 'sound/effects/magic/VoidDeflect03.ogg'), 75, TRUE) + playsound(ascended_heretic, SFX_VOID_DEFLECT, 75, TRUE) hitting_projectile.firer = ascended_heretic if(prob(75)) hitting_projectile.set_angle(get_angle(hitting_projectile.firer, hitting_projectile.fired_from)) diff --git a/code/modules/antagonists/heretic/magic/expand_sight.dm b/code/modules/antagonists/heretic/magic/expand_sight.dm index 126a5a180ec2f..ade4bb1567da0 100644 --- a/code/modules/antagonists/heretic/magic/expand_sight.dm +++ b/code/modules/antagonists/heretic/magic/expand_sight.dm @@ -17,7 +17,7 @@ /datum/action/innate/expand_sight/Activate() active = TRUE owner.client?.view_size.setTo(boost_to) - playsound(owner, pick('sound/effects/hallucinations/i_see_you1.ogg', 'sound/effects/hallucinations/i_see_you2.ogg'), 50, TRUE, ignore_walls = FALSE) + playsound(owner, SFX_HALLUCINATION_I_SEE_YOU, 50, TRUE, ignore_walls = FALSE) COOLDOWN_START(src, last_toggle, 8 SECONDS) /datum/action/innate/expand_sight/Deactivate() diff --git a/code/modules/antagonists/heretic/magic/realignment.dm b/code/modules/antagonists/heretic/magic/realignment.dm index 8ad6ce7829970..86d2ff78c54bf 100644 --- a/code/modules/antagonists/heretic/magic/realignment.dm +++ b/code/modules/antagonists/heretic/magic/realignment.dm @@ -54,12 +54,14 @@ alert_type = /atom/movable/screen/alert/status_effect/realignment tick_interval = 0.2 SECONDS show_duration = TRUE + ///Traits to add/remove + var/list/realignment_traits = list(TRAIT_BATON_RESISTANCE, TRAIT_PACIFISM) /datum/status_effect/realignment/get_examine_text() return span_notice("[owner.p_Theyre()] glowing a soft white.") /datum/status_effect/realignment/on_apply() - ADD_TRAIT(owner, TRAIT_PACIFISM, id) + owner.add_traits(realignment_traits, id) owner.add_filter(id, 2, list("type" = "outline", "color" = "#d6e3e7", "size" = 2)) var/filter = owner.get_filter(id) animate(filter, alpha = 127, time = 1 SECONDS, loop = -1) @@ -67,12 +69,12 @@ return TRUE /datum/status_effect/realignment/on_remove() - REMOVE_TRAIT(owner, TRAIT_PACIFISM, id) + owner.remove_traits(realignment_traits, id) owner.remove_filter(id) /datum/status_effect/realignment/tick(seconds_between_ticks) - owner.adjustStaminaLoss(-5) - owner.AdjustAllImmobility(-0.5 SECONDS) + owner.adjustStaminaLoss(-10) + owner.AdjustAllImmobility(-1 SECONDS) /atom/movable/screen/alert/status_effect/realignment name = "Realignment" diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index 387301f2c489d..d82d145b3ef65 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -4,9 +4,10 @@ /datum/status_effect/crucible_soul id = "Blessing of Crucible Soul" status_type = STATUS_EFFECT_REFRESH - duration = 15 SECONDS + duration = 40 SECONDS alert_type = /atom/movable/screen/alert/status_effect/crucible_soul show_duration = TRUE + ///Stores the location where the mob drank the potion, used to teleport the drinker back to the spot after expiration var/turf/location /datum/status_effect/crucible_soul/on_apply() @@ -14,6 +15,8 @@ owner.alpha = 180 owner.pass_flags |= PASSCLOSEDTURF | PASSGLASS | PASSGRILLE | PASSMACHINE | PASSSTRUCTURE | PASSTABLE | PASSMOB | PASSDOORS | PASSVEHICLE location = get_turf(owner) + var/datum/action/cancel_crucible_soul/cancel_button = new(src) + cancel_button.Grant(owner) return TRUE /datum/status_effect/crucible_soul/on_remove() @@ -26,11 +29,25 @@ /datum/status_effect/crucible_soul/get_examine_text() return span_notice("[owner.p_They()] [owner.p_do()]n't seem to be all here.") +/datum/action/cancel_crucible_soul + name = "Recall" + desc = "Use to end the blessing early" + button_icon = 'icons/obj/antags/eldritch.dmi' + button_icon_state = "crucible_soul" + +/datum/action/cancel_crucible_soul/Trigger(trigger_flags) + . = ..() + if(!.) + return + var/datum/status_effect/active_effect = owner.has_status_effect(/datum/status_effect/crucible_soul) + target = active_effect + qdel(target) + // DUSK AND DAWN /datum/status_effect/duskndawn id = "Blessing of Dusk and Dawn" status_type = STATUS_EFFECT_REFRESH - duration = 60 SECONDS + duration = 90 SECONDS show_duration = TRUE alert_type =/atom/movable/screen/alert/status_effect/duskndawn @@ -58,12 +75,24 @@ /datum/status_effect/marshal/on_remove() owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) + if(!iscarbon(owner)) + return + var/mob/living/carbon/drinker = owner + for(var/obj/item/bodypart/potentially_wounded as anything in drinker.bodyparts) + for(var/datum/wound/found_wound as anything in potentially_wounded.wounds) + found_wound.remove_wound() + if(length(drinker.get_missing_limbs())) + drinker.regenerate_limbs() + to_chat(drinker, span_hypnophrase("The mansus has given you new limbs.")) + playsound(drinker, 'sound/effects/chemistry/ahaha.ogg', 50, TRUE, -1, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = 0.5) /datum/status_effect/marshal/tick(seconds_between_ticks) if(!iscarbon(owner)) return var/mob/living/carbon/carbie = owner + carbie.adjustBruteLoss(-0.5 * seconds_between_ticks, updating_health = FALSE) + carbie.adjustFireLoss(-0.5 * seconds_between_ticks, updating_health = FALSE) for(var/BP in carbie.bodyparts) var/obj/item/bodypart/part = BP for(var/W in part.wounds) @@ -161,7 +190,8 @@ if(QDELETED(src) || QDELETED(owner)) return - var/obj/effect/floating_blade/blade = new blade_type(get_turf(owner)) + var/obj/effect/floating_blade/blade + blade = new blade_type(get_turf(owner)) blades += blade blade.orbit(owner, blade_orbit_radius) RegisterSignal(blade, COMSIG_QDELETING, PROC_REF(remove_blade)) diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm index b93b52eb8e8e9..f3d37b8768259 100644 --- a/code/modules/antagonists/heretic/structures/carving_knife.dm +++ b/code/modules/antagonists/heretic/structures/carving_knife.dm @@ -163,6 +163,7 @@ name = "elder carving" desc = "Collection of unknown symbols, they remind you of days long gone..." icon = 'icons/obj/service/hand_of_god_structures.dmi' + max_integrity = 60 /// A tip displayed to heretics who examine the rune carver. Explains what the rune does. var/carver_tip /// Reference to trap owner mob diff --git a/code/modules/antagonists/heretic/structures/mawed_crucible.dm b/code/modules/antagonists/heretic/structures/mawed_crucible.dm index ea962cbc5a4e1..5f329cfd7c705 100644 --- a/code/modules/antagonists/heretic/structures/mawed_crucible.dm +++ b/code/modules/antagonists/heretic/structures/mawed_crucible.dm @@ -11,15 +11,26 @@ anchored = TRUE density = TRUE ///How much mass this currently holds - var/current_mass = 5 + var/current_mass = 3 ///Maximum amount of mass - var/max_mass = 5 + var/max_mass = 3 ///Check to see if it is currently being used. var/in_use = FALSE + ///Cooldown for the crucible to create mass from the eldritch + COOLDOWN_DECLARE(refill_cooldown) /obj/structure/destructible/eldritch_crucible/Initialize(mapload) . = ..() break_message = span_warning("[src] falls apart with a thud!") + START_PROCESSING(SSobj, src) + +/obj/structure/destructible/eldritch_crucible/process(seconds_per_tick) + if(COOLDOWN_TIMELEFT(src, refill_cooldown)) + return + COOLDOWN_START(src, refill_cooldown, 30 SECONDS) + current_mass++ + playsound(src, 'sound/items/eatfood.ogg', 100, TRUE) + update_appearance(UPDATE_ICON_STATE) /obj/structure/destructible/eldritch_crucible/atom_deconstruct(disassembled = TRUE) // Create a spillage if we were destroyed with leftover mass @@ -40,6 +51,9 @@ if(!IS_HERETIC_OR_MONSTER(user) && !isobserver(user)) return + if(current_mass > 0) + . += span_notice("You can refill an eldritch flask with this") + if(current_mass < max_mass) var/to_fill = max_mass - current_mass . += span_notice("[src] requires [to_fill] more organ[to_fill == 1 ? "":"s"] or bodypart[to_fill == 1 ? "":"s"].") @@ -99,6 +113,19 @@ set_anchored(!anchored) balloon_alert(user, "[anchored ? "":"un"]anchored") return ITEM_INTERACT_SUCCESS + if(istype(tool, /obj/item/reagent_containers/cup/beaker/eldritch)) + if(current_mass < max_mass) + balloon_alert(user, "not full enough!") + return ITEM_INTERACT_SUCCESS + var/obj/item/reagent_containers/cup/beaker/eldritch/to_fill = tool + if(to_fill.reagents.total_volume >= to_fill.reagents.maximum_volume) + balloon_alert(user, "flask is full!") + return ITEM_INTERACT_SUCCESS + to_fill.reagents.add_reagent(/datum/reagent/eldritch, 50) + do_item_attack_animation(src, used_item = tool) + current_mass-- + balloon_alert(user, "refilled flask") + return ITEM_INTERACT_SUCCESS /obj/structure/destructible/eldritch_crucible/attack_hand(mob/user, list/modifiers) . = ..() @@ -273,7 +300,7 @@ desc = "A glass bottle contianing a dull yellow liquid. It seems to fade in and out with regularity." icon_state = "clarity" status_effect = /datum/status_effect/duskndawn - crucible_tip = "Allows you to see through walls and objects. Lasts 60 seconds." + crucible_tip = "Allows you to see through walls and objects. Lasts 90 seconds." /obj/item/eldritch_potion/wounded name = "brew of the wounded soldier" diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 1036abc24955f..446825779e299 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -410,7 +410,7 @@ damtype = BRUTE resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF attack_verb_continuous = list("smacks", "clubs", "wacks") - attack_verb_simple = list("smack", "club", "wacks") + attack_verb_simple = list("smack", "club", "wack") /// Range cap on where you can summon vendors. var/max_summon_range = RUNIC_SCEPTER_MAX_RANGE diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 467ad0e381d1e..4fcfe1582599d 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -599,14 +599,14 @@ pressure = CAN_MAX_RELEASE_PRESSURE . = TRUE else if(pressure == "input") - pressure = tgui_input_number(usr, "New release pressure", "Canister Pressure", release_pressure, CAN_MAX_RELEASE_PRESSURE, CAN_MIN_RELEASE_PRESSURE) + pressure = tgui_input_number(usr, message = "New release pressure", title = "Canister Pressure", default = release_pressure, max_value = CAN_MAX_RELEASE_PRESSURE, min_value = CAN_MIN_RELEASE_PRESSURE, round_value = FALSE) if(!isnull(pressure)) . = TRUE else if(text2num(pressure) != null) pressure = text2num(pressure) . = TRUE if(.) - release_pressure = clamp(round(pressure), CAN_MIN_RELEASE_PRESSURE, CAN_MAX_RELEASE_PRESSURE) + release_pressure = clamp(pressure, CAN_MIN_RELEASE_PRESSURE, CAN_MAX_RELEASE_PRESSURE) investigate_log("was set to [release_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS) if("valve") diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index cb1a23f82f15a..8284b212efc44 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -230,7 +230,8 @@ UnregisterSignal(holding, COMSIG_QDELETING) holding = new_tank RegisterSignal(holding, COMSIG_QDELETING, PROC_REF(unregister_holding)) - playsound(src, list(insert_sound,remove_sound), sound_vol) + playsound(src, insert_sound, sound_vol) + playsound(src, remove_sound, sound_vol) else if(holding)//we remove a tank investigate_log("had its internal [holding] removed by [key_name(user)].", INVESTIGATE_ATMOS) to_chat(user, span_notice("You remove [holding] from [src].")) diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 3efc87e00ac3a..36d5bf4eb7c5d 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -150,7 +150,7 @@ pressure = text2num(pressure) . = TRUE if(.) - target_pressure = clamp(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE) + target_pressure = clamp(pressure, PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS) if("eject") if(holding) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index eafda7f792e73..545458537e1a2 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -105,9 +105,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) load_path(parent.ckey) if(load_and_save && !fexists(path)) try_savefile_type_migration() - unlock_content = !!parent.IsByondMember() - if(unlock_content) - max_save_slots = 8 + + refresh_membership() else CRASH("attempted to create a preferences datum without a client or mock!") load_savefile() @@ -536,3 +535,23 @@ GLOBAL_LIST_EMPTY(preferences_datums) default_randomization[preference_key] = RANDOM_ENABLED return default_randomization + +/datum/preferences/proc/refresh_membership() + var/byond_member = parent.IsByondMember() + if(isnull(byond_member)) // Connection failure, retry once + byond_member = parent.IsByondMember() + var/static/admins_warned = FALSE + if(!admins_warned) + admins_warned = TRUE + message_admins("BYOND membership lookup had a connection failure for a user. This is most likely an issue on the BYOND side but if this consistently happens you should bother your server operator to look into it.") + if(isnull(byond_member)) // Retrying didn't work, warn the user + log_game("BYOND membership lookup for [parent.ckey] failed due to a connection error.") + else + log_game("BYOND membership lookup for [parent.ckey] failed due to a connection error but succeeded after retry.") + + if(isnull(byond_member)) + to_chat(parent, span_warning("There's been a connection failure while trying to check the status of your BYOND membership. Reconnecting may fix the issue, or BYOND could be experiencing downtime.")) + + unlock_content = !!byond_member + if(unlock_content) + max_save_slots = 8 diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index bdc294f5366ae..7520e6e769b3e 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -26,4 +26,4 @@ . = ..() AddElement(/datum/element/earhealing) AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) - AddComponent(/datum/component/adjust_fishing_difficulty, -1) + AddComponent(/datum/component/adjust_fishing_difficulty, -2) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 0178ae09c5322..4a5ac9b6572c9 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -344,7 +344,6 @@ /obj/item/clothing/glasses/sunglasses/Initialize(mapload) . = ..() add_glasses_slapcraft_component() - AddComponent(/datum/component/adjust_fishing_difficulty, -1) /obj/item/clothing/glasses/sunglasses/proc/add_glasses_slapcraft_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunsec, /datum/crafting_recipe/hudsunmed, /datum/crafting_recipe/hudsundiag, /datum/crafting_recipe/scienceglasses) @@ -519,10 +518,6 @@ flags_cover = GLASSESCOVERSEYES glass_colour_type = /datum/client_colour/glass_colour/red -/obj/item/clothing/glasses/thermal/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) - /obj/item/clothing/glasses/thermal/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) diff --git a/code/modules/clothing/gloves/botany.dm b/code/modules/clothing/gloves/botany.dm index 144477240b29d..ba3d777fb0d8a 100644 --- a/code/modules/clothing/gloves/botany.dm +++ b/code/modules/clothing/gloves/botany.dm @@ -14,7 +14,7 @@ /obj/item/clothing/gloves/botanic_leather/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) /datum/armor/gloves_botanic_leather bio = 50 diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 048d575f5f02e..ce58e3b9e916d 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -44,7 +44,7 @@ /obj/item/clothing/gloves/color/fingerless/Initialize(mapload) . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/gripperoffbrand) - AddComponent(/datum/component/adjust_fishing_difficulty, -2) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) AddElement( /datum/element/slapcrafting,\ diff --git a/code/modules/clothing/gloves/combat.dm b/code/modules/clothing/gloves/combat.dm index a2574c8d23ec7..55eeeba723f11 100644 --- a/code/modules/clothing/gloves/combat.dm +++ b/code/modules/clothing/gloves/combat.dm @@ -27,7 +27,7 @@ /obj/item/clothing/gloves/combat/wizard/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) //something something wizard casting + AddComponent(/datum/component/adjust_fishing_difficulty, -5) //something something wizard casting /obj/item/clothing/gloves/combat/floortile name = "floortile camouflage gloves" @@ -37,4 +37,4 @@ /obj/item/clothing/gloves/combat/floortiletile/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) //tacticool + AddComponent(/datum/component/adjust_fishing_difficulty, -5) //tacticool diff --git a/code/modules/clothing/gloves/insulated.dm b/code/modules/clothing/gloves/insulated.dm index d20ae78c6c4cc..9c451fb811718 100644 --- a/code/modules/clothing/gloves/insulated.dm +++ b/code/modules/clothing/gloves/insulated.dm @@ -121,7 +121,7 @@ /obj/item/clothing/gloves/cut/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) + AddComponent(/datum/component/adjust_fishing_difficulty, -5) /obj/item/clothing/gloves/cut/heirloom desc = "The old gloves your great grandfather stole from Engineering, many moons ago. They've seen some tough times recently." @@ -141,4 +141,4 @@ /obj/item/clothing/gloves/chief_engineer/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) + AddComponent(/datum/component/adjust_fishing_difficulty, -6) diff --git a/code/modules/clothing/gloves/punch_mitts.dm b/code/modules/clothing/gloves/punch_mitts.dm index 96848731a9cbb..36d085c289c5a 100644 --- a/code/modules/clothing/gloves/punch_mitts.dm +++ b/code/modules/clothing/gloves/punch_mitts.dm @@ -11,7 +11,7 @@ /obj/item/clothing/gloves/fingerless/punch_mitts/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) + AddComponent(/datum/component/adjust_fishing_difficulty, -6) AddComponent(/datum/component/martial_art_giver, /datum/martial_art/boxing/hunter) /datum/armor/gloves_mitts diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm index 98de3145ddc78..88274322e7161 100644 --- a/code/modules/clothing/gloves/special.dm +++ b/code/modules/clothing/gloves/special.dm @@ -60,7 +60,7 @@ /obj/item/clothing/gloves/rapid/Initialize(mapload) . = ..() AddComponent(/datum/component/wearertargeting/punchcooldown) - AddComponent(/datum/component/adjust_fishing_difficulty, -7) + AddComponent(/datum/component/adjust_fishing_difficulty, -9) /obj/item/clothing/gloves/radio name = "translation gloves" @@ -78,7 +78,7 @@ /obj/item/clothing/gloves/race/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -7) + AddComponent(/datum/component/adjust_fishing_difficulty, -9) /obj/item/clothing/gloves/captain desc = "Regal blue gloves, with a nice gold trim, a diamond anti-shock coating, and an integrated thermal barrier. Swanky." @@ -98,7 +98,7 @@ /obj/item/clothing/gloves/captain/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) + AddComponent(/datum/component/adjust_fishing_difficulty, -6) /datum/armor/captain_gloves bio = 90 @@ -129,7 +129,7 @@ /obj/item/clothing/gloves/latex/nitrile/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) + AddComponent(/datum/component/adjust_fishing_difficulty, -6) /obj/item/clothing/gloves/latex/coroner name = "coroner's gloves" @@ -185,7 +185,7 @@ /obj/item/clothing/gloves/fishing/Initialize(mapload) . = ..() AddComponent(/datum/component/profound_fisher, new /obj/item/fishing_rod/mob_fisher/athletic(src)) - AddComponent(/datum/component/adjust_fishing_difficulty, -3) //on top of the extra that you get from the athletics skill. + AddComponent(/datum/component/adjust_fishing_difficulty, -4) //on top of the extra that you get from the athletics skill. /obj/item/clothing/gloves/fishing/equipped(mob/user, slot) . = ..() diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index d45fa8d0a90b5..ce3db5ab6547b 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -23,7 +23,7 @@ /// See: [/datum/component/tackler/var/skill_mod] var/skill_mod = 1 ///How much these gloves affect fishing difficulty - var/fishing_modifier = -5 + var/fishing_modifier = -7 /obj/item/clothing/gloves/tackler/Initialize(mapload) . = ..() @@ -61,7 +61,7 @@ tackle_speed = 2 min_distance = 2 skill_mod = -2 - fishing_modifier = -8 + fishing_modifier = -10 /obj/item/clothing/gloves/tackler/combat name = "gorilla gloves" @@ -113,11 +113,11 @@ base_knockdown = 1.75 SECONDS min_distance = 2 skill_mod = -1 - fishing_modifier = -3 + fishing_modifier = -5 /obj/item/clothing/gloves/tackler/football name = "football gloves" desc = "Gloves for football players! Teaches them how to tackle like a pro." icon_state = "tackle_gloves" inhand_icon_state = null - fishing_modifier = -3 + fishing_modifier = -4 diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 9f7d01506f1e5..2ac7db70225f4 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -109,7 +109,7 @@ /obj/item/clothing/head/collectable/pirate/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) /obj/item/clothing/head/collectable/kitty name = "collectable kitty ears" @@ -135,7 +135,7 @@ /obj/item/clothing/head/collectable/wizard/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -1) + AddComponent(/datum/component/adjust_fishing_difficulty, -2) /obj/item/clothing/head/collectable/hardhat name = "collectable hard hat" diff --git a/code/modules/clothing/head/fedora.dm b/code/modules/clothing/head/fedora.dm index 7bf295f74553a..0bc555ca6bcfe 100644 --- a/code/modules/clothing/head/fedora.dm +++ b/code/modules/clothing/head/fedora.dm @@ -38,7 +38,7 @@ /obj/item/clothing/head/fedora/carpskin/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) + AddComponent(/datum/component/adjust_fishing_difficulty, -6) /obj/item/clothing/head/fedora/beige/press name = "press fedora" diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 7b67cda761f2e..a15a59f05addf 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -626,7 +626,7 @@ /obj/item/clothing/head/utility/surgerycap/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! + AddComponent(/datum/component/adjust_fishing_difficulty, -3) //FISH DOCTOR?! /obj/item/clothing/head/utility/surgerycap/attack_self(mob/user) . = ..() @@ -672,7 +672,7 @@ /obj/item/clothing/head/utility/head_mirror/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! + AddComponent(/datum/component/adjust_fishing_difficulty, -3) //FISH DOCTOR?! /obj/item/clothing/head/utility/head_mirror/examine(mob/user) . = ..() diff --git a/code/modules/clothing/head/moth.dm b/code/modules/clothing/head/moth.dm index e040d834c9d21..48441d4757868 100644 --- a/code/modules/clothing/head/moth.dm +++ b/code/modules/clothing/head/moth.dm @@ -15,7 +15,7 @@ /obj/item/clothing/head/mothcap/original/Initialize(mapload) . = ..() AddComponent(/datum/component/scope, range_modifier = 1.2, zoom_method = ZOOM_METHOD_ITEM_ACTION, item_action_type = /datum/action/item_action/hands_free/moth_googles) - AddComponent(/datum/component/adjust_fishing_difficulty, -2) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) /obj/item/clothing/head/mothcap/original/item_action_slot_check(slot, mob/user, datum/action/action) return (slot & ITEM_SLOT_HEAD) diff --git a/code/modules/clothing/head/pirate.dm b/code/modules/clothing/head/pirate.dm index 6d5d0a67f30f9..ab1aaba8e3739 100644 --- a/code/modules/clothing/head/pirate.dm +++ b/code/modules/clothing/head/pirate.dm @@ -7,7 +7,7 @@ /obj/item/clothing/head/costume/pirate/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) + AddComponent(/datum/component/adjust_fishing_difficulty, -5) /obj/item/clothing/head/costume/pirate/equipped(mob/user, slot) . = ..() diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 629305740318d..a25a8eb3ca902 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -175,7 +175,7 @@ . = ..() AddComponent(/datum/component/speechmod, replacements = strings("crustacean_replacement.json", "crustacean")) //you asked for this. AddElement(/datum/element/skill_reward, /datum/skill/fishing) - AddComponent(/datum/component/adjust_fishing_difficulty, -4) + AddComponent(/datum/component/adjust_fishing_difficulty, -5) #define PROPHAT_MOOD "prophat" diff --git a/code/modules/clothing/masks/animal_masks.dm b/code/modules/clothing/masks/animal_masks.dm index 5a92c8faf071c..fd900810e67c3 100644 --- a/code/modules/clothing/masks/animal_masks.dm +++ b/code/modules/clothing/masks/animal_masks.dm @@ -152,15 +152,15 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( /obj/item/clothing/mask/animal/frog/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, cursed ? 2 : -2) + AddComponent(/datum/component/adjust_fishing_difficulty, cursed ? 4 : -4) /obj/item/clothing/mask/animal/frog/make_cursed() . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 2) + AddComponent(/datum/component/adjust_fishing_difficulty, 4) /obj/item/clothing/mask/animal/frog/clear_curse() . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) /obj/item/clothing/mask/animal/frog/cursed cursed = TRUE @@ -241,15 +241,15 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( /obj/item/clothing/mask/animal/small/bear/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, cursed ? 2 : -2) + AddComponent(/datum/component/adjust_fishing_difficulty, cursed ? 4 : -4) /obj/item/clothing/mask/animal/small/bear/make_cursed() . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 2) + AddComponent(/datum/component/adjust_fishing_difficulty, 4) /obj/item/clothing/mask/animal/small/bear/clear_curse() . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) /obj/item/clothing/mask/animal/small/bear/cursed cursed = TRUE @@ -301,15 +301,15 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( /obj/item/clothing/mask/animal/small/tribal/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, cursed ? 4 : -4) + AddComponent(/datum/component/adjust_fishing_difficulty, cursed ? 5 : -5) /obj/item/clothing/mask/animal/small/tribal/make_cursed() . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 4) + AddComponent(/datum/component/adjust_fishing_difficulty, 5) /obj/item/clothing/mask/animal/small/tribal/clear_curse() . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) + AddComponent(/datum/component/adjust_fishing_difficulty, -5) /obj/item/clothing/mask/animal/small/tribal/cursed //adminspawn only. cursed = TRUE diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 46ad60e58deaa..b28645da3a5ed 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -26,7 +26,7 @@ /obj/item/clothing/mask/floortilebalaclava/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) //tacticool + AddComponent(/datum/component/adjust_fishing_difficulty, -5) //tacticool /obj/item/clothing/mask/floortilebalaclava/attack_self(mob/user) adjust_visor(user) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 89d9a68530acb..afbdeef519224 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -5,6 +5,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( "The Madman" = "joker", "The Rainbow Color" = "rainbow", "The Jester" = "chaos", + "The Dealer" = "cards" )) /obj/item/clothing/mask/gas @@ -306,7 +307,8 @@ GLOBAL_LIST_INIT(clown_mask_options, list( "The Coquette" = image(icon = src.icon, icon_state = "sexyclown"), "The Jester" = image(icon = src.icon, icon_state = "chaos"), "The Madman" = image(icon = src.icon, icon_state = "joker"), - "The Rainbow Color" = image(icon = src.icon, icon_state = "rainbow") + "The Rainbow Color" = image(icon = src.icon, icon_state = "rainbow"), + "The Dealer" = image(icon = src.icon, icon_state = "cards"), ) AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWN, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 0) @@ -338,6 +340,15 @@ GLOBAL_LIST_INIT(clown_mask_options, list( resistance_flags = FLAMMABLE fishing_modifier = 0 +/obj/item/clothing/mask/gas/jonkler + name = "gamer's wig and mask" + desc = "But I am a gamer, and no man; A reproach of men, and despised by the people." + clothing_flags = MASKINTERNALS + icon_state = "jonkler" + inhand_icon_state = null + flags_cover = MASKCOVERSEYES + resistance_flags = FLAMMABLE + /obj/item/clothing/mask/gas/mime name = "mime mask" desc = "The traditional mime's mask. It has an eerie facial posture." @@ -422,7 +433,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( clothing_flags = MASKINTERNALS flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE - fishing_modifier = -1 + fishing_modifier = -2 /obj/item/clothing/mask/gas/carp name = "carp mask" @@ -430,7 +441,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( icon_state = "carp_mask" inhand_icon_state = null flags_cover = MASKCOVERSEYES - fishing_modifier = -3 + fishing_modifier = -4 /obj/item/clothing/mask/gas/tiki_mask name = "tiki mask" @@ -443,7 +454,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( max_integrity = 100 actions_types = list(/datum/action/item_action/adjust) dog_fashion = null - fishing_modifier = -2 + fishing_modifier = -4 var/list/tikimask_designs = list() /obj/item/clothing/mask/gas/tiki_mask/Initialize(mapload) @@ -485,7 +496,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( inhand_icon_state = "gas_atmos" resistance_flags = FIRE_PROOF | ACID_PROOF flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS|HIDEHAIR|HIDESNOUT - fishing_modifier = -2 + fishing_modifier = -4 /obj/item/clothing/mask/gas/prop name = "prop gas mask" diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 7e16bd3bdab83..a02c7d1debff9 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -215,7 +215,7 @@ /obj/item/clothing/neck/stethoscope/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! + AddComponent(/datum/component/adjust_fishing_difficulty, -3) //FISH DOCTOR?! /obj/item/clothing/neck/stethoscope/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] puts \the [src] to [user.p_their()] chest! It looks like [user.p_they()] won't hear much!")) diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index 68a7b1bb0aefd..77e7b2ff369e2 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -74,7 +74,7 @@ /obj/item/clothing/shoes/jackboots/floortile/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) //tacticool + AddComponent(/datum/component/adjust_fishing_difficulty, -5) //tacticool /obj/item/clothing/shoes/winterboots name = "winter boots" @@ -181,7 +181,7 @@ /obj/item/clothing/shoes/pirate/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) /obj/item/clothing/shoes/pirate/armored armor_type = /datum/armor/shoes_pirate diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm index 3c66c0ac0c6b5..bbc0778e87445 100644 --- a/code/modules/clothing/shoes/costume.dm +++ b/code/modules/clothing/shoes/costume.dm @@ -129,7 +129,7 @@ create_storage(storage_type = /datum/storage/pockets/shoes) LoadComponent(/datum/component/squeak, list('sound/effects/quack.ogg' = 1), 50, falloff_exponent = 20) - AddComponent(/datum/component/adjust_fishing_difficulty, -6) //deploy tactical duckling lure + AddComponent(/datum/component/adjust_fishing_difficulty, -7) //deploy tactical duckling lure /obj/item/clothing/shoes/ducky_shoes/equipped(mob/living/user, slot) . = ..() diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index d3918752056d1..a7618b6f3be59 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -266,7 +266,7 @@ /obj/item/clothing/suit/hooded/carp_costume/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) /obj/item/clothing/head/hooded/carp_hood name = "carp hood" @@ -281,7 +281,7 @@ /obj/item/clothing/head/hooded/carp_hood/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) + AddComponent(/datum/component/adjust_fishing_difficulty, -5) /obj/item/clothing/head/hooded/carp_hood/equipped(mob/living/carbon/human/user, slot) ..() @@ -405,7 +405,7 @@ /obj/item/clothing/suit/hooded/shark_costume/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) /obj/item/clothing/head/hooded/shark_hood name = "shark hood" @@ -419,7 +419,7 @@ /obj/item/clothing/head/hooded/shark_hood/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) + AddComponent(/datum/component/adjust_fishing_difficulty, -5) /obj/item/clothing/suit/hooded/shork_costume // Oh God Why name = "shork costume" @@ -434,7 +434,7 @@ /obj/item/clothing/suit/hooded/shork_costume/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 2) + AddComponent(/datum/component/adjust_fishing_difficulty, 4) /obj/item/clothing/head/hooded/shork_hood name = "shork hood" @@ -448,7 +448,7 @@ /obj/item/clothing/head/hooded/shork_hood/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 3) + AddComponent(/datum/component/adjust_fishing_difficulty, 5) /obj/item/clothing/suit/hooded/bloated_human //OH MY GOD WHAT HAVE YOU DONE!?!?!? name = "bloated human suit" @@ -617,7 +617,7 @@ /obj/item/clothing/suit/costume/hawaiian/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) + AddComponent(/datum/component/adjust_fishing_difficulty, -5) /obj/item/clothing/suit/costume/football_armor name = "football protective gear" diff --git a/code/modules/clothing/suits/ethereal.dm b/code/modules/clothing/suits/ethereal.dm index 1c86ca34094f3..031d5ac4c3c51 100644 --- a/code/modules/clothing/suits/ethereal.dm +++ b/code/modules/clothing/suits/ethereal.dm @@ -14,7 +14,7 @@ /obj/item/clothing/suit/hooded/ethereal_raincoat/Initialize(mapload) . = ..() update_icon(UPDATE_OVERLAYS) - AddComponent(/datum/component/adjust_fishing_difficulty, -3) + AddComponent(/datum/component/adjust_fishing_difficulty, -5) /obj/item/clothing/suit/hooded/ethereal_raincoat/worn_overlays(mutable_appearance/standing, isinhands, icon_file) . = ..() @@ -33,7 +33,7 @@ /obj/item/clothing/suit/hooded/ethereal_raincoat/trailwarden/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -5) + AddComponent(/datum/component/adjust_fishing_difficulty, -7) /obj/item/clothing/suit/hooded/ethereal_raincoat/trailwarden/equipped(mob/living/user, slot) . = ..() @@ -56,4 +56,4 @@ /obj/item/clothing/head/hooded/ethereal_rainhood/trailwarden/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) + AddComponent(/datum/component/adjust_fishing_difficulty, -6) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 504558229639c..affe103e307bf 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -54,7 +54,7 @@ /obj/item/clothing/suit/apron/overalls/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) //Captain /obj/item/clothing/suit/jacket/capjacket @@ -356,7 +356,7 @@ /obj/item/clothing/suit/apron/surgical/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) // FISH DOCTOR?! + AddComponent(/datum/component/adjust_fishing_difficulty, -3) // FISH DOCTOR?! //Curator /obj/item/clothing/suit/jacket/curator diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 954fb9342e3ca..aa9ea344ad70e 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -40,7 +40,7 @@ /obj/item/clothing/suit/toggle/labcoat/cmo/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! + AddComponent(/datum/component/adjust_fishing_difficulty, -3) //FISH DOCTOR?! /datum/armor/toggle_labcoat bio = 50 @@ -61,7 +61,7 @@ /obj/item/clothing/suit/toggle/labcoat/paramedic/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! + AddComponent(/datum/component/adjust_fishing_difficulty, -3) //FISH DOCTOR?! /obj/item/clothing/suit/toggle/labcoat/mad name = "\proper The Mad's labcoat" diff --git a/code/modules/clothing/suits/moth.dm b/code/modules/clothing/suits/moth.dm index 076a0dd0b3c9a..b9c8ab64fa66a 100644 --- a/code/modules/clothing/suits/moth.dm +++ b/code/modules/clothing/suits/moth.dm @@ -16,7 +16,7 @@ /obj/item/clothing/suit/mothcoat/original/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) + AddComponent(/datum/component/adjust_fishing_difficulty, -5) create_storage(storage_type = /datum/storage/pockets) /obj/item/clothing/suit/mothcoat/winter diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 704182f3642d2..794ebfbff49f2 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -12,7 +12,7 @@ resistance_flags = FIRE_PROOF | ACID_PROOF dog_fashion = /datum/dog_fashion/head/blue_wizard ///How much this hat affects fishing difficulty - var/fishing_modifier = -4 + var/fishing_modifier = -6 /obj/item/clothing/head/wizard/Initialize(mapload) . = ..() @@ -54,7 +54,7 @@ armor_type = /datum/armor/none resistance_flags = FLAMMABLE dog_fashion = /datum/dog_fashion/head/blue_wizard - fishing_modifier = -1 + fishing_modifier = -2 /obj/item/clothing/head/wizard/chanterelle name = "chanterelle hat" @@ -122,7 +122,7 @@ clothing_flags = CASTING_CLOTHES resistance_flags = FIRE_PROOF | ACID_PROOF ///How much this robe affects fishing difficulty - var/fishing_modifier = -6 + var/fishing_modifier = -7 /obj/item/clothing/suit/wizrobe/Initialize(mapload) . = ..() @@ -194,20 +194,20 @@ inhand_icon_state = "wizrobe" armor_type = /datum/armor/none resistance_flags = FLAMMABLE - fishing_modifier = -2 + fishing_modifier = -3 /obj/item/clothing/head/wizard/marisa/fake name = "witch hat" armor_type = /datum/armor/none resistance_flags = FLAMMABLE - fishing_modifier = -1 + fishing_modifier = -2 /obj/item/clothing/head/wizard/tape/fake name = "tape hat" desc = "A hat designed exclusively from duct tape. You can barely see." armor_type = /datum/armor/none resistance_flags = FLAMMABLE - fishing_modifier = -1 + fishing_modifier = -2 /obj/item/clothing/suit/wizrobe/marisa/fake name = "witch robe" @@ -216,14 +216,14 @@ inhand_icon_state = null armor_type = /datum/armor/none resistance_flags = FLAMMABLE - fishing_modifier = -2 + fishing_modifier = -3 /obj/item/clothing/suit/wizrobe/tape/fake name = "tape robe" desc = "An outfit designed exclusively from duct tape. It was hard to put on." armor_type = /datum/armor/none resistance_flags = FLAMMABLE - fishing_modifier = -2 + fishing_modifier = -3 /obj/item/clothing/suit/wizrobe/paper name = "papier-mache robe" // no non-latin characters! @@ -241,7 +241,7 @@ inhand_icon_state = null armor_type = /datum/armor/robe_durathread allowed = /obj/item/clothing/suit/apron::allowed - fishing_modifier = -4 + fishing_modifier = -6 /datum/armor/robe_durathread melee = 15 diff --git a/code/modules/clothing/under/jobs/civilian/curator.dm b/code/modules/clothing/under/jobs/civilian/curator.dm index f08657cee0754..44be99b8951e5 100644 --- a/code/modules/clothing/under/jobs/civilian/curator.dm +++ b/code/modules/clothing/under/jobs/civilian/curator.dm @@ -30,7 +30,7 @@ /obj/item/clothing/under/rank/civilian/curator/treasure_hunter/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) + AddComponent(/datum/component/adjust_fishing_difficulty, -5) /obj/item/clothing/under/rank/civilian/curator/nasa name = "\improper NASA jumpsuit" diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index 2dea332408231..9937e23929a12 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -46,7 +46,7 @@ /obj/item/clothing/under/rank/medical/chief_medical_officer/scrubs/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! + AddComponent(/datum/component/adjust_fishing_difficulty, -3) //FISH DOCTOR?! /obj/item/clothing/under/rank/medical/chief_medical_officer/turtleneck name = "chief medical officer's turtleneck" @@ -88,7 +88,7 @@ /obj/item/clothing/under/rank/medical/scrubs/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! + AddComponent(/datum/component/adjust_fishing_difficulty, -3) //FISH DOCTOR?! /obj/item/clothing/under/rank/medical/scrubs/blue desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 588dd8efc2a68..70d2a5eeadb94 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -60,7 +60,7 @@ /obj/item/clothing/under/misc/adminsuit/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -15) + AddComponent(/datum/component/adjust_fishing_difficulty, -25) /datum/armor/clothing_under/adminsuit melee = 100 diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 98f41f407cab9..07ec1a59c490e 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -119,4 +119,4 @@ /obj/item/clothing/under/suit/carpskin/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) + AddComponent(/datum/component/adjust_fishing_difficulty, -4) diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index e4653b1c9bd47..ac6af3f2f7f8b 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -36,7 +36,7 @@ /obj/item/clothing/under/syndicate/bloodred/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //extra-tactical + AddComponent(/datum/component/adjust_fishing_difficulty, -4) //extra-tactical /datum/armor/clothing_under/syndicate_bloodred melee = 10 @@ -125,7 +125,7 @@ /obj/item/clothing/under/syndicate/floortilecamo/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) //tacticool + AddComponent(/datum/component/adjust_fishing_difficulty, -5) //tacticool /obj/item/clothing/under/syndicate/soviet name = "Ratnik 5 tracksuit" @@ -170,7 +170,7 @@ /obj/item/clothing/under/syndicate/scrubs/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! + AddComponent(/datum/component/adjust_fishing_difficulty, -3) //FISH DOCTOR?! /datum/armor/clothing_under/syndicate_scrubs melee = 10 diff --git a/code/modules/deathmatch/deathmatch_lobby.dm b/code/modules/deathmatch/deathmatch_lobby.dm index 76c8eb5561c08..cf15d0421888d 100644 --- a/code/modules/deathmatch/deathmatch_lobby.dm +++ b/code/modules/deathmatch/deathmatch_lobby.dm @@ -139,7 +139,7 @@ observer.client?.prefs.safe_transfer_prefs_to(new_player) new_player.dna.update_dna_identity() new_player.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE) - new_player.add_traits(list(TRAIT_CANNOT_CRYSTALIZE, TRAIT_PERMANENTLY_MORTAL), INNATE_TRAIT) + new_player.add_traits(list(TRAIT_CANNOT_CRYSTALIZE, TRAIT_PERMANENTLY_MORTAL, TRAIT_TEMPORARY_BODY), INNATE_TRAIT) if(!isnull(observer.mind) && observer.mind?.current) new_player.AddComponent( \ /datum/component/temporary_body, \ diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index 002647f7a0816..7f3b732caf4de 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -106,7 +106,7 @@ // Can remotely scan objects and mobs. if((get_dist(scanned_atom, user) > range) || (!(scanned_atom in view(range, user)) && view_check) || (loc != user)) return TRUE - + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) scanner_busy = TRUE diff --git a/code/modules/experisci/experiment/types/experiment.dm b/code/modules/experisci/experiment/types/experiment.dm index 358d795f68f59..eea7525f30f4b 100644 --- a/code/modules/experisci/experiment/types/experiment.dm +++ b/code/modules/experisci/experiment/types/experiment.dm @@ -78,6 +78,7 @@ */ /datum/experiment/proc/perform_experiment(datum/component/experiment_handler/experiment_handler, ...) var/action_succesful = perform_experiment_actions(arglist(args)) + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) if(is_complete()) finish_experiment(experiment_handler) return action_succesful diff --git a/code/modules/experisci/experiment/types/scanning_fish.dm b/code/modules/experisci/experiment/types/scanning_fish.dm index 3ea4f543687ea..96832cd86724d 100644 --- a/code/modules/experisci/experiment/types/scanning_fish.dm +++ b/code/modules/experisci/experiment/types/scanning_fish.dm @@ -13,7 +13,7 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) allowed_experimentors = list(/obj/item/experi_scanner, /obj/machinery/destructive_scanner, /obj/item/fishing_rod/tech, /obj/item/fish_analyzer) traits = EXPERIMENT_TRAIT_TYPECACHE points_reward = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS ) - required_atoms = list(/obj/item/fish = 4) + required_atoms = list(/obj/item/fish = 3) scan_message = "Scan different species of fish" ///Further experiments added to the techweb when this one is completed. var/list/next_experiments = list(/datum/experiment/scanning/fish/second) @@ -79,26 +79,26 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) /datum/experiment/scanning/fish/second name = "Fish Scanning Experiment 2" - description = "An experiment requiring more fish species to be scanned to unlock the 'Chasm' setting for the fishing portal." + description = "An experiment requiring more fish species to be scanned to unlock the 'Ocean' setting for the fishing portal." points_reward = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS ) - required_atoms = list(/obj/item/fish = 8) + required_atoms = list(/obj/item/fish = 7) next_experiments = list(/datum/experiment/scanning/fish/third) - fish_source_reward = /datum/fish_source/portal/chasm + fish_source_reward = /datum/fish_source/portal/ocean /datum/experiment/scanning/fish/third name = "Fish Scanning Experiment 3" - description = "An experiment requiring even more fish species to be scanned to unlock the 'Ocean' setting for the fishing portal." + description = "An experiment requiring even more fish species to be scanned to unlock the 'Chasm' setting for the fishing portal." points_reward = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS ) - required_atoms = list(/obj/item/fish = 14) + required_atoms = list(/obj/item/fish = 11) next_experiments = list(/datum/experiment/scanning/fish/fourth, /datum/experiment/scanning/fish/holographic) - fish_source_reward = /datum/fish_source/portal/ocean + fish_source_reward = /datum/fish_source/portal/chasm /datum/experiment/scanning/fish/holographic name = "Holographic Fish Scanning Experiment" description = "This one actually requires holographic fish to unlock the 'Randomizer' setting for the fishing portal." performance_hint = "Load in the 'Beach' template at the Holodeck to fish some holo-fish." points_reward = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS ) - required_atoms = list(/obj/item/fish/holo = 4) + required_atoms = list(/obj/item/fish/holo = 3) scan_message = "Scan different species of holographic fish" next_experiments = null fish_source_reward = /datum/fish_source/portal/random @@ -111,6 +111,6 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) name = "Fish Scanning Experiment 4" description = "An experiment requiring lotsa fish species to unlock the 'Hyperspace' setting for the fishing portal." points_reward = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS ) - required_atoms = list(/obj/item/fish = 21) + required_atoms = list(/obj/item/fish = 17) next_experiments = null fish_source_reward = /datum/fish_source/portal/hyperspace diff --git a/code/modules/fishing/admin.dm b/code/modules/fishing/admin.dm index 46212f421283b..53aefaf333899 100644 --- a/code/modules/fishing/admin.dm +++ b/code/modules/fishing/admin.dm @@ -33,8 +33,14 @@ ADMIN_VERB(fishing_calculator, R_DEBUG, "Fishing Calculator", "A calculator... f switch(action) if("recalc") var/rod_type = text2path(params["rod"]) - var/bait_type = text2path(params["bait"]) + if(!rod_type) + to_chat(user, span_warning("A fishing rod is needed in order to fish.")) + return var/hook_type = text2path(params["hook"]) + if(!hook_type) + to_chat(user, span_warning("A fishing hook is needed in order to fish.")) + return + var/bait_type = text2path(params["bait"]) var/line_type = text2path(params["line"]) var/datum/fish_source/spot = GLOB.preset_fish_sources[text2path(params["spot"])] @@ -45,8 +51,7 @@ ADMIN_VERB(fishing_calculator, R_DEBUG, "Fishing Calculator", "A calculator... f if(bait_type) temporary_rod.set_slot(new bait_type(temporary_rod), ROD_SLOT_BAIT) - if(hook_type) - temporary_rod.set_slot(new hook_type(temporary_rod), ROD_SLOT_HOOK) + temporary_rod.set_slot(new hook_type(temporary_rod), ROD_SLOT_HOOK) if(line_type) temporary_rod.set_slot(new line_type(temporary_rod), ROD_SLOT_LINE) diff --git a/code/modules/fishing/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm index 56de1a9b10f6a..ea37c9dc759c0 100644 --- a/code/modules/fishing/aquarium/aquarium.dm +++ b/code/modules/fishing/aquarium/aquarium.dm @@ -356,7 +356,7 @@ fluid_type = params["fluid"] SEND_SIGNAL(src, COMSIG_AQUARIUM_FLUID_CHANGED, fluid_type) . = TRUE - if("reproduction_and_growth") + if("allow_breeding") reproduction_and_growth = !reproduction_and_growth . = TRUE if("feeding_interval") @@ -371,10 +371,10 @@ to_chat(user, span_notice("You take out [item] from [src].")) if("rename_fish") var/new_name = sanitize_name(params["chosen_name"]) - if(!new_name) - return var/atom/movable/fish = locate(params["fish_reference"]) in contents - fish.name = new_name + if(!fish || !new_name || new_name == fish.name) + return + fish.AddComponent(/datum/component/rename, new_name, fish.desc) /obj/structure/aquarium/ui_interact(mob/user, datum/tgui/ui) . = ..() diff --git a/code/modules/fishing/aquarium/fish_analyzer.dm b/code/modules/fishing/aquarium/fish_analyzer.dm index 905d3549128d5..617d8b600baaa 100644 --- a/code/modules/fishing/aquarium/fish_analyzer.dm +++ b/code/modules/fishing/aquarium/fish_analyzer.dm @@ -119,12 +119,12 @@ data["fish_list"] += list(list( "fish_name" = fishie.name, - "fish_icon" = fishie::icon, - "fish_icon_state" = fishie::icon_state, + "fish_icon" = fishie.icon, + "fish_icon_state" = fishie.base_icon_state, "fish_health" = fishie.status == FISH_DEAD ? 0 : PERCENT(fishie.health/initial(fishie.health)), "fish_size" = fishie.size, "fish_weight" = fishie.weight, - "fish_food" = fishie.food::name, + "fish_food" = fishie.food.name, "fish_food_color" = fishie.food::color, "fish_min_temp" = fishie.required_temperature_min, "fish_max_temp" = fishie.required_temperature_max, diff --git a/code/modules/fishing/fish/types/station.dm b/code/modules/fishing/fish/types/station.dm index e811996d5af04..96a7ca7e99f11 100644 --- a/code/modules/fishing/fish/types/station.dm +++ b/code/modules/fishing/fish/types/station.dm @@ -170,6 +170,10 @@ ) return return_list +#define FISH_FRITTERISH "fritterish" +#define FISH_BERNARD "bernard" +#define FISH_MATTHEW "matthew" + /obj/item/fish/fryish/fritterish name = "fritterish" desc = "A deliciously extremophile alien fish. This one looks like a taiyaki." @@ -185,21 +189,45 @@ is_bait = FALSE next_type = /datum/fish_evolution/nessie growth_time = 8 MINUTES + ///fritterish can have different forms assigned to them on init. These are purely visual. + var/variant = FISH_FRITTERISH /obj/item/fish/fryish/fritterish/Initialize(mapload, apply_qualities = TRUE) . = ..() - base_icon_state = icon_state = pick("fritterish", "bernardfish", "matthewfish") - switch(icon_state) - if("bernardfish") + variant = pick(FISH_FRITTERISH, FISH_BERNARD, FISH_MATTHEW) + switch(variant) + if(FISH_BERNARD) name = "bernard-fish" desc = "A deliciously extremophile alien fish shaped like a dinosaur. Children love it." + base_icon_state = icon_state = "bernardfish" sprite_width = 4 sprite_height = 6 - if("matthewfish") - desc = "A deliciously extremophile alien fish shaped like a pterodactyl. Children love it." + if(FISH_MATTHEW) name = "matthew-fish" + desc = "A deliciously extremophile alien fish shaped like a pterodactyl. Children love it." + base_icon_state = icon_state = "matthewfish" sprite_width = 6 +/obj/item/fish/fryish/fritterish/update_name() + switch(variant) + if(FISH_BERNARD) + name = "bernard-fish" + if(FISH_MATTHEW) + name = "matthew-fish" + return ..() + +/obj/item/fish/fryish/fritterish/update_desc() + switch(variant) + if(FISH_BERNARD) + desc = "A deliciously extremophile alien fish shaped like a dinosaur. Children love it." + if(FISH_MATTHEW) + desc = "A deliciously extremophile alien fish shaped like a pterodactyl. Children love it." + return ..() + +#undef FISH_FRITTERISH +#undef FISH_BERNARD +#undef FISH_MATTHEW + /obj/item/fish/fryish/nessie name = "nessie-fish" desc = "A deliciously extremophile alien fish. This one is so big, you could write legends about it." diff --git a/code/modules/fishing/fish_catalog.dm b/code/modules/fishing/fish_catalog.dm index 4f329861ff93c..f95358c87635c 100644 --- a/code/modules/fishing/fish_catalog.dm +++ b/code/modules/fishing/fish_catalog.dm @@ -8,7 +8,7 @@ /obj/item/book/manual/fish_catalog/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4, ITEM_SLOT_HANDS) + AddComponent(/datum/component/adjust_fishing_difficulty, -7, ITEM_SLOT_HANDS) /obj/item/book/manual/fish_catalog/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/fishing/fish_movement.dm b/code/modules/fishing/fish_movement.dm index b288161b19237..952db364d4423 100644 --- a/code/modules/fishing/fish_movement.dm +++ b/code/modules/fishing/fish_movement.dm @@ -103,7 +103,31 @@ var/acceleration_mult = get_acceleration(seconds_per_tick) var/target_acceleration = distance * acceleration_mult * seconds_per_tick + if(fish_idle_velocity) + var/idle_velocity = fish_idle_velocity + var/abs_idle_vel = abs(idle_velocity) + //Make sure idle velocity doesn't manage to halt fish to a grind and getting them unable to move. + //First, check if the directions of the two forces are oppositve + if((idle_velocity / abs_idle_vel) != (target_acceleration / abs(target_acceleration))) + //Then, calculate the ratio between absolute idle velocity and halved acceleration multiplier. + var/halved_ratio = (acceleration_mult * 0.5) / abs_idle_vel + /** + * If the idle velocity is more than half the acceleration, + * proceed to use powers, for diminishing loss of acceleration per additional unit of idle velocity. + * This way you never reach 0 acceleration while allowing more extreme values to keep lowering it. + */ + if(halved_ratio < 1) + var/power = min(halved_ratio + 0.5, 1) + target_acceleration *= 1 - (halved_ratio^power) + /** + * Otherwise we add the idle velocity (which we know is of opposite sign and + * has an absolute value between 0.ε and 0.5) to the target velocity + */ + else + target_acceleration += idle_velocity + fish_velocity = fish_velocity * FISH_FRICTION_MULT + target_acceleration + else if(can_roll && prob(short_chance)) var/distance_from_top = FISHING_MINIGAME_AREA - master.fish_position - master.fish_height var/distance_from_bottom = master.fish_position @@ -115,7 +139,7 @@ target_position = clamp(master.fish_position + jump_length, 0, FISHING_MINIGAME_AREA - master.fish_height) current_velocity_limit = short_jump_velocity_limit - fish_velocity = clamp(fish_velocity + fish_idle_velocity, -current_velocity_limit, current_velocity_limit) + fish_velocity = clamp(fish_velocity, -current_velocity_limit, current_velocity_limit) set_fish_position(seconds_per_tick) ///Proc that returns the acceleration of the fish during the minigame. diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index ccad3b4708017..cddabd90c0629 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -289,7 +289,7 @@ material_flags = NONE custom_price = PAYCHECK_CREW * 3 ///How much holding this affects fishing difficulty - var/fishing_modifier = -2 + var/fishing_modifier = -4 /obj/item/storage/toolbox/fishing/Initialize(mapload) . = ..() @@ -298,7 +298,7 @@ /obj/item/fishing_rod, )) atom_storage.exception_hold = exception_cache - AddComponent(/datum/component/adjust_fishing_difficulty, -2, ITEM_SLOT_HANDS) + AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier, ITEM_SLOT_HANDS) /obj/item/storage/toolbox/fishing/PopulateContents() new /obj/item/bait_can/worm(src) @@ -326,10 +326,10 @@ /obj/item/storage/toolbox/fishing/master name = "super fishing toolbox" - desc = "Contains EVERYTHING (almost) you need for your fishing trip." + desc = "Contains (almost) EVERYTHING you need for your fishing trip." icon_state = "gold" inhand_icon_state = "toolbox_gold" - fishing_modifier = -7 + fishing_modifier = -10 /obj/item/storage/toolbox/fishing/master/PopulateContents() new /obj/item/fishing_rod/telescopic/master(src) @@ -339,7 +339,6 @@ new /obj/item/fish_feed(src) new /obj/item/aquarium_kit(src) new /obj/item/fish_analyzer(src) - new /obj/item/experi_scanner(src) /obj/item/storage/box/fishing_hooks name = "fishing hook set" diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index 30ce2b33ad0cc..646b9816a6e10 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -149,7 +149,9 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) if(rod.hook.fishing_hook_traits & FISHING_HOOK_KILL) special_effects |= FISHING_MINIGAME_RULE_KILL + //Finish the minigame faster at higher skill. The value modifiers for fishing are negative values btw. completion_loss += user.mind?.get_skill_modifier(/datum/skill/fishing, SKILL_VALUE_MODIFIER)/5 + completion_gain -= user.mind?.get_skill_modifier(/datum/skill/fishing, SKILL_VALUE_MODIFIER)/7.5 /datum/fishing_challenge/Destroy(force) GLOB.fishing_challenges_by_user -= user diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index c2db0a43fc9b5..9a02e0b270b42 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -339,8 +339,8 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) if(HAS_TRAIT(fisherman, TRAIT_PROFOUND_FISHER) && !fisherman.client) final_table -= profound_fisher_blacklist for(var/result in final_table) - final_table[result] *= rod.hook?.get_hook_bonus_multiplicative(result) - final_table[result] += rod.hook?.get_hook_bonus_additive(result)//Decide on order here so it can be multiplicative + final_table[result] *= rod.hook.get_hook_bonus_multiplicative(result) + final_table[result] += rod.hook.get_hook_bonus_additive(result)//Decide on order here so it can be multiplicative if(ispath(result, /obj/item/fish)) if(bait) @@ -408,25 +408,47 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) var/list/known_fishes = list() var/obj/item/fishing_rod/rod = user.get_active_held_item() - if(!istype(rod)) + var/list/final_table + if(!istype(rod) || !rod.hook) rod = null + else + final_table = get_modified_fish_table(rod, user, location) + var/total_weight = 0 + var/list/rodless_weights = list() + var/total_rod_weight = 0 + var/list/rod_weights = list() for(var/reward in fish_table) + var/weight = fish_table[reward] + var/final_weight + if(rod) + total_weight += weight + final_weight = final_table[reward] + total_rod_weight += final_weight if(!ispath(reward, /obj/item/fish)) continue var/obj/item/fish/prototype = reward - if(initial(prototype.fish_flags) & FISH_FLAG_SHOW_IN_CATALOG) + if(!(initial(prototype.fish_flags) & FISH_FLAG_SHOW_IN_CATALOG)) + continue + if(rod) + rodless_weights[reward] = weight + rod_weights[reward] = final_weight + else + known_fishes += initial(prototype.name) + + if(rod) + for(var/reward in rodless_weights) + var/percent_weight = rodless_weights[reward] / total_weight + var/percent_rod_weight = rod_weights[reward] / total_rod_weight + var/obj/item/fish/prototype = reward var/init_name = initial(prototype.name) - if(rod) - var/init_weight = fish_table[reward] - var/weight = (rod.bait ? rod.bait.check_bait(prototype) : 1) - weight = get_fish_trait_catch_mods(weight, reward, rod, user, location) - if(weight > init_weight) - init_name = span_bold(init_name) - if(weight/init_weight >= 3.5) - init_name = "init_name" - else if(weight < init_weight) - init_name = span_small(init_name) + var/ratio = percent_weight/percent_rod_weight + if(ratio < 0.9) + init_name = span_bold(init_name) + if(ratio < 0.3) + init_name = "[init_name]" + else if(ratio > 1.1) + init_name = span_small(init_name) known_fishes += init_name if(!length(known_fishes)) @@ -436,7 +458,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) if(rod) info = span_tooltip("boldened are the fish you're more likely to catch with your current setup. The opposite is true for smaller names", info) - examine_text += span_info("[info]: [english_list(known_fishes)].") + examine_text += examine_block(span_info("[info]: [english_list(known_fishes)].")) /datum/fish_source/proc/spawn_reward_from_explosion(atom/location, severity) if(!explosive_malus) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index b950bfc4ad993..fbab77d7c78d5 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -75,21 +75,26 @@ */ /obj/item/plant_analyzer/proc/do_plant_stats_scan(atom/scan_target, mob/user) if(istype(scan_target, /obj/machinery/hydroponics)) + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) to_chat(user, examine_block(scan_tray_stats(scan_target))) return TRUE if(istype(scan_target, /obj/structure/glowshroom)) + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) var/obj/structure/glowshroom/shroom_plant = scan_target to_chat(user, examine_block(scan_plant_stats(shroom_plant.myseed))) return TRUE if(istype(scan_target, /obj/item/graft)) + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) to_chat(user, examine_block(get_graft_text(scan_target))) return TRUE if(isitem(scan_target)) + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) var/obj/item/scanned_object = scan_target if(scanned_object.get_plant_seed() || istype(scanned_object, /obj/item/seeds)) to_chat(user, examine_block(scan_plant_stats(scanned_object))) return TRUE if(isliving(scan_target)) + playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) var/mob/living/L = scan_target if(L.mob_biotypes & MOB_PLANT) plant_biotype_health_scan(scan_target, user) diff --git a/code/modules/jobs/job_types/assistant/assistant.dm b/code/modules/jobs/job_types/assistant/assistant.dm index 6a590d3e8f8dc..57691a5b29cdb 100644 --- a/code/modules/jobs/job_types/assistant/assistant.dm +++ b/code/modules/jobs/job_types/assistant/assistant.dm @@ -58,14 +58,16 @@ Assistant /datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/target) ..() + give_holiday_hat(target) + give_jumpsuit(target) + +/datum/outfit/job/assistant/proc/give_holiday_hat(mob/living/carbon/human/target) for(var/holidayname in GLOB.holidays) var/datum/holiday/holiday_today = GLOB.holidays[holidayname] var/obj/item/special_hat = holiday_today.holiday_hat if(prob(HOLIDAY_HAT_CHANCE) && !isnull(special_hat) && isnull(head)) head = special_hat - give_jumpsuit(target) - /datum/outfit/job/assistant/proc/give_jumpsuit(mob/living/carbon/human/target) var/static/jumpsuit_number = 0 jumpsuit_number += 1 @@ -86,6 +88,9 @@ Assistant /datum/outfit/job/assistant/consistent name = "Assistant - Consistent" +/datum/outfit/job/assistant/consistent/give_holiday_hat(mob/living/carbon/human/target) + return + /datum/outfit/job/assistant/consistent/give_jumpsuit(mob/living/carbon/human/target) uniform = /obj/item/clothing/under/color/grey diff --git a/code/modules/library/bibles.dm b/code/modules/library/bibles.dm index eda1f18f8e7eb..52a1b91316377 100644 --- a/code/modules/library/bibles.dm +++ b/code/modules/library/bibles.dm @@ -340,7 +340,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list( hitsound = 'sound/items/weapons/sear.ogg' damtype = BURN attack_verb_continuous = list("attacks", "burns", "blesses", "damns", "scorches", "curses", "smites") - attack_verb_simple = list("attack", "burn", "bless", "damn", "scorch", "curses", "smites") + attack_verb_simple = list("attack", "burn", "bless", "damn", "scorch", "curse", "smite") deity_name = "The Syndicate" var/uses = 1 var/owner_name diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 03e53ff6f8ab1..f2c3be931436a 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -1,3 +1,6 @@ +/// Cached global list of generated lighting sheets. See: datum/light_source/proc/get_sheet() +GLOBAL_LIST_EMPTY(lighting_sheets) + // This is where the fun begins. // These are the main datums that emit light. @@ -223,16 +226,15 @@ /// If the requested sheet is multiz, this will be 3 lists deep, first handling z level then x and y /// otherwise it's just two, x then y /datum/light_source/proc/get_sheet(multiz = FALSE) - var/list/static/key_to_sheet = list() var/range = max(1, light_range); var/key = "[range]-[visual_offset]-[offset_x]-[offset_y]-[light_dir]-[light_angle]-[light_height]-[multiz]" - var/list/hand_back = key_to_sheet[key] + var/list/hand_back = GLOB.lighting_sheets[key] if(!hand_back) if(multiz) hand_back = generate_sheet_multiz(range, visual_offset, offset_x, offset_y, light_dir, light_angle, light_height) else hand_back = generate_sheet(range, visual_offset, offset_x, offset_y, light_dir, light_angle, light_height) - key_to_sheet[key] = hand_back + GLOB.lighting_sheets[key] = hand_back return hand_back /// Returns a list of lists that encodes the light falloff of our source diff --git a/code/modules/manufactorio/_manufacturing.dm b/code/modules/manufactorio/_manufacturing.dm index db177ac5ae4d1..5c44d1e861518 100644 --- a/code/modules/manufactorio/_manufacturing.dm +++ b/code/modules/manufactorio/_manufacturing.dm @@ -28,7 +28,7 @@ . = ..() if(may_be_moved) . += "It receives power via cable, but certain buildings do not need power." - . += length(contents - circuit) ? "It contains:" : "Its empty." + . += length(contents - circuit) ? "It contains:" : "It contains no items." for(var/atom/movable/thing as anything in contents - circuit) var/text = thing.name var/obj/item/stack/possible_stack = thing @@ -62,6 +62,10 @@ return ITEM_INTERACT_SUCCESS return ITEM_INTERACT_BLOCKING +/obj/machinery/power/manufacturing/setDir(newdir) + . = ..() + update_appearance(UPDATE_OVERLAYS) + /obj/machinery/power/manufacturing/crowbar_act(mob/living/user, obj/item/tool) . = ITEM_INTERACT_BLOCKING if(default_deconstruction_crowbar(tool)) diff --git a/code/modules/manufactorio/machines/crusher.dm b/code/modules/manufactorio/machines/crusher.dm index 272cfeee02ee3..b8cb50bb0bb79 100644 --- a/code/modules/manufactorio/machines/crusher.dm +++ b/code/modules/manufactorio/machines/crusher.dm @@ -39,7 +39,7 @@ if(gone == withholding) withholding = null -/obj/machinery/power/manufacturing/crusher/process(seconds_per_tick) //noot functional +/obj/machinery/power/manufacturing/crusher/process(seconds_per_tick) if(!isnull(withholding) && !send_resource(withholding, dir)) return for(var/material in held_mats) diff --git a/code/modules/manufactorio/machines/lathe.dm b/code/modules/manufactorio/machines/lathe.dm index 2669e851b931f..431d7af1c11db 100644 --- a/code/modules/manufactorio/machines/lathe.dm +++ b/code/modules/manufactorio/machines/lathe.dm @@ -19,18 +19,35 @@ var/atom/movable/withheld /obj/machinery/power/manufacturing/lathe/Initialize(mapload) - . = ..() print_sound = new(src, FALSE) materials = AddComponent( \ /datum/component/material_container, \ SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], \ - SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, \ + 0, \ MATCONTAINER_EXAMINE|MATCONTAINER_NO_INSERT, \ ) + register_context() + . = ..() if(!GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe]) GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe] = new /datum/techweb/autounlocking/autolathe stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe] +/obj/machinery/power/manufacturing/lathe/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB] = "Dump all contained materials" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/power/manufacturing/lathe/click_ctrl_shift(mob/living/user) + balloon_alert_to_viewers("materials dumped") + materials.retrieve_all() + +/obj/machinery/power/manufacturing/lathe/RefreshParts() + . = ..() + var/datum/stock_part/matter_bin/bin = locate() in component_parts + materials.max_amount = bin.tier * (SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE) + + /obj/machinery/power/manufacturing/lathe/examine(mob/user) . = ..() var/datum/design/design @@ -63,7 +80,7 @@ return ..() /obj/machinery/power/manufacturing/lathe/receive_resource(atom/movable/receiving, atom/from, receive_dir) - if(!isstack(receiving) || receiving.resistance_flags & INDESTRUCTIBLE || receive_dir != REVERSE_DIR(dir)) + if(!isstack(receiving) || istype(receiving, /obj/item/stack/ore) || receiving.resistance_flags & INDESTRUCTIBLE || receive_dir != REVERSE_DIR(dir)) return MANUFACTURING_FAIL materials.insert_item(receiving) return MANUFACTURING_SUCCESS diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 4987016c5a074..d6ac3ac4f9424 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -31,7 +31,7 @@ testing("Ruin \"[name]\" placed at ([central_turf.x], [central_turf.y], [central_turf.z])") if(clear_below) - var/list/static/clear_below_typecache = typecacheof(list( + var/static/list/clear_below_typecache = typecacheof(list( /obj/structure/spawner, /mob/living/simple_animal, /obj/structure/flora diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index 74e5ecb78c106..36fdad25d842e 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -464,6 +464,6 @@ /obj/effect/meteor/pumpkin/Initialize(mapload) . = ..() - meteorsound = pick('sound/effects/hallucinations/im_here1.ogg','sound/effects/hallucinations/im_here2.ogg') + meteorsound = SFX_HALLUCINATION_I_M_HERE #undef DEFAULT_METEOR_LIFETIME diff --git a/code/modules/mining/boulder_processing/boulder_types.dm b/code/modules/mining/boulder_processing/boulder_types.dm index 366c5b21c4259..6d0d58a1be2b8 100644 --- a/code/modules/mining/boulder_processing/boulder_types.dm +++ b/code/modules/mining/boulder_processing/boulder_types.dm @@ -38,7 +38,7 @@ . = ..() /// Static list of all minerals to populate gulag boulders with. - var/list/static/gulag_minerals = list( + var/static/list/gulag_minerals = list( /datum/material/diamond = 1, /datum/material/gold = 8, /datum/material/iron = 95, @@ -59,7 +59,7 @@ . = ..() /// Static list of all minerals to populate gulag boulders with, but with bluespace added where safe. - var/list/static/expanded_gulag_minerals = list( + var/static/list/expanded_gulag_minerals = list( /datum/material/bluespace = 1, /datum/material/diamond = 1, /datum/material/gold = 8, diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index d35ef3c2a9499..315ddc5811004 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -40,6 +40,8 @@ var/charge_time = 1.5 SECONDS var/detonation_damage = 50 var/backstab_bonus = 30 + var/current_inhand_icon_state = "crusher" //variable used by retool kits when changing the crusher's appearance + var/projectile_icon = "pulse1" //variable used by retool kits when changing the crusher's projectile sprite /obj/item/kinetic_crusher/Initialize(mapload) . = ..() @@ -153,6 +155,7 @@ if(!isturf(proj_turf)) return var/obj/projectile/destabilizer/destabilizer = new(proj_turf) + destabilizer.icon_state = "[projectile_icon]" for(var/obj/item/crusher_trophy/attached_trophy as anything in trophies) attached_trophy.on_projectile_fire(destabilizer, user) destabilizer.preparePixelProjectile(target, user, modifiers) @@ -181,7 +184,7 @@ return TRUE /obj/item/kinetic_crusher/update_icon_state() - inhand_icon_state = "crusher[HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent + inhand_icon_state = "[current_inhand_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent return ..() /obj/item/kinetic_crusher/update_overlays() @@ -198,7 +201,6 @@ //destablizing force /obj/projectile/destabilizer name = "destabilizing force" - icon_state = "pulse1" damage = 0 //We're just here to mark people. This is still a melee weapon. damage_type = BRUTE armor_flag = BOMB @@ -326,15 +328,15 @@ /obj/item/crusher_trophy/legion_skull/effect_desc() return "a kinetic crusher to recharge [bonus_value*0.1] second\s faster" -/obj/item/crusher_trophy/legion_skull/add_to(obj/item/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/legion_skull/add_to(obj/item/kinetic_crusher/pkc, mob/living/user) . = ..() if(.) - H.charge_time -= bonus_value + pkc.charge_time -= bonus_value -/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/kinetic_crusher/pkc, mob/living/user) . = ..() if(.) - H.charge_time += bonus_value + pkc.charge_time += bonus_value //blood-drunk hunter /obj/item/crusher_trophy/miner_eye @@ -384,18 +386,18 @@ /obj/item/crusher_trophy/demon_claws/effect_desc() return "melee hits to do [bonus_value * 0.2] more damage and heal you for [bonus_value * 0.1], with 5X effect on mark detonation" -/obj/item/crusher_trophy/demon_claws/add_to(obj/item/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/demon_claws/add_to(obj/item/kinetic_crusher/pkc, mob/living/user) . = ..() if(.) - H.force += bonus_value * 0.2 - H.detonation_damage += bonus_value * 0.8 + pkc.force += bonus_value * 0.2 + pkc.detonation_damage += bonus_value * 0.8 AddComponent(/datum/component/two_handed, force_wielded=(20 + bonus_value * 0.2)) -/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/kinetic_crusher/pkc, mob/living/user) . = ..() if(.) - H.force -= bonus_value * 0.2 - H.detonation_damage -= bonus_value * 0.8 + pkc.force -= bonus_value * 0.2 + pkc.detonation_damage -= bonus_value * 0.8 AddComponent(/datum/component/two_handed, force_wielded=20) /obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user) @@ -495,3 +497,80 @@ /obj/item/crusher_trophy/wolf_ear/on_mark_detonation(mob/living/target, mob/living/user) user.apply_status_effect(/datum/status_effect/speed_boost, 1 SECONDS) + +//cosmetic items for changing the crusher's look + +/obj/item/crusher_trophy/retool_kit + name = "crusher sword retool kit" + desc = "A toolkit for changing the crusher's appearance without affecting the device's function. This one will make it look like a sword." + icon = 'icons/obj/mining.dmi' + icon_state = "retool_kit" + denied_type = /obj/item/crusher_trophy/retool_kit + ///Specifies the sprite/icon state which the crusher is changed to as an item. Should appear in the icons/obj/mining.dmi file with accompanying "lit" and "recharging" sprites + var/retool_icon = "crusher_sword" + ///Specifies the icon state for the crusher's appearance in hand. Should appear in both icons/mob/inhands/weapons/hammers_lefthand.dmi and icons/mob/inhands/weapons/hammers_righthand.dmi + var/retool_inhand_icon = "crusher_sword" + ///For if the retool kit changes the projectile's appearance. The sprite should be in icons/obj/weapons/guns/projectiles.dmi + var/retool_projectile_icon = "pulse1" + +/obj/item/crusher_trophy/retool_kit/effect_desc() + return "the crusher to have the appearance of a sword" + +/obj/item/crusher_trophy/retool_kit/add_to(obj/item/kinetic_crusher/pkc, mob/user) + . = ..() + if(.) + pkc.icon_state = retool_icon + pkc.current_inhand_icon_state = retool_inhand_icon + pkc.projectile_icon = retool_projectile_icon + if(iscarbon(pkc.loc)) + var/mob/living/carbon/holder = pkc.loc + holder.update_held_items() + pkc.update_appearance() + +/obj/item/crusher_trophy/retool_kit/remove_from(obj/item/kinetic_crusher/pkc) + pkc.icon_state = initial(pkc.icon_state) + pkc.current_inhand_icon_state = initial(pkc.current_inhand_icon_state) + pkc.projectile_icon = initial(pkc.projectile_icon) + if(iscarbon(pkc.loc)) + var/mob/living/carbon/holder = pkc.loc + holder.update_held_items() + pkc.update_appearance() + ..() + +/obj/item/crusher_trophy/retool_kit/harpoon + name = "crusher harpoon retool kit" + desc = "A toolkit for changing the crusher's appearance without affecting the device's function. This one will make it look like a harpoon." + icon = 'icons/obj/mining.dmi' + icon_state = "retool_kit" + denied_type = /obj/item/crusher_trophy/retool_kit + retool_icon = "crusher_harpoon" + retool_inhand_icon = "crusher_harpoon" + retool_projectile_icon = "pulse_harpoon" + +/obj/item/crusher_trophy/retool_kit/harpoon/effect_desc() + return "the crusher to have the appearance of a harpoon" + +/obj/item/crusher_trophy/retool_kit/dagger + name = "crusher dagger retool kit" + desc = "A toolkit for changing the crusher's appearance without affecting the device's function. This one will make it look like a dual dagger and mini-blaster on a chain." + icon = 'icons/obj/mining.dmi' + icon_state = "retool_kit" + denied_type = /obj/item/crusher_trophy/retool_kit + retool_icon = "crusher_dagger" + retool_inhand_icon = "crusher_dagger" + +/obj/item/crusher_trophy/retool_kit/dagger/effect_desc() + return "the crusher to have the appearance of a dual dagger and blaster" + +/obj/item/crusher_trophy/retool_kit/ashenskull + name = "ashen skull" + desc = "It burns with the flame of the necropolis, whispering in your ear. It demands to be bound to a suitable weapon." + icon = 'icons/obj/mining.dmi' + icon_state = "retool_kit_skull" + denied_type = /obj/item/crusher_trophy/retool_kit + retool_icon = "crusher_skull" + retool_inhand_icon = "crusher_skull" + retool_projectile_icon = "pulse_skull" + +/obj/item/crusher_trophy/retool_kit/ashenskull/effect_desc() + return "the crusher to appear corrupted by infernal powers" diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 17591d93d5221..aec19662d3ae4 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -74,21 +74,21 @@ INITIALIZE_IMMEDIATE(/mob/dead) if(tgui_alert(usr, "Jump to server [pick] ([addr])?", "Server Hop", list("Yes", "No")) != "Yes") return - var/client/C = client - to_chat(C, span_notice("Sending you to [pick].")) - var/atom/movable/screen/splash/S = new(null, null, C) - S.Fade(FALSE) + var/client/hopper = client + to_chat(hopper, span_notice("Sending you to [pick].")) + var/atom/movable/screen/splash/fade_in = new(null, src, hopper, FALSE) + fade_in.Fade(FALSE) ADD_TRAIT(src, TRAIT_NO_TRANSFORM, SERVER_HOPPER_TRAIT) sleep(2.9 SECONDS) //let the animation play REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, SERVER_HOPPER_TRAIT) - if(!C) + if(!hopper) return winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources - C << link("[addr]") + hopper << link("[addr]") #undef SERVER_HOPPER_TRAIT diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 988dd6efdc14a..97a373abc186b 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -22,8 +22,8 @@ /mob/dead/new_player/Initialize(mapload) if(client && SSticker.state == GAME_STATE_STARTUP) - var/atom/movable/screen/splash/S = new(null, client, TRUE, TRUE) - S.Fade(TRUE) + var/atom/movable/screen/splash/fade_out = new(null, null, client, TRUE) + fade_out.Fade(TRUE) if(length(GLOB.newplayer_start)) forceMove(pick(GLOB.newplayer_start)) diff --git a/code/modules/mob/living/basic/alien/maid.dm b/code/modules/mob/living/basic/alien/maid.dm index decfe5736ce30..cf6499884e955 100644 --- a/code/modules/mob/living/basic/alien/maid.dm +++ b/code/modules/mob/living/basic/alien/maid.dm @@ -15,17 +15,19 @@ /mob/living/basic/alien/maid/Initialize(mapload) . = ..() AddElement(/datum/element/cleaning) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) ///Handles the maid attacking other players, cancelling the attack to clean up instead. -/mob/living/basic/alien/maid/proc/pre_attack(mob/living/puncher, atom/target) - SIGNAL_HANDLER +/mob/living/basic/alien/maid/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE + target.wash(CLEAN_SCRUB) if(istype(target, /obj/effect/decal/cleanable)) visible_message(span_notice("[src] cleans up \the [target].")) else visible_message(span_notice("[src] polishes \the [target].")) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE /** * Barmaid special type diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 9501c4e21d3e9..22a200643707a 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -216,14 +216,19 @@ . += span_deadsay("Upon closer examination, [p_they()] appear[p_s()] to be [HAS_MIND_TRAIT(user, TRAIT_NAIVE) ? "asleep" : "dead"].") /mob/living/basic/proc/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) + if(!early_melee_attack(target, modifiers, ignore_cooldown)) + return FALSE + var/result = target.attack_basic_mob(src, modifiers) + SEND_SIGNAL(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, target, result) + return result + +/mob/living/basic/proc/early_melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) face_atom(target) - if (!ignore_cooldown) + if(!ignore_cooldown) changeNext_move(melee_attack_cooldown) if(SEND_SIGNAL(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, target, Adjacent(target), modifiers) & COMPONENT_HOSTILE_NO_ATTACK) return FALSE //but more importantly return before attack_animal called - var/result = target.attack_basic_mob(src, modifiers) - SEND_SIGNAL(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, target, result) - return result + return TRUE /mob/living/basic/resolve_unarmed_attack(atom/attack_target, list/modifiers) melee_attack(attack_target, modifiers) diff --git a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm index 53f9c618c637b..2eae87310591e 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm @@ -70,7 +70,6 @@ AddComponent(/datum/component/swarming) AddComponent(/datum/component/obeys_commands, pet_commands) AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) /mob/living/basic/bee/mob_pickup(mob/living/picker) if(flags_1 & HOLOGRAM_1) @@ -108,18 +107,20 @@ /mob/living/basic/bee/proc/spawn_corpse() new /obj/item/trash/bee(loc, src) -/mob/living/basic/bee/proc/pre_attack(mob/living/puncher, atom/target) - SIGNAL_HANDLER +/mob/living/basic/bee/early_melee_attack(atom/target, list/modifiers) + . = ..() + if(!.) + return FALSE if(istype(target, /obj/machinery/hydroponics)) var/obj/machinery/hydroponics/hydro = target pollinate(hydro) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE if(istype(target, /obj/structure/beebox)) var/obj/structure/beebox/hive = target handle_habitation(hive) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE /mob/living/basic/bee/proc/handle_habitation(obj/structure/beebox/hive) if(hive == beehome) //if its our home, we enter or exit it diff --git a/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm b/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm index e1e611a28c2a8..cedc39f64f3fc 100644 --- a/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm +++ b/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm @@ -1,6 +1,6 @@ /datum/ai_controller/basic_controller/cow blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_BASIC_MOB_TIP_REACTING = FALSE, BB_BASIC_MOB_TIPPER = null, ) @@ -11,7 +11,5 @@ planning_subtrees = list( /datum/ai_planning_subtree/tip_reaction, /datum/ai_planning_subtree/find_food, - //attacking the food will eat it - /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/cow, ) diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm index 28a727fdb1bce..de55865b5fada 100644 --- a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm +++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm @@ -1,7 +1,7 @@ /// Pretty basic, just click people to death. Also hunt and eat bananas. /datum/ai_controller/basic_controller/gorilla blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_TARGET_MINIMUM_STAT = UNCONSCIOUS, BB_EMOTE_KEY = "ooga", BB_EMOTE_CHANCE = 40, @@ -13,10 +13,10 @@ planning_subtrees = list( /datum/ai_planning_subtree/run_emote, - /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path/gorilla, /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/find_food, ) /datum/ai_planning_subtree/attack_obstacle_in_path/gorilla diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm index 43f8c61d0c880..cc6bd1c900e66 100644 --- a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm @@ -45,8 +45,6 @@ AddComponent(/datum/component/basic_mob_ability_telegraph) AddComponent(/datum/component/basic_mob_attack_telegraph, telegraph_duration = 0.6 SECONDS) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) - var/static/list/innate_actions = list( /datum/action/cooldown/mob_cooldown/fire_breath/ice = BB_WHELP_STRAIGHTLINE_FIRE, /datum/action/cooldown/mob_cooldown/fire_breath/ice/cross = BB_WHELP_WIDESPREAD_FIRE, @@ -55,22 +53,24 @@ grant_actions_by_list(innate_actions) -/mob/living/basic/mining/ice_whelp/proc/pre_attack(mob/living/sculptor, atom/target) - SIGNAL_HANDLER +/mob/living/basic/mining/ice_whelp/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(istype(target, /obj/structure/flora/rock/icy)) - INVOKE_ASYNC(src, PROC_REF(create_sculpture), target) - return COMPONENT_HOSTILE_NO_ATTACK + create_sculpture(target) + return FALSE - if(!istype(target, src.type)) - return + if(!istype(target, type)) + return TRUE var/mob/living/victim = target if(victim.stat != DEAD) - return + return TRUE - INVOKE_ASYNC(src, PROC_REF(cannibalize_victim), victim) - return COMPONENT_HOSTILE_NO_ATTACK + cannibalize_victim(victim) + return FALSE /// Carve a stone into a beautiful self-portrait /mob/living/basic/mining/ice_whelp/proc/create_sculpture(atom/target) diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling.dm b/code/modules/mob/living/basic/jungle/seedling/seedling.dm index 00db708bc3299..3af0675a7f864 100644 --- a/code/modules/mob/living/basic/jungle/seedling/seedling.dm +++ b/code/modules/mob/living/basic/jungle/seedling/seedling.dm @@ -80,23 +80,24 @@ AddElement(/datum/element/wall_tearer, allow_reinforced = FALSE) AddComponent(/datum/component/obeys_commands, seedling_commands) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) RegisterSignal(src, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(drop_can)) update_appearance() -/mob/living/basic/seedling/proc/pre_attack(mob/living/puncher, atom/target) - SIGNAL_HANDLER +/mob/living/basic/seedling/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(istype(target, /obj/machinery/hydroponics)) treat_hydro_tray(target) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE if(isnull(held_can)) - return + return TRUE if(istype(target, /obj/structure/sink) || istype(target, /obj/structure/reagent_dispensers)) - INVOKE_ASYNC(held_can, TYPE_PROC_REF(/obj/item, melee_attack_chain), src, target) - return COMPONENT_HOSTILE_NO_ATTACK + held_can.melee_attack_chain(src, target) + return FALSE ///seedlings can water trays, remove weeds, or remove dead plants diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm index 86ba1e003208f..3bf9d1d8f335a 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm @@ -3,7 +3,7 @@ /datum/ai_controller/basic_controller/goliath blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_TARGET_MINIMUM_STAT = HARD_CRIT, ) diff --git a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm index 6b822d490de78..e447255c867aa 100644 --- a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm +++ b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm @@ -34,7 +34,6 @@ /mob/living/basic/mining/gutlunch/Initialize(mapload) . = ..() GLOB.gutlunch_count++ - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) if(greyscale_config) set_greyscale(colors = list(pick(possible_colors))) AddElement(/datum/element/ai_retaliate) @@ -52,19 +51,18 @@ GLOB.gutlunch_count-- return ..() -/mob/living/basic/mining/gutlunch/proc/pre_attack(mob/living/puncher, atom/target) - SIGNAL_HANDLER - - if(!istype(target, /obj/structure/ore_container/food_trough/gutlunch_trough)) +/mob/living/basic/mining/gutlunch/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) return - + if(!istype(target, /obj/structure/ore_container/food_trough/gutlunch_trough)) + return TRUE var/obj/ore_food = locate(/obj/item/stack/ore) in target - if(isnull(ore_food)) balloon_alert(src, "no food!") else melee_attack(ore_food) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE /mob/living/basic/mining/gutlunch/proc/after_birth(mob/living/basic/mining/gutlunch/grub/baby, mob/living/partner) var/our_color = LAZYACCESS(atom_colours, FIXED_COLOUR_PRIORITY) || COLOR_GRAY diff --git a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm index 931b568e5ee3f..f76479dc1312d 100644 --- a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm +++ b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm @@ -15,7 +15,7 @@ melee_damage_lower = 0 melee_damage_upper = 0 attack_verb_continuous = "weakly tackles" - attack_verb_simple = "weakly tackles" + attack_verb_simple = "weakly tackle" speak_emote = list("telepathically cries") attack_sound = 'sound/items/weapons/pierce.ogg' throw_blocked_message = "passes between the bodies of the" diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm index de62b43e4a054..de6ca4a0cc1b4 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm @@ -7,7 +7,7 @@ /datum/ai_controller/basic_controller/lobstrosity blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, BB_TARGET_MINIMUM_STAT = HARD_CRIT, BB_LOBSTROSITY_EXPLOIT_TRAITS = list(TRAIT_INCAPACITATED, TRAIT_FLOORED, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT), @@ -45,7 +45,7 @@ ///Ensure that juveline lobstrosities witll charge at things they can reach. /datum/ai_controller/basic_controller/lobstrosity/juvenile blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, BB_TARGET_MINIMUM_STAT = SOFT_CRIT, BB_LOBSTROSITY_EXPLOIT_TRAITS = list(TRAIT_INCAPACITATED, TRAIT_FLOORED, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT), diff --git a/code/modules/mob/living/basic/lavaland/mook/mook.dm b/code/modules/mob/living/basic/lavaland/mook/mook.dm index 888023897397e..f492c83e74bac 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook.dm @@ -58,7 +58,6 @@ AddComponent(/datum/component/ai_listen_to_weather) AddElement(/datum/element/wall_tearer, allow_reinforced = FALSE) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) RegisterSignal(src, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(drop_ore)) if(is_healer) @@ -96,27 +95,28 @@ held_ore = null update_appearance(UPDATE_OVERLAYS) -/mob/living/basic/mining/mook/proc/pre_attack(mob/living/attacker, atom/target) - SIGNAL_HANDLER - +/mob/living/basic/mining/mook/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE return attack_sequence(target) /mob/living/basic/mining/mook/proc/attack_sequence(atom/target) if(istype(target, /obj/item/stack/ore) && isnull(held_ore)) var/obj/item/ore_target = target ore_target.forceMove(src) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE if(istype(target, /obj/structure/ore_container/material_stand)) if(held_ore) held_ore.forceMove(target) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE if(istype(target, /obj/structure/bonfire)) var/obj/structure/bonfire/fire_target = target if(!fire_target.burning) fire_target.start_burning() - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE /mob/living/basic/mining/mook/proc/change_combatant_state(state) attack_state = state diff --git a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm index b7f7ffa9cf693..917c9c3c43871 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm @@ -35,7 +35,7 @@ GLOBAL_LIST_EMPTY(raptor_population) minimum_survivable_temperature = BODYTEMP_COLD_ICEBOX_SAFE maximum_survivable_temperature = INFINITY attack_verb_continuous = "pecks" - attack_verb_simple = "chomps" + attack_verb_simple = "chomp" attack_sound = 'sound/items/weapons/punch1.ogg' faction = list(FACTION_RAPTOR, FACTION_NEUTRAL) speak_emote = list("screeches") @@ -97,7 +97,6 @@ GLOBAL_LIST_EMPTY(raptor_population) ai_controller.set_blackboard_key(BB_BASIC_MOB_SPEAK_LINES, display_emote) inherited_stats = new inherit_properties() - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) var/static/list/my_food = list(/obj/item/stack/ore) AddElement(/datum/element/basic_eating, food_types = my_food) AddElement(/datum/element/ai_retaliate) @@ -147,19 +146,20 @@ GLOBAL_LIST_EMPTY(raptor_population) pixel_y = (direction & NORTH) ? -5 : 0 -/mob/living/basic/raptor/proc/pre_attack(mob/living/puncher, atom/target) - SIGNAL_HANDLER - +/mob/living/basic/raptor/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(!istype(target, /obj/structure/ore_container/food_trough/raptor_trough)) - return + return TRUE var/obj/ore_food = locate(/obj/item/stack/ore) in target if(isnull(ore_food)) balloon_alert(src, "no food!") else - INVOKE_ASYNC(src, PROC_REF(melee_attack), ore_food) - return COMPONENT_HOSTILE_NO_ATTACK + melee_attack(ore_food) + return TRUE /mob/living/basic/raptor/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) if(!combat_mode && istype(target, /mob/living/basic/raptor/baby_raptor)) diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_controller.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_controller.dm index 8178df7b78c24..d9bada12ee8db 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_controller.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_controller.dm @@ -1,5 +1,3 @@ -#define NEXT_EAT_COOLDOWN 45 SECONDS - /datum/ai_controller/basic_controller/raptor blackboard = list( BB_INTERACTIONS_WITH_OWNER = list( @@ -34,16 +32,9 @@ /datum/ai_planning_subtree/find_and_hunt_target/play_with_owner/raptor, ) -/datum/ai_controller/basic_controller/raptor/TryPossessPawn(atom/new_pawn) +/datum/ai_controller/basic_controller/raptor/on_mob_eat() . = ..() - if(. & AI_CONTROLLER_INCOMPATIBLE) - return - RegisterSignal(new_pawn, COMSIG_MOB_ATE, PROC_REF(post_eat)) - -/datum/ai_controller/basic_controller/raptor/proc/post_eat() - SIGNAL_HANDLER clear_blackboard_key(BB_RAPTOR_TROUGH_TARGET) - set_blackboard_key(BB_RAPTOR_EAT_COOLDOWN, world.time + NEXT_EAT_COOLDOWN) /datum/ai_controller/basic_controller/baby_raptor blackboard = list( @@ -62,5 +53,3 @@ /datum/ai_planning_subtree/express_happiness, /datum/ai_planning_subtree/look_for_adult, ) - -#undef NEXT_EAT_COOLDOWN diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_subtrees.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_subtrees.dm index a8d91963ebfb7..2b88cc3282bd0 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_subtrees.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_subtrees.dm @@ -56,7 +56,7 @@ hunt_range = 9 /datum/ai_planning_subtree/find_and_hunt_target/raptor_trough/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - if(world.time < controller.blackboard[BB_RAPTOR_EAT_COOLDOWN]) + if(world.time < controller.blackboard[BB_NEXT_FOOD_EAT]) return return ..() diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm index bcf8071d7c289..c9edfb0471f27 100644 --- a/code/modules/mob/living/basic/minebots/minebot.dm +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -85,7 +85,6 @@ /datum/id_trim/job/shaft_miner, ) AddElement(/datum/element/mob_access, accesses) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) /mob/living/basic/mining_drone/set_combat_mode(new_mode, silent = TRUE) . = ..() @@ -250,13 +249,15 @@ QDEL_NULL(stored_gun) return ..() -/mob/living/basic/mining_drone/proc/pre_attack(datum/source, atom/target) - SIGNAL_HANDLER +/mob/living/basic/mining_drone/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(!istype(target, /mob/living/basic/node_drone)) - return NONE - INVOKE_ASYNC(src, PROC_REF(repair_node_drone), target) - return COMPONENT_HOSTILE_NO_ATTACK + return TRUE + repair_node_drone(target) + return FALSE /mob/living/basic/mining_drone/proc/repair_node_drone(mob/living/my_target) do_sparks(5, FALSE, source = my_target) diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm index 68821731ee4de..3c2ab3f7c9f9b 100644 --- a/code/modules/mob/living/basic/pets/cat/cat.dm +++ b/code/modules/mob/living/basic/pets/cat/cat.dm @@ -94,29 +94,27 @@ ai_controller.set_blackboard_key(BB_HUNTABLE_PREY, typecacheof(huntable_items)) if(can_breed) add_breeding_component() - if(can_hold_item) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) - if(can_interact_with_stove) - RegisterSignal(src, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(pre_unarmed_attack)) /mob/living/basic/pet/cat/proc/add_cell_sample() AddElement(/datum/element/swabable, CELL_LINE_TABLE_CAT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) -/mob/living/basic/pet/cat/proc/pre_attack(mob/living/source, atom/movable/target) - SIGNAL_HANDLER - if(!is_type_in_list(target, huntable_items) || held_food) - return - target.forceMove(src) +/mob/living/basic/pet/cat/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE -/mob/living/basic/pet/cat/proc/pre_unarmed_attack(mob/living/hitter, atom/target, proximity, modifiers) - SIGNAL_HANDLER + if(istype(target, /obj/machinery/oven/range) && can_interact_with_stove) + target.attack_hand(src) + return FALSE - if(!proximity || !can_unarmed_attack()) - return NONE - if(!istype(target, /obj/machinery/oven/range)) - return NONE - target.attack_hand(src) - return COMPONENT_CANCEL_ATTACK_CHAIN + if(!can_hold_item) + return TRUE + + if(!is_type_in_list(target, huntable_items) || held_food) + return TRUE + var/atom/movable/movable_target = target + movable_target.forceMove(src) + return FALSE /mob/living/basic/pet/cat/Exited(atom/movable/gone, direction) . = ..() diff --git a/code/modules/mob/living/basic/pets/orbie/orbie.dm b/code/modules/mob/living/basic/pets/orbie/orbie.dm index a0fbba899e354..85d82e92515f0 100644 --- a/code/modules/mob/living/basic/pets/orbie/orbie.dm +++ b/code/modules/mob/living/basic/pets/orbie/orbie.dm @@ -36,7 +36,7 @@ ///overlay for our happy eyes var/static/mutable_appearance/happy_eyes_overlay = mutable_appearance('icons/mob/simple/pets.dmi', "orbie_happy_eye_overlay") ///commands we can give orbie - var/list/pet_commands = list( + var/static/list/pet_commands = list( /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/untargeted_ability/pet_lights, @@ -52,24 +52,21 @@ AddElement(/datum/element/basic_eating, food_types = food_types) ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT) - RegisterSignal(src, COMSIG_ATOM_CAN_BE_PULLED, PROC_REF(on_pulled)) RegisterSignal(src, COMSIG_VIRTUAL_PET_LEVEL_UP, PROC_REF(on_level_up)) - RegisterSignal(src, COMSIG_MOB_CLICKON, PROC_REF(on_click)) RegisterSignal(src, COMSIG_ATOM_UPDATE_LIGHT_ON, PROC_REF(on_lights)) ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(food_types)) update_appearance() -/mob/living/basic/orbie/proc/on_click(mob/living/basic/source, atom/target, params) - SIGNAL_HANDLER - - if(!CanReach(target)) - return - +/mob/living/basic/orbie/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(src == target || happy_state || !istype(target)) - return + return TRUE toggle_happy_state() addtimer(CALLBACK(src, PROC_REF(toggle_happy_state)), 30 SECONDS) + return FALSE /mob/living/basic/orbie/proc/on_lights(datum/source) SIGNAL_HANDLER @@ -80,10 +77,8 @@ happy_state = !happy_state update_appearance() -/mob/living/basic/orbie/proc/on_pulled(datum/source) //i need move resist at 0, but i also dont want him to be pulled - SIGNAL_HANDLER - - return COMSIG_ATOM_CANT_PULL +/mob/living/basic/orbie/can_be_pulled(user, grab_state, force) + return FALSE /mob/living/basic/orbie/proc/on_level_up(datum/source, new_level) SIGNAL_HANDLER diff --git a/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm b/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm index 1452dd18dee09..a978b750d5036 100644 --- a/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm +++ b/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm @@ -3,7 +3,7 @@ /datum/ai_controller/basic_controller/orbie blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, BB_TRICK_NAME = "Trick", ) @@ -13,7 +13,6 @@ planning_subtrees = list( /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/find_playmates, - /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/relay_pda_message, /datum/ai_planning_subtree/pet_planning, ) diff --git a/code/modules/mob/living/basic/pets/parrot/_parrot.dm b/code/modules/mob/living/basic/pets/parrot/_parrot.dm index e22948848eb1c..e76b9a5e83e07 100644 --- a/code/modules/mob/living/basic/pets/parrot/_parrot.dm +++ b/code/modules/mob/living/basic/pets/parrot/_parrot.dm @@ -100,8 +100,6 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( 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) AddComponent(/datum/component/obeys_commands, pet_commands) - 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)) @@ -186,12 +184,12 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( icon_state = HAS_TRAIT(src, TRAIT_PARROT_PERCHED) ? icon_sit : 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)) +/mob/living/basic/parrot/resolve_right_click_attack(atom/target, list/modifiers) + if(!start_perching(target)) + return SECONDARY_ATTACK_CALL_NORMAL + if(!isnull(held_item)) drop_held_item(gently = TRUE) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /// 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. @@ -275,16 +273,16 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( /// 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 +/mob/living/basic/parrot/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(isitem(target) && steal_from_ground(target)) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE if(iscarbon(target) && steal_from_mob(target)) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE /// 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) diff --git a/code/modules/mob/living/basic/ruin_defender/skeleton.dm b/code/modules/mob/living/basic/ruin_defender/skeleton.dm index e6754a80a22da..5eb8fda152323 100644 --- a/code/modules/mob/living/basic/ruin_defender/skeleton.dm +++ b/code/modules/mob/living/basic/ruin_defender/skeleton.dm @@ -162,7 +162,7 @@ /// Skeletons mostly just beat people to death, but they'll also find and drink milk. /datum/ai_controller/basic_controller/skeleton blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_TARGET_MINIMUM_STAT = HARD_CRIT, BB_EMOTE_KEY = "rattles", BB_EMOTE_CHANCE = 20, diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm index ae011f5b14a31..93ede010eb6d0 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm @@ -10,7 +10,7 @@ /datum/ai_controller/basic_controller/carp blackboard = list( BB_BASIC_MOB_STOP_FLEEING = TRUE, - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, BB_CARPS_FEAR_FISHERMAN = TRUE, @@ -24,11 +24,11 @@ /datum/ai_planning_subtree/find_target_prioritize_traits, /datum/ai_planning_subtree/make_carp_rift/panic_teleport, /datum/ai_planning_subtree/flee_target/from_fisherman, - /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, /datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman, + /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/carp_migration, ) @@ -36,7 +36,7 @@ /datum/ai_controller/basic_controller/carp/mega blackboard = list( BB_BASIC_MOB_STOP_FLEEING = TRUE, - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, BB_CARPS_FEAR_FISHERMAN = FALSE, @@ -46,12 +46,12 @@ /datum/ai_planning_subtree/simple_find_nearest_target_to_flee, /datum/ai_planning_subtree/make_carp_rift/panic_teleport, /datum/ai_planning_subtree/flee_target, - /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/find_target_prioritize_traits, /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/carp_migration, ) /** @@ -90,13 +90,13 @@ /datum/ai_planning_subtree/find_target_prioritize_traits, /datum/ai_planning_subtree/make_carp_rift/panic_teleport, /datum/ai_planning_subtree/flee_target/from_fisherman, - /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/find_nearest_magicarp_spell_target, /datum/ai_planning_subtree/targeted_mob_ability/magicarp, /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, /datum/ai_planning_subtree/basic_melee_attack_subtree/magicarp, + /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/carp_migration, ) diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm index c036fe461690e..e735067b3ed8d 100644 --- a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm +++ b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm @@ -60,7 +60,6 @@ AddElement(/datum/element/simple_flying) AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/carrot), tame_chance = 100) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) on_hit_overlay = mutable_appearance(icon, "[icon_state]_crying") /mob/living/basic/eyeball/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) @@ -94,21 +93,18 @@ cut_overlay(on_hit_overlay) -/mob/living/basic/eyeball/proc/pre_attack(mob/living/eyeball, atom/target) - SIGNAL_HANDLER - +/mob/living/basic/eyeball/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(!ishuman(target)) - return - + return TRUE var/mob/living/carbon/human_target = target var/obj/item/organ/internal/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES) - if(!eyes) - return - if(eyes.damage < 10) - return + if(isnull(eyes) || eyes.damage < 10) + return TRUE heal_eye_damage(human_target, eyes) - return COMPONENT_HOSTILE_NO_ATTACK - + return FALSE /mob/living/basic/eyeball/proc/heal_eye_damage(mob/living/target, obj/item/organ/internal/eyes/eyes) if(!COOLDOWN_FINISHED(src, eye_healing)) diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm index 6b72f1f09757e..b29718f8810e1 100644 --- a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm +++ b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm @@ -96,18 +96,19 @@ /mob/living/basic/hivebot/mechanic/Initialize(mapload) . = ..() GRANT_ACTION(/datum/action/cooldown/spell/conjure/foam_wall) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) -/mob/living/basic/hivebot/mechanic/proc/pre_attack(mob/living/fixer, atom/target) - SIGNAL_HANDLER +/mob/living/basic/hivebot/mechanic/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(ismachinery(target)) repair_machine(target) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE if(istype(target, /mob/living/basic/hivebot)) repair_hivebot(target) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE /mob/living/basic/hivebot/mechanic/proc/repair_machine(obj/machinery/fixable) if(fixable.get_integrity() >= fixable.max_integrity) diff --git a/code/modules/mob/living/basic/space_fauna/morph.dm b/code/modules/mob/living/basic/space_fauna/morph.dm index f1f568a261b01..f205474af8176 100644 --- a/code/modules/mob/living/basic/space_fauna/morph.dm +++ b/code/modules/mob/living/basic/space_fauna/morph.dm @@ -51,7 +51,6 @@ /mob/living/basic/morph/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) RegisterSignal(src, COMSIG_CLICK_SHIFT, PROC_REF(trigger_ability)) RegisterSignal(src, COMSIG_ACTION_DISGUISED_APPEARANCE, PROC_REF(on_disguise)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_DISGUISED), PROC_REF(on_undisguise)) @@ -150,28 +149,31 @@ return COMSIG_MOB_CANCEL_CLICKON /// Handles the logic for attacking anything. -/mob/living/basic/morph/proc/pre_attack(mob/living/basic/source, atom/target) - SIGNAL_HANDLER +/mob/living/basic/morph/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(HAS_TRAIT(src, TRAIT_DISGUISED) && (melee_damage_disguised <= 0)) balloon_alert(src, "can't attack while disguised!") - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE if(isliving(target)) //Eat Corpses to regen health var/mob/living/living_target = target if(living_target.stat != DEAD) - return + return TRUE - INVOKE_ASYNC(source, PROC_REF(eat), eatable = living_target, delay = 3 SECONDS, update_health = -50) - return COMPONENT_HOSTILE_NO_ATTACK + eat(eatable = living_target, delay = 3 SECONDS, update_health = -50) + return FALSE - if(isitem(target)) //Eat items just to be annoying - var/obj/item/item_target = target - if(item_target.anchored) - return + if(!isitem(target)) //Eat items just to be annoying + return TRUE - INVOKE_ASYNC(source, PROC_REF(eat), eatable = item_target, delay = 2 SECONDS) - return COMPONENT_HOSTILE_NO_ATTACK + var/obj/item/item_target = target + if(item_target.anchored) + return TRUE + eat(eatable = item_target, delay = 2 SECONDS) + return FALSE /// Eat stuff. Delicious. Return TRUE if we ate something, FALSE otherwise. /// Required: `eatable` is the thing (item or mob) that we are going to eat. diff --git a/code/modules/mob/living/basic/space_fauna/mushroom.dm b/code/modules/mob/living/basic/space_fauna/mushroom.dm index de501eaea2ee1..28f8fa460136e 100644 --- a/code/modules/mob/living/basic/space_fauna/mushroom.dm +++ b/code/modules/mob/living/basic/space_fauna/mushroom.dm @@ -53,7 +53,6 @@ health = maxHealth AddElement(/datum/element/swabable, CELL_LINE_TABLE_WALKING_MUSHROOM, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - RegisterSignal(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(on_attacked_target)) /datum/ai_controller/basic_controller/mushroom blackboard = list( @@ -94,20 +93,17 @@ recover(attack_target) return TRUE -/mob/living/basic/mushroom/proc/on_attacked_target(mob/living/basic/attacker, atom/target) - SIGNAL_HANDLER - - if(!istype(target, /mob/living/basic/mushroom)) - return - var/mob/living/basic/mushroom/victim = target - if(victim.stat != DEAD) +/mob/living/basic/mushroom/melee_attack(mob/living/basic/mushroom/target, list/modifiers, ignore_cooldown = FALSE) + . = ..() + if(!.) + return FALSE + if(!istype(target) || target.stat != DEAD) return - if(victim.faint_ticker >= 3) - consume_mushroom(victim) + if(target.faint_ticker >= 3) + consume_mushroom(target) return - - victim.faint_ticker++ - visible_message(span_notice("[src] chews a bit on [victim].")) + target.faint_ticker++ + visible_message(span_notice("[src] chews a bit on [target].")) /mob/living/basic/mushroom/proc/consume_mushroom(mob/living/basic/mushroom/consumed) visible_message(span_warning("[src] devours [consumed]!")) diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm index 9f9598b11ae20..eae137787ed0d 100644 --- a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm @@ -49,7 +49,6 @@ . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) RegisterSignal(src, COMSIG_MOB_LOGIN, PROC_REF(on_login)) AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) @@ -169,21 +168,22 @@ special_moniker = "You better not screw with [p_their()] [selected_kingdom]... How do you become a [selected_title] of that anyways?" /// Checks if we are able to attack this object, as well as send out the signal to see if we get any special regal rat interactions. -/mob/living/basic/regal_rat/proc/pre_attack(mob/living/source, atom/target) - SIGNAL_HANDLER +/mob/living/basic/regal_rat/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(DOING_INTERACTION(src, REGALRAT_INTERACTION) || !allowed_to_attack(target)) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE if(SEND_SIGNAL(target, COMSIG_RAT_INTERACT, src) & COMPONENT_RAT_INTERACTED) - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE - if(isnull(mind)) - return + if(isnull(mind) || !combat_mode) + return TRUE - if(!combat_mode) - INVOKE_ASYNC(src, PROC_REF(poison_target), target) - return COMPONENT_HOSTILE_NO_ATTACK + poison_target(target) + return TRUE /// Checks if we are allowed to attack this mob. Will return TRUE if we are potentially allowed to attack, but if we end up in a case where we should NOT attack, return FALSE. /mob/living/basic/regal_rat/proc/allowed_to_attack(atom/the_target) diff --git a/code/modules/mob/living/basic/space_fauna/snake/snake.dm b/code/modules/mob/living/basic/space_fauna/snake/snake.dm index 78f7d86e0db3f..3125ae9d32351 100644 --- a/code/modules/mob/living/basic/space_fauna/snake/snake.dm +++ b/code/modules/mob/living/basic/space_fauna/snake/snake.dm @@ -73,7 +73,7 @@ /// Snakes are primarily concerned with getting those tasty, tasty mice, but aren't afraid to strike back at those who attack them /datum/ai_controller/basic_controller/snake blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -82,7 +82,7 @@ planning_subtrees = list( /datum/ai_planning_subtree/target_retaliate, - /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/random_speech/snake, ) diff --git a/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm index a094e20ec35c6..8c879045a3656 100644 --- a/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm +++ b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm @@ -44,11 +44,11 @@ AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) - RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_attack)) - /// Proc that we call on attacking something to dust 'em. -/mob/living/basic/supermatter_spider/proc/on_attack(mob/living/basic/source, atom/target) - SIGNAL_HANDLER +/mob/living/basic/supermatter_spider/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!.) + return FALSE if(isliving(target)) var/mob/living/victim = target @@ -57,14 +57,14 @@ victim.dust() if(single_use) death() - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE if(!isturf(target)) dust_feedback(target) qdel(target) if(single_use) death() - return COMPONENT_HOSTILE_NO_ATTACK + return FALSE /// Simple proc that plays the supermatter dusting sound and sends a visible message. /mob/living/basic/supermatter_spider/proc/dust_feedback(atom/target) diff --git a/code/modules/mob/living/basic/vermin/lizard.dm b/code/modules/mob/living/basic/vermin/lizard.dm index c1c21850ee62a..5e3a07094a91e 100644 --- a/code/modules/mob/living/basic/vermin/lizard.dm +++ b/code/modules/mob/living/basic/vermin/lizard.dm @@ -64,7 +64,7 @@ /datum/ai_controller/basic_controller/lizard blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -72,7 +72,6 @@ idle_behavior = /datum/idle_behavior/idle_random_walk planning_subtrees = list( /datum/ai_planning_subtree/find_food, - /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/lizard, ) diff --git a/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm b/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm index bed72a982399a..c9e8558ec5c45 100644 --- a/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm +++ b/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm @@ -1,10 +1,9 @@ -#define MOTHROACH_EAT_TIMER 1 MINUTES - /datum/ai_controller/basic_controller/mothroach blackboard = list( BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_EAT_FOOD_COOLDOWN = 1 MINUTES, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -15,28 +14,12 @@ /datum/ai_planning_subtree/find_food/mothroach, /datum/ai_planning_subtree/target_retaliate/to_flee, /datum/ai_planning_subtree/flee_target/from_flee_key, - /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/mothroach, ) -/datum/ai_controller/basic_controller/mothroach/TryPossessPawn(atom/new_pawn) - . = ..() - if(. & AI_CONTROLLER_INCOMPATIBLE) - return - RegisterSignal(new_pawn, COMSIG_MOB_ATE, PROC_REF(on_eaten)) - -/datum/ai_controller/basic_controller/mothroach/proc/on_eaten(datum/source) - SIGNAL_HANDLER - set_blackboard_key(BB_MOTHROACH_NEXT_EAT, world.time + MOTHROACH_EAT_TIMER) - /datum/ai_planning_subtree/find_food/mothroach finding_behavior = /datum/ai_behavior/find_and_set/in_list/mothroach_food -/datum/ai_planning_subtree/find_food/mothroach/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - if(world.time < controller.blackboard[BB_MOTHROACH_NEXT_EAT]) - return - return ..() - /datum/ai_behavior/find_and_set/in_list/mothroach_food /datum/ai_behavior/find_and_set/in_list/mothroach_food/search_tactic(datum/ai_controller/controller, locate_paths, search_range) @@ -45,5 +28,3 @@ found -= living_pawn.loc if(length(found)) return pick(found) - -#undef MOTHROACH_EAT_TIMER diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index ced02095e410b..be9c6dc1d1cd1 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -112,7 +112,8 @@ trauma.on_gain() //Update the body's icon so it doesnt appear debrained anymore - brain_owner.update_body_parts() + if(!special && !(brain_owner.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) + brain_owner.update_body_parts() /obj/item/organ/internal/brain/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) // Delete skillchips first as parent proc sets owner to null, and skillchips need to know the brain's owner. @@ -134,7 +135,8 @@ if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !(movement_flags & NO_ID_TRANSFER)) transfer_identity(organ_owner) if(!special) - organ_owner.update_body_parts() + if(!(organ_owner.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) + organ_owner.update_body_parts() organ_owner.clear_mood_event("brain_damage") /obj/item/organ/internal/brain/update_icon_state() diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm index a63067f183113..99fdfc43cb3f5 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult.dm @@ -68,7 +68,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( /mob/living/carbon/alien/adult/check_breath(datum/gas_mixture/breath) if(breath?.total_moles() > 0 && !HAS_TRAIT(src, TRAIT_SNEAK)) - playsound(get_turf(src), pick('sound/mobs/non-humanoids/hiss/lowHiss2.ogg', 'sound/mobs/non-humanoids/hiss/lowHiss3.ogg', 'sound/mobs/non-humanoids/hiss/lowHiss4.ogg'), 50, FALSE, -5) + playsound(get_turf(src), SFX_LOW_HISS, 50, FALSE, -5) return ..() /mob/living/carbon/alien/adult/setGrabState(newstate) @@ -136,7 +136,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( lucky_winner.audible_message(span_danger("You hear a deep groan, and a harsh snap like a mantrap.")) lucky_winner.visible_message(span_danger("[src] devours [lucky_winner]!"), \ - span_userdanger("[lucky_winner] devours you!")) + span_userdanger("[src] devours you!")) log_combat(src, lucky_winner, "devoured") melting_pot.consume_thing(lucky_winner) return TRUE diff --git a/code/modules/mob/living/carbon/alien/alien_update_icons.dm b/code/modules/mob/living/carbon/alien/alien_update_icons.dm index 468dca3540071..c0e2fdd1067a2 100644 --- a/code/modules/mob/living/carbon/alien/alien_update_icons.dm +++ b/code/modules/mob/living/carbon/alien/alien_update_icons.dm @@ -4,7 +4,7 @@ /mob/living/carbon/alien/update_damage_overlays() //aliens don't have damage overlays. return -/mob/living/carbon/alien/update_body() // we don't use the bodyparts or body layers for aliens. +/mob/living/carbon/alien/update_body(is_creating = FALSE) // we don't use the bodyparts or body layers for aliens. return /mob/living/carbon/alien/update_body_parts()//we don't use the bodyparts layer for aliens. diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a18bb74bb34b3..cbfcd5d5a5c6d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,7 +1,9 @@ /mob/living/carbon/Initialize(mapload) . = ..() create_carbon_reagents() - update_body_parts() //to update the carbon's new bodyparts appearance + update_body(is_creating = TRUE) //to update the carbon's new bodyparts appearance + living_flags &= ~STOP_OVERLAY_UPDATE_BODY_PARTS + register_context() GLOB.carbon_list += src @@ -12,6 +14,8 @@ //This must be done first, so the mob ghosts correctly before DNA etc is nulled . = ..() + living_flags |= STOP_OVERLAY_UPDATE_BODY_PARTS + QDEL_LIST(hand_bodyparts) QDEL_LIST(organs) QDEL_LIST(bodyparts) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index dbfa3849b25ad..c13ac14b100c1 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -11,7 +11,8 @@ usable_hands = 0 //Populated on init through list/bodyparts mobility_flags = MOBILITY_FLAGS_CARBON_DEFAULT blocks_emissive = EMISSIVE_BLOCK_NONE - living_flags = ALWAYS_DEATHGASP + // STOP_OVERLAY_UPDATE_BODY_PARTS is removed after we call update_body_parts() during init. + living_flags = ALWAYS_DEATHGASP|STOP_OVERLAY_UPDATE_BODY_PARTS ///List of [/obj/item/organ]s in the mob. They don't go in the contents for some reason I don't want to know. var/list/obj/item/organ/organs = list() ///Same as [above][/mob/living/carbon/var/organs], but stores "slot ID" - "organ" pairs for easy access. diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index 07e63d2ae3256..8863dedd43e61 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -459,11 +459,12 @@ SEND_SIGNAL(src, COMSIG_ITEM_GET_WORN_OVERLAYS, ., standing, isinhands, icon_file) ///Checks to see if any bodyparts need to be redrawn, then does so. update_limb_data = TRUE redraws the limbs to conform to the owner. +///Returns an integer representing the number of limbs that were updated. /mob/living/carbon/proc/update_body_parts(update_limb_data) update_damage_overlays() update_wound_overlays() var/list/needs_update = list() - var/limb_count_update = FALSE + var/limb_count_update = 0 for(var/obj/item/bodypart/limb as anything in bodyparts) limb.update_limb(is_creating = update_limb_data) //Update limb actually doesn't do much, get_limb_icon is the cpu eater. @@ -473,13 +474,15 @@ if(icon_render_keys[limb.body_zone] != old_key) //If the keys match, that means the limb doesn't need to be redrawn needs_update += limb + limb_count_update += length(needs_update) var/list/missing_bodyparts = get_missing_limbs() if(((dna ? dna.species.max_bodypart_count : BODYPARTS_DEFAULT_MAXIMUM) - icon_render_keys.len) != missing_bodyparts.len) //Checks to see if the target gained or lost any limbs. - limb_count_update = TRUE + limb_count_update += 1 for(var/missing_limb in missing_bodyparts) icon_render_keys -= missing_limb //Removes dismembered limbs from the key list - if(!needs_update.len && !limb_count_update) + . = limb_count_update + if(!.) return //GENERATE NEW LIMBS diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 74a5091565c74..257601977f555 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -22,7 +22,6 @@ message = "claps." hands_use_check = TRUE emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE - audio_cooldown = 5 SECONDS vary = TRUE /datum/emote/living/carbon/clap/get_sound(mob/living/user) @@ -53,7 +52,6 @@ key_third_person = "cries" message = "cries." message_mime = "sobs silently." - audio_cooldown = 5 SECONDS emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE vary = TRUE stat_allowed = SOFT_CRIT @@ -180,7 +178,10 @@ /datum/emote/living/carbon/snap/get_sound(mob/living/user) if(ishuman(user)) - return pick('sound/mobs/humanoids/human/snap/fingersnap1.ogg', 'sound/mobs/humanoids/human/snap/fingersnap2.ogg') + return pick( + 'sound/mobs/humanoids/human/snap/fingersnap1.ogg', + 'sound/mobs/humanoids/human/snap/fingersnap2.ogg', + ) return null /datum/emote/living/carbon/shoesteal diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 250d974080505..2a97e9c7746b0 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -368,6 +368,9 @@ GLOBAL_LIST_EMPTY(features_by_species) */ /datum/species/proc/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load) SHOULD_CALL_PARENT(TRUE) + + human_who_gained_species.living_flags |= STOP_OVERLAY_UPDATE_BODY_PARTS //Don't call update_body_parts() for every single bodypart overlay added. + // Drop the items the new species can't wear human_who_gained_species.mob_biotypes = inherent_biotypes human_who_gained_species.mob_respiration_type = inherent_respiration_type @@ -417,6 +420,8 @@ GLOBAL_LIST_EMPTY(features_by_species) properly_gained = TRUE + human_who_gained_species.living_flags &= ~STOP_OVERLAY_UPDATE_BODY_PARTS + /** * Proc called when a carbon is no longer this species. * @@ -427,40 +432,44 @@ GLOBAL_LIST_EMPTY(features_by_species) * * new_species - The new species that the carbon became, used for genetics mutations. * * pref_load - Preferences to be loaded from character setup, loads in preferred mutant things like bodyparts, digilegs, skin color, etc. */ -/datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) +/datum/species/proc/on_species_loss(mob/living/carbon/human/human, datum/species/new_species, pref_load) SHOULD_CALL_PARENT(TRUE) - C.butcher_results = null - for(var/X in inherent_traits) - REMOVE_TRAIT(C, X, SPECIES_TRAIT) + + human.living_flags |= STOP_OVERLAY_UPDATE_BODY_PARTS //Don't call update_body_parts() for every single bodypart overlay removed. + human.butcher_results = null + for(var/trait in inherent_traits) + REMOVE_TRAIT(human, trait, SPECIES_TRAIT) //If their inert mutation is not the same, swap it out - if((inert_mutation != new_species.inert_mutation) && LAZYLEN(C.dna.mutation_index) && (inert_mutation in C.dna.mutation_index)) - C.dna.remove_mutation(inert_mutation) + if((inert_mutation != new_species.inert_mutation) && LAZYLEN(human.dna.mutation_index) && (inert_mutation in human.dna.mutation_index)) + human.dna.remove_mutation(inert_mutation) //keep it at the right spot, so we can't have people taking shortcuts - var/location = C.dna.mutation_index.Find(inert_mutation) - C.dna.mutation_index[location] = new_species.inert_mutation - C.dna.default_mutation_genes[location] = C.dna.mutation_index[location] - C.dna.mutation_index[new_species.inert_mutation] = create_sequence(new_species.inert_mutation) - C.dna.default_mutation_genes[new_species.inert_mutation] = C.dna.mutation_index[new_species.inert_mutation] + var/location = human.dna.mutation_index.Find(inert_mutation) + human.dna.mutation_index[location] = new_species.inert_mutation + human.dna.default_mutation_genes[location] = human.dna.mutation_index[location] + human.dna.mutation_index[new_species.inert_mutation] = create_sequence(new_species.inert_mutation) + human.dna.default_mutation_genes[new_species.inert_mutation] = human.dna.mutation_index[new_species.inert_mutation] if(inherent_factions) for(var/i in inherent_factions) - C.faction -= i + human.faction -= i - clear_tail_moodlets(C) + clear_tail_moodlets(human) - remove_body_markings(C) + remove_body_markings(human) // Removes all languages previously associated with [LANGUAGE_SPECIES], gaining our new species will add new ones back var/datum/language_holder/losing_holder = GLOB.prototype_language_holders[species_language_holder] for(var/language in losing_holder.understood_languages) - C.remove_language(language, UNDERSTOOD_LANGUAGE, LANGUAGE_SPECIES) + human.remove_language(language, UNDERSTOOD_LANGUAGE, LANGUAGE_SPECIES) for(var/language in losing_holder.spoken_languages) - C.remove_language(language, SPOKEN_LANGUAGE, LANGUAGE_SPECIES) + human.remove_language(language, SPOKEN_LANGUAGE, LANGUAGE_SPECIES) for(var/language in losing_holder.blocked_languages) - C.remove_blocked_language(language, LANGUAGE_SPECIES) + human.remove_blocked_language(language, LANGUAGE_SPECIES) + + SEND_SIGNAL(human, COMSIG_SPECIES_LOSS, src) - SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src) + human.living_flags &= ~STOP_OVERLAY_UPDATE_BODY_PARTS /** * Handles the body of a human @@ -808,8 +817,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(QDELETED(target)) //may be called from a timer return target.set_facial_hairstyle("Shaved", update = FALSE) - target.set_hairstyle("Bald", update = FALSE) - target.update_body_parts() + target.set_hairstyle("Bald") //This calls update_body_parts() ////////////////// // ATTACK PROCS // diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 325abea10d66d..3d03d4ffc6689 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -63,7 +63,7 @@ message = "screams!" message_mime = "acts out a scream!" emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE - audio_cooldown = 5 SECONDS + specific_emote_audio_cooldown = 10 SECONDS vary = TRUE /datum/emote/living/carbon/human/scream/can_run_emote(mob/user, status_check = TRUE , intentional, params) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6eb00abcf1409..9fcb4083f30f6 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -15,7 +15,9 @@ setup_human_dna() create_carbon_reagents() - set_species(dna.species.type) + set_species(dna.species.type, icon_update = FALSE) //carbon/Initialize will call update_body() + //set species enables and disables the flag. Just to be sure, we re-enable it now until it's removed by the parent call. + living_flags |= STOP_OVERLAY_UPDATE_BODY_PARTS prepare_huds() //Prevents a nasty runtime on human init diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index c0f05ff0733a3..68e6640bdeb10 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -521,8 +521,7 @@ affecting.receive_damage(acidity, 2*acidity) emote("scream") set_facial_hairstyle("Shaved", update = FALSE) - set_hairstyle("Bald", update = FALSE) - update_body_parts() + set_hairstyle("Bald") //This calls update_body_parts() ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC) update_damage_overlays() diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 665caf557be41..2ad994432c046 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -133,8 +133,8 @@ There are several things that need to be remembered: my_chest?.worn_uniform_offset?.apply_offset(uniform_overlay) overlays_standing[UNIFORM_LAYER] = uniform_overlay - update_body_parts() apply_overlay(UNIFORM_LAYER) + check_body_shape(BODYSHAPE_DIGITIGRADE, ITEM_SLOT_ICLOTHING) /mob/living/carbon/human/update_worn_id(update_obscured = TRUE) remove_overlay(ID_LAYER) @@ -349,9 +349,7 @@ There are several things that need to be remembered: overlays_standing[SHOES_LAYER] = shoes_overlay apply_overlay(SHOES_LAYER) - - update_body_parts() - + check_body_shape(BODYSHAPE_DIGITIGRADE, ITEM_SLOT_FEET) /mob/living/carbon/human/update_suit_storage(update_obscured = TRUE) remove_overlay(SUIT_STORE_LAYER) @@ -400,6 +398,7 @@ There are several things that need to be remembered: overlays_standing[HEAD_LAYER] = head_overlay apply_overlay(HEAD_LAYER) + check_body_shape(BODYSHAPE_SNOUTED, ITEM_SLOT_HEAD) /mob/living/carbon/human/update_worn_belt(update_obscured = TRUE) remove_overlay(BELT_LAYER) @@ -448,8 +447,8 @@ There are several things that need to be remembered: my_chest?.worn_suit_offset?.apply_offset(suit_overlay) overlays_standing[SUIT_LAYER] = suit_overlay - update_body_parts() apply_overlay(SUIT_LAYER) + check_body_shape(BODYSHAPE_DIGITIGRADE, ITEM_SLOT_OCLOTHING) /mob/living/carbon/human/update_pockets() if(client && hud_used) @@ -500,7 +499,7 @@ There are several things that need to be remembered: overlays_standing[FACEMASK_LAYER] = mask_overlay apply_overlay(FACEMASK_LAYER) - update_body_parts() //e.g. upgate needed because mask now hides lizard snout + check_body_shape(BODYSHAPE_SNOUTED, ITEM_SLOT_MASK) /mob/living/carbon/human/update_worn_back(update_obscured = TRUE) remove_overlay(BACK_LAYER) @@ -858,6 +857,44 @@ generate/load female uniform sprites matching all previously decided variables update_worn_head() update_worn_mask() +/** + * Used to perform regular updates to the limbs of humans with special bodyshapes + * + * * check_shapes: The bodyshapes to check for. + * Any limbs or organs which share this shape, will be updated. + * * ignore_slots: The slots to ignore when updating the limbs. + * This is useful for things like digitigrade legs, where we can skip some slots that we're already updating. + * + * return an integer, the number of limbs updated + */ +/mob/living/carbon/human/proc/check_body_shape(check_shapes = BODYSHAPE_DIGITIGRADE|BODYSHAPE_SNOUTED, ignore_slots = NONE) + . = 0 + if(!(bodyshape & check_shapes)) + // optimization - none of our limbs or organs have the desired shape + return . + + for(var/obj/item/bodypart/limb as anything in bodyparts) + var/checked_bodyshape = limb.bodyshape + // accounts for stuff like snouts + for(var/obj/item/organ/organ in limb) + checked_bodyshape |= organ.external_bodyshapes + + // any limb needs to be updated, so stop here and do it + if(checked_bodyshape & check_shapes) + . = update_body_parts() + break + + if(!.) + return + // hardcoding this here until bodypart updating is more sane + // we need to update clothing items that may have been affected by bodyshape updates + if(check_shapes & BODYSHAPE_DIGITIGRADE) + for(var/obj/item/thing as anything in get_equipped_items()) + if(thing.slot_flags & ignore_slots) + continue + if(thing.supports_variations_flags & DIGITIGRADE_VARIATIONS) + thing.update_slot_icon() + // Hooks into human apply overlay so that we can modify all overlays applied through standing overlays to our height system. // Some of our overlays will be passed through a displacement filter to make our mob look taller or shorter. // Some overlays can't be displaced as they're too close to the edge of the sprite or cross the middle point in a weird way. diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 7420a5d7bad76..92099c7dac3b7 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -193,8 +193,15 @@ var/mob/living/carbon/human/human_user = user if(human_user.physique == FEMALE) - return pick('sound/mobs/humanoids/human/gasp/gasp_female1.ogg', 'sound/mobs/humanoids/human/gasp/gasp_female2.ogg', 'sound/mobs/humanoids/human/gasp/gasp_female3.ogg') - return pick('sound/mobs/humanoids/human/gasp/gasp_male1.ogg', 'sound/mobs/humanoids/human/gasp/gasp_male2.ogg') + return pick( + 'sound/mobs/humanoids/human/gasp/gasp_female1.ogg', + 'sound/mobs/humanoids/human/gasp/gasp_female2.ogg', + 'sound/mobs/humanoids/human/gasp/gasp_female3.ogg', + ) + return pick( + 'sound/mobs/humanoids/human/gasp/gasp_male1.ogg', + 'sound/mobs/humanoids/human/gasp/gasp_male2.ogg', + ) /datum/emote/living/gasp/shock key = "gaspshock" @@ -263,7 +270,7 @@ message = "laughs." message_mime = "laughs silently!" emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE - audio_cooldown = 5 SECONDS + specific_emote_audio_cooldown = 8 SECONDS vary = TRUE /datum/emote/living/laugh/can_run_emote(mob/living/user, status_check = TRUE , intentional, params) @@ -312,7 +319,6 @@ message = "sneezes." message_mime = "acts out an exaggerated silent sneeze." emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE - audio_cooldown = 5 SECONDS vary = TRUE /datum/emote/living/sneeze/get_sound(mob/living/carbon/human/user) @@ -326,7 +332,6 @@ message = "coughs!" message_mime = "acts out an exaggerated cough!" vary = TRUE - audio_cooldown = 5 SECONDS emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE | EMOTE_RUNECHAT /datum/emote/living/cough/can_run_emote(mob/user, status_check = TRUE , intentional, params) @@ -743,7 +748,6 @@ key_third_person = "whistles" message = "whistles." message_mime = "whistles silently!" - audio_cooldown = 5 SECONDS vary = TRUE emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 55a00a6ffc0bc..3730ca05d0f79 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -152,3 +152,9 @@ var/atom/ai_structure = ai_mob_to_structure() ai_structure.balloon_alert(user, "disconnected neural network") return ITEM_INTERACT_SUCCESS + +/mob/living/silicon/ai/attack_effects(damage_done, hit_zone, armor_block, obj/item/attacking_item, mob/living/attacker) + if(damage_done > 0 && attacking_item.damtype != STAMINA && stat != DEAD) + spark_system.start() + . = TRUE + return ..() || . diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 6deab5f08e0ac..d9caad422927e 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -477,8 +477,8 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return spark_system.start() -/mob/living/silicon/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - . = ..() - if (. || AM.throwforce < CYBORG_THROW_SLOWDOWN_THRESHOLD) - return - apply_status_effect(/datum/status_effect/borg_throw_slow) +/mob/living/silicon/robot/attack_effects(damage_done, hit_zone, armor_block, obj/item/attacking_item, mob/living/attacker) + if(damage_done > 0 && attacking_item.damtype != STAMINA && stat != DEAD) + spark_system.start() + . = TRUE + return ..() || . diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 221b1d18478cf..77764f5ea44d0 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -303,7 +303,13 @@ cyborg.logevent("Chassis model has been set to [name].") sleep(0.1 SECONDS) for(var/i in 1 to 4) - playsound(cyborg, pick('sound/items/tools/drill_use.ogg', 'sound/items/tools/jaws_cut.ogg', 'sound/items/tools/jaws_pry.ogg', 'sound/items/tools/welder.ogg', 'sound/items/tools/ratchet.ogg'), 80, TRUE, -1) + playsound(cyborg, pick( + 'sound/items/tools/drill_use.ogg', + 'sound/items/tools/jaws_cut.ogg', + 'sound/items/tools/jaws_pry.ogg', + 'sound/items/tools/welder.ogg', + 'sound/items/tools/ratchet.ogg', + ), 80, TRUE, -1) sleep(0.7 SECONDS) cyborg.SetLockdown(FALSE) cyborg.ai_lockdown = FALSE diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index ddad79afacb91..404b0324f71a0 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -138,3 +138,20 @@ /mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash/static, length = 25) if(affect_silicon) return ..() + +/// If an item does this or more throwing damage it will slow a borg down on hit +#define CYBORG_SLOWDOWN_THRESHOLD 10 + +/mob/living/silicon/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + . = ..() + if(. || AM.throwforce < CYBORG_SLOWDOWN_THRESHOLD) // can cyborgs even catch things? + return + apply_status_effect(/datum/status_effect/borg_slow, AM.throwforce / 20) + +/mob/living/silicon/attack_effects(damage_done, hit_zone, armor_block, obj/item/attacking_item, mob/living/attacker) + . = ..() + if(damage_done < CYBORG_SLOWDOWN_THRESHOLD) + return + apply_status_effect(/datum/status_effect/borg_slow, damage_done / 60) + +#undef CYBORG_SLOWDOWN_THRESHOLD diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index eefc3389e87c9..ee7e53b7141b3 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -124,7 +124,11 @@ target = C oldtarget_name = C.name speak("Level [threatlevel] infraction alert!") - playsound(src, pick('sound/mobs/non-humanoids/beepsky/criminal.ogg', 'sound/mobs/non-humanoids/beepsky/justice.ogg', 'sound/mobs/non-humanoids/beepsky/freeze.ogg'), 50, FALSE) + playsound(src, pick( + 'sound/mobs/non-humanoids/beepsky/criminal.ogg', + 'sound/mobs/non-humanoids/beepsky/justice.ogg', + 'sound/mobs/non-humanoids/beepsky/freeze.ogg', + ), 50, FALSE) playsound(src,'sound/items/weapons/saberon.ogg',50,TRUE,-1) visible_message(span_warning("[src] ignites his energy swords!")) icon_state = "grievous-c" diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index c2ff78cb76bf7..df9db2defb173 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -59,7 +59,10 @@ /mob/living/simple_animal/bot/secbot/ed209/threat_react(threatlevel) speak("Level [threatlevel] infraction alert!") - playsound(src, pick('sound/mobs/non-humanoids/ed209/ed209_20sec.ogg', 'sound/mobs/non-humanoids/ed209/edplaceholder.ogg'), 50, FALSE) + playsound(src, pick( + 'sound/mobs/non-humanoids/ed209/ed209_20sec.ogg', + 'sound/mobs/non-humanoids/ed209/edplaceholder.ogg', + ), 50, FALSE) /mob/living/simple_animal/bot/secbot/ed209/proc/set_weapon() //used to update the projectile type and firing sound shoot_sound = 'sound/items/weapons/laser.ogg' diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 269f08629e175..0f60aac10fa52 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -509,7 +509,11 @@ /// React to detecting criminal scum by making some kind of noise /mob/living/simple_animal/bot/secbot/proc/threat_react(threatlevel) speak("Level [threatlevel] infraction alert!") - playsound(src, pick('sound/mobs/non-humanoids/beepsky/criminal.ogg', 'sound/mobs/non-humanoids/beepsky/justice.ogg', 'sound/mobs/non-humanoids/beepsky/freeze.ogg'), 50, FALSE) + playsound(src, pick( + 'sound/mobs/non-humanoids/beepsky/criminal.ogg', + 'sound/mobs/non-humanoids/beepsky/justice.ogg', + 'sound/mobs/non-humanoids/beepsky/freeze.ogg', + ), 50, FALSE) /mob/living/simple_animal/bot/secbot/explode() var/atom/Tsec = drop_location() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 70d27f023f188..c7171b3c5556a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -300,7 +300,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/bullet_act(obj/projectile/P) if(BUBBLEGUM_IS_ENRAGED) visible_message(span_danger("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons while enraged!"), span_userdanger("You deflect the projectile!")) - playsound(src, pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 300, TRUE) + playsound(src, SFX_BULLET_MISS, 300, TRUE) return BULLET_ACT_BLOCK return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 350a1a68fd8e3..8c32b2a3c47d6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -16,7 +16,7 @@ Difficulty: Extremely Hard icon_living = "demonic_miner" icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' attack_verb_continuous = "pummels" - attack_verb_simple = "pummels" + attack_verb_simple = "pummel" attack_sound = 'sound/items/weapons/sonic_jackhammer.ogg' mob_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_SPECIAL light_color = COLOR_LIGHT_GRAYISH_RED diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7a45abc2825ae..23e405c873729 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1342,6 +1342,7 @@ VV_DROPDOWN_OPTION(VV_HK_GODMODE, "Toggle Godmode") VV_DROPDOWN_OPTION(VV_HK_DROP_ALL, "Drop Everything") VV_DROPDOWN_OPTION(VV_HK_REGEN_ICONS, "Regenerate Icons") + VV_DROPDOWN_OPTION(VV_HK_REGEN_ICONS_FULL, "Regenerate Icons & Clear Stuck Overlays") VV_DROPDOWN_OPTION(VV_HK_PLAYER_PANEL, "Show player panel") VV_DROPDOWN_OPTION(VV_HK_BUILDMODE, "Toggle Buildmode") VV_DROPDOWN_OPTION(VV_HK_DIRECT_CONTROL, "Assume Direct Control") @@ -1360,6 +1361,12 @@ return regenerate_icons() + if(href_list[VV_HK_REGEN_ICONS_FULL]) + if(!check_rights(NONE)) + return + cut_overlays() + regenerate_icons() + if(href_list[VV_HK_PLAYER_PANEL]) return SSadmin_verbs.dynamic_invoke_verb(usr, /datum/admin_verb/show_player_panel, src) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index f59076fa4b5ff..d2f1ceaef74d3 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -11,6 +11,9 @@ complexity = 3 // it is inside every part of your suit, so incompatible_modules = list(/obj/item/mod/module/springlock) var/set_off = FALSE + var/static/list/gas_connections = list( + COMSIG_TURF_EXPOSE = PROC_REF(on_wearer_exposed_gas), + ) /obj/item/mod/module/springlock/on_install() mod.activation_step_time *= 0.5 @@ -20,22 +23,40 @@ /obj/item/mod/module/springlock/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_wearer_exposed)) + AddComponent(/datum/component/connect_loc_behalf, mod.wearer, gas_connections) /obj/item/mod/module/springlock/on_suit_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS) + qdel(GetComponent(/datum/component/connect_loc_behalf)) -///Signal fired when wearer is exposed to reagents -/obj/item/mod/module/springlock/proc/on_wearer_exposed(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message) - SIGNAL_HANDLER - - if(!(methods & (VAPOR|PATCH|TOUCH)) || set_off || mod.wearer.stat == DEAD) - return //remove non-touch reagent exposure +///Registers the signal COMSIG_MOD_ACTIVATE and calls the proc snap_shut() after a timer +/obj/item/mod/module/springlock/proc/snap_signal() + if(set_off || mod.wearer.stat == DEAD) + return to_chat(mod.wearer, span_danger("[src] makes an ominous click sound...")) playsound(src, 'sound/items/modsuit/springlock.ogg', 75, TRUE) addtimer(CALLBACK(src, PROC_REF(snap_shut)), rand(3 SECONDS, 5 SECONDS)) RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(on_activate_spring_block)) set_off = TRUE +///Calls snap_signal() when exposed to a reagent via VAPOR, PATCH or TOUCH +/obj/item/mod/module/springlock/proc/on_wearer_exposed(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message) + SIGNAL_HANDLER + + if(!(methods & (VAPOR|PATCH|TOUCH))) + return //remove non-touch reagent exposure + snap_signal() + +///Calls snap_signal() when exposed to water vapor +/obj/item/mod/module/springlock/proc/on_wearer_exposed_gas() + SIGNAL_HANDLER + + var/turf/wearer_turf = get_turf(src) + var/datum/gas_mixture/air = wearer_turf.return_air() + if(!(air.gases[/datum/gas/water_vapor] && (air.gases[/datum/gas/water_vapor][MOLES]) >= 5)) + return //return if there aren't more than 5 Moles of Water Vapor in the air + snap_signal() + ///Signal fired when wearer attempts to activate/deactivate suits /obj/item/mod/module/springlock/proc/on_activate_spring_block(datum/source, user) SIGNAL_HANDLER diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 3f29e3006befa..79ed186472ac1 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -559,7 +559,10 @@ if(!use_energy()) return if(HAS_TRAIT(SSstation, STATION_TRAIT_PDA_GLITCHED)) - playsound(src, pick('sound/machines/beep/twobeep_voice1.ogg', 'sound/machines/beep/twobeep_voice2.ogg'), 50, TRUE) + playsound(src, pick( + 'sound/machines/beep/twobeep_voice1.ogg', + 'sound/machines/beep/twobeep_voice2.ogg', + ), 50, TRUE) else playsound(src, 'sound/machines/beep/twobeep_high.ogg', 50, TRUE) audible_message("*[ringtone]*") diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index aa6b9ac3a34c2..55ee105d56c32 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -176,16 +176,7 @@ /datum/movespeed_modifier/magic_ties multiplicative_slowdown = 0.5 -///movespeed modifier that makes you go faster when wet and lying on the floor once past the fish organ set threshold. -/datum/movespeed_modifier/fish_flopping - blacklisted_movetypes = MOVETYPES_NOT_TOUCHING_GROUND - multiplicative_slowdown = - (CRAWLING_ADD_SLOWDOWN * 0.71) - ///speed bonus given by the fish tail organ when inside water. /datum/movespeed_modifier/fish_on_water blacklisted_movetypes = MOVETYPES_NOT_TOUCHING_GROUND multiplicative_slowdown = - /turf/open/water::slowdown - -///speed malus given by the fish organ set when dry -/datum/movespeed_modifier/fish_waterless - multiplicative_slowdown = 0.36 diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm index 8f4e59d65557b..3b32aea77480c 100644 --- a/code/modules/movespeed/modifiers/status_effects.dm +++ b/code/modules/movespeed/modifiers/status_effects.dm @@ -59,3 +59,12 @@ /datum/movespeed_modifier/status_effect/guardian_shield multiplicative_slowdown = 1 + +///movespeed modifier that makes you go faster when wet and lying on the floor once past the fish organ set threshold. +/datum/movespeed_modifier/fish_flopping + blacklisted_movetypes = MOVETYPES_NOT_TOUCHING_GROUND + multiplicative_slowdown = - (CRAWLING_ADD_SLOWDOWN * 0.65) + +///speed malus given by the fish organ set when dry +/datum/movespeed_modifier/fish_waterless + multiplicative_slowdown = 0.36 diff --git a/code/modules/pai/camera.dm b/code/modules/pai/camera.dm index a30601e41547e..1341288991fc2 100644 --- a/code/modules/pai/camera.dm +++ b/code/modules/pai/camera.dm @@ -6,7 +6,7 @@ var/number = length(stored) picture.picture_name = "Image [number] (taken by [loc.name])" stored[picture] = TRUE - playsound(src, pick('sound/items/polaroid/polaroid1.ogg', 'sound/items/polaroid/polaroid2.ogg'), 75, TRUE, -3) + playsound(src, SFX_POLAROID, 75, TRUE, -3) balloon_alert(user, "image recorded") /** diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 5e9d8443408d8..a9695fe6a8abc 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -252,7 +252,7 @@ printpicture(user, picture) if(!silent) - playsound(loc, pick('sound/items/polaroid/polaroid1.ogg', 'sound/items/polaroid/polaroid2.ogg'), 75, TRUE, -3) + playsound(loc, SFX_POLAROID, 75, TRUE, -3) /obj/item/camera/proc/printpicture(mob/user, datum/picture/picture) //Normal camera proc for creating photos pictures_left-- diff --git a/code/modules/photography/camera/other.dm b/code/modules/photography/camera/other.dm index 149d69252a6ac..cb976a8cf319b 100644 --- a/code/modules/photography/camera/other.dm +++ b/code/modules/photography/camera/other.dm @@ -34,4 +34,4 @@ /obj/item/camera/detective/after_picture(mob/user, datum/picture/picture) . = ..() - user.playsound_local(get_turf(src), pick('sound/items/polaroid/polaroid1.ogg', 'sound/items/polaroid/polaroid2.ogg'), 35, TRUE) + user.playsound_local(get_turf(src), SFX_POLAROID, 35, TRUE) diff --git a/code/modules/photography/camera/silicon_camera.dm b/code/modules/photography/camera/silicon_camera.dm index fdc390fe0615a..ac77ce15379b1 100644 --- a/code/modules/photography/camera/silicon_camera.dm +++ b/code/modules/photography/camera/silicon_camera.dm @@ -80,7 +80,7 @@ picture.picture_name = "Image [number] (taken by [loc.name])" stored[picture] = TRUE balloon_alert(user, "image recorded") - user.playsound_local(get_turf(user), pick('sound/items/polaroid/polaroid1.ogg', 'sound/items/polaroid/polaroid2.ogg'), 50, TRUE, -3) + user.playsound_local(get_turf(user), SFX_POLAROID, 50, TRUE, -3) /obj/item/camera/siliconcam/robot_camera name = "Cyborg photo camera" @@ -102,7 +102,7 @@ picture.picture_name = "Image [number] (taken by [loc.name])" stored[picture] = TRUE balloon_alert(user, "image recorded and saved locally") - playsound(src, pick('sound/items/polaroid/polaroid1.ogg', 'sound/items/polaroid/polaroid2.ogg'), 75, TRUE, -3) + playsound(src, SFX_POLAROID, 75, TRUE, -3) /obj/item/camera/siliconcam/robot_camera/selectpicture(mob/living/silicon/robot/user) if(istype(user) && user.connected_ai) diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index 2af0fe7b9cb9d..34f6c1e07187c 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -196,7 +196,7 @@ if(possible_victims.len) return pick(possible_victims) - var/list/static/prioritized_targets = list(/obj/structure/reagent_dispensers, /obj/item/grenade, /obj/structure/window) + var/static/list/prioritized_targets = list(/obj/structure/reagent_dispensers, /obj/item/grenade, /obj/structure/window) for(var/iter_type in prioritized_targets) for(var/already_coined_tries in 1 to 3) var/atom/iter_type_check = locate(iter_type) in valid_targets diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 09cda685ddaa0..64626883b3c47 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1605,8 +1605,7 @@ if(!(methods & (TOUCH|VAPOR)) || !ishuman(exposed_human) || (reac_volume < 0.5)) return exposed_human.set_facial_haircolor("#9922ff", update = FALSE) - exposed_human.set_haircolor(color, update = TRUE) - exposed_human.update_body_parts() + exposed_human.set_haircolor(color) //this will call update_body_parts() /datum/reagent/medicine/polypyr/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index fd3fac2a2a891..14a592aa685f4 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -283,6 +283,8 @@ exposed_mob.incapacitate(1) // startles the felinid, canceling any do_after exposed_mob.add_mood_event("watersprayed", /datum/mood_event/watersprayed) + if((methods & INGEST) && HAS_TRAIT(exposed_mob, TRAIT_WATER_ADAPTATION) && reac_volume >= 4) + exposed_mob.adjust_wet_stacks(0.15 * reac_volume) #undef WATER_TO_WET_STACKS_FACTOR_TOUCH #undef WATER_TO_WET_STACKS_FACTOR_VAPOR @@ -298,9 +300,9 @@ affected_mob.adjust_drunk_effect(drunkness_restored * REM * seconds_per_tick) // and even sobers you up slowly!! if(water_adaptation) var/need_mob_update = FALSE - need_mob_update = affected_mob.adjustToxLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) - need_mob_update += affected_mob.adjustFireLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) - need_mob_update += affected_mob.adjustBruteLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustToxLoss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustFireLoss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustBruteLoss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) return need_mob_update ? UPDATE_MOB_HEALTH : . // For weird backwards situations where water manages to get added to trays nutrients, as opposed to being snowflaked away like usual. @@ -2217,8 +2219,7 @@ var/mob/living/carbon/human/exposed_human = exposed_mob exposed_human.set_facial_haircolor(pick(potential_colors), update = FALSE) - exposed_human.set_haircolor(pick(potential_colors), update = TRUE) - exposed_human.update_body_parts() + exposed_human.set_haircolor(pick(potential_colors)) //this will call update_body_parts() /datum/reagent/barbers_aid name = "Barber's Aid" @@ -2276,13 +2277,11 @@ if(!head || (head.head_flags & HEAD_HAIR)) return head.head_flags |= HEAD_HAIR - var/message if(HAS_TRAIT(affected_mob, TRAIT_BALD)) - message = span_warning("You feel your scalp mutate, but you are still hopelessly bald.") + to_chat(affected_mob, span_warning("You feel your scalp mutate, but you are still hopelessly bald.")) else - message = span_notice("Your scalp mutates, a full head of hair sprouting from it.") - to_chat(affected_mob, message) - human_mob.update_body_parts() + to_chat(affected_mob, span_notice("Your scalp mutates, a full head of hair sprouting from it.")) + human_mob.update_body_parts() /datum/reagent/baldium name = "Baldium" diff --git a/code/modules/reagents/reagent_containers/cups/drinkingglass.dm b/code/modules/reagents/reagent_containers/cups/drinkingglass.dm index fa3a53434bbcc..a4f902ff5f3cd 100644 --- a/code/modules/reagents/reagent_containers/cups/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/cups/drinkingglass.dm @@ -36,7 +36,8 @@ /obj/item/reagent_containers/cup/glass/drinkingglass/on_reagent_change(datum/reagents/holder, ...) . = ..() if(!length(reagents.reagent_list)) - REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT) //so new drinks can rename the glass + qdel(GetComponent(/datum/component/rename)) + REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, SHAKER_LABEL_TRAIT) //so new drinks can rename the glass // Having our icon state change removes fill thresholds /obj/item/reagent_containers/cup/glass/drinkingglass/on_cup_change(datum/glass_style/style) @@ -58,8 +59,8 @@ if(!HAS_TRAIT(src, TRAIT_WAS_RENAMED)) return + qdel(GetComponent(/datum/component/rename)) REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, SHAKER_LABEL_TRAIT) - REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT) name = initial(name) desc = initial(desc) update_appearance(UPDATE_NAME | UPDATE_DESC) diff --git a/code/modules/research/designs/autolathe/service_designs.dm b/code/modules/research/designs/autolathe/service_designs.dm index 94772421b69ab..29523bf5820b9 100644 --- a/code/modules/research/designs/autolathe/service_designs.dm +++ b/code/modules/research/designs/autolathe/service_designs.dm @@ -537,7 +537,7 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE, ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE /datum/design/fish_case name = "Stasis Fish Case" @@ -549,7 +549,7 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE, ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE /datum/design/ticket_machine name = "Ticket Machine Frame" diff --git a/code/modules/spells/spell_types/conjure/simian.dm b/code/modules/spells/spell_types/conjure/simian.dm index b64a34f847ea7..1f1074cb981fb 100644 --- a/code/modules/spells/spell_types/conjure/simian.dm +++ b/code/modules/spells/spell_types/conjure/simian.dm @@ -98,7 +98,7 @@ weapon.attack_self(summoned_monkey) // Fashionable ape wear, organised by tier - var/list/static/monky_hats = list( + var/static/list/monky_hats = list( null, // nothin here /obj/item/clothing/head/costume/garland, /obj/item/clothing/head/helmet/durathread, diff --git a/code/modules/spells/spell_types/touch/_touch.dm b/code/modules/spells/spell_types/touch/_touch.dm index 24eefe04d1020..49d1f24e39c67 100644 --- a/code/modules/spells/spell_types/touch/_touch.dm +++ b/code/modules/spells/spell_types/touch/_touch.dm @@ -153,6 +153,10 @@ return ..() | SPELL_NO_FEEDBACK | SPELL_NO_IMMEDIATE_COOLDOWN /datum/action/cooldown/spell/touch/cast(mob/living/carbon/cast_on) + if(SEND_SIGNAL(cast_on, COMSIG_TOUCH_HANDLESS_CAST) & COMPONENT_CAST_HANDLESS) + StartCooldown() + return ..() + if(!QDELETED(attached_hand) && (attached_hand in cast_on.held_items)) remove_hand(cast_on, reset_cooldown_after = TRUE) return diff --git a/code/modules/surgery/advanced/wingreconstruction.dm b/code/modules/surgery/advanced/wingreconstruction.dm index 3234b61e1e043..21e34efc2d76d 100644 --- a/code/modules/surgery/advanced/wingreconstruction.dm +++ b/code/modules/surgery/advanced/wingreconstruction.dm @@ -53,7 +53,7 @@ wings.heal_wings(user, ALL) var/obj/item/organ/external/antennae/antennae = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_ANTENNAE) //i mean we might aswell heal their antennae too - antennae?.heal_antennae() + antennae?.heal_antennae(user, ALL) human_target.update_body_parts() return ..() diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 5d9b16b19a90e..76028826d353a 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -107,8 +107,8 @@ var/species_color = "" ///Limbs need this information as a back-up incase they are generated outside of a carbon (limbgrower) var/should_draw_greyscale = TRUE - ///An "override" color that can be applied to ANY limb, greyscale or not. - var/variable_color = "" + /// An assoc list of priority (as a string because byond) -> color, used to override draw_color. + var/list/color_overrides var/px_x = 0 var/px_y = 0 @@ -230,7 +230,7 @@ if(texture_bodypart_overlay) texture_bodypart_overlay = new texture_bodypart_overlay() - add_bodypart_overlay(texture_bodypart_overlay) + add_bodypart_overlay(texture_bodypart_overlay, update = FALSE) if(!IS_ORGANIC_LIMB(src)) grind_results = null @@ -923,12 +923,7 @@ is_husked = FALSE is_invisible = FALSE - if(variable_color) - draw_color = variable_color - else if(should_draw_greyscale) - draw_color = species_color || (skin_tone ? skintone2hex(skin_tone) : null) - else - draw_color = null + update_draw_color() if(!is_creating || !owner) return @@ -951,13 +946,29 @@ skin_tone = "" species_color = "" - draw_color = variable_color - if(should_draw_greyscale) //Should the limb be colored? - draw_color ||= species_color || (skin_tone ? skintone2hex(skin_tone) : null) + update_draw_color() recolor_bodypart_overlays() return TRUE +/obj/item/bodypart/proc/update_draw_color() + draw_color = null + if(LAZYLEN(color_overrides)) + var/priority + for (var/override_priority in color_overrides) + if (text2num(override_priority) > priority) + priority = text2num(override_priority) + draw_color = color_overrides[override_priority] + return + if(should_draw_greyscale) + draw_color = species_color || (skin_tone ? skintone2hex(skin_tone) : null) + +/obj/item/bodypart/proc/add_color_override(new_color, color_priority) + LAZYSET(color_overrides, "[color_priority]", new_color) + +/obj/item/bodypart/proc/remove_color_override(color_priority) + LAZYREMOVE(color_overrides, "[color_priority]") + //to update the bodypart's icon when not attached to a mob /obj/item/bodypart/proc/update_icon_dropped() SHOULD_CALL_PARENT(TRUE) @@ -1018,9 +1029,8 @@ if(aux_zone) //Hand shit aux = image(limb.icon, "[limb_id]_[aux_zone]", -aux_layer, image_dir) . += aux - draw_color = variable_color - if(should_draw_greyscale) //Should the limb be colored outside of a forced color? - draw_color ||= (species_color) || (skin_tone && skintone2hex(skin_tone)) + + update_draw_color() if(is_husked) huskify_image(thing_to_husk = limb) @@ -1085,14 +1095,26 @@ thing_to_husk.add_overlay(husk_blood) ///Add a bodypart overlay and call the appropriate update procs -/obj/item/bodypart/proc/add_bodypart_overlay(datum/bodypart_overlay/overlay) +/obj/item/bodypart/proc/add_bodypart_overlay(datum/bodypart_overlay/overlay, update = TRUE) bodypart_overlays += overlay overlay.added_to_limb(src) + if(!update) + return + if(!owner) + update_icon_dropped() + else if(!(owner.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) + owner.update_body_parts() ///Remove a bodypart overlay and call the appropriate update procs -/obj/item/bodypart/proc/remove_bodypart_overlay(datum/bodypart_overlay/overlay) +/obj/item/bodypart/proc/remove_bodypart_overlay(datum/bodypart_overlay/overlay, update = TRUE) bodypart_overlays -= overlay overlay.removed_from_limb(src) + if(!update) + return + if(!owner) + update_icon_dropped() + else if(!(owner.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) + owner.update_body_parts() /obj/item/bodypart/atom_deconstruct(disassembled = TRUE) SHOULD_CALL_PARENT(TRUE) @@ -1298,10 +1320,10 @@ if(!isnull(dimorphic)) is_dimorphic = dimorphic - if(owner) - owner.update_body_parts() - else + if(!owner) update_icon_dropped() + else if(!(owner.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) + owner.update_body_parts() //This foot gun needs a safety if(!icon_exists(icon_holder, "[limb_id]_[body_zone][is_dimorphic ? "_[limb_gender]" : ""]")) @@ -1316,10 +1338,10 @@ is_dimorphic = initial(is_dimorphic) should_draw_greyscale = initial(should_draw_greyscale) - if(owner) - owner.update_body_parts() - else + if(!owner) update_icon_dropped() + else if(!(owner.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) + owner.update_body_parts() // Note: For effects on subtypes, use the emp_effect() proc instead /obj/item/bodypart/emp_act(severity) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index afb48b0b78b20..83cb919039ecc 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -121,7 +121,6 @@ update_icon_dropped() phantom_owner.update_health_hud() //update the healthdoll phantom_owner.update_body() - phantom_owner.update_body_parts() if(!special) phantom_owner.hud_used?.update_locked_slots() diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index 47fab7cfc1914..c5cc96c31377f 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -80,13 +80,7 @@ /obj/item/bodypart/leg/left/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) . = ..() - var/old_id = limb_id limb_id = owner?.is_digitigrade_squished() ? SPECIES_LIZARD : BODYPART_ID_DIGITIGRADE - if(old_id != limb_id) - // Something unsquished / squished us so we need to go through and update everything that is affected - for(var/obj/item/thing as anything in owner?.get_equipped_items()) - if(thing.supports_variations_flags & DIGITIGRADE_VARIATIONS) - thing.update_slot_icon() /obj/item/bodypart/leg/right/digitigrade icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' @@ -97,10 +91,4 @@ /obj/item/bodypart/leg/right/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) . = ..() - var/old_id = limb_id limb_id = owner?.is_digitigrade_squished() ? SPECIES_LIZARD : BODYPART_ID_DIGITIGRADE - if(old_id != limb_id) - // Something unsquished / squished us so we need to go through and update everything that is affected - for(var/obj/item/thing as anything in owner?.get_equipped_items()) - if(thing.supports_variations_flags & DIGITIGRADE_VARIATIONS) - thing.update_slot_icon() diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index c829613a2c124..024756b6e098a 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -83,11 +83,10 @@ Unlike normal organs, we're actually inside a persons limbs at all times bodypart_overlay.set_appearance(typed_accessory) - if(owner) //are we in a person? - owner.update_body_parts() - else if(bodypart_owner) //are we in a limb? + if(bodypart_owner) //are we in a limb? bodypart_owner.update_icon_dropped() - //else if(use_mob_sprite_as_obj_sprite) //are we out in the world, unprotected by flesh? + else if(owner && !(owner.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) //are we a person? + owner.update_body_parts() /obj/item/organ/update_overlays() . = ..() diff --git a/code/modules/surgery/organs/internal/appendix/_appendix.dm b/code/modules/surgery/organs/internal/appendix/_appendix.dm index 795871c7ccd5d..420d4efc1185c 100644 --- a/code/modules/surgery/organs/internal/appendix/_appendix.dm +++ b/code/modules/surgery/organs/internal/appendix/_appendix.dm @@ -37,7 +37,7 @@ owner.adjustToxLoss(2 * seconds_per_tick, forced = TRUE) else if(inflamation_stage) inflamation(seconds_per_tick) - else if(SPT_PROB(APPENDICITIS_PROB, seconds_per_tick)) + else if(SPT_PROB(APPENDICITIS_PROB, seconds_per_tick) && !HAS_TRAIT(owner, TRAIT_TEMPORARY_BODY)) become_inflamed() /obj/item/organ/internal/appendix/proc/become_inflamed() diff --git a/code/modules/surgery/organs/organ_movement.dm b/code/modules/surgery/organs/organ_movement.dm index 63987b148935e..5d9e9b36f467e 100644 --- a/code/modules/surgery/organs/organ_movement.dm +++ b/code/modules/surgery/organs/organ_movement.dm @@ -18,7 +18,7 @@ mob_insert(receiver, special, movement_flags) bodypart_insert(limb_owner = receiver, movement_flags = movement_flags) - if(!special) + if(!special && !(receiver.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) receiver.update_body_parts() /* @@ -33,7 +33,7 @@ mob_remove(organ_owner, special, movement_flags) bodypart_remove(limb_owner = organ_owner, movement_flags = movement_flags) - if(!special) + if(!special && !(organ_owner.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) organ_owner.update_body_parts() /* diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 6bdb9959f605f..46461a23a3d6a 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -240,6 +240,7 @@ #include "say.dm" #include "screenshot_antag_icons.dm" #include "screenshot_basic.dm" +#include "screenshot_digi.dm" #include "screenshot_dynamic_human_icons.dm" #include "screenshot_high_luminosity_eyes.dm" #include "screenshot_humanoids.dm" diff --git a/code/modules/unit_tests/fish_unit_tests.dm b/code/modules/unit_tests/fish_unit_tests.dm index 1bda9875c2648..8ed2b999e7ffb 100644 --- a/code/modules/unit_tests/fish_unit_tests.dm +++ b/code/modules/unit_tests/fish_unit_tests.dm @@ -360,7 +360,7 @@ /obj/structure/aquarium/crab/Initialize(mapload) . = ..() crabbie = new(src) - crabbie.name = "Crabbie" + crabbie.AddComponent(/datum/component/rename, "Crabbie", crabbie.desc) crabbie.last_feeding = world.time crabbie.AddComponent(/datum/component/fish_growth, crabbie.lob_type, 1 SECONDS) diff --git a/code/modules/unit_tests/screenshot_digi.dm b/code/modules/unit_tests/screenshot_digi.dm new file mode 100644 index 0000000000000..835b2501c87a6 --- /dev/null +++ b/code/modules/unit_tests/screenshot_digi.dm @@ -0,0 +1,75 @@ +/// Ensures digitigrade legs and clothing are displayed correctly in screenshots +/datum/unit_test/screenshot_digi + +/datum/unit_test/screenshot_digi/Run() + var/icon/finished_icon = icon('icons/effects/effects.dmi', "nothing") + var/mob/living/carbon/human/consistent/dummy = allocate(__IMPLIED_TYPE__) + + // screenshot test of just plain digitigrade legs. + // doubles as coverage that ashwalkers spawn with digitigrade legs (as they should be forced to do) + dummy.set_species(/datum/species/lizard/ashwalker) + TEST_ASSERT((dummy.bodyshape & BODYSHAPE_DIGITIGRADE), "Dummy (Ashwalker) should be digitigrade!") + finished_icon = icon(finished_icon) + finished_icon.Insert(getFlatIcon(dummy, no_anim = TRUE), dir = SOUTH, frame = 1) + + // screenshot test of an assistant outfit + // covers digitigrade autogen'd legs + dummy.equipOutfit(/datum/outfit/job/assistant/consistent) + TEST_ASSERT(isclothing(dummy.w_uniform), "Dummy (Ashwalker) should be wearing a jumpsuit!") + finished_icon = icon(finished_icon) + finished_icon.Insert(getFlatIcon(dummy, no_anim = TRUE), dir = SOUTH, frame = 2) + + // screenshot test of an EVA suit + // should hide the autogen'd legs + var/obj/item/clothing/suit/space/eva/suit = allocate(__IMPLIED_TYPE__) + dummy.equip_to_appropriate_slot(suit) + TEST_ASSERT_EQUAL(dummy.wear_suit, suit, "Dummy (Ashwalker) should be wearing the EVA suit!") + finished_icon = icon(finished_icon) + finished_icon.Insert(getFlatIcon(dummy, no_anim = TRUE), dir = SOUTH, frame = 3) + + // screenshot test of holding an EVA suit + // should show the autogen'd legs once more + suit.attempt_pickup(dummy, skip_grav = TRUE) + TEST_ASSERT((suit in dummy.held_items), "Dummy (Ashwalker) should be holding the EVA suit!") + finished_icon = icon(finished_icon) + finished_icon.Insert(getFlatIcon(dummy, no_anim = TRUE), dir = SOUTH, frame = 4) + + // screenshot of turning the ashwalker into a human + // this should correctly update the auto gen sprites and leg sprites + dummy.set_species(/datum/species/human) + TEST_ASSERT(!(dummy.bodyshape & BODYSHAPE_DIGITIGRADE), "Dummy (Human) should be not digitigrade!") + finished_icon = icon(finished_icon) + finished_icon.Insert(getFlatIcon(dummy, no_anim = TRUE), dir = SOUTH, frame = 5) + + // screenshot test of turning the human back into an ashwalker + // this should correctly update the auto gen sprites and leg sprites again + dummy.set_species(/datum/species/lizard/ashwalker) + TEST_ASSERT((dummy.bodyshape & BODYSHAPE_DIGITIGRADE), "Dummy (Ashwalker) should be digitigrade again!") + finished_icon = icon(finished_icon) + finished_icon.Insert(getFlatIcon(dummy, no_anim = TRUE), dir = SOUTH, frame = 6) + + + // screenshot test of putting the EVA suit back on. + // you'd think this is unnecessary but this is here to cover a bug where the suit works the first equip, but not the second + dummy.temporarilyRemoveItemFromInventory(suit) + dummy.equip_to_appropriate_slot(suit) + TEST_ASSERT_EQUAL(dummy.wear_suit, suit, "Dummy (Ashwalker) should be wearing the EVA suit again!") + finished_icon = icon(finished_icon) + finished_icon.Insert(getFlatIcon(dummy, no_anim = TRUE), dir = SOUTH, frame = 7) + + // screenshot test of taking the EVA suit off + // should show the autogen'd legs once more + qdel(suit) + TEST_ASSERT_NULL(dummy.wear_suit, "Dummy (Ashwalker) should not be wearing the EVA suit!") + finished_icon = icon(finished_icon) + finished_icon.Insert(getFlatIcon(dummy, no_anim = TRUE), dir = SOUTH, frame = 8) + + // finally, screenshot test of taking jumpsuit (everything) off + // which should test that the autogen legs disappear (here to cover a bug in which it does not disappear) + dummy.delete_equipment() + TEST_ASSERT_EQUAL(length(dummy.get_equipped_items()), 0, "Dummy (Ashwalker) should have no equipment!") + finished_icon = icon(finished_icon) + finished_icon.Insert(getFlatIcon(dummy, no_anim = TRUE), dir = SOUTH, frame = 9) + + // and upload + test_screenshot("leg_test", finished_icon) diff --git a/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png b/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png new file mode 100644 index 0000000000000..1ca452de08946 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png differ diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index 0ec9373249a17..9c0c92edcbfe7 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -18,7 +18,10 @@ /datum/uplink_item/role_restricted/mail_counterfeit_kit name = "GLA Brand Mail Counterfeit Kit" - desc = "A box of five (5) counterfeit devices. Each single-use device can hold one normal sized object, and impersonate an ordinary postal envelope addressed to whoever you choose. Optionally, can be rigged to activate held items - great for if you want to surprise someone with a primed grenade!" + desc = "A box containing five devices capable of counterfeiting NT's mail. Can be used to store items within as an easy means of smuggling contraband. \ + Additionally, you may choose to \"arm\" the item inside, causing the item to be used the moment the mail is opened as if the person had just used it in hand. \ + The most common usage of this feature is with grenades, as it forces the grenade to prime. Bonus points if the grenade is set to instantly detonate. \ + Comes with an integrated micro-computer for configuration purposes." item = /obj/item/storage/box/syndie_kit/mail_counterfeit cost = 2 uplink_item_flags = SYNDIE_TRIPS_CONTRABAND diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm index 40e5df8febdf9..e3402ec3c728f 100644 --- a/code/modules/uplink/uplink_items/stealthy_tools.dm +++ b/code/modules/uplink/uplink_items/stealthy_tools.dm @@ -95,7 +95,10 @@ /datum/uplink_item/stealthy_tools/mail_counterfeit name = "GLA Brand Mail Counterfeit Device" - desc = "Device that actually able to counterfeit NT's mail. This device also able to place a trap inside of mail for malicious actions. Trap will \"activate\" any item inside of mail. Also it might be used for contraband purposes. Integrated micro-computer will give you great configuration optionality for your needs." + desc = "A device capable of counterfeiting NT's mail. Can be used to store items within as an easy means of smuggling contraband. \ + Additionally, you may choose to \"arm\" the item inside, causing the item to be used the moment the mail is opened as if the person had just used it in hand. \ + The most common usage of this feature is with grenades, as it forces the grenade to prime. Bonus points if the grenade is set to instantly detonate. \ + Comes with an integrated micro-computer for configuration purposes." item = /obj/item/storage/mail_counterfeit_device cost = 1 surplus = 30 diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index 6a2fd57821fc1..16db09042b307 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -60,7 +60,10 @@ /obj/vehicle/sealed/car/clowncar/mob_forced_enter(mob/M, silent = FALSE) . = ..() - playsound(src, pick('sound/vehicles/clowncar_load1.ogg', 'sound/vehicles/clowncar_load2.ogg'), 75) + playsound(src, pick( + 'sound/vehicles/clowncar_load1.ogg', + 'sound/vehicles/clowncar_load2.ogg', + ), 75) if(iscarbon(M)) var/mob/living/carbon/forced_mob = M if(forced_mob.has_reagent(/datum/reagent/consumable/ethanol/irishcarbomb)) @@ -143,13 +146,20 @@ carb.Paralyze(4 SECONDS) //I play to make sprites go horizontal hittarget_living.visible_message(span_warning("[src] rams into [hittarget_living] and sucks [hittarget_living.p_them()] up!")) //fuck off shezza this isn't ERP. mob_forced_enter(hittarget_living) - playsound(src, pick('sound/vehicles/clowncar_ram1.ogg', 'sound/vehicles/clowncar_ram2.ogg', 'sound/vehicles/clowncar_ram3.ogg'), 75) + playsound(src, pick( + 'sound/vehicles/clowncar_ram1.ogg', + 'sound/vehicles/clowncar_ram2.ogg', + 'sound/vehicles/clowncar_ram3.ogg', + ), 75) log_combat(src, hittarget_living, "sucked up") return if(!isclosedturf(bumped)) return visible_message(span_warning("[src] rams into [bumped] and crashes!")) - playsound(src, pick('sound/vehicles/clowncar_crash1.ogg', 'sound/vehicles/clowncar_crash2.ogg'), 75) + playsound(src, pick( + 'sound/vehicles/clowncar_crash1.ogg', + 'sound/vehicles/clowncar_crash2.ogg', + ), 75) playsound(src, 'sound/vehicles/clowncar_crashpins.ogg', 75) dump_mobs(TRUE) log_combat(src, bumped, "crashed into", null, "dumping all passengers") @@ -301,7 +311,11 @@ var/mob/living/unlucky_sod = pick(return_controllers_with_flag(VEHICLE_CONTROL_KIDNAPPED)) mob_exit(unlucky_sod, silent = TRUE) flick("clowncar_recoil", src) - playsound(src, pick('sound/vehicles/carcannon1.ogg', 'sound/vehicles/carcannon2.ogg', 'sound/vehicles/carcannon3.ogg'), 75) + playsound(src, pick( + 'sound/vehicles/carcannon1.ogg', + 'sound/vehicles/carcannon2.ogg', + 'sound/vehicles/carcannon3.ogg', + ), 75) unlucky_sod.throw_at(target, 10, 2) log_combat(user, unlucky_sod, "fired", src, "towards [target]") //this doesn't catch if the mob hits something between the car and the target return COMSIG_MOB_CANCEL_CLICKON diff --git a/html/changelogs/AutoChangeLog-pr-87082.yml b/html/changelogs/AutoChangeLog-pr-87082.yml deleted file mode 100644 index 355d06d088038..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87082.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - rscadd: "Added the FOSBURY skillchip, found in hacked toy vendors. This skillchip allows you to bypass the emote cooldown when flipping or spinning. However, if used too often, it will lower the chip's integrity and cause malfunctions." - - rscadd: "Added the Chipped quirk. It allows you to spawn with one base skillchip. (not the one above)" - - rscadd: "Added the Chip Connector quirk. It contains a new implant, the chip connector, which allows you to install and take out skillchips at any time." - - code_imp: "Renamed the organ slots for brain implants and made the connector implant take the CNS slot." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87184.yml b/html/changelogs/AutoChangeLog-pr-87184.yml deleted file mode 100644 index a48f9591b2171..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87184.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Jewelry-x" -delete-after: True -changes: - - bugfix: "fixed mech step sound playing twice diagonally" - - bugfix: "fixed turn sound playing every time you move diagonally, now only plays when the sprite turns" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87189.yml b/html/changelogs/AutoChangeLog-pr-87189.yml new file mode 100644 index 0000000000000..9481e315af8d2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87189.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - sound: "added new scanning sound" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87195.yml b/html/changelogs/AutoChangeLog-pr-87195.yml deleted file mode 100644 index b4bbda75eda00..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87195.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Hardly3D" -delete-after: True -changes: - - spellcheck: "fixes a small error in text when adjusting kitsune masks" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87201.yml b/html/changelogs/AutoChangeLog-pr-87201.yml new file mode 100644 index 0000000000000..03a14d7407a3c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87201.yml @@ -0,0 +1,10 @@ +author: "Ghommie" +delete-after: True +changes: + - map: "Added a premapped fishing portal generator to every map." + - balance: "Lowered the requirements for fish scanning experiment. Swapped the rewards of the second and third experiments." + - balance: "Buffed fishing difficulty modifiers for several items and chairs." + - balance: "Fishing skill now affects completion speed of the minigame more actively." + - balance: "Mild fish infusion tweaks. Crawling is a smidge slower, but healing from showers and drank water is a bit better." + - qol: "Fishing rods and fish cases can now be printed by cargo and science lathes." + - rscadd: "Gills now give the fish puns speech modifier." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87210.yml b/html/changelogs/AutoChangeLog-pr-87210.yml new file mode 100644 index 0000000000000..0e333cddb5d1d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87210.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - sound: "along with the shared emote cooldown, specific emote audio cooldown has returned." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87211.yml b/html/changelogs/AutoChangeLog-pr-87211.yml new file mode 100644 index 0000000000000..3aca8ee1cb4e3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87211.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - code_imp: "organized playsound code a bit" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87225.yml b/html/changelogs/AutoChangeLog-pr-87225.yml new file mode 100644 index 0000000000000..f274f535fc44d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87225.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Bronze chairs will automatically spin once more" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87243.yml b/html/changelogs/AutoChangeLog-pr-87243.yml new file mode 100644 index 0000000000000..366eaca366762 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87243.yml @@ -0,0 +1,4 @@ +author: "Pickle-Coding" +delete-after: True +changes: + - bugfix: "Fixes canisters and portable pumps from not considering decimals when transferring input to setting release pressure." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87244.yml b/html/changelogs/AutoChangeLog-pr-87244.yml new file mode 100644 index 0000000000000..48ae3f6f59b70 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87244.yml @@ -0,0 +1,7 @@ +author: "mc-oofert" +delete-after: True +changes: + - bugfix: "input output overlays for manufacturing machines actually update properly when rotated" + - qol: "you may dump materials of a manulathe via CTRL SHIFT LMB" + - balance: "manulathes may not receive ore (not intentional)" + - balance: "manulathes now use a matter bin in their construction, which now affects their material holding capacity: 50 sheets per tier" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87247.yml b/html/changelogs/AutoChangeLog-pr-87247.yml new file mode 100644 index 0000000000000..48873ff33dc16 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87247.yml @@ -0,0 +1,4 @@ +author: "mc-oofert" +delete-after: True +changes: + - code_imp: "Movement Subsystem no longer is a background subsystem. This means that you should no longer get stuck after slipping on oil during instances of high usage." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87249.yml b/html/changelogs/AutoChangeLog-pr-87249.yml new file mode 100644 index 0000000000000..799b711b9a25b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87249.yml @@ -0,0 +1,4 @@ +author: "san7890" +delete-after: True +changes: + - admin: "Logging of Bombanana Peel explosions should be far better now." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87250.yml b/html/changelogs/AutoChangeLog-pr-87250.yml new file mode 100644 index 0000000000000..9a5d347bf7579 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87250.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - bugfix: "Portable SMESes should no longer turn invisible when unscrewed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87251.yml b/html/changelogs/AutoChangeLog-pr-87251.yml new file mode 100644 index 0000000000000..9e17d2c2330e5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87251.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Hotswapping tanks in pumps and scrubbers now properly plays both sounds instead of runtiming" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87252.yml b/html/changelogs/AutoChangeLog-pr-87252.yml new file mode 100644 index 0000000000000..23fb105d46c89 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87252.yml @@ -0,0 +1,4 @@ +author: "r3dj4ck0424" +delete-after: True +changes: + - rscadd: "Nanotrasen High Command is pleased to announce that retool kits, for giving your protokinetic crushers a fancy new look, are now available at the mining vendor! The company reminds staff that rumors of a similarly-functioning lavaland trinket are to be ignored." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87254.yml b/html/changelogs/AutoChangeLog-pr-87254.yml new file mode 100644 index 0000000000000..4464e914dc7ca --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87254.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - bugfix: "Fixed digitigrade pants sprite not updating in accordance to some leg updates" \ No newline at end of file diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml index b5715ad4ffff7..f8cb6b9311d6a 100644 --- a/html/changelogs/archive/2024-10.yml +++ b/html/changelogs/archive/2024-10.yml @@ -392,3 +392,100 @@ - code_imp: cleaned up laser tag helmet code a bit - sound: gas analyzer now has handling sounds - qol: offering an item displays a balloon alert +2024-10-15: + Hardly3D: + - spellcheck: fixes a small error in text when adjusting kitsune masks + Jewelry-x: + - bugfix: fixed mech step sound playing twice diagonally + - bugfix: fixed turn sound playing every time you move diagonally, now only plays + when the sprite turns + ZephyrTFA: + - qol: map votes are now winner take all instead of weighted. + carlarctg: + - rscadd: Added the FOSBURY skillchip, found in hacked toy vendors. This skillchip + allows you to bypass the emote cooldown when flipping or spinning. However, + if used too often, it will lower the chip's integrity and cause malfunctions. + - rscadd: Added the Chipped quirk. It allows you to spawn with one base skillchip. + (not the one above) + - rscadd: Added the Chip Connector quirk. It contains a new implant, the chip connector, + which allows you to install and take out skillchips at any time. + - code_imp: Renamed the organ slots for brain implants and made the connector implant + take the CNS slot. + grungussuss: + - sound: medical, jani, soulstone, grenade belts got sounds + - sound: cards have new handling sounds +2024-10-16: + Ben10Omintrix: + - code_imp: animals' food hunting behavior has been refactored, please report any + bugs + DATA-xPUNGED: + - bugfix: ACTUALLY fixes server hop fade in + Ghommie: + - bugfix: Fixed gills not managing to breathe water vapor through internals. + - bugfix: Fixed some inconsistencies with examining fishing spots with the appropriate + level and fishing rod. + GremlinSeeker: + - map: New Icebox Ruin "Syndicate Biodome" added. + Mamaii: + - rscadd: shower will give felinids negative mood effect + - bugfix: fixed shower hater status effect alert not showing + Melbert: + - balance: Cyborgs are now slowed down when hit with any melee weapons, rather than + ONLY when they are hit by THROWN melee weapons. The stronger the weapon, the + stronger the slowdown. Thrown weapons are still more effective at slowing than + just hitting them directly, however. + SmArtKar: + - bugfix: Losing hulk after becoming a carp no longer turns you black + Soupfgc: + - bugfix: Springlock MOD module properly interacts with Water Vapor + hyperjll: + - qol: The GLA Brand Mail Counterfeit Device's description has been updated by a + native english speaker and has been made more descriptive. + junkgle01: + - rscadd: the Honkmother has decided to bless Her children with a new form! + - image: resprited the optional clown mask styles + - bugfix: fixed up Metastation's cargo delivery office. + kittysmooch: + - bugfix: 'fixed east facing female human heads having an extra neck pixel + + :cl:' + larentoun: + - spellcheck: Correct message is shown when YOU get devoured by an alien + - spellcheck: Fixed a few typos on some simple attack verbs being continuous + mc-oofert: + - bugfix: you may no longer roll appendicitis in deathmatch or as a bitrunner avatar + ninjanomnom: + - bugfix: Byond membership lookup should now warn you when it fails due to a connection + failure. + vinylspiders: + - bugfix: fixes a bunch of improper static list declarations +2024-10-17: + EnterTheJake: + - balance: Sundered Blades now require 1 Titanium or Silver bar to craft and their + capacity has been reduced to 4. + - balance: Realignment pulls you out of stuns a bit faster and grants baton resist + while active. + - balance: Blade Heretic dual wielding now let's you infuse Your Dark Blades with + a weaker mansus grasp and grants an increase in demolition modifier. + - bugfix: Malestrom of Silver grants the ring of protective blades once again. + - balance: Mawed Crucible requires 3 organs to brew one potion, passively refills + overtime and can be used to refill the Eldritch Flask + - balance: Brew of Crucible soul effect bumped to 40 seconds and can be ended early. + - balance: Brew Of Dusk and Dawn effect bumped to 3 minutes. + - balance: Brew of the wounded soldier now offers a very minor passive heal and + fully heals your wounds and limbs upon expiring. + - balance: Cursed Curio shield now recharges faster. + - balance: Lionhunter's rifle has been reworked, it now fits on the eldritch robes + vest slots, it's cheaper to craft it and its ammunition and works as an initiation + tool. + SmArtKar: + - bugfix: Chainsaws can now be sharpened + - code_imp: Chainsaws have received a minor code refactor + Xackii: + - rscadd: Manipulator now shows what objects he is dragging. + - rscadd: Manipulator now can take more then just items. + - rscadd: 'Manipulator now have 3 modes to choice: drop/use/throw.' + - rscadd: Manipulator now have priorities. + - rscadd: Manipulator now can be emaged. + Y0SH1M4S73R: + - bugfix: Syndicate Sleeper Agents can once again forge custom objectives diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 117511dd8741e..89e01e574afb2 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/human/bodyparts_greyscale.dmi b/icons/mob/human/bodyparts_greyscale.dmi index b87182b258b44..1fa4f751b3b0f 100644 Binary files a/icons/mob/human/bodyparts_greyscale.dmi and b/icons/mob/human/bodyparts_greyscale.dmi differ diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index 4ef1c071abfa2..e5dc62260453a 100644 Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi index 5d087c0b36f9c..5f153cece749c 100644 Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/hammers_lefthand.dmi b/icons/mob/inhands/weapons/hammers_lefthand.dmi index 5856bd8b0f834..d065edd86e75a 100644 Binary files a/icons/mob/inhands/weapons/hammers_lefthand.dmi and b/icons/mob/inhands/weapons/hammers_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/hammers_righthand.dmi b/icons/mob/inhands/weapons/hammers_righthand.dmi index c6e8a0215ea3b..022b281e4626a 100644 Binary files a/icons/mob/inhands/weapons/hammers_righthand.dmi and b/icons/mob/inhands/weapons/hammers_righthand.dmi differ diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi index e3aaa8f3bdca3..174a6a3e7bbcd 100644 Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 595893177355b..62c1fa687406b 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/machines/engine/other.dmi b/icons/obj/machines/engine/other.dmi index 7fb5ac6e7656d..15390eb537c83 100644 Binary files a/icons/obj/machines/engine/other.dmi and b/icons/obj/machines/engine/other.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 991762dba3d59..48d01c3371bb6 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/weapons/chainsaw.dmi b/icons/obj/weapons/chainsaw.dmi index 1d48b63e45949..b2a0385e70b6f 100644 Binary files a/icons/obj/weapons/chainsaw.dmi and b/icons/obj/weapons/chainsaw.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index 911ef3e44e425..d3ecd385a7094 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/icons/obj/weapons/khopesh.dmi b/icons/obj/weapons/khopesh.dmi index 7c0d54a7140b9..20b084396aa6d 100644 Binary files a/icons/obj/weapons/khopesh.dmi and b/icons/obj/weapons/khopesh.dmi differ diff --git a/sound/effects/industrial_scan/attribution.txt b/sound/effects/industrial_scan/attribution.txt new file mode 100644 index 0000000000000..9ee878d75bfc4 --- /dev/null +++ b/sound/effects/industrial_scan/attribution.txt @@ -0,0 +1,2 @@ +industrial scan: +SOUND - Radio Interference - During COVID-19 Quarantine by bolkmar -- https://freesound.org/s/511890/ -- License: Creative Commons 0 \ No newline at end of file diff --git a/sound/effects/industrial_scan/industrial_scan1.ogg b/sound/effects/industrial_scan/industrial_scan1.ogg new file mode 100644 index 0000000000000..709c322e0590b Binary files /dev/null and b/sound/effects/industrial_scan/industrial_scan1.ogg differ diff --git a/sound/effects/industrial_scan/industrial_scan2.ogg b/sound/effects/industrial_scan/industrial_scan2.ogg new file mode 100644 index 0000000000000..2afca612c061b Binary files /dev/null and b/sound/effects/industrial_scan/industrial_scan2.ogg differ diff --git a/sound/effects/industrial_scan/industrial_scan3.ogg b/sound/effects/industrial_scan/industrial_scan3.ogg new file mode 100644 index 0000000000000..a403b267ce6ee Binary files /dev/null and b/sound/effects/industrial_scan/industrial_scan3.ogg differ diff --git a/sound/items/handling/id_card/attribution.txt b/sound/items/handling/id_card/attribution.txt new file mode 100644 index 0000000000000..1bb71cf8f7ee1 --- /dev/null +++ b/sound/items/handling/id_card/attribution.txt @@ -0,0 +1,2 @@ +id_card handling sounds made by sadboysuss +license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/handling/id_card/id_card_drop1.ogg b/sound/items/handling/id_card/id_card_drop1.ogg new file mode 100644 index 0000000000000..81cfbb50e435c Binary files /dev/null and b/sound/items/handling/id_card/id_card_drop1.ogg differ diff --git a/sound/items/handling/id_card/id_card_pickup1.ogg b/sound/items/handling/id_card/id_card_pickup1.ogg new file mode 100644 index 0000000000000..cbd01a1189f5a Binary files /dev/null and b/sound/items/handling/id_card/id_card_pickup1.ogg differ diff --git a/tgstation.dme b/tgstation.dme index b4b590350a0e8..b06d6b5bc1b79 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -903,6 +903,7 @@ #include "code\datums\ai\basic_mobs\basic_ai_behaviors\climb_tree.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\emote_with_target.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\find_parent.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\interact_with_target.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\nearest_targeting.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\pick_up_item.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\pull_target.dm" diff --git a/tgui/packages/tgui/interfaces/BigManipulator.tsx b/tgui/packages/tgui/interfaces/BigManipulator.tsx index 6a5501b566472..c1419daa3bdeb 100644 --- a/tgui/packages/tgui/interfaces/BigManipulator.tsx +++ b/tgui/packages/tgui/interfaces/BigManipulator.tsx @@ -1,29 +1,123 @@ import { BooleanLike } from 'common/react'; import { useBackend } from '../backend'; -import { Button, Section, Stack } from '../components'; +import { Button, Section, Stack, Table } from '../components'; import { Window } from '../layouts'; type ManipulatorData = { active: BooleanLike; + drop_after_use: BooleanLike; + highest_priority: BooleanLike; + manipulate_mode: string; + settings_list: PrioritySettings[]; + throw_range: number; + item_as_filter: string; + selected_type: string; +}; + +type PrioritySettings = { + name: string; + priority_width: number; }; export const BigManipulator = (props) => { const { data, act } = useBackend(); - const { active } = data; + const { + active, + manipulate_mode, + settings_list, + drop_after_use, + highest_priority, + throw_range, + item_as_filter, + selected_type, + } = data; return ( - + -
- +
act('on')} /> - + } + > + +
+ {settings_list.length >= 2 && ( +
+ {settings_list.length >= 2 && ( +
+ )} ); diff --git a/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx b/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx index d67dd37391e3e..2b9dfb98f4499 100644 --- a/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx +++ b/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx @@ -70,8 +70,6 @@ export const ranks: Rank[] = [ }, ]; -export const dangerDefault = 50 * 600; - let lastMinutesThan = -1; export const dangerLevelsTooltip = ( diff --git a/tgui/packages/tgui/interfaces/Uplink/index.tsx b/tgui/packages/tgui/interfaces/Uplink/index.tsx index 3ed7d34a214ec..124d6f3d5050e 100644 --- a/tgui/packages/tgui/interfaces/Uplink/index.tsx +++ b/tgui/packages/tgui/interfaces/Uplink/index.tsx @@ -18,7 +18,6 @@ import { Window } from '../../layouts'; import { calculateDangerLevel, calculateProgression, - dangerDefault, dangerLevelsTooltip, } from './calculateDangerLevel'; import { GenericUplink, Item } from './GenericUplink'; @@ -285,101 +284,93 @@ export class Uplink extends Component<{}, UplinkState> { - {!!has_progression && ( - -
- + +
+ + {!!has_progression && ( - - Your current level of threat. Threat - determines - {has_objectives - ? ' the severity of secondary objectives you get and ' - : ' '} - what items you can purchase.  + Your current level of threat. Threat + determines + {has_objectives + ? ' the severity of secondary objectives you get and ' + : ' '} + what items you can purchase.  + + {/* A minute in deciseconds */} + Threat passively increases by{' '} + + {calculateProgression( + current_progression_scaling, + )} + +  every minute + + {Math.abs(progressionPercentage) > 0 && ( - {/* A minute in deciseconds */} - Threat passively increases by{' '} - - {calculateProgression( - current_progression_scaling, - )} + Because your threat level is + {progressionPercentage < 0 + ? ' ahead ' + : ' behind '} + of where it should be, you are getting + + {progressionPercentage}% -  every minute + {progressionPercentage < 0 ? 'less' : 'more'}{' '} + threat every minute - {Math.abs(progressionPercentage) > 0 && ( - - Because your threat level is - {progressionPercentage < 0 - ? ' ahead ' - : ' behind '} - of where it should be, you are getting - - {progressionPercentage}% - - {progressionPercentage < 0 - ? 'less' - : 'more'}{' '} - threat every minute - - )} - {dangerLevelsTooltip} - + )} + {dangerLevelsTooltip} - )) || - "Your current threat level. You are a killing machine and don't need to improve your threat level." + } > - {/* If we have no progression, - just give them a generic title */} - {has_progression - ? calculateDangerLevel(progression_points, false) - : calculateDangerLevel(dangerDefault, false)} + {calculateDangerLevel(progression_points, false)} - + )} + {(primary_objectives || has_objectives) && ( + {primary_objectives && ( + this.setState({ currentTab: 0 })} + > + Primary Objectives + + )} {!!has_objectives && ( - <> - this.setState({ currentTab: 0 })} - > - Primary Objectives - - this.setState({ currentTab: 1 })} - > - Secondary Objectives - - + this.setState({ currentTab: 1 })} + > + Secondary Objectives + )} { textOverflow: 'ellipsis', }} icon="store" - selected={currentTab === 2 || !has_objectives} + selected={currentTab === 2} onClick={() => this.setState({ currentTab: 2 })} > Market + )} - {!!lockable && ( - - - - )} - -
-
- )} + {!!lockable && ( + + + + )} +
+
+
- {(currentTab === 0 && has_objectives && ( + {(currentTab === 0 && primary_objectives && (