diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 7de6e7d990082d..6ceb38619a4c56 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -278,7 +278,7 @@ dir = 4 }, /turf/open/floor/iron{ - icon = 'icons/misc/beach.dmi'; + icon = 'icons/obj/fluff/beach.dmi'; icon_state = "sand" }, /area/ruin/powered/beach) @@ -479,7 +479,7 @@ }, /obj/effect/turf_decal/sand, /turf/open/floor/iron{ - icon = 'icons/misc/beach.dmi'; + icon = 'icons/obj/fluff/beach.dmi'; icon_state = "sand" }, /area/ruin/powered/beach) diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index 7ed902651a5269..a7096750a19754 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -1147,7 +1147,7 @@ /turf/open/indestructible/binary{ density = 1; desc = "No, I am not going through this."; - icon = 'icons/misc/beach.dmi'; + icon = 'icons/obj/fluff/beach.dmi'; icon_state = "water"; name = "dirty water" }, diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 18925cfd927a05..26556306fd53ca 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -5990,6 +5990,19 @@ dir = 5 }, /area/station/maintenance/port/aft) +"bLa" = ( +/obj/structure/bed, +/obj/machinery/airalarm/directional/north, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/button/door/directional/east{ + id = "Dorm1"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "bLc" = ( /turf/open/floor/iron/dark/textured_edge{ dir = 1 @@ -49673,7 +49686,7 @@ /area/station/hallway/primary/central) "oTh" = ( /obj/machinery/door/airlock{ - id_tag = "Dorm2"; + id_tag = "Dorm1"; name = "Dorm 1" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -242567,7 +242580,7 @@ ygB mJO oCF ygB -mJO +bLa oCF ygB lBD diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 606e8de016c39f..e72b578eb3b71e 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -91,14 +91,6 @@ /turf/open/floor/iron/smooth, /area/station/cargo/sorting) "aaU" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "aaV" = ( @@ -360,15 +352,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/bar) -"ael" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "aeu" = ( /obj/machinery/power/terminal{ dir = 1 @@ -992,7 +975,12 @@ /turf/open/floor/plating, /area/station/construction/mining/aux_base) "amM" = ( -/obj/machinery/light/floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/siding/blue, +/obj/machinery/medical_kiosk, +/obj/effect/turf_decal/delivery, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "anb" = ( @@ -1428,10 +1416,18 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) "ask" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating, -/area/station/medical/medbay/lobby) +/obj/machinery/camera/directional/north{ + c_tag = "Medbay - Treatment Center"; + name = "medbay camera"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "asl" = ( /obj/machinery/door/window/left/directional/west{ name = "Cargo Conveyor Access"; @@ -2449,17 +2445,17 @@ /area/station/command/meeting_room) "aGr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing{ - dir = 1 +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/reinforced/rglass, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 3 }, -/obj/structure/chair/sofa/bench/solo, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +/obj/item/clothing/glasses/hud/health{ + pixel_y = 6 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "aGw" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2578,11 +2574,9 @@ /turf/open/floor/plating, /area/station/security/prison/work) "aHK" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/table/glass, -/obj/item/bonesetter, -/obj/item/stack/medical/bone_gel, -/turf/open/floor/iron/white/textured, +/obj/machinery/light/directional/east, +/obj/structure/closet/secure_closet/medical2, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "aHM" = ( /obj/effect/turf_decal/bot, @@ -3261,11 +3255,11 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) "aRz" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +/obj/effect/turf_decal/bot_white{ + color = "#74b2d3" }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) @@ -3423,18 +3417,11 @@ /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) "aTc" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, +/obj/effect/turf_decal/siding/white, +/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) +/turf/open/floor/iron/dark/textured, +/area/station/medical/paramedic) "aTh" = ( /obj/structure/chair/office{ dir = 8 @@ -3947,6 +3934,7 @@ "aYB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/light/small/directional/north, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "aYJ" = ( @@ -4068,6 +4056,9 @@ }, /turf/open/space/openspace, /area/space/nearstation) +"aZW" = ( +/turf/closed/wall, +/area/station/medical/treatment_center) "aZX" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/side{ @@ -4374,18 +4365,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/toilet) -"bez" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "beB" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -5125,10 +5104,8 @@ /turf/open/floor/wood/tile, /area/station/service/library) "blH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/blue, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "blI" = ( @@ -5301,12 +5278,11 @@ /turf/open/floor/iron, /area/station/hallway/floor1/aft) "bnC" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/effect/turf_decal/tile/blue/full, -/obj/structure/table/glass, -/obj/item/storage/belt/medical, -/obj/item/clothing/glasses/hud/health, -/turf/open/floor/iron/white/textured, +/obj/structure/bed/medical/anchored{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "bnI" = ( /obj/structure/table/reinforced, @@ -5934,16 +5910,12 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) "buR" = ( -/obj/structure/railing, -/obj/structure/chair/sofa/bench/solo{ +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/chair{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "bvc" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -6120,10 +6092,10 @@ /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) "bwE" = ( +/obj/structure/sign/poster/official/random/directional/east, /obj/machinery/cryo_cell{ dir = 8 }, -/obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "bwF" = ( @@ -6528,11 +6500,32 @@ /turf/open/floor/iron, /area/station/cargo/miningdock) "bCd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/chem_pack{ + pixel_x = -4; + pixel_y = 2 }, -/turf/open/floor/iron/white, +/obj/item/reagent_containers/chem_pack{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/reagent_containers/chem_pack{ + pixel_y = 3 + }, +/obj/item/clothing/neck/stethoscope{ + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/bottle{ + pixel_x = -2 + }, +/obj/item/reagent_containers/cup/bottle{ + pixel_x = 2 + }, +/obj/effect/turf_decal/bot_white{ + color = "#74b2d3" + }, +/turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "bCk" = ( /obj/structure/rack, @@ -7252,14 +7245,6 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/smooth, /area/station/construction) -"bND" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "bNL" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -8022,11 +8007,10 @@ /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) "bYb" = ( -/obj/effect/turf_decal/tile/blue/full, /obj/structure/table/glass, -/obj/item/storage/box/hug/medical, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/white/textured, +/obj/item/stack/medical/gauze, +/obj/machinery/defibrillator_mount/directional/east, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "bYg" = ( /obj/effect/turf_decal/trimline/blue, @@ -8875,7 +8859,8 @@ }, /area/station/command/teleporter) "cix" = ( -/obj/machinery/restaurant_portal/restaurant, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/kitchen/diner) "ciz" = ( @@ -9365,12 +9350,8 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/ce) "coZ" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/defibrillator_mount/directional/south, -/obj/structure/bed/medical{ - dir = 8 - }, -/turf/open/floor/iron/white/textured, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "cpa" = ( /obj/structure/table/wood, @@ -9670,12 +9651,19 @@ /turf/open/floor/wood, /area/station/service/bar) "csR" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +/obj/effect/turf_decal/siding/blue{ + dir = 4; + pixel_x = -15 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay - Treatment Center"; + name = "medbay camera"; + network = list("ss13","medbay"); + dir = 2 }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "csT" = ( @@ -10009,18 +9997,15 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) "cwz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 9 }, /obj/machinery/duct, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, /turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/area/station/medical/treatment_center) "cwD" = ( /obj/machinery/newscaster/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12100,22 +12085,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/escape_pod) -"cZm" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/machinery/duct, -/obj/machinery/door/airlock/medical/glass{ - name = "Treatment Center" - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "cZA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -12142,14 +12111,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"cZI" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/firealarm/directional/west, -/obj/structure/sink/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "cZK" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -12583,9 +12544,16 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard) "dfB" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/window/preopen{ + dir = 1; + name = "Medbay Lockdown Shutters"; + id = "med_lockdown" + }, +/turf/open/floor/plating, /area/station/medical/medbay/lobby) "dfP" = ( /obj/structure/chair{ @@ -12620,13 +12588,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) -"dgm" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "dgp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -13802,21 +13763,13 @@ /turf/open/misc/dirt/jungle, /area/station/science/cytology) "dyG" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"dyP" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/table/glass, -/obj/item/reagent_containers/hypospray/medipen, -/obj/item/reagent_containers/hypospray/medipen, -/obj/item/reagent_containers/hypospray/medipen, -/obj/item/reagent_containers/hypospray/medipen, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/sign/departments/medbay/alt/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "dyQ" = ( /obj/structure/railing/corner{ dir = 8 @@ -13912,12 +13865,8 @@ /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "dzM" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "dzQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -15406,11 +15355,13 @@ /obj/effect/turf_decal/siding/white{ dir = 4 }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, /obj/machinery/button/door/directional/south{ - id = "med_doors"; - name = "Medbay Door Control"; - normaldoorcontrol = 1; - req_access = list("medical") + name = "Medbay Lockdown Shutters"; + id = "med_lockdown" }, /turf/open/floor/iron/dark/textured, /area/station/medical/paramedic) @@ -15699,15 +15650,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"dWZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "dXc" = ( /obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, @@ -15732,10 +15674,15 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) "dXy" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/structure/closet/secure_closet/medical1, -/obj/structure/sign/poster/official/random/directional/east, -/turf/open/floor/iron/white/textured, +/obj/structure/table/glass, +/obj/machinery/defibrillator_mount/directional/east, +/obj/item/storage/box/syringes{ + pixel_y = 6 + }, +/obj/item/stack/medical/mesh{ + layer = 3.01 + }, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "dXz" = ( /obj/effect/decal/cleanable/dirt, @@ -15815,9 +15762,16 @@ }, /area/station/hallway/secondary/exit/escape_pod) "dYM" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/reinforced/rglass, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical{ + pixel_y = 6 + }, +/obj/item/storage/belt/medical{ + pixel_y = 12 + }, +/turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "dYX" = ( /obj/structure/reagent_dispensers/fueltank, @@ -16041,14 +15995,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"ecK" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/iv_drip, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "ecN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16452,7 +16398,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) "ehQ" = ( @@ -18066,21 +18011,17 @@ /turf/open/floor/iron/dark/corner, /area/station/service/lawoffice) "eEZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ +/obj/effect/decal/cleanable/cobweb, +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, +/obj/machinery/button/door/directional/west{ + id = "med_lockdown"; + name = "Medbay Lockdown Shutters"; + req_access = list("medical") + }, /turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/area/station/medical/treatment_center) "eFc" = ( /obj/effect/turf_decal/stripes{ dir = 1 @@ -19698,6 +19639,13 @@ "ffe" = ( /turf/closed/wall/r_wall, /area/station/security/holding_cell) +"ffh" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "ffi" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 4 @@ -20573,10 +20521,15 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) "fqn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white{ + color = "#74b2d3" }, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "fqo" = ( @@ -20809,17 +20762,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/hallway/floor3/aft) -"ftD" = ( -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/firedoor, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark/textured, -/area/station/medical/medbay/lobby) "ftJ" = ( /obj/structure/chair{ dir = 4 @@ -21457,15 +21399,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/security/range) -"fDL" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "fDM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -21514,14 +21447,10 @@ /turf/open/floor/iron/white/textured, /area/station/medical/break_room) "fEj" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/turf/open/floor/iron/white, +/turf/closed/wall, /area/station/medical/treatment_center) "fEn" = ( /obj/machinery/light/small/directional/south, @@ -23368,9 +23297,13 @@ /turf/open/floor/iron, /area/station/cargo/warehouse) "gcm" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/reinforced/rglass, +/obj/item/pai_card, +/obj/item/reagent_containers/spray/cleaner{ + layer = 3.01 + }, +/turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "gcs" = ( /obj/machinery/power/apc/auto_name/directional/south, @@ -23638,15 +23571,16 @@ /turf/open/floor/iron/checker, /area/station/service/bar/atrium) "ggp" = ( -/obj/structure/table/reinforced, -/obj/structure/barricade/wooden{ - name = "wooden barricade (KEEP OUT)" +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 }, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/station/medical/chemistry) +/obj/effect/turf_decal/siding/yellow{ + dir = 8; + pixel_x = 15 + }, +/obj/structure/chair, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "ggD" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 8 @@ -24408,12 +24342,6 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron, /area/station/science/robotics/lab) -"grm" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "grv" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/side{ @@ -24698,12 +24626,13 @@ /turf/open/floor/catwalk_floor/iron_white, /area/station/medical/abandoned) "gvp" = ( -/obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/door/airlock/public/glass{ - name = "Medbay Lobby" + name = "Medbay" }, -/turf/open/floor/iron/dark/textured, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "gvx" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, @@ -24859,7 +24788,6 @@ /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) "gxi" = ( -/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24924,10 +24852,13 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) "gxX" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/obj/machinery/light/floor, -/turf/open/floor/grass, -/area/station/medical/medbay/lobby) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/chair, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "gyd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -25210,13 +25141,18 @@ }, /area/station/hallway/floor4/fore) "gBV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay - Treatment Center"; + name = "medbay camera"; + network = list("ss13","medbay"); + dir = 2 + }, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 + dir = 9 }, -/obj/machinery/firealarm/directional/south, -/obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/area/station/medical/treatment_center) "gBX" = ( /obj/effect/turf_decal/trimline/blue/corner, /obj/structure/window/spawner/directional/east, @@ -25228,13 +25164,6 @@ dir = 8 }, /area/station/engineering/lobby) -"gBZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "gCv" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -25647,9 +25576,11 @@ /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) "gHO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "gHU" = ( @@ -26297,15 +26228,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"gQE" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/structure/table/glass, -/obj/item/storage/medkit/emergency, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) "gQI" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -26388,12 +26310,6 @@ }, /turf/open/floor/pod/dark, /area/station/service/kitchen/abandoned) -"gRW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "gSd" = ( /obj/effect/baseturf_helper/reinforced_plating/ceiling, /turf/open/floor/engine, @@ -26776,12 +26692,15 @@ /turf/open/floor/iron/dark, /area/station/security/lockers) "gYa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 }, +/obj/effect/turf_decal/siding/blue{ + dir = 4; + pixel_x = -15 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/chair, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "gYb" = ( @@ -28698,20 +28617,10 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "hwV" = ( -/obj/effect/mapping_helpers/airlock/unres, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "med_doors"; - name = "Medbay" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, -/obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/lobby) +/area/station/medical/treatment_center) "hxl" = ( /obj/structure/toilet{ dir = 4 @@ -28882,14 +28791,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/glass/reinforced, /area/station/service/library) -"hzF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "hzI" = ( /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/service) @@ -29047,9 +28948,10 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) "hBe" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "hBw" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron/textured_large, @@ -29477,18 +29379,22 @@ /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "hHe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, /obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Paramedic's Desk"; +/obj/machinery/door/window/right/directional/east{ + name = "First Aid Supplies"; req_access = list("medical") }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/stack/medical/suture, -/obj/item/stack/medical/mesh, +/obj/structure/desk_bell{ + pixel_y = 1; + pixel_x = -5 + }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/medical/medbay/lobby) "hHi" = ( @@ -30075,11 +29981,12 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) "hOX" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 +/obj/effect/turf_decal/siding/yellow{ + dir = 8; + pixel_x = 15 }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) @@ -30296,16 +30203,6 @@ }, /turf/open/floor/wood, /area/station/commons/dorms/apartment2) -"hSs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "hSt" = ( /obj/machinery/status_display/ai/directional/north, /obj/effect/decal/cleanable/blood/old, @@ -30779,12 +30676,13 @@ /turf/open/floor/carpet/red, /area/station/service/theater) "hYk" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "hYm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/brown/filled/line, @@ -31448,11 +31346,17 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "ihL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Hall" + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/general, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "med_lockdown"; + name = "Medbay Lockdown Shutters" + }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "ihQ" = ( @@ -31550,12 +31454,13 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) "ijd" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table/glass, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/turf/open/floor/iron/white/textured, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "ijs" = ( /obj/structure/closet/emcloset, @@ -31748,12 +31653,13 @@ /turf/open/floor/carpet/black, /area/station/hallway/secondary/service) "ilI" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/defibrillator_mount/directional/south, -/obj/structure/bed/medical{ - dir = 4 +/obj/machinery/camera/directional/north{ + c_tag = "Medbay - Treatment Center"; + name = "medbay camera"; + network = list("ss13","medbay"); + dir = 2 }, -/turf/open/floor/iron/white/textured, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "ilK" = ( /obj/structure/railing/corner{ @@ -31919,19 +31825,14 @@ /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) "iog" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, /obj/structure/disposalpipe/segment, /obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "iom" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32879,6 +32780,16 @@ }, /turf/closed/wall, /area/station/maintenance/floor1/starboard/aft) +"iAQ" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white{ + color = "#74b2d3" + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "iAS" = ( /obj/structure/cable, /obj/machinery/power/smes/engineering, @@ -33132,11 +33043,12 @@ /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) "iDr" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +/obj/structure/table/glass, +/obj/machinery/defibrillator_mount/directional/east, +/obj/item/storage/medkit/emergency{ + pixel_y = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/light/small/directional/east, +/obj/item/stack/medical/suture, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "iDw" = ( @@ -34745,16 +34657,6 @@ dir = 1 }, /area/station/hallway/secondary/exit/escape_pod) -"iZO" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/airlock/medical{ - name = "Cryogenics" - }, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, -/obj/machinery/door/firedoor, -/obj/machinery/duct, -/turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) "iZP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, @@ -37320,20 +37222,32 @@ /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) "jIi" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 }, +/obj/effect/turf_decal/siding/blue{ + dir = 4; + pixel_x = -15 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "jIs" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/reinforced/rglass, +/obj/item/storage/box/rxglasses{ + pixel_y = 5 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "jIy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/cable, @@ -37893,10 +37807,9 @@ /area/station/maintenance/floor2/starboard/aft) "jQb" = ( /obj/machinery/door/airlock/medical{ - name = "Ph-rm--y" + name = "Chemical Storage" }, /obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, -/obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, @@ -38132,11 +38045,12 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor2/port) "jTK" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "jTM" = ( @@ -41646,6 +41560,9 @@ "kMv" = ( /obj/machinery/plumbing/receiver, /obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/railing{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) "kMC" = ( @@ -42032,12 +41949,10 @@ /turf/open/floor/iron/white, /area/station/hallway/floor2/fore) "kRM" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 }, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "kRN" = ( @@ -42225,12 +42140,23 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) "kUf" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/storage/box/syringes{ - pixel_y = 4 +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/reinforced/rglass, +/obj/machinery/cell_charger{ + pixel_y = 10 + }, +/obj/machinery/cell_charger{ + pixel_y = 1; + layer = 2.91 + }, +/obj/item/stock_parts/cell/high{ + pixel_y = 9; + pixel_x = -1 + }, +/obj/item/stock_parts/cell/high{ + pixel_x = -1; + layer = 3.01 }, -/obj/structure/table/glass, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "kUh" = ( @@ -42251,10 +42177,9 @@ /turf/open/floor/iron/white, /area/station/science/lab) "kUl" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/duct, -/turf/open/floor/iron/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "kUo" = ( /obj/effect/spawner/structure/window/reinforced, @@ -42798,10 +42723,13 @@ /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) "lbi" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "lbm" = ( @@ -43243,15 +43171,11 @@ /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) "lfW" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/table/glass, -/obj/item/storage/box/masks, -/obj/item/storage/box/bodybags{ - pixel_x = 4; - pixel_y = 4 +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 }, -/obj/structure/sign/departments/medbay/alt/directional/west, -/turf/open/floor/iron/white/textured, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "lfZ" = ( /obj/structure/sign/poster/official/random/directional/south, @@ -47515,7 +47439,6 @@ }, /obj/machinery/door/firedoor/border_only, /obj/effect/turf_decal/siding/white, -/obj/machinery/duct, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "mjr" = ( @@ -48294,13 +48217,9 @@ /turf/open/floor/iron/dark, /area/station/maintenance/floor1/port) "mtI" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/iv_drip, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/medical/medbay/lobby) "mtL" = ( /obj/effect/turf_decal/trimline/purple/warning{ dir = 4 @@ -48398,9 +48317,12 @@ /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) "mve" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "mvg" = ( @@ -48715,7 +48637,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, /obj/machinery/button/door/directional/west{ - id = "surg_a_privacy"; + id = "med_lockdown"; name = "Surgery Privacy Shutters"; req_access = list("medical") }, @@ -49172,14 +49094,15 @@ /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) "mFz" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/door/airlock/public/glass{ - name = "Medbay Lobby" + name = "Medbay" }, -/turf/open/floor/iron/dark/textured, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "mFB" = ( /obj/structure/window/reinforced/spawner/directional/north, @@ -52490,9 +52413,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/floor2/port/aft) -"nvy" = ( -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "nvE" = ( /obj/machinery/autolathe, /obj/effect/turf_decal/siding/thinplating_new{ @@ -53694,7 +53614,6 @@ dir = 1 }, /obj/effect/turf_decal/siding/white, -/obj/machinery/duct, /turf/open/floor/iron/white/textured, /area/station/medical/cryo) "nLc" = ( @@ -54433,10 +54352,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) -"nVp" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "nVq" = ( /turf/open/openspace, /area/station/maintenance/floor3/starboard/fore) @@ -55370,19 +55285,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"oio" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "oiu" = ( /obj/machinery/computer/security/hos{ dir = 1 @@ -55458,14 +55360,6 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/service/library) -"ojg" = ( -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/firedoor, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/item/stack/medical/gauze, -/turf/open/floor/iron/dark/textured, -/area/station/medical/medbay/lobby) "ojl" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55953,13 +55847,13 @@ /turf/open/floor/eighties, /area/station/commons/dorms/room2) "opE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "opN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -56198,11 +56092,9 @@ /turf/open/floor/plating, /area/station/maintenance/floor4/starboard) "osX" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/hedge, -/turf/open/floor/carpet/green, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/restaurant_portal/bar, +/turf/open/floor/wood, /area/station/service/kitchen/diner) "ote" = ( /obj/effect/spawner/structure/window/reinforced, @@ -56303,6 +56195,9 @@ /obj/effect/turf_decal/siding/white{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/open/floor/iron/dark/textured, /area/station/medical/paramedic) "ouF" = ( @@ -59992,11 +59887,12 @@ /turf/open/floor/iron/white, /area/station/science/lower) "puH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "puI" = ( /obj/machinery/vending/cigarette, /turf/open/floor/iron, @@ -62464,6 +62360,7 @@ /area/station/science/auxlab) "qaY" = ( /obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable, /turf/open/floor/wood, /area/station/service/kitchen/diner) "qbh" = ( @@ -62539,8 +62436,8 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/aft) "qcr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/firealarm/directional/north, +/obj/structure/fake_stairs/directional/south, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "qct" = ( @@ -63385,7 +63282,12 @@ /turf/open/floor/wood, /area/station/service/kitchen/diner) "qob" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/siding/yellow{ + dir = 8; + pixel_x = 15 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 8 }, /turf/open/floor/iron/white, @@ -63674,22 +63576,12 @@ /turf/open/floor/pod, /area/station/hallway/secondary/entry) "qsj" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/table/glass, -/obj/item/reagent_containers/cup/bottle/salglu_solution{ - pixel_x = -6 - }, -/obj/item/reagent_containers/chem_pack{ - pixel_x = 6 - }, -/obj/item/reagent_containers/chem_pack{ - pixel_x = 6 - }, -/obj/item/reagent_containers/chem_pack{ - pixel_x = 6 +/obj/structure/bed/medical/anchored{ + dir = 1 }, -/obj/structure/sign/departments/medbay/alt/directional/north, -/turf/open/floor/iron/white/textured, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "qsy" = ( /obj/machinery/airalarm/directional/south, @@ -63836,8 +63728,9 @@ /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) "qtM" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "qtO" = ( @@ -64687,15 +64580,6 @@ dir = 9 }, /area/station/hallway/floor4/aft) -"qCI" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/machinery/medical_kiosk, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) "qCO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -65569,10 +65453,8 @@ /turf/open/floor/iron/dark/small, /area/station/service/chapel/office) "qPu" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/stasis, -/obj/machinery/defibrillator_mount/directional/north, -/turf/open/floor/iron/white/textured, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "qPv" = ( /obj/item/kirbyplants/random, @@ -66223,13 +66105,12 @@ /turf/open/floor/iron/dark, /area/station/security/brig) "qXX" = ( -/obj/structure/railing/corner, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/structure/disposalpipe/junction{ +/obj/structure/disposalpipe/junction/flip{ dir = 1 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "qYb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67322,6 +67203,9 @@ "rmD" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/structure/closet/secure_closet/chemical, +/obj/structure/railing{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) "rmF" = ( @@ -67624,11 +67508,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"rqA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) "rqK" = ( /obj/effect/turf_decal/stripes/full, /obj/structure/window/reinforced/spawner/directional/west, @@ -67956,12 +67835,9 @@ /turf/open/floor/glass/reinforced, /area/station/service/library) "rwv" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, /obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "rwG" = ( @@ -68714,13 +68590,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/maintenance/floor2/port/aft) -"rHI" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "rHP" = ( /obj/structure/railing/corner{ dir = 1 @@ -69155,15 +69024,6 @@ /obj/item/pen, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"rOb" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "rOj" = ( /obj/effect/turf_decal/tile/blue/anticorner, /turf/open/floor/iron/dark/side{ @@ -70009,11 +69869,11 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "sar" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/disposalpipe/segment, /obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "sat" = ( /obj/structure/railing/corner{ dir = 1 @@ -70149,6 +70009,11 @@ "scv" = ( /turf/closed/wall/r_wall, /area/station/maintenance/disposal) +"scx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "scD" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/suit_storage_unit/medical, @@ -70775,8 +70640,14 @@ /turf/open/floor/iron/dark, /area/station/medical/morgue) "slP" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "slQ" = ( /obj/machinery/navbeacon{ @@ -70859,6 +70730,20 @@ /obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"sno" = ( +/obj/structure/table/reinforced/rglass, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/stack/medical/suture/emergency{ + pixel_y = 5; + pixel_x = -5 + }, +/obj/item/stack/medical/ointment{ + pixel_y = -5; + pixel_x = 5 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured, +/area/station/medical/medbay/lobby) "snp" = ( /turf/open/floor/iron/dark/side{ dir = 8 @@ -71339,12 +71224,9 @@ /turf/open/floor/circuit, /area/station/science/xenobiology) "suB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "suD" = ( @@ -71697,13 +71579,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, /area/station/security/brig) -"szp" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "szt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72062,13 +71937,12 @@ /turf/open/floor/iron/dark, /area/station/security/brig) "sEl" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/bot_white{ + color = "#74b2d3" + }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "sEt" = ( @@ -72936,10 +72810,12 @@ /turf/open/floor/wood, /area/station/hallway/floor3/fore) "sOT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "sOU" = ( /turf/open/openspace, /area/station/maintenance/floor4/port/aft) @@ -74455,11 +74331,8 @@ /turf/open/floor/iron/dark, /area/station/security/courtroom) "thd" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/structure/sign/poster/official/random/directional/east, -/obj/structure/table/glass, -/obj/item/storage/box/bodybags, -/turf/open/floor/iron/white/textured, +/obj/machinery/stasis, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "thi" = ( /obj/structure/window/reinforced/spawner/directional/east, @@ -74515,12 +74388,14 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) "tia" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 + dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/area/station/medical/treatment_center) "tic" = ( /turf/open/floor/wood, /area/station/commons/dorms/apartment2) @@ -75659,6 +75534,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) +"twY" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "twZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -75674,11 +75555,11 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) "txp" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/structure/table/glass, -/obj/item/pai_card, -/obj/item/reagent_containers/spray/cleaner, -/turf/open/floor/iron/white/textured, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "txu" = ( /turf/open/floor/iron/dark, @@ -76157,11 +76038,14 @@ /turf/open/floor/iron/dark, /area/station/science/lab) "tDX" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/paper{ + name = "IMPORTANT NOTICE"; + default_raw_text = "Nanotrasen Mark II IV Drip Stands are to be used in the correct Nanotrasen Mark II IV Drip Stand Installation Location. Failure to do so can result in a 100 credit fine. Glory to Nanotrasen." + }, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 + dir = 4 }, -/obj/machinery/iv_drip, -/obj/machinery/light/cold/directional/north, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "tEc" = ( @@ -76985,12 +76869,13 @@ /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/service) "tOW" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/stasis{ - dir = 4 +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/light_switch/directional/north{ + pixel_y = 27; + pixel_x = 12 }, -/obj/machinery/defibrillator_mount/directional/north, -/turf/open/floor/iron/white/textured, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "tPj" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -77756,10 +77641,13 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) "tZZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/bed/medical/anchored, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "uae" = ( @@ -78939,21 +78827,13 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) "usf" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/chair/sofa/bench/solo{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/junction/flip{ +/obj/structure/disposalpipe/junction{ dir = 1 }, /obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "usj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/hatch{ @@ -81916,9 +81796,9 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) "ved" = ( -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/wood, /area/station/service/kitchen/diner) "veA" = ( @@ -82016,15 +81896,6 @@ /obj/structure/rack, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) -"vfW" = ( -/obj/machinery/medical_kiosk, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/machinery/camera/autoname/directional/south, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "vfY" = ( /obj/structure/table/reinforced, /obj/item/plate{ @@ -84604,8 +84475,11 @@ /turf/open/floor/iron/dark/side, /area/station/security/prison/garden) "vNV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "vNY" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, @@ -84651,12 +84525,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "vOs" = ( @@ -84951,15 +84819,6 @@ }, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) -"vRW" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) "vSa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/side{ @@ -84973,15 +84832,8 @@ /turf/open/floor/iron, /area/station/cargo/lobby) "vSA" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/table/glass, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 6 - }, -/obj/item/reagent_containers/syringe, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/iron/white/textured, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "vSB" = ( /obj/structure/cable, @@ -85222,6 +85074,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/port/fore) +"vVR" = ( +/obj/structure/table/reinforced/rglass, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/airalarm/directional/north, +/obj/item/food/pizzaslice/mothic_five_cheese, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_y = 7; + pixel_x = 6 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured, +/area/station/medical/medbay/lobby) "vVT" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 1 @@ -85399,6 +85263,13 @@ /obj/structure/railing/corner, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/aft) +"vXx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/light/small/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) "vXH" = ( /obj/machinery/airalarm/directional/south, /obj/effect/decal/cleanable/blood/drip, @@ -85907,7 +85778,9 @@ /turf/open/floor/iron, /area/station/hallway/floor3/fore) "wdd" = ( -/turf/closed/wall, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/bed/medical/anchored, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "wdj" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ @@ -86275,18 +86148,10 @@ /area/station/maintenance/floor4/starboard/aft) "wis" = ( /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/machinery/door/airlock/medical/glass{ - name = "Treatment Center" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/door/firedoor/border_only{ + dir = 8 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "wit" = ( /obj/structure/cable, @@ -87718,18 +87583,6 @@ /obj/structure/closet/crate/trashcart/filled, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"wzI" = ( -/obj/effect/mapping_helpers/airlock/unres, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "med_doors"; - name = "Medbay" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/textured, -/area/station/medical/medbay/lobby) "wzJ" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -88724,10 +88577,12 @@ /turf/open/floor/iron, /area/station/science/auxlab) "wLC" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/bot_white{ + color = "#74b2d3" }, -/turf/open/floor/iron/white, +/obj/machinery/holopad, +/turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "wLD" = ( /obj/item/radio/intercom/directional/south, @@ -90519,13 +90374,6 @@ }, /turf/open/floor/engine/airless, /area/station/engineering/supermatter/waste) -"xkh" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "xko" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -90619,11 +90467,13 @@ /turf/open/floor/plating/airless, /area/space) "xlu" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 + dir = 10 }, /turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/area/station/medical/treatment_center) "xlD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -90956,14 +90806,14 @@ /turf/open/floor/iron/dark, /area/station/security/lockers) "xqZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +/obj/machinery/camera/directional/north{ + c_tag = "Medbay - Treatment Center"; + name = "medbay camera"; + network = list("ss13","medbay") }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/iv_drip, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/white, +/obj/machinery/shower/directional/south, +/obj/structure/fluff/shower_drain, +/turf/open/floor/catwalk_floor/flat_white, /area/station/medical/treatment_center) "xrh" = ( /obj/effect/turf_decal/tile/blue{ @@ -91397,11 +91247,11 @@ /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) "xwZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 + dir = 8 + }, +/obj/effect/turf_decal/bot_white{ + color = "#74b2d3" }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) @@ -91798,6 +91648,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/wood, /area/station/service/kitchen/diner) "xCR" = ( @@ -92650,12 +92501,12 @@ /turf/open/floor/iron/dark, /area/station/command/teleporter) "xMH" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ name = "Maintenance Access" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/floor1/port) "xMJ" = ( @@ -92686,6 +92537,14 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"xNd" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/blue, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "xNf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/hangover, @@ -92727,21 +92586,16 @@ /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) "xNH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/chair/sofa/bench/solo{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "xNK" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, @@ -93698,10 +93552,7 @@ /turf/open/misc/beach/sand, /area/station/hallway/floor2/fore) "yba" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/official/random/directional/west, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "ybe" = ( @@ -127756,9 +127607,9 @@ jsP fQQ lkE kzE -xgH -xgH -xgH +kzE +kzE +kzE rSc tCB twx @@ -128012,11 +127863,11 @@ hLX hLX hLX lkE -ggp +wCn opB wCR -xgH -xgH +kzE +kzE ulh eVk wVn @@ -128273,7 +128124,7 @@ jQb hzV vLM lBB -xgH +kzE pLe lJk wVn @@ -128530,7 +128381,7 @@ wCn fKC ssi tkz -xgH +kzE dxS twx wVn @@ -128787,7 +128638,7 @@ kzE wAe mYo kzr -xgH +kzE wVn wVn wVn @@ -129044,7 +128895,7 @@ xMH trP dpC qHH -xgH +kzE oBQ xgH xgH @@ -129297,11 +129148,11 @@ dJO tIG vag vag -xgH -xgH -xgH -xgH -xgH +kzE +kzE +kzE +kzE +kzE dJO nJI xgH @@ -195073,17 +194924,17 @@ vsx xYM jLQ yka -ilR -grm +mtI +ggp hOX qob -dyP aHk -rHI +eEZ +twY tia cwz -ael -gBZ +twY +twY oxn oUE eIw @@ -195331,11 +195182,11 @@ xYM jLQ tDb gvp -hYk -qtM gVI -dyG -wzI +qtM +xNd +ihL +hwV hYk qXX usf @@ -195845,15 +195696,15 @@ cdm jLQ aYU gvp -hYk +ffh lbi blH ihL hwV -hSs -eEZ +opE +opE xNH -oio +opE opE dAF wPS @@ -196100,17 +195951,17 @@ eUq ttb wQu jLQ -yka -ilR -xlu +dyG +mtI +gYa jIi csR -vfW aHk +vOo xlu -bez +dzM puH -gYa +dzM gBV oxn fES @@ -196359,19 +196210,19 @@ xYM jLQ usK ilR -ojg +vVR hHe -ftD +sno aHk wdd -wdd +fqn wis slP -cZm -wdd -wdd -wdd -wdd +iAQ +tZZ +aZW +aZW +aZW iSP iSP iSP @@ -196621,14 +196472,14 @@ ouD dUj sRR vSA -cZI -bCd +rwv +dzM vNV -gRW +hwV gHO yba lfW -wdd +aZW pOK nqM qQM @@ -196879,13 +196730,13 @@ dhZ sRR tOW rwv -aTc -dgm +bCd +dzM gcm -xkh -fDL +txp +aaU coZ -wdd +aZW aYB xcY gEZ @@ -197136,14 +196987,14 @@ loQ sRR tDX kRM -gQE +dzM wLC -nVp -txp -aaU -ecK -wdd +dzM +sOT +twY +twY qcr +xcY otX gEZ dHR @@ -197387,20 +197238,20 @@ jEk jLQ aje grN -sRR +aTc gxi woE biz -nvy +dzM kUl -qCI +kUf dzM -tZZ -vRW -rOb -fqn -iZO -rqA +dYM +scx +dzM +dzM +qcr +xcY nKY mjg ehO @@ -197650,14 +197501,14 @@ gBz sRR xqZ jTK -kUf -szp -dYM +dzM +dzM +dzM ijd -hzF -mtI -wdd -sOT +vOo +vOo +qcr +xcY rEp gEZ dHR @@ -197909,12 +197760,12 @@ qPu sEl vOo xwZ -dWZ +vOo aRz -fEj +aaU ilI -wdd -aYB +aZW +vXx xcY gEZ wcH @@ -198168,9 +198019,9 @@ thd bYb bnC dXy -bND +thd aHK -wdd +aZW bwE wat ydn @@ -198423,11 +198274,11 @@ qvN qvN qvN qvN -wdd -wdd -wdd -wdd -wdd +aZW +fEj +aZW +aZW +aZW ylR ylR ylR @@ -247246,11 +247097,11 @@ fjo mso dFd awt -cix gjf gjf -qoa gjf +qoa +jDe jDe qoW tTc @@ -247504,7 +247355,6 @@ mso dFd awt gjf -gjf ulB ulB ulB @@ -247513,6 +247363,7 @@ bMs kpa jzE gjf +gjf ddx rBC rBC @@ -247761,7 +247612,6 @@ mso laJ jWT tRT -gjf nXq xEL oAm @@ -247770,6 +247620,7 @@ dId jAl jHT gjf +gjf ddx rBC rBC @@ -248018,7 +247869,6 @@ gWg iOh awt gjf -gjf mQg rBC pzK @@ -248027,6 +247877,7 @@ gjf wtg gjf gjf +gjf uCW kHc xAq @@ -248275,7 +248126,6 @@ qcd ccF awt gjf -xCM mQg rBC pzK @@ -248284,6 +248134,7 @@ gjf vXY vRj ldV +osX jHJ hVt hVt @@ -248532,7 +248383,6 @@ qcd nsn rSS xDS -xDS sln jAl pWr @@ -248540,6 +248390,7 @@ jDe bMs kpa jzE +gjf vRj vWQ vWQ @@ -248788,17 +248639,17 @@ fjo qcd ceh dMj -gjf -xDS +cix ulB ulB ulB -jDe +xCM dId jAl jHT +gjf +xDS xDS -xna xna xna xna @@ -249045,9 +248896,8 @@ fjo qcd fOu awt -gjf -xDS -xDS +cix +cix xDS xDS ved @@ -249055,7 +248905,8 @@ xDS xDS xDS xDS -osX +xDS +gjf vZg dIx dIx @@ -249304,10 +249155,10 @@ dFd awt gjf gjf -gjf +vXY xDS qaY -jDe +gjf gjf wtg gjf @@ -249563,11 +249414,11 @@ rZS nla mQF xDS -gjf jDe bMs kpa jzE +gjf tFS nNJ ycW @@ -249820,12 +249671,12 @@ ubR mhE rwh xDS -gjf jDe dId jAl jHT gjf +gjf nNJ dxv ssj @@ -250078,7 +249929,7 @@ ubR nYE xDS jDe -jDe +gjf iwU psq eEr diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 917b6101b931b5..1cd6326dc2d4e3 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -15862,6 +15862,18 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"exQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Mix to Gas"; + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "exT" = ( /obj/structure/table, /obj/item/radio{ @@ -16240,6 +16252,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"eEp" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "eEx" = ( /obj/structure/cable, /obj/structure/extinguisher_cabinet/directional/north, @@ -19752,7 +19773,8 @@ /area/station/command/teleporter) "fWn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/closed/wall/r_wall, +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "fWA" = ( /turf/open/floor/plating, @@ -20224,6 +20246,7 @@ "gfV" = ( /obj/structure/table/wood/fancy/green, /obj/effect/spawner/round_default_module, +/obj/machinery/camera/motion/directional/east, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) "gfX" = ( @@ -23853,6 +23876,13 @@ "hzN" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/command/storage/eva) +"hzQ" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "hzR" = ( /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 @@ -28295,6 +28325,10 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/hallway) +"jfD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "jfH" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -29173,7 +29207,6 @@ /turf/open/floor/iron, /area/station/hallway/secondary/command) "jux" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/structure/cable/layer1, /obj/effect/turf_decal/trimline/yellow/arrow_ccw{ dir = 6 @@ -29181,6 +29214,7 @@ /obj/effect/turf_decal/trimline/yellow/corner{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "juT" = ( @@ -31410,6 +31444,15 @@ }, /turf/open/floor/wood/large, /area/station/service/library) +"kgg" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "kgr" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -32561,6 +32604,11 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/freezer, /area/station/medical/coldroom) +"kAF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "kAO" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -40535,6 +40583,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) +"nmN" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "nmP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44120,6 +44175,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"oDq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "oDs" = ( /obj/structure/cable, /obj/item/radio/intercom/directional/west, @@ -46980,6 +47040,13 @@ /obj/structure/transit_tube_pod, /turf/open/floor/plating, /area/station/science/lower) +"pFO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "pFU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -67758,7 +67825,10 @@ /turf/open/floor/iron, /area/station/security/checkpoint/escape) "wPj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Mix Bypass" + }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "wPD" = ( @@ -68155,6 +68225,16 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"wYS" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Gas to Mix"; + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "wYX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -69207,6 +69287,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) +"xuk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "xum" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -103540,11 +103625,11 @@ sHh yeg sHh sHh -sHh -sHh -sHh -sHh -sHh +exQ +kAF +kAF +kAF +wYS sHh sHh poT @@ -103797,11 +103882,11 @@ qHs sHj qHs qHs -qHs -qHs -qHs -qHs -qHs +pFO +jfD +xuk +jfD +oDq qHs qHs fWn @@ -104053,14 +104138,14 @@ bpl mRs jaW mAx -hZr -aaa -aaa -aaa -aaa -aaa -aaa -aaa +qHs +nmN +eEp +kgg +eEp +hzQ +qHs +pHM aeV aeV prq @@ -104310,13 +104395,13 @@ bpl mRs woR mAx -hZr -hZr -hZr -hZr -aaa -aaa -aaa +qHs +qHs +qHs +qHs +qHs +qHs +qHs aaa aac aaa diff --git a/_maps/shuttles/emergency_lance.dmm b/_maps/shuttles/emergency_lance.dmm index e2f254844d3320..56aa9fb25f5cdb 100644 --- a/_maps/shuttles/emergency_lance.dmm +++ b/_maps/shuttles/emergency_lance.dmm @@ -297,7 +297,8 @@ }, /obj/docking_port/mobile/emergency{ dir = 2; - name = "Lance Emergency Shuttle" + name = "Lance Emergency Shuttle"; + port_direction = 1 }, /turf/open/floor/iron/dark, /area/shuttle/escape) diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index e46fef9123e187..0253df0b57a4d3 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -1,7 +1,7 @@ // Keep the identifiers here below 32 characters, you can put the full display name in the actual achievement datum /// Achievements icon set -#define ACHIEVEMENTS_SET 'icons/ui_icons/achievements/achievements.dmi' +#define ACHIEVEMENTS_SET 'icons/ui/achievements/achievements.dmi' #define ACHIEVEMENT_DEFAULT "default" #define ACHIEVEMENT_SCORE "score" diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index a65b5ebd40758a..23c16bdcd0b38f 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -155,6 +155,9 @@ ///Text we display when we befriend someone #define BB_FRIENDLY_MESSAGE "friendly_message" +///our fishing target +#define BB_FISHING_TARGET "fishing_target" + // Keys used by one and only one behavior // Used to hold state without making bigass lists /// For /datum/ai_behavior/find_potential_targets, what if any field are we using currently diff --git a/code/__DEFINES/ai/pets.dm b/code/__DEFINES/ai/pets.dm index 48d4f2d67d065a..6af24b6cdd9730 100644 --- a/code/__DEFINES/ai/pets.dm +++ b/code/__DEFINES/ai/pets.dm @@ -67,7 +67,7 @@ //virtual pet keys ///the last PDA message we must relay -#define BB_LAST_RECIEVED_MESSAGE "last_recieved_message" +#define BB_LAST_RECEIVED_MESSAGE "last_received_message" ///our current virtual pet level #define BB_VIRTUAL_PET_LEVEL "virtual_pet_level" ///the target we will play with diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 8f7fa11f57b2a4..1d3c9304c3c937 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -274,5 +274,7 @@ /// From /datum/element/basic_eating/finish_eating() #define COMSIG_MOB_ATE "mob_ate" +///From mob/living/carbon/proc/throw_mode_on and throw_mode_off +#define COMSIG_LIVING_THROW_MODE_TOGGLE "living_throw_mode_toggle" ///From /datum/component/happiness() #define COMSIG_MOB_HAPPINESS_CHANGE "happiness_change" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index f33d2f1f40d027..7fce084dc2f119 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -81,6 +81,9 @@ #define ACCESS_DISALLOWED (1<<1) #define LOCKED_ATOM_INCOMPATIBLE (1<<2) +///from the component /datum/component/simple_access +#define COMSIG_MOB_RETRIEVE_SIMPLE_ACCESS "retrieve_simple_access" + ///from base of mob/can_cast_magic(): (mob/user, magic_flags, charge_cost) #define COMSIG_MOB_RESTRICT_MAGIC "mob_cast_magic" ///from base of mob/can_block_magic(): (mob/user, casted_magic_flags, charge_cost) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index f628df0e964b40..d7e895221d0e03 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -366,11 +366,11 @@ // /obj/item/grenade signals -///called in /obj/item/gun/process_fire (user, target, params, zone_override) +///called in /obj/item/grenade/proc/detonate(): (lanced_by) #define COMSIG_GRENADE_DETONATE "grenade_prime" -//called from many places in grenade code (armed_by, nade, det_time, delayoverride) +///called in /obj/item/grenade/gas_crystal/arm_grenade(): (armed_by, nade, det_time, delayoverride) #define COMSIG_MOB_GRENADE_ARMED "grenade_mob_armed" -///called in /obj/item/gun/process_fire (user, target, params, zone_override) +///called in /obj/item/grenade/proc/arm_grenade() and /obj/item/grenade/gas_crystal/arm_grenade(): (det_time, delayoverride) #define COMSIG_GRENADE_ARMED "grenade_armed" // /obj/projectile signals (sent to the firer) @@ -423,7 +423,7 @@ #define COMSIG_VIM_HEADLIGHTS_TOGGLED "vim_headlights_toggled" ///from /datum/computer_file/program/messenger/proc/receive_message -#define COMSIG_COMPUTER_RECIEVED_MESSAGE "computer_recieved_message" +#define COMSIG_COMPUTER_RECEIVED_MESSAGE "computer_received_message" ///from /datum/computer_file/program/virtual_pet/proc/handle_level_up #define COMSIG_VIRTUAL_PET_LEVEL_UP "virtual_pet_level_up" diff --git a/code/__DEFINES/dcs/signals/signals_storage.dm b/code/__DEFINES/dcs/signals/signals_storage.dm index 45b6ec6bfe3f24..26459ab4dad3d5 100644 --- a/code/__DEFINES/dcs/signals/signals_storage.dm +++ b/code/__DEFINES/dcs/signals/signals_storage.dm @@ -5,5 +5,14 @@ /// Sent after dumping into some other storage object: (atom/dest_object, mob/user) #define COMSIG_STORAGE_DUMP_POST_TRANSFER "storage_dump_into_storage" -/// Sent to the STORAGE when an ITEM is STORED INSIDE. +/// Fired off the storage's PARENT when an ITEM is STORED INSIDE. (obj/item, mob, force) +#define COMSIG_ATOM_STORED_ITEM "atom_storing_item" + +/// Fired off the storage's PARENT when an ITEM is REMOVED. (obj/item, atom, silent) +#define COMSIG_ATOM_REMOVED_ITEM "atom_removing_item" + +/// Sent to the STORAGE when an ITEM is STORED INSIDE. (obj/item, mob, force) #define COMSIG_STORAGE_STORED_ITEM "storage_storing_item" + +/// Sent to the STORAGE when an ITEM is REMOVED. (obj/item, atom, silent) +#define COMSIG_STORAGE_REMOVED_ITEM "storage_removing_item" diff --git a/code/__DEFINES/diseases.dm b/code/__DEFINES/diseases.dm index 047bb79582de45..fe05a30e0fd83a 100644 --- a/code/__DEFINES/diseases.dm +++ b/code/__DEFINES/diseases.dm @@ -81,28 +81,28 @@ DEFINE_BITFIELD(spread_flags, list( //// Adjust to make it faster or slower to cure once the virus has reached its peak. #define DISEASE_PEAKED_RECOVERY_MULTIPLIER 1.2 /// Slowdown Recovery Bonus - set this to the maximum extra chance per tick you want people to get to recover from spaceacillin or other slowdown/virus resistance effects -#define DISEASE_SLOWDOWN_RECOVERY_BONUS 1 -/// Slowdown Recovery Bonus Duration - set this to the maximum # of cycles you want things that cause slowdown/virus resistance to be able to add a bonus up to DISEASE_SLOWDOWN_RECOVERY_BONUS.______qdel_list_wrapper(list/L) +#define DISEASE_SLOWDOWN_RECOVERY_BONUS 3 +/// Slowdown Recovery Bonus Duration - set this to the maximum # of cycles you want things that cause slowdown/virus resistance to be able to add a bonus up to DISEASE_SLOWDOWN_RECOVERY_BONUS. //// Scales down linearly over time. -#define DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION 100 +#define DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION 200 /// Negative Malnutrition Recovery Penalty //// Flat penalty to recovery chance if malnourished or starving -#define DISEASE_MALNUTRITION_RECOVERY_PENALTY 1.5 +#define DISEASE_MALNUTRITION_RECOVERY_PENALTY 3 /// Satiety Recovery Multiplier - added chance to recover based on positive satiety //// Multiplier of satiety/max_satiety if satiety is positive or zero. Increase to make satiety more valuable, decrease for less. -#define DISEASE_SATIETY_RECOVERY_MULTIPLIER 1 +#define DISEASE_SATIETY_RECOVERY_MULTIPLIER 3 /// Good Sleeping Recovery Bonus - additive benefits for various types of good sleep (blanket, bed, darkness, pillows.) //// Raise to make each factor add this much chance to recover. -#define DISEASE_GOOD_SLEEPING_RECOVERY_BONUS 0.2 +#define DISEASE_GOOD_SLEEPING_RECOVERY_BONUS 0.6 /// Sleeping Recovery Multiplier - multiplies ALL recovery chance effects by this amount. //// Set to 1 for no effect on recovery chances from sleeping. -#define DISEASE_SLEEPING_RECOVERY_MULTIPLIER 2 +#define DISEASE_SLEEPING_RECOVERY_MULTIPLIER 6 /// Final Cure Chance Multiplier - multiplies the disease's cure chance to get the probability of moving from stage 1 to a final cure. //// Must be greater than zero for diseases to self cure. -#define DISEASE_FINAL_CURE_CHANCE_MULTIPLIER 3 +#define DISEASE_FINAL_CURE_CHANCE_MULTIPLIER 6 /// Symptom Offset Duration - number of cycles over which sleeping/having spaceacillin or a slowdown effect can prevent symptoms appearing //// Set to maximum # of cycles you want to be able to offset symptoms. Scales down linearly over time. -#define DISEASE_SYMPTOM_OFFSET_DURATION 100 +#define DISEASE_SYMPTOM_OFFSET_DURATION 200 /// Symptom Frequency Modifier //// Raise to make symptoms fire less frequently, lower to make them fire more frequently. Keep at 0 or above. diff --git a/code/__DEFINES/fonts.dm b/code/__DEFINES/fonts.dm index 0f1dbd501d0920..b643ec997ca10d 100644 --- a/code/__DEFINES/fonts.dm +++ b/code/__DEFINES/fonts.dm @@ -13,7 +13,7 @@ #define SIGNATURE_FONT "Segoe Script" /// Emoji icon set -#define EMOJI_SET 'icons/ui_icons/emoji/emoji.dmi' +#define EMOJI_SET 'icons/ui/chat/emoji.dmi' // Font metrics bitfield /// Include leading A width and trailing C width in GetWidth() or in DrawText() diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 5ab16b5a5ff591..7f007e5b30ec49 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -954,6 +954,9 @@ GLOBAL_LIST_INIT(layers_to_offset, list( /// Types of bullets that mining mobs take full damage from #define MINING_MOB_PROJECTILE_VULNERABILITY list(BRUTE) +/// Helper macro that determines if the mob is at the threshold to start vomitting due to high toxin levels +#define AT_TOXIN_VOMIT_THRESHOLD(mob) (mob.getToxLoss() > 45 && mob.nutrition > 20) + /// The duration of the flip emote animation #define FLIP_EMOTE_DURATION 0.7 SECONDS diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index ee7e5dfee0d125..88e64164acd4ba 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -33,7 +33,6 @@ #define ROLE_OPERATIVE_MIDROUND "Operative (Midround)" #define ROLE_PARADOX_CLONE "Paradox Clone" #define ROLE_REV_HEAD "Head Revolutionary" -#define ROLE_SENTIENT_DISEASE "Sentient Disease" #define ROLE_SLEEPER_AGENT "Syndicate Sleeper Agent" #define ROLE_SPACE_DRAGON "Space Dragon" #define ROLE_SPIDER "Spider" @@ -150,7 +149,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_OPERATIVE_MIDROUND = 14, ROLE_PARADOX_CLONE = 0, ROLE_REVENANT = 0, - ROLE_SENTIENT_DISEASE = 0, ROLE_SLEEPER_AGENT = 0, ROLE_SPACE_DRAGON = 0, ROLE_SPIDER = 0, diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 4c1411d3cfdfc8..7446d150f0d2e7 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -222,6 +222,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_REVEAL_FISH "reveal_fish" ///This trait gets you a list of fishes that can be caught when examining a fishing spot. #define TRAIT_EXAMINE_FISHING_SPOT "examine_fishing_spot" +///Trait given to turfs or objects that can be fished from +#define TRAIT_FISHING_SPOT "fishing_spot" +///Trait given to mobs that can fish without a rod +#define TRAIT_PROFOUND_FISHER "profound_fisher" /// This trait lets you evaluate someone's fitness level against your own #define TRAIT_EXAMINE_FITNESS "reveal_power_level" @@ -1132,4 +1136,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait applied to objects and mobs that can attack a boulder and break it down. (See /obj/item/boulder/manual_process()) #define TRAIT_BOULDER_BREAKER "boulder_breaker" +/// Does this item bypass ranged armor checks? +#define TRAIT_BYPASS_RANGED_ARMOR "bypass_ranged_armor" + // END TRAIT DEFINES diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm index 4ce15f2e09e129..882e556a801f68 100644 --- a/code/_globalvars/lists/quirks.dm +++ b/code/_globalvars/lists/quirks.dm @@ -45,7 +45,7 @@ GLOBAL_LIST_INIT(possible_junkie_addictions, setup_junkie_addictions(list( ))) ///Options for the Smoker quirk to choose from -GLOBAL_LIST_INIT(possible_smoker_addictions, setup_junkie_addictions(list( +GLOBAL_LIST_INIT(possible_smoker_addictions, setup_smoker_addictions(list( /obj/item/storage/fancy/cigarettes, /obj/item/storage/fancy/cigarettes/cigpack_midori, /obj/item/storage/fancy/cigarettes/cigpack_uplift, diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 19449c6e4637ef..f4a3be4aee5c7d 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -383,6 +383,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PRESERVE_UI_WITHOUT_CLIENT" = TRAIT_PRESERVE_UI_WITHOUT_CLIENT, "TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION" = TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, "TRAIT_PRIMITIVE" = TRAIT_PRIMITIVE, //unable to use mechs. Given to Ash Walkers + "TRAIT_PROFOUND_FISHER" = TRAIT_PROFOUND_FISHER, "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, "TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED, "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, @@ -507,6 +508,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, "TRAIT_BASIC_QUALITY_BAIT" = TRAIT_BASIC_QUALITY_BAIT, "TRAIT_BLIND_TOOL" = TRAIT_BLIND_TOOL, + "TRAIT_BYPASS_RANGED_ARMOR" = TRAIT_BYPASS_RANGED_ARMOR, "TRAIT_CUSTOM_TAP_SOUND" = TRAIT_CUSTOM_TAP_SOUND, "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT, "TRAIT_FISHING_BAIT" = TRAIT_FISHING_BAIT, @@ -616,6 +618,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TURF_IGNORE_SLIPPERY" = TRAIT_TURF_IGNORE_SLIPPERY, "TRAIT_TURF_IGNORE_SLOWDOWN" = TRAIT_TURF_IGNORE_SLOWDOWN, "TRAIT_ELEVATED_TURF" = TRAIT_ELEVATED_TURF, + "TRAIT_FISHING_SPOT" = TRAIT_FISHING_SPOT, ), )) diff --git a/code/_onclick/click_alt.dm b/code/_onclick/click_alt.dm index 11419a60816929..7f762a6e920ea9 100644 --- a/code/_onclick/click_alt.dm +++ b/code/_onclick/click_alt.dm @@ -11,7 +11,10 @@ return // Is it visible (and we're not wearing it (our clothes are invisible))? - if(!(src in viewers(7, target)) && !CanReach(target)) + if(!CAN_I_SEE(target)) + return + + if(is_blind() && !IN_GIVEN_RANGE(src, target, 1)) return var/turf/tile = get_turf(target) diff --git a/code/_onclick/hud/parallax/parallax.dm b/code/_onclick/hud/parallax/parallax.dm index 506226b41ead00..bcdcd0e74fed12 100644 --- a/code/_onclick/hud/parallax/parallax.dm +++ b/code/_onclick/hud/parallax/parallax.dm @@ -11,6 +11,10 @@ for(var/atom/movable/screen/plane_master/parallax as anything in get_true_plane_masters(PLANE_SPACE_PARALLAX)) parallax.unhide_plane(screenmob) + if(isnull(C.parallax_rock)) + C.parallax_rock = new(null, src) + C.screen |= C.parallax_rock + if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, src) @@ -25,7 +29,7 @@ if (length(C.parallax_layers) > C.parallax_layers_max) C.parallax_layers.len = C.parallax_layers_max - C.screen |= (C.parallax_layers) + C.parallax_rock.vis_contents = C.parallax_layers // We could do not do parallax for anything except the main plane group // This could be changed, but it would require refactoring this whole thing // And adding non client particular hooks for all the inputs, and I do not have the time I'm sorry :( @@ -44,7 +48,7 @@ /datum/hud/proc/remove_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client - C.screen -= (C.parallax_layers_cached) + C.screen -= (C.parallax_rock) for(var/atom/movable/screen/plane_master/plane_master as anything in screenmob.hud_used.get_true_plane_masters(PLANE_SPACE)) if(screenmob != mymob) C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen @@ -104,83 +108,65 @@ update_parallax(screen_mob) // This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation) -/datum/hud/proc/set_parallax_movedir(new_parallax_movedir = 0, skip_windups, mob/viewmob) +/datum/hud/proc/set_parallax_movedir(new_parallax_movedir = NONE, skip_windups, mob/viewmob) . = FALSE var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client if(new_parallax_movedir == C.parallax_movedir) return - var/animatedir = new_parallax_movedir - if(new_parallax_movedir == FALSE) - var/animate_time = 0 - for(var/thing in C.parallax_layers) - var/atom/movable/screen/parallax_layer/L = thing - L.icon_state = initial(L.icon_state) - L.update_o(C.view) - var/T = PARALLAX_LOOP_TIME / L.speed - if (T > animate_time) - animate_time = T - C.dont_animate_parallax = world.time + min(animate_time, PARALLAX_LOOP_TIME) - animatedir = C.parallax_movedir - - var/matrix/newtransform - switch(animatedir) + + var/animation_dir = new_parallax_movedir || C.parallax_movedir + var/matrix/new_transform + switch(animation_dir) if(NORTH) - newtransform = matrix(1, 0, 0, 0, 1, 480) + new_transform = matrix(1, 0, 0, 0, 1, 480) if(SOUTH) - newtransform = matrix(1, 0, 0, 0, 1,-480) + new_transform = matrix(1, 0, 0, 0, 1,-480) if(EAST) - newtransform = matrix(1, 0, 480, 0, 1, 0) + new_transform = matrix(1, 0, 480, 0, 1, 0) if(WEST) - newtransform = matrix(1, 0,-480, 0, 1, 0) - - var/shortesttimer - if(!skip_windups) - for(var/thing in C.parallax_layers) - var/atom/movable/screen/parallax_layer/L = thing - - var/T = PARALLAX_LOOP_TIME / L.speed - if (isnull(shortesttimer)) - shortesttimer = T - if (T < shortesttimer) - shortesttimer = T - L.transform = newtransform - animate(L, transform = matrix(), time = T, easing = QUAD_EASING | (new_parallax_movedir ? EASE_IN : EASE_OUT), flags = ANIMATION_END_NOW) - if (new_parallax_movedir) - L.transform = newtransform - animate(transform = matrix(), time = T) //queue up another animate so lag doesn't create a shutter + new_transform = matrix(1, 0,-480, 0, 1, 0) + + var/longest_timer = 0 + for(var/key in C.parallax_animate_timers) + deltimer(C.parallax_animate_timers[key]) + C.parallax_animate_timers = list() + for(var/atom/movable/screen/parallax_layer/layer as anything in C.parallax_layers) + var/scaled_time = PARALLAX_LOOP_TIME / layer.speed + if(new_parallax_movedir == NONE) // If we're stopping, we need to stop on the same dime, yeah? + scaled_time = PARALLAX_LOOP_TIME + longest_timer = max(longest_timer, scaled_time) + + if(skip_windups) + update_parallax_motionblur(C, layer, new_parallax_movedir, new_transform) + continue - C.parallax_movedir = new_parallax_movedir - if (C.parallax_animate_timer) - deltimer(C.parallax_animate_timer) - var/datum/callback/CB = CALLBACK(src, PROC_REF(update_parallax_motionblur), C, animatedir, new_parallax_movedir, newtransform) - if(skip_windups) - CB.Invoke() - else - C.parallax_animate_timer = addtimer(CB, min(shortesttimer, PARALLAX_LOOP_TIME), TIMER_CLIENT_TIME|TIMER_STOPPABLE) + layer.transform = new_transform + animate(layer, transform = matrix(), time = scaled_time, easing = QUAD_EASING | (new_parallax_movedir ? EASE_IN : EASE_OUT)) + if (new_parallax_movedir == NONE) + continue + //queue up another animate so lag doesn't create a shutter + animate(transform = new_transform, time = 0) + animate(transform = matrix(), time = scaled_time / 2) + C.parallax_animate_timers[layer] = addtimer(CALLBACK(src, PROC_REF(update_parallax_motionblur), C, layer, new_parallax_movedir, new_transform), scaled_time, TIMER_CLIENT_TIME|TIMER_STOPPABLE) + C.dont_animate_parallax = world.time + min(longest_timer, PARALLAX_LOOP_TIME) + C.parallax_movedir = new_parallax_movedir -/datum/hud/proc/update_parallax_motionblur(client/C, animatedir, new_parallax_movedir, matrix/newtransform) +/datum/hud/proc/update_parallax_motionblur(client/C, atom/movable/screen/parallax_layer/layer, new_parallax_movedir, matrix/new_transform) if(!C) return - C.parallax_animate_timer = FALSE - for(var/thing in C.parallax_layers) - var/atom/movable/screen/parallax_layer/L = thing - if (!new_parallax_movedir) - animate(L) - continue - - var/newstate = initial(L.icon_state) - var/T = PARALLAX_LOOP_TIME / L.speed - - if (newstate in icon_states(L.icon)) - L.icon_state = newstate - L.update_o(C.view) - - L.transform = newtransform - - animate(L, transform = L.transform, time = 0, loop = -1, flags = ANIMATION_END_NOW) - animate(transform = matrix(), time = T) + C.parallax_animate_timers -= layer + + // If we are moving in a direction, we used the QUAD_EASING function with EASE_IN + // This means our position function is x^2. This is always LESS then the linear we're using here + // But if we just used the same time delay, our rate of change would mismatch. f'(1) = 2x for quad easing, rather then the 1 we get for linear + // (This is because of how derivatives work right?) + // Because of this, while our actual rate of change from before was PARALLAX_LOOP_TIME, our perceived rate of change was PARALLAX_LOOP_TIME / 2 (lower == faster). + // Let's account for that here + var/scaled_time = (PARALLAX_LOOP_TIME / layer.speed) / 2 + animate(layer, transform = new_transform, time = 0, loop = -1, flags = ANIMATION_END_NOW) + animate(transform = matrix(), time = scaled_time) /datum/hud/proc/update_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob @@ -217,36 +203,41 @@ var/our_speed = parallax_layer.speed var/change_x var/change_y + var/old_x = parallax_layer.offset_x + var/old_y = parallax_layer.offset_y if(parallax_layer.absolute) // We use change here so the typically large absolute objects (just lavaland for now) don't jitter so much - change_x = (posobj.x - SSparallax.planet_x_offset) * our_speed + parallax_layer.offset_x - change_y = (posobj.y - SSparallax.planet_y_offset) * our_speed + parallax_layer.offset_y + change_x = (posobj.x - SSparallax.planet_x_offset) * our_speed + old_x + change_y = (posobj.y - SSparallax.planet_y_offset) * our_speed + old_y else change_x = offset_x * our_speed change_y = offset_y * our_speed // This is how we tile parralax sprites // It doesn't use change because we really don't want to animate this - if(parallax_layer.offset_x - change_x > 240) + if(old_x - change_x > 240) parallax_layer.offset_x -= 480 - else if(parallax_layer.offset_x - change_x < -240) + parallax_layer.pixel_w = parallax_layer.offset_x + else if(old_x - change_x < -240) parallax_layer.offset_x += 480 - if(parallax_layer.offset_y - change_y > 240) + parallax_layer.pixel_w = parallax_layer.offset_x + if(old_y - change_y > 240) parallax_layer.offset_y -= 480 - else if(parallax_layer.offset_y - change_y < -240) + parallax_layer.pixel_z = parallax_layer.offset_y + else if(old_y - change_y < -240) parallax_layer.offset_y += 480 + parallax_layer.pixel_z = parallax_layer.offset_y - // Now that we have our offsets, let's do our positioning parallax_layer.offset_x -= change_x parallax_layer.offset_y -= change_y - - parallax_layer.screen_loc = "CENTER-7:[round(parallax_layer.offset_x, 1)],CENTER-7:[round(parallax_layer.offset_y, 1)]" - - // We're going to use a transform to "glide" that last movement out, so it looks nicer + // Now that we have our offsets, let's do our positioning + // We're going to use an animate to "glide" that last movement out, so it looks nicer // Don't do any animates if we're not actually moving enough distance yeah? thanks lad if(run_parralax && (largest_change * our_speed > 1)) - parallax_layer.transform = matrix(1,0,change_x, 0,1,change_y) - animate(parallax_layer, transform=matrix(), time = glide_rate) + animate(parallax_layer, pixel_w = round(parallax_layer.offset_x, 1), pixel_z = round(parallax_layer.offset_y, 1), time = glide_rate) + else + parallax_layer.pixel_w = round(parallax_layer.offset_x, 1) + parallax_layer.pixel_z = round(parallax_layer.offset_y, 1) /atom/movable/proc/update_parallax_contents() for(var/mob/client_mob as anything in client_mobs_in_contents) @@ -258,6 +249,15 @@ var/area/areaobj = get_area(client.eye) hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE) +// Root object for parallax, all parallax layers are drawn onto this +INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_home) +/atom/movable/screen/parallax_home + icon = null + blend_mode = BLEND_ADD + plane = PLANE_SPACE_PARALLAX + screen_loc = "CENTER-7,CENTER-7" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + // We need parallax to always pass its args down into initialize, so we immediate init it INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) /atom/movable/screen/parallax_layer @@ -266,9 +266,9 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) var/offset_x = 0 var/offset_y = 0 var/absolute = FALSE + appearance_flags = APPEARANCE_UI | KEEP_TOGETHER blend_mode = BLEND_ADD plane = PLANE_SPACE_PARALLAX - screen_loc = "CENTER-7,CENTER-7" mouse_opacity = MOUSE_OPACITY_TRANSPARENT /atom/movable/screen/parallax_layer/Initialize(mapload, datum/hud/hud_owner, template = FALSE) @@ -302,15 +302,17 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) // Turn the view size into a grid of correctly scaled overlays var/list/viewscales = getviewsize(view) - var/countx = CEILING((viewscales[1] / 2) * parallax_scaler, 1) + 1 - var/county = CEILING((viewscales[2] / 2) * parallax_scaler, 1) + 1 + // This could be half the size but we need to provide space for parallax movement on mob movement, and movement on scroll from shuttles, so like this instead + var/countx = (CEILING((viewscales[1] / 2) * parallax_scaler, 1) + 1) + var/county = (CEILING((viewscales[2] / 2) * parallax_scaler, 1) + 1) var/list/new_overlays = new for(var/x in -countx to countx) for(var/y in -county to county) if(x == 0 && y == 0) continue var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state) - texture_overlay.transform = matrix(1, 0, x*480, 0, 1, y*480) + texture_overlay.pixel_w += 480 * x + texture_overlay.pixel_z += 480 * y new_overlays += texture_overlay cut_overlays() add_overlay(new_overlays) diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index dbf4e0af5310db..f3bb3713225c91 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -41,7 +41,7 @@ /atom/movable/screen/movable/pic_in_pic/proc/make_backgrounds() standard_background = new /mutable_appearance() - standard_background.icon = 'icons/misc/pic_in_pic.dmi' + standard_background.icon = 'icons/hud/pic_in_pic.dmi' standard_background.icon_state = "background" standard_background.layer = SPACE_LAYER @@ -51,7 +51,7 @@ move_tab = new /mutable_appearance() //all these properties are always the same, and since adding something to the overlay //list makes a copy, there is no reason to make a new one each call - move_tab.icon = 'icons/misc/pic_in_pic.dmi' + move_tab.icon = 'icons/hud/pic_in_pic.dmi' move_tab.icon_state = "move" move_tab.plane = HUD_PLANE var/matrix/M = matrix() @@ -63,7 +63,7 @@ button_x = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "close" - MA.icon = 'icons/misc/pic_in_pic.dmi' + MA.icon = 'icons/hud/pic_in_pic.dmi' MA.icon_state = "x" MA.plane = HUD_PLANE button_x.appearance = MA @@ -76,7 +76,7 @@ button_expand = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "expand" - MA.icon = 'icons/misc/pic_in_pic.dmi' + MA.icon = 'icons/hud/pic_in_pic.dmi' MA.icon_state = "expand" MA.plane = HUD_PLANE button_expand.appearance = MA @@ -89,7 +89,7 @@ button_shrink = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "shrink" - MA.icon = 'icons/misc/pic_in_pic.dmi' + MA.icon = 'icons/hud/pic_in_pic.dmi' MA.icon_state = "shrink" MA.plane = HUD_PLANE button_shrink.appearance = MA diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 090b8876cba441..88d5dada28154a 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -197,39 +197,7 @@ if(!R.client) return - if(R.shown_robot_modules && screenmob.hud_used.hud_shown) - //Modules display is shown - screenmob.client.screen += module_store_icon //"store" icon - - if(!R.model.modules) - to_chat(usr, span_warning("Selected model has no modules to select!")) - return - - if(!R.robot_modules_background) - return - - var/display_rows = max(CEILING(length(R.model.get_inactive_modules()) / 8, 1),1) - R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" - screenmob.client.screen += R.robot_modules_background - - var/x = -4 //Start at CENTER-4,SOUTH+1 - var/y = 1 - - for(var/atom/movable/A in R.model.get_inactive_modules()) - //Module is not currently active - screenmob.client.screen += A - if(x < 0) - A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" - else - A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" - SET_PLANE_IMPLICIT(A, ABOVE_HUD_PLANE) - - x++ - if(x == 4) - x = -4 - y++ - - else + if(!R.shown_robot_modules || !screenmob.hud_used.hud_shown) //Modules display is hidden screenmob.client.screen -= module_store_icon //"store" icon @@ -238,6 +206,41 @@ screenmob.client.screen -= A R.shown_robot_modules = 0 screenmob.client.screen -= R.robot_modules_background + return + + //Modules display is shown + screenmob.client.screen += module_store_icon //"store" icon + + if(!R.model.modules) + to_chat(usr, span_warning("Selected model has no modules to select!")) + return + + if(!R.robot_modules_background) + return + + var/list/usable_modules = R.model.get_usable_modules() + + var/display_rows = max(CEILING(length(usable_modules) / 8, 1),1) + R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" + screenmob.client.screen += R.robot_modules_background + + for(var/i in 1 to length(usable_modules)) + var/atom/movable/A = usable_modules[i] + if(A in R.held_items) + //Module is currently active + continue + + // Arrange in a grid x=-4 to 3 and y=1 to display_rows + var/x = (i - 1) % 8 - 4 + var/y = floor((i - 1) / 8) + 1 + + screenmob.client.screen += A + if(x < 0) + A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" + else + A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" + SET_PLANE_IMPLICIT(A, ABOVE_HUD_PLANE) + /datum/hud/robot/persistent_inventory_update(mob/viewer) if(!mymob) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index ea22327f13592a..6f30f2a51355d1 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -793,7 +793,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) food_image = image(icon = food_icon, icon_state = food_icon_state, pixel_x = -5) food_image.plane = plane food_image.appearance_flags |= KEEP_APART // To be unaffected by filters applied to src - food_image.add_filter("simple_outline", 2, outline_filter(1, COLOR_BLACK)) + food_image.add_filter("simple_outline", 2, outline_filter(1, COLOR_BLACK, OUTLINE_SHARP)) underlays += food_image // To be below filters applied to src SetInvisibility(INVISIBILITY_ABSTRACT, name) // Start invisible, update later diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm index 539e6d234c00e0..8ac5f27c4c9b9b 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm @@ -756,26 +756,6 @@ log_game("[key_name(revenant)] was spawned as a revenant by the midround ruleset.") return revenant -/// Midround Sentient Disease Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease - name = "Sentient Disease" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_datum = /datum/antagonist/disease - antag_flag = ROLE_SENTIENT_DISEASE - required_candidates = 1 - minimum_players = 25 - weight = 4 - cost = 8 - repeatable = TRUE - -/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/generate_ruleset_body(mob/applicant) - var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) - virus.key = applicant.key - INVOKE_ASYNC(virus, TYPE_PROC_REF(/mob/camera/disease, pick_name)) - message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by the midround ruleset.") - log_game("[key_name(virus)] was spawned as a sentient disease by the midround ruleset.") - return virus - /// Midround Space Pirates Ruleset (From Ghosts) /datum/dynamic_ruleset/midround/pirates name = "Space Pirates" diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 50e437195a74a7..b117a35718196a 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -65,8 +65,13 @@ SUBSYSTEM_DEF(events) /datum/controller/subsystem/events/proc/reschedule() scheduled = world.time + rand(frequency_lower, max(frequency_lower,frequency_upper)) -//selects a random event based on whether it can occur and it's 'weight'(probability) -/datum/controller/subsystem/events/proc/spawnEvent() +/** + * Selects a random event based on whether it can occur and it's 'weight'(probability) + * + * Arguments: + * * excluded_event - The event path we will be foregoing, if present. + */ +/datum/controller/subsystem/events/proc/spawnEvent(datum/round_event_control/excluded_event) set waitfor = FALSE //for the admin prompt if(!CONFIG_GET(flag/allow_random_events)) return @@ -77,6 +82,8 @@ SUBSYSTEM_DEF(events) var/list/event_roster = list() for(var/datum/round_event_control/event_to_check in control) + if(excluded_event && event_to_check.typepath == excluded_event.typepath) //If an event has been rerolled we won't just roll the same one again. + continue if(!event_to_check.can_spawn_event(players_amt)) continue if(event_to_check.weight < 0) //for round-start events etc. diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm index dc06c2bc6ae7f3..46d5b0fd57ba51 100644 --- a/code/controllers/subsystem/profiler.dm +++ b/code/controllers/subsystem/profiler.dm @@ -1,11 +1,8 @@ -#define PROFILER_FILENAME "profiler.json" -#define SENDMAPS_FILENAME "sendmaps.json" - SUBSYSTEM_DEF(profiler) name = "Profiler" init_order = INIT_ORDER_PROFILER runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY - wait = 3000 + wait = 300 SECONDS var/fetch_cost = 0 var/write_cost = 0 @@ -56,12 +53,12 @@ SUBSYSTEM_DEF(profiler) if(!length(current_profile_data)) //Would be nice to have explicit proc to check this stack_trace("Warning, profiling stopped manually before dump.") - var/prof_file = file("[GLOB.log_directory]/[PROFILER_FILENAME]") + var/prof_file = file("[GLOB.log_directory]/profiler/profiler-[round(world.time * 0.1, 10)].json") if(fexists(prof_file)) fdel(prof_file) if(!length(current_sendmaps_data)) //Would be nice to have explicit proc to check this stack_trace("Warning, sendmaps profiling stopped manually before dump.") - var/sendmaps_file = file("[GLOB.log_directory]/[SENDMAPS_FILENAME]") + var/sendmaps_file = file("[GLOB.log_directory]/profiler/sendmaps-[round(world.time * 0.1, 10)].json") if(fexists(sendmaps_file)) fdel(sendmaps_file) @@ -70,5 +67,3 @@ SUBSYSTEM_DEF(profiler) WRITE_FILE(sendmaps_file, current_sendmaps_data) write_cost = MC_AVERAGE(write_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) -#undef PROFILER_FILENAME -#undef SENDMAPS_FILENAME diff --git a/code/datums/actions/cooldown_action.dm b/code/datums/actions/cooldown_action.dm index 18fe9f22e80245..1c290c5f224c1b 100644 --- a/code/datums/actions/cooldown_action.dm +++ b/code/datums/actions/cooldown_action.dm @@ -171,6 +171,9 @@ next_use_time = world.time + override_cooldown_time else next_use_time = world.time + cooldown_time + // Don't start a cooldown if we have a cooldown time of 0 seconds + if(next_use_time == world.time) + return build_all_button_icons(UPDATE_BUTTON_STATUS) START_PROCESSING(SSfastprocess, src) diff --git a/code/datums/actions/mobs/ground_slam.dm b/code/datums/actions/mobs/ground_slam.dm new file mode 100644 index 00000000000000..e00799196b5898 --- /dev/null +++ b/code/datums/actions/mobs/ground_slam.dm @@ -0,0 +1,32 @@ +/datum/action/cooldown/mob_cooldown/ground_slam + name = "Ground Slam" + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "sniper_zoom" + desc = "Slams the ground sending out a shockwave around you." + cooldown_time = 10 SECONDS + /// The range of the slam + var/range = 5 + /// The delay before the shockwave expands it's range + var/delay = 3 + /// How far hit targets are thrown + var/throw_range = 8 + /// Whether the target can move or not while the slam is occurring + var/can_move = FALSE + +/datum/action/cooldown/mob_cooldown/ground_slam/Activate(atom/target_atom) + disable_cooldown_actions() + RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), override = TRUE) + do_slam(target_atom) + UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE) + StartCooldown() + enable_cooldown_actions() + return TRUE + +/// Slams the ground around the source throwing back enemies caught nearby, delay is for the radius increase +/datum/action/cooldown/mob_cooldown/ground_slam/proc/do_slam(atom/target) + wendigo_slam(owner, range, delay, throw_range) + +/datum/action/cooldown/mob_cooldown/ground_slam/proc/on_move(atom/source, atom/new_loc) + SIGNAL_HANDLER + if(!can_move) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE diff --git a/code/datums/actions/mobs/projectileattack.dm b/code/datums/actions/mobs/projectileattack.dm index be7eff8963363f..d8f8e6bdf64276 100644 --- a/code/datums/actions/mobs/projectileattack.dm +++ b/code/datums/actions/mobs/projectileattack.dm @@ -16,14 +16,23 @@ var/default_projectile_spread = 0 /// The multiplier to the projectiles speed (a value of 2 makes it twice as slow, 0.5 makes it twice as fast) var/projectile_speed_multiplier = 1 + /// Whether the target can move or not while the attack is occurring + var/can_move = TRUE /datum/action/cooldown/mob_cooldown/projectile_attack/Activate(atom/target_atom) disable_cooldown_actions() + RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), override = TRUE) attack_sequence(owner, target_atom) + UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE) StartCooldown() enable_cooldown_actions() return TRUE +/datum/action/cooldown/mob_cooldown/projectile_attack/proc/on_move(atom/source, atom/new_loc) + SIGNAL_HANDLER + if(!can_move) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + /datum/action/cooldown/mob_cooldown/projectile_attack/proc/attack_sequence(mob/living/firer, atom/target) shoot_projectile(firer, target, null, firer, rand(-default_projectile_spread, default_projectile_spread), null) @@ -151,6 +160,25 @@ SLEEP_CHECK_DEATH(1.5 SECONDS, owner) return ..() +/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/wendigo + cooldown_time = 10 SECONDS + projectile_type = /obj/projectile/colossus/wendigo_shockwave/spiral + can_move = FALSE + +/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/wendigo/create_spiral_attack(mob/living/firer, atom/target, negative = pick(TRUE, FALSE)) + wendigo_scream(firer) + var/shots_spiral = 40 + var/angle_to_target = get_angle(firer, target) + var/spiral_direction = pick(-1, 1) + for(var/shot in 1 to shots_spiral) + var/shots_per_tick = 5 - enraged * 3 + var/angle_change = (5 + enraged * shot / 6) * spiral_direction + for(var/count in 1 to shots_per_tick) + var/angle = angle_to_target + shot * angle_change + count * 360 / shots_per_tick + shoot_projectile(firer, target, angle, firer, null, null) + SLEEP_CHECK_DEATH(1, firer) + SLEEP_CHECK_DEATH(3 SECONDS, firer) + /datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe name = "All Directions" button_icon = 'icons/effects/effects.dmi' @@ -192,6 +220,13 @@ shoot_projectile(firer, target, null, firer, spread, null) +/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/wendigo + cooldown_time = 10 SECONDS + projectile_type = /obj/projectile/colossus/wendigo_shockwave + shot_angles = list(-20, -10, 0, 10, 20) + projectile_speed_multiplier = 4 + + /datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/colossus cooldown_time = 0.5 SECONDS @@ -327,3 +362,54 @@ colossus.telegraph() colossus.dir_shots.attack_sequence(firer, target) SLEEP_CHECK_DEATH(1 SECONDS, firer) + +/datum/action/cooldown/mob_cooldown/projectile_attack/alternating_circle + name = "Alternating Shots" + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "sniper_zoom" + desc = "Fires projectiles around you in an alternating fashion." + cooldown_time = 10 SECONDS + projectile_type = /obj/projectile/colossus/wendigo_shockwave + can_move = FALSE + var/enraged = FALSE + +/datum/action/cooldown/mob_cooldown/projectile_attack/alternating_circle/attack_sequence(mob/living/firer, atom/target) + wendigo_scream(firer) + if(enraged) + projectile_speed_multiplier = 1 + else + projectile_speed_multiplier = 1.5 + var/shots_per = 24 + for(var/shoot_times in 1 to 8) + var/offset = shoot_times % 2 + for(var/shot in 1 to shots_per) + var/angle = shot * 360 / shots_per + (offset * 360 / shots_per) * 0.5 + shoot_projectile(firer, target, angle, firer, null, null) + SLEEP_CHECK_DEATH(6 - enraged * 2, firer) + SLEEP_CHECK_DEATH(3 SECONDS, firer) + +/datum/action/cooldown/mob_cooldown/projectile_attack/wave + name = "Wave Shots" + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "sniper_zoom" + desc = "Fires projectiles around you in a circular wave." + cooldown_time = 10 SECONDS + projectile_type = /obj/projectile/colossus/wendigo_shockwave/wave + can_move = FALSE + +/datum/action/cooldown/mob_cooldown/projectile_attack/wave/attack_sequence(mob/living/firer, atom/target) + wendigo_scream(firer) + var/shots_per = 7 + var/difference = 360 / shots_per + var/wave_direction = pick(-1, 1) + switch(wave_direction) + if(-1) + projectile_type = /obj/projectile/colossus/wendigo_shockwave/wave/alternate + if(1) + projectile_type = /obj/projectile/colossus/wendigo_shockwave/wave + for(var/shoot_times in 1 to 32) + for(var/shot in 1 to shots_per) + var/angle = shot * difference + shoot_times * 5 * wave_direction * -1 + shoot_projectile(firer, target, angle, firer, null, null) + SLEEP_CHECK_DEATH(2, firer) + SLEEP_CHECK_DEATH(3 SECONDS, firer) diff --git a/code/datums/actions/mobs/teleport.dm b/code/datums/actions/mobs/teleport.dm new file mode 100644 index 00000000000000..7b7ffddf30b3d6 --- /dev/null +++ b/code/datums/actions/mobs/teleport.dm @@ -0,0 +1,25 @@ +/datum/action/cooldown/mob_cooldown/teleport + name = "Teleport" + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "sniper_zoom" + desc = "Allows you to teleport a certain distance away from a position in a random direction." + cooldown_time = 10 SECONDS + /// The distance from the target + var/radius = 6 + +/datum/action/cooldown/mob_cooldown/teleport/Activate(atom/target_atom) + disable_cooldown_actions() + teleport_to(target_atom) + StartCooldown() + enable_cooldown_actions() + return TRUE + +/// Handles randomly teleporting the owner around the target in view +/datum/action/cooldown/mob_cooldown/teleport/proc/teleport_to(atom/teleport_target) + var/list/possible_ends = view(radius, teleport_target.loc) - view(radius - 1, teleport_target.loc) + for(var/turf/closed/cant_teleport_turf in possible_ends) + possible_ends -= cant_teleport_turf + if(!possible_ends.len) + return + var/turf/end = pick(possible_ends) + do_teleport(owner, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE) diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 1a981f90aedbd8..3753b077a512f1 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -473,7 +473,10 @@ multiple modular subtrees with behaviors /// Use this proc to define how your controller defines what access the pawn has for the sake of pathfinding. Return the access list you want to use /datum/ai_controller/proc/get_access() - return + if(!isliving(pawn)) + return + var/mob/living/living_pawn = pawn + return living_pawn.get_access() ///Returns the minimum required distance to preform one of our current behaviors. Honestly this should just be cached or something but fuck you /datum/ai_controller/proc/get_minimum_distance() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/express_happiness.dm b/code/datums/ai/basic_mobs/basic_subtrees/express_happiness.dm index 74ec9d98191a0c..6cae6132d36887 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/express_happiness.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/express_happiness.dm @@ -7,7 +7,7 @@ var/happiness_key = BB_BASIC_HAPPINESS ///list of emotions we relay when happy var/static/list/happy_emotions = list( - "celebrate happily!", + "celebrates happily!", "dances around in excitement!", ) ///our moderate emotions diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 4884ed8f4332a6..d300fcc371349b 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -144,10 +144,10 @@ // Append radio icon if from a virtual speaker if (extra_classes.Find("virtual-speaker")) - var/image/r_icon = image('icons/ui_icons/chat/chat_icons.dmi', icon_state = "radio") + var/image/r_icon = image('icons/ui/chat/chat_icons.dmi', icon_state = "radio") LAZYADD(prefixes, "\icon[r_icon]") else if (extra_classes.Find("emote")) - var/image/r_icon = image('icons/ui_icons/chat/chat_icons.dmi', icon_state = "emote") + var/image/r_icon = image('icons/ui/chat/chat_icons.dmi', icon_state = "emote") LAZYADD(prefixes, "\icon[r_icon]") chat_color_name_to_use = target.get_visible_name(add_id_name = FALSE) // use face name for nonverbal messages diff --git a/code/datums/components/bloody_spreader.dm b/code/datums/components/bloody_spreader.dm index b30000a115c6a4..823bc5e9507ff3 100644 --- a/code/datums/components/bloody_spreader.dm +++ b/code/datums/components/bloody_spreader.dm @@ -17,7 +17,7 @@ signals_to_add += list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_ATOM, COMSIG_ITEM_HIT_REACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED) var/atom/atom_parent = parent if(atom_parent.atom_storage) - signals_to_add += list(COMSIG_STORAGE_STORED_ITEM) + signals_to_add += list(COMSIG_ATOM_STORED_ITEM) else if(isstructure(parent)) signals_to_add += list(COMSIG_ATOM_ATTACK_HAND) diff --git a/code/datums/components/boomerang.dm b/code/datums/components/boomerang.dm index 13169e4d0cdd06..eec7b4112aa693 100644 --- a/code/datums/components/boomerang.dm +++ b/code/datums/components/boomerang.dm @@ -11,8 +11,10 @@ var/thrower_easy_catch_enabled = FALSE ///This cooldown prevents our 2 throwing signals from firing too often based on how we implement those signals within thrown impacts. COOLDOWN_DECLARE(last_boomerang_throw) + ///Adds an extra big of flavor text on examine. + var/examine_message -/datum/component/boomerang/Initialize(boomerang_throw_range, thrower_easy_catch_enabled) +/datum/component/boomerang/Initialize(boomerang_throw_range, thrower_easy_catch_enabled, examine_message) . = ..() if(!isitem(parent)) //Only items support being thrown around like a boomerang, feel free to make this apply to humans later on. return COMPONENT_INCOMPATIBLE @@ -22,14 +24,18 @@ src.boomerang_throw_range = boomerang_throw_range if(thrower_easy_catch_enabled) src.thrower_easy_catch_enabled = thrower_easy_catch_enabled + if(examine_message) + src.examine_message = examine_message /datum/component/boomerang/RegisterWithParent() RegisterSignal(parent, COMSIG_MOVABLE_POST_THROW, PROC_REF(prepare_throw)) //Collect data on current thrower and the throwing datum RegisterSignal(parent, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(return_missed_throw)) RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, PROC_REF(return_hit_throw)) + if(examine_message) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) /datum/component/boomerang/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_MOVABLE_POST_THROW, COMSIG_MOVABLE_THROW_LANDED, COMSIG_MOVABLE_IMPACT)) + UnregisterSignal(parent, list(COMSIG_MOVABLE_POST_THROW, COMSIG_MOVABLE_THROW_LANDED, COMSIG_MOVABLE_IMPACT, COMSIG_ATOM_EXAMINE)) /** * Proc'd before the first thrown is performed in order to gather information regarding each throw as well as handle throw_mode as necessary. @@ -40,11 +46,13 @@ /datum/component/boomerang/proc/prepare_throw(datum/source, datum/thrownthing/throwingdatum, spin) SIGNAL_HANDLER var/mob/thrower = throwingdatum?.get_thrower() - if(thrower_easy_catch_enabled && thrower) - if(iscarbon(thrower)) - var/mob/living/carbon/carbon_mob = thrower - carbon_mob.throw_mode_on(THROW_MODE_TOGGLE) - return + if(thrower_easy_catch_enabled && iscarbon(thrower)) + var/mob/living/carbon/carbon_mob = thrower + carbon_mob.throw_mode_on(THROW_MODE_TOGGLE) + +/datum/component/boomerang/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += examine_message /** * Proc that triggers when the thrown boomerang hits an object. diff --git a/code/datums/components/clickbox.dm b/code/datums/components/clickbox.dm index 5d840b16a8ed26..b38a5f1c09b453 100644 --- a/code/datums/components/clickbox.dm +++ b/code/datums/components/clickbox.dm @@ -74,7 +74,7 @@ else if(abs_height && abs_height < min_scale) clickbox_height = min_scale/height - clickbox_underlay = mutable_appearance('icons/misc/clickbox.dmi', clickbox_icon_state, CLICKBOX_LAYER, alpha = 1, appearance_flags = RESET_COLOR|RESET_ALPHA) + clickbox_underlay = mutable_appearance('icons/ui/clickbox.dmi', clickbox_icon_state, CLICKBOX_LAYER, alpha = 1, appearance_flags = RESET_COLOR|RESET_ALPHA) clickbox_underlay.transform = clickbox_underlay.transform.Scale(clickbox_width, clickbox_height) //Keeps the underlay more or less centered. clickbox_underlay.pixel_x = x_offset * 1/clickbox_width diff --git a/code/datums/components/creamed.dm b/code/datums/components/creamed.dm index be536bb792d971..d1ff1b792e17a3 100644 --- a/code/datums/components/creamed.dm +++ b/code/datums/components/creamed.dm @@ -50,9 +50,9 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( carbon_parent.add_mood_event("creampie", /datum/mood_event/creampie) carbon_parent.update_body_parts() else if(iscorgi(parent)) - normal_overlay = mutable_appearance('icons/effects/creampie.dmi', "creampie_corgi") + normal_overlay = mutable_appearance('icons/mob/effects/creampie.dmi', "creampie_corgi") else if(isAI(parent)) - normal_overlay = mutable_appearance('icons/effects/creampie.dmi', "creampie_ai") + normal_overlay = mutable_appearance('icons/mob/effects/creampie.dmi', "creampie_ai") RegisterSignals(parent, list( COMSIG_COMPONENT_CLEAN_ACT, diff --git a/code/datums/components/echolocation.dm b/code/datums/components/echolocation.dm index 60a6d0fa8aa3c0..020c47ad875e1b 100644 --- a/code/datums/components/echolocation.dm +++ b/code/datums/components/echolocation.dm @@ -4,11 +4,11 @@ /// Time between echolocations. IMPORTANT!! The effective time in local and the effective time in live are very different. The second is noticeably slower, var/cooldown_time = 1 SECONDS /// Time for the image to start fading out. - var/image_expiry_time = 1.4 SECONDS + var/image_expiry_time = 0.7 SECONDS /// Time for the image to fade in. - var/fade_in_time = 0.4 SECONDS + var/fade_in_time = 0.2 SECONDS /// Time for the image to fade out and delete itself. - var/fade_out_time = 0.4 SECONDS + var/fade_out_time = 0.3 SECONDS /// Are images static? If yes, spawns them on the turf and makes them not change location. Otherwise they change location and pixel shift with the original. var/images_are_static = TRUE /// With mobs that have this echo group in their echolocation receiver trait, we share echo images. @@ -105,7 +105,7 @@ for(var/mob/living/viewer in filtered) if(blocking_trait && HAS_TRAIT(viewer, blocking_trait)) continue - if(HAS_TRAIT_FROM(viewer, TRAIT_ECHOLOCATION_RECEIVER, echo_group)) + if(HAS_TRAIT_FROM(viewer, TRAIT_ECHOLOCATION_RECEIVER, echo_group) && isnull(receivers[viewer])) receivers[viewer] = list() for(var/atom/filtered_atom as anything in filtered) show_image(saved_appearances["[filtered_atom.icon]-[filtered_atom.icon_state]"] || generate_appearance(filtered_atom), filtered_atom, current_time) @@ -175,6 +175,7 @@ for(var/atom/rendered_atom as anything in receivers[echolocate_receiver]) if(receivers[echolocate_receiver][rendered_atom]["time"] <= from_when && echolocate_receiver.client) echolocate_receiver.client.images -= receivers[echolocate_receiver][rendered_atom]["image"] + receivers[echolocate_receiver] -= rendered_atom if(!length(receivers[echolocate_receiver])) receivers -= echolocate_receiver diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index 2763d583f819c9..fb20588f8c5a1b 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -17,6 +17,7 @@ RegisterSignal(parent, COMSIG_FISHING_ROD_CAST, PROC_REF(handle_cast)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examined_more)) + ADD_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src)) /datum/component/fishing_spot/Destroy() fish_source = null diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index fc2081481d937c..0e5341eabbfe5f 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -45,8 +45,6 @@ RegisterSignal(parent, COMSIG_GLASS_DRANK, PROC_REF(try_infect_drink)) if(isorgan(parent)) RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_insertion)) - else if(istype(parent, /obj/effect/decal/cleanable/blood/gibs)) - RegisterSignal(parent, COMSIG_GIBS_STREAK, PROC_REF(try_infect_streak)) /datum/component/infective/proc/on_organ_insertion(obj/item/organ/target, mob/living/carbon/receiver) SIGNAL_HANDLER @@ -180,6 +178,5 @@ COMSIG_ITEM_EQUIPPED, COMSIG_GLASS_DRANK, COMSIG_ORGAN_IMPLANTED, - COMSIG_GIBS_STREAK, )) qdel(GetComponent(/datum/component/connect_loc_behalf)) diff --git a/code/datums/components/profound_fisher.dm b/code/datums/components/profound_fisher.dm new file mode 100644 index 00000000000000..73c12198777ae0 --- /dev/null +++ b/code/datums/components/profound_fisher.dm @@ -0,0 +1,64 @@ +///component that allows player mobs to play the fishing minigame, non-player mobs will "pretend" fish +/datum/component/profound_fisher + ///the fishing rod this mob will use + var/obj/item/fishing_rod/mob_fisher/our_rod + ///if controlled by an AI, the things this mob can "pretend" fish + var/list/npc_fishing_preset + +/datum/component/profound_fisher/Initialize(list/npc_fishing_preset = list()) + if(!isliving(parent)) + return + our_rod = new(parent) + src.npc_fishing_preset = npc_fishing_preset + ADD_TRAIT(parent, TRAIT_PROFOUND_FISHER, REF(src)) + +/datum/component/profound_fisher/RegisterWithParent() + RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + +/datum/component/profound_fisher/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET) + REMOVE_TRAIT(parent, TRAIT_PROFOUND_FISHER, REF(src)) + +/datum/component/profound_fisher/Destroy() + QDEL_NULL(our_rod) + return ..() + +/datum/component/profound_fisher/proc/pre_attack(datum/source, atom/target) + SIGNAL_HANDLER + + if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT)) + return NONE + var/mob/living/living_parent = parent + if(!living_parent.CanReach(target)) + return NONE + if(living_parent.client) + INVOKE_ASYNC(our_rod, TYPE_PROC_REF(/obj/item, melee_attack_chain), parent, target) + else + INVOKE_ASYNC(src, PROC_REF(pretend_fish), target) + return COMPONENT_HOSTILE_NO_ATTACK + +/datum/component/profound_fisher/proc/pretend_fish(atom/target) + var/fishing_type + for(var/type in npc_fishing_preset) + if(!istype(target, type)) + continue + fishing_type = npc_fishing_preset[type] + break + var/datum/fish_source/fish_spot = GLOB.preset_fish_sources[fishing_type] + if(isnull(fish_spot)) + return null + var/obj/effect/fishing_lure/lure = new(get_turf(target), target) + var/mob/living/living_parent = parent + if(!do_after(living_parent, 10 SECONDS, target = target)) + qdel(lure) + return + var/reward_loot = pick_weight(fish_spot.fish_table) + if(ispath(reward_loot)) + new reward_loot(get_turf(living_parent)) + qdel(lure) + +/obj/item/fishing_rod/mob_fisher + display_fishing_line = FALSE + line = /obj/item/fishing_line/reinforced + + diff --git a/code/datums/components/simple_access.dm b/code/datums/components/simple_access.dm index a42d784f0c0543..3038b3532906d5 100644 --- a/code/datums/components/simple_access.dm +++ b/code/datums/components/simple_access.dm @@ -10,6 +10,7 @@ return COMPONENT_INCOMPATIBLE access = new_access RegisterSignal(parent, COMSIG_MOB_TRIED_ACCESS, PROC_REF(on_tried_access)) + RegisterSignal(parent, COMSIG_MOB_RETRIEVE_SIMPLE_ACCESS, PROC_REF(retrieve_access)) if(!donor_atom) return if(isorgan(donor_atom)) @@ -28,6 +29,10 @@ else return ACCESS_DISALLOWED +/datum/component/simple_access/proc/retrieve_access(datum/source, list/access_list) + SIGNAL_HANDLER + access_list += access + /datum/component/simple_access/proc/on_donor_removed(datum/source) SIGNAL_HANDLER qdel(src) diff --git a/code/datums/components/sound_player.dm b/code/datums/components/sound_player.dm index 9bad9718a05370..fc1ff34041c778 100644 --- a/code/datums/components/sound_player.dm +++ b/code/datums/components/sound_player.dm @@ -1,7 +1,7 @@ /** * Sound Player component * - * Component that will play a sound upon recieving some signal + * Component that will play a sound upon receiving some signal */ /datum/component/sound_player ///Volume of the sound when played diff --git a/code/datums/components/throwbonus_on_windup.dm b/code/datums/components/throwbonus_on_windup.dm new file mode 100644 index 00000000000000..ed505d69697dea --- /dev/null +++ b/code/datums/components/throwbonus_on_windup.dm @@ -0,0 +1,172 @@ +/datum/component/throwbonus_on_windup + ///the maximum windup bonus + var/maximum_bonus = 20 + ///additional behavior if we exceed the maximum bonus + var/datum/callback/pass_maximum_callback + ///the player currently winding up their throw + var/datum/weakref/holder + ///the current bonus we are at + var/throwforce_bonus = 0 + ///the bar relaying feedback to the player + var/obj/effect/overlay/windup_bar/our_bar + ///any additional behavior we should look for before applying the bonus + var/datum/callback/apply_bonus_callback + ///sound we play after successfully damaging the enemy with a bonus + var/sound_on_success + ///effect we play after successfully damaging the enemy with a bonus + var/effect_on_success + ///how fast we increase the wind up counter on process + var/windup_increment_speed + ///text we display when we start winding up + var/throw_text + +/datum/component/throwbonus_on_windup/Initialize(maximum_bonus = 20, windup_increment_speed = 1, pass_maximum_callback, apply_bonus_callback, sound_on_success, effect_on_success, throw_text) + . = ..() + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.maximum_bonus = maximum_bonus + src.pass_maximum_callback = pass_maximum_callback + src.apply_bonus_callback = apply_bonus_callback + src.sound_on_success = sound_on_success + src.effect_on_success = effect_on_success + src.windup_increment_speed = windup_increment_speed + src.throw_text = throw_text + +/datum/component/throwbonus_on_windup/proc/on_equip(datum/source, mob/living/equipper, slot) + SIGNAL_HANDLER + + if(!(slot & ITEM_SLOT_HANDS) || holder?.resolve()) + return + holder = WEAKREF(equipper) + RegisterSignal(equipper, COMSIG_LIVING_THROW_MODE_TOGGLE, PROC_REF(throw_change)) + RegisterSignal(equipper, COMSIG_MOB_SWAP_HANDS, PROC_REF(on_hands_swap)) + if(equipper.throw_mode) + start_windup() + +/datum/component/throwbonus_on_windup/proc/start_windup() + + throwforce_bonus = initial(throwforce_bonus) + var/mob/living/our_holder = holder?.resolve() + if(isnull(holder)) + return + if(throw_text) + to_chat(our_holder, span_warning(throw_text)) + var/list/offset_to_add = get_icon_dimensions(our_holder.icon) + var/x_position = CEILING(offset_to_add["width"] * 0.5, 1) + our_bar = new() + our_bar.maximum_count = maximum_bonus + our_bar.pixel_x = x_position + our_holder.vis_contents += our_bar + START_PROCESSING(SSfastprocess, src) + +/datum/component/throwbonus_on_windup/RegisterWithParent() + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + RegisterSignal(parent, COMSIG_MOVABLE_PRE_IMPACT, PROC_REF(on_thrown)) + +/datum/component/throwbonus_on_windup/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_PRE_IMPACT)) + var/atom/our_holder = holder?.resolve() + if(!isnull(our_holder)) + UnregisterSignal(our_holder, list(COMSIG_LIVING_THROW_MODE_TOGGLE, COMSIG_MOB_SWAP_HANDS)) + +/datum/component/throwbonus_on_windup/Destroy() + STOP_PROCESSING(SSfastprocess, src) + QDEL_NULL(our_bar) + holder = null + return ..() + +/datum/component/throwbonus_on_windup/proc/throw_change(datum/source, throw_mode) + SIGNAL_HANDLER + + if(throw_mode) + start_windup() + else + end_windup() + +/datum/component/throwbonus_on_windup/proc/on_hands_swap(mob/living/source) + SIGNAL_HANDLER + + if(source.get_active_held_item() != parent) + end_windup() + return + + if(source.throw_mode) + start_windup() + +/datum/component/throwbonus_on_windup/process(seconds_per_tick) + if(throwforce_bonus > maximum_bonus) + var/mob/living/our_holder = holder?.resolve() + pass_maximum_callback?.Invoke(our_holder) + end_windup() + return PROCESS_KILL + + our_bar.recalculate_position(min(throwforce_bonus, maximum_bonus)) + throwforce_bonus += windup_increment_speed + +/datum/component/throwbonus_on_windup/proc/on_move(obj/item/source, atom/entering_loc) + SIGNAL_HANDLER + end_windup() + var/mob/living/our_holder = holder?.resolve() + if(isnull(our_holder)) + return + holder = null + UnregisterSignal(our_holder, list(COMSIG_LIVING_THROW_MODE_TOGGLE, COMSIG_MOB_SWAP_HANDS)) + +/datum/component/throwbonus_on_windup/proc/end_windup() + QDEL_NULL(our_bar) + STOP_PROCESSING(SSfastprocess, src) + +/datum/component/throwbonus_on_windup/proc/on_thrown(datum/source, atom/hit_atom, datum/thrownthing/throwingdatum) + SIGNAL_HANDLER + + var/damage_to_apply = throwforce_bonus + throwforce_bonus = initial(throwforce_bonus) + if(!isliving(hit_atom)) + return + + if(apply_bonus_callback && !apply_bonus_callback.Invoke(hit_atom, damage_to_apply)) + return + + if(effect_on_success) + new effect_on_success(get_turf(hit_atom)) + if(sound_on_success) + playsound(hit_atom, sound_on_success, 50, TRUE) + + var/mob/living/living_target = hit_atom + living_target.apply_damage(damage_to_apply) + +/obj/effect/overlay/windup_bar + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE + vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE + icon = 'icons/effects/effects.dmi' + icon_state = "windup_bar" + layer = ABOVE_ALL_MOB_LAYER + ///the maximum windup bonus + var/maximum_count = INFINITY + ///the current count we are at + var/current_count = 0 + +/obj/effect/overlay/windup_bar/proc/recalculate_position(input_count) + current_count = input_count + update_appearance(UPDATE_OVERLAYS) + +/obj/effect/overlay/windup_bar/update_overlays() + . = ..() + var/static/list/bar_positions = list(0, 2, 4, 6, 8) + var/current_percentage = current_count / maximum_count + var/bars_to_add = CEILING(length(bar_positions) * current_percentage, 1) + for(var/curr_number in 1 to bars_to_add) + var/bar_color + switch(curr_number) + if(1 to 2) + bar_color = "windup_red" + if(2 to 4) + bar_color = "windup_green" + if(4 to 5) + bar_color = "windup_purple" + var/mutable_appearance/bar_overlay = mutable_appearance(icon = icon, icon_state = bar_color, layer = ABOVE_HUD_PLANE) + bar_overlay.pixel_y = bar_positions[curr_number] + . += bar_overlay diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index bc60049e73ea69..da0a849989ec10 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -140,9 +140,9 @@ if(affected_mob.mob_mood) // this and most other modifiers below a shameless rip from sleeping healing buffs, but feeling good helps make it go away quicker switch(affected_mob.mob_mood.sanity_level) if(SANITY_LEVEL_GREAT) - recovery_prob += 0.2 + recovery_prob += 0.4 if(SANITY_LEVEL_NEUTRAL) - recovery_prob += 0.1 + recovery_prob += 0.2 if(SANITY_LEVEL_DISTURBED) recovery_prob += 0 if(SANITY_LEVEL_UNSTABLE) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 93edea10b41c60..3d8bfdf8837dd8 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -266,12 +266,13 @@ properties["severity"] = round((properties["severity"] / 2), 1) properties["severity"] *= (symptoms.len / VIRUS_SYMPTOM_LIMIT) //fewer symptoms, less severity properties["severity"] = clamp(properties["severity"], 1, 7) + properties["capacity"] = get_symptom_weights() // Assign the properties that are in the list. /datum/disease/advance/proc/assign_properties() if(properties?.len) - if(properties["stealth"] >= 2) + if(properties["stealth"] >= properties["severity"]) visibility_flags |= HIDDEN_SCANNER else visibility_flags &= ~HIDDEN_SCANNER @@ -287,7 +288,7 @@ spreading_modifier = max(CEILING(0.4 * properties["transmittable"], 1), 1) cure_chance = clamp(7.5 - (0.5 * properties["resistance"]), 1, 10) // can be between 1 and 10 - stage_prob = max(0.5 * properties["stage_rate"], 1) + stage_prob = max(0.3 * properties["stage_rate"], 1) set_severity(round(properties["severity"]), 1) generate_cure(properties) else @@ -341,7 +342,7 @@ // Will generate a random cure, the more resistance the symptoms have, the harder the cure. /datum/disease/advance/proc/generate_cure() if(properties?.len) - var/res = clamp(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) + var/res = clamp(properties["resistance"] - (symptoms.len * 0.5), 1, advance_cures.len) if(res == oldres) return cures = list(pick(advance_cures[res])) @@ -402,11 +403,9 @@ // Add a symptom, if it is over the limit we take a random symptom away and add the new one. /datum/disease/advance/proc/AddSymptom(datum/symptom/S) - if(HasSymptom(S)) return - - if(symptoms.len >= VIRUS_SYMPTOM_LIMIT) + while(get_symptom_weights() > VIRUS_SYMPTOM_LIMIT + S.weight) RemoveSymptom(pick(symptoms)) symptoms += S S.OnAdd(src) @@ -423,6 +422,12 @@ S.name += " (neutered)" S.OnRemove(src) +/// How much of the symptom capacity is currently being used? +/datum/disease/advance/proc/get_symptom_weights() + . = 0 + for(var/datum/symptom/symptom as anything in symptoms) + . += symptom.weight + /* Static Procs diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index 7368e99acc8142..0a29a633a30aec 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -10,6 +10,7 @@ name = "Cough" desc = "The virus irritates the throat of the host, causing occasional coughing. Each cough will try to infect bystanders who are within 1 tile of the host with the virus." illness = "Jest Infection" + weight = 2 stealth = -1 resistance = 3 stage_speed = 1 diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 14a087da1238f4..6771d57f20bca2 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -10,6 +10,7 @@ name = "Sneezing" desc = "The virus causes irritation of the nasal cavity, making the host sneeze occasionally. Sneezes from this symptom will spread the virus in a 4 meter cone in front of the host." illness = "Bard Flu" + weight = 2 stealth = -2 resistance = 3 stage_speed = 0 diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index 28ba45f8de4e0f..5a4331b3c61839 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -39,6 +39,8 @@ var/naturally_occuring = TRUE ///If the symptom requires an organ for the effects to function, robotic organs are immune to disease unless inorganic biology symptom is present var/required_organ + /// How much space does this symptom use? + var/weight = 1 /datum/symptom/New() var/list/S = SSdisease.list_symptoms @@ -106,6 +108,7 @@ var/list/data = list() data["name"] = name data["desc"] = desc + data["weight"] = weight data["stealth"] = stealth data["resistance"] = resistance data["stage_speed"] = stage_speed diff --git a/code/datums/elements/cult_halo.dm b/code/datums/elements/cult_halo.dm index d6da6d8145ad91..684144ca0ab032 100644 --- a/code/datums/elements/cult_halo.dm +++ b/code/datums/elements/cult_halo.dm @@ -27,7 +27,7 @@ return ADD_TRAIT(target, TRAIT_CULT_HALO, CULT_TRAIT) - var/mutable_appearance/new_halo_overlay = mutable_appearance('icons/effects/cult/halo.dmi', "halo[rand(1, 6)]", -HALO_LAYER) + var/mutable_appearance/new_halo_overlay = mutable_appearance('icons/mob/effects/halo.dmi', "halo[rand(1, 6)]", -HALO_LAYER) if (ishuman(target)) var/mob/living/carbon/human/human_parent = target new /obj/effect/temp_visual/cult/sparks(get_turf(human_parent), human_parent.dir) diff --git a/code/datums/elements/lazy_fishing_spot.dm b/code/datums/elements/lazy_fishing_spot.dm index 82323372e6a025..901b163af1538b 100644 --- a/code/datums/elements/lazy_fishing_spot.dm +++ b/code/datums/elements/lazy_fishing_spot.dm @@ -14,11 +14,12 @@ if(!ispath(configuration, /datum/fish_source) || configuration == /datum/fish_source) CRASH("Lazy fishing spot has incorrect configuration passed in: [configuration].") src.configuration = configuration - + ADD_TRAIT(target, TRAIT_FISHING_SPOT, REF(src)) RegisterSignal(target, COMSIG_PRE_FISHING, PROC_REF(create_fishing_spot)) /datum/element/lazy_fishing_spot/Detach(datum/target) UnregisterSignal(target, COMSIG_PRE_FISHING) + REMOVE_TRAIT(target, TRAIT_FISHING_SPOT, REF(src)) return ..() /datum/element/lazy_fishing_spot/proc/create_fishing_spot(datum/source) diff --git a/code/datums/elements/ranged_armour.dm b/code/datums/elements/ranged_armour.dm index 61a3bc647d628c..6d1322c687b1ac 100644 --- a/code/datums/elements/ranged_armour.dm +++ b/code/datums/elements/ranged_armour.dm @@ -53,7 +53,7 @@ /// Ignore thrown damage based on projectile properties. There's no elegant way to multiply the damage because throwforce is persistent. /datum/element/ranged_armour/proc/pre_thrown_impact(atom/parent, obj/item/hit_atom, datum/thrownthing/throwingdatum) SIGNAL_HANDLER - if (!isitem(hit_atom)) + if (!isitem(hit_atom) || HAS_TRAIT(hit_atom, TRAIT_BYPASS_RANGED_ARMOR)) return if (hit_atom.throwforce >= minimum_thrown_force) return diff --git a/code/datums/elements/rust.dm b/code/datums/elements/rust.dm index 51532031b0ee8e..dd3bff91fc46ec 100644 --- a/code/datums/elements/rust.dm +++ b/code/datums/elements/rust.dm @@ -98,6 +98,8 @@ UnregisterSignal(source, COMSIG_ATOM_EXITED) for(var/obj/effect/glowing_rune/rune_to_remove in source) qdel(rune_to_remove) + for(var/mob/living/victim in source) + victim.remove_status_effect(/datum/status_effect/rust_corruption) /datum/element/rust/heretic/proc/on_entered(turf/source, atom/movable/entered, ...) SIGNAL_HANDLER diff --git a/code/datums/greyscale/README.md b/code/datums/greyscale/README.md index 65f5c488790bf5..9ff6bbca1d1899 100644 --- a/code/datums/greyscale/README.md +++ b/code/datums/greyscale/README.md @@ -63,7 +63,7 @@ In this example, we start off by creating a sprite specified by a different conf The first of the two in the inner group is an "icon_state", this means that the icon will be retrieved from the associated dmi file using the "icon_state" key. -Note that you don't need to give colors to every layer if the layer does not need any colors applied to it, such as if it's a pre-colored component. +Note that you don't need to give colors to every layer if the layer does not need any colors applied to it, such as if it's a pre-colored component. In this example, the last layer is one such example, referencing a separately colored config. "blend_mode" and "color_ids" are special, all layer types have them. The blend mode is what controls how that layer's finished product gets merged together with the rest of the sprite. The color ids control what colors are passed in to the layer. @@ -128,7 +128,7 @@ While creating a greyscale config, be sure to take subtypes into account! Rather ```c /datum/greyscale_config/tablet name = "PDA" - icon_file = 'icons/obj/modular_pda.dmi' + icon_file = 'icons/obj/devices/modular_pda.dmi' json_config = 'code/datums/greyscale/json_configs/pda.json' /datum/greyscale_config/tablet/chaplain diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm index 6b9465bf46af07..69e78ec74b31e0 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm @@ -122,7 +122,7 @@ /datum/greyscale_config/tablet name = "PDA" - icon_file = 'icons/obj/modular_pda.dmi' + icon_file = 'icons/obj/devices/modular_pda.dmi' json_config = 'code/datums/greyscale/json_configs/pda.json' /datum/greyscale_config/tablet/chaplain diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index 3aaeb093b92516..f7597da54cc489 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -553,7 +553,7 @@ /// Sets us to the passed job datum, then greets them to their new job. /// Use this one for when you're assigning this mind to a new job for the first time, -/// or for when someone's recieving a job they'd really want to be greeted to. +/// or for when someone's receiving a job they'd really want to be greeted to. /datum/mind/proc/set_assigned_role_with_greeting(datum/job/new_role, client/incoming_client) . = set_assigned_role(new_role) if(assigned_role != new_role) diff --git a/code/datums/quirks/negative_quirks/allergic.dm b/code/datums/quirks/negative_quirks/allergic.dm index 64b4c560bde969..8588b95e6e33ca 100644 --- a/code/datums/quirks/negative_quirks/allergic.dm +++ b/code/datums/quirks/negative_quirks/allergic.dm @@ -55,14 +55,19 @@ return var/mob/living/carbon/carbon_quirk_holder = quirk_holder + //Just halts the progression, I'd suggest you run to medbay asap to get it fixed + if(carbon_quirk_holder.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) + for(var/allergy in allergies) + var/datum/reagent/instantiated_med = carbon_quirk_holder.reagents.has_reagent(allergy) + if(!instantiated_med) + continue + instantiated_med.reagent_removal_skip_list |= ALLERGIC_REMOVAL_SKIP + return //block damage so long as epinephrine exists + for(var/allergy in allergies) var/datum/reagent/instantiated_med = carbon_quirk_holder.reagents.has_reagent(allergy) if(!instantiated_med) continue - //Just halts the progression, I'd suggest you run to medbay asap to get it fixed - if(carbon_quirk_holder.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) - instantiated_med.reagent_removal_skip_list |= ALLERGIC_REMOVAL_SKIP - return //intentionally stops the entire proc so we avoid the organ damage after the loop instantiated_med.reagent_removal_skip_list -= ALLERGIC_REMOVAL_SKIP carbon_quirk_holder.adjustToxLoss(3 * seconds_per_tick) carbon_quirk_holder.reagents.add_reagent(/datum/reagent/toxin/histamine, 3 * seconds_per_tick) diff --git a/code/datums/screentips/screentips.dm b/code/datums/screentips/screentips.dm index d72e41960e5050..20a7f334974005 100644 --- a/code/datums/screentips/screentips.dm +++ b/code/datums/screentips/screentips.dm @@ -1,4 +1,4 @@ -#define HINT_ICON_FILE 'icons/ui_icons/screentips/cursor_hints.dmi' +#define HINT_ICON_FILE 'icons/ui/screentips/cursor_hints.dmi' /// Stores the cursor hint icons for screentip context. GLOBAL_LIST_INIT_TYPED(screentip_context_icons, /image, prepare_screentip_context_icons()) diff --git a/code/datums/status_effects/debuffs/tox_vomit.dm b/code/datums/status_effects/debuffs/tox_vomit.dm new file mode 100644 index 00000000000000..c1f5aa651efb46 --- /dev/null +++ b/code/datums/status_effects/debuffs/tox_vomit.dm @@ -0,0 +1,23 @@ +/// Simple status effect applied when a mob has high toxins and starts to vomit regularly +/datum/status_effect/tox_vomit + id = "vomitting_from_toxins" + tick_interval = 2 SECONDS + alert_type = null + /// Has a chance to count up every tick, until it reaches a threshold, which causes the mob to vomit and resets + VAR_PRIVATE/puke_counter = 0 + +/datum/status_effect/tox_vomit/tick(seconds_between_ticks) + if(!AT_TOXIN_VOMIT_THRESHOLD(owner)) + qdel(src) + return + + if(owner.stat == DEAD || HAS_TRAIT(owner, TRAIT_STASIS)) + return + + puke_counter += SPT_PROB(30, seconds_between_ticks) + if(puke_counter < 50) // This is like 150 seconds apparently according to old comments + return + + var/mob/living/carbon/human/sick_guy = owner + sick_guy.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 20) + puke_counter = 0 diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 90e5a00334abfd..023cc066747c90 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -455,6 +455,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return FALSE SEND_SIGNAL(parent, COMSIG_STORAGE_STORED_ITEM, to_insert, user, force) + SEND_SIGNAL(src, COMSIG_STORAGE_STORED_ITEM, to_insert, user, force) to_insert.forceMove(real_location) item_insertion_feedback(user, to_insert, override) parent.update_appearance() @@ -549,6 +550,9 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) refresh_views() parent.update_appearance() + + SEND_SIGNAL(parent, COMSIG_ATOM_REMOVED_ITEM, thing, remove_to_loc, silent) + SEND_SIGNAL(src, COMSIG_STORAGE_REMOVED_ITEM, thing, remove_to_loc, silent) return TRUE /** diff --git a/code/datums/storage/subtypes/cards.dm b/code/datums/storage/subtypes/cards.dm index 8e6a2bfb369ac7..bf9cc6d0d5b585 100644 --- a/code/datums/storage/subtypes/cards.dm +++ b/code/datums/storage/subtypes/cards.dm @@ -15,19 +15,6 @@ . = ..() set_holdable(/obj/item/tcgcard) -/datum/storage/tcg/attempt_remove(obj/item/thing, atom/remove_to_loc, silent = FALSE) - . = ..() - if(!.) - return - - var/obj/item/tcgcard_deck/deck = parent - var/obj/item/tcgcard/card = thing - card.flipped = deck.flipped - card.update_appearance(UPDATE_ICON_STATE) - - if(length(real_location.contents) == 0) - qdel(parent) - /datum/storage/tcg/show_contents(mob/to_show) // sometimes, show contents is called when the mob is already seeing the contents of the deck, to refresh the view. // to avoid spam, we only show the message if they weren't already seeing the contents. diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index dac47d4ea88ad7..394486fef9a241 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -290,7 +290,7 @@ flesh_damage = 5 scar_keyword = "burnmoderate" - simple_desc = "Patient's skin is burned, weakening the limb and multiplying percieved damage!" + simple_desc = "Patient's skin is burned, weakening the limb and multiplying perceived damage!" simple_treat_text = "Ointment will speed up recovery, as will regenerative mesh. Risk of infection is negligible." homemade_treat_text = "Healthy tea will speed up recovery. Salt, or preferably a salt-water mixture, will sanitize the wound, but the former will cause skin irritation, increasing the risk of infection." diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index b1720c45c51c67..9ada7e70a91e06 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -286,7 +286,7 @@ // We're gonna build a light, and mask it with the base turf's appearance // grab a 32x32 square of it // I would like to use GLOB.starbright_overlays here - // But that breaks down for... some? reason. I think recieving a render relay breaks keep_together or something + // But that breaks down for... some? reason. I think receiving a render relay breaks keep_together or something // So we're just gonna accept that this'll break with starlight color changing. hardly matters since this is really only for offset stuff, but I'd love to fix it someday var/mutable_appearance/light = new(GLOB.starlight_objects[GET_TURF_PLANE_OFFSET(generate_for) + 1]) light.render_target = "" diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 296a9031ae27e1..9b33a901d9ebe3 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -353,6 +353,7 @@ created.pixel_x = created.base_pixel_x + rand(-6, 6) created.pixel_y = created.base_pixel_y + rand(-6, 6) created.forceMove(target) + SSblackbox.record_feedback("nested tally", "lathe_printed_items", 1, list("[type]", "[created.type]")) if(is_stack) items_remaining = 0 diff --git a/code/game/machinery/computer/orders/order_computer/order_computer.dm b/code/game/machinery/computer/orders/order_computer/order_computer.dm index 718fa2bc21819b..770897a2fe4fbf 100644 --- a/code/game/machinery/computer/orders/order_computer/order_computer.dm +++ b/code/game/machinery/computer/orders/order_computer/order_computer.dm @@ -208,7 +208,7 @@ GLOBAL_LIST_EMPTY(order_console_products) return TRUE /** - * Checks if an ID card is able to afford the total cost of the current console's grocieries + * Checks if an ID card is able to afford the total cost of the current console's groceries * and deducts the cost if they can. * Args: * card - The ID card we check for balance diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e32b78d9f776c4..ae37691f1c1a11 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1528,10 +1528,12 @@ var/obj/item/electronics/airlock/ae if(!electronics) ae = new/obj/item/electronics/airlock(loc) + if(closeOtherId) + ae.passed_cycle_id = closeOtherId if(length(req_one_access)) ae.one_access = 1 ae.accesses = req_one_access - else + else if(length(req_access)) ae.accesses = req_access else ae = electronics diff --git a/code/game/machinery/mining_weather_monitor.dm b/code/game/machinery/mining_weather_monitor.dm index 65cc4b9347c1ab..32c41871b60dfd 100644 --- a/code/game/machinery/mining_weather_monitor.dm +++ b/code/game/machinery/mining_weather_monitor.dm @@ -2,7 +2,7 @@ /obj/machinery/mining_weather_monitor name = "barometric monitor" desc = "A machine monitoring atmospheric data from mining environments. Provides warnings about incoming weather fronts." - icon = 'icons/obj/miningradio.dmi' + icon = 'icons/obj/devices/miningradio.dmi' icon_state = "wallmount" light_power = 1 light_range = 1.6 diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 064f3d0f5d0b07..c95bffdc626761 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -111,8 +111,6 @@ drydesc = "They look bloody and gruesome while some terrible smell fills the air." decal_reagent = /datum/reagent/consumable/liquidgibs reagent_amount = 5 - ///Information about the diseases our streaking spawns - var/list/streak_diseases /obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases) . = ..() @@ -120,7 +118,6 @@ RegisterSignal(src, COMSIG_MOVABLE_PIPE_EJECTING, PROC_REF(on_pipe_eject)) /obj/effect/decal/cleanable/blood/gibs/Destroy() - LAZYNULL(streak_diseases) return ..() /obj/effect/decal/cleanable/blood/gibs/replace_decal(obj/effect/decal/cleanable/C) @@ -147,8 +144,7 @@ streak(dirs) /obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions, mapload=FALSE) - LAZYINITLIST(streak_diseases) - SEND_SIGNAL(src, COMSIG_GIBS_STREAK, directions, streak_diseases) + SEND_SIGNAL(src, COMSIG_GIBS_STREAK, directions) var/direction = pick(directions) var/delay = 2 var/range = pick(0, 200; 1, 150; 2, 50; 3, 17; 50) //the 3% chance of 50 steps is intentional and played for laughs. @@ -170,7 +166,7 @@ SIGNAL_HANDLER if(NeverShouldHaveComeHere(loc)) return - new /obj/effect/decal/cleanable/blood/splatter(loc, streak_diseases) + new /obj/effect/decal/cleanable/blood/splatter(loc) /obj/effect/decal/cleanable/blood/gibs/up icon_state = "gibup1" diff --git a/code/game/objects/effects/decals/turfdecal/weather.dm b/code/game/objects/effects/decals/turfdecal/weather.dm index 37b4f335e45747..af05e997197278 100644 --- a/code/game/objects/effects/decals/turfdecal/weather.dm +++ b/code/game/objects/effects/decals/turfdecal/weather.dm @@ -19,7 +19,7 @@ /obj/effect/turf_decal/weather/sand name = "sand siding" - icon = 'icons/misc/beach.dmi' + icon = 'icons/obj/fluff/beach.dmi' icon_state = "sand_side" /obj/effect/turf_decal/weather/sand/light diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index cf1257308d944b..4445815a422be6 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -44,7 +44,7 @@ /obj/effect/forcefield/cult name = "glowing wall" desc = "An unholy shield that blocks all attacks." - icon = 'icons/effects/cult/effects.dmi' + icon = 'icons/effects/cult.dmi' icon_state = "cultshield" can_atmos_pass = ATMOS_PASS_NO initial_duration = 20 SECONDS diff --git a/code/game/objects/effects/spawners/random/lavaland_mobs.dm b/code/game/objects/effects/spawners/random/lavaland_mobs.dm index b0957ed84e9457..4c6cf035324592 100644 --- a/code/game/objects/effects/spawners/random/lavaland_mobs.dm +++ b/code/game/objects/effects/spawners/random/lavaland_mobs.dm @@ -56,10 +56,10 @@ icon = 'icons/mob/simple/lavaland/raptor_big.dmi' icon_state = "raptor_red" loot = list( - /mob/living/basic/mining/raptor/red = 20, - /mob/living/basic/mining/raptor/white = 20, - /mob/living/basic/mining/raptor/purple = 20, - /mob/living/basic/mining/raptor/green = 20, - /mob/living/basic/mining/raptor/yellow = 20, - /mob/living/basic/mining/raptor/black = 1, + /mob/living/basic/raptor/red = 20, + /mob/living/basic/raptor/white = 20, + /mob/living/basic/raptor/purple = 20, + /mob/living/basic/raptor/green = 20, + /mob/living/basic/raptor/yellow = 20, + /mob/living/basic/raptor/black = 1, ) diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm index f000aa4c0395fb..a53d4df9b925aa 100644 --- a/code/game/objects/effects/temporary_visuals/cult.dm +++ b/code/game/objects/effects/temporary_visuals/cult.dm @@ -1,6 +1,6 @@ //temporary visual effects(/obj/effect/temp_visual) used by cult stuff /obj/effect/temp_visual/cult - icon = 'icons/effects/cult/effects.dmi' + icon = 'icons/effects/cult.dmi' randomdir = FALSE duration = 10 @@ -18,13 +18,13 @@ icon_state = "bloodout" /obj/effect/temp_visual/dir_setting/cult/phase // The veil shifter teleport - icon = 'icons/effects/cult/effects.dmi' + icon = 'icons/effects/cult.dmi' name = "phase glow" duration = 7 icon_state = "cultin" /obj/effect/temp_visual/dir_setting/cult/phase/out - icon = 'icons/effects/cult/effects.dmi' + icon = 'icons/effects/cult.dmi' icon_state = "cultout" /obj/effect/temp_visual/cult/sac diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 4c8ce41debfeec..d132dd53da8c4f 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -492,7 +492,7 @@ duration = 2 SECONDS /obj/effect/constructing_effect - icon = 'icons/effects/effects_rcd.dmi' + icon = 'icons/effects/rcd.dmi' icon_state = "" layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE diff --git a/code/game/objects/effects/wanted_poster.dm b/code/game/objects/effects/wanted_poster.dm index 001f0119b9d628..ab3661139fbd8c 100644 --- a/code/game/objects/effects/wanted_poster.dm +++ b/code/game/objects/effects/wanted_poster.dm @@ -86,7 +86,7 @@ var/i for(i=1; i <= textLen, i++) var/letter = uppertext(text[i]) - var/icon/letter_icon = icon("icon" = 'icons/misc/Font_Minimal.dmi', "icon_state" = letter) + var/icon/letter_icon = icon("icon" = 'icons/testing/Font_Minimal.dmi', "icon_state" = letter) letter_icon.Shift(EAST, startX) //16 - (2*n) letter_icon.Shift(SOUTH, 2) letter_icon.SwapColor(rgb(255,255,255), color) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index c3621cd3329580..fe03aaaf01e0de 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -454,7 +454,7 @@ if(!COOLDOWN_FINISHED(src, last_holopay_projection)) balloon_alert(user, "still recharging") return - if(can_be_used_in_payment(user)) + if(!can_be_used_in_payment(user)) balloon_alert(user, "no account!") to_chat(user, span_warning("You need a valid bank account to do this.")) return diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 5ba5e6937ca105..504f547b5cb782 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -11,7 +11,7 @@ item_flags = NO_BLOOD_ON_ITEM overlay_speaker_idle = "intercom_s" - overlay_speaker_active = "intercom_recieve" + overlay_speaker_active = "intercom_receive" overlay_mic_idle = "intercom_m" overlay_mic_active = null diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index ffb4f486cb89db..ced454c3d3261c 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -76,7 +76,7 @@ /// overlay when speaker is on var/overlay_speaker_idle = "s_idle" - /// overlay when recieving a message + /// overlay when receiving a message var/overlay_speaker_active = "s_active" /// overlay when mic is on diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 192842e6447b9c..4ab568fdd4f96a 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -11,7 +11,7 @@ /obj/item/restraints breakouttime = 1 MINUTES dye_color = DYE_PRISONER - icon = 'icons/obj/restraints.dmi' + icon = 'icons/obj/weapons/restraints.dmi' /obj/item/restraints/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index ae01c9e70181db..2aaf4024fb83c0 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -433,6 +433,8 @@ for(var/obj/item/reagent_containers/borghypo/H in R.model.modules) H.bypass_protection = TRUE found_hypo = TRUE + for(var/obj/item/reagent_containers/borghypo/H in R.model.emag_modules) + H.bypass_protection = TRUE if(!found_hypo) to_chat(user, span_warning("This unit is already equipped with a piercing hypospray upgrade!")) //check to see if we already have this module @@ -443,6 +445,8 @@ if (.) for(var/obj/item/reagent_containers/borghypo/H in R.model.modules) H.bypass_protection = initial(H.bypass_protection) + for(var/obj/item/reagent_containers/borghypo/H in R.model.emag_modules) + H.bypass_protection = initial(H.bypass_protection) /obj/item/borg/upgrade/surgery_omnitool name = "cyborg surgical omni-tool upgrade" diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm index 028366481d45a5..e156bf8a0a8625 100644 --- a/code/game/objects/items/surgery_tray.dm +++ b/code/game/objects/items/surgery_tray.dm @@ -6,7 +6,7 @@ /obj/item/surgery_tray name = "surgery tray" desc = "A Deforest brand medical cart. It is a folding model, meaning the wheels on the bottom can be retracted and the body used as a tray." - icon = 'icons/obj/medicart.dmi' + icon = 'icons/obj/medical/medicart.dmi' icon_state = "tray" w_class = WEIGHT_CLASS_BULKY slowdown = 1 diff --git a/code/game/objects/items/tcg/tcg.dm b/code/game/objects/items/tcg/tcg.dm index 61d0dbe071d9cd..fc2eeba82ff727 100644 --- a/code/game/objects/items/tcg/tcg.dm +++ b/code/game/objects/items/tcg/tcg.dm @@ -196,6 +196,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) /obj/item/tcgcard_deck/Initialize(mapload) . = ..() create_storage(storage_type = /datum/storage/tcg) + RegisterSignal(atom_storage, COMSIG_STORAGE_REMOVED_ITEM, PROC_REF(on_item_removed)) /obj/item/tcgcard_deck/update_icon_state() if(!flipped) @@ -314,6 +315,21 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) nu_card.update_icon_state() update_icon_state() +/** + * Signal handler for COMSIG_STORAGE_REMOVED_ITEM. Qdels src if contents are empty, flips the removed card if needed. + */ +/obj/item/tcgcard_deck/proc/on_item_removed(datum/storage/storage_datum, obj/item/thing, atom/remove_to_loc, silent = FALSE) + SIGNAL_HANDLER + + if (!istype(thing, /obj/item/tcgcard)) + return + var/obj/item/tcgcard/card = thing + card.flipped = flipped + card.update_appearance(UPDATE_ICON_STATE) + + if(length(contents) == 0) + qdel(src) + /obj/item/cardpack name = "Trading Card Pack: Coder" desc = "Contains six complete fuckups by the coders. Report this on github please!" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 7f0e28c95e670b..faf8862e1169d4 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1071,7 +1071,7 @@ */ /obj/item/toy/beach_ball name = "beach ball" - icon = 'icons/misc/beach.dmi' + icon = 'icons/obj/fluff/beach.dmi' icon_state = "ball" inhand_icon_state = "beachball" w_class = WEIGHT_CLASS_BULKY //Stops people from hiding it in their bags/pockets @@ -1426,7 +1426,7 @@ /obj/item/toy/seashell name = "seashell" desc = "May you always have a shell in your pocket and sand in your shoes. Whatever that's supposed to mean." - icon = 'icons/misc/beach.dmi' + icon = 'icons/obj/fluff/beach.dmi' icon_state = "shell1" var/static/list/possible_colors = list("" = 2, COLOR_PURPLE_GRAY = 1, COLOR_OLIVE = 1, COLOR_PALE_BLUE_GRAY = 1, COLOR_RED_GRAY = 1) diff --git a/code/game/objects/items/virgin_mary.dm b/code/game/objects/items/virgin_mary.dm index b0446abadbdfde..46264dc2814582 100644 --- a/code/game/objects/items/virgin_mary.dm +++ b/code/game/objects/items/virgin_mary.dm @@ -1,7 +1,7 @@ /obj/item/virgin_mary name = "\proper a picture of the virgin mary" desc = "A small, cheap icon depicting the virgin mother." - icon = 'icons/obj/blackmarket.dmi' + icon = 'icons/obj/devices/blackmarket.dmi' icon_state = "madonna" resistance_flags = FLAMMABLE ///Has this item been used already. diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index f7717da19e7959..54f77ff1b70fae 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -636,7 +636,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/melee/skateboard name = "skateboard" desc = "A skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/mob/rideables/vehicles.dmi' icon_state = "skateboard_held" inhand_icon_state = "skateboard" force = 12 diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 6d8e8ca701e3a6..f0c855e7c74d94 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -276,6 +276,10 @@ //we are the parent node parent_node = src + return INITIALIZE_HINT_LATELOAD + +// we do this in LateInitialize() because weeds on the same loc may not be done initializing yet (as in create_and_destroy) +/obj/structure/alien/weeds/node/LateInitialize() //destroy any non-node weeds on turf var/obj/structure/alien/weeds/check_weed = locate(/obj/structure/alien/weeds) in loc if(check_weed && check_weed != src) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index f75a8b9ce726c7..5daf96a01b8846 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -61,9 +61,6 @@ /obj/structure/door_assembly/examine(mob/user) . = ..() - var/doorname = "" - if(created_name) - doorname = ", written on it is '[created_name]'" switch(state) if(AIRLOCK_ASSEMBLY_NEEDS_WIRES) if(anchored) @@ -80,8 +77,8 @@ . += span_notice("There are empty slots for mineral covers.") else if(!glass && !noglass) . += span_notice("There are empty slots for glass windows.") - if(doorname) - . += span_notice("There is a small paper placard on the assembly labelled \"[doorname]\".") + if(created_name) + . += span_notice("There is a small paper placard on the assembly, written on it is '[created_name]'.") /obj/structure/door_assembly/attackby(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/pen) && !user.combat_mode) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 2cfd490203c065..49a230d6bdc482 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -499,13 +499,13 @@ /obj/structure/flora/coconuts gender = PLURAL name = "coconuts" - icon = 'icons/misc/beach.dmi' + icon = 'icons/obj/fluff/beach.dmi' icon_state = "coconuts" /obj/structure/flora/tree/palm name = "palm tree" desc = "A tree straight from the tropics." - icon = 'icons/misc/beach2.dmi' + icon = 'icons/obj/fluff/beach2.dmi' icon_state = "palm1" pixel_x = 0 diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index baeb8209447fb2..2158a88a6b656b 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -64,13 +64,13 @@ /obj/structure/showcase/mecha/marauder name = "combat mech exhibit" desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. It is described as the premier unit used to defend corporate interests and employees." - icon = 'icons/mob/mecha.dmi' + icon = 'icons/mob/rideables/mecha.dmi' icon_state = "marauder" /obj/structure/showcase/mecha/ripley name = "construction mech exhibit" desc = "A stand with a retired construction mech bolted to it. The clamps are rated at 9300PSI. It seems to be falling apart." - icon = 'icons/mob/mecha.dmi' + icon = 'icons/mob/rideables/mecha.dmi' icon_state = "firefighter" /obj/structure/showcase/machinery/implanter diff --git a/code/game/objects/structures/signs/signs_departments.dm b/code/game/objects/structures/signs/signs_departments.dm index 37015a59cb0871..e663ef2411e629 100644 --- a/code/game/objects/structures/signs/signs_departments.dm +++ b/code/game/objects/structures/signs/signs_departments.dm @@ -8,7 +8,7 @@ /obj/structure/sign/departments/med name = "\improper Medbay sign" sign_change_name = "Department - Medbay" - desc = "A sign labeling an area of medical department." + desc = "A sign labelling an area of the medical department." icon_state = "med" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/med, 32) @@ -23,7 +23,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/med_alt, 32) /obj/structure/sign/departments/medbay name = "\improper Medbay sign" sign_change_name = "Generic Medical" - desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here." + desc = "The intergalactic symbol of medical institutions. You'll probably get help here." icon_state = "bluecross" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/medbay, 32) @@ -84,7 +84,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/virology, 32) /obj/structure/sign/departments/morgue name = "\improper Morgue sign" sign_change_name = "Department - Medbay: Morgue" - desc = "A sign labelling an area where station stores its ever-piling bodies." + desc = "A sign labelling an area where the station stores its ever-piling bodies." icon_state = "morgue" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/morgue, 32) diff --git a/code/game/objects/structures/signs/signs_warning.dm b/code/game/objects/structures/signs/signs_warning.dm index b33d05a163a79c..db44c75669d8a4 100644 --- a/code/game/objects/structures/signs/signs_warning.dm +++ b/code/game/objects/structures/signs/signs_warning.dm @@ -199,7 +199,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/warning/gas_mask, 32) /obj/structure/sign/warning/chem_diamond name = "\improper REACTIVE CHEMICALS sign" sign_change_name = "Warning - Hazardous Chemicals sign" - desc = "A sign that warns of potentially reactive chemicals nearby, be they explosive, flamable, or acidic." + desc = "A sign that warns of potentially reactive chemicals nearby, be they explosive, flammable, or acidic." icon_state = "chemdiamond" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/warning/chem_diamond, 32) diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index d4bab223d45705..0cf5ddf7c91300 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -102,7 +102,7 @@ /obj/structure/trap/stun/hunter name = "bounty trap" desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. You'd better avoid it." - icon = 'icons/obj/restraints.dmi' + icon = 'icons/obj/weapons/restraints.dmi' icon_state = "bounty_trap_on" stun_time = 20 SECONDS sparks = FALSE //the item version gives them off to prevent runtimes (see Destroy()) @@ -143,7 +143,7 @@ /obj/item/bountytrap name = "bounty trap" desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. It's currently inactive." - icon = 'icons/obj/restraints.dmi' + icon = 'icons/obj/weapons/restraints.dmi' icon_state = "bounty_trap_off" var/obj/structure/trap/stun/hunter/stored_trap var/obj/item/radio/radio diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 10b9a58b870075..5f40de037f4aee 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -286,14 +286,17 @@ ADMIN_VERB(create_or_modify_area, R_DEBUG, "Create Or Modify Area", "Create of m return TRUE -/client/proc/adminGreet(logout) - if(SSticker.HasRoundStarted()) - var/string - if(logout && CONFIG_GET(flag/announce_admin_logout)) - string = pick( - "Admin logout: [key_name(src)]") - else if(!logout && CONFIG_GET(flag/announce_admin_login) && (prefs.toggles & ANNOUNCE_LOGIN)) - string = pick( - "Admin login: [key_name(src)]") - if(string) - message_admins("[string]") +/// Sends a message to adminchat when anyone with a holder logs in or logs out. +/// Is dependent on admin preferences and configuration settings, which means that this proc can fire without sending a message. +/client/proc/adminGreet(logout = FALSE) + if(!SSticker.HasRoundStarted()) + return + + if(logout && CONFIG_GET(flag/announce_admin_logout)) + message_admins("Admin logout: [key_name(src)]") + return + + if(!logout && CONFIG_GET(flag/announce_admin_login) && (prefs.toggles & ANNOUNCE_LOGIN)) + message_admins("Admin login: [key_name(src)]") + return + diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index c39706795acd01..9a713588abd6d3 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -391,7 +391,6 @@ ROLE_REV, ROLE_REVENANT, ROLE_REV_HEAD, - ROLE_SENTIENT_DISEASE, ROLE_SPIDER, ROLE_SPY, ROLE_SYNDICATE, diff --git a/code/modules/admin/verbs/lua/lua_state.dm b/code/modules/admin/verbs/lua/lua_state.dm index 27994d966a7cb4..bf2bcbd5a90030 100644 --- a/code/modules/admin/verbs/lua/lua_state.dm +++ b/code/modules/admin/verbs/lua/lua_state.dm @@ -111,8 +111,6 @@ GLOBAL_PROTECT(lua_usr) for(var/path_element in function) new_function_path += path_element function = new_function_path - var/msg = "[key_name(usr)] called the lua function \"[function]\" with arguments: [english_list(call_args)]" - log_lua(msg) var/tmp_usr = GLOB.lua_usr GLOB.lua_usr = usr diff --git a/code/modules/admin/view_variables/color_matrix_editor.dm b/code/modules/admin/view_variables/color_matrix_editor.dm index ea1278901f3fed..6c61382ceec78b 100644 --- a/code/modules/admin/view_variables/color_matrix_editor.dm +++ b/code/modules/admin/view_variables/color_matrix_editor.dm @@ -14,7 +14,7 @@ else current_color = COLOR_MATRIX_IDENTITY - var/mutable_appearance/view = image('icons/misc/colortest.dmi', "colors") + var/mutable_appearance/view = image('icons/testing/colortest.dmi', "colors") if(_target) target = WEAKREF(_target) if(!(_target.appearance_flags & PLANE_MASTER)) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 5a25d68c507a0c..e94e68cab0aedc 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -255,7 +255,7 @@ clicked_on.set_hallucinations_if_lower(240 SECONDS) SEND_SOUND(caller, sound('sound/effects/ghost.ogg', FALSE, TRUE, 50)) - var/image/sparkle_image = image('icons/effects/cult/effects.dmi', clicked_on, "bloodsparkles", ABOVE_MOB_LAYER) + var/image/sparkle_image = image('icons/effects/cult.dmi', clicked_on, "bloodsparkles", ABOVE_MOB_LAYER) clicked_on.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", sparkle_image, NONE) addtimer(CALLBACK(clicked_on, TYPE_PROC_REF(/atom/, remove_alt_appearance), "cult_apoc", TRUE), 4 MINUTES, TIMER_OVERRIDE|TIMER_UNIQUE) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index a9537d26d3802a..cd77799419c6df 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -382,7 +382,7 @@ Striking a noncultist, however, will tear their flesh."} AddComponent( \ /datum/component/shielded, \ recharge_start_delay = 0 SECONDS, \ - shield_icon_file = 'icons/effects/cult/effects.dmi', \ + shield_icon_file = 'icons/effects/cult.dmi', \ shield_icon = "shield-cult", \ run_hit_callback = CALLBACK(src, PROC_REF(shield_damaged)), \ ) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index b75d74ee160029..185770a474b73e 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1141,7 +1141,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) images += B if(!IS_CULTIST(M)) if(M.client) - var/image/C = image('icons/effects/cult/effects.dmi',M,"bloodsparkles", ABOVE_MOB_LAYER) + var/image/C = image('icons/effects/cult.dmi',M,"bloodsparkles", ABOVE_MOB_LAYER) add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, NONE) addtimer(CALLBACK(M, TYPE_PROC_REF(/atom/, remove_alt_appearance),"cult_apoc",TRUE), duration) images += C diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm deleted file mode 100644 index 3267944e05c62d..00000000000000 --- a/code/modules/antagonists/disease/disease_abilities.dm +++ /dev/null @@ -1,465 +0,0 @@ -/* -Abilities that can be purchased by disease mobs. Most are just passive symptoms that will be -added to their disease, but some are active abilites that affect only the target the overmind -is currently following. -*/ - -GLOBAL_LIST_INIT(disease_ability_singletons, list( -new /datum/disease_ability/action/cough, -new /datum/disease_ability/action/sneeze, -new /datum/disease_ability/action/infect, -new /datum/disease_ability/symptom/mild/cough, -new /datum/disease_ability/symptom/mild/sneeze, -new /datum/disease_ability/symptom/medium/shedding, -new /datum/disease_ability/symptom/medium/beard, -new /datum/disease_ability/symptom/medium/hallucigen, -new /datum/disease_ability/symptom/medium/choking, -new /datum/disease_ability/symptom/medium/confusion, -new /datum/disease_ability/symptom/medium/vomit, -new /datum/disease_ability/symptom/medium/voice_change, -new /datum/disease_ability/symptom/medium/visionloss, -new /datum/disease_ability/symptom/medium/deafness, -new /datum/disease_ability/symptom/powerful/narcolepsy, -new /datum/disease_ability/symptom/medium/fever, -new /datum/disease_ability/symptom/medium/chills, -new /datum/disease_ability/symptom/medium/headache, -new /datum/disease_ability/symptom/medium/viraladaptation, -new /datum/disease_ability/symptom/medium/viralevolution, -new /datum/disease_ability/symptom/medium/disfiguration, -new /datum/disease_ability/symptom/medium/polyvitiligo, -new /datum/disease_ability/symptom/medium/itching, -new /datum/disease_ability/symptom/medium/heal/weight_loss, -new /datum/disease_ability/symptom/medium/heal/sensory_restoration, -new /datum/disease_ability/symptom/medium/heal/mind_restoration, -new /datum/disease_ability/symptom/powerful/fire, -new /datum/disease_ability/symptom/powerful/flesh_eating, -new /datum/disease_ability/symptom/powerful/genetic_mutation, -new /datum/disease_ability/symptom/powerful/inorganic_adaptation, -new /datum/disease_ability/symptom/powerful/heal/starlight, -new /datum/disease_ability/symptom/powerful/heal/oxygen, -new /datum/disease_ability/symptom/powerful/heal/chem, -new /datum/disease_ability/symptom/powerful/heal/metabolism, -new /datum/disease_ability/symptom/powerful/heal/dark, -new /datum/disease_ability/symptom/powerful/heal/water, -new /datum/disease_ability/symptom/powerful/heal/plasma, -new /datum/disease_ability/symptom/powerful/heal/radiation, -new /datum/disease_ability/symptom/powerful/heal/coma, -new /datum/disease_ability/symptom/powerful/youth -)) - -/datum/disease_ability - var/name - var/cost = 0 - var/required_total_points = 0 - var/start_with = FALSE - var/short_desc = "" - var/long_desc = "" - var/stat_block = "" - var/threshold_block = list() - var/category = "" - - var/list/symptoms - var/list/actions - -/datum/disease_ability/New() - ..() - if(symptoms) - var/stealth = 0 - var/resistance = 0 - var/stage_speed = 0 - var/transmittable = 0 - for(var/T in symptoms) - var/datum/symptom/S = T - stealth += initial(S.stealth) - resistance += initial(S.resistance) - stage_speed += initial(S.stage_speed) - transmittable += initial(S.transmittable) - threshold_block += initial(S.threshold_descs) - stat_block = "Resistance: [resistance]
Stealth: [stealth]
Stage Speed: [stage_speed]
Transmissibility: [transmittable]

" - if(symptoms.len == 1) //lazy boy's dream - name = initial(S.name) - if(short_desc == "") - short_desc = initial(S.desc) - if(long_desc == "") - long_desc = initial(S.desc) - -/datum/disease_ability/proc/CanBuy(mob/camera/disease/D) - if(world.time < D.next_adaptation_time) - return FALSE - if(!D.unpurchased_abilities[src]) - return FALSE - return (D.points >= cost) && (D.total_points >= required_total_points) - -/datum/disease_ability/proc/Buy(mob/camera/disease/D, silent = FALSE, trigger_cooldown = TRUE) - if(!silent) - to_chat(D, span_notice("Purchased [name].")) - D.points -= cost - D.unpurchased_abilities -= src - if(trigger_cooldown) - D.adapt_cooldown() - D.purchased_abilities[src] = TRUE - for(var/V in (D.disease_instances+D.disease_template)) - var/datum/disease/advance/sentient_disease/SD = V - if(symptoms) - for(var/T in symptoms) - var/datum/symptom/S = new T() - SD.symptoms += S - S.OnAdd(SD) - if(SD.processing) - if(S.Start(SD)) - S.next_activation = world.time + rand(S.symptom_delay_min * 10, S.symptom_delay_max * 10) - SD.Refresh() - for(var/T in actions) - var/datum/action/A = new T() - A.Grant(D) - - -/datum/disease_ability/proc/CanRefund(mob/camera/disease/D) - if(world.time < D.next_adaptation_time) - return FALSE - return D.purchased_abilities[src] - -/datum/disease_ability/proc/Refund(mob/camera/disease/D, silent = FALSE, trigger_cooldown = TRUE) - if(!silent) - to_chat(D, span_notice("Refunded [name].")) - D.points += cost - D.unpurchased_abilities[src] = TRUE - if(trigger_cooldown) - D.adapt_cooldown() - D.purchased_abilities -= src - for(var/V in (D.disease_instances+D.disease_template)) - var/datum/disease/advance/sentient_disease/SD = V - if(symptoms) - for(var/T in symptoms) - var/datum/symptom/S = locate(T) in SD.symptoms - if(S) - SD.symptoms -= S - S.OnRemove(SD) - if(SD.processing) - S.End(SD) - qdel(S) - SD.Refresh() - for(var/T in actions) - var/datum/action/A = locate(T) in D.actions - qdel(A) - -//these sybtypes are for conveniently separating the different categories, they have no unique code. - -/datum/disease_ability/action - category = "Active" - -/datum/disease_ability/symptom - category = "Symptom" - -//active abilities and their associated actions - -/datum/disease_ability/action/cough - name = "Voluntary Coughing" - actions = list(/datum/action/cooldown/disease_cough) - cost = 0 - required_total_points = 0 - start_with = TRUE - short_desc = "Force the host you are following to cough, spreading your infection to those nearby." - long_desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmissibility is low.
Cooldown: 10 seconds" - - -/datum/action/cooldown/disease_cough - name = "Cough" - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "cough" - desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmissibility is low.
Cooldown: 10 seconds" - cooldown_time = 100 - -/datum/action/cooldown/disease_cough/Activate(atom/target) - StartCooldown(10 SECONDS) - trigger_cough() - StartCooldown() - return TRUE - -/* - * Cause a cough to happen from the host. - */ -/datum/action/cooldown/disease_cough/proc/trigger_cough() - var/mob/camera/disease/our_disease = owner - var/mob/living/host = our_disease.following_host - if(!host) - return FALSE - if(host.stat != CONSCIOUS) - to_chat(our_disease, span_warning("Your host must be conscious to cough.")) - return FALSE - to_chat(our_disease, span_notice("You force [host.real_name] to cough.")) - host.emote("cough") - if(host.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth - var/datum/disease/advance/sentient_disease/disease_datum = our_disease.hosts[host] - disease_datum.spread(2) - return TRUE - -/datum/disease_ability/action/sneeze - name = "Voluntary Sneezing" - actions = list(/datum/action/cooldown/disease_sneeze) - cost = 2 - required_total_points = 3 - short_desc = "Force the host you are following to sneeze, spreading your infection to those in front of them." - long_desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host.
Cooldown: 20 seconds" - -/datum/action/cooldown/disease_sneeze - name = "Sneeze" - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "sneeze" - desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host even if your transmissibility is low.
Cooldown: 20 seconds" - cooldown_time = 200 - -/datum/action/cooldown/disease_sneeze/Activate(atom/target) - StartCooldown(10 SECONDS) - trigger_sneeze() - StartCooldown() - return TRUE - -/* - * Cause a sneeze to happen from the host. - */ -/datum/action/cooldown/disease_sneeze/proc/trigger_sneeze() - var/mob/camera/disease/our_disease = owner - var/mob/living/host = our_disease.following_host - if(!host) - return FALSE - if(host.stat != CONSCIOUS) - to_chat(our_disease, span_warning("Your host must be conscious to sneeze.")) - return FALSE - to_chat(our_disease, span_notice("You force [host.real_name] to sneeze.")) - host.emote("sneeze") - if(host.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth - var/datum/disease/advance/sentient_disease/disease_datum = our_disease.hosts[host] - for(var/mob/living/nearby_mob in oview(4, disease_datum.affected_mob)) - if(!is_source_facing_target(disease_datum.affected_mob, nearby_mob)) - continue - if(!disease_air_spread_walk(get_turf(disease_datum.affected_mob), get_turf(nearby_mob))) - continue - nearby_mob.AirborneContractDisease(disease_datum, TRUE) - - return TRUE - -/datum/disease_ability/action/infect - name = "Secrete Infection" - actions = list(/datum/action/cooldown/disease_infect) - cost = 2 - required_total_points = 3 - short_desc = "Cause all objects your host is touching to become infectious for a limited time, spreading your infection to anyone who touches them." - long_desc = "Cause the host you are following to excrete an infective substance from their pores, causing all objects touching their skin to transmit your infection to anyone who touches them for the next 30 seconds. This includes the floor, if they are not wearing shoes, and any items they are holding, if they are not wearing gloves.
Cooldown: 40 seconds" - -/datum/action/cooldown/disease_infect - name = "Secrete Infection" - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "infect" - desc = "Cause the host you are following to excrete an infective substance from their pores, causing all objects touching their skin to transmit your infection to anyone who touches them for the next 30 seconds.
Cooldown: 40 seconds" - cooldown_time = 400 - -/datum/action/cooldown/disease_infect/Activate(atom/target) - StartCooldown(10 SECONDS) - trigger_infection() - StartCooldown() - return TRUE - -/* - * Trigger the infection action. - */ -/datum/action/cooldown/disease_infect/proc/trigger_infection() - var/mob/camera/disease/our_disease = owner - var/mob/living/carbon/human/host = our_disease.following_host - if(!host) - return FALSE - for(var/obj/thing as anything in host.get_equipped_items(include_accessories = TRUE)) - thing.AddComponent(/datum/component/infective, our_disease.disease_template, 300) - //no shoes? infect the floor. - if(!host.shoes) - var/turf/host_turf = get_turf(host) - if(host_turf && !isspaceturf(host_turf)) - host_turf.AddComponent(/datum/component/infective, our_disease.disease_template, 300) - //no gloves? infect whatever we are holding. - if(!host.gloves) - for(var/obj/held_thing as anything in host.held_items) - if(isnull(held_thing)) - continue - held_thing.AddComponent(/datum/component/infective, our_disease.disease_template, 300) - return TRUE - -/*******************BASE SYMPTOM TYPES*******************/ -// cost is for convenience and can be changed. If you're changing req_tot_points then don't use the subtype... -//healing costs more so you have to techswitch from naughty disease otherwise we'd have friendly disease for easy greentext (no fun!) - -/datum/disease_ability/symptom/mild - cost = 2 - required_total_points = 4 - category = "Symptom (Weak)" - -/datum/disease_ability/symptom/medium - cost = 4 - required_total_points = 8 - category = "Symptom" - -/datum/disease_ability/symptom/medium/heal - cost = 5 - category = "Symptom (+)" - -/datum/disease_ability/symptom/powerful - cost = 4 - required_total_points = 16 - category = "Symptom (Strong)" - -/datum/disease_ability/symptom/powerful/heal - cost = 8 - category = "Symptom (Strong+)" - -/******MILD******/ - -/datum/disease_ability/symptom/mild/cough - name = "Involuntary Coughing" - symptoms = list(/datum/symptom/cough) - short_desc = "Cause victims to cough intermittently." - long_desc = "Cause victims to cough intermittently, spreading your infection." - -/datum/disease_ability/symptom/mild/sneeze - name = "Involuntary Sneezing" - symptoms = list(/datum/symptom/sneeze) - short_desc = "Cause victims to sneeze intermittently." - long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmissibility and resistance, at the cost of stealth." - -/******MEDIUM******/ - -/datum/disease_ability/symptom/medium/shedding - symptoms = list(/datum/symptom/shedding) - -/datum/disease_ability/symptom/medium/beard - symptoms = list(/datum/symptom/beard) - short_desc = "Cause all victims to grow a luscious beard." - long_desc = "Cause all victims to grow a luscious beard. Ineffective against Santa Claus." - -/datum/disease_ability/symptom/medium/hallucigen - symptoms = list(/datum/symptom/hallucigen) - short_desc = "Cause victims to hallucinate." - long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance." - -/datum/disease_ability/symptom/medium/choking - symptoms = list(/datum/symptom/choking) - short_desc = "Cause victims to choke." - long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility." - -/datum/disease_ability/symptom/medium/confusion - symptoms = list(/datum/symptom/confusion) - short_desc = "Cause victims to become confused." - long_desc = "Cause victims to become confused intermittently." - -/datum/disease_ability/symptom/medium/vomit - symptoms = list(/datum/symptom/vomit) - short_desc = "Cause victims to vomit." - long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage." - -/datum/disease_ability/symptom/medium/voice_change - symptoms = list(/datum/symptom/voice_change) - short_desc = "Change the voice of victims." - long_desc = "Change the voice of victims, causing confusion in communications." - -/datum/disease_ability/symptom/medium/visionloss - symptoms = list(/datum/symptom/visionloss) - short_desc = "Damage the eyes of victims, eventually causing blindness." - long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats." - -/datum/disease_ability/symptom/medium/deafness - symptoms = list(/datum/symptom/deafness) - -/datum/disease_ability/symptom/medium/fever - symptoms = list(/datum/symptom/fever) - -/datum/disease_ability/symptom/medium/chills - symptoms = list(/datum/symptom/chills) - -/datum/disease_ability/symptom/medium/headache - symptoms = list(/datum/symptom/headache) - -/datum/disease_ability/symptom/medium/viraladaptation - symptoms = list(/datum/symptom/viraladaptation) - short_desc = "Cause your infection to become more resistant to detection and eradication." - long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed." - -/datum/disease_ability/symptom/medium/viralevolution - symptoms = list(/datum/symptom/viralevolution) - -/datum/disease_ability/symptom/medium/polyvitiligo - symptoms = list(/datum/symptom/polyvitiligo) - -/datum/disease_ability/symptom/medium/disfiguration - symptoms = list(/datum/symptom/disfiguration) - -/datum/disease_ability/symptom/medium/itching - symptoms = list(/datum/symptom/itching) - short_desc = "Cause victims to itch." - long_desc = "Cause victims to itch, increasing all stats except stealth." - -/datum/disease_ability/symptom/medium/heal/weight_loss - symptoms = list(/datum/symptom/weight_loss) - short_desc = "Cause victims to lose weight." - long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing." - -/datum/disease_ability/symptom/medium/heal/sensory_restoration - symptoms = list(/datum/symptom/sensory_restoration) - short_desc = "Regenerate eye and ear damage of victims." - long_desc = "Regenerate eye and ear damage of victims." - -/datum/disease_ability/symptom/medium/heal/mind_restoration - symptoms = list(/datum/symptom/mind_restoration) - -/******POWERFUL******/ - -/datum/disease_ability/symptom/powerful/fire - symptoms = list(/datum/symptom/fire) - -/datum/disease_ability/symptom/powerful/flesh_eating - symptoms = list(/datum/symptom/flesh_eating) - -/datum/disease_ability/symptom/powerful/genetic_mutation - symptoms = list(/datum/symptom/genetic_mutation) - cost = 8 - -/datum/disease_ability/symptom/powerful/inorganic_adaptation - symptoms = list(/datum/symptom/inorganic_adaptation) - -/datum/disease_ability/symptom/powerful/narcolepsy - symptoms = list(/datum/symptom/narcolepsy) - -/datum/disease_ability/symptom/powerful/youth - symptoms = list(/datum/symptom/youth) - short_desc = "Cause victims to become eternally young." - long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility." - -/****HEALING SUBTYPE****/ - -/datum/disease_ability/symptom/powerful/heal/starlight - symptoms = list(/datum/symptom/heal/starlight) - -/datum/disease_ability/symptom/powerful/heal/oxygen - symptoms = list(/datum/symptom/oxygen) - -/datum/disease_ability/symptom/powerful/heal/chem - symptoms = list(/datum/symptom/heal/chem) - -/datum/disease_ability/symptom/powerful/heal/metabolism - symptoms = list(/datum/symptom/heal/metabolism) - short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster." - long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly." - -/datum/disease_ability/symptom/powerful/heal/dark - symptoms = list(/datum/symptom/heal/darkness) - -/datum/disease_ability/symptom/powerful/heal/water - symptoms = list(/datum/symptom/heal/water) - -/datum/disease_ability/symptom/powerful/heal/plasma - symptoms = list(/datum/symptom/heal/plasma) - -/datum/disease_ability/symptom/powerful/heal/radiation - symptoms = list(/datum/symptom/heal/radiation) - -/datum/disease_ability/symptom/powerful/heal/coma - symptoms = list(/datum/symptom/heal/coma) - short_desc = "Cause victims to fall into a healing coma when hurt." - long_desc = "Cause victims to fall into a healing coma when hurt." diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm deleted file mode 100644 index 17364feec55977..00000000000000 --- a/code/modules/antagonists/disease/disease_datum.dm +++ /dev/null @@ -1,103 +0,0 @@ -/datum/antagonist/disease - name = "Sentient Disease" - roundend_category = "diseases" - antagpanel_category = ANTAG_GROUP_BIOHAZARDS - show_to_ghosts = TRUE - var/disease_name = "" - -/datum/antagonist/disease/on_gain() - owner.set_assigned_role(SSjob.GetJobType(/datum/job/sentient_disease)) - owner.special_role = ROLE_SENTIENT_DISEASE - var/datum/objective/O = new /datum/objective/disease_infect() - O.owner = owner - objectives += O - - O = new /datum/objective/disease_infect_centcom() - O.owner = owner - objectives += O - - . = ..() - -/datum/antagonist/disease/greet() - . = ..() - to_chat(owner.current, span_notice("Infect members of the crew to gain adaptation points, and spread your infection further.")) - owner.announce_objectives() - -/datum/antagonist/disease/apply_innate_effects(mob/living/mob_override) - if(!istype(owner.current, /mob/camera/disease)) - var/turf/T = get_turf(owner.current) - T = T ? T : SSmapping.get_station_center() - var/mob/camera/disease/D = new /mob/camera/disease(T) - owner.transfer_to(D) - -/datum/antagonist/disease/admin_add(datum/mind/new_owner,mob/admin) - ..() - var/mob/camera/disease/D = new_owner.current - D.pick_name() - -/datum/antagonist/disease/roundend_report() - var/list/result = list() - - result += "Disease name: [disease_name]" - result += printplayer(owner) - - var/win = TRUE - var/objectives_text = "" - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objectives_text += "
Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - objectives_text += "
Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" - win = FALSE - count++ - - result += objectives_text - - var/special_role_text = LOWER_TEXT(name) - - if(win) - result += span_greentext("The [special_role_text] was successful!") - else - result += span_redtext("The [special_role_text] has failed!") - - if(istype(owner.current, /mob/camera/disease)) - var/mob/camera/disease/D = owner.current - result += "[disease_name] completed the round with [D.hosts.len] infected hosts, and reached a maximum of [D.total_points] concurrent infections." - result += "[disease_name] completed the round with the following adaptations:" - var/list/adaptations = list() - for(var/V in D.purchased_abilities) - var/datum/disease_ability/A = V - adaptations += A.name - result += adaptations.Join(", ") - - return result.Join("
") - -/datum/antagonist/disease/get_preview_icon() - var/icon/icon = icon('icons/mob/huds/antag_hud.dmi', "virus_infected") - icon.Blend(COLOR_GREEN_GRAY, ICON_MULTIPLY) - icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE) - return icon - -/datum/objective/disease_infect - explanation_text = "Survive and infect as many people as possible." - -/datum/objective/disease_infect/check_completion() - var/mob/camera/disease/D = owner.current - if(istype(D) && D.hosts.len) //theoretically it should not exist if it has no hosts, but better safe than sorry. - return TRUE - return FALSE - - -/datum/objective/disease_infect_centcom - explanation_text = "Ensure that at least one infected host escapes on the shuttle or an escape pod." - -/datum/objective/disease_infect_centcom/check_completion() - var/mob/camera/disease/D = owner.current - if(!istype(D)) - return FALSE - for(var/V in D.hosts) - var/mob/living/L = V - if(L.onCentCom() || L.onSyndieBase()) - return TRUE - return FALSE diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm deleted file mode 100644 index 8960ac27689939..00000000000000 --- a/code/modules/antagonists/disease/disease_disease.dm +++ /dev/null @@ -1,69 +0,0 @@ -/datum/disease/advance/sentient_disease - form = "Virus" - name = "Sentient Virus" - desc = "An apparently sentient virus, extremely adaptable and resistant to outside sources of mutation." - viable_mobtypes = list(/mob/living/carbon/human) - mutable = FALSE - bypasses_immunity = TRUE - var/mob/camera/disease/overmind - var/disease_id - -/datum/disease/advance/sentient_disease/New() - ..() - GLOB.sentient_disease_instances += src - -/datum/disease/advance/sentient_disease/Destroy() - . = ..() - overmind = null - GLOB.sentient_disease_instances -= src - -/datum/disease/advance/sentient_disease/remove_disease() - if(overmind) - overmind.remove_infection(src) - ..() - -/datum/disease/advance/sentient_disease/infect(mob/living/infectee, make_copy = TRUE) - if(make_copy && overmind && (overmind.disease_template != src)) - overmind.disease_template.infect(infectee, TRUE) //get an updated version of the virus - else - ..() - - -/datum/disease/advance/sentient_disease/IsSame(datum/disease/D) - if(istype(D, /datum/disease/advance/sentient_disease)) - var/datum/disease/advance/sentient_disease/V = D - if(V.overmind == overmind) - return TRUE - return FALSE - - -/datum/disease/advance/sentient_disease/Copy() - var/datum/disease/advance/sentient_disease/D = ..() - D.overmind = overmind - D.disease_id = disease_id - return D - -/datum/disease/advance/sentient_disease/after_add() - if(overmind) - overmind.add_infection(src) - -/datum/disease/advance/sentient_disease/GenerateProperties() - ..() - src.properties["stealth"] += 6 //SD gets an extra bit of stealth, as a treat, to avoid getting caught out so early - -/datum/disease/advance/sentient_disease/GetDiseaseID() - if (!disease_id) //if we don't set this here it can reinfect people after the disease dies, since overmind.tag won't be null when the disease is alive, but will be null afterwards, thus the disease ID changes - disease_id = "[type]|[overmind?.tag]" - return disease_id - -/datum/disease/advance/sentient_disease/generate_cure() - if(cures.len) - return - var/list/not_used = advance_cures.Copy() - not_used.Cut(1, 6) // Removes the first five tiers of cures. - cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used))) - - // Get the cure name from the cure_id - var/datum/reagent/D1 = GLOB.chemical_reagents_list[cures[1]] - var/datum/reagent/D2 = GLOB.chemical_reagents_list[cures[2]] - cure_text = "[D1.name] and [D2.name]" diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm deleted file mode 100644 index acefd0e37173cf..00000000000000 --- a/code/modules/antagonists/disease/disease_mob.dm +++ /dev/null @@ -1,450 +0,0 @@ -#define FREEMOVE_TIME (2 MINUTES) - -/* -A mob of type /mob/camera/disease is an overmind coordinating at least one instance of /datum/disease/advance/sentient_disease -that has infected a host. All instances in a host will be synchronized with the stats of the overmind's disease_template. Any -samples outside of a host will retain the stats they had when they left the host, but infecting a new host will cause -the new instance inside the host to be updated to the template's stats. -*/ - -/mob/camera/disease - name = "Sentient Disease" - real_name = "Sentient Disease" - desc = "" - icon = 'icons/mob/silicon/cameramob.dmi' - icon_state = "marker" - mouse_opacity = MOUSE_OPACITY_ICON - move_on_shuttle = FALSE - invisibility = INVISIBILITY_OBSERVER - see_invisible = SEE_INVISIBLE_LIVING - layer = BELOW_MOB_LAYER - // Pale green, bright enough to have good vision - lighting_cutoff_red = 5 - lighting_cutoff_green = 35 - lighting_cutoff_blue = 20 - sight = SEE_SELF|SEE_THRU - initial_language_holder = /datum/language_holder/universal - - var/freemove = TRUE - var/freemove_end = 0 - var/freemove_end_timerid - - var/datum/action/innate/disease_adapt/adaptation_menu_action - var/datum/disease_ability/examining_ability - var/datum/browser/browser - var/browser_open = FALSE - - var/mob/living/following_host - var/list/disease_instances - var/list/hosts //this list is associative, affected_mob -> disease_instance - var/datum/disease/advance/sentient_disease/disease_template - - var/total_points = 0 - var/points = 0 - - var/last_move_tick = 0 - var/move_delay = 1 - - var/next_adaptation_time = 0 - var/adaptation_cooldown = 600 - - var/list/purchased_abilities - var/list/unpurchased_abilities - -/mob/camera/disease/Initialize(mapload) - .= ..() - - ADD_TRAIT(src, TRAIT_SIXTHSENSE, INNATE_TRAIT) //at least they'll have SOMEONE to talk to - - disease_instances = list() - hosts = list() - - purchased_abilities = list() - unpurchased_abilities = list() - - disease_template = new /datum/disease/advance/sentient_disease() - disease_template.overmind = src - qdel(SSdisease.archive_diseases[disease_template.GetDiseaseID()]) - SSdisease.archive_diseases[disease_template.GetDiseaseID()] = disease_template //important for stuff that uses disease IDs - - var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] - my_hud.show_to(src) - - browser = new /datum/browser(src, "disease_menu", "Adaptation Menu", 1000, 770, src) - - freemove_end = world.time + FREEMOVE_TIME - freemove_end_timerid = addtimer(CALLBACK(src, PROC_REF(infect_random_patient_zero)), FREEMOVE_TIME, TIMER_STOPPABLE) - -/mob/camera/disease/Destroy() - . = ..() - QDEL_NULL(adaptation_menu_action) - disease_template = null - for(var/V in GLOB.sentient_disease_instances) - var/datum/disease/advance/sentient_disease/S = V - if(S.overmind == src) - S.overmind = null - browser = null - -/mob/camera/disease/Login() - . = ..() - if(!. || !client) - return FALSE - if(freemove) - to_chat(src, span_warning("You have [DisplayTimeText(freemove_end - world.time)] to select your first host. Click on a human to select your host.")) - - -/mob/camera/disease/get_status_tab_items() - . = ..() - if(freemove) - . += "Host Selection Time: [round((freemove_end - world.time)/10)]s" - else - . += "Adaptation Points: [points]/[total_points]" - . += "Hosts: [disease_instances.len]" - var/adapt_ready = next_adaptation_time - world.time - if(adapt_ready > 0) - . += "Adaptation Ready: [round(adapt_ready/10, 0.1)]s" - - -/mob/camera/disease/examine(mob/user) - . = ..() - if(isobserver(user)) - . += {"[span_notice("[src] has [points]/[total_points] adaptation points.")] - [span_notice("[src] has the following unlocked:")]"} - for(var/datum/disease_ability/ability in purchased_abilities) - . += span_notice("[ability.name]") - -/mob/camera/disease/say( - message, - bubble_type, - list/spans = list(), - sanitize = TRUE, - datum/language/language, - ignore_spam = FALSE, - forced, - filterproof = FALSE, - message_range = 7, - datum/saymode/saymode, - list/message_mods = list(), -) - if(!message) - return - if(sanitize) - message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) - log_talk(message, LOG_SAY) - var/rendered = "[src] says, \"[message]\"" - for(var/mob/listener in GLOB.mob_list) - if(issentientdisease(listener)) - to_chat(listener, rendered) - else if(isobserver(listener)) - var/link = FOLLOW_LINK(listener, src) - to_chat(listener, "[link] [rendered]") - return - -/mob/camera/disease/Move(NewLoc, Dir = 0) - if(freemove) - forceMove(NewLoc) - else - if(world.time > (last_move_tick + move_delay)) - follow_next(Dir & NORTHWEST) - last_move_tick = world.time - -/mob/camera/disease/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) - if(freemove) - return ..() - return FALSE - -/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) - . = ..() - var/atom/movable/to_follow = speaker - if(radio_freq) - var/atom/movable/virtualspeaker/V = speaker - to_follow = V.source - var/link - if(to_follow in hosts) - link = FOLLOW_LINK(src, to_follow) - else - link = "" - // Create map text prior to modifying message for goonchat - if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) - create_chat_message(speaker, message_language, raw_message, spans) - // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) - to_chat(src, "[link] [message]") - - -/mob/camera/disease/mind_initialize() - . = ..() - if(!mind.has_antag_datum(/datum/antagonist/disease)) - mind.add_antag_datum(/datum/antagonist/disease) - var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - medsensor.show_to(src) - -/mob/camera/disease/proc/pick_name() - var/static/list/taken_names - if(!taken_names) - taken_names = list("Unknown" = TRUE) - for(var/T in (subtypesof(/datum/disease) - /datum/disease/advance)) - var/datum/disease/D = T - taken_names[initial(D.name)] = TRUE - var/set_name - while(!set_name) - var/input = sanitize_name(tgui_input_text(src, "Select a name for your disease", "Select Name", max_length = MAX_NAME_LEN)) - if(!input) - set_name = "Sentient Virus" - break - if(taken_names[input]) - to_chat(src, span_warning("You cannot use the name of such a well-known disease!")) - else - set_name = input - real_name = "[set_name] (Sentient Disease)" - name = "[set_name] (Sentient Disease)" - disease_template.AssignName(set_name) - var/datum/antagonist/disease/A = mind.has_antag_datum(/datum/antagonist/disease) - if(A) - A.disease_name = set_name - -/mob/camera/disease/proc/infect_random_patient_zero(del_on_fail = TRUE) - if(!freemove) - return FALSE - var/list/possible_hosts = list() - var/list/afk_possible_hosts = list() - for(var/i in GLOB.human_list) - var/mob/living/carbon/human/H = i - var/turf/T = get_turf(H) - if((H.stat != DEAD) && T && is_station_level(T.z) && H.CanContractDisease(disease_template)) - if(H.client && !H.client.is_afk()) - possible_hosts += H - else - afk_possible_hosts += H - - shuffle_inplace(possible_hosts) - shuffle_inplace(afk_possible_hosts) - possible_hosts += afk_possible_hosts //ideally we want a not-afk person, but we will settle for an afk one if there are no others (mostly for testing) - - while(possible_hosts.len) - var/mob/living/carbon/human/target = possible_hosts[1] - if(force_infect(target)) - return TRUE - possible_hosts.Cut(1, 2) - - if(del_on_fail) - to_chat(src, span_warning("No hosts were available for your disease to infect.")) - qdel(src) - return FALSE - -/mob/camera/disease/proc/force_infect(mob/living/L) - var/datum/disease/advance/sentient_disease/V = disease_template.Copy() - var/result = L.ForceContractDisease(V, FALSE, TRUE) - if(result && freemove) - end_freemove() - return result - -/mob/camera/disease/proc/end_freemove() - if(!freemove) - return - freemove = FALSE - move_on_shuttle = TRUE - adaptation_menu_action = new /datum/action/innate/disease_adapt() - adaptation_menu_action.Grant(src) - for(var/V in GLOB.disease_ability_singletons) - unpurchased_abilities[V] = TRUE - var/datum/disease_ability/A = V - if(A.start_with && A.CanBuy(src)) - A.Buy(src, TRUE, FALSE) - if(freemove_end_timerid) - deltimer(freemove_end_timerid) - set_sight(SEE_SELF) - -/mob/camera/disease/proc/add_infection(datum/disease/advance/sentient_disease/V) - disease_instances += V - hosts[V.affected_mob] = V - total_points = max(total_points, disease_instances.len) - points += 1 - - var/image/holder = V.affected_mob.hud_list[SENTIENT_DISEASE_HUD] - var/mutable_appearance/MA = new /mutable_appearance(holder) - MA.icon_state = "virus_infected" - MA.layer = BELOW_MOB_LAYER - MA.color = COLOR_GREEN_GRAY - MA.alpha = 200 - holder.appearance = MA - var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] - my_hud.add_atom_to_hud(V.affected_mob) - - to_chat(src, span_notice("A new host, [V.affected_mob.real_name], has been infected.")) - - if(!following_host) - set_following(V.affected_mob) - refresh_adaptation_menu() - -/mob/camera/disease/proc/remove_infection(datum/disease/advance/sentient_disease/V) - if(QDELETED(src)) - disease_instances -= V - hosts -= V.affected_mob - else - to_chat(src, span_notice("One of your hosts, [V.affected_mob.real_name], has been purged of your infection.")) - - var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] - my_hud.remove_atom_from_hud(V.affected_mob) - - if(following_host == V.affected_mob) - follow_next() - - disease_instances -= V - hosts -= V.affected_mob - - if(!disease_instances.len) - to_chat(src, span_userdanger("The last of your infection has disappeared.")) - set_following(null) - qdel(src) - refresh_adaptation_menu() - -/mob/camera/disease/proc/set_following(mob/living/L) - if(following_host) - UnregisterSignal(following_host, COMSIG_MOVABLE_MOVED) - RegisterSignal(L, COMSIG_MOVABLE_MOVED, PROC_REF(follow_mob)) - following_host = L - follow_mob() - -/mob/camera/disease/proc/follow_next(reverse = FALSE) - var/index = hosts.Find(following_host) - if(index) - if(reverse) - index = index == 1 ? hosts.len : index - 1 - else - index = index == hosts.len ? 1 : index + 1 - set_following(hosts[index]) - -/mob/camera/disease/proc/follow_mob(datum/source, newloc, dir) - SIGNAL_HANDLER - - var/turf/T = get_turf(following_host) - if(T) - forceMove(T) - -/mob/camera/disease/DblClickOn(atom/A, params) - if(hosts[A]) - set_following(A) - else - ..() - -/mob/camera/disease/ClickOn(atom/A, params) - if(freemove && ishuman(A)) - var/mob/living/carbon/human/H = A - if(tgui_alert(usr, "Select [H.name] as your initial host?", "Select Host", list("Yes", "No")) != "Yes") - return - if(!freemove) - return - if(QDELETED(H) || !force_infect(H)) - to_chat(src, span_warning("[H ? H.name : "Host"] cannot be infected.")) - else - ..() - -/mob/camera/disease/proc/adapt_cooldown() - to_chat(src, span_notice("You have altered your genetic structure. You will be unable to adapt again for [DisplayTimeText(adaptation_cooldown)].")) - next_adaptation_time = world.time + adaptation_cooldown - addtimer(CALLBACK(src, PROC_REF(notify_adapt_ready)), adaptation_cooldown) - -/mob/camera/disease/proc/notify_adapt_ready() - to_chat(src, span_notice("You are now ready to adapt again.")) - refresh_adaptation_menu() - -/mob/camera/disease/proc/refresh_adaptation_menu() - if(browser_open) - adaptation_menu() - -/mob/camera/disease/proc/adaptation_menu() - var/datum/disease/advance/sentient_disease/DT = disease_template - if(!DT) - return - var/list/dat = list() - - if(examining_ability) - dat += "Back
" - dat += "

[examining_ability.name]

" - dat += "[examining_ability.stat_block][examining_ability.long_desc][examining_ability.threshold_block]" - for(var/entry in examining_ability.threshold_block) - dat += "[entry]: [examining_ability.threshold_block[entry]]
" - else - dat += "

Disease Statistics


\ - Resistance: [DT.totalResistance()]
\ - Stealth: [DT.totalStealth()]
\ - Stage Speed: [DT.totalStageSpeed()]
\ - Transmissibility: [DT.totalTransmittable()]
\ - Cure: [DT.cure_text]" - dat += "

Adaptations

\ - Points: [points] / [total_points]\ - \ - " - for(var/V in GLOB.disease_ability_singletons) - var/datum/disease_ability/A = V - var/purchase_text - if(unpurchased_abilities[A]) - if(A.CanBuy(src)) - purchase_text = "Purchase" - else - purchase_text = "Purchase" - else - if(A.CanRefund(src)) - purchase_text = "Refund" - else - purchase_text = "Refund" - dat += "" - - dat += "
CostUnlockNameTypeDescription
[A.cost][purchase_text][A.required_total_points][A.name][A.category][A.short_desc]

Infect many hosts at once to gain adaptation points.

Infected Hosts

" - for(var/V in hosts) - var/mob/living/L = V - dat += "
[L.real_name]" - - browser.set_content(dat.Join()) - browser.open() - browser_open = TRUE - -/mob/camera/disease/Topic(href, list/href_list) - ..() - if(href_list["close"]) - browser_open = FALSE - if(usr != src) - return - if(href_list["follow_instance"]) - var/mob/living/L = locate(href_list["follow_instance"]) in hosts - set_following(L) - - if(href_list["buy_ability"]) - var/datum/disease_ability/A = locate(href_list["buy_ability"]) in unpurchased_abilities - if(!istype(A)) - return - if(A.CanBuy(src)) - A.Buy(src) - adaptation_menu() - - if(href_list["refund_ability"]) - var/datum/disease_ability/A = locate(href_list["refund_ability"]) in purchased_abilities - if(!istype(A)) - return - if(A.CanRefund(src)) - A.Refund(src) - adaptation_menu() - - if(href_list["examine_ability"]) - var/datum/disease_ability/A = locate(href_list["examine_ability"]) in GLOB.disease_ability_singletons - if(!istype(A)) - return - examining_ability = A - adaptation_menu() - - if(href_list["main_menu"]) - examining_ability = null - adaptation_menu() - - -/datum/action/innate/disease_adapt - name = "Adaptation Menu" - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "disease_menu" - -/datum/action/innate/disease_adapt/Activate() - var/mob/camera/disease/D = owner - D.adaptation_menu() - -#undef FREEMOVE_TIME diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm index 5ab50a8b84f3cd..b4da4018fc129f 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm @@ -5,7 +5,7 @@ desc = "Grants you Mind Gate, a spell \ which deals you 20 brain damage but the target suffers a hallucination,\ is left confused for 10 seconds, suffers oxygen loss and brain damage." - gain_text = "My mind swings open like a gate, and its insight will let me percieve the truth." + gain_text = "My mind swings open like a gate, and its insight will let me perceive the truth." next_knowledge = list( /datum/heretic_knowledge/key_ring, /datum/heretic_knowledge/spell/moon_smile, diff --git a/code/modules/antagonists/malf_ai/malf_ai.dm b/code/modules/antagonists/malf_ai/malf_ai.dm index b76452e6076f39..358b618df99aad 100644 --- a/code/modules/antagonists/malf_ai/malf_ai.dm +++ b/code/modules/antagonists/malf_ai/malf_ai.dm @@ -20,6 +20,8 @@ var/should_give_codewords = TRUE ///since the module purchasing is built into the antag info, we need to keep track of its compact mode here var/module_picker_compactmode = FALSE + ///malf on_gain sound effect. Set here so Infected AI can override + var/malf_sound = 'sound/ambience/antag/malf.ogg' /datum/antagonist/malf_ai/New(give_objectives = TRUE) . = ..() @@ -39,7 +41,8 @@ malfunction_flavor = strings(MALFUNCTION_FLAVOR_FILE, employer) add_law_zero() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) + if(malf_sound) + owner.current.playsound_local(get_turf(owner.current), malf_sound, 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) owner.current.grant_language(/datum/language/codespeak, source = LANGUAGE_MALF) var/datum/atom_hud/data/hackyhud = GLOB.huds[DATA_HUD_MALF_APC] @@ -272,6 +275,8 @@ /datum/antagonist/malf_ai/infected name = "Infected AI" employer = "Infected AI" + can_assign_self_objectives = FALSE + malf_sound = null ///The player, to who is this AI slaved var/datum/mind/boss diff --git a/code/modules/antagonists/nukeop/datums/operative_team.dm b/code/modules/antagonists/nukeop/datums/operative_team.dm index 3345f3cf4d25f9..1e06f32594d849 100644 --- a/code/modules/antagonists/nukeop/datums/operative_team.dm +++ b/code/modules/antagonists/nukeop/datums/operative_team.dm @@ -69,7 +69,7 @@ text += "
" text += "(Syndicates used [TC_uses] TC) [purchases]" if(TC_uses == 0 && GLOB.station_was_nuked && !are_all_operatives_dead()) - text += "[icon2html('icons/ui_icons/antags/badass.dmi', world, "badass")]" + text += "[icon2html('icons/ui/antags/badass.dmi', world, "badass")]" parts += text diff --git a/code/modules/antagonists/obsessed/obsessed.dm b/code/modules/antagonists/obsessed/obsessed.dm index a866ef4c2fc6e6..3d0a0063bf7092 100644 --- a/code/modules/antagonists/obsessed/obsessed.dm +++ b/code/modules/antagonists/obsessed/obsessed.dm @@ -47,7 +47,7 @@ var/icon/final_icon = finish_preview_icon(obsessed_icon) final_icon.Blend( - icon('icons/ui_icons/antags/obsessed.dmi', "obsession"), + icon('icons/ui/antags/obsessed.dmi', "obsession"), ICON_OVERLAY, ANTAGONIST_PREVIEW_ICON_SIZE - 30, 20, diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 5ad5aeecf26c78..d784175d62b6eb 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -349,7 +349,7 @@ if(uplink_owned) var/uplink_text = "(used [used_telecrystals] TC) [purchases]" if((used_telecrystals == 0) && traitor_won) - var/static/icon/badass = icon('icons/ui_icons/antags/badass.dmi', "badass") + var/static/icon/badass = icon('icons/ui/antags/badass.dmi', "badass") uplink_text += "[icon2html(badass, world)]" result += uplink_text diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index b5ed82a7f2b507..be8407c83a468d 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -502,7 +502,11 @@ newstruct.master = stoner var/datum/action/innate/seek_master/seek_master = new seek_master.Grant(newstruct) - target.mind?.transfer_to(newstruct, force_key_move = TRUE) + + if (isnull(target.mind)) + newstruct.key = target.key + else + target.mind.transfer_to(newstruct, force_key_move = TRUE) var/atom/movable/screen/alert/bloodsense/sense_alert if(newstruct.mind && !IS_CULTIST(newstruct) && ((stoner && IS_CULTIST(stoner)) || cultoverride) && SSticker.HasRoundStarted()) newstruct.mind.add_antag_datum(/datum/antagonist/cult/construct) diff --git a/code/modules/asset_cache/assets/adventure.dm b/code/modules/asset_cache/assets/adventure.dm index 65f6c3fe9cc10a..e1a7bae235818d 100644 --- a/code/modules/asset_cache/assets/adventure.dm +++ b/code/modules/asset_cache/assets/adventure.dm @@ -1,7 +1,7 @@ /datum/asset/simple/adventure assets = list( - "default" = 'icons/ui_icons/adventure/default.png', - "grue" = 'icons/ui_icons/adventure/grue.png', - "signal_lost" ='icons/ui_icons/adventure/signal_lost.png', - "trade" = 'icons/ui_icons/adventure/trade.png', + "default" = 'icons/ui/adventure/default.png', + "grue" = 'icons/ui/adventure/grue.png', + "signal_lost" ='icons/ui/adventure/signal_lost.png', + "trade" = 'icons/ui/adventure/trade.png', ) diff --git a/code/modules/asset_cache/assets/arcade.dm b/code/modules/asset_cache/assets/arcade.dm index 338b891190cd43..3a68644d1526bb 100644 --- a/code/modules/asset_cache/assets/arcade.dm +++ b/code/modules/asset_cache/assets/arcade.dm @@ -1,11 +1,11 @@ /datum/asset/simple/arcade assets = list( - "shopkeeper.png" = 'icons/ui_icons/arcade/shopkeeper.png', - "fireplace.png" = 'icons/ui_icons/arcade/fireplace.png', - "boss1.gif" = 'icons/ui_icons/arcade/boss1.gif', - "boss2.gif" = 'icons/ui_icons/arcade/boss2.gif', - "boss3.gif" = 'icons/ui_icons/arcade/boss3.gif', - "boss4.gif" = 'icons/ui_icons/arcade/boss4.gif', - "boss5.gif" = 'icons/ui_icons/arcade/boss5.gif', - "boss6.gif" = 'icons/ui_icons/arcade/boss6.gif', + "shopkeeper.png" = 'icons/ui/arcade/shopkeeper.png', + "fireplace.png" = 'icons/ui/arcade/fireplace.png', + "boss1.gif" = 'icons/ui/arcade/boss1.gif', + "boss2.gif" = 'icons/ui/arcade/boss2.gif', + "boss3.gif" = 'icons/ui/arcade/boss3.gif', + "boss4.gif" = 'icons/ui/arcade/boss4.gif', + "boss5.gif" = 'icons/ui/arcade/boss5.gif', + "boss6.gif" = 'icons/ui/arcade/boss6.gif', ) diff --git a/code/modules/asset_cache/assets/chat.dm b/code/modules/asset_cache/assets/chat.dm index 3765f113dda106..1da0869a85a966 100644 --- a/code/modules/asset_cache/assets/chat.dm +++ b/code/modules/asset_cache/assets/chat.dm @@ -4,11 +4,11 @@ /datum/asset/spritesheet/chat/create_spritesheets() InsertAll("emoji", EMOJI_SET) // pre-loading all lanugage icons also helps to avoid meta - InsertAll("language", 'icons/misc/language.dmi') + InsertAll("language", 'icons/ui/chat/language.dmi') // catch languages which are pulling icons from another file for(var/path in typesof(/datum/language)) var/datum/language/L = path var/icon = initial(L.icon) - if (icon != 'icons/misc/language.dmi') + if (icon != 'icons/ui/chat/language.dmi') var/icon_state = initial(L.icon_state) Insert("language-[icon_state]", icon, icon_state=icon_state) diff --git a/code/modules/asset_cache/assets/circuits.dm b/code/modules/asset_cache/assets/circuits.dm index df9aa1fa6d890f..ea97a907d9301c 100644 --- a/code/modules/asset_cache/assets/circuits.dm +++ b/code/modules/asset_cache/assets/circuits.dm @@ -1,4 +1,4 @@ /datum/asset/simple/circuit_assets assets = list( - "grid_background.png" = 'icons/ui_icons/tgui/grid_background.png' + "grid_background.png" = 'icons/ui/tgui/grid_background.png' ) diff --git a/code/modules/asset_cache/assets/common.dm b/code/modules/asset_cache/assets/common.dm index 1b0fb301a19215..931b4999b430d4 100644 --- a/code/modules/asset_cache/assets/common.dm +++ b/code/modules/asset_cache/assets/common.dm @@ -1,3 +1,3 @@ /datum/asset/simple/namespaced/common - assets = list("padlock.png" = 'icons/ui_icons/common/padlock.png') + assets = list("padlock.png" = 'icons/ui/common/padlock.png') parents = list("common.css" = 'html/browser/common.css') diff --git a/code/modules/asset_cache/assets/condiments.dm b/code/modules/asset_cache/assets/condiments.dm index d5a7490904d334..8b471487324895 100644 --- a/code/modules/asset_cache/assets/condiments.dm +++ b/code/modules/asset_cache/assets/condiments.dm @@ -1,24 +1,24 @@ /datum/asset/spritesheet/simple/condiments name = "condiments" assets = list( - CONDIMASTER_STYLE_FALLBACK = 'icons/ui_icons/condiments/bottle.png', - "flour" = 'icons/ui_icons/condiments/flour.png', - "rice" = 'icons/ui_icons/condiments/rice.png', - "sugar" = 'icons/ui_icons/condiments/sugar.png', - "milk" = 'icons/ui_icons/condiments/milk.png', - "enzyme" = 'icons/ui_icons/condiments/enzyme.png', - "capsaicin" = 'icons/ui_icons/condiments/hotsauce.png', - "frostoil" = 'icons/ui_icons/condiments/coldsauce.png', - "bbqsauce" = 'icons/ui_icons/condiments/bbqsauce.png', - "soymilk" = 'icons/ui_icons/condiments/soymilk.png', - "soysauce" = 'icons/ui_icons/condiments/soysauce.png', - "ketchup" = 'icons/ui_icons/condiments/ketchup.png', - "mayonnaise" = 'icons/ui_icons/condiments/mayonnaise.png', - "oliveoil" = 'icons/ui_icons/condiments/oliveoil.png', - "cooking_oil" = 'icons/ui_icons/condiments/cookingoil.png', - "peanut_butter" = 'icons/ui_icons/condiments/peanutbutter.png', - "cherryjelly" = 'icons/ui_icons/condiments/cherryjelly.png', - "honey" = 'icons/ui_icons/condiments/honey.png', - "blackpepper" = 'icons/ui_icons/condiments/peppermillsmall.png', - "sodiumchloride" = 'icons/ui_icons/condiments/saltshakersmall.png', + CONDIMASTER_STYLE_FALLBACK = 'icons/ui/condiments/bottle.png', + "flour" = 'icons/ui/condiments/flour.png', + "rice" = 'icons/ui/condiments/rice.png', + "sugar" = 'icons/ui/condiments/sugar.png', + "milk" = 'icons/ui/condiments/milk.png', + "enzyme" = 'icons/ui/condiments/enzyme.png', + "capsaicin" = 'icons/ui/condiments/hotsauce.png', + "frostoil" = 'icons/ui/condiments/coldsauce.png', + "bbqsauce" = 'icons/ui/condiments/bbqsauce.png', + "soymilk" = 'icons/ui/condiments/soymilk.png', + "soysauce" = 'icons/ui/condiments/soysauce.png', + "ketchup" = 'icons/ui/condiments/ketchup.png', + "mayonnaise" = 'icons/ui/condiments/mayonnaise.png', + "oliveoil" = 'icons/ui/condiments/oliveoil.png', + "cooking_oil" = 'icons/ui/condiments/cookingoil.png', + "peanut_butter" = 'icons/ui/condiments/peanutbutter.png', + "cherryjelly" = 'icons/ui/condiments/cherryjelly.png', + "honey" = 'icons/ui/condiments/honey.png', + "blackpepper" = 'icons/ui/condiments/peppermillsmall.png', + "sodiumchloride" = 'icons/ui/condiments/saltshakersmall.png', ) diff --git a/code/modules/asset_cache/assets/contracts.dm b/code/modules/asset_cache/assets/contracts.dm index 6ac1a9cb678e27..72bd81572b5fd0 100644 --- a/code/modules/asset_cache/assets/contracts.dm +++ b/code/modules/asset_cache/assets/contracts.dm @@ -1,7 +1,7 @@ /datum/asset/simple/contracts assets = list( - "bluespace.png" = 'icons/ui_icons/contracts/bluespace.png', - "destruction.png" = 'icons/ui_icons/contracts/destruction.png', - "healing.png" = 'icons/ui_icons/contracts/healing.png', - "robeless.png" = 'icons/ui_icons/contracts/robeless.png', + "bluespace.png" = 'icons/ui/contracts/bluespace.png', + "destruction.png" = 'icons/ui/contracts/destruction.png', + "healing.png" = 'icons/ui/contracts/healing.png', + "robeless.png" = 'icons/ui/contracts/robeless.png', ) diff --git a/code/modules/asset_cache/assets/genetics.dm b/code/modules/asset_cache/assets/genetics.dm index d74f10f631bb45..51ac0b47b40f3c 100644 --- a/code/modules/asset_cache/assets/genetics.dm +++ b/code/modules/asset_cache/assets/genetics.dm @@ -1,6 +1,6 @@ /datum/asset/simple/genetics assets = list( - "dna_discovered.gif" = 'icons/ui_icons/dna/dna_discovered.gif', - "dna_undiscovered.gif" = 'icons/ui_icons/dna/dna_undiscovered.gif', - "dna_extra.gif" = 'icons/ui_icons/dna/dna_extra.gif' + "dna_discovered.gif" = 'icons/ui/dna/dna_discovered.gif', + "dna_undiscovered.gif" = 'icons/ui/dna/dna_undiscovered.gif', + "dna_extra.gif" = 'icons/ui/dna/dna_extra.gif' ) diff --git a/code/modules/asset_cache/assets/headers.dm b/code/modules/asset_cache/assets/headers.dm index 62c7fc532e6137..1c070bd0322dce 100644 --- a/code/modules/asset_cache/assets/headers.dm +++ b/code/modules/asset_cache/assets/headers.dm @@ -1,31 +1,31 @@ /datum/asset/simple/headers assets = list( - "alarm_green.gif" = 'icons/program_icons/alarm_green.gif', - "alarm_red.gif" = 'icons/program_icons/alarm_red.gif', - "batt_5.gif" = 'icons/program_icons/batt_5.gif', - "batt_20.gif" = 'icons/program_icons/batt_20.gif', - "batt_40.gif" = 'icons/program_icons/batt_40.gif', - "batt_60.gif" = 'icons/program_icons/batt_60.gif', - "batt_80.gif" = 'icons/program_icons/batt_80.gif', - "batt_100.gif" = 'icons/program_icons/batt_100.gif', - "downloader_finished.gif" = 'icons/program_icons/downloader_finished.gif', - "downloader_running.gif" = 'icons/program_icons/downloader_running.gif', - "ntnrc_idle.gif" = 'icons/program_icons/ntnrc_idle.gif', - "ntnrc_new.gif" = 'icons/program_icons/ntnrc_new.gif', - "power_norm.gif" = 'icons/program_icons/power_norm.gif', - "power_warn.gif" = 'icons/program_icons/power_warn.gif', - "sig_high.gif" = 'icons/program_icons/sig_high.gif', - "sig_low.gif" = 'icons/program_icons/sig_low.gif', - "sig_lan.gif" = 'icons/program_icons/sig_lan.gif', - "sig_none.gif" = 'icons/program_icons/sig_none.gif', - "smmon_0.gif" = 'icons/program_icons/smmon_0.gif', - "smmon_1.gif" = 'icons/program_icons/smmon_1.gif', - "smmon_2.gif" = 'icons/program_icons/smmon_2.gif', - "smmon_3.gif" = 'icons/program_icons/smmon_3.gif', - "smmon_4.gif" = 'icons/program_icons/smmon_4.gif', - "smmon_5.gif" = 'icons/program_icons/smmon_5.gif', - "smmon_6.gif" = 'icons/program_icons/smmon_6.gif', - "borg_mon.gif" = 'icons/program_icons/borg_mon.gif', - "robotact.gif" = 'icons/program_icons/robotact.gif', - "mafia.gif" = 'icons/program_icons/mafia.gif', + "alarm_green.gif" = 'icons/ui/programs/alarm_green.gif', + "alarm_red.gif" = 'icons/ui/programs/alarm_red.gif', + "batt_5.gif" = 'icons/ui/programs/batt_5.gif', + "batt_20.gif" = 'icons/ui/programs/batt_20.gif', + "batt_40.gif" = 'icons/ui/programs/batt_40.gif', + "batt_60.gif" = 'icons/ui/programs/batt_60.gif', + "batt_80.gif" = 'icons/ui/programs/batt_80.gif', + "batt_100.gif" = 'icons/ui/programs/batt_100.gif', + "downloader_finished.gif" = 'icons/ui/programs/downloader_finished.gif', + "downloader_running.gif" = 'icons/ui/programs/downloader_running.gif', + "ntnrc_idle.gif" = 'icons/ui/programs/ntnrc_idle.gif', + "ntnrc_new.gif" = 'icons/ui/programs/ntnrc_new.gif', + "power_norm.gif" = 'icons/ui/programs/power_norm.gif', + "power_warn.gif" = 'icons/ui/programs/power_warn.gif', + "sig_high.gif" = 'icons/ui/programs/sig_high.gif', + "sig_low.gif" = 'icons/ui/programs/sig_low.gif', + "sig_lan.gif" = 'icons/ui/programs/sig_lan.gif', + "sig_none.gif" = 'icons/ui/programs/sig_none.gif', + "smmon_0.gif" = 'icons/ui/programs/smmon_0.gif', + "smmon_1.gif" = 'icons/ui/programs/smmon_1.gif', + "smmon_2.gif" = 'icons/ui/programs/smmon_2.gif', + "smmon_3.gif" = 'icons/ui/programs/smmon_3.gif', + "smmon_4.gif" = 'icons/ui/programs/smmon_4.gif', + "smmon_5.gif" = 'icons/ui/programs/smmon_5.gif', + "smmon_6.gif" = 'icons/ui/programs/smmon_6.gif', + "borg_mon.gif" = 'icons/ui/programs/borg_mon.gif', + "robotact.gif" = 'icons/ui/programs/robotact.gif', + "mafia.gif" = 'icons/ui/programs/mafia.gif', ) diff --git a/code/modules/asset_cache/assets/inventory.dm b/code/modules/asset_cache/assets/inventory.dm index a63fc45620f0ab..0883dbd7515e58 100644 --- a/code/modules/asset_cache/assets/inventory.dm +++ b/code/modules/asset_cache/assets/inventory.dm @@ -1,20 +1,20 @@ /datum/asset/simple/inventory assets = list( - "inventory-glasses.png" = 'icons/ui_icons/inventory/glasses.png', - "inventory-head.png" = 'icons/ui_icons/inventory/head.png', - "inventory-neck.png" = 'icons/ui_icons/inventory/neck.png', - "inventory-mask.png" = 'icons/ui_icons/inventory/mask.png', - "inventory-ears.png" = 'icons/ui_icons/inventory/ears.png', - "inventory-uniform.png" = 'icons/ui_icons/inventory/uniform.png', - "inventory-suit.png" = 'icons/ui_icons/inventory/suit.png', - "inventory-gloves.png" = 'icons/ui_icons/inventory/gloves.png', - "inventory-hand_l.png" = 'icons/ui_icons/inventory/hand_l.png', - "inventory-hand_r.png" = 'icons/ui_icons/inventory/hand_r.png', - "inventory-shoes.png" = 'icons/ui_icons/inventory/shoes.png', - "inventory-suit_storage.png" = 'icons/ui_icons/inventory/suit_storage.png', - "inventory-id.png" = 'icons/ui_icons/inventory/id.png', - "inventory-belt.png" = 'icons/ui_icons/inventory/belt.png', - "inventory-back.png" = 'icons/ui_icons/inventory/back.png', - "inventory-pocket.png" = 'icons/ui_icons/inventory/pocket.png', - "inventory-collar.png" = 'icons/ui_icons/inventory/collar.png', + "inventory-glasses.png" = 'icons/ui/inventory/glasses.png', + "inventory-head.png" = 'icons/ui/inventory/head.png', + "inventory-neck.png" = 'icons/ui/inventory/neck.png', + "inventory-mask.png" = 'icons/ui/inventory/mask.png', + "inventory-ears.png" = 'icons/ui/inventory/ears.png', + "inventory-uniform.png" = 'icons/ui/inventory/uniform.png', + "inventory-suit.png" = 'icons/ui/inventory/suit.png', + "inventory-gloves.png" = 'icons/ui/inventory/gloves.png', + "inventory-hand_l.png" = 'icons/ui/inventory/hand_l.png', + "inventory-hand_r.png" = 'icons/ui/inventory/hand_r.png', + "inventory-shoes.png" = 'icons/ui/inventory/shoes.png', + "inventory-suit_storage.png" = 'icons/ui/inventory/suit_storage.png', + "inventory-id.png" = 'icons/ui/inventory/id.png', + "inventory-belt.png" = 'icons/ui/inventory/belt.png', + "inventory-back.png" = 'icons/ui/inventory/back.png', + "inventory-pocket.png" = 'icons/ui/inventory/pocket.png', + "inventory-collar.png" = 'icons/ui/inventory/collar.png', ) diff --git a/code/modules/asset_cache/assets/mecha.dm b/code/modules/asset_cache/assets/mecha.dm index fd4b911e20ca33..3c2403cf1c375c 100644 --- a/code/modules/asset_cache/assets/mecha.dm +++ b/code/modules/asset_cache/assets/mecha.dm @@ -2,5 +2,5 @@ name = "mecha_equipment" /datum/asset/spritesheet/mecha_equipment/create_spritesheets() - InsertAll("", 'icons/mob/mecha_equipment.dmi') + InsertAll("", 'icons/obj/devices/mecha_equipment.dmi') InsertAll("", 'icons/obj/ore.dmi') diff --git a/code/modules/asset_cache/assets/notes.dm b/code/modules/asset_cache/assets/notes.dm index aec6838f96792c..4f5e42cb15899c 100644 --- a/code/modules/asset_cache/assets/notes.dm +++ b/code/modules/asset_cache/assets/notes.dm @@ -1,7 +1,7 @@ /datum/asset/simple/notes assets = list( - "high_button.png" = 'icons/ui_icons/notes/high_button.png', - "medium_button.png" = 'icons/ui_icons/notes/medium_button.png', - "minor_button.png" = 'icons/ui_icons/notes/minor_button.png', - "none_button.png" = 'icons/ui_icons/notes/none_button.png', + "high_button.png" = 'icons/ui/notes/high_button.png', + "medium_button.png" = 'icons/ui/notes/medium_button.png', + "minor_button.png" = 'icons/ui/notes/minor_button.png', + "none_button.png" = 'icons/ui/notes/none_button.png', ) diff --git a/code/modules/asset_cache/assets/orbit.dm b/code/modules/asset_cache/assets/orbit.dm index 7d0e0d98a0e644..8ac22877ecd088 100644 --- a/code/modules/asset_cache/assets/orbit.dm +++ b/code/modules/asset_cache/assets/orbit.dm @@ -1,4 +1,4 @@ /datum/asset/simple/orbit assets = list( - "ghost.png" = 'icons/ui_icons/orbit/ghost.png' + "ghost.png" = 'icons/ui/orbit/ghost.png' ) diff --git a/code/modules/asset_cache/assets/particle_editor.dm b/code/modules/asset_cache/assets/particle_editor.dm index f5f7bb0098711c..27f78251759405 100644 --- a/code/modules/asset_cache/assets/particle_editor.dm +++ b/code/modules/asset_cache/assets/particle_editor.dm @@ -1,17 +1,17 @@ /datum/asset/simple/particle_editor assets = list( - "motion" = 'icons/ui_icons/particle_editor/motion.png', + "motion" = 'icons/ui/particle_editor/motion.png', - "uniform" = 'icons/ui_icons/particle_editor/uniform_rand.png', - "normal" ='icons/ui_icons/particle_editor/normal_rand.png', - "linear" = 'icons/ui_icons/particle_editor/linear_rand.png', - "square_rand" = 'icons/ui_icons/particle_editor/square_rand.png', + "uniform" = 'icons/ui/particle_editor/uniform_rand.png', + "normal" ='icons/ui/particle_editor/normal_rand.png', + "linear" = 'icons/ui/particle_editor/linear_rand.png', + "square_rand" = 'icons/ui/particle_editor/square_rand.png', - "num" = 'icons/ui_icons/particle_editor/num_gen.png', - "vector" = 'icons/ui_icons/particle_editor/vector_gen.png', - "box" = 'icons/ui_icons/particle_editor/box_gen.png', - "circle" = 'icons/ui_icons/particle_editor/circle_gen.png', - "sphere" = 'icons/ui_icons/particle_editor/sphere_gen.png', - "square" = 'icons/ui_icons/particle_editor/square_gen.png', - "cube" = 'icons/ui_icons/particle_editor/cube_gen.png', + "num" = 'icons/ui/particle_editor/num_gen.png', + "vector" = 'icons/ui/particle_editor/vector_gen.png', + "box" = 'icons/ui/particle_editor/box_gen.png', + "circle" = 'icons/ui/particle_editor/circle_gen.png', + "sphere" = 'icons/ui/particle_editor/sphere_gen.png', + "square" = 'icons/ui/particle_editor/square_gen.png', + "cube" = 'icons/ui/particle_editor/cube_gen.png', ) diff --git a/code/modules/asset_cache/assets/pda.dm b/code/modules/asset_cache/assets/pda.dm index 392efa35b9163e..7fd3f2f40e48ff 100644 --- a/code/modules/asset_cache/assets/pda.dm +++ b/code/modules/asset_cache/assets/pda.dm @@ -1,34 +1,34 @@ /datum/asset/spritesheet/simple/pda name = "pda" assets = list( - "atmos" = 'icons/pda_icons/pda_atmos.png', - "back" = 'icons/pda_icons/pda_back.png', - "bell" = 'icons/pda_icons/pda_bell.png', - "blank" = 'icons/pda_icons/pda_blank.png', - "boom" = 'icons/pda_icons/pda_boom.png', - "bucket" = 'icons/pda_icons/pda_bucket.png', - "medbot" = 'icons/pda_icons/pda_medbot.png', - "floorbot" = 'icons/pda_icons/pda_floorbot.png', - "cleanbot" = 'icons/pda_icons/pda_cleanbot.png', - "crate" = 'icons/pda_icons/pda_crate.png', - "cuffs" = 'icons/pda_icons/pda_cuffs.png', - "eject" = 'icons/pda_icons/pda_eject.png', - "flashlight" = 'icons/pda_icons/pda_flashlight.png', - "honk" = 'icons/pda_icons/pda_honk.png', - "mail" = 'icons/pda_icons/pda_mail.png', - "medical" = 'icons/pda_icons/pda_medical.png', - "menu" = 'icons/pda_icons/pda_menu.png', - "mule" = 'icons/pda_icons/pda_mule.png', - "notes" = 'icons/pda_icons/pda_notes.png', - "power" = 'icons/pda_icons/pda_power.png', - "rdoor" = 'icons/pda_icons/pda_rdoor.png', - "reagent" = 'icons/pda_icons/pda_reagent.png', - "refresh" = 'icons/pda_icons/pda_refresh.png', - "scanner" = 'icons/pda_icons/pda_scanner.png', - "signaler" = 'icons/pda_icons/pda_signaler.png', - "skills" = 'icons/pda_icons/pda_skills.png', - "status" = 'icons/pda_icons/pda_status.png', - "dronephone" = 'icons/pda_icons/pda_dronephone.png', - "emoji" = 'icons/pda_icons/pda_emoji.png', - "droneblacklist" = 'icons/pda_icons/pda_droneblacklist.png', + "atmos" = 'icons/ui/pda/pda_atmos.png', + "back" = 'icons/ui/pda/pda_back.png', + "bell" = 'icons/ui/pda/pda_bell.png', + "blank" = 'icons/ui/pda/pda_blank.png', + "boom" = 'icons/ui/pda/pda_boom.png', + "bucket" = 'icons/ui/pda/pda_bucket.png', + "medbot" = 'icons/ui/pda/pda_medbot.png', + "floorbot" = 'icons/ui/pda/pda_floorbot.png', + "cleanbot" = 'icons/ui/pda/pda_cleanbot.png', + "crate" = 'icons/ui/pda/pda_crate.png', + "cuffs" = 'icons/ui/pda/pda_cuffs.png', + "eject" = 'icons/ui/pda/pda_eject.png', + "flashlight" = 'icons/ui/pda/pda_flashlight.png', + "honk" = 'icons/ui/pda/pda_honk.png', + "mail" = 'icons/ui/pda/pda_mail.png', + "medical" = 'icons/ui/pda/pda_medical.png', + "menu" = 'icons/ui/pda/pda_menu.png', + "mule" = 'icons/ui/pda/pda_mule.png', + "notes" = 'icons/ui/pda/pda_notes.png', + "power" = 'icons/ui/pda/pda_power.png', + "rdoor" = 'icons/ui/pda/pda_rdoor.png', + "reagent" = 'icons/ui/pda/pda_reagent.png', + "refresh" = 'icons/ui/pda/pda_refresh.png', + "scanner" = 'icons/ui/pda/pda_scanner.png', + "signaler" = 'icons/ui/pda/pda_signaler.png', + "skills" = 'icons/ui/pda/pda_skills.png', + "status" = 'icons/ui/pda/pda_status.png', + "dronephone" = 'icons/ui/pda/pda_dronephone.png', + "emoji" = 'icons/ui/pda/pda_emoji.png', + "droneblacklist" = 'icons/ui/pda/pda_droneblacklist.png', ) diff --git a/code/modules/asset_cache/assets/plane_debug.dm b/code/modules/asset_cache/assets/plane_debug.dm index 0d8ddac162c12d..eda7244fa9e0e4 100644 --- a/code/modules/asset_cache/assets/plane_debug.dm +++ b/code/modules/asset_cache/assets/plane_debug.dm @@ -1,4 +1,4 @@ /datum/asset/simple/plane_background assets = list( - "grid_background.png" = 'icons/ui_icons/tgui/grid_background.png' + "grid_background.png" = 'icons/ui/tgui/grid_background.png' ) diff --git a/code/modules/asset_cache/assets/radar.dm b/code/modules/asset_cache/assets/radar.dm index cef2679a92dcc8..c7642f71fd9570 100644 --- a/code/modules/asset_cache/assets/radar.dm +++ b/code/modules/asset_cache/assets/radar.dm @@ -1,6 +1,6 @@ /datum/asset/simple/radar_assets assets = list( - "ntosradarbackground.png" = 'icons/ui_icons/tgui/ntosradar_background.png', - "ntosradarpointer.png" = 'icons/ui_icons/tgui/ntosradar_pointer.png', - "ntosradarpointerS.png" = 'icons/ui_icons/tgui/ntosradar_pointer_S.png' + "ntosradarbackground.png" = 'icons/ui/tgui/ntosradar_background.png', + "ntosradarpointer.png" = 'icons/ui/tgui/ntosradar_pointer.png', + "ntosradarpointerS.png" = 'icons/ui/tgui/ntosradar_pointer_S.png' ) diff --git a/code/modules/asset_cache/assets/safe.dm b/code/modules/asset_cache/assets/safe.dm index b1d6ba9a8aacc8..0bca5b6659c605 100644 --- a/code/modules/asset_cache/assets/safe.dm +++ b/code/modules/asset_cache/assets/safe.dm @@ -1,4 +1,4 @@ /datum/asset/simple/safe assets = list( - "safe_dial.png" = 'icons/ui_icons/safe/safe_dial.png' + "safe_dial.png" = 'icons/ui/safe/safe_dial.png' ) diff --git a/code/modules/atmospherics/gasmixtures/reaction_factors.dm b/code/modules/atmospherics/gasmixtures/reaction_factors.dm index 1b96a897683772..51487931795009 100644 --- a/code/modules/atmospherics/gasmixtures/reaction_factors.dm +++ b/code/modules/atmospherics/gasmixtures/reaction_factors.dm @@ -205,4 +205,5 @@ "Radiation" = "Radiation gets released during this decomposition process.", "Hallucinations" = "This reaction can cause various carbon based lifeforms in the vicinity to hallucinate.", "Nuclear Particles" = "This reaction emits extremely high energy nuclear particles, up to [2 * PN_BZASE_NUCLEAR_PARTICLE_MAXIMUM] per second per unique gas mixture.", + "Temperature" = "Can only occur between [PN_BZASE_MIN_TEMP] - [PN_BZASE_MAX_TEMP] kelvin.", ) diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm index ca48ec2767e177..d9a0a0faf63d80 100644 --- a/code/modules/buildmode/buttons.dm +++ b/code/modules/buildmode/buttons.dm @@ -1,5 +1,5 @@ /atom/movable/screen/buildmode - icon = 'icons/misc/buildmode.dmi' + icon = 'icons/hud/buildmode.dmi' var/datum/buildmode/bd // If we don't do this, we get occluded by item action buttons plane = ABOVE_HUD_PLANE diff --git a/code/modules/cargo/markets/market_uplink.dm b/code/modules/cargo/markets/market_uplink.dm index da86161e46ab2b..df8c8eb36a5077 100644 --- a/code/modules/cargo/markets/market_uplink.dm +++ b/code/modules/cargo/markets/market_uplink.dm @@ -1,7 +1,7 @@ /obj/item/market_uplink name = "\improper Market Uplink" desc = "An market uplink. Usable with markets. You probably shouldn't have this!" - icon = 'icons/obj/blackmarket.dmi' + icon = 'icons/obj/devices/blackmarket.dmi' icon_state = "uplink" // UI variables. @@ -151,7 +151,7 @@ /obj/item/market_uplink/blackmarket name = "\improper Black Market Uplink" desc = "An illegal black market uplink. If command wanted you to have these, they wouldn't have made it so hard to get one." - icon = 'icons/obj/blackmarket.dmi' + icon = 'icons/obj/devices/blackmarket.dmi' icon_state = "uplink" //The original black market uplink accessible_markets = list(/datum/market/blackmarket) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 3272620a865558..97924643604c5f 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -197,6 +197,7 @@ var/list/parallax_layers var/list/parallax_layers_cached + var/atom/movable/screen/parallax_home/parallax_rock ///this is the last recorded client eye by SSparallax/fire() var/atom/movable/movingmob var/turf/previous_turf @@ -206,8 +207,8 @@ var/parallax_movedir = 0 /// How many parallax layers to show our client var/parallax_layers_max = 4 - /// Timer for the area directional animation - var/parallax_animate_timer + /// Timers for the area directional animation, one for each layer + var/list/parallax_animate_timers /// Do we want to do parallax animations at all? /// Exists to prevent laptop fires var/do_parallax_animations = TRUE diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index ab1c5ffdcb7ab1..1de6c330bfce98 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -588,26 +588,10 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(credits) QDEL_LIST(credits) if(holder) - adminGreet(1) holder.owner = null GLOB.admins -= src - if (!GLOB.admins.len && SSticker.IsRoundInProgress()) //Only report this stuff if we are currently playing. - var/cheesy_message = pick( - "I have no admins online!",\ - "I'm all alone :(",\ - "I'm feeling lonely :(",\ - "I'm so lonely :(",\ - "Why does nobody love me? :(",\ - "I want a man :(",\ - "Where has everyone gone?",\ - "I need a hug :(",\ - "Someone come hold me :(",\ - "I need someone on me :(",\ - "What happened? Where has everyone gone?",\ - "Forever alone :("\ - ) + handle_admin_logout() - send2adminchat("Server", "[cheesy_message] (No admins online)") QDEL_LIST_ASSOC_VAL(char_render_holders) SSambience.remove_ambience_client(src) @@ -617,6 +601,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( QDEL_NULL(void) QDEL_NULL(tooltips) QDEL_NULL(loot_panel) + QDEL_NULL(parallax_rock) + QDEL_LIST(parallax_layers_cached) + parallax_layers = null seen_messages = null Master.UpdateTickRate() ..() //Even though we're going to be hard deleted there are still some things that want to know the destroy is happening @@ -1240,6 +1227,36 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( screen -= object +/// Handles any "fluff" or supplementary procedures related to an admin logout event. Should not have anything critically related cleaning up an admin's logout. +/client/proc/handle_admin_logout() + adminGreet(logout = TRUE) + if(length(GLOB.admins) > 0 || !SSticker.IsRoundInProgress()) // We only want to report this stuff if we are currently playing. + return + + var/list/message_to_send = list() + var/static/list/cheesy_messages = null + + if (isnull(cheesy_messages)) + cheesy_messages = list( + "Forever alone :(", + "I have no admins online!", + "I need a hug :(", + "I need someone on me :(", + "I want a man :(", + "I'm all alone :(", + "I'm feeling lonely :(", + "I'm so lonely :(", + "Someone come hold me :(", + "What happened? Where has everyone gone?", + "Where has everyone gone?", + "Why does nobody love me? :(", + ) + + message_to_send += pick(cheesy_messages) + message_to_send += "(No admins online)" + + send2adminchat("Server", jointext(message_to_send, " ")) + #undef ADMINSWARNED_AT #undef CURRENT_MINUTE #undef CURRENT_SECOND diff --git a/code/modules/client/preferences/addict.dm b/code/modules/client/preferences/addict.dm index 3c63b5ea8673be..8d70a6ccbfa6ef 100644 --- a/code/modules/client/preferences/addict.dm +++ b/code/modules/client/preferences/addict.dm @@ -4,6 +4,12 @@ . -= addiction .[addiction::name] = addiction +/proc/setup_smoker_addictions(list/possible_addictions) + . = possible_addictions + for(var/obj/item/storage/addiction as anything in .) + . -= addiction + .[format_text(addiction::name)] = addiction // Format text to remove \improper used in cigarette packs + /datum/preference/choiced/junkie category = PREFERENCE_CATEGORY_MANUALLY_RENDERED savefile_key = "junkie" diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 49583ce70152ab..baabaa610c523d 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -80,7 +80,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") var/keyname = key if(prefs.unlock_content) if(prefs.toggles & MEMBER_PUBLIC) - keyname = "[icon2html('icons/ui_icons/chat/member_content.dmi', world, "blag")][keyname]" + keyname = "[icon2html('icons/ui/chat/member_content.dmi', world, "blag")][keyname]" if(prefs.hearted) var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat) keyname = "[sheet.icon_tag("emoji-heart")][keyname]" diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index a90cd6a4d7bf6d..358057e1de0d97 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -103,11 +103,12 @@ // We sleep HERE, in pre-event setup (because there's no sense doing it in run_event() since the event is already running!) for the given amount of time to make an admin has enough time to cancel an event un-fitting of the present round. if(alert_observers) - message_admins("Random Event triggering in [DisplayTimeText(RANDOM_EVENT_ADMIN_INTERVENTION_TIME)]: [name]. (CANCEL)") + message_admins("Random Event triggering in [DisplayTimeText(RANDOM_EVENT_ADMIN_INTERVENTION_TIME)]: [name]. (CANCEL) (SOMETHING ELSE)") sleep(RANDOM_EVENT_ADMIN_INTERVENTION_TIME) var/players_amt = get_active_player_count(alive_check = TRUE, afk_check = TRUE, human_check = TRUE) if(!can_spawn_event(players_amt)) - message_admins("Second pre-condition check for [name] failed, skipping...") + message_admins("Second pre-condition check for [name] failed, rerolling...") + SSevents.spawnEvent(excluded_event = src) return EVENT_INTERRUPTED if(!triggering) @@ -125,6 +126,15 @@ message_admins("[key_name_admin(usr)] cancelled event [name].") log_admin_private("[key_name(usr)] cancelled event [name].") SSblackbox.record_feedback("tally", "event_admin_cancelled", 1, typepath) + if(href_list["different_event"]) + if(!triggering) + to_chat(usr, span_admin("Too late to change events now!")) + return + triggering = FALSE + message_admins("[key_name_admin(usr)] chose to have event [name] rolled into a different event.") + log_admin_private("[key_name(usr)] rerolled event [name].") + SSblackbox.record_feedback("tally", "event_admin_rerolled", 1, typepath) + SSevents.spawnEvent(excluded_event = src) /* Runs the event diff --git a/code/modules/events/ghost_role/sentient_disease.dm b/code/modules/events/ghost_role/sentient_disease.dm deleted file mode 100644 index 156988d4b20d2f..00000000000000 --- a/code/modules/events/ghost_role/sentient_disease.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/round_event_control/sentient_disease - name = "Spawn Sentient Disease" - typepath = /datum/round_event/ghost_role/sentient_disease - weight = 7 - max_occurrences = 1 - min_players = 25 - category = EVENT_CATEGORY_HEALTH - description = "Spawns a sentient disease, who wants to infect as many people as possible." - min_wizard_trigger_potency = 4 - max_wizard_trigger_potency = 7 - -/datum/round_event/ghost_role/sentient_disease - role_name = "sentient disease" - -/datum/round_event/ghost_role/sentient_disease/spawn_role() - var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, alert_pic = /obj/structure/sign/warning/biohazard, role_name_text = role_name, amount_to_pick = 1) - if(isnull(chosen_one)) - return NOT_ENOUGH_PLAYERS - var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) - virus.key = chosen_one.key - INVOKE_ASYNC(virus, TYPE_PROC_REF(/mob/camera/disease, pick_name)) - message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by an event.") - virus.log_message("was spawned as a sentient disease by an event.", LOG_GAME) - spawned_mobs += virus - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index 895d5a5fd99c1e..1a1fa3ac67c0c2 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -9,7 +9,7 @@ min_wizard_trigger_potency = 6 max_wizard_trigger_potency = 7 admin_setup = list(/datum/event_admin_setup/minimum_candidate_requirement/heart_attack, /datum/event_admin_setup/input_number/heart_attack) - ///Candidates for recieving a healthy dose of heart disease + ///Candidates for receiving a healthy dose of heart disease var/list/heart_attack_candidates = list() /datum/round_event_control/heart_attack/can_spawn_event(players_amt, allow_magic = FALSE) diff --git a/code/modules/fishing/fish/fish_types.dm b/code/modules/fishing/fish/fish_types.dm index 51fcf61307a86b..f58db7fc39b847 100644 --- a/code/modules/fishing/fish/fish_types.dm +++ b/code/modules/fishing/fish/fish_types.dm @@ -540,3 +540,75 @@ ///It spins, and dimly glows in the dark. /obj/item/fish/starfish/flop_animation() DO_FLOATING_ANIM(src) + +/obj/item/fish/lavaloop + name = "lavaloop fish" + desc = "Due to its curvature, it can be used as make-shift boomerang." + icon_state = "lava_loop" + sprite_width = 3 + sprite_height = 5 + average_size = 30 + average_weight = 500 + resistance_flags = FIRE_PROOF | LAVA_PROOF + required_fluid_type = AQUARIUM_FLUID_ANY_WATER //if we can survive hot lava and freezing plasrivers, we can survive anything + fish_ai_type = FISH_AI_ZIPPY + min_pressure = HAZARD_LOW_PRESSURE + required_temperature_min = MIN_AQUARIUM_TEMP+30 + required_temperature_max = MIN_AQUARIUM_TEMP+35 + aquarium_vc_color = "#ce7e1d" + fish_traits = list( + /datum/fish_trait/carnivore, + /datum/fish_trait/heavy, + ) + hitsound = null + throwforce = 5 + ///maximum bonus damage when winded up + var/maximum_bonus = 25 + +/obj/item/fish/lavaloop/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_BYPASS_RANGED_ARMOR, INNATE_TRAIT) + AddComponent(/datum/component/boomerang, throw_range, TRUE) + AddComponent(\ + /datum/component/throwbonus_on_windup,\ + maximum_bonus = maximum_bonus,\ + windup_increment_speed = 2,\ + throw_text = "starts cooking in your hands, it may explode soon!",\ + pass_maximum_callback = CALLBACK(src, PROC_REF(explode_on_user)),\ + apply_bonus_callback = CALLBACK(src, PROC_REF(on_fish_land)),\ + sound_on_success = 'sound/weapons/parry.ogg',\ + effect_on_success = /obj/effect/temp_visual/guardian/phase,\ + ) + +/obj/item/fish/lavaloop/proc/explode_on_user(mob/living/user) + var/obj/item/bodypart/arm/active_arm = user.get_active_hand() + active_arm?.dismember() + to_chat(user, span_warning("[src] explodes!")) + playsound(src, 'sound/effects/explosion1.ogg', 40, TRUE) + user.flash_act(1, 1) + qdel(src) + +/obj/item/fish/lavaloop/proc/on_fish_land(mob/living/target, bonus_value) + if(!istype(target)) + return FALSE + return (target.mob_size >= MOB_SIZE_LARGE) + +/obj/item/fish/lavaloop/plasma_river + maximum_bonus = 30 + +/obj/item/fish/lavaloop/plasma_river/explode_on_user(mob/living/user) + playsound(src, 'sound/effects/explosion1.ogg', 40, TRUE) + user.flash_act(1, 1) + user.apply_status_effect(/datum/status_effect/ice_block_talisman, 5 SECONDS) + qdel(src) + +/obj/item/fish/lavaloop/plasma_river/on_fish_land(mob/living/target, bonus_value) + if(!istype(target)) + return FALSE + if(target.mob_size < MOB_SIZE_LARGE) + return FALSE + var/freeze_timer = (bonus_value * 0.1) + if(freeze_timer <= 0) + return FALSE + target.apply_status_effect(/datum/status_effect/ice_block_talisman, freeze_timer SECONDS) + return FALSE diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index e3b44e8465be1f..45739b79399e41 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -244,10 +244,13 @@ /datum/fishing_challenge/proc/start(mob/living/user) /// Create fishing line visuals - fishing_line = used_rod.create_fishing_line(lure, target_py = 5) + if(used_rod.display_fishing_line) + fishing_line = used_rod.create_fishing_line(lure, target_py = 5) + RegisterSignal(fishing_line, COMSIG_QDELETING, PROC_REF(on_line_deleted)) + else //if the rod doesnt have a fishing line, then it ends when they move away + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_user_move)) active_effects = bitfield_to_list(special_effects & FISHING_MINIGAME_ACTIVE_EFFECTS) // If fishing line breaks los / rod gets dropped / deleted - RegisterSignal(fishing_line, COMSIG_QDELETING, PROC_REF(on_line_deleted)) RegisterSignal(used_rod, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) ADD_TRAIT(user, TRAIT_GONE_FISHING, REF(src)) user.add_mood_event("fishing", /datum/mood_event/fishing) @@ -263,10 +266,18 @@ user.balloon_alert(user, user.is_holding(used_rod) ? "line snapped" : "rod dropped") interrupt() +/datum/fishing_challenge/proc/on_user_move(datum/source) + SIGNAL_HANDLER + + user.balloon_alert(user, "too far!") + interrupt() + /datum/fishing_challenge/proc/handle_click(mob/source, atom/target, modifiers) SIGNAL_HANDLER //You need to be holding the rod to use it. - if(!source.get_active_held_item(used_rod) || LAZYACCESS(modifiers, SHIFT_CLICK) || LAZYACCESS(modifiers, CTRL_CLICK) || LAZYACCESS(modifiers, ALT_CLICK)) + if(LAZYACCESS(modifiers, SHIFT_CLICK) || LAZYACCESS(modifiers, CTRL_CLICK) || LAZYACCESS(modifiers, ALT_CLICK)) + return + if(!source.get_active_held_item(used_rod) && !HAS_TRAIT(source, TRAIT_PROFOUND_FISHER)) return if(phase == WAIT_PHASE) //Reset wait send_alert("miss!") @@ -703,6 +714,8 @@ RegisterSignal(spot, COMSIG_MOVABLE_MOVED, PROC_REF(follow_movable)) /obj/effect/fishing_lure/proc/follow_movable(atom/movable/source) + SIGNAL_HANDLER + set_glide_size(source.glide_size) forceMove(source.loc) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index a0fa77dc514311..98ac7f8ff720f8 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -36,6 +36,9 @@ /// The default color for the reel overlay if no line is equipped. var/default_line_color = "gray" + ///should there be a fishing line? + var/display_fishing_line = TRUE + ///The name of the icon state of the reel overlay var/reel_overlay = "reel_overlay" @@ -154,9 +157,11 @@ /// Generates the fishing line visual from the current user to the target and updates inhands /obj/item/fishing_rod/proc/create_fishing_line(atom/movable/target, target_py = null) + if(!display_fishing_line) + return null var/mob/user = loc if(!istype(user)) - return + return null if(fishing_line) QDEL_NULL(fishing_line) var/beam_color = line?.line_color || default_line_color diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index c21579626fe281..f18942b5d5eca6 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -207,6 +207,7 @@ fish_table = list( FISHING_DUD = 5, /obj/item/stack/ore/slag = 20, + /obj/item/fish/lavaloop = 15, /obj/structure/closet/crate/necropolis/tendril = 1, /obj/effect/mob_spawn/corpse/human/charredskeleton = 1 ) @@ -229,6 +230,7 @@ fish_table = list( FISHING_DUD = 5, /obj/item/fish/chasm_crab/ice = 15, + /obj/item/fish/lavaloop/plasma_river = 15, /obj/item/coin/plasma = 3, /obj/item/stack/ore/plasma = 3, /mob/living/basic/mining/lobstrosity = 1, diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 3b7ddbbd83c4ae..ab38f6889907ad 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -35,8 +35,7 @@ /obj/item/food/grown/banana/Initialize(mapload) . = ..() if(prob(1)) - AddComponent(/datum/component/boomerang, boomerang_throw_range = throw_range + 4, thrower_easy_catch_enabled = TRUE) - desc += " The curve on this one looks particularly acute." + AddComponent(/datum/component/boomerang, boomerang_throw_range = throw_range + 4, thrower_easy_catch_enabled = TRUE, examine_message = span_green("The curve on this one looks particularly acute.")) ///Clowns will always like bananas. /obj/item/food/grown/banana/proc/check_liked(mob/living/carbon/human/consumer) diff --git a/code/modules/jobs/job_types/antagonists/sentient_disease.dm b/code/modules/jobs/job_types/antagonists/sentient_disease.dm deleted file mode 100644 index 4c91ae4ffa1010..00000000000000 --- a/code/modules/jobs/job_types/antagonists/sentient_disease.dm +++ /dev/null @@ -1,2 +0,0 @@ -/datum/job/sentient_disease - title = ROLE_SENTIENT_DISEASE diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm index af80df69fe8c4a..2b13e1adae8a09 100644 --- a/code/modules/jobs/job_types/station_trait/human_ai.dm +++ b/code/modules/jobs/job_types/station_trait/human_ai.dm @@ -83,7 +83,7 @@ /datum/job/human_ai/announce_job(mob/living/joining_mob) . = ..() if(SSticker.HasRoundStarted()) - minor_announce("Due to a research mishaps, [joining_mob] has been sent to be your replacement AI at [AREACOORD(joining_mob)]. Please treat them with respect.") + minor_announce("Due to a research mishap, [joining_mob] has been sent to be your replacement AI at [AREACOORD(joining_mob)]. Please treat them with respect.") /datum/job/human_ai/get_radio_information() return "Prefix your message with :b to speak with cyborgs." diff --git a/code/modules/language/_language.dm b/code/modules/language/_language.dm index 94ea4a6aa40278..6a00610c0adf24 100644 --- a/code/modules/language/_language.dm +++ b/code/modules/language/_language.dm @@ -32,7 +32,7 @@ var/always_use_default_namelist = FALSE /// Icon displayed in the chat window when speaking this language. /// if you are seeing someone speak popcorn language, then something is wrong. - var/icon = 'icons/misc/language.dmi' + var/icon = 'icons/ui/chat/language.dmi' /// Icon state displayed in the chat window when speaking this language. var/icon_state = "popcorn" diff --git a/code/modules/lootpanel/_lootpanel.dm b/code/modules/lootpanel/_lootpanel.dm index 339a79d77fa6f2..45862ebf455424 100644 --- a/code/modules/lootpanel/_lootpanel.dm +++ b/code/modules/lootpanel/_lootpanel.dm @@ -49,6 +49,7 @@ var/list/data = list() data["contents"] = get_contents() + data["is_blind"] = !!user.is_blind() data["searching"] = length(to_image) return data diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index 120352f14c56a9..9096ab24afec8b 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -150,7 +150,7 @@ * Admin spawned meteors will not grant the user an achievement. * * Arguments: - * * user - the person who will be recieving the examine award. + * * user - the person who will be receiving the examine award. */ /obj/effect/meteor/proc/check_examine_award(mob/user) diff --git a/code/modules/mining/equipment/miningradio.dm b/code/modules/mining/equipment/miningradio.dm index c6fa3a34fc36ae..61d80bfce6faf9 100644 --- a/code/modules/mining/equipment/miningradio.dm +++ b/code/modules/mining/equipment/miningradio.dm @@ -1,6 +1,6 @@ /// Portable mining radio purchasable by miners /obj/item/radio/weather_monitor - icon = 'icons/obj/miningradio.dmi' + icon = 'icons/obj/devices/miningradio.dmi' name = "mining weather radio" icon_state = "miningradio" desc = "A weather radio designed for use in inhospitable environments. Gives audible warnings when storms approach. Has access to cargo channel." diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 8b82d4b7d77969..cd5a60a22f2ae6 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -109,7 +109,7 @@ var/datum/record/crew/target = find_record(user_mob.real_name) target?.wanted_status = WANTED_PAROLE - security_radio.talk_into(src, "/p [user_mob.name] returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY) + security_radio.talk_into(src, "[user_mob.name] returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY) user_mob.log_message("has completed their labor points goal and is now sending the gulag shuttle back to the station.", LOG_GAME) to_chat(user_mob, span_notice("Shuttle received message and will be sent shortly.")) return TRUE diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm index d82812b62a3923..2d2b69d119abf6 100644 --- a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm @@ -2,7 +2,7 @@ /datum/action/cooldown/spell/pointed/projectile/flesh_restraints name = "fleshy restraints" desc = "Launch at your prey to immobilize them." - button_icon = 'icons/obj/restraints.dmi' + button_icon = 'icons/obj/weapons/restraints.dmi' button_icon_state = "flesh_snare" cooldown_time = 6 SECONDS diff --git a/code/modules/mob/living/basic/jungle/venus_human_trap.dm b/code/modules/mob/living/basic/jungle/venus_human_trap.dm index 6c0a6e2f9db8ce..ec375283fcea07 100644 --- a/code/modules/mob/living/basic/jungle/venus_human_trap.dm +++ b/code/modules/mob/living/basic/jungle/venus_human_trap.dm @@ -216,15 +216,19 @@ QDEL_LIST(vines) return ..() -/datum/action/cooldown/mob_cooldown/projectile_attack/vine_tangle/Activate(atom/target_atom) - if(isturf(target_atom) || istype(target_atom, /obj/structure/spacevine)) +/datum/action/cooldown/mob_cooldown/projectile_attack/vine_tangle/Activate(atom/movable/target_atom) + if(!ismovable(target_atom) || istype(target_atom, /obj/structure/spacevine)) + return + if(target_atom.anchored) + owner.balloon_alert(owner, "can't pull!") return if(get_dist(owner, target_atom) > vine_grab_distance) owner.balloon_alert(owner, "too far!") return - for(var/turf/blockage in get_line(owner, target_atom)) + var/list/target_turfs = get_line(owner, target_atom) - list(get_turf(owner), get_turf(target_atom)) + for(var/turf/blockage in target_turfs) if(blockage.is_blocked_turf(exclude_mobs = TRUE)) - owner.balloon_alert(owner, "something's in the way!") + owner.balloon_alert(owner, "path blocked!") return var/datum/beam/new_vine = owner.Beam(target_atom, icon_state = "vine", time = vine_duration * (ismob(target_atom) ? 1 : 2), beam_type = /obj/effect/ebeam/vine, emissive = FALSE) diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm index 96c7319380a2e1..e2f4923e7f95f3 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm @@ -38,6 +38,7 @@ AddElement(/datum/element/simple_flying) AddComponent(/datum/component/swarming) AddComponent(/datum/component/clickbox, icon_state = "sphere", max_scale = 2) + AddComponent(/datum/component/basic_mob_attack_telegraph) addtimer(CALLBACK(src, PROC_REF(death)), 10 SECONDS) /mob/living/basic/legion_brood/death(gibbed) diff --git a/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm b/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm index bd9b2c2aff99f5..81691ff9135f67 100644 --- a/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm +++ b/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm @@ -7,7 +7,7 @@ background_icon_state = "bg_demon" overlay_icon_state = "bg_demon_border" click_to_activate = TRUE - cooldown_time = 2 SECONDS + cooldown_time = 4 SECONDS melee_cooldown_time = 0 shared_cooldown = NONE /// If a mob is not clicked directly, inherit targeting data from this blackboard key and setting it upon this target key @@ -17,6 +17,15 @@ /// How far can we fire? var/max_range = 7 +/datum/action/cooldown/mob_cooldown/skull_launcher/IsAvailable(feedback) + . = ..() + if (!.) + return + if (!isturf(owner.loc)) + owner.balloon_alert(owner, "no room!") + return FALSE + return TRUE + /datum/action/cooldown/mob_cooldown/skull_launcher/Activate(atom/target) var/turf/target_turf = get_turf(target) diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm index 88127b56cb602d..56994542b75ca9 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm @@ -29,10 +29,17 @@ /// Charging ability var/datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster/charge /// Things we will eat if we see them (arms, chiefly) - var/static/list/target_foods = list(/obj/item/bodypart/arm) + var/static/list/target_foods = list(/obj/item/bodypart/arm, /obj/item/fish/lavaloop) /mob/living/basic/mining/lobstrosity/Initialize(mapload) . = ..() + var/static/list/food_types = list(/obj/item/fish/lavaloop) + ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(food_types)) + var/static/list/fishing_preset = list( + /turf/open/lava = /datum/fish_source/lavaland, + /turf/open/lava/plasma = /datum/fish_source/lavaland/icemoon, + ) + AddComponent(/datum/component/profound_fisher, npc_fishing_preset = fishing_preset) AddElement(/datum/element/mob_grabber) AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) AddElement(/datum/element/basic_eating, food_types = target_foods) 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 c8e294f3e0644a..fb0ba437bf48c4 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm @@ -1,10 +1,11 @@ /datum/ai_controller/basic_controller/lobstrosity blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, BB_TARGET_MINIMUM_STAT = HARD_CRIT, BB_LOBSTROSITY_EXPLOIT_TRAITS = list(TRAIT_INCAPACITATED, TRAIT_FLOORED, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT), BB_LOBSTROSITY_FINGER_LUST = 0 ) + ai_traits = PAUSE_DURING_DO_AFTER ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk @@ -16,13 +17,22 @@ /datum/ai_planning_subtree/flee_target/lobster, /datum/ai_planning_subtree/attack_obstacle_in_path, /datum/ai_planning_subtree/basic_melee_attack_subtree/lobster, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/find_and_hunt_target/lobster_fishing, /datum/ai_planning_subtree/find_fingers, ) +/datum/ai_planning_subtree/find_and_hunt_target/lobster_fishing + target_key = BB_FISHING_TARGET + hunt_targets = list(/turf/open/lava) + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/reset_target + /datum/ai_planning_subtree/basic_melee_attack_subtree/lobster melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/lobster /datum/ai_planning_subtree/basic_melee_attack_subtree/lobster/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!isliving(controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET])) + return ..() if (!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) return if (!isnull(controller.blackboard[BB_LOBSTROSITY_TARGET_LIMB])) @@ -36,7 +46,7 @@ /datum/ai_behavior/basic_melee_attack/lobster/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) var/mob/living/target = controller.blackboard[target_key] - if (isnull(target)) + if (isnull(target) || !istype(target)) return ..() var/is_vulnerable = FALSE for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS]) diff --git a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm index d79ae5582f6968..d2b282f5b62357 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm @@ -1,10 +1,10 @@ GLOBAL_LIST_INIT(raptor_growth_paths, list( - /mob/living/basic/mining/raptor/baby_raptor/red = list(RAPTOR_PURPLE, RAPTOR_WHITE), - /mob/living/basic/mining/raptor/baby_raptor/white = list(RAPTOR_GREEN, RAPTOR_PURPLE), - /mob/living/basic/mining/raptor/baby_raptor/purple = list(RAPTOR_GREEN, RAPTOR_WHITE), - /mob/living/basic/mining/raptor/baby_raptor/yellow = list(RAPTOR_GREEN, RAPTOR_RED), - /mob/living/basic/mining/raptor/baby_raptor/green = list(RAPTOR_RED, RAPTOR_YELLOW), - /mob/living/basic/mining/raptor/baby_raptor/blue = list(RAPTOR_RED, RAPTOR_PURPLE) + /mob/living/basic/raptor/baby_raptor/red = list(RAPTOR_PURPLE, RAPTOR_WHITE), + /mob/living/basic/raptor/baby_raptor/white = list(RAPTOR_GREEN, RAPTOR_PURPLE), + /mob/living/basic/raptor/baby_raptor/purple = list(RAPTOR_GREEN, RAPTOR_WHITE), + /mob/living/basic/raptor/baby_raptor/yellow = list(RAPTOR_GREEN, RAPTOR_RED), + /mob/living/basic/raptor/baby_raptor/green = list(RAPTOR_RED, RAPTOR_YELLOW), + /mob/living/basic/raptor/baby_raptor/blue = list(RAPTOR_RED, RAPTOR_PURPLE) )) GLOBAL_LIST_INIT(raptor_inherit_traits, list( @@ -19,17 +19,21 @@ GLOBAL_LIST_EMPTY(raptor_population) #define HAPPINESS_BOOST_DAMPENER 0.3 -/mob/living/basic/mining/raptor +/mob/living/basic/raptor name = "raptor" desc = "A trusty, powerful steed. Taming it might prove difficult..." icon = 'icons/mob/simple/lavaland/raptor_big.dmi' speed = 2 mob_biotypes = MOB_ORGANIC|MOB_BEAST - maxHealth = 400 - health = 400 + maxHealth = 270 + health = 270 melee_damage_lower = 10 melee_damage_upper = 15 - sentience_type = SENTIENCE_BOSS + combat_mode = TRUE + mob_size = MOB_SIZE_LARGE + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = BODYTEMP_COLD_ICEBOX_SAFE + maximum_survivable_temperature = INFINITY attack_verb_continuous = "pecks" attack_verb_simple = "chomps" attack_sound = 'sound/weapons/punch1.ogg' @@ -60,12 +64,14 @@ GLOBAL_LIST_EMPTY(raptor_population) var/child_path -/mob/living/basic/mining/raptor/Initialize(mapload) +/mob/living/basic/raptor/Initialize(mapload) . = ..() if(SSmapping.is_planetary()) change_offsets = FALSE icon = 'icons/mob/simple/lavaland/raptor_icebox.dmi' + add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), INNATE_TRAIT) + if(!mapload) GLOB.raptor_population += REF(src) AddComponent(/datum/component/obeys_commands, pet_commands) @@ -103,7 +109,7 @@ GLOBAL_LIST_EMPTY(raptor_population) if(can_breed) AddComponent(\ /datum/component/breed,\ - can_breed_with = typecacheof(list(/mob/living/basic/mining/raptor)),\ + can_breed_with = typecacheof(list(/mob/living/basic/raptor)),\ baby_path = /obj/item/food/egg/raptor_egg,\ post_birth = CALLBACK(src, PROC_REF(egg_inherit)),\ breed_timer = 3 MINUTES,\ @@ -114,12 +120,12 @@ GLOBAL_LIST_EMPTY(raptor_population) add_happiness_component() -/mob/living/basic/mining/raptor/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, buckle_mob_flags= NONE) +/mob/living/basic/raptor/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, buckle_mob_flags= NONE) if(!iscarbon(target)) return return ..() -/mob/living/basic/mining/raptor/proc/add_happiness_component() +/mob/living/basic/raptor/proc/add_happiness_component() var/static/list/percentage_callbacks = list(0, 15, 25, 35, 50, 75, 90, 100) AddComponent(\ /datum/component/happiness,\ @@ -130,18 +136,18 @@ GLOBAL_LIST_EMPTY(raptor_population) happiness_callback = CALLBACK(src, PROC_REF(happiness_change)),\ ) -/mob/living/basic/mining/raptor/proc/on_dir_change(datum/source, old_dir, new_dir) +/mob/living/basic/raptor/proc/on_dir_change(datum/source, old_dir, new_dir) SIGNAL_HANDLER adjust_offsets(new_dir) -/mob/living/basic/mining/raptor/proc/adjust_offsets(direction) +/mob/living/basic/raptor/proc/adjust_offsets(direction) if(!change_offsets) return pixel_x = (direction & EAST) ? -20 : 0 pixel_y = (direction & NORTH) ? -5 : 0 -/mob/living/basic/mining/raptor/proc/pre_attack(mob/living/puncher, atom/target) +/mob/living/basic/raptor/proc/pre_attack(mob/living/puncher, atom/target) SIGNAL_HANDLER if(!istype(target, /obj/structure/ore_container/food_trough/raptor_trough)) @@ -155,30 +161,30 @@ GLOBAL_LIST_EMPTY(raptor_population) INVOKE_ASYNC(src, PROC_REF(melee_attack), ore_food) return COMPONENT_HOSTILE_NO_ATTACK -/mob/living/basic/mining/raptor/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) - if(!combat_mode && istype(target, /mob/living/basic/mining/raptor/baby_raptor)) +/mob/living/basic/raptor/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) + if(!combat_mode && istype(target, /mob/living/basic/raptor/baby_raptor)) target.attack_hand(src, list(LEFT_CLICK = TRUE)) return return ..() -/mob/living/basic/mining/raptor/death(gibbed) +/mob/living/basic/raptor/death(gibbed) . = ..() GLOB.raptor_population -= REF(src) -/mob/living/basic/mining/raptor/proc/happiness_change(percent_value) +/mob/living/basic/raptor/proc/happiness_change(percent_value) var/attack_boost = round(initial(melee_damage_lower) * percent_value * HAPPINESS_BOOST_DAMPENER, 1) melee_damage_lower = initial(melee_damage_lower) + attack_boost melee_damage_upper = melee_damage_lower + 5 ///pass down our inheritance to the egg -/mob/living/basic/mining/raptor/proc/egg_inherit(obj/item/food/egg/raptor_egg/baby_egg, mob/living/basic/mining/raptor/partner) +/mob/living/basic/raptor/proc/egg_inherit(obj/item/food/egg/raptor_egg/baby_egg, mob/living/basic/raptor/partner) var/datum/raptor_inheritance/inherit = new inherit.set_parents(inherited_stats, partner.inherited_stats) baby_egg.inherited_stats = inherit baby_egg.determine_growth_path(src, partner) -/mob/living/basic/mining/raptor/proc/inherit_properties() +/mob/living/basic/raptor/proc/inherit_properties() if(isnull(inherited_stats)) return for(var/trait in GLOB.raptor_inherit_traits) // done this way to allow overriding of traits when assigned new inherit datum @@ -189,11 +195,11 @@ GLOBAL_LIST_EMPTY(raptor_population) maxHealth += inherited_stats.health_modifier heal_overall_damage(maxHealth) -/mob/living/basic/mining/raptor/Destroy() +/mob/living/basic/raptor/Destroy() QDEL_NULL(inherited_stats) return ..() -/mob/living/basic/mining/raptor/red +/mob/living/basic/raptor/red name = "red raptor" icon_state = "raptor_red" icon_living = "raptor_red" @@ -203,18 +209,18 @@ GLOBAL_LIST_EMPTY(raptor_population) raptor_color = RAPTOR_RED dex_description = "A resilient breed of raptors, battle-tested and bred for the purpose of humbling its foes in combat, \ This breed demonstrates higher combat capabilities than its peers and oozes ruthless aggression." - child_path = /mob/living/basic/mining/raptor/baby_raptor/red + child_path = /mob/living/basic/raptor/baby_raptor/red -/mob/living/basic/mining/raptor/purple +/mob/living/basic/raptor/purple name = "purple raptor" icon_state = "raptor_purple" icon_living = "raptor_purple" icon_dead = "raptor_purple_dead" raptor_color = RAPTOR_PURPLE dex_description = "A dependable mount, bred for the purpose of long distance pilgrimages. This breed is also able to store its rider's possessions." - child_path = /mob/living/basic/mining/raptor/baby_raptor/purple + child_path = /mob/living/basic/raptor/baby_raptor/purple -/mob/living/basic/mining/raptor/purple/Initialize(mapload) +/mob/living/basic/raptor/purple/Initialize(mapload) . = ..() create_storage( max_specific_storage = WEIGHT_CLASS_NORMAL, @@ -222,57 +228,57 @@ GLOBAL_LIST_EMPTY(raptor_population) storage_type = /datum/storage/raptor_storage, ) -/mob/living/basic/mining/raptor/green +/mob/living/basic/raptor/green name = "green raptor" icon_state = "raptor_green" icon_living = "raptor_green" icon_dead = "raptor_green_dead" - maxHealth = 460 - health = 460 + maxHealth = 400 + health = 400 raptor_color = RAPTOR_GREEN dex_description = "A tough breed of raptor, made to withstand the harshest of punishment and to laugh in the face of pain, \ this breed is able to withstand more punishment than its peers." - child_path = /mob/living/basic/mining/raptor/baby_raptor/green + child_path = /mob/living/basic/raptor/baby_raptor/green -/mob/living/basic/mining/raptor/green/Initialize(mapload) +/mob/living/basic/raptor/green/Initialize(mapload) . = ..() AddElement(/datum/element/proficient_miner) -/mob/living/basic/mining/raptor/white +/mob/living/basic/raptor/white name = "white raptor" icon_state = "raptor_white" icon_living = "raptor_white" icon_dead = "raptor_white_dead" raptor_color = RAPTOR_WHITE dex_description = "A loving sort, it cares for it peers and rushes to their aid with reckless abandon. It is able to heal any raptors' ailments." - child_path = /mob/living/basic/mining/raptor/baby_raptor/white + child_path = /mob/living/basic/raptor/baby_raptor/white -/mob/living/basic/mining/raptor/white/Initialize(mapload) +/mob/living/basic/raptor/white/Initialize(mapload) . = ..() AddComponent(\ /datum/component/healing_touch,\ heal_brute = melee_damage_upper,\ heal_burn = melee_damage_upper,\ heal_time = 0,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/mining/raptor)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/raptor)),\ ) -/mob/living/basic/mining/raptor/black +/mob/living/basic/raptor/black name = "black raptor" icon_state = "raptor_black" icon_living = "raptor_black" icon_dead = "raptor_black_dead" - maxHealth = 460 - health = 460 + maxHealth = 400 + health = 400 speed = 1 ridable_component = /datum/component/riding/creature/raptor/fast melee_damage_lower = 20 melee_damage_upper = 25 raptor_color = RAPTOR_BLACK dex_description = "An ultra rare breed. Due to its sparse nature, not much is known about this sort. However it is said to possess many of its peers' abilities." - child_path = /mob/living/basic/mining/raptor/baby_raptor/black + child_path = /mob/living/basic/raptor/baby_raptor/black -/mob/living/basic/mining/raptor/yellow +/mob/living/basic/raptor/yellow name = "yellow raptor" icon_state = "raptor_yellow" icon_living = "raptor_yellow" @@ -281,18 +287,18 @@ GLOBAL_LIST_EMPTY(raptor_population) speed = 1 raptor_color = RAPTOR_YELLOW dex_description = "This breed possesses greasy fast speed, DEMON speed, making light work of long pilgrimages. It's said that a thunderclap could be heard when this breed reaches its maximum speed." - child_path = /mob/living/basic/mining/raptor/baby_raptor/yellow + child_path = /mob/living/basic/raptor/baby_raptor/yellow -/mob/living/basic/mining/raptor/blue +/mob/living/basic/raptor/blue name = "blue raptor" icon_state = "raptor_blue" icon_living = "raptor_blue" icon_dead = "raptor_blue_dead" raptor_color = RAPTOR_BLUE dex_description = "Known to produce nutritous and equally delicious milk, which is also said to possess healing properties." - child_path = /mob/living/basic/mining/raptor/baby_raptor/blue + child_path = /mob/living/basic/raptor/baby_raptor/blue -/mob/living/basic/mining/raptor/blue/Initialize(mapload) +/mob/living/basic/raptor/blue/Initialize(mapload) . = ..() AddComponent(\ /datum/component/udder,\ diff --git a/code/modules/mob/living/basic/lavaland/raptor/baby_raptor.dm b/code/modules/mob/living/basic/lavaland/raptor/baby_raptor.dm index a0a4f6aebc12aa..06d9fed8470889 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/baby_raptor.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/baby_raptor.dm @@ -1,4 +1,4 @@ -/mob/living/basic/mining/raptor/baby_raptor +/mob/living/basic/raptor/baby_raptor name = "baby raptor" desc = "Will this grow into something useful?" icon = 'icons/mob/simple/lavaland/raptor_baby.dmi' @@ -20,7 +20,7 @@ ///probability we are to be rolled var/roll_rate = 100 -/mob/living/basic/mining/raptor/baby_raptor/Initialize(mapload) +/mob/living/basic/raptor/baby_raptor/Initialize(mapload) . = ..() if(isnull(growth_path)) return @@ -36,14 +36,14 @@ optional_grow_behavior = CALLBACK(src, PROC_REF(ready_to_grow)),\ ) -/mob/living/basic/mining/raptor/baby_raptor/add_happiness_component() +/mob/living/basic/raptor/baby_raptor/add_happiness_component() AddComponent(/datum/component/happiness, on_petted_change = 100) -/mob/living/basic/mining/raptor/baby_raptor/proc/check_grow() +/mob/living/basic/raptor/baby_raptor/proc/check_grow() return (stat != DEAD) -/mob/living/basic/mining/raptor/baby_raptor/proc/ready_to_grow() - var/mob/living/basic/mining/raptor/grown_mob = new growth_path(get_turf(src)) +/mob/living/basic/raptor/baby_raptor/proc/ready_to_grow() + var/mob/living/basic/raptor/grown_mob = new growth_path(get_turf(src)) QDEL_NULL(grown_mob.inherited_stats) grown_mob.inherited_stats = inherited_stats inherited_stats = null @@ -51,52 +51,52 @@ ADD_TRAIT(grown_mob, TRAIT_MOB_HATCHED, INNATE_TRAIT) //pass on the hatched trait qdel(src) -/mob/living/basic/mining/raptor/baby_raptor/black +/mob/living/basic/raptor/baby_raptor/black name = "baby black raptor" icon_state = "baby_black" icon_living = "baby_black" icon_dead = "baby_black_dead" - growth_path = /mob/living/basic/mining/raptor/black + growth_path = /mob/living/basic/raptor/black roll_rate = 10 -/mob/living/basic/mining/raptor/baby_raptor/red +/mob/living/basic/raptor/baby_raptor/red name = "baby red raptor" icon_state = "baby_red" icon_living = "baby_red" icon_dead = "baby_red_dead" - growth_path = /mob/living/basic/mining/raptor/red + growth_path = /mob/living/basic/raptor/red -/mob/living/basic/mining/raptor/baby_raptor/purple +/mob/living/basic/raptor/baby_raptor/purple name = "baby purple raptor" icon_state = "baby_purple" icon_living = "baby_purple" icon_dead = "baby_purple_dead" - growth_path = /mob/living/basic/mining/raptor/purple + growth_path = /mob/living/basic/raptor/purple -/mob/living/basic/mining/raptor/baby_raptor/white +/mob/living/basic/raptor/baby_raptor/white name = "baby white raptor" icon_state = "baby_white" icon_living = "baby_white" icon_dead = "baby_white_dead" - growth_path = /mob/living/basic/mining/raptor/white + growth_path = /mob/living/basic/raptor/white -/mob/living/basic/mining/raptor/baby_raptor/yellow +/mob/living/basic/raptor/baby_raptor/yellow name = "baby yellow raptor" icon_state = "baby_yellow" icon_living = "baby_yellow" icon_dead = "baby_yellow_dead" - growth_path = /mob/living/basic/mining/raptor/yellow + growth_path = /mob/living/basic/raptor/yellow -/mob/living/basic/mining/raptor/baby_raptor/green +/mob/living/basic/raptor/baby_raptor/green name = "baby green raptor" icon_state = "baby_green" icon_living = "baby_green" icon_dead = "baby_green_dead" - growth_path = /mob/living/basic/mining/raptor/green + growth_path = /mob/living/basic/raptor/green -/mob/living/basic/mining/raptor/baby_raptor/blue +/mob/living/basic/raptor/baby_raptor/blue name = "baby blue raptor" icon_state = "baby_blue" icon_living = "baby_blue" icon_dead = "baby_blue_dead" - growth_path = /mob/living/basic/mining/raptor/blue + growth_path = /mob/living/basic/raptor/blue 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 323f8422d2fd01..e036be575c9728 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 @@ -10,8 +10,8 @@ ), BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/raptor, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/raptor, - BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/mining/raptor), - BB_BABIES_CHILD_TYPES = list(/mob/living/basic/mining/raptor/baby_raptor), + BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/raptor), + BB_BABIES_CHILD_TYPES = list(/mob/living/basic/raptor/baby_raptor), BB_MAX_CHILDREN = 5, ) @@ -53,8 +53,8 @@ /datum/ai_controller/basic_controller/baby_raptor blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/raptor, - BB_FIND_MOM_TYPES = list(/mob/living/basic/mining/raptor), - BB_IGNORE_MOM_TYPES = list(/mob/living/basic/mining/raptor/baby_raptor), + BB_FIND_MOM_TYPES = list(/mob/living/basic/raptor), + BB_IGNORE_MOM_TYPES = list(/mob/living/basic/raptor/baby_raptor), ) ai_movement = /datum/ai_movement/basic_avoidance 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 9dcb360c65d82d..7ba0dad5561f65 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 @@ -2,7 +2,7 @@ target_key = BB_INJURED_RAPTOR hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/heal_raptor finding_behavior = /datum/ai_behavior/find_hunt_target/injured_raptor - hunt_targets = list(/mob/living/basic/mining/raptor) + hunt_targets = list(/mob/living/basic/raptor) hunt_chance = 70 hunt_range = 9 @@ -15,7 +15,7 @@ target_key = BB_RAPTOR_VICTIM hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/bully_raptors finding_behavior = /datum/ai_behavior/find_hunt_target/raptor_victim - hunt_targets = list(/mob/living/basic/mining/raptor) + hunt_targets = list(/mob/living/basic/raptor) hunt_chance = 30 hunt_range = 9 @@ -38,7 +38,7 @@ target_key = BB_RAPTOR_BABY hunting_behavior = /datum/ai_behavior/hunt_target/care_for_young finding_behavior = /datum/ai_behavior/find_hunt_target/raptor_baby - hunt_targets = list(/mob/living/basic/mining/raptor/baby_raptor) + hunt_targets = list(/mob/living/basic/raptor/baby_raptor) hunt_chance = 75 hunt_range = 9 diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm index 7080c91a500c73..ef7e6fa3167c69 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm @@ -19,7 +19,7 @@ /obj/item/raptor_dex/ui_static_data(mob/user) var/list/data = list() - var/mob/living/basic/mining/raptor/my_raptor = raptor.resolve() + var/mob/living/basic/raptor/my_raptor = raptor.resolve() data["raptor_image"] = icon2base64(getFlatIcon(image(icon = my_raptor.icon, icon_state = my_raptor.icon_state))) data["raptor_attack"] = my_raptor.melee_damage_lower @@ -44,7 +44,7 @@ data["inherited_attack_max"] = RAPTOR_INHERIT_MAX_ATTACK data["inherited_health"] = inherit.health_modifier data["inherited_health_max"] = RAPTOR_INHERIT_MAX_HEALTH - + data["inherited_traits"] = list() for(var/index in inherit.inherit_traits) data["inherited_traits"] += GLOB.raptor_inherit_traits[index] @@ -52,7 +52,7 @@ /obj/item/raptor_dex/interact_with_atom(atom/attacked_atom, mob/living/user) - if(!istype(attacked_atom, /mob/living/basic/mining/raptor)) + if(!istype(attacked_atom, /mob/living/basic/raptor)) return NONE raptor = WEAKREF(attacked_atom) diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_egg.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_egg.dm index 9fb72239ca7a30..1b980857562e16 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_egg.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_egg.dm @@ -9,7 +9,7 @@ if(SSmapping.is_planetary()) icon = 'icons/mob/simple/lavaland/raptor_icebox.dmi' -/obj/item/food/egg/raptor_egg/proc/determine_growth_path(mob/living/basic/mining/raptor/dad, mob/living/basic/mining/raptor/mom) +/obj/item/food/egg/raptor_egg/proc/determine_growth_path(mob/living/basic/raptor/dad, mob/living/basic/raptor/mom) if(dad.type == mom.type) add_growth_component(dad.child_path) return @@ -24,9 +24,9 @@ add_growth_component(path) return var/list/valid_subtypes = list() - var/static/list/all_subtypes = subtypesof(/mob/living/basic/mining/raptor/baby_raptor) + var/static/list/all_subtypes = subtypesof(/mob/living/basic/raptor/baby_raptor) for(var/path in all_subtypes) - var/mob/living/basic/mining/raptor/baby_raptor/raptor_path = path + var/mob/living/basic/raptor/baby_raptor/raptor_path = path if(!prob(initial(raptor_path.roll_rate))) continue valid_subtypes += raptor_path @@ -46,7 +46,7 @@ post_hatch = CALLBACK(src, PROC_REF(post_hatch)),\ ) -/obj/item/food/egg/raptor_egg/proc/post_hatch(mob/living/basic/mining/raptor/baby) +/obj/item/food/egg/raptor_egg/proc/post_hatch(mob/living/basic/raptor/baby) if(!istype(baby)) return QDEL_NULL(baby.inherited_stats) 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 92f433bd08a052..1452dd18dee091 100644 --- a/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm +++ b/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm @@ -22,12 +22,12 @@ . = ..() if(. & AI_CONTROLLER_INCOMPATIBLE) return - RegisterSignal(new_pawn, COMSIG_AI_BLACKBOARD_KEY_SET(BB_LAST_RECIEVED_MESSAGE), PROC_REF(on_set_message)) + RegisterSignal(new_pawn, COMSIG_AI_BLACKBOARD_KEY_SET(BB_LAST_RECEIVED_MESSAGE), PROC_REF(on_set_message)) /datum/ai_controller/basic_controller/orbie/proc/on_set_message(datum/source) SIGNAL_HANDLER - addtimer(CALLBACK(src, PROC_REF(clear_blackboard_key), BB_LAST_RECIEVED_MESSAGE), MESSAGE_EXPIRY_TIME) + addtimer(CALLBACK(src, PROC_REF(clear_blackboard_key), BB_LAST_RECEIVED_MESSAGE), MESSAGE_EXPIRY_TIME) ///ai behavior that lets us search for other orbies to play with /datum/ai_planning_subtree/find_playmates @@ -84,10 +84,10 @@ /datum/ai_planning_subtree/relay_pda_message /datum/ai_planning_subtree/relay_pda_message/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - if(controller.blackboard[BB_VIRTUAL_PET_LEVEL] < 2 || isnull(controller.blackboard[BB_LAST_RECIEVED_MESSAGE])) + if(controller.blackboard[BB_VIRTUAL_PET_LEVEL] < 2 || isnull(controller.blackboard[BB_LAST_RECEIVED_MESSAGE])) return - controller.queue_behavior(/datum/ai_behavior/relay_pda_message, BB_LAST_RECIEVED_MESSAGE) + controller.queue_behavior(/datum/ai_behavior/relay_pda_message, BB_LAST_RECEIVED_MESSAGE) /datum/ai_behavior/relay_pda_message/perform(seconds_per_tick, datum/ai_controller/controller, target_key) var/mob/living/basic/living_pawn = controller.pawn diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index f901be8340b6a4..2f8848b378020c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -117,12 +117,14 @@ throw_mode = THROW_MODE_DISABLED if(hud_used) hud_used.throw_icon.icon_state = "act_throw_off" + SEND_SIGNAL(src, COMSIG_LIVING_THROW_MODE_TOGGLE, throw_mode) /mob/living/carbon/proc/throw_mode_on(mode = THROW_MODE_TOGGLE) throw_mode = mode if(hud_used) hud_used.throw_icon.icon_state = "act_throw_on" + SEND_SIGNAL(src, COMSIG_LIVING_THROW_MODE_TOGGLE, throw_mode) /mob/proc/throw_item(atom/target) SEND_SIGNAL(src, COMSIG_MOB_THROW, target) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 30ff21ccc39894..aeba381703b101 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -128,20 +128,21 @@ return FALSE return adjustFireLoss(diff, updating_health, forced, required_bodytype) -/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) - if(!can_adjust_tox_loss(amount, forced, required_biotype)) - return 0 - if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage - amount = -amount - if(HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing - amount = min(amount, 0) - if(amount > 0) - blood_volume = max(blood_volume - (5*amount), 0) - else - blood_volume = max(blood_volume - amount, 0) - else if(!forced && HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing - amount = min(amount, 0) - return ..() +/mob/living/carbon/human/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) + . = ..() + if(. >= 0) // 0 = no damage, + values = healed damage + return . + + if(AT_TOXIN_VOMIT_THRESHOLD(src)) + apply_status_effect(/datum/status_effect/tox_vomit) + +/mob/living/carbon/human/setToxLoss(amount, updating_health, forced, required_biotype) + . = ..() + if(. >= 0) + return . + + if(AT_TOXIN_VOMIT_THRESHOLD(src)) + apply_status_effect(/datum/status_effect/tox_vomit) /mob/living/carbon/adjustStaminaLoss(amount, updating_stamina, forced, required_biotype = ALL) . = ..() diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 82d51c173cb050..778522b4d422f3 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1663,7 +1663,7 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/get_species_perks() var/list/species_perks = list() - // Let us get every perk we can concieve of in one big list. + // Let us get every perk we can conceive of in one big list. // The order these are called (kind of) matters. // Species unique perks first, as they're more important than genetic perks, // and language perk last, as it comes at the end of the perks list diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 84d1c45466873e..5ee91f88d1bcee 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -71,7 +71,7 @@ /mob/living/carbon/human, /mob/living/basic/slime, )) - var/lastpuke = 0 + var/account_id var/hardcore_survival_score = 0 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index be355bddbea281..d8119c6a5279a5 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -270,19 +270,6 @@ return min(1, thermal_protection) -/mob/living/carbon/human/handle_random_events(seconds_per_tick, times_fired) - //Puke if toxloss is too high - if(stat) - return - if(getToxLoss() < 45 || nutrition <= 20) - return - - lastpuke += SPT_PROB(30, seconds_per_tick) - if(lastpuke >= 50) // about 25 second delay I guess // This is actually closer to 150 seconds - vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 20) - lastpuke = 0 - - /mob/living/carbon/human/has_smoke_protection() if(isclothing(wear_mask)) if(wear_mask.clothing_flags & BLOCK_GAS_SMOKE_EFFECT) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index e5f91b1b1b81aa..e5aa87a94228d0 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -317,11 +317,6 @@ // Clear moodlet if no miasma at all. clear_mood_event("smell") else - // Miasma sickness - if(prob(1 * miasma_pp)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(max_symptoms = 2, max_level = 3) - miasma_disease.name = "Unknown" - ForceContractDisease(miasma_disease, make_copy = TRUE, del_on_fail = TRUE) // Miasma side-effects. if (HAS_TRAIT(src, TRAIT_ANOSMIA)) //We can't feel miasma without sense of smell return diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 286a3b30ed8432..49f7a7d7701b67 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -359,14 +359,31 @@ /mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!can_adjust_tox_loss(amount, forced, required_biotype)) return 0 + + if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage + amount = -amount + if(HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing + amount = min(amount, 0) + if(blood_volume) + if(amount > 0) + blood_volume = max(blood_volume - (5 * amount), 0) + else + blood_volume = max(blood_volume - amount, 0) + + else if(!forced && HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing + amount = min(amount, 0) + . = toxloss toxloss = clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) . -= toxloss + if(!.) // no change, no need to update return FALSE + if(updating_health) updatehealth() + /mob/living/proc/setToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && (status_flags & GODMODE)) return FALSE diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index 8415881a83a240..064a0573353ebf 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -87,7 +87,7 @@ SIGNAL_HANDLER REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, TRAIT_DEATHCOMA) -/// Updates medhud when recieving relevant signals. +/// Updates medhud when receiving relevant signals. /mob/living/proc/update_medhud_on_signal(datum/source) SIGNAL_HANDLER med_hud_set_health() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index dd7e8a17c9bf2d..7c2af9a15724e9 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -53,10 +53,6 @@ if (QDELETED(src)) // diseases can qdel the mob via transformations return - if(stat != DEAD) - //Random events (vomiting etc) - handle_random_events(seconds_per_tick, times_fired) - //Handle temperature/pressure differences between body and environment var/datum/gas_mixture/environment = loc.return_air() if(environment) @@ -82,9 +78,6 @@ /mob/living/proc/handle_wounds(seconds_per_tick, times_fired) return -/mob/living/proc/handle_random_events(seconds_per_tick, times_fired) - return - // Base mob environment handler for body temperature /mob/living/proc/handle_environment(datum/gas_mixture/environment, seconds_per_tick, times_fired) var/loc_temp = get_temperature(environment) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1b1e02c83d910a..161ae4e7e965fa 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -609,10 +609,11 @@ * Returns the access list for this mob */ /mob/living/proc/get_access() + var/list/access_list = list() + SEND_SIGNAL(src, COMSIG_MOB_RETRIEVE_SIMPLE_ACCESS, access_list) var/obj/item/card/id/id = get_idcard() - if(isnull(id)) - return list() - return id.GetAccess() + access_list += id?.GetAccess() + return access_list /mob/living/proc/get_id_in_hand() var/obj/item/held_item = get_active_held_item() diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index 8980a1017f2065..97ea9ebedc9e46 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -24,7 +24,7 @@ /atom/movable/screen/movable/pic_in_pic/ai/make_backgrounds() ..() highlighted_background = new /mutable_appearance() - highlighted_background.icon = 'icons/misc/pic_in_pic.dmi' + highlighted_background.icon = 'icons/hud/pic_in_pic.dmi' highlighted_background.icon_state = "background_highlight" highlighted_background.layer = SPACE_LAYER @@ -84,7 +84,7 @@ /turf/open/ai_visible name = "" - icon = 'icons/misc/pic_in_pic.dmi' + icon = 'icons/hud/pic_in_pic.dmi' icon_state = "room_background" turf_flags = NOJAUNT diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm index ea048482e4f1f5..31d2e62fba7dc1 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm @@ -20,6 +20,10 @@ maxbodytemp = INFINITY vision_range = 5 aggro_vision_range = 18 + // Pale purple, should be red enough to see stuff on lavaland + lighting_cutoff_red = 25 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 35 move_force = MOVE_FORCE_OVERPOWERING move_resist = MOVE_FORCE_OVERPOWERING pull_force = MOVE_FORCE_OVERPOWERING diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm index d39c8a3e52bd98..8fc667df5a876e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -1,10 +1,4 @@ #define WENDIGO_ENRAGED (health <= maxHealth*0.5) -#define WENDIGO_CIRCLE_SHOTCOUNT 24 -#define WENDIGO_CIRCLE_REPEATCOUNT 8 -#define WENDIGO_SPIRAL_SHOTCOUNT 40 -#define WENDIGO_WAVE_SHOTCOUNT 7 -#define WENDIGO_WAVE_REPEATCOUNT 32 -#define WENDIGO_SHOTGUN_SHOTCOUNT 5 /* @@ -51,9 +45,6 @@ Difficulty: Hard death_message = "falls to the ground in a bloody heap, shaking the arena." death_sound = 'sound/effects/gravhit.ogg' footstep_type = FOOTSTEP_MOB_HEAVY - attack_action_types = list(/datum/action/innate/megafauna_attack/heavy_stomp, - /datum/action/innate/megafauna_attack/teleport, - /datum/action/innate/megafauna_attack/shockwave_scream) summon_line = "GwaHOOOOOOOOOOOOOOOOOOOOO" /// Saves the turf the megafauna was created at (spawns exit portal here) var/turf/starting @@ -61,37 +52,38 @@ Difficulty: Hard var/stomp_range = 1 /// Stores directions the mob is moving, then calls that a move has fully ended when these directions are removed in moved var/stored_move_dirs = 0 - /// If the wendigo is allowed to move - var/can_move = TRUE /// Time before the wendigo can scream again var/scream_cooldown_time = 10 SECONDS + /// Teleport Ability + var/datum/action/cooldown/mob_cooldown/teleport/teleport + /// Shotgun Ability + var/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/wendigo/shotgun_blast + /// Ground Slam Ability + var/datum/action/cooldown/mob_cooldown/ground_slam/ground_slam + /// Alternating Projectiles Ability + var/datum/action/cooldown/mob_cooldown/projectile_attack/alternating_circle/alternating_circle + /// Spiral Projectiles Ability + var/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/wendigo/spiral + /// Wave Projectiles Ability + var/datum/action/cooldown/mob_cooldown/projectile_attack/wave/wave /// Stores the last scream time so it doesn't spam it COOLDOWN_DECLARE(scream_cooldown) /mob/living/simple_animal/hostile/megafauna/wendigo/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) - -/datum/action/innate/megafauna_attack/heavy_stomp - name = "Heavy Stomp" - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "sniper_zoom" - chosen_message = "You are now stomping the ground around you." - chosen_attack_num = 1 - -/datum/action/innate/megafauna_attack/teleport - name = "Teleport" - button_icon = 'icons/effects/bubblegum.dmi' - button_icon_state = "smack ya one" - chosen_message = "You are now teleporting at the target you click on." - chosen_attack_num = 2 - -/datum/action/innate/megafauna_attack/shockwave_scream - name = "Shockwave Scream" - button_icon = 'icons/mob/actions/actions_animal.dmi' - button_icon_state = "expand" - chosen_message = "You are now screeching, disorienting targets around you." - chosen_attack_num = 3 + teleport = new(src) + shotgun_blast = new(src) + ground_slam = new(src) + alternating_circle = new(src) + spiral = new(src) + wave = new(src) + teleport.Grant(src) + shotgun_blast.Grant(src) + ground_slam.Grant(src) + alternating_circle.Grant(src) + spiral.Grant(src) + wave.Grant(src) /mob/living/simple_animal/hostile/megafauna/wendigo/Initialize(mapload) . = ..() @@ -108,13 +100,6 @@ Difficulty: Hard move_to_delay = initial(move_to_delay) if(client) - switch(chosen_attack) - if(1) - heavy_stomp() - if(2) - try_teleport() - if(3) - shockwave_scream() return var/mob/living/living_target = target @@ -127,28 +112,54 @@ Difficulty: Hard chosen_attack = rand(1, 2) switch(chosen_attack) if(1) - heavy_stomp() + ground_slam.Activate(target) if(2) - try_teleport() + teleport.Activate(target) + if(WENDIGO_ENRAGED) + shotgun_blast.Activate(target) if(3) do_teleport(src, starting, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE) - shockwave_scream() + var/shockwave_attack + if(WENDIGO_ENRAGED) + shockwave_attack = rand(1, 3) + else + shockwave_attack = rand(1, 2) + switch(shockwave_attack) + if(1) + alternating_circle.enraged = WENDIGO_ENRAGED + alternating_circle.Activate(target) + if(2) + spiral.enraged = WENDIGO_ENRAGED + spiral.Activate(target) + if(3) + wave.Activate(target) + update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 3 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 3 SECONDS)) /mob/living/simple_animal/hostile/megafauna/wendigo/Move(atom/newloc, direct) - if(!can_move) - return stored_move_dirs |= direct - return ..() + . = ..() + // Remove after anyways in case the movement was prevented + stored_move_dirs &= ~direct /mob/living/simple_animal/hostile/megafauna/wendigo/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() stored_move_dirs &= ~movement_dir if(!stored_move_dirs) - INVOKE_ASYNC(src, PROC_REF(wendigo_slam), stomp_range, 1, 8) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(wendigo_slam), src, stomp_range, 1, 8) -/// Slams the ground around the source throwing back enemies caught nearby, delay is for the radius increase -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/wendigo_slam(range, delay, throw_range) - var/turf/origin = get_turf(src) +/proc/wendigo_scream(mob/owner) + SLEEP_CHECK_DEATH(5, owner) + playsound(owner.loc, 'sound/magic/demon_dies.ogg', 600, FALSE, 10) + var/pixel_shift = rand(5, 15) + animate(owner, pixel_z = pixel_shift, time = 1, loop = 20, flags = ANIMATION_RELATIVE) + animate(pixel_z = -pixel_shift, time = 1, flags = ANIMATION_RELATIVE) + for(var/mob/living/dizzy_target in get_hearers_in_view(7, owner) - owner) + dizzy_target.set_dizzy_if_lower(12 SECONDS) + to_chat(dizzy_target, span_danger("[owner] screams loudly!")) + SLEEP_CHECK_DEATH(1 SECONDS, owner) + +/proc/wendigo_slam(mob/owner, range, delay, throw_range) + var/turf/origin = get_turf(owner) if(!origin) return var/list/all_turfs = RANGE_TURFS(range, origin) @@ -158,117 +169,16 @@ Difficulty: Hard if(get_dist(origin, stomp_turf) > sound_range) continue new /obj/effect/temp_visual/small_smoke/halfsecond(stomp_turf) - for(var/mob/living/target in stomp_turf) - if(target == src || target.throwing) + for(var/mob/living/hit_mob in stomp_turf) + if(hit_mob == owner || hit_mob.throwing) continue - to_chat(target, span_userdanger("[src]'s ground slam shockwave sends you flying!")) - var/turf/thrownat = get_ranged_target_turf_direct(src, target, throw_range, rand(-10, 10)) - target.throw_at(thrownat, 8, 2, null, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE) - target.apply_damage(20, BRUTE, wound_bonus=CANT_WOUND) - shake_camera(target, 2, 1) + to_chat(hit_mob, span_userdanger("[owner]'s ground slam shockwave sends you flying!")) + var/turf/thrownat = get_ranged_target_turf_direct(owner, hit_mob, throw_range, rand(-10, 10)) + hit_mob.throw_at(thrownat, 8, 2, null, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE) + hit_mob.apply_damage(20, BRUTE, wound_bonus=CANT_WOUND) + shake_camera(hit_mob, 2, 1) all_turfs -= stomp_turf - sleep(delay) - -/// Larger but slower ground stomp -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/heavy_stomp() - can_move = FALSE - wendigo_slam(5, 3 - WENDIGO_ENRAGED, 8) - update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 0 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 0 SECONDS)) - can_move = TRUE - -/// Teleports to a location 4 turfs away from the enemy in view -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/try_teleport() - teleport(6) - if(WENDIGO_ENRAGED) - playsound(loc, 'sound/magic/clockwork/invoke_general.ogg', 100, TRUE) - for(var/shots in 1 to WENDIGO_SHOTGUN_SHOTCOUNT) - var/spread = shots * 10 - 30 - var/turf/startloc = get_step(get_turf(src), get_dir(src, target)) - var/turf/endloc = get_turf(target) - if(!endloc) - break - var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc) - shockwave.speed = 8 - shockwave.preparePixelProjectile(endloc, startloc, null, spread) - shockwave.firer = src - if(target) - shockwave.original = target - shockwave.fire() - update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 0 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 0 SECONDS)) - -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/teleport(range = 6) - var/list/possible_ends = view(range, target.loc) - view(range - 1, target.loc) - for(var/turf/closed/cant_teleport_turf in possible_ends) - possible_ends -= cant_teleport_turf - if(!possible_ends.len) - return - var/turf/end = pick(possible_ends) - do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE) - -/// Applies dizziness to all nearby enemies that can hear the scream and animates the wendigo shaking up and down as shockwave projectiles shoot outward -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/shockwave_scream() - can_move = FALSE - COOLDOWN_START(src, scream_cooldown, scream_cooldown_time) - SLEEP_CHECK_DEATH(5, src) - playsound(loc, 'sound/magic/demon_dies.ogg', 600, FALSE, 10) - var/pixel_shift = rand(5, 15) - animate(src, pixel_z = pixel_shift, time = 1, loop = 20, flags = ANIMATION_RELATIVE) - animate(pixel_z = -pixel_shift, time = 1, flags = ANIMATION_RELATIVE) - for(var/mob/living/dizzy_target in get_hearers_in_view(7, src) - src) - dizzy_target.set_dizzy_if_lower(12 SECONDS) - to_chat(dizzy_target, span_danger("The wendigo screams loudly!")) - SLEEP_CHECK_DEATH(1 SECONDS, src) - spiral_attack() - update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 3 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 3 SECONDS)) - SLEEP_CHECK_DEATH(3 SECONDS, src) - can_move = TRUE - -/// Shoots shockwave projectiles in a random preset pattern -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/spiral_attack() - var/list/choices = list("Alternating Circle", "Spiral") - if(WENDIGO_ENRAGED) - choices += "Wave" - var/spiral_type = pick(choices) - switch(spiral_type) - if("Alternating Circle") - var/shots_per = WENDIGO_CIRCLE_SHOTCOUNT - for(var/shoot_times in 1 to WENDIGO_CIRCLE_REPEATCOUNT) - var/offset = shoot_times % 2 - for(var/shot in 1 to shots_per) - var/angle = shot * 360 / shots_per + (offset * 360 / shots_per) * 0.5 - var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc) - shockwave.firer = src - shockwave.speed = 3 - WENDIGO_ENRAGED - shockwave.fire(angle) - SLEEP_CHECK_DEATH(6 - WENDIGO_ENRAGED * 2, src) - if("Spiral") - var/shots_spiral = WENDIGO_SPIRAL_SHOTCOUNT - var/angle_to_target = get_angle(src, target) - var/spiral_direction = pick(-1, 1) - for(var/shot in 1 to shots_spiral) - var/shots_per_tick = 5 - WENDIGO_ENRAGED * 3 - var/angle_change = (5 + WENDIGO_ENRAGED * shot / 6) * spiral_direction - for(var/count in 1 to shots_per_tick) - var/angle = angle_to_target + shot * angle_change + count * 360 / shots_per_tick - var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc) - shockwave.firer = src - shockwave.damage = 15 - shockwave.fire(angle) - SLEEP_CHECK_DEATH(1, src) - if("Wave") - var/shots_per = WENDIGO_WAVE_SHOTCOUNT - var/difference = 360 / shots_per - var/wave_direction = pick(-1, 1) - for(var/shoot_times in 1 to WENDIGO_WAVE_REPEATCOUNT) - for(var/shot in 1 to shots_per) - var/angle = shot * difference + shoot_times * 5 * wave_direction * -1 - var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc) - shockwave.firer = src - shockwave.wave_movement = TRUE - shockwave.speed = 8 - shockwave.wave_speed = 10 * wave_direction - shockwave.fire(angle) - SLEEP_CHECK_DEATH(2, src) + SLEEP_CHECK_DEATH(delay, owner) /mob/living/simple_animal/hostile/megafauna/wendigo/death(gibbed, list/force_grant) if(health > 0) @@ -285,6 +195,7 @@ Difficulty: Hard /obj/projectile/colossus/wendigo_shockwave name = "wendigo shockwave" + speed = 2 /// If wave movement is enabled var/wave_movement = FALSE /// Amount the angle changes every pixel move @@ -292,6 +203,17 @@ Difficulty: Hard /// Amount of movements this projectile has made var/pixel_moves = 0 +/obj/projectile/colossus/wendigo_shockwave/spiral + damage = 15 + +/obj/projectile/colossus/wendigo_shockwave/wave + speed = 8 + wave_movement = TRUE + wave_speed = 10 + +/obj/projectile/colossus/wendigo_shockwave/wave/alternate + wave_speed = -10 + /obj/projectile/colossus/wendigo_shockwave/pixel_move(trajectory_multiplier, hitscanning = FALSE) . = ..() if(wave_movement) @@ -344,9 +266,3 @@ Difficulty: Hard throwforce = 0 #undef WENDIGO_ENRAGED -#undef WENDIGO_CIRCLE_SHOTCOUNT -#undef WENDIGO_CIRCLE_REPEATCOUNT -#undef WENDIGO_SPIRAL_SHOTCOUNT -#undef WENDIGO_WAVE_SHOTCOUNT -#undef WENDIGO_WAVE_REPEATCOUNT -#undef WENDIGO_SHOTGUN_SHOTCOUNT diff --git a/code/modules/mod/mod_paint.dm b/code/modules/mod/mod_paint.dm index 1402a4aebc6bc4..77af1f7290c83e 100644 --- a/code/modules/mod/mod_paint.dm +++ b/code/modules/mod/mod_paint.dm @@ -151,7 +151,7 @@ if(!pick) balloon_alert(user, "no skin picked!") return - mod.theme.set_skin(pick) + mod.theme.set_skin(mod, pick) /obj/item/mod/paint/proc/check_menu(obj/item/mod/control/mod, mob/user) if(user.incapacitated() || !user.is_holding(src) || !mod || mod.active || mod.activating) @@ -186,7 +186,7 @@ if(!(skin in mod.theme.variants)) balloon_alert(user, "incompatible theme!") return TRUE - mod.theme.set_skin(skin) + mod.theme.set_skin(mod, skin) balloon_alert(user, "skin applied") qdel(src) return TRUE diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index ecfa570dde1602..971ccaf5c72bfb 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -143,6 +143,8 @@ control_part_datum.part_item = mod mod.mod_parts["[mod.slot_flags]"] = control_part_datum for(var/path in variants[default_skin]) + if(!ispath(path)) + continue var/obj/item/mod_part = new path(mod) if(mod_part.slot_flags == ITEM_SLOT_OCLOTHING && isclothing(mod_part)) var/obj/item/clothing/chestplate = mod_part @@ -576,10 +578,14 @@ /obj/item/clothing/gloves/mod = list( SEALED_CLOTHING = THICKMATERIAL, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = GAUNTLET_UNSEAL_MESSAGE, + SEALED_MESSAGE = GAUNTLET_SEAL_MESSAGE, ), /obj/item/clothing/shoes/mod = list( SEALED_CLOTHING = THICKMATERIAL, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = BOOT_UNSEAL_MESSAGE, + SEALED_MESSAGE = BOOT_SEAL_MESSAGE, ), ), ) @@ -1361,10 +1367,14 @@ /obj/item/clothing/gloves/mod = list( SEALED_CLOTHING = THICKMATERIAL, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = GAUNTLET_UNSEAL_MESSAGE, + SEALED_MESSAGE = GAUNTLET_SEAL_MESSAGE, ), /obj/item/clothing/shoes/mod = list( SEALED_CLOTHING = THICKMATERIAL, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = BOOT_UNSEAL_MESSAGE, + SEALED_MESSAGE = BOOT_SEAL_MESSAGE, ), ), ) @@ -1506,6 +1516,8 @@ UNSEALED_CLOTHING = THICKMATERIAL|CASTING_CLOTHES, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE, + SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE, ), /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -2155,14 +2167,20 @@ /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE, + SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE, ), /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = GAUNTLET_UNSEAL_MESSAGE, + SEALED_MESSAGE = GAUNTLET_SEAL_MESSAGE, ), /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = BOOT_UNSEAL_MESSAGE, + SEALED_MESSAGE = BOOT_SEAL_MESSAGE, ), ), ) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index e2a197a33900cf..a17a9bb8ed054e 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -484,7 +484,10 @@ playsound(src, 'sound/machines/card_slide.ogg', 50) /obj/item/modular_computer/proc/turn_on(mob/user, open_ui = TRUE) - var/issynth = HAS_SILICON_ACCESS(user) // Robots and AIs get different activation messages. + var/issynth = FALSE // Robots and AIs get different activation messages. + if(user) + issynth = HAS_SILICON_ACCESS(user) + if(atom_integrity <= integrity_failure * max_integrity) if(user) if(issynth) diff --git a/code/modules/modular_computers/computers/item/computer_circuit.dm b/code/modules/modular_computers/computers/item/computer_circuit.dm index 2a6a0d70be9713..35caaf3c851075 100644 --- a/code/modules/modular_computers/computers/item/computer_circuit.dm +++ b/code/modules/modular_computers/computers/item/computer_circuit.dm @@ -5,7 +5,9 @@ var/obj/item/modular_computer/computer ///Turns the PC on/off var/datum/port/input/on_off - ///When set, will print a piece of paper with the value as text. + ///Determines the text to be printed + var/datum/port/input/print_text + /// Print when triggered var/datum/port/input/print ///Sent when turned on @@ -18,6 +20,7 @@ var/datum/port/input/red var/datum/port/input/green var/datum/port/input/blue + var/datum/port/input/set_color /obj/item/circuit_component/modpc/register_shell(atom/movable/shell) . = ..() @@ -39,10 +42,11 @@ * I hope you're cool with me doing it here. */ if(computer.has_light && isnull(lights)) - lights = add_input_port("Toggle Lights", PORT_TYPE_SIGNAL) + lights = add_input_port("Toggle Lights", PORT_TYPE_SIGNAL, trigger = PROC_REF(toggle_flashlight)) red = add_input_port("Red", PORT_TYPE_NUMBER) green = add_input_port("Green", PORT_TYPE_NUMBER) blue = add_input_port("Blue", PORT_TYPE_NUMBER) + set_color = add_input_port("Set Color", PORT_TYPE_SIGNAL, trigger = PROC_REF(set_flashlight_color)) /obj/item/circuit_component/modpc/unregister_shell(atom/movable/shell) if(computer) @@ -51,45 +55,37 @@ return ..() /obj/item/circuit_component/modpc/populate_ports() - on_off = add_input_port("Turn On/Off", PORT_TYPE_SIGNAL) - print = add_input_port("Print Text", PORT_TYPE_STRING) + on_off = add_input_port("Turn On/Off", PORT_TYPE_SIGNAL, trigger = PROC_REF(toggle_power)) + print_text = add_input_port("Print Text", PORT_TYPE_STRING) + print = add_input_port("Print", PORT_TYPE_SIGNAL, trigger = PROC_REF(print_text)) is_on = add_output_port("Turned On", PORT_TYPE_SIGNAL) - is_on = add_output_port("Shut Down", PORT_TYPE_SIGNAL) + is_off = add_output_port("Shut Down", PORT_TYPE_SIGNAL) /obj/item/circuit_component/modpc/pre_input_received(datum/port/input/port) if(isnull(computer)) return - if(COMPONENT_TRIGGERED_BY(print, port)) + if(COMPONENT_TRIGGERED_BY(print_text, port)) print.set_value(html_encode(trim(print.value, MAX_PAPER_LENGTH))) - else if(COMPONENT_TRIGGERED_BY(red, port)) - red.set_value(clamp(red.value, 0, 255)) - else if(COMPONENT_TRIGGERED_BY(blue, port)) - blue.set_value(clamp(blue.value, 0, 255)) - else if(COMPONENT_TRIGGERED_BY(green, port)) - green.set_value(clamp(green.value, 0, 255)) - -/obj/item/circuit_component/modpc/input_received(datum/port/input/port) - if(isnull(computer)) - return - if(COMPONENT_TRIGGERED_BY(on_off, port)) - if(computer.enabled) - INVOKE_ASYNC(computer, TYPE_PROC_REF(/obj/item/modular_computer, shutdown_computer)) - else - INVOKE_ASYNC(computer, TYPE_PROC_REF(/obj/item/modular_computer, turn_on)) - return - if(!computer.enabled) - return +/obj/item/circuit_component/modpc/proc/print_text(datum/source) + if(computer.enabled) + computer.print_text(print_text.value) + +/obj/item/circuit_component/modpc/proc/toggle_power(datum/source) + if(computer.enabled) + INVOKE_ASYNC(computer, TYPE_PROC_REF(/obj/item/modular_computer, shutdown_computer)) + else + INVOKE_ASYNC(computer, TYPE_PROC_REF(/obj/item/modular_computer, turn_on)) - if(COMPONENT_TRIGGERED_BY(print, port)) - computer.print_text(print.value) +/obj/item/circuit_component/modpc/proc/toggle_flashlight(datum/source) + computer.toggle_flashlight() - if(lights) - if(COMPONENT_TRIGGERED_BY(lights, port)) - computer.toggle_flashlight() - if(COMPONENT_TRIGGERED_BY(red, port) || COMPONENT_TRIGGERED_BY(green, port) || COMPONENT_TRIGGERED_BY(blue, port)) - computer.set_flashlight_color(rgb(red.value || 0, green.value || 0, blue.value || 0)) +/obj/item/circuit_component/modpc/proc/set_flashlight_color(datum/source) + red.set_value(clamp(red.value, 0, 255)) + blue.set_value(clamp(blue.value, 0, 255)) + green.set_value(clamp(green.value, 0, 255)) + computer.set_flashlight_color(rgb(red.value || 0, green.value || 0, blue.value || 0)) /obj/item/circuit_component/modpc/proc/computer_on(datum/source, mob/user) SIGNAL_HANDLER diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index b55fb6d2ee68a7..523c241724ed5e 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -2,7 +2,7 @@ name = "laptop" desc = "A portable laptop computer." - icon = 'icons/obj/modular_laptop.dmi' + icon = 'icons/obj/devices/modular_laptop.dmi' icon_state = "laptop-closed" icon_state_powered = "laptop" icon_state_unpowered = "laptop-off" diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index cbed5bef57f454..8935161089b33c 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -1,6 +1,6 @@ /obj/item/modular_computer/pda name = "pda" - icon = 'icons/obj/modular_pda.dmi' + icon = 'icons/obj/devices/modular_pda.dmi' icon_state = "pda" worn_icon_state = "nothing" base_icon_state = "tablet" @@ -376,7 +376,7 @@ return robotact qdel(robotact) robotact = null - CRASH("Cyborg [silicon_owner]'s tablet hard drive rejected recieving a new copy of the self-manage app. To fix, check the hard drive's space remaining. Please make a bug report about this.") + CRASH("Cyborg [silicon_owner]'s tablet hard drive rejected receiving a new copy of the self-manage app. To fix, check the hard drive's space remaining. Please make a bug report about this.") //Makes the light settings reflect the borg's headlamp settings /obj/item/modular_computer/pda/silicon/cyborg/ui_data(mob/user) diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm index 4fc3730ef08e85..0b2f478172b5e1 100644 --- a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm @@ -713,7 +713,7 @@ var/photo_message = signal.data["photo"] ? " (Photo Attached)" : "" to_chat(messaged_mob, span_infoplain("[icon2html(computer, messaged_mob)] PDA message from [sender_title], \"[inbound_message]\"[photo_message] [reply]")) - SEND_SIGNAL(computer, COMSIG_COMPUTER_RECIEVED_MESSAGE, sender_title, inbound_message, photo_message) + SEND_SIGNAL(computer, COMSIG_COMPUTER_RECEIVED_MESSAGE, sender_title, inbound_message, photo_message) if (alert_able && (!alert_silenced || is_rigged)) computer.ring(ringtone) diff --git a/code/modules/modular_computers/file_system/programs/virtual_pet.dm b/code/modules/modular_computers/file_system/programs/virtual_pet.dm index 1d3196789ca87d..7a0adba3cce6dd 100644 --- a/code/modules/modular_computers/file_system/programs/virtual_pet.dm +++ b/code/modules/modular_computers/file_system/programs/virtual_pet.dm @@ -45,10 +45,10 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) var/max_hunger = 500 ///pet icon for each state var/static/list/pet_state_icons = list( - PET_STATE_HUNGRY = list("icon" = 'icons/ui_icons/virtualpet/pet_state.dmi', "icon_state" = "pet_hungry"), - PET_STATE_HAPPY = list("icon" = 'icons/ui_icons/virtualpet/pet_state.dmi', "icon_state" = "pet_happy"), - PET_STATE_ASLEEP = list("icon" = 'icons/ui_icons/virtualpet/pet_state.dmi', "icon_state" = "pet_asleep"), - PET_STATE_NEUTRAL = list("icon" = 'icons/ui_icons/virtualpet/pet_state.dmi', "icon_state" = "pet_neutral"), + PET_STATE_HUNGRY = list("icon" = 'icons/ui/virtualpet/pet_state.dmi', "icon_state" = "pet_hungry"), + PET_STATE_HAPPY = list("icon" = 'icons/ui/virtualpet/pet_state.dmi', "icon_state" = "pet_happy"), + PET_STATE_ASLEEP = list("icon" = 'icons/ui/virtualpet/pet_state.dmi', "icon_state" = "pet_asleep"), + PET_STATE_NEUTRAL = list("icon" = 'icons/ui/virtualpet/pet_state.dmi', "icon_state" = "pet_neutral"), ) ///hat options and what level they will be unlocked at var/static/list/hat_selections = list( @@ -97,7 +97,7 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) /datum/computer_file/program/virtual_pet/on_install() . = ..() - profile_picture = getFlatIcon(image(icon = 'icons/ui_icons/virtualpet/pet_state.dmi', icon_state = "pet_preview")) + profile_picture = getFlatIcon(image(icon = 'icons/ui/virtualpet/pet_state.dmi', icon_state = "pet_preview")) GLOB.virtual_pets_list += src pet = new pet_type(computer) pet.forceMove(computer) @@ -127,11 +127,11 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) pet.forceMove(computer) -/datum/computer_file/program/virtual_pet/proc/on_message_recieve(datum/source, sender_title, inbound_message, photo_message) +/datum/computer_file/program/virtual_pet/proc/on_message_receive(datum/source, sender_title, inbound_message, photo_message) SIGNAL_HANDLER var/message_to_display = "[sender_title] has sent you a message [photo_message ? "with a photo attached" : ""]: [inbound_message]!" - pet.ai_controller?.set_blackboard_key(BB_LAST_RECIEVED_MESSAGE, message_to_display) + pet.ai_controller?.set_blackboard_key(BB_LAST_RECEIVED_MESSAGE, message_to_display) /datum/computer_file/program/virtual_pet/proc/pet_pre_clean(atom/source, mob/user) SIGNAL_HANDLER @@ -188,7 +188,7 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) overlays += selected_hat["appearance"] /datum/computer_file/program/virtual_pet/proc/alter_profile_picture() - var/image/pet_preview = image(icon = 'icons/ui_icons/virtualpet/pet_state.dmi', icon_state = "pet_preview") + var/image/pet_preview = image(icon = 'icons/ui/virtualpet/pet_state.dmi', icon_state = "pet_preview") if(LAZYACCESS(pet.atom_colours, FIXED_COLOUR_PRIORITY)) pet_preview.color = pet.atom_colours[FIXED_COLOUR_PRIORITY] @@ -289,7 +289,7 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) /datum/computer_file/program/virtual_pet/proc/grant_level_abilities() switch(level) if(2) - RegisterSignal(computer, COMSIG_COMPUTER_RECIEVED_MESSAGE, PROC_REF(on_message_recieve)) // we will now read out PDA messages + RegisterSignal(computer, COMSIG_COMPUTER_RECEIVED_MESSAGE, PROC_REF(on_message_receive)) // we will now read out PDA messages var/datum/action/cooldown/mob_cooldown/lights/lights = new(pet) lights.Grant(pet) pet.ai_controller?.set_blackboard_key(BB_LIGHTS_ABILITY, lights) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 2e95b129146509..ee2a20eb788f18 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -505,7 +505,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri if(!user) return - var/image/restraints_icon = image(icon = 'icons/obj/restraints.dmi', icon_state = "cuff") + var/image/restraints_icon = image(icon = 'icons/obj/weapons/restraints.dmi', icon_state = "cuff") restraints_icon.maptext = MAPTEXT("= CABLE_RESTRAINTS_COST ? "" : "style='color: red'"]>[CABLE_RESTRAINTS_COST]") restraints_icon.color = color diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index caba755eb81a71..812dc2267fb21a 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -72,7 +72,7 @@ var/area/area = get_area(src) if(area) - var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/cult/effects.dmi', "ghostalertsie") + var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/cult.dmi', "ghostalertsie") notify_ghosts( "Nar'Sie has risen in [area]. Reach out to the Geometer to be given a new shell for your soul.", source = src, @@ -234,7 +234,7 @@ addtimer(CALLBACK(src, PROC_REF(narsie_spawn_animation_end)), 3.5 SECONDS) /obj/narsie/proc/narsie_spawn_animation_end() - var/datum/component/singularity/singularity_component = singularity.resolve() + var/datum/component/singularity/singularity_component = singularity?.resolve() singularity_component?.roaming = TRUE /** diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index b6d8108bb5438c..d70a91d36eb135 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -23,7 +23,7 @@ /obj/item/gun/ballistic/revolver/grenadelauncher/cyborg desc = "A 6-shot grenade launcher." name = "multi grenade launcher" - icon = 'icons/mob/mecha_equipment.dmi' + icon = 'icons/obj/devices/mecha_equipment.dmi' icon_state = "mecha_grenadelnchr" accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder/grenademulti pin = /obj/item/firing_pin diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 877326fd98546a..872bf0cdd5e485 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -632,7 +632,10 @@ return TRUE if(buckled_to.density) // Will just be us if we're not buckled to another mob return TRUE - return FALSE + return FALSE + else if(living_target.body_position == LYING_DOWN) + return FALSE + return TRUE /** * Scan if we should hit something and hit it if we need to diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 914019b9792094..b3ddaf9bc9013b 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -108,19 +108,6 @@ stamina = 6 embedding = null -/obj/projectile/bullet/pellet/shotgun_improvised - damage = 5 - wound_bonus = -5 - demolition_mod = 3 //Very good at acts of vandalism - -/obj/projectile/bullet/pellet/shotgun_improvised/Initialize(mapload) - . = ..() - range = rand(3, 8) - -/obj/projectile/bullet/pellet/shotgun_improvised/on_range() - do_sparks(1, TRUE, src) - ..() - // Mech Scattershot /obj/projectile/bullet/scattershot diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index 3d25fa5e2b157e..164e66bba90230 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -122,9 +122,10 @@ reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING //These drug item reactions should probably be converted to fermichem in the future. -/datum/chemical_reaction/moon_rock //botany is real easy so it requires a lot of kronkus_extract, make it cheaper if it doesnt get amde. +/datum/chemical_reaction/moon_rock //botany is real easy so it requires a lot of kronkus_extract, make it cheaper if it doesnt get made. required_reagents = list(/datum/reagent/kronkus_extract = 15, /datum/reagent/fuel = 10, /datum/reagent/ammonia = 5) mob_react = FALSE + reaction_flags = REACTION_INSTANT reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING /datum/chemical_reaction/moon_rock/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) @@ -137,6 +138,7 @@ /datum/chemical_reaction/blastoff_ampoule required_reagents = list(/datum/reagent/silver = 10, /datum/reagent/toxin/cyanide = 10, /datum/reagent/lye = 5) mob_react = FALSE + reaction_flags = REACTION_INSTANT reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING /datum/chemical_reaction/blastoff_ampoule/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) @@ -149,6 +151,7 @@ /datum/chemical_reaction/saturnx_glob required_reagents = list(/datum/reagent/lead = 5, /datum/reagent/consumable/nothing = 5, /datum/reagent/drug/maint/tar = 10) mob_react = FALSE + reaction_flags = REACTION_INSTANT reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING /datum/chemical_reaction/saturnx_glob/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) diff --git a/code/modules/reagents/reagent_containers/misc.dm b/code/modules/reagents/reagent_containers/misc.dm index f631e8e28a0e0c..db9935d3ea2628 100644 --- a/code/modules/reagents/reagent_containers/misc.dm +++ b/code/modules/reagents/reagent_containers/misc.dm @@ -1,7 +1,7 @@ /obj/item/reagent_containers/cup/maunamug name = "mauna mug" desc = "A drink served in a classy mug. Now with built-in heating!" - icon = 'icons/obj/mauna_mug.dmi' + icon = 'icons/obj/devices/mauna_mug.dmi' icon_state = "maunamug" base_icon_state = "maunamug" spillable = TRUE diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index bdd31f4e9a04c6..cc6a45a5f1f136 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -414,6 +414,7 @@ created.pixel_x = created.base_pixel_x + rand(-6, 6) created.pixel_y = created.base_pixel_y + rand(-6, 6) + SSblackbox.record_feedback("nested tally", "lathe_printed_items", 1, list("[type]", "[created.type]")) if(is_stack) items_remaining = 0 diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 60dcc8716cc10a..069447c6f45392 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -107,7 +107,6 @@ return screwdriver_act(user, tool) /obj/machinery/rnd/multitool_act(mob/living/user, obj/item/multitool/tool) - . = ITEM_INTERACT_BLOCKING if(panel_open) wires.interact(user) return ITEM_INTERACT_SUCCESS diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm index a60cc243756178..6be62d7b2a20f5 100644 --- a/code/modules/surgery/organs/internal/lungs/_lungs.dm +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -462,14 +462,7 @@ /obj/item/organ/internal/lungs/proc/too_much_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, miasma_pp, old_miasma_pp) // Inhale Miasma. Exhale nothing. breathe_gas_volume(breath, /datum/gas/miasma) - // Miasma sickness - if(prob(0.5 * miasma_pp)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(max_symptoms = min(round(max(miasma_pp / 2, 1), 1), 6), max_level = min(round(max(miasma_pp, 1), 1), 8)) - // tl;dr the first argument chooses the smaller of miasma_pp/2 or 6(typical max virus symptoms), the second chooses the smaller of miasma_pp or 8(max virus symptom level) - // Each argument has a minimum of 1 and rounds to the nearest value. Feel free to change the pp scaling I couldn't decide on good numbers for it. - if(breather.CanContractDisease(miasma_disease)) - miasma_disease.name = "Unknown" - breather.AirborneContractDisease(miasma_disease, TRUE) + // Miasma side effects if (HAS_TRAIT(breather, TRAIT_ANOSMIA)) //Anosmia quirk holder cannot smell miasma, but can get diseases from it. return diff --git a/code/modules/tutorials/_tutorial.dm b/code/modules/tutorials/_tutorial.dm index aecdcb7f23b88c..1211f8e2993556 100644 --- a/code/modules/tutorials/_tutorial.dm +++ b/code/modules/tutorials/_tutorial.dm @@ -9,6 +9,7 @@ VAR_PROTECTED/mob/user VAR_PRIVATE/atom/movable/screen/tutorial_instruction/instruction_screen + VAR_PRIVATE/atom/movable/screen/tutorial_skip/skip_button /datum/tutorial/New(mob/user) src.user = user @@ -17,10 +18,11 @@ /datum/tutorial/Destroy(force) user.client?.screen -= instruction_screen + user.client?.screen -= skip_button QDEL_NULL(instruction_screen) + QDEL_NULL(skip_button) user = null - return ..() /// Gets the [`/datum/tutorial_manager`] that owns this tutorial. @@ -70,6 +72,7 @@ if (!isnull(instruction_screen)) animate(instruction_screen, time = INSTRUCTION_SCREEN_DELAY, alpha = 0, easing = SINE_EASING) + animate(skip_button, time = INSTRUCTION_SCREEN_DELAY, alpha = 0, easing = SINE_EASING) delay += INSTRUCTION_SCREEN_DELAY QDEL_IN(src, delay) @@ -97,6 +100,10 @@ /// If a message already exists, will fade it out and replace it. /datum/tutorial/proc/show_instruction(message) PROTECTED_PROC(TRUE) + if(isnull(skip_button)) + skip_button = new + user.client?.screen += skip_button + RegisterSignal(skip_button, COMSIG_SCREEN_ELEMENT_CLICK, PROC_REF(dismiss)) if (isnull(instruction_screen)) instruction_screen = new(null, null, message, user.client) diff --git a/code/modules/tutorials/tutorial_skip.dm b/code/modules/tutorials/tutorial_skip.dm new file mode 100644 index 00000000000000..803aebc8650542 --- /dev/null +++ b/code/modules/tutorials/tutorial_skip.dm @@ -0,0 +1,35 @@ +/atom/movable/screen/tutorial_skip + icon = 'icons/effects/alphacolors.dmi' + icon_state = "white" + screen_loc = "TOP,LEFT" + color = COLOR_NEARLY_ALL_BLACK + alpha = 0 + mouse_opacity = MOUSE_OPACITY_OPAQUE + layer = TUTORIAL_INSTRUCTIONS_LAYER + var/atom/movable/screen/tutorial_skip_text/skip_text + +/atom/movable/screen/tutorial_skip/Initialize(mapload, datum/hud/hud_owner) + . = ..() + transform = transform.Scale(9, 1) + skip_text = new(null, hud_owner) + vis_contents += skip_text + maptext = MAPTEXT_VCR_OSD_MONO("Remind me later") + animate(src, alpha = 245, time = 0.8 SECONDS, easing = SINE_EASING) + +/atom/movable/screen/tutorial_skip/Destroy() + QDEL_NULL(skip_text) + return ..() + +/atom/movable/screen/tutorial_skip_text + alpha = 0 + layer = TUTORIAL_INSTRUCTIONS_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + maptext_height = 32 + maptext_width = 200 + maptext_x = 20 + maptext_y = 9 + +/atom/movable/screen/tutorial_skip_text/Initialize(mapload, datum/hud/hud_owner) + . = ..() + var/newtext = MAPTEXT_VCR_OSD_MONO("Remind me later") + animate(src, alpha = 255, time = 0.5 SECONDS, maptext=newtext) diff --git a/code/modules/unit_tests/mob_damage.dm b/code/modules/unit_tests/mob_damage.dm index c27bc31ffe0f27..64b12b8f477e85 100644 --- a/code/modules/unit_tests/mob_damage.dm +++ b/code/modules/unit_tests/mob_damage.dm @@ -580,3 +580,22 @@ if(!verify_damage(gusgus, 0, included_types = BRUTELOSS)) TEST_FAIL("heal_overall_damage did not apply its healing correctly on the mouse!") + +/// Tests that humans get the tox_vomit status effect when heavily poisoned +/datum/unit_test/human_tox_damage + +/datum/unit_test/human_tox_damage/Run() + // Spawn a dummy, give it a bunch of tox damage. It should get the status effect. + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + dummy.setToxLoss(75) + var/datum/status_effect/tox_effect = dummy.has_status_effect(/datum/status_effect/tox_vomit) + TEST_ASSERT_NOTNULL(tox_effect, "Dummy didn't get tox_vomit status effect despite at [dummy.getToxLoss()] toxin damage (Method: SET)!") + // Clear the toxin damage away, and force a status effect tick: It should delete itself + dummy.setToxLoss(0) + tox_effect.tick(initial(tox_effect.tick_interval)) + TEST_ASSERT(QDELETED(tox_effect), "Dummy still has tox_vomit status effect despite at [dummy.getToxLoss()] toxin damage (Method: SET)!") + // Test another method of gaining tox damage, use an entirely clean slate just to be sure + var/mob/living/carbon/human/dummy_two = allocate(/mob/living/carbon/human/consistent) + dummy_two.adjustToxLoss(75) + var/datum/status_effect/tox_effect_two = dummy_two.has_status_effect(/datum/status_effect/tox_vomit) + TEST_ASSERT_NOTNULL(tox_effect_two, "Dummy didn't get tox_vomit status effect at [dummy_two.getToxLoss()] toxin damage (METHOD: ADJUST)!") diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index 4eca7cd4ebae12..faf95e8cd73c77 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -1,7 +1,7 @@ /obj/vehicle name = "generic vehicle" desc = "Yell at coderbus." - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/mob/rideables/vehicles.dmi' icon_state = "error" max_integrity = 300 armor_type = /datum/armor/obj_vehicle diff --git a/code/modules/vehicles/lavaboat.dm b/code/modules/vehicles/lavaboat.dm index e45f062d1a24a1..0336ff486dd47c 100644 --- a/code/modules/vehicles/lavaboat.dm +++ b/code/modules/vehicles/lavaboat.dm @@ -20,7 +20,7 @@ /obj/item/oar name = "oar" desc = "Not to be confused with the kind Research hassles you for." - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/mob/rideables/vehicles.dmi' icon_state = "oar" inhand_icon_state = "oar" lefthand_file = 'icons/mob/inhands/items/lavaland_lefthand.dmi' diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index ca1728f3fc043e..1155e6293d2525 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -20,7 +20,7 @@ /obj/vehicle/sealed/mecha name = "exosuit" desc = "Exosuit" - icon = 'icons/mob/mecha.dmi' + icon = 'icons/mob/rideables/mecha.dmi' resistance_flags = FIRE_PROOF | ACID_PROOF max_integrity = 300 armor_type = /datum/armor/sealed_mecha diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm index 237a0d971b0cbb..a0f50622e06d1b 100644 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm @@ -15,7 +15,7 @@ /obj/vehicle/sealed/mecha/savannah_ivanov name = "\improper Savannah-Ivanov" desc = "An insanely overbulked mecha that handily crushes single-pilot opponents. The price is that you need two pilots to use it." - icon = 'icons/mob/coop_mech.dmi' + icon = 'icons/mob/rideables/coop_mech.dmi' base_icon_state = "savannah_ivanov" icon_state = "savannah_ivanov_0_0" //does not include mmi compatibility diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm index b80ac6ef025806..755f45d52b4bec 100644 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -4,7 +4,7 @@ */ /obj/item/mecha_parts/mecha_equipment name = "mecha equipment" - icon = 'icons/mob/mecha_equipment.dmi' + icon = 'icons/obj/devices/mecha_equipment.dmi' icon_state = "mecha_equip" force = 5 max_integrity = 300 diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 6a70d4db9f043b..4d3b682b4277b5 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -508,7 +508,7 @@ /obj/item/mecha_parts/camera_kit name = "exosuit-mounted camera" desc = "A security camera meant for exosuit-mounted surveillance-on-the-go." - icon = 'icons/mob/mecha_equipment.dmi' + icon = 'icons/obj/devices/mecha_equipment.dmi' icon_state = "mecha_camera" w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm b/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm index 0ad7bdf84a08cd..828bb6f152cea8 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm @@ -2,7 +2,7 @@ name = "generic ammo box" desc = "A box of ammo for an unknown weapon." w_class = WEIGHT_CLASS_BULKY - icon = 'icons/mob/mecha_ammo.dmi' + icon = 'icons/obj/weapons/guns/mecha_ammo.dmi' icon_state = "empty" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index bd9bbfca91f27d..d13b90e5659f7d 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -580,10 +580,10 @@ . = ..() var/mob/living/mobtarget = target if(mobtarget.move_resist == MOVE_FORCE_OVERPOWERING) //No megafauna or bolted AIs, please. - to_chat(source, "[span_warning("[src] is unable to lift [mobtarget].")]") + balloon_alert(source, "too strong!") return if(secmech.cargo_hold.contents.len >= secmech.cargo_hold.cargo_capacity) - to_chat(source, "[icon2html(src, source)][span_warning("Not enough room in cargo compartment!")]") + balloon_alert(source, "no room!") return playsound(chassis, clampsound, 50, FALSE, -6) diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index 2dce26624ad252..47c116cbc60295 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -260,22 +260,23 @@ * * Returns FALSE is the machine cannot dispense the part on the appropriate turf. * Return TRUE if the part was successfully dispensed. - * * D - Design datum to attempt to dispense. + * * dispensed_design - Design datum to attempt to dispense. */ -/obj/machinery/mecha_part_fabricator/proc/dispense_built_part(datum/design/D) - var/obj/item/I = new D.build_path(src) +/obj/machinery/mecha_part_fabricator/proc/dispense_built_part(datum/design/dispensed_design) + var/obj/item/built_part = new dispensed_design.build_path(src) + SSblackbox.record_feedback("nested tally", "lathe_printed_items", 1, list("[type]", "[built_part.type]")) being_built = null var/turf/exit = get_step(src,(dir)) if(exit.density) say("Error! The part outlet is obstructed.") - desc = "It's trying to dispense the fabricated [D.name], but the part outlet is obstructed." - stored_part = I + desc = "It's trying to dispense the fabricated [dispensed_design.name], but the part outlet is obstructed." + stored_part = built_part return FALSE - say("The fabrication of [I] is now complete.") - I.forceMove(exit) + say("The fabrication of [built_part] is now complete.") + built_part.forceMove(exit) top_job_id += 1 diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm index 9a05e3df696d6d..28f5a7e9fb3fba 100644 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -62,7 +62,7 @@ /datum/component/construction/unordered/mecha_chassis/spawn_result() var/atom/parent_atom = parent - parent_atom.icon = 'icons/mob/mech_construction.dmi' + parent_atom.icon = 'icons/mob/rideables/mech_construction.dmi' parent_atom.set_density(TRUE) parent_atom.cut_overlays() ..() @@ -580,7 +580,7 @@ /datum/component/construction/mecha/honker/update_parent(step_index) if(step_index == 1) var/atom/parent_atom = parent - parent_atom.icon = 'icons/mob/mech_construct.dmi' + parent_atom.icon = 'icons/mob/rideables/mech_construct.dmi' parent_atom.icon_state = "honker_chassis" ..() diff --git a/code/modules/vehicles/mecha/mecha_parts.dm b/code/modules/vehicles/mecha/mecha_parts.dm index bec0fefcc6d859..2a08f62bfac389 100644 --- a/code/modules/vehicles/mecha/mecha_parts.dm +++ b/code/modules/vehicles/mecha/mecha_parts.dm @@ -4,7 +4,7 @@ /obj/item/mecha_parts name = "mecha part" - icon = 'icons/mob/mech_construct.dmi' + icon = 'icons/mob/rideables/mech_construct.dmi' icon_state = "blank" w_class = WEIGHT_CLASS_GIGANTIC obj_flags = CONDUCTS_ELECTRICITY diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm index 8896b7268fe15c..dc0414e86063a7 100644 --- a/code/modules/vehicles/mecha/mecha_wreckage.dm +++ b/code/modules/vehicles/mecha/mecha_wreckage.dm @@ -6,7 +6,7 @@ /obj/structure/mecha_wreckage name = "exosuit wreckage" desc = "Remains of some unfortunate mecha. Completely irreparable, but perhaps something can be salvaged." - icon = 'icons/mob/mecha.dmi' + icon = 'icons/mob/rideables/mecha.dmi' density = TRUE anchored = FALSE opacity = FALSE @@ -224,7 +224,7 @@ /obj/structure/mecha_wreckage/savannah_ivanov name = "\improper Savannah-Ivanov wreckage" - icon = 'icons/mob/coop_mech.dmi' + icon = 'icons/mob/rideables/coop_mech.dmi' icon_state = "savannah_ivanov-broken" welder_salvage = list(/obj/item/stack/sheet/mineral/silver, /obj/item/stack/sheet/iron, /obj/item/stack/rods) parts = list( diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 1bed2350f08c8d..be9dc0d69c337f 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -396,8 +396,13 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/ripley/cargo) return ..() /obj/item/mecha_parts/mecha_equipment/ejector/seccage/container_resist_act(mob/living/user) - to_chat(user, span_notice("You begin attempting a breakout. (This will take around 45 seconds and [chassis] need to remain stationary.)")) - if(!do_after(user, 1 MINUTES, target = chassis)) + var/breakout_time = 1 MINUTES + + if (user.mob_size > MOB_SIZE_HUMAN) + breakout_time = 6 SECONDS + + to_chat(user, span_notice("You begin attempting a breakout. (This will take around [DisplayTimeText(breakout_time)] and [chassis] needs to remain stationary.)")) + if(!do_after(user, breakout_time, target = chassis)) return to_chat(user, span_notice("You break out of the [src].")) playsound(chassis, 'sound/items/crowbar.ogg', 100, TRUE) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index a4f36524483429..0cfde3de8adf94 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -224,7 +224,7 @@ /obj/item/scooter_frame name = "scooter frame" desc = "A metal frame for building a scooter. Looks like you'll need to add some iron to make wheels." - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/mob/rideables/vehicles.dmi' icon_state = "scooter_frame" w_class = WEIGHT_CLASS_NORMAL diff --git a/code/modules/vehicles/vehicle_key.dm b/code/modules/vehicles/vehicle_key.dm index 08cb75df2d4407..f8db861449f7af 100644 --- a/code/modules/vehicles/vehicle_key.dm +++ b/code/modules/vehicles/vehicle_key.dm @@ -1,7 +1,7 @@ /obj/item/key name = "key" desc = "A small grey key." - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/mob/rideables/vehicles.dmi' icon_state = "key" w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index d40b57276c0e46..92386b0fbc3c85 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -1,7 +1,7 @@ /obj/vehicle/ridden/wheelchair //ported from Hippiestation (by Jujumatic) name = "wheelchair" desc = "A chair with big wheels. It looks like you can move in this on your own." - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/mob/rideables/vehicles.dmi' icon_state = "wheelchair" layer = OBJ_LAYER max_integrity = 100 @@ -90,7 +90,7 @@ /obj/item/wheelchair name = "wheelchair" desc = "A collapsed wheelchair that can be carried around." - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/mob/rideables/vehicles.dmi' icon_state = "wheelchair_folded" inhand_icon_state = "wheelchair_folded" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' @@ -105,7 +105,7 @@ /obj/item/wheelchair/gold name = "gold wheelchair" desc = "A collapsed, shiny wheelchair that can be carried around." - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/mob/rideables/vehicles.dmi' icon_state = "wheelchair_folded_gold" inhand_icon_state = "wheelchair_folded_gold" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 8e69eb10ce03f0..76d193c80e87fe 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1458,7 +1458,7 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) if(usr.CanReach(src) && usr.put_in_hands(vended_item)) to_chat(usr, span_notice("You take [item_record.name] out of the slot.")) else - to_chat(usr, span_warning("[capitalize(item_record.name)] falls onto the floor!")) + to_chat(usr, span_warning("[capitalize(format_text(item_record.name))] falls onto the floor!")) SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[item_record.product_path]")) vend_ready = TRUE @@ -1846,7 +1846,7 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) if(user.CanReach(src) && user.put_in_hands(dispensed_item)) to_chat(user, span_notice("You take [dispensed_item.name] out of the slot.")) else - to_chat(user, span_warning("[capitalize(dispensed_item.name)] falls onto the floor!")) + to_chat(user, span_warning("[capitalize(format_text(dispensed_item.name))] falls onto the floor!")) return TRUE /obj/machinery/vending/custom/unbreakable diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm index cf142d1e365201..7f7bddaa5727a7 100644 --- a/code/modules/wiremod/core/component.dm +++ b/code/modules/wiremod/core/component.dm @@ -410,7 +410,7 @@ * Called when a circuit component requests to send Ntnet data signal. * * Arguments: - * * port - The required list port needed by the Ntnet recieve + * * port - The required list port needed by the Ntnet receive * * key - The encryption key * * signal_type - The signal type used for sending this global signal (optional, default is COMSIG_GLOB_CIRCUIT_NTNET_DATA_SENT) */ diff --git a/code/modules/wiremod/shell/module.dm b/code/modules/wiremod/shell/module.dm index 9061bac3e300e1..14092f5d2c83ce 100644 --- a/code/modules/wiremod/shell/module.dm +++ b/code/modules/wiremod/shell/module.dm @@ -271,7 +271,7 @@ SIGNAL_HANDLER var/string_list = list() var/is_deployed = TRUE - for(var/obj/item/part as anything in attached_module.mod.mod_parts) + for(var/obj/item/part as anything in attached_module.mod.get_parts()) if(part.loc == attached_module.mod) is_deployed = FALSE else diff --git a/html/changelogs/AutoChangeLog-pr-83270.yml b/html/changelogs/AutoChangeLog-pr-83270.yml deleted file mode 100644 index 5a6873dd01cff5..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-83270.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "paganiy" -delete-after: True -changes: - - balance: "Auto-aim in combat mode at mobs on the floor is disabled after the projectile passes 10 tiles." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83334.yml b/html/changelogs/AutoChangeLog-pr-83334.yml deleted file mode 100644 index 626cafcdff5715..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-83334.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Muffindrake" -delete-after: True -changes: - - balance: "reduced claymore/weak force from 30 to 24 and armor penetration from 15 to 10" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83425.yml b/html/changelogs/AutoChangeLog-pr-83425.yml new file mode 100644 index 00000000000000..4bb476e3ce13b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83425.yml @@ -0,0 +1,6 @@ +author: "FlufflesTheDog" +delete-after: True +changes: + - bugfix: "some missing modsuit (un)sealing messages should no longer be missing" + - bugfix: "MOD circuit adapter core deployed parts output should work again" + - bugfix: "Modsuit painter works again" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83506.yml b/html/changelogs/AutoChangeLog-pr-83506.yml new file mode 100644 index 00000000000000..d9db6982d0ef9c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83506.yml @@ -0,0 +1,4 @@ +author: "NewyearnewmeUwu" +delete-after: True +changes: + - bugfix: "Fixed a typo preventing creation of paystands using an ID." \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml index 08f3a52b9ce333..aaa901966a3048 100644 --- a/html/changelogs/archive/2024-05.yml +++ b/html/changelogs/archive/2024-05.yml @@ -618,3 +618,138 @@ norsvenska: - spellcheck: The message displayed when adjusting a mask no longer incorrectly states the way in which the mask has moved. +2024-05-23: + Jacquerel: + - balance: The melee attacks from small mobs spawned by Legions can now be dodged. + - balance: Legions spawn their mobs less often. + - bugfix: Legions cannot spawn mobs while inside pipes or closets. + Muffindrake: + - balance: reduced claymore/weak force from 30 to 24 and armor penetration from + 15 to 10 + hack-wrench: + - rscadd: Added RUN_SERVER.bat for maintainer issues + paganiy: + - balance: Auto-aim in combat mode at mobs on the floor is disabled after the projectile + passes 10 tiles. +2024-05-24: + 00-Steven: + - bugfix: Smoker quirk users can select a favourite brand again. + Ben10Omintrix: + - rscadd: adds a new fish to lava and plasma rivers, the lava loop + DATA-xPUNGED: + - bugfix: The Lance Crew Evacuation System now moves in the right direction in Hyperspace. + EEASAS: + - rscadd: Remapped NorthStar's medbay a little bit + Rhials: + - spellcheck: Fixes a typo with latejoin AIs + by INFRARED_BARON: + - image: 'Changes icons of: Gygax, d-gygax, durand, ripley variants, firefighter + statue, phazon & odysseus. Adds new icons for polar hide item.' +2024-05-25: + 00-Steven: + - bugfix: Airlock electronics created by deconstructing roundstart airlocks inherit + their cycling id properly. + - spellcheck: Examining a renamed airlock assembly no longer says it has a paper + placard that is "labelled with written on it is". + - bugfix: Mixing the reagents for moon rocks, bLaSToFF ampoules, or SaturnX globs + in amounts less than the minimum for the recipe no longer eats the reagents + without doing anything. + - bugfix: Airlocks without access requirements no longer create airlock electronics + with a broken menu. + - spellcheck: When a vendor tells you something dropped onto the floor, the line + no longer starts with a broken character in the case of cigarette boxes. + Ben10Omintrix: + - balance: you can now polymorph into raptors + - balance: raptors overall have less health and no longer have armor against ranged + attacks + BramvanZijp: + - bugfix: Fixed an inconsistency regarding the interactions between the Piercing + Hypo Borg upgrade and Hacked Borg Hypos. + Derpguy3: + - spellcheck: A handful of grammar errors in some department signs has been fixed. + Jacquerel: + - bugfix: The destructive analyser once more hungers for multitools + PapaMichael: + - bugfix: Epinephrine will prevent metabolism of all allergic reagents (instead + of just one), if taken with multiple chemicals that one is allergic to. + TiviPlus: + - qol: Added a "Remind me later" button for tutorials + Twaticus: + - image: resprites egg (and more) + jlsnow301: + - bugfix: You can no longer open the loot panel at range as a blind person and cheese + item names + nikothedude: + - code_imp: New signals for atom storage remove and insert +2024-05-26: + Jacquerel: + - bugfix: Ghosts can more reliably become a harvester. + OverwatchVoice: + - qol: The "Proto-Nitrate BZ response" atmsopheric reaction now lists it's required + temperature. + Rhials: + - admin: Admins can now reroll random events into something else. + grungussuss: + - qol: tramstation upload now has an extra motion camera + - qol: tramstation SM setup now has an emergency cooling setup + - bugfix: changed layout of Northstar dining hall so customer bots can reach the + kitchen counter + paganiy: + - bugfix: You can shoot at items on the floor again + thegrb93: + - qol: Made borg inventory not shift around depending on equipped items + tmyqlfpir: + - bugfix: '[Ice Box Station] Dorm 1''s door no longer shares ID with dorm 2''s door' +2024-05-27: + Melbert: + - refactor: Refactored the way high toxins cause you to vomit. + Time-Green: + - rscdel: Removes sentient disease from the game + - rscdel: Miasma and gibs no longer generates random diseases + YesterdaysPromise: + - image: Cleaned a single stray pixel in a single frame of a bite telegraphing accidentaly + found while re-organizing the files. + by INFRARED_BARON: + - image: Changes the sprites of bone and ash drake armor (suit + helmet mob/objs) + necromanceranne: + - bugfix: Material floor tiles once again have their improved sprite. +2024-05-28: + Echriser: + - bugfix: computers with no lights can now turn on using the on/off signal + - bugfix: RGB lights on PDA circuits now use a signal + - bugfix: the is_off signal now works on consoles + - bugfix: printing text on a console component now uses a signal + - refactor: each input signal in console circuits now have their own proc + EnterTheJake: + - bugfix: Rust debuffs now gets properly removed if you derust a tile you are standing + on. + Fikou: + - image: makes food hud burger icon have a sharp outline + Fluffles: + - bugfix: echolocation is less laggy. and works. + Higgin: + - balance: Viruses now self-heal much more effectively with good mood, sleep, food, + and spaceacillin. + - balance: Viruses now punish being hungry more. Stay fed! + - balance: Spaceacillin now gives 200 ticks of symptom resistance, declining over + time, rather than 100. + - balance: Viruses now progress slightly slower. + - balance: Viruses now only hide if their stealth stat is greater than their total + computed severity. + Jacquerel: + - balance: Mobs significantly larger than humans, such as Space Dragons and Xenomorph + Queens, breakout of being arrested by a mech significantly faster. + - bugfix: Venus Man Traps cannot use vines to drag around machines or objects that + are bolted, welded, rooted to, or otherwise are part of the ground + - bugfix: Standing on a table will not prevent you from being grappled by a Venus + Man Trap + LemonInTheDark: + - refactor: I have reworked how parallax and its animations (space travel) work. + Please report any bugs lads! + Pickle-Coding: + - spellcheck: Fixes labour camp shuttle retrieval message starting with "/p". + Whoneedspacee: + - refactor: Wendigos abilities have been changed into actions that can be added + to any mob. + zxaber: + - qol: Traitor-created Infected AIs no longer hear the Malf AI antag sound alert. diff --git a/icons/effects/cult/effects.dmi b/icons/effects/cult.dmi similarity index 100% rename from icons/effects/cult/effects.dmi rename to icons/effects/cult.dmi diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 5c64474dc0aaba..96c02aa91f9908 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/effects_rcd.dmi b/icons/effects/rcd.dmi similarity index 100% rename from icons/effects/effects_rcd.dmi rename to icons/effects/rcd.dmi diff --git a/icons/misc/buildmode.dmi b/icons/hud/buildmode.dmi similarity index 100% rename from icons/misc/buildmode.dmi rename to icons/hud/buildmode.dmi diff --git a/icons/misc/pic_in_pic.dmi b/icons/hud/pic_in_pic.dmi similarity index 100% rename from icons/misc/pic_in_pic.dmi rename to icons/hud/pic_in_pic.dmi diff --git a/icons/mob/animal_item_head.dmi b/icons/mob/animal_item_head.dmi deleted file mode 100644 index 6afabf22f76deb..00000000000000 Binary files a/icons/mob/animal_item_head.dmi and /dev/null differ diff --git a/icons/mob/clothing/head/helmet.dmi b/icons/mob/clothing/head/helmet.dmi index 523a306749d3d2..ad489609d983b3 100644 Binary files a/icons/mob/clothing/head/helmet.dmi and b/icons/mob/clothing/head/helmet.dmi differ diff --git a/icons/mob/clothing/suits/armor.dmi b/icons/mob/clothing/suits/armor.dmi index c96fb14268367b..744609ac7793df 100644 Binary files a/icons/mob/clothing/suits/armor.dmi and b/icons/mob/clothing/suits/armor.dmi differ diff --git a/icons/effects/creampie.dmi b/icons/mob/effects/creampie.dmi similarity index 100% rename from icons/effects/creampie.dmi rename to icons/mob/effects/creampie.dmi diff --git a/icons/effects/cult/halo.dmi b/icons/mob/effects/halo.dmi similarity index 100% rename from icons/effects/cult/halo.dmi rename to icons/mob/effects/halo.dmi diff --git a/icons/mob/mech_construction.dmi b/icons/mob/mech_construction.dmi deleted file mode 100644 index b7b54e3f70e85a..00000000000000 Binary files a/icons/mob/mech_construction.dmi and /dev/null differ diff --git a/icons/mob/mecha.dmi b/icons/mob/mecha.dmi deleted file mode 100644 index f6dcbdec2b7eec..00000000000000 Binary files a/icons/mob/mecha.dmi and /dev/null differ diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi deleted file mode 100644 index 8ddeaa0c3f40cd..00000000000000 Binary files a/icons/mob/pets.dmi and /dev/null differ diff --git a/icons/mob/pets_held_lh.dmi b/icons/mob/pets_held_lh.dmi deleted file mode 100644 index 1a864db13410ab..00000000000000 Binary files a/icons/mob/pets_held_lh.dmi and /dev/null differ diff --git a/icons/mob/pets_held_rh.dmi b/icons/mob/pets_held_rh.dmi deleted file mode 100644 index 39332a7e18e41b..00000000000000 Binary files a/icons/mob/pets_held_rh.dmi and /dev/null differ diff --git a/icons/mob/coop_mech.dmi b/icons/mob/rideables/coop_mech.dmi similarity index 100% rename from icons/mob/coop_mech.dmi rename to icons/mob/rideables/coop_mech.dmi diff --git a/icons/mob/mech_construct.dmi b/icons/mob/rideables/mech_construct.dmi similarity index 100% rename from icons/mob/mech_construct.dmi rename to icons/mob/rideables/mech_construct.dmi diff --git a/icons/mob/rideables/mech_construction.dmi b/icons/mob/rideables/mech_construction.dmi new file mode 100644 index 00000000000000..f26dbe17fd036f Binary files /dev/null and b/icons/mob/rideables/mech_construction.dmi differ diff --git a/icons/mob/rideables/mecha.dmi b/icons/mob/rideables/mecha.dmi new file mode 100644 index 00000000000000..e4888cbf462e8a Binary files /dev/null and b/icons/mob/rideables/mecha.dmi differ diff --git a/icons/obj/vehicles.dmi b/icons/mob/rideables/vehicles.dmi similarity index 100% rename from icons/obj/vehicles.dmi rename to icons/mob/rideables/vehicles.dmi diff --git a/icons/mob/telegraphing/telegraph.dmi b/icons/mob/telegraphing/telegraph.dmi index de525ead4ee9a7..b1ff26a4a1097c 100644 Binary files a/icons/mob/telegraphing/telegraph.dmi and b/icons/mob/telegraphing/telegraph.dmi differ diff --git a/icons/obj/aquarium.dmi b/icons/obj/aquarium.dmi index aa37c035791e93..471dad1f0a5bdc 100644 Binary files a/icons/obj/aquarium.dmi and b/icons/obj/aquarium.dmi differ diff --git a/icons/obj/clothing/head/helmet.dmi b/icons/obj/clothing/head/helmet.dmi index 3cf561103a0a70..47dd36c382ef98 100644 Binary files a/icons/obj/clothing/head/helmet.dmi and b/icons/obj/clothing/head/helmet.dmi differ diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi index f68ebc31a47637..39317e13685359 100644 Binary files a/icons/obj/clothing/suits/armor.dmi and b/icons/obj/clothing/suits/armor.dmi differ diff --git a/icons/obj/blackmarket.dmi b/icons/obj/devices/blackmarket.dmi similarity index 100% rename from icons/obj/blackmarket.dmi rename to icons/obj/devices/blackmarket.dmi diff --git a/icons/obj/mauna_mug.dmi b/icons/obj/devices/mauna_mug.dmi similarity index 100% rename from icons/obj/mauna_mug.dmi rename to icons/obj/devices/mauna_mug.dmi diff --git a/icons/mob/mecha_equipment.dmi b/icons/obj/devices/mecha_equipment.dmi similarity index 100% rename from icons/mob/mecha_equipment.dmi rename to icons/obj/devices/mecha_equipment.dmi diff --git a/icons/obj/miningradio.dmi b/icons/obj/devices/miningradio.dmi similarity index 100% rename from icons/obj/miningradio.dmi rename to icons/obj/devices/miningradio.dmi diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/devices/modular_laptop.dmi similarity index 100% rename from icons/obj/modular_laptop.dmi rename to icons/obj/devices/modular_laptop.dmi diff --git a/icons/obj/modular_pda.dmi b/icons/obj/devices/modular_pda.dmi similarity index 100% rename from icons/obj/modular_pda.dmi rename to icons/obj/devices/modular_pda.dmi diff --git a/icons/obj/pda.dmi b/icons/obj/devices/pda.dmi similarity index 100% rename from icons/obj/pda.dmi rename to icons/obj/devices/pda.dmi diff --git a/icons/misc/beach.dmi b/icons/obj/fluff/beach.dmi similarity index 100% rename from icons/misc/beach.dmi rename to icons/obj/fluff/beach.dmi diff --git a/icons/misc/beach2.dmi b/icons/obj/fluff/beach2.dmi similarity index 100% rename from icons/misc/beach2.dmi rename to icons/obj/fluff/beach2.dmi diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index aea93b956fc3b5..6c2eda1986633d 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/machines/wallmounts.dmi b/icons/obj/machines/wallmounts.dmi index e849746eb0a663..e659a0248ec3c6 100644 Binary files a/icons/obj/machines/wallmounts.dmi and b/icons/obj/machines/wallmounts.dmi differ diff --git a/icons/obj/medicart.dmi b/icons/obj/medical/medicart.dmi similarity index 100% rename from icons/obj/medicart.dmi rename to icons/obj/medical/medicart.dmi diff --git a/icons/obj/service/bureaucracy.dmi b/icons/obj/service/bureaucracy.dmi index f28eb169cf0b60..e9f8347b0487bc 100644 Binary files a/icons/obj/service/bureaucracy.dmi and b/icons/obj/service/bureaucracy.dmi differ diff --git a/icons/obj/service/kitchen.dmi b/icons/obj/service/kitchen.dmi index aeafe2591e9bdf..ff9a3e2a58c334 100644 Binary files a/icons/obj/service/kitchen.dmi and b/icons/obj/service/kitchen.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index c1fcad67b2b648..b4617915e86ed7 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/storage/crates.dmi b/icons/obj/storage/crates.dmi index 9bc8f4d2c27e90..dc5c045aefaa5f 100644 Binary files a/icons/obj/storage/crates.dmi and b/icons/obj/storage/crates.dmi differ diff --git a/icons/mob/mecha_ammo.dmi b/icons/obj/weapons/guns/mecha_ammo.dmi similarity index 100% rename from icons/mob/mecha_ammo.dmi rename to icons/obj/weapons/guns/mecha_ammo.dmi diff --git a/icons/obj/restraints.dmi b/icons/obj/weapons/restraints.dmi similarity index 100% rename from icons/obj/restraints.dmi rename to icons/obj/weapons/restraints.dmi diff --git a/icons/misc/Font_Minimal.dmi b/icons/testing/Font_Minimal.dmi similarity index 100% rename from icons/misc/Font_Minimal.dmi rename to icons/testing/Font_Minimal.dmi diff --git a/icons/misc/colortest.dmi b/icons/testing/colortest.dmi similarity index 100% rename from icons/misc/colortest.dmi rename to icons/testing/colortest.dmi diff --git a/icons/misc/hidden.dmi b/icons/testing/hidden.dmi similarity index 100% rename from icons/misc/hidden.dmi rename to icons/testing/hidden.dmi diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 29eb7d3eaeccc2..28ad938775d3c4 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/ui_icons/achievements/achievements.dmi b/icons/ui/achievements/achievements.dmi similarity index 100% rename from icons/ui_icons/achievements/achievements.dmi rename to icons/ui/achievements/achievements.dmi diff --git a/icons/ui_icons/adventure/default.png b/icons/ui/adventure/default.png similarity index 100% rename from icons/ui_icons/adventure/default.png rename to icons/ui/adventure/default.png diff --git a/icons/ui_icons/adventure/grue.png b/icons/ui/adventure/grue.png similarity index 100% rename from icons/ui_icons/adventure/grue.png rename to icons/ui/adventure/grue.png diff --git a/icons/ui_icons/adventure/signal_lost.png b/icons/ui/adventure/signal_lost.png similarity index 100% rename from icons/ui_icons/adventure/signal_lost.png rename to icons/ui/adventure/signal_lost.png diff --git a/icons/ui_icons/adventure/trade.png b/icons/ui/adventure/trade.png similarity index 100% rename from icons/ui_icons/adventure/trade.png rename to icons/ui/adventure/trade.png diff --git a/icons/ui_icons/antags/badass.dmi b/icons/ui/antags/badass.dmi similarity index 100% rename from icons/ui_icons/antags/badass.dmi rename to icons/ui/antags/badass.dmi diff --git a/icons/ui_icons/antags/obsessed.dmi b/icons/ui/antags/obsessed.dmi similarity index 100% rename from icons/ui_icons/antags/obsessed.dmi rename to icons/ui/antags/obsessed.dmi diff --git a/icons/ui_icons/arcade/boss1.gif b/icons/ui/arcade/boss1.gif similarity index 100% rename from icons/ui_icons/arcade/boss1.gif rename to icons/ui/arcade/boss1.gif diff --git a/icons/ui_icons/arcade/boss2.gif b/icons/ui/arcade/boss2.gif similarity index 100% rename from icons/ui_icons/arcade/boss2.gif rename to icons/ui/arcade/boss2.gif diff --git a/icons/ui_icons/arcade/boss3.gif b/icons/ui/arcade/boss3.gif similarity index 100% rename from icons/ui_icons/arcade/boss3.gif rename to icons/ui/arcade/boss3.gif diff --git a/icons/ui_icons/arcade/boss4.gif b/icons/ui/arcade/boss4.gif similarity index 100% rename from icons/ui_icons/arcade/boss4.gif rename to icons/ui/arcade/boss4.gif diff --git a/icons/ui_icons/arcade/boss5.gif b/icons/ui/arcade/boss5.gif similarity index 100% rename from icons/ui_icons/arcade/boss5.gif rename to icons/ui/arcade/boss5.gif diff --git a/icons/ui_icons/arcade/boss6.gif b/icons/ui/arcade/boss6.gif similarity index 100% rename from icons/ui_icons/arcade/boss6.gif rename to icons/ui/arcade/boss6.gif diff --git a/icons/ui_icons/arcade/fireplace.png b/icons/ui/arcade/fireplace.png similarity index 100% rename from icons/ui_icons/arcade/fireplace.png rename to icons/ui/arcade/fireplace.png diff --git a/icons/ui_icons/arcade/shopkeeper.png b/icons/ui/arcade/shopkeeper.png similarity index 100% rename from icons/ui_icons/arcade/shopkeeper.png rename to icons/ui/arcade/shopkeeper.png diff --git a/icons/ui_icons/chat/chat_icons.dmi b/icons/ui/chat/chat_icons.dmi similarity index 100% rename from icons/ui_icons/chat/chat_icons.dmi rename to icons/ui/chat/chat_icons.dmi diff --git a/icons/ui_icons/emoji/emoji.dmi b/icons/ui/chat/emoji.dmi similarity index 100% rename from icons/ui_icons/emoji/emoji.dmi rename to icons/ui/chat/emoji.dmi diff --git a/icons/misc/language.dmi b/icons/ui/chat/language.dmi similarity index 100% rename from icons/misc/language.dmi rename to icons/ui/chat/language.dmi diff --git a/icons/ui_icons/chat/member_content.dmi b/icons/ui/chat/member_content.dmi similarity index 100% rename from icons/ui_icons/chat/member_content.dmi rename to icons/ui/chat/member_content.dmi diff --git a/icons/misc/pepe.dmi b/icons/ui/chat/pepe.dmi similarity index 100% rename from icons/misc/pepe.dmi rename to icons/ui/chat/pepe.dmi diff --git a/icons/misc/clickbox.dmi b/icons/ui/clickbox.dmi similarity index 100% rename from icons/misc/clickbox.dmi rename to icons/ui/clickbox.dmi diff --git a/icons/ui_icons/common/padlock.png b/icons/ui/common/padlock.png similarity index 100% rename from icons/ui_icons/common/padlock.png rename to icons/ui/common/padlock.png diff --git a/icons/ui_icons/common/tg_16.png b/icons/ui/common/tg_16.png similarity index 100% rename from icons/ui_icons/common/tg_16.png rename to icons/ui/common/tg_16.png diff --git a/icons/ui_icons/common/tg_32.png b/icons/ui/common/tg_32.png similarity index 100% rename from icons/ui_icons/common/tg_32.png rename to icons/ui/common/tg_32.png diff --git a/icons/ui_icons/condiments/bbqsauce.png b/icons/ui/condiments/bbqsauce.png similarity index 100% rename from icons/ui_icons/condiments/bbqsauce.png rename to icons/ui/condiments/bbqsauce.png diff --git a/icons/ui_icons/condiments/bottle.png b/icons/ui/condiments/bottle.png similarity index 100% rename from icons/ui_icons/condiments/bottle.png rename to icons/ui/condiments/bottle.png diff --git a/icons/ui_icons/condiments/cherryjelly.png b/icons/ui/condiments/cherryjelly.png similarity index 100% rename from icons/ui_icons/condiments/cherryjelly.png rename to icons/ui/condiments/cherryjelly.png diff --git a/icons/ui_icons/condiments/coldsauce.png b/icons/ui/condiments/coldsauce.png similarity index 100% rename from icons/ui_icons/condiments/coldsauce.png rename to icons/ui/condiments/coldsauce.png diff --git a/icons/ui_icons/condiments/condi_empty.png b/icons/ui/condiments/condi_empty.png similarity index 100% rename from icons/ui_icons/condiments/condi_empty.png rename to icons/ui/condiments/condi_empty.png diff --git a/icons/ui_icons/condiments/cookingoil.png b/icons/ui/condiments/cookingoil.png similarity index 100% rename from icons/ui_icons/condiments/cookingoil.png rename to icons/ui/condiments/cookingoil.png diff --git a/icons/ui_icons/condiments/enzyme.png b/icons/ui/condiments/enzyme.png similarity index 100% rename from icons/ui_icons/condiments/enzyme.png rename to icons/ui/condiments/enzyme.png diff --git a/icons/ui_icons/condiments/flour.png b/icons/ui/condiments/flour.png similarity index 100% rename from icons/ui_icons/condiments/flour.png rename to icons/ui/condiments/flour.png diff --git a/icons/ui_icons/condiments/honey.png b/icons/ui/condiments/honey.png similarity index 100% rename from icons/ui_icons/condiments/honey.png rename to icons/ui/condiments/honey.png diff --git a/icons/ui_icons/condiments/hotsauce.png b/icons/ui/condiments/hotsauce.png similarity index 100% rename from icons/ui_icons/condiments/hotsauce.png rename to icons/ui/condiments/hotsauce.png diff --git a/icons/ui_icons/condiments/ketchup.png b/icons/ui/condiments/ketchup.png similarity index 100% rename from icons/ui_icons/condiments/ketchup.png rename to icons/ui/condiments/ketchup.png diff --git a/icons/ui_icons/condiments/mayonnaise.png b/icons/ui/condiments/mayonnaise.png similarity index 100% rename from icons/ui_icons/condiments/mayonnaise.png rename to icons/ui/condiments/mayonnaise.png diff --git a/icons/ui_icons/condiments/milk.png b/icons/ui/condiments/milk.png similarity index 100% rename from icons/ui_icons/condiments/milk.png rename to icons/ui/condiments/milk.png diff --git a/icons/ui_icons/condiments/oliveoil.png b/icons/ui/condiments/oliveoil.png similarity index 100% rename from icons/ui_icons/condiments/oliveoil.png rename to icons/ui/condiments/oliveoil.png diff --git a/icons/ui_icons/condiments/peanutbutter.png b/icons/ui/condiments/peanutbutter.png similarity index 100% rename from icons/ui_icons/condiments/peanutbutter.png rename to icons/ui/condiments/peanutbutter.png diff --git a/icons/ui_icons/condiments/peppermillsmall.png b/icons/ui/condiments/peppermillsmall.png similarity index 100% rename from icons/ui_icons/condiments/peppermillsmall.png rename to icons/ui/condiments/peppermillsmall.png diff --git a/icons/ui_icons/condiments/rice.png b/icons/ui/condiments/rice.png similarity index 100% rename from icons/ui_icons/condiments/rice.png rename to icons/ui/condiments/rice.png diff --git a/icons/ui_icons/condiments/saltshakersmall.png b/icons/ui/condiments/saltshakersmall.png similarity index 100% rename from icons/ui_icons/condiments/saltshakersmall.png rename to icons/ui/condiments/saltshakersmall.png diff --git a/icons/ui_icons/condiments/soymilk.png b/icons/ui/condiments/soymilk.png similarity index 100% rename from icons/ui_icons/condiments/soymilk.png rename to icons/ui/condiments/soymilk.png diff --git a/icons/ui_icons/condiments/soysauce.png b/icons/ui/condiments/soysauce.png similarity index 100% rename from icons/ui_icons/condiments/soysauce.png rename to icons/ui/condiments/soysauce.png diff --git a/icons/ui_icons/condiments/sugar.png b/icons/ui/condiments/sugar.png similarity index 100% rename from icons/ui_icons/condiments/sugar.png rename to icons/ui/condiments/sugar.png diff --git a/icons/ui_icons/contracts/bluespace.png b/icons/ui/contracts/bluespace.png similarity index 100% rename from icons/ui_icons/contracts/bluespace.png rename to icons/ui/contracts/bluespace.png diff --git a/icons/ui_icons/contracts/destruction.png b/icons/ui/contracts/destruction.png similarity index 100% rename from icons/ui_icons/contracts/destruction.png rename to icons/ui/contracts/destruction.png diff --git a/icons/ui_icons/contracts/healing.png b/icons/ui/contracts/healing.png similarity index 100% rename from icons/ui_icons/contracts/healing.png rename to icons/ui/contracts/healing.png diff --git a/icons/ui_icons/contracts/robeless.png b/icons/ui/contracts/robeless.png similarity index 100% rename from icons/ui_icons/contracts/robeless.png rename to icons/ui/contracts/robeless.png diff --git a/icons/ui_icons/dna/dna_discovered.gif b/icons/ui/dna/dna_discovered.gif similarity index 100% rename from icons/ui_icons/dna/dna_discovered.gif rename to icons/ui/dna/dna_discovered.gif diff --git a/icons/ui_icons/dna/dna_extra.gif b/icons/ui/dna/dna_extra.gif similarity index 100% rename from icons/ui_icons/dna/dna_extra.gif rename to icons/ui/dna/dna_extra.gif diff --git a/icons/ui_icons/dna/dna_undiscovered.gif b/icons/ui/dna/dna_undiscovered.gif similarity index 100% rename from icons/ui_icons/dna/dna_undiscovered.gif rename to icons/ui/dna/dna_undiscovered.gif diff --git a/icons/ui_icons/inventory/back.png b/icons/ui/inventory/back.png similarity index 100% rename from icons/ui_icons/inventory/back.png rename to icons/ui/inventory/back.png diff --git a/icons/ui_icons/inventory/belt.png b/icons/ui/inventory/belt.png similarity index 100% rename from icons/ui_icons/inventory/belt.png rename to icons/ui/inventory/belt.png diff --git a/icons/ui_icons/inventory/collar.png b/icons/ui/inventory/collar.png similarity index 100% rename from icons/ui_icons/inventory/collar.png rename to icons/ui/inventory/collar.png diff --git a/icons/ui_icons/inventory/ears.png b/icons/ui/inventory/ears.png similarity index 100% rename from icons/ui_icons/inventory/ears.png rename to icons/ui/inventory/ears.png diff --git a/icons/ui_icons/inventory/glasses.png b/icons/ui/inventory/glasses.png similarity index 100% rename from icons/ui_icons/inventory/glasses.png rename to icons/ui/inventory/glasses.png diff --git a/icons/ui_icons/inventory/gloves.png b/icons/ui/inventory/gloves.png similarity index 100% rename from icons/ui_icons/inventory/gloves.png rename to icons/ui/inventory/gloves.png diff --git a/icons/ui_icons/inventory/hand_l.png b/icons/ui/inventory/hand_l.png similarity index 100% rename from icons/ui_icons/inventory/hand_l.png rename to icons/ui/inventory/hand_l.png diff --git a/icons/ui_icons/inventory/hand_r.png b/icons/ui/inventory/hand_r.png similarity index 100% rename from icons/ui_icons/inventory/hand_r.png rename to icons/ui/inventory/hand_r.png diff --git a/icons/ui_icons/inventory/head.png b/icons/ui/inventory/head.png similarity index 100% rename from icons/ui_icons/inventory/head.png rename to icons/ui/inventory/head.png diff --git a/icons/ui_icons/inventory/id.png b/icons/ui/inventory/id.png similarity index 100% rename from icons/ui_icons/inventory/id.png rename to icons/ui/inventory/id.png diff --git a/icons/ui_icons/inventory/mask.png b/icons/ui/inventory/mask.png similarity index 100% rename from icons/ui_icons/inventory/mask.png rename to icons/ui/inventory/mask.png diff --git a/icons/ui_icons/inventory/neck.png b/icons/ui/inventory/neck.png similarity index 100% rename from icons/ui_icons/inventory/neck.png rename to icons/ui/inventory/neck.png diff --git a/icons/ui_icons/inventory/pocket.png b/icons/ui/inventory/pocket.png similarity index 100% rename from icons/ui_icons/inventory/pocket.png rename to icons/ui/inventory/pocket.png diff --git a/icons/ui_icons/inventory/shoes.png b/icons/ui/inventory/shoes.png similarity index 100% rename from icons/ui_icons/inventory/shoes.png rename to icons/ui/inventory/shoes.png diff --git a/icons/ui_icons/inventory/suit.png b/icons/ui/inventory/suit.png similarity index 100% rename from icons/ui_icons/inventory/suit.png rename to icons/ui/inventory/suit.png diff --git a/icons/ui_icons/inventory/suit_storage.png b/icons/ui/inventory/suit_storage.png similarity index 100% rename from icons/ui_icons/inventory/suit_storage.png rename to icons/ui/inventory/suit_storage.png diff --git a/icons/ui_icons/inventory/uniform.png b/icons/ui/inventory/uniform.png similarity index 100% rename from icons/ui_icons/inventory/uniform.png rename to icons/ui/inventory/uniform.png diff --git a/icons/ui_icons/mecha/armor.dmi b/icons/ui/mecha/armor.dmi similarity index 100% rename from icons/ui_icons/mecha/armor.dmi rename to icons/ui/mecha/armor.dmi diff --git a/icons/ui_icons/notes/high_button.png b/icons/ui/notes/high_button.png similarity index 100% rename from icons/ui_icons/notes/high_button.png rename to icons/ui/notes/high_button.png diff --git a/icons/ui_icons/notes/medium_button.png b/icons/ui/notes/medium_button.png similarity index 100% rename from icons/ui_icons/notes/medium_button.png rename to icons/ui/notes/medium_button.png diff --git a/icons/ui_icons/notes/minor_button.png b/icons/ui/notes/minor_button.png similarity index 100% rename from icons/ui_icons/notes/minor_button.png rename to icons/ui/notes/minor_button.png diff --git a/icons/ui_icons/notes/none_button.png b/icons/ui/notes/none_button.png similarity index 100% rename from icons/ui_icons/notes/none_button.png rename to icons/ui/notes/none_button.png diff --git a/icons/ui_icons/orbit/ghost.png b/icons/ui/orbit/ghost.png similarity index 100% rename from icons/ui_icons/orbit/ghost.png rename to icons/ui/orbit/ghost.png diff --git a/icons/ui_icons/particle_editor/box_gen.png b/icons/ui/particle_editor/box_gen.png similarity index 100% rename from icons/ui_icons/particle_editor/box_gen.png rename to icons/ui/particle_editor/box_gen.png diff --git a/icons/ui_icons/particle_editor/circle_gen.png b/icons/ui/particle_editor/circle_gen.png similarity index 100% rename from icons/ui_icons/particle_editor/circle_gen.png rename to icons/ui/particle_editor/circle_gen.png diff --git a/icons/ui_icons/particle_editor/cube_gen.png b/icons/ui/particle_editor/cube_gen.png similarity index 100% rename from icons/ui_icons/particle_editor/cube_gen.png rename to icons/ui/particle_editor/cube_gen.png diff --git a/icons/ui_icons/particle_editor/linear_rand.png b/icons/ui/particle_editor/linear_rand.png similarity index 100% rename from icons/ui_icons/particle_editor/linear_rand.png rename to icons/ui/particle_editor/linear_rand.png diff --git a/icons/ui_icons/particle_editor/motion.png b/icons/ui/particle_editor/motion.png similarity index 100% rename from icons/ui_icons/particle_editor/motion.png rename to icons/ui/particle_editor/motion.png diff --git a/icons/ui_icons/particle_editor/normal_rand.png b/icons/ui/particle_editor/normal_rand.png similarity index 100% rename from icons/ui_icons/particle_editor/normal_rand.png rename to icons/ui/particle_editor/normal_rand.png diff --git a/icons/ui_icons/particle_editor/num_gen.png b/icons/ui/particle_editor/num_gen.png similarity index 100% rename from icons/ui_icons/particle_editor/num_gen.png rename to icons/ui/particle_editor/num_gen.png diff --git a/icons/ui_icons/particle_editor/sphere_gen.png b/icons/ui/particle_editor/sphere_gen.png similarity index 100% rename from icons/ui_icons/particle_editor/sphere_gen.png rename to icons/ui/particle_editor/sphere_gen.png diff --git a/icons/ui_icons/particle_editor/square_gen.png b/icons/ui/particle_editor/square_gen.png similarity index 100% rename from icons/ui_icons/particle_editor/square_gen.png rename to icons/ui/particle_editor/square_gen.png diff --git a/icons/ui_icons/particle_editor/square_rand.png b/icons/ui/particle_editor/square_rand.png similarity index 100% rename from icons/ui_icons/particle_editor/square_rand.png rename to icons/ui/particle_editor/square_rand.png diff --git a/icons/ui_icons/particle_editor/uniform_rand.png b/icons/ui/particle_editor/uniform_rand.png similarity index 100% rename from icons/ui_icons/particle_editor/uniform_rand.png rename to icons/ui/particle_editor/uniform_rand.png diff --git a/icons/ui_icons/particle_editor/vector_gen.png b/icons/ui/particle_editor/vector_gen.png similarity index 100% rename from icons/ui_icons/particle_editor/vector_gen.png rename to icons/ui/particle_editor/vector_gen.png diff --git a/icons/pda_icons/pda_atmos.png b/icons/ui/pda/pda_atmos.png similarity index 100% rename from icons/pda_icons/pda_atmos.png rename to icons/ui/pda/pda_atmos.png diff --git a/icons/pda_icons/pda_back.png b/icons/ui/pda/pda_back.png similarity index 100% rename from icons/pda_icons/pda_back.png rename to icons/ui/pda/pda_back.png diff --git a/icons/pda_icons/pda_bell.png b/icons/ui/pda/pda_bell.png similarity index 100% rename from icons/pda_icons/pda_bell.png rename to icons/ui/pda/pda_bell.png diff --git a/icons/pda_icons/pda_blank.png b/icons/ui/pda/pda_blank.png similarity index 100% rename from icons/pda_icons/pda_blank.png rename to icons/ui/pda/pda_blank.png diff --git a/icons/pda_icons/pda_boom.png b/icons/ui/pda/pda_boom.png similarity index 100% rename from icons/pda_icons/pda_boom.png rename to icons/ui/pda/pda_boom.png diff --git a/icons/pda_icons/pda_bucket.png b/icons/ui/pda/pda_bucket.png similarity index 100% rename from icons/pda_icons/pda_bucket.png rename to icons/ui/pda/pda_bucket.png diff --git a/icons/pda_icons/pda_chatroom.png b/icons/ui/pda/pda_chatroom.png similarity index 100% rename from icons/pda_icons/pda_chatroom.png rename to icons/ui/pda/pda_chatroom.png diff --git a/icons/pda_icons/pda_cleanbot.png b/icons/ui/pda/pda_cleanbot.png similarity index 100% rename from icons/pda_icons/pda_cleanbot.png rename to icons/ui/pda/pda_cleanbot.png diff --git a/icons/pda_icons/pda_color.png b/icons/ui/pda/pda_color.png similarity index 100% rename from icons/pda_icons/pda_color.png rename to icons/ui/pda/pda_color.png diff --git a/icons/pda_icons/pda_crate.png b/icons/ui/pda/pda_crate.png similarity index 100% rename from icons/pda_icons/pda_crate.png rename to icons/ui/pda/pda_crate.png diff --git a/icons/pda_icons/pda_cuffs.png b/icons/ui/pda/pda_cuffs.png similarity index 100% rename from icons/pda_icons/pda_cuffs.png rename to icons/ui/pda/pda_cuffs.png diff --git a/icons/pda_icons/pda_droneblacklist.png b/icons/ui/pda/pda_droneblacklist.png similarity index 100% rename from icons/pda_icons/pda_droneblacklist.png rename to icons/ui/pda/pda_droneblacklist.png diff --git a/icons/pda_icons/pda_dronephone.png b/icons/ui/pda/pda_dronephone.png similarity index 100% rename from icons/pda_icons/pda_dronephone.png rename to icons/ui/pda/pda_dronephone.png diff --git a/icons/pda_icons/pda_eject.png b/icons/ui/pda/pda_eject.png similarity index 100% rename from icons/pda_icons/pda_eject.png rename to icons/ui/pda/pda_eject.png diff --git a/icons/pda_icons/pda_emoji.png b/icons/ui/pda/pda_emoji.png similarity index 100% rename from icons/pda_icons/pda_emoji.png rename to icons/ui/pda/pda_emoji.png diff --git a/icons/pda_icons/pda_exit.png b/icons/ui/pda/pda_exit.png similarity index 100% rename from icons/pda_icons/pda_exit.png rename to icons/ui/pda/pda_exit.png diff --git a/icons/pda_icons/pda_flashlight.png b/icons/ui/pda/pda_flashlight.png similarity index 100% rename from icons/pda_icons/pda_flashlight.png rename to icons/ui/pda/pda_flashlight.png diff --git a/icons/pda_icons/pda_floorbot.png b/icons/ui/pda/pda_floorbot.png similarity index 100% rename from icons/pda_icons/pda_floorbot.png rename to icons/ui/pda/pda_floorbot.png diff --git a/icons/pda_icons/pda_font.png b/icons/ui/pda/pda_font.png similarity index 100% rename from icons/pda_icons/pda_font.png rename to icons/ui/pda/pda_font.png diff --git a/icons/pda_icons/pda_honk.png b/icons/ui/pda/pda_honk.png similarity index 100% rename from icons/pda_icons/pda_honk.png rename to icons/ui/pda/pda_honk.png diff --git a/icons/pda_icons/pda_locked.PNG b/icons/ui/pda/pda_locked.PNG similarity index 100% rename from icons/pda_icons/pda_locked.PNG rename to icons/ui/pda/pda_locked.PNG diff --git a/icons/pda_icons/pda_mail.png b/icons/ui/pda/pda_mail.png similarity index 100% rename from icons/pda_icons/pda_mail.png rename to icons/ui/pda/pda_mail.png diff --git a/icons/pda_icons/pda_medbot.png b/icons/ui/pda/pda_medbot.png similarity index 100% rename from icons/pda_icons/pda_medbot.png rename to icons/ui/pda/pda_medbot.png diff --git a/icons/pda_icons/pda_medical.png b/icons/ui/pda/pda_medical.png similarity index 100% rename from icons/pda_icons/pda_medical.png rename to icons/ui/pda/pda_medical.png diff --git a/icons/pda_icons/pda_menu.png b/icons/ui/pda/pda_menu.png similarity index 100% rename from icons/pda_icons/pda_menu.png rename to icons/ui/pda/pda_menu.png diff --git a/icons/pda_icons/pda_mule.png b/icons/ui/pda/pda_mule.png similarity index 100% rename from icons/pda_icons/pda_mule.png rename to icons/ui/pda/pda_mule.png diff --git a/icons/pda_icons/pda_notes.png b/icons/ui/pda/pda_notes.png similarity index 100% rename from icons/pda_icons/pda_notes.png rename to icons/ui/pda/pda_notes.png diff --git a/icons/pda_icons/pda_power.png b/icons/ui/pda/pda_power.png similarity index 100% rename from icons/pda_icons/pda_power.png rename to icons/ui/pda/pda_power.png diff --git a/icons/pda_icons/pda_rdoor.png b/icons/ui/pda/pda_rdoor.png similarity index 100% rename from icons/pda_icons/pda_rdoor.png rename to icons/ui/pda/pda_rdoor.png diff --git a/icons/pda_icons/pda_reagent.png b/icons/ui/pda/pda_reagent.png similarity index 100% rename from icons/pda_icons/pda_reagent.png rename to icons/ui/pda/pda_reagent.png diff --git a/icons/pda_icons/pda_refresh.png b/icons/ui/pda/pda_refresh.png similarity index 100% rename from icons/pda_icons/pda_refresh.png rename to icons/ui/pda/pda_refresh.png diff --git a/icons/pda_icons/pda_scanner.png b/icons/ui/pda/pda_scanner.png similarity index 100% rename from icons/pda_icons/pda_scanner.png rename to icons/ui/pda/pda_scanner.png diff --git a/icons/pda_icons/pda_signaler.png b/icons/ui/pda/pda_signaler.png similarity index 100% rename from icons/pda_icons/pda_signaler.png rename to icons/ui/pda/pda_signaler.png diff --git a/icons/pda_icons/pda_skills.png b/icons/ui/pda/pda_skills.png similarity index 100% rename from icons/pda_icons/pda_skills.png rename to icons/ui/pda/pda_skills.png diff --git a/icons/pda_icons/pda_status.png b/icons/ui/pda/pda_status.png similarity index 100% rename from icons/pda_icons/pda_status.png rename to icons/ui/pda/pda_status.png diff --git a/icons/program_icons/alarm_green.gif b/icons/ui/programs/alarm_green.gif similarity index 100% rename from icons/program_icons/alarm_green.gif rename to icons/ui/programs/alarm_green.gif diff --git a/icons/program_icons/alarm_red.gif b/icons/ui/programs/alarm_red.gif similarity index 100% rename from icons/program_icons/alarm_red.gif rename to icons/ui/programs/alarm_red.gif diff --git a/icons/program_icons/batt_100.gif b/icons/ui/programs/batt_100.gif similarity index 100% rename from icons/program_icons/batt_100.gif rename to icons/ui/programs/batt_100.gif diff --git a/icons/program_icons/batt_20.gif b/icons/ui/programs/batt_20.gif similarity index 100% rename from icons/program_icons/batt_20.gif rename to icons/ui/programs/batt_20.gif diff --git a/icons/program_icons/batt_40.gif b/icons/ui/programs/batt_40.gif similarity index 100% rename from icons/program_icons/batt_40.gif rename to icons/ui/programs/batt_40.gif diff --git a/icons/program_icons/batt_5.gif b/icons/ui/programs/batt_5.gif similarity index 100% rename from icons/program_icons/batt_5.gif rename to icons/ui/programs/batt_5.gif diff --git a/icons/program_icons/batt_60.gif b/icons/ui/programs/batt_60.gif similarity index 100% rename from icons/program_icons/batt_60.gif rename to icons/ui/programs/batt_60.gif diff --git a/icons/program_icons/batt_80.gif b/icons/ui/programs/batt_80.gif similarity index 100% rename from icons/program_icons/batt_80.gif rename to icons/ui/programs/batt_80.gif diff --git a/icons/program_icons/borg_mon.gif b/icons/ui/programs/borg_mon.gif similarity index 100% rename from icons/program_icons/borg_mon.gif rename to icons/ui/programs/borg_mon.gif diff --git a/icons/program_icons/charging.gif b/icons/ui/programs/charging.gif similarity index 100% rename from icons/program_icons/charging.gif rename to icons/ui/programs/charging.gif diff --git a/icons/program_icons/downloader_finished.gif b/icons/ui/programs/downloader_finished.gif similarity index 100% rename from icons/program_icons/downloader_finished.gif rename to icons/ui/programs/downloader_finished.gif diff --git a/icons/program_icons/downloader_running.gif b/icons/ui/programs/downloader_running.gif similarity index 100% rename from icons/program_icons/downloader_running.gif rename to icons/ui/programs/downloader_running.gif diff --git a/icons/program_icons/mafia.gif b/icons/ui/programs/mafia.gif similarity index 100% rename from icons/program_icons/mafia.gif rename to icons/ui/programs/mafia.gif diff --git a/icons/program_icons/ntnrc_idle.gif b/icons/ui/programs/ntnrc_idle.gif similarity index 100% rename from icons/program_icons/ntnrc_idle.gif rename to icons/ui/programs/ntnrc_idle.gif diff --git a/icons/program_icons/ntnrc_new.gif b/icons/ui/programs/ntnrc_new.gif similarity index 100% rename from icons/program_icons/ntnrc_new.gif rename to icons/ui/programs/ntnrc_new.gif diff --git a/icons/program_icons/power_norm.gif b/icons/ui/programs/power_norm.gif similarity index 100% rename from icons/program_icons/power_norm.gif rename to icons/ui/programs/power_norm.gif diff --git a/icons/program_icons/power_warn.gif b/icons/ui/programs/power_warn.gif similarity index 100% rename from icons/program_icons/power_warn.gif rename to icons/ui/programs/power_warn.gif diff --git a/icons/program_icons/robotact.gif b/icons/ui/programs/robotact.gif similarity index 100% rename from icons/program_icons/robotact.gif rename to icons/ui/programs/robotact.gif diff --git a/icons/program_icons/sig_high.gif b/icons/ui/programs/sig_high.gif similarity index 100% rename from icons/program_icons/sig_high.gif rename to icons/ui/programs/sig_high.gif diff --git a/icons/program_icons/sig_lan.gif b/icons/ui/programs/sig_lan.gif similarity index 100% rename from icons/program_icons/sig_lan.gif rename to icons/ui/programs/sig_lan.gif diff --git a/icons/program_icons/sig_low.gif b/icons/ui/programs/sig_low.gif similarity index 100% rename from icons/program_icons/sig_low.gif rename to icons/ui/programs/sig_low.gif diff --git a/icons/program_icons/sig_none.gif b/icons/ui/programs/sig_none.gif similarity index 100% rename from icons/program_icons/sig_none.gif rename to icons/ui/programs/sig_none.gif diff --git a/icons/program_icons/smmon_0.gif b/icons/ui/programs/smmon_0.gif similarity index 100% rename from icons/program_icons/smmon_0.gif rename to icons/ui/programs/smmon_0.gif diff --git a/icons/program_icons/smmon_1.gif b/icons/ui/programs/smmon_1.gif similarity index 100% rename from icons/program_icons/smmon_1.gif rename to icons/ui/programs/smmon_1.gif diff --git a/icons/program_icons/smmon_2.gif b/icons/ui/programs/smmon_2.gif similarity index 100% rename from icons/program_icons/smmon_2.gif rename to icons/ui/programs/smmon_2.gif diff --git a/icons/program_icons/smmon_3.gif b/icons/ui/programs/smmon_3.gif similarity index 100% rename from icons/program_icons/smmon_3.gif rename to icons/ui/programs/smmon_3.gif diff --git a/icons/program_icons/smmon_4.gif b/icons/ui/programs/smmon_4.gif similarity index 100% rename from icons/program_icons/smmon_4.gif rename to icons/ui/programs/smmon_4.gif diff --git a/icons/program_icons/smmon_5.gif b/icons/ui/programs/smmon_5.gif similarity index 100% rename from icons/program_icons/smmon_5.gif rename to icons/ui/programs/smmon_5.gif diff --git a/icons/program_icons/smmon_6.gif b/icons/ui/programs/smmon_6.gif similarity index 100% rename from icons/program_icons/smmon_6.gif rename to icons/ui/programs/smmon_6.gif diff --git a/icons/ui_icons/safe/safe_dial.png b/icons/ui/safe/safe_dial.png similarity index 100% rename from icons/ui_icons/safe/safe_dial.png rename to icons/ui/safe/safe_dial.png diff --git a/icons/ui_icons/screentips/cursor_hints.dmi b/icons/ui/screentips/cursor_hints.dmi similarity index 100% rename from icons/ui_icons/screentips/cursor_hints.dmi rename to icons/ui/screentips/cursor_hints.dmi diff --git a/icons/ui_icons/tgui/grid_background.png b/icons/ui/tgui/grid_background.png similarity index 100% rename from icons/ui_icons/tgui/grid_background.png rename to icons/ui/tgui/grid_background.png diff --git a/icons/ui_icons/tgui/ntosradar_background.png b/icons/ui/tgui/ntosradar_background.png similarity index 100% rename from icons/ui_icons/tgui/ntosradar_background.png rename to icons/ui/tgui/ntosradar_background.png diff --git a/icons/ui_icons/tgui/ntosradar_pointer.png b/icons/ui/tgui/ntosradar_pointer.png similarity index 100% rename from icons/ui_icons/tgui/ntosradar_pointer.png rename to icons/ui/tgui/ntosradar_pointer.png diff --git a/icons/ui_icons/tgui/ntosradar_pointer_S.png b/icons/ui/tgui/ntosradar_pointer_S.png similarity index 100% rename from icons/ui_icons/tgui/ntosradar_pointer_S.png rename to icons/ui/tgui/ntosradar_pointer_S.png diff --git a/icons/ui_icons/virtualpet/pet_state.dmi b/icons/ui/virtualpet/pet_state.dmi similarity index 100% rename from icons/ui_icons/virtualpet/pet_state.dmi rename to icons/ui/virtualpet/pet_state.dmi diff --git a/strings/tcg/set_one.json b/strings/tcg/set_one.json index c1c061cad46849..233f984835ddc9 100644 --- a/strings/tcg/set_one.json +++ b/strings/tcg/set_one.json @@ -277,7 +277,7 @@ "cardtype": "Creature", "cardsubtype": "Sloth", "rarity": "common", - "summon_icon_file": "icons/mob/pets.dmi", + "summon_icon_file": "icons/mob/simple/pets.dmi", "summon_icon_state": "cool_sloth" }, { @@ -1006,7 +1006,7 @@ "cardtype": "Creature", "cardsubtype": "Cat", "rarity": "uncommon", - "summon_icon_file": "icons/mob/pets.dmi", + "summon_icon_file": "icons/mob/simple/pets.dmi", "summon_icon_state": "cat" }, { diff --git a/tgstation.dme b/tgstation.dme index 12cd8bdb54ee29..2eea721858a3d1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -852,6 +852,7 @@ #include "code\datums\actions\mobs\dash.dm" #include "code\datums\actions\mobs\defensive_mode.dm" #include "code\datums\actions\mobs\fire_breath.dm" +#include "code\datums\actions\mobs\ground_slam.dm" #include "code\datums\actions\mobs\lava_swoop.dm" #include "code\datums\actions\mobs\meteors.dm" #include "code\datums\actions\mobs\mobcooldown.dm" @@ -860,6 +861,7 @@ #include "code\datums\actions\mobs\projectileattack.dm" #include "code\datums\actions\mobs\sign_language.dm" #include "code\datums\actions\mobs\sneak.dm" +#include "code\datums\actions\mobs\teleport.dm" #include "code\datums\actions\mobs\transform_weapon.dm" #include "code\datums\actions\mobs\sequences\dash_attack.dm" #include "code\datums\actions\mobs\sequences\projectile.dm" @@ -1151,6 +1153,7 @@ #include "code\datums\components\pinnable_accessory.dm" #include "code\datums\components\plundering_attacks.dm" #include "code\datums\components\pricetag.dm" +#include "code\datums\components\profound_fisher.dm" #include "code\datums\components\punchcooldown.dm" #include "code\datums\components\puzzgrid.dm" #include "code\datums\components\radiation_countdown.dm" @@ -1225,6 +1228,7 @@ #include "code\datums\components\temporary_description.dm" #include "code\datums\components\tether.dm" #include "code\datums\components\thermite.dm" +#include "code\datums\components\throwbonus_on_windup.dm" #include "code\datums\components\tippable.dm" #include "code\datums\components\toggle_attached_clothing.dm" #include "code\datums\components\toggle_suit.dm" @@ -1841,6 +1845,7 @@ #include "code\datums\status_effects\debuffs\strandling.dm" #include "code\datums\status_effects\debuffs\terrified.dm" #include "code\datums\status_effects\debuffs\tower_of_babel.dm" +#include "code\datums\status_effects\debuffs\tox_vomit.dm" #include "code\datums\status_effects\debuffs\slime\slime_food.dm" #include "code\datums\status_effects\debuffs\slime\slime_leech.dm" #include "code\datums\status_effects\debuffs\slime\slimed.dm" @@ -3048,10 +3053,6 @@ #include "code\modules\antagonists\cult\cult_turf_overlay.dm" #include "code\modules\antagonists\cult\rune_spawn_action.dm" #include "code\modules\antagonists\cult\runes.dm" -#include "code\modules\antagonists\disease\disease_abilities.dm" -#include "code\modules\antagonists\disease\disease_datum.dm" -#include "code\modules\antagonists\disease\disease_disease.dm" -#include "code\modules\antagonists\disease\disease_mob.dm" #include "code\modules\antagonists\ert\ert.dm" #include "code\modules\antagonists\fugitive\fugitive.dm" #include "code\modules\antagonists\fugitive\fugitive_equipment.dm" @@ -3979,7 +3980,6 @@ #include "code\modules\events\ghost_role\operative.dm" #include "code\modules\events\ghost_role\revenant_event.dm" #include "code\modules\events\ghost_role\sentience.dm" -#include "code\modules\events\ghost_role\sentient_disease.dm" #include "code\modules\events\ghost_role\slaughter_event.dm" #include "code\modules\events\ghost_role\space_dragon.dm" #include "code\modules\events\ghost_role\space_ninja.dm" @@ -4286,7 +4286,6 @@ #include "code\modules\jobs\job_types\antagonists\nuclear_operative.dm" #include "code\modules\jobs\job_types\antagonists\paradox_clone.dm" #include "code\modules\jobs\job_types\antagonists\revenant.dm" -#include "code\modules\jobs\job_types\antagonists\sentient_disease.dm" #include "code\modules\jobs\job_types\antagonists\slaughter_demon.dm" #include "code\modules\jobs\job_types\antagonists\space_dragon.dm" #include "code\modules\jobs\job_types\antagonists\space_ninja.dm" @@ -5964,6 +5963,7 @@ #include "code\modules\transport\tram\tram_structures.dm" #include "code\modules\tutorials\_tutorial.dm" #include "code\modules\tutorials\tutorial_instruction.dm" +#include "code\modules\tutorials\tutorial_skip.dm" #include "code\modules\tutorials\tutorials\drop.dm" #include "code\modules\tutorials\tutorials\switch_hands.dm" #include "code\modules\unit_tests\_unit_tests.dm" diff --git a/tgui/packages/tgui/interfaces/LootPanel/LootBox.tsx b/tgui/packages/tgui/interfaces/LootPanel/LootBox.tsx index 137021b34ef771..3fb94324b6a2bb 100644 --- a/tgui/packages/tgui/interfaces/LootPanel/LootBox.tsx +++ b/tgui/packages/tgui/interfaces/LootPanel/LootBox.tsx @@ -1,3 +1,4 @@ +import { BooleanLike } from 'common/react'; import { capitalizeAll, capitalizeFirst } from 'common/string'; import { useBackend } from '../../backend'; @@ -5,6 +6,10 @@ import { Tooltip } from '../../components'; import { IconDisplay } from './IconDisplay'; import { SearchGroup, SearchItem } from './types'; +type Data = { + is_blind: BooleanLike; +}; + type Props = | { item: SearchItem; @@ -14,7 +19,8 @@ type Props = }; export function LootBox(props: Props) { - const { act } = useBackend(); + const { act, data } = useBackend(); + const { is_blind } = data; let amount = 0; let item: SearchItem; @@ -29,32 +35,35 @@ export function LootBox(props: Props) { ? '???' : capitalizeFirst(item.name.split(' ')[0]).slice(0, 5); - return ( - -
-
- act('grab', { - alt: event.altKey, - ctrl: event.ctrlKey, - ref: item.ref, - shift: event.shiftKey, - }) - } - onContextMenu={(event) => { - event.preventDefault(); - act('grab', { - right: true, - ref: item.ref, - }); - }} - > - - {amount > 1 &&
{amount}
} -
- {name} + // So we can conditionally wrap tooltip + const content = ( +
+
+ act('grab', { + alt: event.altKey, + ctrl: event.ctrlKey, + ref: item.ref, + shift: event.shiftKey, + }) + } + onContextMenu={(event) => { + event.preventDefault(); + act('grab', { + right: true, + ref: item.ref, + }); + }} + > + + {amount > 1 &&
{amount}
}
- + {!is_blind && {name}} +
); + + if (is_blind) return content; + + return {content}; } diff --git a/tgui/packages/tgui/interfaces/Pandemic/Symptom.tsx b/tgui/packages/tgui/interfaces/Pandemic/Symptom.tsx index cdbb49f715fca9..5fa92583f2e517 100644 --- a/tgui/packages/tgui/interfaces/Pandemic/Symptom.tsx +++ b/tgui/packages/tgui/interfaces/Pandemic/Symptom.tsx @@ -70,7 +70,7 @@ const Thresholds = (props) => { /** Displays the numerical trait modifiers for a virus symptom */ const Traits = (props) => { const { - symptom: { level, resistance, stage_speed, stealth, transmission }, + symptom: { level, weight, resistance, stage_speed, stealth, transmission }, } = props; return ( @@ -81,6 +81,11 @@ const Traits = (props) => { {level} + + + {weight} + + {resistance} diff --git a/tools/ci/check_grep.sh b/tools/ci/check_grep.sh index a9e7e11117a9e9..8436073fe97cb6 100644 --- a/tools/ci/check_grep.sh +++ b/tools/ci/check_grep.sh @@ -92,6 +92,11 @@ if $grep -i'centcomm' $map_files; then echo -e "${RED}ERROR: Misspelling(s) of CentCom detected in maps, please remove the extra M(s).${NC}" st=1 fi; +if $grep -i'eciev' $map_files; then + echo + echo -e "${RED}ERROR: Common I-before-E typo detected in maps.${NC}" + st=1 +fi; section "whitespace issues" part "space indentation" @@ -205,6 +210,11 @@ if $grep 'NanoTrasen' $code_files; then echo -e "${RED}ERROR: Misspelling(s) of Nanotrasen detected in code, please uncapitalize the T(s).${NC}" st=1 fi; +if $grep -i'eciev' $code_files; then + echo + echo -e "${RED}ERROR: Common I-before-E typo detected in code.${NC}" + st=1 +fi; part "map json naming" if ls _maps/*.json | $grep "[A-Z]"; then echo