diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm index 96dec4af7207d..0bfcc133f0c98 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm @@ -25,8 +25,8 @@ /obj/item/clothing/shoes/galoshes{ pixel_y = -5 }, -/obj/item/flashlight/eyelight{ - pixel_y = 11 +/obj/item/flashlight{ + pixel_y = 8 }, /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/operations) diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 9de921e10feb6..00961dbd7f5d6 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -160,6 +160,10 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/airlock_controller/incinerator_atmos{ + pixel_x = -40; + pixel_y = -8 + }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) "aem" = ( @@ -205,8 +209,15 @@ /obj/machinery/atmospherics/components/trinary/filter/flipped/layer2{ dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/light/small/directional/north, +/obj/machinery/button/door/incinerator_vent_atmos_aux{ + pixel_x = 8; + pixel_y = 24 + }, +/obj/machinery/button/door/incinerator_vent_atmos_main{ + pixel_x = 8; + pixel_y = 36 + }, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "aeX" = ( @@ -4399,6 +4410,7 @@ cycle_id = "atmos_airlock_1" }, /obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/office) "bJK" = ( @@ -4958,8 +4970,9 @@ /turf/open/floor/iron, /area/station/science/xenobiology) "bXb" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt/dust, +/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/maintenance/department/electrical) "bXi" = ( @@ -5135,6 +5148,7 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/office) "cam" = ( @@ -5721,7 +5735,7 @@ dir = 1; name = "Plasma to Pure" }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green{ +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, /turf/open/floor/iron, @@ -7336,6 +7350,7 @@ /obj/machinery/door/airlock/engineering/glass{ name = "Engineering Storage" }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron/smooth_half{ dir = 8 }, @@ -9247,6 +9262,7 @@ /area/station/maintenance/starboard/aft) "dzH" = ( /obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) "dAn" = ( @@ -10738,6 +10754,10 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"efn" = ( +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "efy" = ( /obj/item/kirbyplants/organic/plant21, /obj/machinery/status_display/ai/directional/west, @@ -12438,6 +12458,9 @@ "eKd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/machinery/light/small/directional/west, +/obj/machinery/airlock_sensor/incinerator_atmos{ + pixel_y = -20 + }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) "eKf" = ( @@ -12468,9 +12491,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"eKU" = ( -/turf/closed/wall/r_wall/rust, -/area/station/engineering/atmos/pumproom) "eKW" = ( /obj/machinery/door/airlock/maintenance{ name = "Bathroom" @@ -14388,9 +14408,7 @@ /area/station/science/xenobiology) "fxp" = ( /obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/orange{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "fxF" = ( @@ -16494,6 +16512,10 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"ggr" = ( +/obj/item/pickaxe, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "ggw" = ( /obj/effect/turf_decal/stripes/white/end{ dir = 1 @@ -18856,7 +18878,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) +/area/station/maintenance/department/engine/atmos) "gUV" = ( /obj/structure/cable, /obj/structure/chair/stool/directional/south{ @@ -19680,7 +19702,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) +/area/station/maintenance/department/engine/atmos) "hhL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20161,8 +20183,8 @@ }, /area/station/science/lobby) "hqH" = ( -/obj/structure/reagent_dispensers/watertank, /obj/item/reagent_containers/cup/watering_can/wood, +/obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "hqM" = ( @@ -21074,6 +21096,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) +"hGa" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics Tank - Mix" + }, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) "hGb" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/storage) @@ -21883,7 +21911,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /turf/open/floor/iron, /area/station/engineering/atmos) "hWk" = ( @@ -23320,7 +23348,7 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /turf/open/floor/iron, /area/station/engineering/atmos) "itw" = ( @@ -25638,13 +25666,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"jbE" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "jbV" = ( /obj/machinery/photocopier, /turf/open/floor/iron/dark, @@ -26699,6 +26720,17 @@ /obj/structure/cable, /turf/open/floor/iron/dark/small, /area/station/command/heads_quarters/captain/private) +"jvm" = ( +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "jvB" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -27836,7 +27868,7 @@ /obj/machinery/atmospherics/components/binary/pump/off{ name = "O2 To Pure" }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green{ +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, /turf/open/floor/iron, @@ -30992,9 +31024,6 @@ /area/station/maintenance/starboard/fore) "kNv" = ( /obj/machinery/air_sensor/mix_tank, -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics Tank - Mix" - }, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) "kNx" = ( @@ -32189,6 +32218,10 @@ /obj/item/camera, /turf/open/floor/iron, /area/station/security/prison/workout) +"lhd" = ( +/obj/structure/water_source/puddle, +/turf/open/floor/grass, +/area/station/security/prison/garden) "lhi" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/button/door/directional/north{ @@ -33242,9 +33275,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"lwK" = ( -/turf/closed/wall/r_wall/rust, -/area/station/engineering/atmos/storage) "lwO" = ( /obj/machinery/door/airlock/highsecurity{ name = "Engine Room" @@ -33927,7 +33957,6 @@ "lGO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sink/directional/west, /turf/open/floor/iron, /area/station/security/prison/garden) "lGT" = ( @@ -36656,13 +36685,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"mDb" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) "mDf" = ( /obj/structure/chair/wood{ dir = 8 @@ -37292,10 +37314,6 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"mMF" = ( -/obj/structure/sign/warning/pods/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) "mMN" = ( /obj/structure/chair/office{ dir = 8 @@ -38050,6 +38068,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"nbN" = ( +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "ncb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood, @@ -39965,9 +39987,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/simple/orange{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "nKj" = ( @@ -40919,6 +40939,7 @@ }, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) "odh" = ( @@ -43441,6 +43462,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"oYf" = ( +/obj/machinery/button/ignition/incinerator/atmos, +/turf/closed/wall/r_wall, +/area/station/maintenance/disposal/incinerator) "oYi" = ( /obj/effect/turf_decal/trimline/neutral/line, /obj/effect/turf_decal/trimline/neutral/line{ @@ -44352,6 +44377,7 @@ /area/station/service/chapel) "pnO" = ( /obj/structure/cable, +/obj/machinery/airalarm/directional/south, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "pnQ" = ( @@ -44578,6 +44604,10 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"prd" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/supermatter/room) "prf" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -46983,7 +47013,7 @@ dir = 1; name = "CO2 to Pure" }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green{ +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, /turf/open/floor/iron, @@ -50682,6 +50712,7 @@ name = "Engine Airlock" }, /obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "ruS" = ( @@ -53461,7 +53492,7 @@ /area/station/maintenance/port/greater) "srw" = ( /turf/closed/wall/r_wall/rust, -/area/station/engineering/atmospherics_engine) +/area/station/maintenance/department/electrical) "srx" = ( /obj/machinery/power/port_gen/pacman, /obj/effect/turf_decal/bot{ @@ -54428,6 +54459,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) +"sJf" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/greater) "sJg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/door/airlock/command{ @@ -56532,6 +56567,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/commons/fitness/recreation) +"tqn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "tqo" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -58694,6 +58735,9 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"uct" = ( +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) "ucy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/red{ @@ -60115,19 +60159,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood/tile, /area/station/command/bridge) -"uAM" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/closet/firecloset, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "uAY" = ( /turf/open/floor/plating, /area/station/maintenance/department/bridge) @@ -61735,10 +61766,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"vcm" = ( -/obj/item/pickaxe, -/turf/open/misc/asteroid, -/area/station/maintenance/department/electrical) "vcB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63920,7 +63947,7 @@ /obj/machinery/door/airlock/engineering{ name = "Engineering Office" }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron/smooth_half{ dir = 8 }, @@ -65454,14 +65481,6 @@ "wfr" = ( /turf/closed/wall/r_wall, /area/station/medical/pharmacy) -"wfB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) "wfG" = ( /obj/structure/disposalpipe/segment, /obj/machinery/firealarm/directional/west, @@ -67711,10 +67730,10 @@ /obj/machinery/atmospherics/components/binary/pump/on{ name = "O2 to Airmix" }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green{ +/obj/machinery/light/no_nightlight/directional/north, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, -/obj/machinery/light/no_nightlight/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos) "wPP" = ( @@ -70298,6 +70317,10 @@ heat_proof = 1; name = "Supermatter Chamber" }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /turf/open/floor/engine, /area/station/engineering/supermatter) "xAA" = ( @@ -72322,7 +72345,7 @@ /area/station/hallway/primary/starboard) "yei" = ( /obj/machinery/door/airlock/maintenance{ - name = "Transit Tube Station" + name = "Atmospherics Maintenance" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -81899,7 +81922,7 @@ wBo sRf wBo hFO -wBo +oYf mPB wWm nlR @@ -83992,7 +84015,7 @@ kjW fcE ceN cDV -kUN +bNq ybs knv knv @@ -84218,8 +84241,8 @@ wzv wzv fjh dfd -ybO -jbE +pnl +ooo ukP ooo jZl @@ -84230,7 +84253,7 @@ wmq vMI pKW kiP -wmq +tqn dYv jZl feu @@ -84249,7 +84272,7 @@ tKn eWr xcW prP -kUN +bNq ybs knv aJq @@ -84475,7 +84498,7 @@ wzv wzv fjh wzv -ybO +pnl dpH kNv gAy @@ -84506,7 +84529,7 @@ hBi bzF gzM svd -kUN +bNq liX jqd lxP @@ -84732,10 +84755,10 @@ pWm pWm uEH dfd -ybO -ybO -ybO -ybO +pnl +uct +uct +uct jZl bEG rCk @@ -84763,7 +84786,7 @@ isC bPd vDG rry -kUN +bNq olj cmf gBh @@ -84988,11 +85011,11 @@ wzv wzv wzv yil -yil -wfB -kNn -yil -kNn +wzv +pnl +uct +hGa +uct jZl oqq tmK @@ -85020,7 +85043,7 @@ uqg cjS gqS kmL -eKU +ecq olj gBh gBh @@ -85241,15 +85264,15 @@ dDB aWx tdY qcF -wzv +kNn yil xnL yil -pWm -pWm -pWm -mMF -mDb +bXb +pnl +pnl +pnl +pnl srw tXF qaU @@ -85277,7 +85300,7 @@ hMQ tNm nWa iua -kUN +bNq bJK dez gBh @@ -85498,13 +85521,13 @@ pWm pWm pWm pWm -pWm rjo pWm pWm pWm -bvt -bvt +bXb +bXb +bXb bXb yil fTJ @@ -85534,7 +85557,7 @@ kti iwR oQK dFG -kUN +bNq cvJ olj knv @@ -85753,18 +85776,18 @@ dDB dDB tYT aJq -aJq -pWm +gcs ako mmT vtJ acg pWm -bvt -bvt -vcm +efn +wzv +wzv +wzv oii -jZl +pnl sZP wvZ mDS @@ -85791,7 +85814,7 @@ lkN rjw vSt kOH -kUN +bNq cvJ aIk knv @@ -86010,8 +86033,7 @@ dDB dDB tYT aJq -aJq -pWm +gcs arN wOz viE @@ -86019,9 +86041,10 @@ bOa pWm bvt bvt -bvt +nbN +ggr oii -jZl +pnl gmv jrD jrD @@ -86048,7 +86071,7 @@ vuV xLS lfq cHt -kUN +bNq xxt liX knv @@ -86198,7 +86221,7 @@ xjz xjz xjz xjz -dDB +xjz dDB blb blb @@ -86267,8 +86290,7 @@ dDB dDB tYT aJq -aJq -pWm +gcs pWm hDg qMG @@ -86277,17 +86299,18 @@ bvt bvt bvt bvt +bvt yil -jZl +pnl wFZ oLc jDi jDi jDi -jZl +pnl srw -jZl -jZl +pnl +pnl jZl xck cag @@ -86295,17 +86318,17 @@ xck bJH xck cGV -cGV -cGV -lwK -cGV -kUN +bNq +bNq +ecq +bNq +bNq hhr -kUN +bNq gUQ -kUN -kUN -kUN +bNq +bNq +bNq knv tZE knv @@ -86454,7 +86477,7 @@ hJC aHJ wmy tBm -xjz +tBm xjz blb blb @@ -86526,22 +86549,22 @@ dDB tYT aJq bvt -bvt fiw oIf pWm bvt bvt bvt +bvt pWm oii -jZl +pnl jDi jDi jDi jDi jDi -jZl +pnl oCE oCE lYH @@ -86711,7 +86734,7 @@ aWt sis sis sis -tBm +lhd xjz blb dDB @@ -86792,13 +86815,13 @@ bvt bvt pWm yil -jZl +pnl urP kLr wkj tuu kHd -jZl +pnl oCE pWm pWm @@ -87050,11 +87073,11 @@ bvt pWm qjp kNn -jZl -jZl -jZl +pnl +pnl +pnl srw -jZl +pnl tOc oCE pWm @@ -90393,7 +90416,7 @@ szg tpW pUM kMe -kMe +prd fGf ayK izf @@ -91670,7 +91693,7 @@ cBd cBd dyI ozQ -xAx +jvm brA dyI oer @@ -92701,7 +92724,7 @@ buI kjs xUK vni -uAM +nHH lHd nHH xTr @@ -129058,7 +129081,7 @@ ylD hqH vzv brz -cgM +sJf ylD wyj dYR diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 07982e7dabcee..8959abab5589d 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -10390,14 +10390,12 @@ /area/station/command/corporate_showroom) "czg" = ( /obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, /obj/item/plant_analyzer, /obj/machinery/camera/directional/east{ c_tag = "Permabrig - Garden"; network = list("ss13","prison") }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "czi" = ( /obj/effect/decal/cleanable/dirt, @@ -19613,10 +19611,8 @@ /area/station/engineering/atmos) "eQx" = ( /obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, /obj/item/shovel/spade, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "eQB" = ( /obj/machinery/door/airlock/public/glass{ @@ -27561,10 +27557,8 @@ "gLT" = ( /obj/machinery/hydroponics/soil, /obj/item/cultivator, -/obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/electric_shock/directional/west, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "gMd" = ( /obj/structure/window/reinforced/spawner/directional/west, @@ -30877,23 +30871,10 @@ /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "hHi" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/paper/guides/jobs/hydroponics, -/obj/item/seeds/onion, -/obj/item/seeds/garlic, -/obj/item/seeds/potato, -/obj/item/seeds/tomato, -/obj/item/seeds/carrot, -/obj/item/seeds/grass, -/obj/item/seeds/ambrosia, -/obj/item/seeds/wheat, -/obj/item/seeds/pumpkin, -/obj/effect/spawner/random/contraband/prison, /obj/structure/window/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/item/seeds/tower, /obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, +/obj/structure/water_source/puddle, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "hHo" = ( /obj/structure/disposalpipe/trunk, @@ -59532,13 +59513,23 @@ /area/station/service/chapel) "oWp" = ( /obj/structure/window/spawner/directional/south, -/obj/structure/sink/directional/south, -/obj/structure/reagent_dispensers/watertank, -/obj/item/reagent_containers/cup/watering_can, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/closet/crate/hydroponics, +/obj/item/seeds/tower, +/obj/effect/spawner/random/contraband/prison, +/obj/item/seeds/pumpkin, +/obj/item/seeds/wheat, +/obj/item/seeds/ambrosia, +/obj/item/seeds/grass, +/obj/item/seeds/carrot, +/obj/item/seeds/tomato, +/obj/item/seeds/potato, +/obj/item/seeds/garlic, +/obj/item/seeds/onion, +/obj/item/paper/guides/jobs/hydroponics, /turf/open/floor/iron, /area/station/security/prison/garden) "oWt" = ( @@ -78609,11 +78600,9 @@ /area/station/command/corporate_showroom) "tGW" = ( /obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/east, -/obj/effect/mapping_helpers/burnt_floor, /obj/machinery/light/small/directional/east, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "tHc" = ( /obj/structure/table/wood/fancy, @@ -79874,10 +79863,8 @@ dir = 1 }, /obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, +/obj/structure/water_source/puddle, +/turf/open/misc/sandy_dirt, /area/station/service/hydroponics/garden) "tXe" = ( /obj/effect/turf_decal/loading_area/red{ @@ -84678,6 +84665,7 @@ /obj/machinery/hydroponics/constructable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/green, +/obj/item/reagent_containers/cup/watering_can, /turf/open/floor/iron, /area/station/security/prison/garden) "veD" = ( @@ -90301,10 +90289,8 @@ "wAt" = ( /obj/machinery/hydroponics/soil, /obj/item/cultivator, -/obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "wAz" = ( /obj/structure/table/wood, @@ -91828,11 +91814,9 @@ /area/space) "wVy" = ( /obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, -/obj/effect/mapping_helpers/burnt_floor, /obj/structure/sign/poster/contraband/ambrosia_vulgaris/directional/west, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "wVJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 3737277c465ff..b88647d4934a0 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -9036,6 +9036,9 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) "cBG" = ( @@ -24772,10 +24775,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"hto" = ( -/obj/structure/girder, -/turf/closed/wall, -/area/station/maintenance/starboard/aft) "htp" = ( /obj/machinery/door/poddoor/preopen{ id = "xenobio2"; @@ -43794,6 +43793,7 @@ /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, /obj/item/radio/intercom/directional/west, +/obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, /area/station/service/hydroponics/garden) "nhT" = ( @@ -49552,6 +49552,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/aft/lesser) +"oNW" = ( +/obj/structure/water_source/puddle, +/turf/open/floor/grass, +/area/station/security/prison/garden) "oNX" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, @@ -52423,6 +52427,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) "pGJ" = ( @@ -54284,10 +54291,10 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/qm) "qiT" = ( -/obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 4 }, +/obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) "qjb" = ( @@ -73913,7 +73920,6 @@ /turf/open/floor/iron/large, /area/station/command/heads_quarters/ce) "wcz" = ( -/obj/structure/sink/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 1 @@ -77700,15 +77706,12 @@ /turf/open/floor/carpet/blue, /area/station/hallway/secondary/entry) "xhg" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, /obj/machinery/camera/directional/east{ c_tag = "Garden" }, -/obj/item/kirbyplants/random, /obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron/dark, +/obj/structure/water_source/puddle, +/turf/open/floor/grass, /area/station/service/hydroponics/garden) "xhk" = ( /turf/open/floor/iron/dark, @@ -167765,7 +167768,7 @@ jlF jNf dpC cGQ -whr +oNW nmr hVY gjq @@ -168280,7 +168283,7 @@ jNf qIo tau dWK -ozX +whr hVY gjq gjq @@ -259618,7 +259621,7 @@ lXi vzD vzD vzD -hto +vzD jOj vzD daT diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index efec99c47fc04..a719ae4c67114 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -15537,13 +15537,10 @@ /turf/open/floor/plating/airless, /area/station/solars/port/fore) "fzr" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line, -/obj/effect/spawner/random/food_or_drink/seed{ - spawn_all_loot = 1; - spawn_random_offset = 1 - }, -/turf/open/floor/iron, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/west, +/obj/structure/water_source/puddle, +/turf/open/floor/grass, /area/station/service/hydroponics/garden) "fzE" = ( /obj/structure/sign/warning/vacuum/external/directional/north, @@ -38988,6 +38985,7 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/garden) "nNw" = ( @@ -39526,6 +39524,10 @@ /obj/structure/table, /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/turf_decal/stripes/line, +/obj/effect/spawner/random/food_or_drink/seed{ + spawn_all_loot = 1; + spawn_random_offset = 1 + }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) "nYU" = ( @@ -40407,7 +40409,6 @@ /obj/machinery/hydroponics/soil, /obj/item/cultivator, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /turf/open/floor/grass, /area/station/security/prison/garden) "opG" = ( @@ -50757,8 +50758,6 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "rVb" = ( -/obj/structure/sink/directional/west, -/obj/item/reagent_containers/cup/watering_can, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 }, @@ -51191,7 +51190,6 @@ "sbX" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /obj/item/plant_analyzer, /turf/open/floor/grass, /area/station/security/prison/garden) @@ -55372,6 +55370,7 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/garden) "tCF" = ( @@ -63868,6 +63867,12 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"wsG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/water_source/puddle, +/obj/item/reagent_containers/cup/watering_can, +/turf/open/floor/grass, +/area/station/security/prison/garden) "wsI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -65136,7 +65141,6 @@ /turf/open/floor/iron/white, /area/station/science/robotics/lab) "wRF" = ( -/obj/structure/window/spawner/directional/west, /obj/structure/flora/rock/pile, /turf/open/floor/grass, /area/station/service/hydroponics/garden) @@ -87401,7 +87405,7 @@ aaa lMJ aaa aaa -aaa +cmB cmB cmB cmB @@ -87659,7 +87663,7 @@ lMJ aaa aaa cmB -cmB +wsG opF sbX jTi diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 4e9080ef499bd..b4168c7d54d93 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -18356,6 +18356,18 @@ /obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"eJy" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/security/prison/garden) "eJF" = ( /obj/machinery/airalarm/directional/south, /obj/item/kirbyplants/random, @@ -54107,7 +54119,9 @@ /area/station/maintenance/floor1/starboard) "nSz" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sink/kitchen/directional/south, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, /turf/open/floor/iron/dark/side{ dir = 5 }, @@ -59391,6 +59405,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/aft) +"ppf" = ( +/obj/effect/turf_decal/weather/sand/light, +/turf/closed/wall/r_wall, +/area/station/security/execution/education) "ppi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -64263,15 +64281,9 @@ /turf/open/floor/iron/dark, /area/station/command/teleporter) "qzQ" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 8 - }, -/obj/item/reagent_containers/cup/watering_can, -/obj/effect/turf_decal/tile/dark_blue, /obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, +/obj/structure/water_source/puddle, +/turf/open/misc/dirt/jungle, /area/station/security/prison/garden) "qzX" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -68264,6 +68276,7 @@ /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/item/reagent_containers/cup/watering_can, /turf/open/floor/iron/dark/corner{ dir = 4 }, @@ -329837,7 +329850,7 @@ oyh oyh oyh fkA -fkA +ppf wmD fkA kUZ @@ -331381,7 +331394,7 @@ oyh wMF wMF qzQ -pfL +eJy pfL pfL yfr diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index b4d767bd2ddb8..469e5ec80fb3d 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -8387,6 +8387,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/engineering/atmos) +"bRl" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/asteroid, +/area/station/security/prison/workout) "bRE" = ( /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, @@ -10804,14 +10808,13 @@ /turf/open/floor/iron, /area/station/security/brig) "cGm" = ( -/obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/watertank, /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/trimline/neutral/line, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/turf/open/floor/iron, +/obj/structure/water_source/puddle, +/turf/open/floor/grass, /area/station/service/hydroponics/garden) "cGy" = ( /obj/structure/chair/stool/directional/north, @@ -46719,7 +46722,6 @@ /area/station/hallway/secondary/exit) "pzw" = ( /obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/watertank, /obj/machinery/power/apc/auto_name/directional/east, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -47444,10 +47446,10 @@ /turf/open/floor/iron/white, /area/station/science/lower) "pMz" = ( -/obj/structure/table/glass, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 }, +/obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, /area/station/service/hydroponics/garden) "pMG" = ( @@ -88126,7 +88128,7 @@ abM aal lPV kPC -lFk +bRl lFk lFk mAB diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 5673421142ac1..fa4ea9e4b3263 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -10268,16 +10268,28 @@ /area/station/service/theater) "dGs" = ( /obj/structure/table/reinforced, -/obj/item/storage/pill_bottle/epinephrine, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 12 - }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ dir = 4 }, +/obj/item/hand_labeler{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/storage/pill_bottle/epinephrine{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 14; + pixel_x = 3 + }, +/obj/item/hand_labeler_refill{ + pixel_x = 10; + pixel_y = -2 + }, /turf/open/floor/iron/white/smooth_edge{ dir = 4 }, @@ -17276,6 +17288,7 @@ /area/station/science/research) "ggl" = ( /obj/machinery/camera/autoname/directional/west, +/obj/structure/water_source/puddle, /turf/open/floor/grass, /area/station/service/hydroponics/garden) "ggu" = ( @@ -39047,6 +39060,10 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron, /area/station/command/bridge) +"nPw" = ( +/obj/structure/water_source/puddle, +/turf/open/floor/grass, +/area/station/security/prison/garden) "nPM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -82449,7 +82466,7 @@ iUF dUc xrb xrb -dEG +nPw dEG iqf cKn diff --git a/_maps/virtual_domains/clown_planet.dmm b/_maps/virtual_domains/clown_planet.dmm index 1973dacfb889b..37e00bd45fcbf 100644 --- a/_maps/virtual_domains/clown_planet.dmm +++ b/_maps/virtual_domains/clown_planet.dmm @@ -759,7 +759,9 @@ /turf/open/indestructible/white, /area/lavaland/surface/outdoors/virtual_domain) "WT" = ( -/obj/machinery/door/airlock/bananium, +/obj/machinery/door/airlock/bananium{ + use_power = 0 + }, /turf/open/floor/carpet, /area/lavaland/surface/outdoors/virtual_domain) "WX" = ( diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index bf1f4a354bd4d..cbc17654078bf 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -11,6 +11,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define DF_USE_TAG (1<<0) #define DF_VAR_EDITED (1<<1) #define DF_ISPROCESSING (1<<2) +/// Placed on datums that have a static, constant reference. Primarily only used for turfs. +#define DF_STATIC_OBJECT (1<<3) //FLAGS BITMASK // scroll down before changing the numbers on these diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index 97ec38c1c3c05..4374288b07c5b 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -24,6 +24,8 @@ ///the list of interactions we can have with the owner #define BB_INTERACTIONS_WITH_OWNER "BB_interactions_with_owner" +///The trait checked by ai_behavior/find_potential_targets/prioritize_trait to return a target with a trait over the rest. +#define BB_TARGET_PRIORITY_TRAIT "target_priority_trait" /// Store a single or list of emotes at this key #define BB_EMOTE_KEY "BB_emotes" diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm index 76fd6c798d53e..fb6952eb08491 100644 --- a/code/__DEFINES/ai/monsters.dm +++ b/code/__DEFINES/ai/monsters.dm @@ -70,8 +70,12 @@ #define BB_LOBSTROSITY_TARGET_LIMB "BB_lobstrosity_target_limb" /// We increment this counter every time we try to move while dragging an arm and if we go too long we'll give up trying to get out of line of sight and just eat the fingers #define BB_LOBSTROSITY_FINGER_LUST "BB_lobstrosity_finger_lust" +/// Does this carp still target lying mobs even if they aren't stunned, and flee from sary fishermen? #define BB_LOBSTROSITY_NAIVE_HUNTER "BB_lobstrosity_naive_hunter" +/// Does this carp run from scary fishermen? +#define BB_CARPS_FEAR_FISHERMAN "BB_carp_fear_fisherman" + // eyeball keys ///the death glare ability #define BB_GLARE_ABILITY "BB_glare_ability" diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm index ae74872cd7302..e519fb25240be 100644 --- a/code/__DEFINES/basic_mobs.dm +++ b/code/__DEFINES/basic_mobs.dm @@ -70,5 +70,3 @@ GLOBAL_VAR_INIT(gutlunch_count, 0) #define BB_RAPTOR_TROUGH_TARGET "raptor_trough_target" #define MAX_RAPTOR_POP 64 - - diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index 8f7483d94164a..2fbf99446ab94 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -46,3 +46,9 @@ /// From /obj/item/fish_analyzer/proc/analyze_status: (fish, user) #define COMSIG_FISH_ANALYZER_ANALYZE_STATUS "fish_analyzer_analyze_status" + +/// From /datum/component/fish_growth/on_fish_life: (seconds_per_tick) +#define COMSIG_FISH_BEFORE_GROWING "fish_before_growing" + #define COMPONENT_DONT_GROW (1 << 0) +/// From /datum/component/fish_growth/finish_growing: (result) +#define COMSIG_FISH_FINISH_GROWING "fish_finish_growing" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index f915b0f66a7c5..63054e533b1bf 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -106,6 +106,8 @@ DEFINE_BITFIELD(no_equip_flags, list( #define HIDESNOUT (1<<12) ///hides mutant/moth wings, does not apply to functional wings #define HIDEMUTWINGS (1<<13) +///hides belts and riggings +#define HIDEBELT (1<<14) //bitflags for clothing coverage - also used for limbs #define HEAD (1<<0) diff --git a/code/__DEFINES/mining.dm b/code/__DEFINES/mining.dm index 5b612b4b7bcac..d0fa97062b1a2 100644 --- a/code/__DEFINES/mining.dm +++ b/code/__DEFINES/mining.dm @@ -9,6 +9,7 @@ #define MAX_BOULDERS_PER_VENT 10 /// Time multiplier #define INATE_BOULDER_SPEED_MULTIPLIER 3 + // Vent type /// Large vents, giving large boulders. #define LARGE_VENT_TYPE "large" @@ -17,6 +18,14 @@ /// Small vents, giving small boulders. #define SMALL_VENT_TYPE "small" +// Timers for the ore vents to perform wave defense. +/// Duration for wave defense for a small vent. +#define WAVE_DURATION_SMALL 60 SECONDS +/// Duration for wave defense for a medium vent. +#define WAVE_DURATION_MEDIUM 90 SECONDS +/// Duration for wave defense for a large vent. +#define WAVE_DURATION_LARGE 150 SECONDS + /// Proximity to a vent that a wall ore needs to be for 5 ore to be mined. #define VENT_PROX_VERY_HIGH 3 /// Proximity to a vent that a wall ore needs to be for 4 ore to be mined. diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 3a47fe1ca0ae1..294d32ddc3b0f 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -225,6 +225,8 @@ 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" +///lobstrosities and carps will prioritize/flee from those that have this trait (given by the skill-locked hat) +#define TRAIT_SCARY_FISHERMAN "scary_fisherman" ///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 @@ -1125,6 +1127,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Trait given to limb by /mob/living/basic/living_limb_flesh #define TRAIT_IGNORED_BY_LIVING_FLESH "livingflesh_ignored" +///Trait given to organs that have been inside a living being previously +#define TRAIT_USED_ORGAN "used_organ" + /// Trait given while using /datum/action/cooldown/mob_cooldown/wing_buffet #define TRAIT_WING_BUFFET "wing_buffet" /// Trait given while tired after using /datum/action/cooldown/mob_cooldown/wing_buffet diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm index 67df6fc0e6295..929b558dfec47 100644 --- a/code/__DEFINES/uplink.dm +++ b/code/__DEFINES/uplink.dm @@ -36,9 +36,12 @@ /// Typepath used for uplink items which don't actually produce an item (essentially just a placeholder) /// Future todo: Make this not necessary / make uplink items support item-less items natively -#define ABSTRACT_UPLINK_ITEM /obj/effect/gibspawner/generic +#define ABSTRACT_UPLINK_ITEM /obj/item/loot_table_maker /// Lower threshold for which an uplink items's TC cost is considered "low" for spy bounties picking rewards #define SPY_LOWER_COST_THRESHOLD 5 /// Upper threshold for which an uplink items's TC cost is considered "high" for spy bounties picking rewards #define SPY_UPPER_COST_THRESHOLD 12 + +/// Minimal cost for an item to be eligible for a discount +#define TRAITOR_DISCOUNT_MIN_PRICE 4 diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index aa953760bce71..ce48e593980b5 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -214,16 +214,16 @@ if(istype(atom_to_find, type)) return atom_to_find - while(!istype(atom_to_find.loc, type)) + while(!istype(atom_to_find, type)) if(!atom_to_find.loc) return atom_to_find = atom_to_find.loc else if(isatom(type)) atom_to_find = target - if(atom_to_find.loc == type) + if(atom_to_find == type) return atom_to_find - while(atom_to_find.loc != type) + while(atom_to_find != type) if(!atom_to_find.loc) return atom_to_find = atom_to_find.loc diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 50f7cded126ee..2d30334ff518d 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -121,7 +121,7 @@ if(isnull(user_input)) // User pressed cancel return if(no_trim) - return copytext(html_encode(user_input), 1, max_length) + return copytext_char(html_encode(user_input), 1, max_length) else return trim(html_encode(user_input), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <) @@ -140,7 +140,7 @@ if(isnull(user_input)) // User pressed cancel return if(no_trim) - return copytext(html_encode(user_input), 1, max_length) + return copytext_char(html_encode(user_input), 1, max_length) else return trim(html_encode(user_input), max_length) @@ -368,7 +368,7 @@ */ /proc/truncate(text, max_length) if(length(text) > max_length) - return copytext(text, 1, max_length) + return copytext_char(text, 1, max_length) return text //Returns a string with reserved characters and spaces before the first word and after the last word removed. diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 4c1518252e3a5..27c0d27ec2e92 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -200,6 +200,7 @@ DEFINE_BITFIELD(flags_inv, list( "HIDEHEADGEAR" = HIDEHEADGEAR, "HIDEJUMPSUIT" = HIDEJUMPSUIT, "HIDEMASK" = HIDEMASK, + "HIDEBELT" = HIDEBELT, "HIDENECK" = HIDENECK, "HIDESHOES" = HIDESHOES, "HIDESNOUT" = HIDESNOUT, diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 3c831c4a68140..dcda2365c4b0f 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -60,6 +60,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT" = TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT, "TRAIT_ON_HIT_EFFECT" = TRAIT_ON_HIT_EFFECT, "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, + "TRAIT_SCARY_FISHERMAN" = TRAIT_SCARY_FISHERMAN, "TRAIT_SECLUDED_LOCATION" = TRAIT_SECLUDED_LOCATION, "TRAIT_SNOWSTORM_IMMUNE" = TRAIT_SNOWSTORM_IMMUNE, "TRAIT_TELEKINESIS_CONTROLLED" = TRAIT_TELEKINESIS_CONTROLLED, @@ -212,7 +213,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ECHOLOCATION_RECEIVER" = TRAIT_ECHOLOCATION_RECEIVER, "TRAIT_ELDRITCH_PAINTING_EXAMINE" = TRAIT_ELDRITCH_PAINTING_EXAMINE, "TRAIT_ELITE_CHALLENGER" = TRAIT_ELITE_CHALLENGER, - "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, "TRAIT_EMPATH" = TRAIT_EMPATH, "TRAIT_ENTRAILS_READER" = TRAIT_ENTRAILS_READER, @@ -611,6 +611,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( ), /obj/item/organ = list( "TRAIT_LIVING_HEART" = TRAIT_LIVING_HEART, + "TRAIT_USED_ORGAN" = TRAIT_USED_ORGAN, ), /obj/item/organ/internal/liver = list( "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 7ff9dad994ec0..98c3fd6ab1fca 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -18,6 +18,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_MOVE_VENTCRAWLING" = TRAIT_MOVE_VENTCRAWLING, "TRAIT_MOVE_UPSIDE_DOWN" = TRAIT_MOVE_UPSIDE_DOWN, "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, + "TRAIT_SCARY_FISHERMAN" = TRAIT_SCARY_FISHERMAN, "TRAIT_SNOWSTORM_IMMUNE" = TRAIT_SNOWSTORM_IMMUNE, "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, @@ -29,14 +30,21 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_AGENDER" = TRAIT_AGENDER, "TRAIT_AGEUSIA" = TRAIT_AGEUSIA, "TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE, + "TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING, + "TRAIT_ALWAYS_NO_ACCESS" = TRAIT_ALWAYS_NO_ACCESS, + "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, "TRAIT_ANOSMIA" = TRAIT_ANOSMIA, + "TRAIT_ANTENNAE" = TRAIT_ANTENNAE, "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, + "TRAIT_ANTIMAGIC_NO_SELFBLOCK" = TRAIT_ANTIMAGIC_NO_SELFBLOCK, "TRAIT_ANXIOUS" = TRAIT_ANXIOUS, "TRAIT_BADDNA" = TRAIT_BADDNA, "TRAIT_BADTOUCH" = TRAIT_BADTOUCH, "TRAIT_BALD" = TRAIT_BALD, + "TRAIT_BALLOON_SUTRA" = TRAIT_BALLOON_SUTRA, "TRAIT_BATON_RESISTANCE" = TRAIT_BATON_RESISTANCE, "TRAIT_BEAST_EMPATHY" = TRAIT_BEAST_EMPATHY, + "TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY, "TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT, "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, @@ -45,20 +53,27 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, + "TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP, + "TRAIT_CAN_USE_NUKE" = TRAIT_CAN_USE_NUKE, "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, + "TRAIT_CATLIKE_GRACE" = TRAIT_CATLIKE_GRACE, "TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED, "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, + "TRAIT_CLEANBOT_WHISPERER" = TRAIT_CLEANBOT_WHISPERER, + "TRAIT_CLIFF_WALKER" = TRAIT_CLIFF_WALKER, "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, "TRAIT_CLUMSY" = TRAIT_CLUMSY, "TRAIT_COMMISSIONED" = TRAIT_COMMISSIONED, + "TRAIT_CORPSELOCKED" = TRAIT_CORPSELOCKED, "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, "TRAIT_DEAF" = TRAIT_DEAF, "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, + "TRAIT_DETECT_STORM" = TRAIT_DETECT_STORM, "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, "TRAIT_BOT_PATH_HUD" = TRAIT_BOT_PATH_HUD, "TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER, @@ -70,42 +85,59 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_DWARF" = TRAIT_DWARF, "TRAIT_EASILY_WOUNDED" = TRAIT_EASILY_WOUNDED, "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, - "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, + "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, "TRAIT_EMPATH" = TRAIT_EMPATH, + "TRAIT_ENTRAILS_READER" = TRAIT_ENTRAILS_READER, + "TRAIT_EXAMINE_FISHING_SPOT" = TRAIT_EXAMINE_FISHING_SPOT, "TRAIT_EXAMINE_FITNESS" = TRAIT_EXAMINE_FITNESS, "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, "TRAIT_EXPERT_FISHER" = TRAIT_EXPERT_FISHER, + "TRAIT_EXTROVERT" = TRAIT_EXTROVERT, "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, + "TRAIT_FASTMED" = TRAIT_FASTMED, "TRAIT_FAST_CUFFING" = TRAIT_FAST_CUFFING, + "TRAIT_FAST_TYING" = TRAIT_FAST_TYING, "TRAIT_FAT" = TRAIT_FAT, "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, "TRAIT_FIXED_HAIRCOLOR" = TRAIT_FIXED_HAIRCOLOR, "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, + "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, "TRAIT_FLOORED" = TRAIT_FLOORED, + "TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION" = TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION, "TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING, "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, + "TRAIT_FREE_FLOAT_MOVEMENT" = TRAIT_FREE_FLOAT_MOVEMENT, + "TRAIT_FREE_HYPERSPACE_MOVEMENT" = TRAIT_FREE_HYPERSPACE_MOVEMENT, + "TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT" = TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, "TRAIT_GAMER" = TRAIT_GAMER, "TRAIT_GAMERGOD" = TRAIT_GAMERGOD, + "TRAIT_GARLIC_BREATH" = TRAIT_GARLIC_BREATH, "TRAIT_GENELESS" = TRAIT_GENELESS, "TRAIT_GIANT" = TRAIT_GIANT, "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, "TRAIT_GUNFLIP" = TRAIT_GUNFLIP, + "TRAIT_GUN_NATURAL" = TRAIT_GUN_NATURAL, "TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED, "TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED, + "TRAIT_HATED_BY_DOGS" = TRAIT_HATED_BY_DOGS, + "TRAIT_HEAVY_DRINKER" = TRAIT_HEAVY_DRINKER, "TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER, "TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS, + "TRAIT_HIGH_VALUE_RANSOM" = TRAIT_HIGH_VALUE_RANSOM, "TRAIT_HOLY" = TRAIT_HOLY, "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER, "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, + "TRAIT_INTROVERT" = TRAIT_INTROVERT, "TRAIT_INVISIBLE_MAN" = TRAIT_INVISIBLE_MAN, "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, "TRAIT_JOLLY" = TRAIT_JOLLY, @@ -113,23 +145,28 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, + "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, "TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER, "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, + "TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE, "TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED, + "TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE, "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, "TRAIT_MIMING" = TRAIT_MIMING, "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, "TRAIT_MOB_HIDE_HAPPINESS" = TRAIT_MOB_HIDE_HAPPINESS, "TRAIT_MORBID" = TRAIT_MORBID, + "TRAIT_MULTIZ_SUIT_SENSORS" = TRAIT_MULTIZ_SUIT_SENSORS, "TRAIT_MUSICIAN" = TRAIT_MUSICIAN, "TRAIT_MUTANT_COLORS" = TRAIT_MUTANT_COLORS, "TRAIT_MUTE" = TRAIT_MUTE, "TRAIT_NAIVE" = TRAIT_NAIVE, + "TRAIT_NEGATES_GRAVITY" = TRAIT_NEGATES_GRAVITY, "TRAIT_NEVER_WOUNDED" = TRAIT_NEVER_WOUNDED, "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT, "TRAIT_NIGHT_VISION" = TRAIT_NIGHT_VISION, @@ -138,13 +175,18 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_NO_DNA_COPY" = TRAIT_NO_DNA_COPY, "TRAIT_NO_EXTINGUISH" = TRAIT_NO_EXTINGUISH, "TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE, + "TRAIT_NO_GUN_AKIMBO" = TRAIT_NO_GUN_AKIMBO, + "TRAIT_NO_MINDSWAP" = TRAIT_NO_MINDSWAP, + "TRAIT_NO_MIRROR_REFLECTION" = TRAIT_NO_MIRROR_REFLECTION, "TRAIT_NO_PLASMA_TRANSFORM" = TRAIT_NO_PLASMA_TRANSFORM, "TRAIT_NO_SLIP_ALL" = TRAIT_NO_SLIP_ALL, "TRAIT_NO_SLIP_ICE" = TRAIT_NO_SLIP_ICE, "TRAIT_NO_SLIP_SLIDE" = TRAIT_NO_SLIP_SLIDE, "TRAIT_NO_SLIP_WATER" = TRAIT_NO_SLIP_WATER, "TRAIT_NO_SOUL" = TRAIT_NO_SOUL, + "TRAIT_NO_STAGGER" = TRAIT_NO_STAGGER, "TRAIT_NO_TRANSFORM" = TRAIT_NO_TRANSFORM, + "TRAIT_NO_TWOHANDING" = TRAIT_NO_TWOHANDING, "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, "TRAIT_NOBLOOD" = TRAIT_NOBLOOD, @@ -153,7 +195,10 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_NOCRITOVERLAY" = TRAIT_NOCRITOVERLAY, "TRAIT_NODEATH" = TRAIT_NODEATH, "TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER, + "TRAIT_NOFAT" = TRAIT_NOFAT, + "TRAIT_NOFEAR_HOLDUPS" = TRAIT_NOFEAR_HOLDUPS, "TRAIT_NOFIRE" = TRAIT_NOFIRE, + "TRAIT_NOFIRE_SPREAD" = TRAIT_NOFIRE_SPREAD, "TRAIT_NOFLASH" = TRAIT_NOFLASH, "TRAIT_NOGUNS" = TRAIT_NOGUNS, "TRAIT_TOSS_GUN_HARD" = TRAIT_TOSS_GUN_HARD, @@ -162,7 +207,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, + "TRAIT_OFF_BALANCE_TACKLER" = TRAIT_OFF_BALANCE_TACKLER, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, + "TRAIT_OVERDOSEIMMUNE" = TRAIT_OVERDOSEIMMUNE, "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_PACIFISM" = TRAIT_PACIFISM, "TRAIT_HIPPOCRATIC_OATH" = TRAIT_HIPPOCRATIC_OATH, @@ -174,6 +221,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, "TRAIT_PASSWINDOW" = TRAIT_PASSWINDOW, "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, + "TRAIT_PERMANENTLY_MORTAL" = TRAIT_PERMANENTLY_MORTAL, "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE, "TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE, @@ -184,16 +232,22 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, "TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED, "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, + "TRAIT_QUICK_BUILD" = TRAIT_QUICK_BUILD, "TRAIT_QUICK_CARRY" = TRAIT_QUICK_CARRY, "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, + "TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING, "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, "TRAIT_RESISTHEATHANDS" = TRAIT_RESISTHEATHANDS, "TRAIT_RESISTHIGHPRESSURE" = TRAIT_RESISTHIGHPRESSURE, "TRAIT_RESISTLOWPRESSURE" = TRAIT_RESISTLOWPRESSURE, "TRAIT_RESTRAINED" = TRAIT_RESTRAINED, + "TRAIT_REVEAL_FISH" = TRAIT_REVEAL_FISH, + "TRAIT_ROCK_STONER" = TRAIT_ROCK_STONER, + "TRAIT_ROD_SUPLEX" = TRAIT_ROD_SUPLEX, "TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER, + "TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO, "TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD, "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, "TRAIT_SETTLER" = TRAIT_SETTLER, @@ -208,23 +262,28 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_SLOW_FLIP" = TRAIT_SLOW_FLIP, "TRAIT_SMOKER" = TRAIT_SMOKER, "TRAIT_SNOB" = TRAIT_SNOB, + "TRAIT_SOFTSPOKEN" = TRAIT_SOFTSPOKEN, "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, "TRAIT_SPACEWALK" = TRAIT_SPACEWALK, "TRAIT_SPECIAL_TRAUMA_BOOST" = TRAIT_SPECIAL_TRAUMA_BOOST, "TRAIT_SPIRITUAL" = TRAIT_SPIRITUAL, "TRAIT_STABLEHEART" = TRAIT_STABLEHEART, "TRAIT_STABLELIVER" = TRAIT_STABLELIVER, + "TRAIT_STRENGTH" = TRAIT_STRENGTH, "TRAIT_STRONG_GRABBER" = TRAIT_STRONG_GRABBER, "TRAIT_STRONG_STOMACH" = TRAIT_STRONG_STOMACH, "TRAIT_STUBBY_BODY" = TRAIT_STUBBY_BODY, "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, "TRAIT_STURDY_FRAME" = TRAIT_STURDY_FRAME, + "TRAIT_SUPERMATTER_SOOTHER" = TRAIT_SUPERMATTER_SOOTHER, "TRAIT_SURGEON" = TRAIT_SURGEON, "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, "TRAIT_TAGGER" = TRAIT_TAGGER, "TRAIT_TENTACLE_IMMUNE" = TRAIT_TENTACLE_IMMUNE, "TRAIT_TESLA_SHOCKIMMUNE" = TRAIT_TESLA_SHOCKIMMUNE, "TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION, + "TRAIT_THROWINGARM" = TRAIT_THROWINGARM, + "TRAIT_TIME_STOP_IMMUNE" = TRAIT_TIME_STOP_IMMUNE, "TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE, "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, "TRAIT_TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, @@ -240,7 +299,10 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, "TRAIT_USED_DNA_VAULT" = TRAIT_USED_DNA_VAULT, "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, + "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, + "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE, "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, + "TRAIT_VIRUS_RESISTANCE" = TRAIT_VIRUS_RESISTANCE, "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, "TRAIT_WOUND_LICKER" = TRAIT_WOUND_LICKER, "TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL, diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index dc425083ad896..3bd370120b3a4 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -317,14 +317,14 @@ GLOBAL_LIST_EMPTY(radial_menus) current_page = WRAP(current_page + 1,1,pages+1) update_screen_objects() -/datum/radial_menu/proc/show_to(mob/M) +/datum/radial_menu/proc/show_to(mob/M, offset_x = 0, offset_y = 0) if(current_user) hide() if(!M.client || !anchor) return current_user = M.client //Blank - menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing", layer = RADIAL_BACKGROUND_LAYER) + menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing", layer = RADIAL_BACKGROUND_LAYER, pixel_x = offset_x, pixel_y = offset_y) SET_PLANE_EXPLICIT(menu_holder, ABOVE_HUD_PLANE, M) menu_holder.appearance_flags |= KEEP_APART|RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM menu_holder.vis_contents += elements + close_button @@ -356,7 +356,7 @@ GLOBAL_LIST_EMPTY(radial_menus) Choices should be a list where list keys are movables or text used for element names and return value and list values are movables/icons/images used for element icons */ -/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE, radial_slice_icon = "radial_slice", autopick_single_option = TRUE, entry_animation = TRUE, click_on_hover = FALSE) +/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE, radial_slice_icon = "radial_slice", autopick_single_option = TRUE, entry_animation = TRUE, click_on_hover = FALSE, user_space = FALSE) if(!user || !anchor || !length(choices)) return @@ -379,11 +379,18 @@ GLOBAL_LIST_EMPTY(radial_menus) menu.radius = radius if(istype(custom_check)) menu.custom_check_callback = custom_check - menu.anchor = anchor + menu.anchor = user_space ? user : anchor menu.radial_slice_icon = radial_slice_icon menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud menu.set_choices(choices, tooltips, click_on_hover) - menu.show_to(user) + var/offset_x = 0 + var/offset_y = 0 + if (user_space) + var/turf/user_turf = get_turf(user) + var/turf/anchor_turf = get_turf(anchor) + offset_x = (anchor_turf.x - user_turf.x) * world.icon_size + anchor.pixel_x - user.pixel_x + offset_y = (anchor_turf.y - user_turf.y) * world.icon_size + anchor.pixel_y - user.pixel_y + menu.show_to(user, offset_x, offset_y) menu.wait(user, anchor, require_near) var/answer = menu.selected_choice qdel(menu) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 315efe4877810..d0f6426254936 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -482,8 +482,26 @@ return TRUE +/atom/movable/screen/storage/cell + +/atom/movable/screen/storage/cell/mouse_drop_receive(atom/target, mob/living/user, params) + var/datum/storage/storage = master_ref?.resolve() + + if (isnull(storage) || !istype(user) || storage != user.active_storage) + return + + if (!user.can_perform_action(storage.parent, FORBID_TELEKINESIS_REACH)) + return + + if (target.loc != storage.real_location) + return + + /// Due to items in storage ignoring transparency for click hitboxes, this only can happen if we drag onto a free cell - aka after all current contents + storage.real_location.contents -= target + storage.real_location.contents += target + storage.refresh_views() + /atom/movable/screen/storage/corner - name = "storage" icon_state = "storage_corner_topleft" /atom/movable/screen/storage/corner/top_right diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm index 4cf04039e8535..7673551a65319 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm @@ -152,3 +152,15 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(/mob, /obj/machinery/ /// Returns the desired final target from the filtered list of targets /datum/ai_behavior/find_potential_targets/proc/pick_final_target(datum/ai_controller/controller, list/filtered_targets) return pick(filtered_targets) + +/// Targets with the trait specified by the BB_TARGET_PRIORITY_TRAIT blackboard key will be prioritized over the rest. +/datum/ai_behavior/find_potential_targets/prioritize_trait + +/datum/ai_behavior/find_potential_targets/prioritize_trait/pick_final_target(datum/ai_controller/controller, list/filtered_targets) + var/priority_targets = list() + for(var/atom/target as anything in filtered_targets) + if(HAS_TRAIT(target, controller.blackboard[BB_TARGET_PRIORITY_TRAIT])) + priority_targets += target + if(length(priority_targets)) + return pick(priority_targets) + return ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_targets_prioritize_traits.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_targets_prioritize_traits.dm new file mode 100644 index 0000000000000..6c83469960ad3 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/find_targets_prioritize_traits.dm @@ -0,0 +1,6 @@ +/// Find something with a specific trait to run from +/datum/ai_planning_subtree/find_target_prioritize_traits + +/datum/ai_planning_subtree/find_target_prioritize_traits/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + controller.queue_behavior(/datum/ai_behavior/find_potential_targets/prioritize_trait, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, BB_TARGET_PRIORITY_TRAIT) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm index 4a2f5b476c759..3ed8b2df2b26d 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm @@ -10,7 +10,7 @@ /datum/ai_planning_subtree/flee_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() var/atom/flee_from = controller.blackboard[target_key] - if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING] || QDELETED(flee_from)) + if(!should_flee(controller, flee_from)) return var/flee_distance = controller.blackboard[BB_BASIC_MOB_FLEE_DISTANCE] || DEFAULT_BASIC_FLEE_DISTANCE if (get_dist(controller.pawn, flee_from) >= flee_distance) @@ -19,8 +19,21 @@ controller.queue_behavior(flee_behaviour, target_key, hiding_place_key) return SUBTREE_RETURN_FINISH_PLANNING //we gotta get out of here. +/datum/ai_planning_subtree/flee_target/proc/should_flee(datum/ai_controller/controller, atom/flee_from) + if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING] || QDELETED(flee_from)) + return FALSE + return TRUE + /// Try to escape from your current target, without performing any other actions. /// Reads from some fleeing-specific targeting keys rather than the current mob target. /datum/ai_planning_subtree/flee_target/from_flee_key target_key = BB_BASIC_MOB_FLEE_TARGET hiding_place_key = BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION + +/// A subtype that forces the mob to flee from targets with the scary fisherman trait anyway. +/datum/ai_planning_subtree/flee_target/from_fisherman + +/datum/ai_planning_subtree/flee_target/from_fisherman/should_flee(datum/ai_controller/controller, atom/flee_from) + if (!QDELETED(flee_from) && HAS_TRAIT(flee_from, TRAIT_SCARY_FISHERMAN)) + return TRUE + return ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm index 5b1f5ffbff9ed..f764568d4ba74 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm @@ -22,3 +22,12 @@ return controller.queue_behavior(ranged_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions. + +/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman + +/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(QDELETED(target)) + return ..() + if(!HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN)) + return ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm index 1c7d8de9120ba..42608730f9891 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm @@ -12,4 +12,3 @@ if(watcher.stat != DEAD) return return ..() - diff --git a/code/datums/components/callouts.dm b/code/datums/components/callouts.dm index 24e7f081fbe78..98d489cc915a9 100644 --- a/code/datums/components/callouts.dm +++ b/code/datums/components/callouts.dm @@ -111,7 +111,7 @@ for(var/datum/callout_option/callout_option as anything in callout_options) callout_items[callout_option] = image(icon = 'icons/hud/radial.dmi', icon_state = callout_option::icon_state) - var/datum/callout_option/selection = show_radial_menu(user, get_turf(clicked_atom), callout_items, entry_animation = FALSE, click_on_hover = TRUE) + var/datum/callout_option/selection = show_radial_menu(user, get_turf(clicked_atom), callout_items, entry_animation = FALSE, click_on_hover = TRUE, user_space = TRUE) if (!selection) return diff --git a/code/datums/components/echolocation.dm b/code/datums/components/echolocation.dm index 020c47ad875e1..51ab89a2be564 100644 --- a/code/datums/components/echolocation.dm +++ b/code/datums/components/echolocation.dm @@ -32,7 +32,7 @@ /// Cooldown for the echolocation. COOLDOWN_DECLARE(cooldown_last) -/datum/component/echolocation/Initialize(echo_range, cooldown_time, image_expiry_time, fade_in_time, fade_out_time, images_are_static, blocking_trait, echo_group, echo_icon = "echo", color_path) +/datum/component/echolocation/Initialize(echo_range, cooldown_time, image_expiry_time, fade_in_time, fade_out_time, images_are_static, blocking_trait, echo_group, echo_icon, color_path) . = ..() var/mob/living/echolocator = parent if(!istype(echolocator)) diff --git a/code/datums/components/fish_growth.dm b/code/datums/components/fish_growth.dm new file mode 100644 index 0000000000000..bc7c8a9869e44 --- /dev/null +++ b/code/datums/components/fish_growth.dm @@ -0,0 +1,57 @@ +///A simple component that manages raising things from aquarium fish. +/datum/component/fish_growth + dupe_mode = COMPONENT_DUPE_SELECTIVE + ///the type of the movable that's spawned when the fish grows up. + var/result_type + ///The progress, from 0 to 100 + var/maturation + ///How much maturation is gained per tick + var/growth_rate + ///Is the result moved on the nearest drop location? + var/use_drop_loc + ///Is the parent deleted once the result is spawned? + var/del_on_grow + +/datum/component/fish_growth/Initialize(result_type, growth_rate, use_drop_loc = TRUE, del_on_grow = TRUE) + . = ..() + if(!isfish(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_FISH_LIFE, PROC_REF(on_fish_life)) + src.result_type = result_type + src.growth_rate = growth_rate + src.use_drop_loc = use_drop_loc + src.del_on_grow = del_on_grow + +/datum/component/fish_growth/CheckDupeComponent(result_type, growth_rate, use_drop_loc = TRUE, del_on_grow = TRUE) + if(result_type == src.result_type) + src.growth_rate = growth_rate + return TRUE //copy the growth rate and kill the new component + return FALSE + +/datum/component/fish_growth/proc/on_fish_life(obj/item/fish/source, seconds_per_tick) + SIGNAL_HANDLER + if(SEND_SIGNAL(source, COMSIG_FISH_BEFORE_GROWING, seconds_per_tick) & COMPONENT_DONT_GROW) + return + maturation += growth_rate * seconds_per_tick + if(maturation >= 100) + finish_growing(source) + +/datum/component/fish_growth/proc/finish_growing(obj/item/fish/source) + var/atom/location = use_drop_loc ? source.drop_location() : source.loc + var/atom/movable/result = new result_type (location) + if(location != source.loc) + result.visible_message(span_boldnotice("\A [result] jumps out of [source.loc]!")) + playsound(result, 'sound/effects/fish_splash.ogg', 60) + if(isbasicmob(result)) + for(var/trait_type in source.fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + trait.apply_to_mob(result) + + addtimer(CALLBACK(result, TYPE_PROC_REF(/mob/living/basic, hop_on_nearby_turf)), 0.1 SECONDS) + + SEND_SIGNAL(source, COMSIG_FISH_FINISH_GROWING, result) + + if(del_on_grow) + qdel(parent) + else + maturation = 0 diff --git a/code/datums/components/heart_eater.dm b/code/datums/components/heart_eater.dm index 5b73c40c9549e..507090b9452b0 100644 --- a/code/datums/components/heart_eater.dm +++ b/code/datums/components/heart_eater.dm @@ -68,6 +68,9 @@ var/obj/item/organ/internal/heart/previous_heart = last_heart_we_ate?.resolve() if(we_ate_heart == previous_heart) return + if (!HAS_TRAIT(we_ate_heart, TRAIT_USED_ORGAN)) + to_chat(eater, span_warning("This heart is utterly lifeless, you won't receive any boons from consuming it!")) + return bites_taken = 0 last_heart_we_ate = WEAKREF(we_ate_heart) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index a5ff46964bf6f..d831ba2f0d964 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -227,9 +227,12 @@ for(var/datum/uplink_item/item as anything in uplink_handler.extra_purchasable) if(item.stock_key in stock_list) extra_purchasable_stock[REF(item)] = stock_list[item.stock_key] + var/atom/actual_item = item.item extra_purchasable += list(list( "id" = item.type, "name" = item.name, + "icon" = actual_item.icon, + "icon_state" = actual_item.icon_state, "cost" = item.cost, "desc" = item.desc, "category" = item.category ? initial(item.category.name) : null, @@ -288,6 +291,11 @@ return item = SStraitor.uplink_items_by_type[item_path] uplink_handler.purchase_item(ui.user, item, parent) + if("buy_raw_tc") + if (uplink_handler.telecrystals <= 0) + return + var/desired_amount = tgui_input_number(ui.user, "How many raw telecrystals to buy?", "Buy Raw TC", default = uplink_handler.telecrystals, max_value = uplink_handler.telecrystals) + uplink_handler.purchase_raw_tc(ui.user, desired_amount, parent) if("lock") if(!lockable) return TRUE diff --git a/code/datums/datum.dm b/code/datums/datum.dm index a79397fe336ba..59a1d54571d3c 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -111,8 +111,9 @@ tag = null datum_flags &= ~DF_USE_TAG //In case something tries to REF us weak_reference = null //ensure prompt GCing of weakref. - DREAMLUAU_CLEAR_REF_USERDATA(vars) // vars ceases existing when src does, so we need to clear any lua refs to it that exist. - DREAMLUAU_CLEAR_REF_USERDATA(src) + if(!(datum_flags & DF_STATIC_OBJECT)) + DREAMLUAU_CLEAR_REF_USERDATA(vars) // vars ceases existing when src does, so we need to clear any lua refs to it that exist. + DREAMLUAU_CLEAR_REF_USERDATA(src) if(_active_timers) var/list/timers = _active_timers diff --git a/code/datums/greyscale/json_configs/meter.json b/code/datums/greyscale/json_configs/meter.json index 73cfb73995955..344500c2a9dcc 100644 --- a/code/datums/greyscale/json_configs/meter.json +++ b/code/datums/greyscale/json_configs/meter.json @@ -2,26 +2,26 @@ "meter": [ { "type": "icon_state", - "icon_state": "pressure_off", + "icon_state": "meter_base", "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", + "icon_state": "pressure_off", "blend_mode": "overlay" } ], "meter0": [ { "type": "icon_state", - "icon_state": "pressure0", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure0", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -32,14 +32,14 @@ "meter1_1": [ { "type": "icon_state", - "icon_state": "pressure1_1", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -50,14 +50,14 @@ "meter1_2": [ { "type": "icon_state", - "icon_state": "pressure1_2", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_2", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -68,14 +68,14 @@ "meter1_3": [ { "type": "icon_state", - "icon_state": "pressure1_3", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_3", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -86,14 +86,14 @@ "meter1_4": [ { "type": "icon_state", - "icon_state": "pressure1_4", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_4", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -104,14 +104,14 @@ "meter1_5": [ { "type": "icon_state", - "icon_state": "pressure1_5", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_5", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -122,14 +122,14 @@ "meter1_6": [ { "type": "icon_state", - "icon_state": "pressure1_6", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_6", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -140,14 +140,14 @@ "meter2_1": [ { "type": "icon_state", - "icon_state": "pressure2_1", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -158,14 +158,14 @@ "meter2_2": [ { "type": "icon_state", - "icon_state": "pressure2_2", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_2", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -176,14 +176,14 @@ "meter2_3": [ { "type": "icon_state", - "icon_state": "pressure2_3", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_3", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -194,14 +194,14 @@ "meter2_4": [ { "type": "icon_state", - "icon_state": "pressure2_4", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_4", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -212,14 +212,14 @@ "meter2_5": [ { "type": "icon_state", - "icon_state": "pressure2_5", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_5", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -230,14 +230,14 @@ "meter2_6": [ { "type": "icon_state", - "icon_state": "pressure2_6", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_6", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -248,14 +248,14 @@ "meter3_1": [ { "type": "icon_state", - "icon_state": "pressure3_1", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -266,14 +266,14 @@ "meter3_2": [ { "type": "icon_state", - "icon_state": "pressure3_2", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_2", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -284,14 +284,14 @@ "meter3_3": [ { "type": "icon_state", - "icon_state": "pressure3_3", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_3", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -302,14 +302,14 @@ "meter3_4": [ { "type": "icon_state", - "icon_state": "pressure3_4", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_4", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -320,14 +320,14 @@ "meter3_5": [ { "type": "icon_state", - "icon_state": "pressure3_5", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_5", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -338,14 +338,14 @@ "meter3_6": [ { "type": "icon_state", - "icon_state": "pressure3_6", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_6", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -356,14 +356,14 @@ "meter4": [ { "type": "icon_state", - "icon_state": "pressure4", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure4", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", diff --git a/code/datums/pod_style.dm b/code/datums/pod_style.dm index 681e66ad0822d..853d7e058785b 100644 --- a/code/datums/pod_style.dm +++ b/code/datums/pod_style.dm @@ -56,7 +56,7 @@ glow_color = "blue" id = "deathsquad" -/datum/pod_style/advanced +/datum/pod_style/cultist name = "bloody supply pod" ui_name = "Cultist" desc = "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes." diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index a01bb21a451e4..7cdb9d406152b 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -449,11 +449,38 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) SEND_SIGNAL(parent, COMSIG_ATOM_STORED_ITEM, to_insert, user, force) SEND_SIGNAL(src, COMSIG_STORAGE_STORED_ITEM, to_insert, user, force) + RegisterSignal(to_insert, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(mousedrop_receive)) to_insert.forceMove(real_location) item_insertion_feedback(user, to_insert, override) parent.update_appearance() return TRUE +/// Since items inside storages ignore transparency for QOL reasons, we're tracking when things are dropped onto them instead of our UI elements +/datum/storage/proc/mousedrop_receive(atom/dropped_onto, atom/movable/target, mob/user, params) + SIGNAL_HANDLER + + if (src != user.active_storage) + return + + if (!user.can_perform_action(parent, FORBID_TELEKINESIS_REACH)) + return + + if (target.loc != real_location) // what even + UnregisterSignal(target, COMSIG_MOUSEDROPPED_ONTO) + return + + if(numerical_stacking) + return + + var/drop_index = real_location.contents.Find(dropped_onto) + real_location.contents -= target + // Use an empty list if we're dropping onto the last item + var/list/to_move = real_location.contents.len >= drop_index ? real_location.contents.Copy(drop_index) : list() + real_location.contents -= to_move + real_location.contents += target + real_location.contents += to_move + refresh_views() + /** * Inserts every item in a given list, with a progress bar * @@ -544,6 +571,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) refresh_views() parent.update_appearance() + UnregisterSignal(thing, COMSIG_MOUSEDROPPED_ONTO) 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 @@ -719,7 +747,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) parent.add_fingerprint(user) return COMPONENT_CANCEL_MOUSEDROP_ONTO - else if(ismob(over_object)) + if(ismob(over_object)) if(over_object != user || !user.can_perform_action(parent, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) return @@ -727,13 +755,24 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) INVOKE_ASYNC(src, PROC_REF(open_storage), user) return COMPONENT_CANCEL_MOUSEDROP_ONTO - else if(!istype(over_object, /atom/movable/screen)) - if(!user.can_perform_action(over_object, FORBID_TELEKINESIS_REACH)) - return + if(istype(over_object, /atom/movable/screen)) + return - parent.add_fingerprint(user) - INVOKE_ASYNC(src, PROC_REF(dump_content_at), over_object, user) - return COMPONENT_CANCEL_MOUSEDROP_ONTO + if(!user.can_perform_action(over_object, FORBID_TELEKINESIS_REACH)) + return + + parent.add_fingerprint(user) + + var/atom/dump_loc = over_object.get_dumping_location() + if(isnull(dump_loc)) + return + + /// Don't dump *onto* objects in the same storage as ourselves + if (over_object.loc == parent.loc && !isnull(parent.loc.atom_storage) && isnull(over_object.atom_storage)) + return + + INVOKE_ASYNC(src, PROC_REF(dump_content_at), over_object, dump_loc, user) + return COMPONENT_CANCEL_MOUSEDROP_ONTO /** * Dumps all of our contents at a specific location. @@ -741,7 +780,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param atom/dest_object where to dump to * @param mob/user the user who is dumping the contents */ -/datum/storage/proc/dump_content_at(atom/dest_object, mob/user) +/datum/storage/proc/dump_content_at(atom/dest_object, dump_loc, mob/user) if(locked) user.balloon_alert(user, "closed!") return @@ -764,10 +803,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) SEND_SIGNAL(src, COMSIG_STORAGE_DUMP_POST_TRANSFER, dest_object, user) return - var/atom/dump_loc = dest_object.get_dumping_location() - if(isnull(dump_loc)) - return - // Storage to loc transfer requires a do_after to_chat(user, span_notice("You start dumping out the contents of [parent] onto [dest_object]...")) if(!do_after(user, 2 SECONDS, target = dest_object)) diff --git a/code/datums/storage/storage_interface.dm b/code/datums/storage/storage_interface.dm index cd28b9eb3f7a1..c0cab0dd7952c 100644 --- a/code/datums/storage/storage_interface.dm +++ b/code/datums/storage/storage_interface.dm @@ -2,7 +2,7 @@ /datum/storage_interface /// UI elements for this theme var/atom/movable/screen/close/closer - var/atom/movable/screen/storage/cells + var/atom/movable/screen/storage/cell/cells var/atom/movable/screen/storage/corner/corner_top_left var/atom/movable/screen/storage/corner/top_right/corner_top_right var/atom/movable/screen/storage/corner/bottom_left/corner_bottom_left diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index ee70febb6c794..9c1f69af47e23 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -187,10 +187,11 @@ SSicon_smooth.remove_from_queues(src) // These lists cease existing when src does, so we need to clear any lua refs to them that exist. - DREAMLUAU_CLEAR_REF_USERDATA(contents) - DREAMLUAU_CLEAR_REF_USERDATA(filters) - DREAMLUAU_CLEAR_REF_USERDATA(overlays) - DREAMLUAU_CLEAR_REF_USERDATA(underlays) + if(!(datum_flags & DF_STATIC_OBJECT)) + DREAMLUAU_CLEAR_REF_USERDATA(contents) + DREAMLUAU_CLEAR_REF_USERDATA(filters) + DREAMLUAU_CLEAR_REF_USERDATA(overlays) + DREAMLUAU_CLEAR_REF_USERDATA(underlays) return ..() diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 3fa7d25767f2f..887c04ebedee0 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -137,6 +137,7 @@ icon = 'icons/obj/wallmounts.dmi' icon_state = "migniter" result_path = /obj/machinery/sparker + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) pixel_shift = 26 /obj/machinery/sparker diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 04883800f31ef..c8d0249fca02d 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -119,6 +119,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "light-nopower" result_path = /obj/machinery/light_switch + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) pixel_shift = 26 /obj/item/circuit_component/light_switch diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 80289a201be98..ef18dc6b068ae 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -36,9 +36,11 @@ Buildable meters icon_state_preview = "junction" pipe_type = /obj/machinery/atmospherics/pipe/heat_exchanging/junction /obj/item/pipe/directional/vent + name = "air vent fitting" icon_state_preview = "uvent" pipe_type = /obj/machinery/atmospherics/components/unary/vent_pump /obj/item/pipe/directional/scrubber + name = "air scrubber fitting" icon_state_preview = "scrubber" pipe_type = /obj/machinery/atmospherics/components/unary/vent_scrubber /obj/item/pipe/directional/connector @@ -78,6 +80,7 @@ Buildable meters RPD_type = PIPE_TRIN_M var/flipped = FALSE /obj/item/pipe/trinary/flippable/filter + name = "gas filter fitting" icon_state_preview = "filter" pipe_type = /obj/machinery/atmospherics/components/trinary/filter /obj/item/pipe/trinary/flippable/mixer diff --git a/code/game/machinery/scanner_gate.dm b/code/game/machinery/scanner_gate.dm index 2024e35f91fa3..fd99f3ccfb8a3 100644 --- a/code/game/machinery/scanner_gate.dm +++ b/code/game/machinery/scanner_gate.dm @@ -96,13 +96,13 @@ return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/scanner_gate/proc/on_entered(datum/source, atom/movable/AM) +/obj/machinery/scanner_gate/proc/on_entered(datum/source, atom/movable/thing) SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(auto_scan), AM) + INVOKE_ASYNC(src, PROC_REF(auto_scan), thing) -/obj/machinery/scanner_gate/proc/auto_scan(atom/movable/AM) - if(!(machine_stat & (BROKEN|NOPOWER)) && isliving(AM) & (!panel_open)) - perform_scan(AM) +/obj/machinery/scanner_gate/proc/auto_scan(atom/movable/thing) + if(!(machine_stat & (BROKEN|NOPOWER)) && anchored && !panel_open) + perform_scan(thing) /obj/machinery/scanner_gate/proc/set_scanline(type, duration) cut_overlays() @@ -124,8 +124,8 @@ return ITEM_INTERACT_SUCCESS return NONE -/obj/machinery/scanner_gate/attackby(obj/item/W, mob/user, params) - var/obj/item/card/id/card = W.GetID() +/obj/machinery/scanner_gate/attackby(obj/item/attacking_item, mob/user, params) + var/obj/item/card/id/card = attacking_item.GetID() if(card) if(locked) if(allowed(user)) @@ -133,16 +133,16 @@ req_access = list() to_chat(user, span_notice("You unlock [src].")) else if(!(obj_flags & EMAGGED)) - to_chat(user, span_notice("You lock [src] with [W].")) - var/list/access = W.GetAccess() + to_chat(user, span_notice("You lock [src] with [attacking_item].")) + var/list/access = attacking_item.GetAccess() req_access = access locked = TRUE else - to_chat(user, span_warning("You try to lock [src] with [W], but nothing happens.")) + to_chat(user, span_warning("You try to lock [src] with [attacking_item], but nothing happens.")) else - if(!locked && default_deconstruction_screwdriver(user, "[initial(icon_state)]_open", initial(icon_state), W)) + if(!locked && default_deconstruction_screwdriver(user, "[initial(icon_state)]_open", initial(icon_state), attacking_item)) return - if(panel_open && is_wire_tool(W)) + if(panel_open && is_wire_tool(attacking_item)) wires.interact(user) return ..() @@ -173,7 +173,7 @@ balloon_alert(user, "id checker disabled") return TRUE -/obj/machinery/scanner_gate/proc/perform_scan(mob/living/M) +/obj/machinery/scanner_gate/proc/perform_scan(atom/movable/thing) var/beep = FALSE var/color = null var/detected_thing = null @@ -181,26 +181,28 @@ if(SCANGATE_NONE) return if(SCANGATE_WANTED) - if(ishuman(M)) + if(ishuman(thing)) detected_thing = "Warrant" - var/mob/living/carbon/human/H = M - var/perpname = H.get_face_name(H.get_id_name()) + var/mob/living/carbon/human/scanned_human = thing + var/perpname = scanned_human.get_face_name(scanned_human.get_id_name()) var/datum/record/crew/target = find_record(perpname) if(!target || (target.wanted_status == WANTED_ARREST)) beep = TRUE if(SCANGATE_MINDSHIELD) detected_thing = "Mindshield" - if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) - beep = TRUE + if(ishuman(thing)) + var/mob/living/carbon/human/scanned_human = thing + if(HAS_TRAIT(scanned_human, TRAIT_MINDSHIELD)) + beep = TRUE if(SCANGATE_DISEASE) detected_thing = "[disease_threshold] infection" - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(get_disease_severity_value(C.check_virus()) >= get_disease_severity_value(disease_threshold)) + if(iscarbon(thing)) + var/mob/living/carbon/scanned_carbon = thing + if(get_disease_severity_value(scanned_carbon.check_virus()) >= get_disease_severity_value(disease_threshold)) beep = TRUE if(SCANGATE_SPECIES) - if(ishuman(M)) - var/mob/living/carbon/human/H = M + if(ishuman(thing)) + var/mob/living/carbon/human/scanned_human = thing var/datum/species/scan_species = /datum/species/human switch(detect_species) if(SCANGATE_LIZARD) @@ -230,29 +232,42 @@ if(SCANGATE_ZOMBIE) detected_thing = "Zombie" scan_species = /datum/species/zombie - if(is_species(H, scan_species)) + if(is_species(scanned_human, scan_species)) beep = TRUE if(detect_species == SCANGATE_ZOMBIE) //Can detect dormant zombies detected_thing = "Romerol infection" - if(H.get_organ_slot(ORGAN_SLOT_ZOMBIE)) + if(scanned_human.get_organ_slot(ORGAN_SLOT_ZOMBIE)) beep = TRUE if(SCANGATE_GUNS) - for(var/I in M.get_contents()) - detected_thing = "Weapons" - if(isgun(I)) - beep = TRUE - break + detected_thing = "Weapons" + if(isgun(thing)) + beep = TRUE + else if(ishuman(thing)) + var/mob/living/carbon/human/scanned_human = thing + var/obj/item/card/id/idcard = scanned_human.get_idcard(hand_first = FALSE) + for(var/obj/item/scanned_item in scanned_human.get_all_contents_skipping_traits(TRAIT_CONTRABAND_BLOCKER)) + if(isgun(scanned_item)) + if((!HAS_TRAIT(scanned_human, TRAIT_MINDSHIELD)) && (isnull(idcard) || !(ACCESS_WEAPONS in idcard.access))) // mindshield or ID card with weapons access, like bartender + beep = TRUE + break + say("[detected_thing] detection bypassed.") + break + else + for(var/obj/item/content in thing.get_all_contents_skipping_traits(TRAIT_CONTRABAND_BLOCKER)) + if(isgun(content)) + beep = TRUE + break if(SCANGATE_NUTRITION) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.nutrition <= detect_nutrition && detect_nutrition == NUTRITION_LEVEL_STARVING) + if(ishuman(thing)) + var/mob/living/carbon/human/scanned_human = thing + if(scanned_human.nutrition <= detect_nutrition && detect_nutrition == NUTRITION_LEVEL_STARVING) beep = TRUE detected_thing = "Starvation" - if(H.nutrition >= detect_nutrition && detect_nutrition == NUTRITION_LEVEL_FAT) + if(scanned_human.nutrition >= detect_nutrition && detect_nutrition == NUTRITION_LEVEL_FAT) beep = TRUE detected_thing = "Obesity" if(SCANGATE_CONTRABAND) - for(var/obj/item/content in M.get_all_contents_skipping_traits(TRAIT_CONTRABAND_BLOCKER)) + for(var/obj/item/content in thing.get_all_contents_skipping_traits(TRAIT_CONTRABAND_BLOCKER)) detected_thing = "Contraband" if(content.is_contraband()) beep = TRUE @@ -268,18 +283,18 @@ if(beep) alarm_beep(detected_thing) - SEND_SIGNAL(src, COMSIG_SCANGATE_PASS_TRIGGER, M) + SEND_SIGNAL(src, COMSIG_SCANGATE_PASS_TRIGGER, thing) if(!ignore_signals) color = wires.get_color_of_wire(WIRE_ACCEPT) var/obj/item/assembly/assembly = wires.get_attached(color) assembly?.activate() else - SEND_SIGNAL(src, COMSIG_SCANGATE_PASS_NO_TRIGGER, M) + SEND_SIGNAL(src, COMSIG_SCANGATE_PASS_NO_TRIGGER, thing) if(!ignore_signals) color = wires.get_color_of_wire(WIRE_DENY) var/obj/item/assembly/assembly = wires.get_attached(color) assembly?.activate() - set_scanline("scanning", 10) + set_scanline("scanning", 1 SECONDS) use_energy(active_power_usage) @@ -291,7 +306,7 @@ say("[detected_thing][reverse ? " not " : " "]detected!!") COOLDOWN_START(src, next_beep, 2 SECONDS) - playsound(src, 'sound/machines/scanbuzz.ogg', 100, FALSE) + playsound(source = src, soundin = 'sound/machines/scanbuzz.ogg', vol = 30, vary = FALSE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE, falloff_distance = 4) set_scanline("alarm", 2 SECONDS) /obj/machinery/scanner_gate/can_interact(mob/user) diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index 6832b07d12568..a9d2e0bcaa0c4 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -449,3 +449,23 @@ /obj/structure/table = list(/obj/structure/table/greyscale = 9, /obj/structure/table/abductor = 1), /obj/structure/toilet = list(/obj/structure/toilet/greyscale = 1), ) + +/datum/dimension_theme/bronze + name = "Bronze" + icon = 'icons/obj/weapons/spear.dmi' + icon_state = "ratvarian_spear" + material = /datum/material/bronze + replace_walls = /turf/closed/wall/mineral/bronze + replace_floors = list(/turf/open/floor/bronze = 1, /turf/open/floor/bronze/flat = 1, /turf/open/floor/bronze/filled = 1) + replace_objs = list( + /obj/structure/girder = list(/obj/structure/girder/bronze = 1), + /obj/structure/window/fulltile = list(/obj/structure/window/bronze/fulltile = 1), + /obj/structure/window = list(/obj/structure/window/bronze = 1), + /obj/structure/statue = list(/obj/structure/statue/bronze/marx = 1), // karl marx was a servant of ratvar + /obj/structure/table = list(/obj/structure/table/bronze = 1), + /obj/structure/toilet = list(/obj/structure/toilet/greyscale = 1), + /obj/structure/chair = list(/obj/structure/chair/bronze = 1), + /obj/item/reagent_containers/cup/glass/trophy = list(/obj/item/reagent_containers/cup/glass/trophy/bronze_cup = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/bronze = 1), + ) + sound = 'sound/magic/clockwork/fellowship_armory.ogg' diff --git a/code/game/objects/effects/particles/fire.dm b/code/game/objects/effects/particles/fire.dm index 9d90d0d29c29a..9904685807364 100644 --- a/code/game/objects/effects/particles/fire.dm +++ b/code/game/objects/effects/particles/fire.dm @@ -33,3 +33,21 @@ drift = generator(GEN_VECTOR, list(-0.1,0), list(0.1,0.025), UNIFORM_RAND) spin = generator(GEN_NUM, list(-15,15), NORMAL_RAND) scale = generator(GEN_VECTOR, list(0.5,0.5), list(2,2), NORMAL_RAND) + +/particles/embers/spark + count = 3 + spawning = 2 + gradient = list("#FBAF4D", "#FCE6B6", "#FFFFFF") + lifespan = 1.5 SECONDS + fade = 1 SECONDS + fadein = 0.1 SECONDS + grow = -0.1 + velocity = generator(GEN_CIRCLE, 3, 3, SQUARE_RAND) + position = generator(GEN_SPHERE, 0, 0, LINEAR_RAND) + scale = generator(GEN_VECTOR, list(0.5, 0.5), list(1,1), NORMAL_RAND) + drift = list(0) + +/particles/embers/spark/severe + count = 10 + spawning = 5 + gradient = list("#FCE6B6", "#FFFFFF") diff --git a/code/game/objects/effects/particles/smoke.dm b/code/game/objects/effects/particles/smoke.dm index 27249c65a683e..776c90534a957 100644 --- a/code/game/objects/effects/particles/smoke.dm +++ b/code/game/objects/effects/particles/smoke.dm @@ -84,3 +84,16 @@ grow = 0.05 spin = 2 color = "#fcffff77" + +/particles/smoke/cyborg + count = 5 + spawning = 1 + lifespan = 1 SECONDS + fade = 1.8 SECONDS + position = list(0, 0, 0) + scale = list(0.5, 0.5) + grow = 0.1 + +/particles/smoke/cyborg/heavy_damage + lifespan = 0.8 SECONDS + fade = 0.8 SECONDS diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 9bc86d0c7f96b..93c6b6bdc992f 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -860,7 +860,7 @@ if(carbon_target.client) carbon_target.set_eye_blur_if_lower(6 SECONDS) carbon_target.adjust_temp_blindness(2 SECONDS) - if(carbon_target.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS. Warning: don't add a stun here. It's a roundstart item with some quirks. + if(carbon_target.get_eye_protection() <= 0 || carbon_target.is_eyes_covered()) // no eye protection? ARGH IT BURNS. Warning: don't add a stun here. It's a roundstart item with some quirks. added redundancy because gas masks don't give you eye protection carbon_target.adjust_jitter(1 SECONDS) carbon_target.adjust_eye_blur(0.5 SECONDS) flash_color(carbon_target, flash_color=paint_color, flash_time=40) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index eb3317d5909f0..02934d1a03eaa 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -147,7 +147,6 @@ if(!cell || !cell_removable) return FALSE - cell.update_appearance() cell.forceMove(get_turf(src)) balloon_alert(user, "removed [cell]") cell = null diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index e684c1b4959e5..968a2f11f4d4c 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -959,14 +959,10 @@ var/dark_light_range = 2.5 ///Variable to preserve old lighting behavior in flashlights, to handle darkness. var/dark_light_power = -3 - var/on = FALSE /obj/item/flashlight/flashdark/update_brightness() . = ..() - if(on) - set_light(dark_light_range, dark_light_power) - else - set_light(0) + set_light(dark_light_range, dark_light_power) //type and subtypes spawned and used to give some eyes lights, /obj/item/flashlight/eyelight diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 373db4b21f53a..121f0bba965b3 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -352,10 +352,10 @@ return - if(iscarbon(talking_movable)) - var/mob/living/carbon/talking_carbon = talking_movable - if(talking_carbon.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) - SEND_SOUND(talking_carbon, 'sound/misc/radio_talk.ogg') + if(isliving(talking_movable)) + var/mob/living/talking_living = talking_movable + if(talking_living.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) + SEND_SOUND(talking_living, 'sound/misc/radio_talk.ogg') // All radios make an attempt to use the subspace system first signal.send_to_receivers() @@ -428,15 +428,17 @@ SEND_SIGNAL(src, COMSIG_RADIO_RECEIVE_MESSAGE, data) flick_overlay_view(overlay_speaker_active, 5 SECONDS) - if(iscarbon(loc)) - var/mob/living/carbon/holder = loc - if(!holder.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) - return + if(!isliving(loc)) + return + + var/mob/living/holder = loc + if(!holder.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) + return - var/list/spans = data["spans"] - SEND_SOUND(holder, 'sound/misc/radio_receive.ogg') - if(SPAN_COMMAND in spans) - SEND_SOUND(holder, 'sound/misc/radio_important.ogg') + var/list/spans = data["spans"] + SEND_SOUND(holder, 'sound/misc/radio_receive.ogg') + if(SPAN_COMMAND in spans) + SEND_SOUND(holder, 'sound/misc/radio_important.ogg') /obj/item/radio/ui_state(mob/user) return GLOB.inventory_state diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index 6c84b5cf46eea..bb9d275fb00b8 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -17,6 +17,8 @@ obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT max_integrity = 40 + pickup_sound = 'sound/items/grenade_pick_up.ogg' + drop_sound = 'sound/items/grenade_drop.ogg' /// Bitfields which prevent the grenade from detonating if set. Includes ([GRENADE_DUD]|[GRENADE_USED]) var/dud_flags = NONE ///Is this grenade currently armed? diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index c5a68260abade..dfcd6031d8729 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -48,6 +48,8 @@ breakouttime = 1 MINUTES armor_type = /datum/armor/restraints_handcuffs custom_price = PAYCHECK_COMMAND * 0.35 + pickup_sound = 'sound/items/handcuffs_pick_up.ogg' + drop_sound = 'sound/items/handcuffs_drop.ogg' ///How long it takes to handcuff someone var/handcuff_time = 4 SECONDS @@ -55,6 +57,8 @@ var/handcuff_time_mod = 1 ///Sound that plays when starting to put handcuffs on someone var/cuffsound = 'sound/weapons/handcuffs.ogg' + ///Sound that plays when restrain is successful + var/cuffsuccesssound = 'sound/items/handcuff_finish.ogg' ///If set, handcuffs will be destroyed on application and leave behind whatever this is set to. var/trashtype = null /// How strong the cuffs are. Weak cuffs can be broken with wirecutters or boxcutters. @@ -120,6 +124,7 @@ return apply_cuffs(victim, user, dispense = iscyborg(user)) + playsound(loc, cuffsuccesssound, 30, TRUE, -2) victim.visible_message( span_notice("[user] handcuffs [victim]."), diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 253a40be69d54..4af5c4c923e75 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -318,6 +318,8 @@ bare_wound_bonus = 5 clumsy_knockdown_time = 15 SECONDS active = FALSE + pickup_sound = 'sound/items/stun_baton_pick_up.ogg' + drop_sound = 'sound/items/stun_baton_drop.ogg' /// The sound effecte played when our baton is extended. var/on_sound = 'sound/weapons/batonextend.ogg' @@ -436,6 +438,8 @@ light_on = FALSE light_color = LIGHT_COLOR_ORANGE light_power = 0.5 + pickup_sound = 'sound/items/stun_baton_pick_up.ogg' + drop_sound = 'sound/items/stun_baton_drop.ogg' var/throw_stun_chance = 35 @@ -504,7 +508,6 @@ /obj/item/melee/baton/security/Exited(atom/movable/mov_content) . = ..() if(mov_content == cell) - cell.update_appearance() cell = null active = FALSE update_appearance() diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 520541e12dc73..c980fe0dbb359 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -149,6 +149,8 @@ shield_break_sound = 'sound/effects/glassbr3.ogg' shield_break_leftover = /obj/item/shard armor_type = /datum/armor/item_shield/riot + pickup_sound = 'sound/items/plastic_shield_pick_up.ogg' + drop_sound = 'sound/items/plastic_shield_drop.ogg' /obj/item/shield/riot/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 6314c16c8449c..69dbe87cd5cc9 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -41,6 +41,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ merge_type = /obj/item/stack/rods pickup_sound = 'sound/items/iron_rod_pick_up.ogg' drop_sound = 'sound/items/metal_drop.ogg' + sound_vary = TRUE /datum/embed_data/rods embed_chance = 50 diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 8bf2e0b74aa25..bd1f52a832349 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -373,6 +373,9 @@ /obj/item/restraints/handcuffs, /obj/item/restraints/legcuffs/bola, )) + atom_storage.open_sound = 'sound/items/holster.ogg' + atom_storage.open_sound_vary = TRUE + atom_storage.rustle_sound = FALSE /obj/item/storage/belt/security/full/PopulateContents() new /obj/item/reagent_containers/spray/pepper(src) diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm index ddfb51d913b9c..a8ced4fdad48e 100644 --- a/code/game/objects/items/storage/boxes/job_boxes.dm +++ b/code/game/objects/items/storage/boxes/job_boxes.dm @@ -43,7 +43,7 @@ if(HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA)) new /obj/item/storage/pill_bottle/potassiodide(src) - if(LAZYLEN(SSmapping.multiz_levels)) + if(length(SSmapping.levels_by_trait(ZTRAIT_STATION)) > 1) new /obj/item/climbing_hook/emergency(src) /obj/item/storage/box/survival/radio/PopulateContents() diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index afb7b0f750b26..f8dee3afdc7f4 100644 --- a/code/game/objects/items/storage/holsters.dm +++ b/code/game/objects/items/storage/holsters.dm @@ -33,6 +33,8 @@ /obj/item/gun/energy/laser/captain, /obj/item/gun/energy/e_gun/hos, )) + atom_storage.open_sound = 'sound/items/holster.ogg' + atom_storage.open_sound_vary = TRUE /obj/item/storage/belt/holster/energy name = "energy shoulder holsters" diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index b2b0109c04c88..fb40a70cbeea0 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -145,22 +145,30 @@ if(user.combat_mode) return NONE + return try_heal_loop(interacting_with, user) + +/obj/item/weldingtool/proc/try_heal_loop(atom/interacting_with, mob/living/user, repeating = FALSE) var/mob/living/carbon/human/attacked_humanoid = interacting_with var/obj/item/bodypart/affecting = attacked_humanoid.get_bodypart(check_zone(user.zone_selected)) if(isnull(affecting) || !IS_ROBOTIC_LIMB(affecting)) return NONE - var/use_delay = 0 + if (!affecting.get_damage()) + return + user.visible_message(span_notice("[user] starts to fix some of the dents on [attacked_humanoid == user ? user.p_their() : "[attacked_humanoid]'s"] [affecting.name]."), + span_notice("You start fixing some of the dents on [attacked_humanoid == user ? "your" : "[attacked_humanoid]'s"] [affecting.name].")) + var/use_delay = repeating ? 1 SECONDS : 0 if(user == attacked_humanoid) - user.visible_message(span_notice("[user] starts to fix some of the dents on [attacked_humanoid]'s [affecting.name]."), - span_notice("You start fixing some of the dents on [attacked_humanoid == user ? "your" : "[attacked_humanoid]'s"] [affecting.name].")) use_delay = 5 SECONDS if(!use_tool(attacked_humanoid, user, use_delay, volume=50, amount=1)) return ITEM_INTERACT_BLOCKING - attacked_humanoid.item_heal(user, brute_heal = 15, burn_heal = 0, heal_message_brute = "dents", heal_message_burn = "burnt wires", required_bodytype = BODYTYPE_ROBOTIC) + if (!attacked_humanoid.item_heal(user, brute_heal = 15, burn_heal = 0, heal_message_brute = "dents", heal_message_burn = "burnt wires", required_bodytype = BODYTYPE_ROBOTIC)) + return ITEM_INTERACT_BLOCKING + + INVOKE_ASYNC(src, PROC_REF(try_heal_loop), interacting_with, user, TRUE) return ITEM_INTERACT_SUCCESS /obj/item/weldingtool/afterattack(atom/target, mob/user, click_parameters) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index cd8247af3dfbe..0d3e3f60d4abf 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -518,12 +518,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_simple = list("smash", "slam", "whack", "thwack") icon = 'icons/obj/weapons/staff.dmi' icon_state = "bambostaff0" + base_icon_state = "bambostaff" inhand_icon_state = "bambostaff0" worn_icon_state = "bambostaff0" lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' -/obj/item/nullrod/bostaff/Initialize(mapload) +/obj/item/bambostaff/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, \ force_unwielded = 10, \ @@ -531,7 +532,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 icon_wielded = "[base_icon_state]1", \ ) -/obj/item/nullrod/bostaff/update_icon_state() +/obj/item/bambostaff/update_icon_state() icon_state = "[base_icon_state]0" return ..() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index ce1b48985bb67..f12479c66a444 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -12,7 +12,7 @@ /// Icon to use as a 32x32 preview in crafting menus and such var/icon_preview var/icon_state_preview - /// The vertical pixel offset applied when the object is anchored on a tile with table + /// The vertical pixel_z offset applied when the object is anchored on a tile with table /// Ignored when set to 0 - to avoid shifting directional wall-mounted objects above tables var/anchored_tabletop_offset = 0 @@ -278,7 +278,14 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) return FALSE return TRUE -/// Adjusts the vertical pixel offset when the object is anchored on a tile with table +/// Adjusts the vertical pixel_z offset when the object is anchored on a tile with table /obj/proc/check_on_table() - if(anchored_tabletop_offset != 0 && !istype(src, /obj/structure/table) && locate(/obj/structure/table) in loc) - pixel_y = anchored ? anchored_tabletop_offset : initial(pixel_y) + if(anchored_tabletop_offset == 0) + return + if(istype(src, /obj/structure/table)) + return + + if(anchored && locate(/obj/structure/table) in loc) + pixel_z = anchored_tabletop_offset + else + pixel_z = initial(pixel_z) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 024276198ab51..f9214b989b95c 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -39,6 +39,7 @@ MEDIUM_VENT_TYPE = 5, SMALL_VENT_TYPE = 7, ) + var/wave_timer = WAVE_DURATION_SMALL /// What string do we use to warn the player about the excavation event? var/excavation_warning = "Are you ready to excavate this ore vent?" @@ -219,6 +220,9 @@ node.arrive(src) RegisterSignal(node, COMSIG_QDELETING, PROC_REF(handle_wave_conclusion)) RegisterSignal(node, COMSIG_MOVABLE_MOVED, PROC_REF(handle_wave_conclusion)) + addtimer(CALLBACK(node, TYPE_PROC_REF(/atom, update_appearance)), wave_timer * 0.25) + addtimer(CALLBACK(node, TYPE_PROC_REF(/atom, update_appearance)), wave_timer * 0.5) + addtimer(CALLBACK(node, TYPE_PROC_REF(/atom, update_appearance)), wave_timer * 0.75) particles = new /particles/smoke/ash() for(var/i in 1 to 5) // Clears the surroundings of the ore vent before starting wave defense. for(var/turf/closed/mineral/rock in oview(i)) @@ -247,11 +251,6 @@ spawn_distance = 4, \ spawn_distance_exclude = 3, \ ) - var/wave_timer = 60 SECONDS - if(boulder_size == BOULDER_SIZE_MEDIUM) - wave_timer = 90 SECONDS - else if(boulder_size == BOULDER_SIZE_LARGE) - wave_timer = 150 SECONDS COOLDOWN_START(src, wave_cooldown, wave_timer) addtimer(CALLBACK(src, PROC_REF(handle_wave_conclusion)), wave_timer) icon_state = icon_state_tapped @@ -290,6 +289,7 @@ icon_state = icon_state_tapped update_appearance(UPDATE_ICON_STATE) qdel(GetComponent(/datum/component/gps)) + UnregisterSignal(node, COMSIG_QDELETING) else visible_message(span_danger("\the [src] creaks and groans as the mining attempt fails, and the vent closes back up.")) icon_state = initial(icon_state) @@ -474,18 +474,22 @@ switch(string_boulder_size) if(LARGE_VENT_TYPE) boulder_size = BOULDER_SIZE_LARGE + wave_timer = WAVE_DURATION_LARGE if(mapload) GLOB.ore_vent_sizes["large"] += 1 if(MEDIUM_VENT_TYPE) boulder_size = BOULDER_SIZE_MEDIUM + wave_timer = WAVE_DURATION_MEDIUM if(mapload) GLOB.ore_vent_sizes["medium"] += 1 if(SMALL_VENT_TYPE) boulder_size = BOULDER_SIZE_SMALL + wave_timer = WAVE_DURATION_SMALL if(mapload) GLOB.ore_vent_sizes["small"] += 1 else boulder_size = BOULDER_SIZE_SMALL //Might as well set a default value + wave_timer = WAVE_DURATION_SMALL name = initial(name) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 895660fafa44c..8dc8d82ff5f7d 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -356,6 +356,7 @@ if((shove_flags & SHOVE_KNOCKDOWN_BLOCKED) || !(shove_flags & SHOVE_BLOCKED)) return target.Knockdown(SHOVE_KNOCKDOWN_TABLE) + target.apply_status_effect(/datum/status_effect/next_shove_stuns) target.visible_message(span_danger("[shover.name] shoves [target.name] onto \the [src]!"), span_userdanger("You're shoved onto \the [src] by [shover.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, shover) to_chat(shover, span_danger("You shove [target.name] onto \the [src]!")) diff --git a/code/game/objects/structures/water_structures/water_source.dm b/code/game/objects/structures/water_structures/water_source.dm index b7ad26a65ea7e..e06cd8c6771ef 100644 --- a/code/game/objects/structures/water_structures/water_source.dm +++ b/code/game/objects/structures/water_structures/water_source.dm @@ -137,6 +137,15 @@ base_icon_state = "puddle" resistance_flags = UNACIDABLE +/obj/structure/water_source/puddle/Initialize(mapload) + . = ..() + register_context() + +/obj/structure/water_source/puddle/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_RMB] = "Scoop Tadpoles" + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/structure/water_source/puddle/attack_hand(mob/user, list/modifiers) icon_state = "[base_icon_state]-splash" @@ -147,3 +156,20 @@ icon_state = "[base_icon_state]-splash" . = ..() icon_state = base_icon_state + +/obj/structure/water_source/puddle/attack_hand_secondary(mob/living/carbon/human/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(DOING_INTERACTION_WITH_TARGET(user, src)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + icon_state = "[base_icon_state]-splash" + balloon_alert(user, "scooping tadpoles...") + if(do_after(user, src, 5 SECONDS)) + playsound(loc, 'sound/effects/slosh.ogg', 15, TRUE) + balloon_alert(user, "got a tadpole") + var/obj/item/fish/tadpole/tadpole = new(loc) + tadpole.randomize_size_and_weight() + user.put_in_hands(tadpole) + icon_state = base_icon_state + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 10165f869174f..b0493ce0a8ad4 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -3,6 +3,7 @@ GLOBAL_LIST_EMPTY(station_turfs) /// Any floor or wall. What makes up the station and the rest of the map. /turf icon = 'icons/turf/floors.dmi' + datum_flags = DF_STATIC_OBJECT vis_flags = VIS_INHERIT_ID // Important for interaction with and visualization of openspace. luminosity = 1 light_height = LIGHTING_HEIGHT_FLOOR diff --git a/code/modules/admin/verbs/lua/lua_editor.dm b/code/modules/admin/verbs/lua/lua_editor.dm index c0b37fd87c1ec..a28ae8b40f19b 100644 --- a/code/modules/admin/verbs/lua/lua_editor.dm +++ b/code/modules/admin/verbs/lua/lua_editor.dm @@ -75,6 +75,7 @@ if(last_error) data["lastError"] = last_error last_error = null + data["supressRuntimes"] = current_state.supress_runtimes data["states"] = list() for(var/datum/lua_state/state as anything in SSlua.states) data["states"] += state.display_name @@ -228,7 +229,7 @@ if(result["status"] == "error") last_error = result["message"] arguments.Cut() - return TRUE + return if("resumeTask") var/task_index = params["index"] SSlua.queue_resume(current_state, task_index, arguments) @@ -261,6 +262,9 @@ if("toggleShowGlobalTable") show_global_table = !show_global_table return TRUE + if("toggleSupressRuntimes") + current_state.supress_runtimes = !current_state.supress_runtimes + return TRUE if("nextPage") page = min(page+1, CEILING(current_state.log.len/50, 1)-1) return TRUE diff --git a/code/modules/admin/verbs/lua/lua_state.dm b/code/modules/admin/verbs/lua/lua_state.dm index b3ede12238444..37a60f1fdb5e1 100644 --- a/code/modules/admin/verbs/lua/lua_state.dm +++ b/code/modules/admin/verbs/lua/lua_state.dm @@ -24,6 +24,9 @@ GLOBAL_PROTECT(lua_state_stack) /// Whether the timer.lua script has been included into this lua context state. var/timer_enabled = FALSE + /// Whether to supress logging BYOND runtimes for this state. + var/supress_runtimes = FALSE + /// Callbacks that need to be ran on next tick var/list/functions_to_execute = list() diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index 130b6c9af5f1b..1e566b7d1975e 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -192,7 +192,7 @@ //BOMBANANA /obj/item/seeds/banana/bombanana - name = "pack of bombanana seeds" + name = "bombanana seed pack" desc = "They're seeds that grow into bombanana trees. When grown, give to the clown." plantname = "Bombanana Tree" product = /obj/item/food/grown/banana/bombanana diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index b74569f1a1447..957a78a27269c 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -1,7 +1,5 @@ /** * # The path of Ash. - * Spell names are in this language: OLD NORDIC - * Both are related: Nordic Mythology-Yggdrassil-Ash Tree Genus-Ash * * Goes as follows: * @@ -233,7 +231,7 @@ text = "[generate_heretic_text()] Fear the blaze, for the Ashlord, [user.real_name] has ascended! The flames shall consume all! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_ash.ogg', - color_override = "white", + color_override = "pink", ) var/datum/action/cooldown/spell/fire_sworn/circle_spell = new(user.mind) diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 357e789416d1d..de79151739f4b 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -1,7 +1,5 @@ /** * # The path of Blades. Stab stab. - * Spell names are in this language: ARAMAIC - * Both are related: Aramaic-Damascus-Blade * * Goes as follows: * diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index 8a94aada74a67..a3e7576132036 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -1,7 +1,5 @@ /** * # The path of Cosmos. - * Spell names are in this language: SUMERIAN - * Both are related: Sumerian-Original-Primordial-Cosmic * * Goes as follows: * @@ -285,7 +283,7 @@ text = "[generate_heretic_text()] A Star Gazer has arrived into the station, [user.real_name] has ascended! This station is the domain of the Cosmos! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_cosmic.ogg', - color_override = "purple", + color_override = "pink", ) var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = new /mob/living/basic/heretic_summon/star_gazer(loc) star_gazer_mob.maxHealth = INFINITY diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index e0b82651bc9d6..a1786189d99c0 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -5,8 +5,6 @@ /** * # The path of Flesh. - * Spell names are in this language: LATIN - * Both are related: Latin-Rome-Hedonism-Flesh * * Goes as follows: * @@ -332,7 +330,7 @@ text = "[generate_heretic_text()] Ever coiling vortex. Reality unfolded. ARMS OUTREACHED, THE LORD OF THE NIGHT, [user.real_name] has ascended! Fear the ever twisting hand! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_flesh.ogg', - color_override = "red", + color_override = "pink", ) var/datum/action/cooldown/spell/shapeshift/shed_human_form/worm_spell = new(user.mind) diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index b238d6dd3c7f3..17e73cb162c17 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -1,7 +1,5 @@ /** * # The path of Lock. - * Spell names are in this language: EGYPTIAN - * Both are related: Egyptian-Mysteries-Secrets-Lock * * Goes as follows: * @@ -243,7 +241,7 @@ text = "Delta-class dimensional anomaly detec[generate_heretic_text()] Reality rended, torn. Gates open, doors open, [user.real_name] has ascended! Fear the tide! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_knock.ogg', - color_override = "yellow", + color_override = "pink", ) // buffs diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index 5ba55b64058cb..917944d30fe95 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -1,7 +1,5 @@ /** * # The path of Moon. - * Spell names are in this language: ANCIENT HEBREW - * Both are related: Ancient Hebrew-Moon Mysticism-Moon * * Goes as follows: * @@ -211,7 +209,7 @@ The truth shall finally devour the lie! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_moon.ogg', - color_override = "blue", + color_override = "pink", ) ADD_TRAIT(user, TRAIT_MADNESS_IMMUNE, REF(src)) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index fe0d03ec18f50..3a081c8d295fb 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -1,6 +1,5 @@ /** * # The path of Rust. - * Spell names are in this language: OLD SLAVIC * * Goes as follows: * @@ -257,7 +256,7 @@ text = "[generate_heretic_text()] Fear the decay, for the Rustbringer, [user.real_name] has ascended! None shall escape the corrosion! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_rust.ogg', - color_override = "brown", + color_override = "pink", ) trigger(loc) RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index 7cb3b82a39ac2..4e5e2910e0ef9 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -1,5 +1,4 @@ // Heretic starting knowledge. -// Default heretic language is Ancient Greek, because, uh, they're like ancient and shit. /// Global list of all heretic knowledge that have route = PATH_START. List of PATHS. GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index 482de8184401b..11031a51aca96 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -1,7 +1,5 @@ /** * # The path of VOID. - * Spell names are in this language: PALI - * Both are related: Pali-Buddhism-Nothingness-Void * * Goes as follows: * @@ -221,7 +219,7 @@ text = "[generate_heretic_text()] The nobleman of void [user.real_name] has arrived, stepping along the Waltz that ends worlds! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_void.ogg', - color_override = "blue", + color_override = "pink", ) ADD_TRAIT(user, TRAIT_RESISTLOWPRESSURE, MAGIC_TRAIT) diff --git a/code/modules/antagonists/heretic/magic/aggressive_spread.dm b/code/modules/antagonists/heretic/magic/aggressive_spread.dm index 0c14550f0b269..dfb4a94847406 100644 --- a/code/modules/antagonists/heretic/magic/aggressive_spread.dm +++ b/code/modules/antagonists/heretic/magic/aggressive_spread.dm @@ -10,8 +10,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "Agresiv'noe rasprostra-neniye!" - invocation_type = INVOCATION_SHOUT + invocation = "A'GRSV SPR'D" + invocation_type = INVOCATION_WHISPER spell_requirements = NONE aoe_radius = 2 diff --git a/code/modules/antagonists/heretic/magic/apetravulnera.dm b/code/modules/antagonists/heretic/magic/apetravulnera.dm index eedef71f4b6c8..e80d08911848c 100644 --- a/code/modules/antagonists/heretic/magic/apetravulnera.dm +++ b/code/modules/antagonists/heretic/magic/apetravulnera.dm @@ -10,8 +10,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS - invocation = "Shea' shen-eh!" - invocation_type = INVOCATION_SHOUT + invocation = "AP'TRA VULN'RA!" + invocation_type = INVOCATION_WHISPER spell_requirements = NONE cast_range = 4 diff --git a/code/modules/antagonists/heretic/magic/ash_ascension.dm b/code/modules/antagonists/heretic/magic/ash_ascension.dm index 70422a7c48a37..8b564198a61eb 100644 --- a/code/modules/antagonists/heretic/magic/ash_ascension.dm +++ b/code/modules/antagonists/heretic/magic/ash_ascension.dm @@ -10,7 +10,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 70 SECONDS - invocation = "EID'R-ELDR!!!" + invocation = "FL'MS" invocation_type = INVOCATION_WHISPER spell_requirements = NONE @@ -72,8 +72,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "ILLA-LASARA'FOSS!!!" - invocation_type = INVOCATION_SHOUT + invocation = "C'SC'DE" + invocation_type = INVOCATION_WHISPER spell_requirements = NONE /// The radius the flames will go around the caster. @@ -112,7 +112,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 300 - invocation = "Eld'sky!" + invocation = "F'RE" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/ash_jaunt.dm b/code/modules/antagonists/heretic/magic/ash_jaunt.dm index 4f8c59d635145..41242063a9098 100644 --- a/code/modules/antagonists/heretic/magic/ash_jaunt.dm +++ b/code/modules/antagonists/heretic/magic/ash_jaunt.dm @@ -10,7 +10,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 15 SECONDS - invocation = "Askgraar' goetur!" + invocation = "ASH'N P'SSG'" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/blood_cleave.dm b/code/modules/antagonists/heretic/magic/blood_cleave.dm index b3370a3ccc614..d5317f23e344b 100644 --- a/code/modules/antagonists/heretic/magic/blood_cleave.dm +++ b/code/modules/antagonists/heretic/magic/blood_cleave.dm @@ -10,7 +10,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS - invocation = "Fer're!" + invocation = "CL'VE!" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/blood_siphon.dm b/code/modules/antagonists/heretic/magic/blood_siphon.dm index 6280353a072a5..1e3d6258826d4 100644 --- a/code/modules/antagonists/heretic/magic/blood_siphon.dm +++ b/code/modules/antagonists/heretic/magic/blood_siphon.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 15 SECONDS - invocation = "Sanguis suctio!" + invocation = "FL'MS O'ET'RN'ITY." invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/burglar_finesse.dm b/code/modules/antagonists/heretic/magic/burglar_finesse.dm index c5264119bb48e..a90acb8495f14 100644 --- a/code/modules/antagonists/heretic/magic/burglar_finesse.dm +++ b/code/modules/antagonists/heretic/magic/burglar_finesse.dm @@ -9,7 +9,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 40 SECONDS - invocation = "Khenem" + invocation = "Y'O'K!" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm index 6869dc0df51c0..3fb197d392cb0 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS - invocation = "An'gar baltil!" + invocation = "C'SM'S 'XP'ND" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/cosmic_runes.dm b/code/modules/antagonists/heretic/magic/cosmic_runes.dm index e07aa4fbe8b8a..207b60ae9393a 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_runes.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_runes.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 15 SECONDS - invocation = "Is'zara-runen" + invocation = "ST'R R'N'" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/eldritch_blind.dm b/code/modules/antagonists/heretic/magic/eldritch_blind.dm index 413ff4fe67810..8df20503821b0 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_blind.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_blind.dm @@ -5,7 +5,7 @@ overlay_icon_state = "bg_heretic_border" school = SCHOOL_FORBIDDEN - invocation = "Caecus" + invocation = "E'E'S" spell_requirements = NONE cast_range = 10 diff --git a/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm b/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm index 4028f80f84cea..c68ed07c81f8c 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm @@ -8,7 +8,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "Pulsus Energiae" + invocation = "E'P" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm b/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm index bde032a3b39fd..e598f1f9215b9 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm @@ -7,7 +7,7 @@ overlay_icon_state = "bg_heretic_border" school = SCHOOL_FORBIDDEN - invocation = "Forma" + invocation = "SH'PE" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/fire_blast.dm b/code/modules/antagonists/heretic/magic/fire_blast.dm index 8c6d632be9f2d..4c17ca5ffc0de 100644 --- a/code/modules/antagonists/heretic/magic/fire_blast.dm +++ b/code/modules/antagonists/heretic/magic/fire_blast.dm @@ -12,7 +12,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS - invocation = "Eld'fjall!" + invocation = "V'LC'N!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE channel_time = 5 SECONDS diff --git a/code/modules/antagonists/heretic/magic/flesh_ascension.dm b/code/modules/antagonists/heretic/magic/flesh_ascension.dm index add0704a8d61a..a2d792080e058 100644 --- a/code/modules/antagonists/heretic/magic/flesh_ascension.dm +++ b/code/modules/antagonists/heretic/magic/flesh_ascension.dm @@ -9,7 +9,7 @@ school = SCHOOL_FORBIDDEN - invocation = "REALITAS EXSERPAT!!" + invocation = "REALITY UNCOIL!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/flesh_surgery.dm b/code/modules/antagonists/heretic/magic/flesh_surgery.dm index a486b986cd81e..ff474f063198f 100644 --- a/code/modules/antagonists/heretic/magic/flesh_surgery.dm +++ b/code/modules/antagonists/heretic/magic/flesh_surgery.dm @@ -11,8 +11,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - invocation = "Carnis chirurgia" - invocation_type = INVOCATION_WHISPER + invocation = "CL'M M'N!" // "CLAIM MINE", but also almost "KALI MA" + invocation_type = INVOCATION_SHOUT spell_requirements = NONE hand_path = /obj/item/melee/touch_attack/flesh_surgery diff --git a/code/modules/antagonists/heretic/magic/furious_steel.dm b/code/modules/antagonists/heretic/magic/furious_steel.dm index 36c7c07608bcb..0ab882a9289e1 100644 --- a/code/modules/antagonists/heretic/magic/furious_steel.dm +++ b/code/modules/antagonists/heretic/magic/furious_steel.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 60 SECONDS - invocation = "Ham'sana-qasep!" + invocation = "F'LSH'NG S'LV'R!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/manse_link.dm b/code/modules/antagonists/heretic/magic/manse_link.dm index e077c6db2b45f..06fd4dd9863f4 100644 --- a/code/modules/antagonists/heretic/magic/manse_link.dm +++ b/code/modules/antagonists/heretic/magic/manse_link.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - invocation = "Diaperaste' to-myalo!" + invocation = "PI'RC' TH' M'ND." invocation_type = INVOCATION_SHOUT spell_requirements = NONE antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index 803bdd3d218e5..43dde25374f89 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -10,7 +10,7 @@ school = SCHOOL_EVOCATION cooldown_time = 10 SECONDS - invocation = "Ad verum per aspera!" + invocation = "R'CH T'H TR'TH!" invocation_type = INVOCATION_SHOUT // Mimes can cast it. Chaplains can cast it. Anyone can cast it, so long as they have a hand. spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION diff --git a/code/modules/antagonists/heretic/magic/mind_gate.dm b/code/modules/antagonists/heretic/magic/mind_gate.dm index aa6b8ef20af4d..c5a6e74452a61 100644 --- a/code/modules/antagonists/heretic/magic/mind_gate.dm +++ b/code/modules/antagonists/heretic/magic/mind_gate.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - invocation = "Sha'ar ha-da'at" + invocation = "Op' 'oY 'Mi'd" invocation_type = INVOCATION_WHISPER spell_requirements = NONE cast_range = 6 diff --git a/code/modules/antagonists/heretic/magic/moon_parade.dm b/code/modules/antagonists/heretic/magic/moon_parade.dm index 4919500e351de..3b7f1d007cd6e 100644 --- a/code/modules/antagonists/heretic/magic/moon_parade.dm +++ b/code/modules/antagonists/heretic/magic/moon_parade.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "Tsiyun' levani!" + invocation = "L'N'R P'RAD" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/moon_ringleader.dm b/code/modules/antagonists/heretic/magic/moon_ringleader.dm index e62c34bb990bb..3c0b1d2aedb52 100644 --- a/code/modules/antagonists/heretic/magic/moon_ringleader.dm +++ b/code/modules/antagonists/heretic/magic/moon_ringleader.dm @@ -12,7 +12,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 1 MINUTES - invocation = "Manahel-qomem!" + invocation = "R''S 'E" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm index 236fd257e385d..35f2d77e3e6b6 100644 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -12,7 +12,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - invocation = "Hiyuk-levana!" + invocation = "Mo'N S'M'LE" invocation_type = INVOCATION_SHOUT spell_requirements = NONE cast_range = 6 diff --git a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm index 8a9b60644b6b7..4e37f5db17fed 100644 --- a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm +++ b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 1 MINUTES - invocation = "Dyrth-a Vaktry'ggjandi" + invocation = "GL'RY T' TH' N'GHT'W'TCH'ER" invocation_type = INVOCATION_WHISPER spell_requirements = SPELL_REQUIRES_HUMAN diff --git a/code/modules/antagonists/heretic/magic/realignment.dm b/code/modules/antagonists/heretic/magic/realignment.dm index dbce0fe0940dd..d3ddc03fbbef3 100644 --- a/code/modules/antagonists/heretic/magic/realignment.dm +++ b/code/modules/antagonists/heretic/magic/realignment.dm @@ -14,8 +14,8 @@ cooldown_reduction_per_rank = -6 SECONDS // we're not a wizard spell but we use the levelling mechanic spell_max_level = 10 // we can get up to / over a minute duration cd time - invocation = "Rasut" - invocation_type = INVOCATION_WHISPER + invocation = "R'S'T." + invocation_type = INVOCATION_SHOUT spell_requirements = NONE /datum/action/cooldown/spell/realignment/is_valid_target(atom/cast_on) diff --git a/code/modules/antagonists/heretic/magic/rust_wave.dm b/code/modules/antagonists/heretic/magic/rust_wave.dm index 7ecb3fd0ffbba..0282a32b2b687 100644 --- a/code/modules/antagonists/heretic/magic/rust_wave.dm +++ b/code/modules/antagonists/heretic/magic/rust_wave.dm @@ -13,8 +13,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "Entro'pichniy-plim!" - invocation_type = INVOCATION_SHOUT + invocation = "'NTR'P'C PL'M'" + invocation_type = INVOCATION_WHISPER spell_requirements = NONE cone_levels = 5 @@ -78,8 +78,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 35 SECONDS - invocation = "Diffunde' verbum!" - invocation_type = INVOCATION_SHOUT + invocation = "SPR'D TH' WO'D" + invocation_type = INVOCATION_WHISPER spell_requirements = NONE projectile_type = /obj/projectile/magic/aoe/rust_wave diff --git a/code/modules/antagonists/heretic/magic/star_blast.dm b/code/modules/antagonists/heretic/magic/star_blast.dm index 294608a03b998..3eb62b7ada814 100644 --- a/code/modules/antagonists/heretic/magic/star_blast.dm +++ b/code/modules/antagonists/heretic/magic/star_blast.dm @@ -10,7 +10,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - invocation = "Pi-rig is'zara!" + invocation = "R'T'T' ST'R!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/star_touch.dm b/code/modules/antagonists/heretic/magic/star_touch.dm index dff56df4e3f1f..89c5d02e7d498 100644 --- a/code/modules/antagonists/heretic/magic/star_touch.dm +++ b/code/modules/antagonists/heretic/magic/star_touch.dm @@ -13,7 +13,7 @@ sound = 'sound/items/welder.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 15 SECONDS - invocation = "An'gar sig!" + invocation = "ST'R 'N'RG'!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE antimagic_flags = MAGIC_RESISTANCE diff --git a/code/modules/antagonists/heretic/magic/void_cold_cone.dm b/code/modules/antagonists/heretic/magic/void_cold_cone.dm index 40dc9612a50f6..92c45dc10b010 100644 --- a/code/modules/antagonists/heretic/magic/void_cold_cone.dm +++ b/code/modules/antagonists/heretic/magic/void_cold_cone.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "Sunya'kop!" + invocation = "FR'ZE!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/void_phase.dm b/code/modules/antagonists/heretic/magic/void_phase.dm index f3f0864224c4c..350ca0f29c100 100644 --- a/code/modules/antagonists/heretic/magic/void_phase.dm +++ b/code/modules/antagonists/heretic/magic/void_phase.dm @@ -12,8 +12,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "Sunya'sthiti!" - invocation_type = INVOCATION_SHOUT + invocation = "RE'L'TY PH'S'E." + invocation_type = INVOCATION_WHISPER spell_requirements = NONE cast_range = 9 diff --git a/code/modules/antagonists/heretic/magic/void_pull.dm b/code/modules/antagonists/heretic/magic/void_pull.dm index dc4673b0714ce..2021bf8a04e4f 100644 --- a/code/modules/antagonists/heretic/magic/void_pull.dm +++ b/code/modules/antagonists/heretic/magic/void_pull.dm @@ -11,8 +11,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 40 SECONDS - invocation = "Sunya'apamkti!" - invocation_type = INVOCATION_SHOUT + invocation = "BR'NG F'RTH TH'M T' M'." + invocation_type = INVOCATION_WHISPER spell_requirements = NONE aoe_radius = 7 diff --git a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm index b9502f08967bb..3b78b56ddc0ba 100644 --- a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm +++ b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm @@ -11,8 +11,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 5 MINUTES - invocation = "Kher' Sekh-em waaef'k!" - invocation_type = INVOCATION_SHOUT + invocation = "F'K 'FF." + invocation_type = INVOCATION_WHISPER spell_requirements = NONE aoe_radius = 3 diff --git a/code/modules/antagonists/spy/spy.dm b/code/modules/antagonists/spy/spy.dm index 8bcc113f08939..2468eb27cad3f 100644 --- a/code/modules/antagonists/spy/spy.dm +++ b/code/modules/antagonists/spy/spy.dm @@ -8,6 +8,8 @@ hijack_speed = 1 ui_name = "AntagInfoSpy" preview_outfit = /datum/outfit/spy + can_assign_self_objectives = TRUE + default_custom_objective = "Rob the station blind." /// Whether an uplink has been created (successfully or at all) var/uplink_created = FALSE /// String displayed in the antag panel pointing the spy to where their uplink is. diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 733e22461c795..bbdfa77eceacd 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -47,7 +47,8 @@ /// The uplink handler that this traitor belongs to. var/datum/uplink_handler/uplink_handler - var/uplink_sale_count = 3 + var/uplink_sales_min = 4 + var/uplink_sales_max = 6 ///the final objective the traitor has to accomplish, be it escaping, hijacking, or just martyrdom. var/datum/objective/ending_objective @@ -98,14 +99,14 @@ var/list/uplink_items = list() for(var/datum/uplink_item/item as anything in SStraitor.uplink_items) - if(item.item && !item.cant_discount && (item.purchasable_from & uplink_handler.uplink_flag) && item.cost > 1) + if(item.item && !item.cant_discount && (item.purchasable_from & uplink_handler.uplink_flag) && item.cost >= TRAITOR_DISCOUNT_MIN_PRICE) if(!length(item.restricted_roles) && !length(item.restricted_species)) uplink_items += item continue if((uplink_handler.assigned_role in item.restricted_roles) || (uplink_handler.assigned_species in item.restricted_species)) uplink_items += item continue - uplink_handler.extra_purchasable += create_uplink_sales(uplink_sale_count, /datum/uplink_category/discounts, 1, uplink_items) + uplink_handler.extra_purchasable += create_uplink_sales(rand(uplink_sales_min, uplink_sales_max), /datum/uplink_category/discounts, 1, uplink_items) if(give_objectives) forge_traitor_objectives() diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index f78ddb0247892..2d27f3c4a0eff 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -126,6 +126,21 @@ on_update() return TRUE +/datum/uplink_handler/proc/purchase_raw_tc(mob/user, amount, atom/movable/source) + if(shop_locked) + return FALSE + if(telecrystals < amount) + return FALSE + + telecrystals -= amount + var/tcs = new /obj/item/stack/telecrystal(get_turf(user), amount) + user.put_in_hands(tcs) + + log_uplink("[key_name(user)] purchased [amount] raw telecrystals from [source]'s uplink") + on_update() + return TRUE + + /// Generates objectives for this uplink handler /datum/uplink_handler/proc/generate_objectives() var/potential_objectives_left = maximum_potential_objectives - (length(potential_objectives) + length(active_objectives)) diff --git a/code/modules/asset_cache/assets/uplink.dm b/code/modules/asset_cache/assets/uplink.dm index e85ee1b35b5c1..35a907a234dfa 100644 --- a/code/modules/asset_cache/assets/uplink.dm +++ b/code/modules/asset_cache/assets/uplink.dm @@ -18,10 +18,13 @@ for(var/datum/uplink_item/item_path as anything in subtypesof(/datum/uplink_item)) var/datum/uplink_item/item = new item_path() + var/atom/actual_item = item.item if(item.item) { items += list(list( "id" = item_path, "name" = item.name, + "icon" = actual_item.icon, + "icon_state" = actual_item.icon_state, "cost" = item.cost, "desc" = item.desc, "category" = item.category ? initial(item.category.name) : null, diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 25217de538ce1..da6c75d699d08 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -6,7 +6,7 @@ desc = "Very useful for filtering gasses." can_unwrench = TRUE - construction_type = /obj/item/pipe/trinary/flippable + construction_type = /obj/item/pipe/trinary/flippable/filter pipe_state = "filter" ///Rate of transfer of the gases to the outputs diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 02f0d20354496..8a165830cec07 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -5,7 +5,7 @@ name = "air vent" desc = "Has a valve and pump attached to it." - + construction_type = /obj/item/pipe/directional/vent use_power = IDLE_POWER_USE idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.15 can_unwrench = TRUE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 20a0b86b41c29..22ee2f6b414a7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -3,6 +3,7 @@ name = "air scrubber" desc = "Has a valve and pump attached to it." + construction_type = /obj/item/pipe/directional/scrubber use_power = IDLE_POWER_USE idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.1 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.15 diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 9729c0871451a..210eb9b0d9e28 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -51,6 +51,10 @@ AddElement(/datum/element/elevation, pixel_shift = 8) register_context() +/obj/machinery/portable_atmospherics/on_construction(mob/user) + . = ..() + set_anchored(FALSE) + /obj/machinery/portable_atmospherics/on_deconstruction(disassembled) if(nob_crystal_inserted) new /obj/item/hypernoblium_crystal(src) diff --git a/code/modules/bitrunning/components/avatar_connection.dm b/code/modules/bitrunning/components/avatar_connection.dm index 51263c339319e..abf3a7809fcda 100644 --- a/code/modules/bitrunning/components/avatar_connection.dm +++ b/code/modules/bitrunning/components/avatar_connection.dm @@ -20,7 +20,7 @@ help_text, ) - if(!isliving(parent) || !isliving(old_body) || !server.is_operational || !pod.is_operational) + if(!isliving(parent) || !isliving(old_body) || !old_mind || !server.is_operational || !pod.is_operational) return COMPONENT_INCOMPATIBLE var/mob/living/avatar = parent @@ -66,6 +66,9 @@ if(alias && avatar.real_name != alias) avatar.fully_replace_character_name(avatar.real_name, alias) + for(var/skill_type in old_mind.known_skills) + avatar.mind.set_experience(skill_type, old_mind.get_skill_exp(skill_type), silent = TRUE) + avatar.playsound_local(avatar, 'sound/magic/blink.ogg', 25, TRUE) avatar.set_static_vision(2 SECONDS) avatar.set_temp_blindness(1 SECONDS) // I'm in @@ -281,6 +284,10 @@ if(isnull(old_mind) || isnull(old_body)) return + for(var/skill_type in avatar.mind.known_skills) + old_mind.set_experience(skill_type, avatar.mind.get_skill_exp(skill_type), silent = TRUE) + avatar.mind.set_experience(skill_type, 0, silent = TRUE) + ghost.mind = old_mind if(old_body.stat != DEAD) old_mind.transfer_to(old_body, force_key_move = TRUE) diff --git a/code/modules/cargo/exports/fish.dm b/code/modules/cargo/exports/fish.dm index 3860dff904b19..9c34fd3afcaeb 100644 --- a/code/modules/cargo/exports/fish.dm +++ b/code/modules/cargo/exports/fish.dm @@ -6,8 +6,4 @@ /datum/export/fish/get_cost(obj/item/fish/fish, apply_elastic) var/elastic_cost = ..() var/elastic_percent = elastic_cost / init_cost - var/size_weight_exponentation = (fish.size * fish.weight * 0.01)^0.85 - var/new_cost = elastic_cost + size_weight_exponentation * elastic_percent - if(HAS_TRAIT(fish, TRAIT_FISH_FROM_CASE)) //Avoid printing money by simply ordering fish and sending it back. - new_cost *= 0.05 - return round(new_cost) + return fish.get_export_price(elastic_cost, elastic_percent) diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 6cc44fc143937..f1d13fc92c224 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -421,18 +421,22 @@ insert(turf_underneath, holder) /obj/structure/closet/supplypod/insert(atom/to_insert, atom/movable/holder) - if(insertion_allowed(to_insert)) - if(isturf(to_insert)) - var/turf/turf_to_insert = to_insert - turfs_in_cargo += turf_to_insert.type - turf_to_insert.ScrapeAway() - else - var/atom/movable/movable_to_insert = to_insert - movable_to_insert.forceMove(holder) - return TRUE - else + if(!insertion_allowed(to_insert)) return FALSE + if(isturf(to_insert)) + var/turf/turf_to_insert = to_insert + turfs_in_cargo += turf_to_insert.type + turf_to_insert.ScrapeAway() + return TRUE + + var/atom/movable/movable_to_insert = to_insert + if (ismob(movable_to_insert)) + var/mob/mob_to_insert = movable_to_insert + if (!isnull(mob_to_insert.buckled)) + mob_to_insert.buckled.unbuckle_mob(mob_to_insert, force = TRUE) + movable_to_insert.forceMove(holder) + /obj/structure/closet/supplypod/insertion_allowed(atom/to_insert) if(to_insert.invisibility == INVISIBILITY_ABSTRACT) return FALSE diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index 4d19d2b3658a2..a8247a55603e2 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -210,19 +210,14 @@ name = "rice hat" desc = "Welcome to the rice fields, motherfucker." icon_state = "rice_hat" + base_icon_state = "rice_hat" var/reversed = FALSE - ///Sprite while worn normaly. - var/frontsprite = "rice_hat" - ///Sprite while worn in reverse - var/reversesprite = "rice_hat_kim" - -/obj/item/clothing/head/costume/rice_hat/attack_self(mob/user) - if(reversed) - icon_state = frontsprite - to_chat(user, span_notice("You raise the hat.")) - else - icon_state = reversesprite - to_chat(user, span_notice("You lower the hat.")) + +/obj/item/clothing/head/costume/rice_hat/click_alt(mob/user) + reversed = !reversed + worn_icon_state = "[base_icon_state][reversed ? "_kim" : ""]" + to_chat(user, span_notice("You [reversed ? "lower" : "raise"] the hat.")) + update_appearance() /obj/item/clothing/head/costume/lizard name = "lizardskin cloche hat" diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 3003e9a76ee15..cb0f9033960c3 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -169,6 +169,7 @@ clothing_flags = SNUG_FIT resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE dog_fashion = null + clothing_traits = list(TRAIT_SCARY_FISHERMAN) //Fish, carps, lobstrosities and frogs fear me. /obj/item/clothing/head/soft/fishing_hat/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 38bb028fa1edd..53026e974bf63 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -222,6 +222,21 @@ icon_state = "durathread-fake" inhand_icon_state = null armor_type = /datum/armor/robe_durathread + allowed = list( + /obj/item/cultivator, + /obj/item/geneshears, + /obj/item/graft, + /obj/item/hatchet, + /obj/item/plant_analyzer, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/bottle, + /obj/item/reagent_containers/cup/tube, + /obj/item/reagent_containers/spray/pestspray, + /obj/item/reagent_containers/spray/plantbgone, + /obj/item/secateurs, + /obj/item/seeds, + /obj/item/storage/bag/plants, + ) /datum/armor/robe_durathread melee = 15 diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index 081f794029041..19a20a40a816b 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -627,6 +627,14 @@ fish_zap_flags |= (ZAP_GENERATES_POWER | ZAP_MOB_STUN) tesla_zap(source = get_turf(src), zap_range = fish_zap_range, power = fish_zap_power, cutoff = 1 MEGA JOULES, zap_flags = fish_zap_flags) +///Returns the price of this fish, for the fish export. +/obj/item/fish/proc/get_export_price(price, percent) + var/size_weight_exponentation = (size * weight * 0.01)^0.85 + var/calculated_price = price + size_weight_exponentation * percent + if(HAS_TRAIT(src, TRAIT_FISH_FROM_CASE)) //Avoid printing money by simply ordering fish and sending it back. + calculated_price *= 0.05 + return round(calculated_price) + /// Returns random fish, using random_case_rarity probabilities. /proc/random_fish_type(required_fluid) var/static/probability_table diff --git a/code/modules/fishing/fish/fish_types.dm b/code/modules/fishing/fish/fish_types.dm index 11f9ab317d25b..ce9f36f0553d6 100644 --- a/code/modules/fishing/fish/fish_types.dm +++ b/code/modules/fishing/fish/fish_types.dm @@ -81,6 +81,55 @@ required_temperature_max = MIN_AQUARIUM_TEMP+30 beauty = FISH_BEAUTY_GOOD +/obj/item/fish/tadpole + name = "tadpole" + desc = "The larval spawn of an amphibian. A very minuscle, round creature with a long tail it uses to swim around." + icon_state = "tadpole" + dedicated_in_aquarium_icon_state = "tadpole small" + average_size = 3 + average_weight = 10 + sprite_width = 3 + sprite_height = 1 + health = 50 + feeding_frequency = 1.5 MINUTES + required_temperature_min = MIN_AQUARIUM_TEMP+15 + required_temperature_max = MIN_AQUARIUM_TEMP+20 + fillet_type = null + fish_traits = list(/datum/fish_trait/no_mating) //They grow into frogs and that's it. + beauty = FISH_BEAUTY_NULL + random_case_rarity = FISH_RARITY_NOPE //Why would you want generic frog tadpoles you get from ponds inside fish cases? + /// Once dead, tadpoles disappear after a dozen seconds, since you can get infinite tadpoles. + var/del_timerid + +/obj/item/fish/tadpole/Initialize(mapload, apply_qualities = TRUE) + . = ..() + AddComponent(/datum/component/fish_growth, /mob/living/basic/frog, 100 / rand(2.5, 3 MINUTES) * 10) + RegisterSignal(src, COMSIG_FISH_BEFORE_GROWING, PROC_REF(growth_checks)) + RegisterSignal(src, COMSIG_FISH_FINISH_GROWING, PROC_REF(on_growth)) + +/obj/item/fish/tadpole/set_status(new_status) + . = ..() + if(status == FISH_DEAD) + del_timerid = QDEL_IN_STOPPABLE(src, 12 SECONDS) + else + deltimer(del_timerid) + +/obj/item/fish/tadpole/proc/growth_checks(datum/source, seconds_per_tick) + SIGNAL_HANDLER + var/hunger = CLAMP01((world.time - last_feeding) / feeding_frequency) + if(hunger >= 0.7) //too hungry to grow + return COMPONENT_DONT_GROW + var/obj/structure/aquarium/aquarium = loc + if(!aquarium.allow_breeding) //the aquarium has breeding disabled + return COMPONENT_DONT_GROW + +/obj/item/fish/tadpole/proc/on_growth(datum/source, mob/living/basic/frog/result) + SIGNAL_HANDLER + playsound(result, result.attack_sound, 50, TRUE) // reeeeeeeeeeeeeee... + +/obj/item/fish/tadpole/get_export_price(price, percent) + return 2 //two credits. Tadpoles aren't really that valueable. + // Saltwater fish below /obj/item/fish/clownfish @@ -270,8 +319,6 @@ evolution_types = list(/datum/fish_evolution/ice_chrab) compatible_types = list(/obj/item/fish/chasm_crab/ice) beauty = FISH_BEAUTY_GOOD - ///Chasm crabs mature into juveline lobstrositiess with time. This is the progess from 0 to 100 - var/maturation = 0 ///This value represents how much the crab needs aren't being met. Higher values translate to a more likely hostile lobstrosity. var/anger = 0 ///The lobstrosity type this matures into @@ -279,6 +326,11 @@ ///at which rate the crab gains maturation var/growth_rate = 100 / (10 MINUTES) * 10 +/obj/item/fish/chasm_crab/Initialize(mapload, apply_qualities = TRUE) + . = ..() + RegisterSignal(src, COMSIG_FISH_BEFORE_GROWING, PROC_REF(growth_checks)) + RegisterSignal(src, COMSIG_FISH_FINISH_GROWING, PROC_REF(on_growth)) + ///A chasm crab growth speed is determined by its initial weight and size, ergo bigger crabs for faster lobstrosities /obj/item/fish/chasm_crab/update_size_and_weight(new_size = average_size, new_weight = average_weight) . = ..() @@ -298,62 +350,41 @@ else if(weight >= 1500) multiplier += min(0.1 * round((weight - 1000) / 500), 2) - growth_rate = initial(growth_rate) * multiplier - -/obj/item/fish/chasm_crab/process(seconds_per_tick) - . = ..() - grow_up(seconds_per_tick) + AddComponent(/datum/component/fish_growth, lob_type, initial(growth_rate) * multiplier) -///Slowly grow up each process tick (in an aquarium). This is its own proc so that it can be used in the unit test. -/obj/item/fish/chasm_crab/proc/grow_up(seconds_per_tick) +/obj/item/fish/chasm_crab/proc/growth_checks(datum/source, seconds_per_tick) + SIGNAL_HANDLER var/hunger = CLAMP01((world.time - last_feeding) / feeding_frequency) if(health <= initial(health) * 0.6 || hunger >= 0.6) //if too hurt or hungry, don't grow. anger += growth_rate * 2 * seconds_per_tick - return + return COMPONENT_DONT_GROW + + if(hunger >= 0.4) //I'm hungry and angry + anger += growth_rate * 0.6 * seconds_per_tick - if(!isaquarium(loc)) //can't grow outside an aquarium. + if(!isaquarium(loc)) return var/obj/structure/aquarium/aquarium = loc if(!aquarium.allow_breeding) //the aquarium has breeding disabled - return - if(hunger >= 0.4) //I'm hungry and angry - anger += growth_rate * 0.6 * seconds_per_tick + return COMPONENT_DONT_GROW if(!locate(/obj/item/aquarium_prop) in aquarium) //the aquarium deco is quite barren anger += growth_rate * 0.25 * seconds_per_tick var/fish_count = length(aquarium.get_fishes()) if(!ISINRANGE(fish_count, 3, AQUARIUM_MAX_BREEDING_POPULATION * 0.5)) //too lonely or overcrowded anger += growth_rate * 0.3 * seconds_per_tick - if(fish_count <= AQUARIUM_MAX_BREEDING_POPULATION * 0.5) //check if there's enough room to maturate. - maturation += growth_rate * seconds_per_tick - - if(maturation >= 100) - return finish_growing() - -///spawn a juvenile lobstrosity on the aquarium turf -/obj/item/fish/chasm_crab/proc/finish_growing() - var/mob/living/basic/mining/lobstrosity/juvenile/lob = new lob_type(get_turf(src)) - for(var/trait_type in fish_traits) - var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] - trait.apply_to_mob(lob) + if(fish_count > AQUARIUM_MAX_BREEDING_POPULATION * 0.5) //check if there's enough room to maturate. + return COMPONENT_DONT_GROW + +/obj/item/fish/chasm_crab/proc/on_growth(datum/source, mob/living/basic/mining/lobstrosity/juvenile/result) + SIGNAL_HANDLER if(!prob(anger)) - lob.AddElement(/datum/element/ai_retaliate) - qdel(lob.ai_controller) - lob.ai_controller = new /datum/ai_controller/basic_controller/lobstrosity/juvenile/calm(lob) + result.AddElement(/datum/element/ai_retaliate) + qdel(result.ai_controller) + result.ai_controller = new /datum/ai_controller/basic_controller/lobstrosity/juvenile/calm(result) else if(anger < 30) //not really that mad, just a bit unstable. - qdel(lob.ai_controller) - lob.ai_controller = new /datum/ai_controller/basic_controller/lobstrosity/juvenile/capricious(lob) - - animate(lob, pixel_y = 18, time = 0.4 SECONDS, flags = ANIMATION_RELATIVE, easing = CUBIC_EASING|EASE_OUT) - animate(pixel_y = -18, time = 0.4 SECONDS, flags = ANIMATION_RELATIVE, easing = CUBIC_EASING|EASE_IN) - loc.visible_message(span_boldnotice("\A [lob] jumps out of [loc]!")) - playsound(loc, 'sound/effects/fish_splash.ogg', 60) - - ///make sure it moves the next tick so that it properly glides to the next location after jumping off the aquarium. - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(random_step), lob, 1, 100), 0.1 SECONDS) - - qdel(src) - return lob + qdel(result.ai_controller) + result.ai_controller = new /datum/ai_controller/basic_controller/lobstrosity/juvenile/capricious(result) /obj/item/fish/chasm_crab/ice name = "arctic chrab" @@ -434,7 +465,7 @@ ) beauty = FISH_BEAUTY_DISGUSTING -/obj/item/fish/ratfish/Initialize(mapload) +/obj/item/fish/ratfish/Initialize(mapload, apply_qualities = TRUE) . = ..() //stable pop reflects the config for how many mice migrate. powerful... stable_population = CONFIG_GET(number/mice_roundstart) @@ -566,7 +597,7 @@ fish_traits = list(/datum/fish_trait/no_mating) //just to be sure, these shouldn't reproduce experisci_scannable = FALSE -/obj/item/fish/holo/Initialize(mapload) +/obj/item/fish/holo/Initialize(mapload, apply_qualities = TRUE) . = ..() var/area/station/holodeck/holo_area = get_area(src) if(!istype(holo_area)) @@ -655,7 +686,7 @@ fish_traits = list(/datum/fish_trait/antigrav, /datum/fish_trait/mixotroph) beauty = FISH_BEAUTY_GREAT -/obj/item/fish/starfish/Initialize(mapload) +/obj/item/fish/starfish/Initialize(mapload, apply_qualities = TRUE) . = ..() update_appearance(UPDATE_OVERLAYS) @@ -693,7 +724,7 @@ ///maximum bonus damage when winded up var/maximum_bonus = 25 -/obj/item/fish/lavaloop/Initialize(mapload) +/obj/item/fish/lavaloop/Initialize(mapload, apply_qualities = TRUE) . = ..() ADD_TRAIT(src, TRAIT_BYPASS_RANGED_ARMOR, INNATE_TRAIT) AddComponent(/datum/component/boomerang, throw_range, TRUE) diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index feaa93424f9a8..4a0419f98f55f 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -57,6 +57,11 @@ GLOBAL_LIST_INIT(specific_fish_icons, zebra_typecacheof(list( var/explosive_malus = FALSE /// If explosive_malus is true, this will be used to keep track of the turfs where an explosion happened for when we'll spawn the loot. var/list/exploded_turfs + /// Mindless mobs that can fish will never pull up items on this list + var/static/list/profound_fisher_blacklist = typecacheof(list( + /mob/living/basic/mining/lobstrosity, + /obj/structure/closet/crate/necropolis/tendril, + )) /datum/fish_source/New() if(!PERFORM_ALL_TESTS(focus_only/fish_sources_tables)) @@ -276,6 +281,9 @@ GLOBAL_LIST(fishing_property_cache) var/list/fish_list_properties = collect_fish_properties() + + if(HAS_TRAIT(fisherman, TRAIT_PROFOUND_FISHER) && !fisherman.client) + final_table -= profound_fisher_blacklist for(var/result in final_table) final_table[result] *= rod.hook?.get_hook_bonus_multiplicative(result) final_table[result] += rod.hook?.get_hook_bonus_additive(result)//Decide on order here so it can be multiplicative diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index b568eaf97c3f0..6e115af7df217 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -32,6 +32,8 @@ var/welded_down = FALSE /// The sound of item retrieval var/vend_sound = 'sound/machines/machine_vend.ogg' + /// Whether the UI should be set to list view by default + var/default_list_view = FALSE /obj/machinery/smartfridge/Initialize(mapload) . = ..() @@ -369,7 +371,7 @@ var/atom/movable/atom = item if (!QDELETED(atom)) - var/key = "[atom.type]" + var/key = "[atom.type]-[atom.name]" if (listofitems[key]) listofitems[key]["amount"]++ else @@ -383,6 +385,7 @@ .["contents"] = sort_list(listofitems) .["name"] = name .["isdryer"] = FALSE + .["default_list_view"] = default_list_view /obj/machinery/smartfridge/Exited(atom/movable/gone, direction) // Update the UIs in case something inside is removed . = ..() @@ -400,6 +403,7 @@ if("Release") var/amount = text2num(params["amount"]) var/desired = 1 + var/dispensed_amount = 0 if(isAI(living_mob)) to_chat(living_mob, span_warning("[src] does not respect your authority!")) @@ -413,18 +417,18 @@ for(var/obj/item/dispensed_item in src) if(desired <= 0) break - if(istype(dispensed_item, text2path(params["path"]))) + if(params["path"] == "[dispensed_item.type]-[dispensed_item.name]") if(dispensed_item in component_parts) CRASH("Attempted removal of [dispensed_item] component_part from smartfridge via smartfridge interface.") //dispense the item if(!living_mob.put_in_hands(dispensed_item)) dispensed_item.forceMove(drop_location()) adjust_item_drop_location(dispensed_item) - if(vend_sound) - playsound(src, vend_sound, 50, TRUE, extrarange = -3) use_energy(active_power_usage) + dispensed_amount++ desired-- - + if(dispensed_amount && vend_sound) + playsound(src, vend_sound, 50, TRUE, extrarange = -3) if (visible_contents) update_appearance() return @@ -727,6 +731,7 @@ desc = "A refrigerated storage unit for medicine storage." base_build_path = /obj/machinery/smartfridge/chemistry contents_overlay_icon = "chem" + default_list_view = TRUE /obj/machinery/smartfridge/chemistry/accept_check(obj/item/weapon) // not an item or reagent container @@ -777,6 +782,7 @@ desc = "A refrigerated storage unit for volatile sample storage." base_build_path = /obj/machinery/smartfridge/chemistry/virology contents_overlay_icon = "viro" + default_list_view = TRUE /obj/machinery/smartfridge/chemistry/virology/preloaded initial_contents = list( diff --git a/code/modules/hydroponics/grown/aloe.dm b/code/modules/hydroponics/grown/aloe.dm index cfbefce6dba21..0548098732622 100644 --- a/code/modules/hydroponics/grown/aloe.dm +++ b/code/modules/hydroponics/grown/aloe.dm @@ -1,7 +1,7 @@ // aloe /obj/item/seeds/aloe - name = "pack of aloe seeds" + name = "aloe seed pack" desc = "These seeds grow into aloe." icon_state = "seed-aloe" species = "aloe" diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index 2becc390f3980..92cdc2d62c8c1 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -11,7 +11,7 @@ // Ambrosia Vulgaris /obj/item/seeds/ambrosia - name = "pack of ambrosia vulgaris seeds" + name = "ambrosia vulgaris seed pack" desc = "These seeds grow into common ambrosia, a plant grown by and from medicine." icon_state = "seed-ambrosiavulgaris" plant_icon_offset = 0 @@ -36,7 +36,7 @@ // Ambrosia Deus /obj/item/seeds/ambrosia/deus - name = "pack of ambrosia deus seeds" + name = "ambrosia deus seed pack" desc = "These seeds grow into ambrosia deus. Could it be the food of the gods..?" icon_state = "seed-ambrosiadeus" species = "ambrosiadeus" @@ -55,7 +55,7 @@ //Ambrosia Gaia /obj/item/seeds/ambrosia/gaia - name = "pack of ambrosia gaia seeds" + name = "ambrosia gaia seed pack" desc = "These seeds grow into ambrosia gaia, filled with infinite potential." icon_state = "seed-ambrosia_gaia" species = "ambrosia_gaia" diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 0079f63ec9023..c1739cc7dea82 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -1,6 +1,6 @@ // Apple /obj/item/seeds/apple - name = "pack of apple seeds" + name = "apple seed pack" desc = "These seeds grow into apple trees." icon_state = "seed-apple" species = "apple" @@ -31,7 +31,7 @@ // Gold Apple /obj/item/seeds/apple/gold - name = "pack of golden apple seeds" + name = "golden apple seed pack" desc = "These seeds grow into golden apple trees. Good thing there are no firebirds in space." icon_state = "seed-goldapple" species = "goldapple" diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index ab38f6889907a..6e09ee3497cdd 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -1,6 +1,6 @@ // Banana /obj/item/seeds/banana - name = "pack of banana seeds" + name = "banana seed pack" desc = "They're seeds that grow into banana trees. When grown, keep away from clown." icon_state = "seed-banana" species = "banana" @@ -91,7 +91,7 @@ // Mimana - invisible sprites are totally a feature! /obj/item/seeds/banana/mime - name = "pack of mimana seeds" + name = "mimana seed pack" desc = "They're seeds that grow into mimana trees. When grown, keep away from mime." icon_state = "seed-mimana" species = "mimana" @@ -119,7 +119,7 @@ // Bluespace Banana /obj/item/seeds/banana/bluespace - name = "pack of bluespace banana seeds" + name = "bluespace banana seed pack" desc = "They're seeds that grow into bluespace banana trees. When grown, keep away from bluespace clown." icon_state = "seed-banana-blue" species = "bluespacebanana" diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index 974b19889ecba..885eb77c0c695 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -1,6 +1,6 @@ // Soybeans /obj/item/seeds/soya - name = "pack of soybean seeds" + name = "soybean seed pack" desc = "These seeds grow into soybean plants." icon_state = "seed-soybean" species = "soybean" @@ -30,7 +30,7 @@ // Koibean /obj/item/seeds/soya/koi - name = "pack of koibean seeds" + name = "koibean seed pack" desc = "These seeds grow into koibean plants." icon_state = "seed-koibean" species = "koibean" @@ -63,7 +63,7 @@ //Butterbeans, the beans wid da butta! // Butterbeans! - Squeeze for a single butter slice! /obj/item/seeds/soya/butter - name = "pack of butterbean seeds" + name = "butterbean seed pack" desc = "These seeds grow into butterbean plants." icon_state = "seed-butterbean" species = "butterbean" @@ -94,7 +94,7 @@ // Green Beans /obj/item/seeds/greenbean - name = "pack of green bean seeds" + name = "green bean seed pack" desc = "These seeds grow into green bean plants." icon_state = "seed-greenbean" species = "greenbean" @@ -123,7 +123,7 @@ // Jumping Bean /obj/item/seeds/greenbean/jump - name = "pack of jumping bean seeds" + name = "jumping bean seed pack" desc = "These seeds grow into jumping bean plants." icon_state = "seed-jumpingbean" species = "jumpingbean" diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 317f8ef2ed87f..10631e4dcb0b6 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -1,6 +1,6 @@ // Berries /obj/item/seeds/berry - name = "pack of berry seeds" + name = "berry seed pack" desc = "These seeds grow into berry bushes." icon_state = "seed-berry" species = "berry" @@ -31,7 +31,7 @@ // Poison Berries /obj/item/seeds/berry/poison - name = "pack of poison-berry seeds" + name = "poison-berry seed pack" desc = "These seeds grow into poison-berry bushes." icon_state = "seed-poisonberry" species = "poisonberry" @@ -55,7 +55,7 @@ // Death Berries /obj/item/seeds/berry/death - name = "pack of death-berry seeds" + name = "death-berry seed pack" desc = "These seeds grow into death berries." icon_state = "seed-deathberry" species = "deathberry" @@ -81,7 +81,7 @@ // Glow Berries /obj/item/seeds/berry/glow - name = "pack of glow-berry seeds" + name = "glow-berry seed pack" desc = "These seeds grow into glow-berry bushes." icon_state = "seed-glowberry" species = "glowberry" @@ -108,7 +108,7 @@ // Grapes /obj/item/seeds/grape - name = "pack of grape seeds" + name = "grape seed pack" desc = "These seeds grow into grape vines." icon_state = "seed-grapes" species = "grape" @@ -143,7 +143,7 @@ // Green Grapes /obj/item/seeds/grape/green - name = "pack of green grape seeds" + name = "green grape seed pack" desc = "These seeds grow into green-grape vines." icon_state = "seed-greengrapes" species = "greengrape" @@ -162,7 +162,7 @@ // Toechtauese Berries /obj/item/seeds/toechtauese - name = "pack of töchtaüse berry seeds" + name = "töchtaüse berry seed pack" desc = "These seeds grow into töchtaüse bushes." icon_state = "seed-toechtauese" species = "toechtauese" @@ -190,7 +190,7 @@ distill_reagent = /datum/reagent/toxin/itching_powder /obj/item/seeds/lanternfruit - name = "pack of lanternfruit seeds" + name = "lanternfruit seed pack" desc = "These seeds grow into lanternfruit pods." icon_state = "seed-lanternfruit" species = "lanternfruit" diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index c336f0f4b2456..df2cda24b2d62 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -1,6 +1,6 @@ // Cannabis /obj/item/seeds/cannabis - name = "pack of cannabis seeds" + name = "cannabis seed pack" desc = "Taxable." icon_state = "seed-cannabis" plant_icon_offset = 6 @@ -24,7 +24,7 @@ /obj/item/seeds/cannabis/rainbow - name = "pack of rainbow weed seeds" + name = "rainbow weed seed pack" desc = "These seeds grow into rainbow weed. Groovy... and also highly addictive." icon_state = "seed-megacannabis" icon_grow = "megacannabis-grow" @@ -36,7 +36,7 @@ rarity = 40 /obj/item/seeds/cannabis/death - name = "pack of deathweed seeds" + name = "deathweed seed pack" desc = "These seeds grow into deathweed. Not groovy." icon_state = "seed-blackcannabis" icon_grow = "blackcannabis-grow" @@ -48,7 +48,7 @@ rarity = 40 /obj/item/seeds/cannabis/white - name = "pack of lifeweed seeds" + name = "lifeweed seed pack" desc = "I will give unto him that is munchies of the fountain of the cravings of life, freely." icon_state = "seed-whitecannabis" icon_grow = "whitecannabis-grow" @@ -62,7 +62,7 @@ /obj/item/seeds/cannabis/ultimate - name = "pack of omega weed seeds" + name = "omega weed seed pack" desc = "These seeds grow into omega weed." icon_state = "seed-ocannabis" plant_icon_offset = 0 diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 744c0dc5b023c..b304382d2dc47 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -1,6 +1,6 @@ // Wheat /obj/item/seeds/wheat - name = "pack of wheat seeds" + name = "wheat seed pack" desc = "These may, or may not, grow into wheat." icon_state = "seed-wheat" species = "wheat" @@ -30,7 +30,7 @@ // Oat /obj/item/seeds/wheat/oat - name = "pack of oat seeds" + name = "oat seed pack" desc = "These may, or may not, grow into oat." icon_state = "seed-oat" species = "oat" @@ -52,7 +52,7 @@ // Rice /obj/item/seeds/wheat/rice - name = "pack of rice seeds" + name = "rice seed pack" desc = "These may, or may not, grow into rice." icon_state = "seed-rice" species = "rice" @@ -76,7 +76,7 @@ //Meatwheat - grows into synthetic meat /obj/item/seeds/wheat/meat - name = "pack of meatwheat seeds" + name = "meatwheat seed pack" desc = "If you ever wanted to drive a vegetarian to insanity, here's how." icon_state = "seed-meatwheat" species = "meatwheat" diff --git a/code/modules/hydroponics/grown/cherries.dm b/code/modules/hydroponics/grown/cherries.dm index 4ebd42489d96f..ad35bacf8fe71 100644 --- a/code/modules/hydroponics/grown/cherries.dm +++ b/code/modules/hydroponics/grown/cherries.dm @@ -1,6 +1,6 @@ // Cherries /obj/item/seeds/cherry - name = "pack of cherry pits" + name = "cherry pit pack" desc = "Careful not to crack a tooth on one... That'd be the pits." icon_state = "seed-cherry" species = "cherry" @@ -34,7 +34,7 @@ // Blue Cherries /obj/item/seeds/cherry/blue - name = "pack of blue cherry pits" + name = "blue cherry pit pack" desc = "The blue kind of cherries." icon_state = "seed-bluecherry" species = "bluecherry" @@ -57,7 +57,7 @@ //Cherry Bulbs /obj/item/seeds/cherry/bulb - name = "pack of cherry bulb pits" + name = "cherry bulb pit pack" desc = "The glowy kind of cherries." icon_state = "seed-cherrybulb" species = "cherrybulb" @@ -82,7 +82,7 @@ //Cherry Bombs /obj/item/seeds/cherry/bomb - name = "pack of cherry bomb pits" + name = "cherry bomb pit pack" desc = "They give you vibes of dread and frustration." icon_state = "seed-cherry_bomb" species = "cherry_bomb" diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index 9f6d3bbd08ce0..1d9aaa8468ebf 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -1,6 +1,6 @@ // Chili /obj/item/seeds/chili - name = "pack of chili seeds" + name = "chili seed pack" desc = "These seeds grow into chili plants. HOT! HOT! HOT!" icon_state = "seed-chili" species = "chili" @@ -30,7 +30,7 @@ // Ice Chili /obj/item/seeds/chili/ice - name = "pack of chilly pepper seeds" + name = "chilly pepper seed pack" desc = "These seeds grow into chilly pepper plants." icon_state = "seed-icepepper" species = "chiliice" @@ -56,7 +56,7 @@ // Ghost Chili /obj/item/seeds/chili/ghost - name = "pack of ghost chili seeds" + name = "ghost chili seed pack" desc = "These seeds grow into a chili said to be the hottest in the galaxy." icon_state = "seed-chilighost" species = "chilighost" @@ -83,7 +83,7 @@ // Bell Pepper /obj/item/seeds/chili/bell_pepper - name = "pack of bell pepper seeds" + name = "bell pepper seed pack" desc = "These seeds grow into bell pepper plants. MILD! MILD! MILD!" icon_state = "seed-bell-pepper" species = "bellpepper" diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index c624722f82392..6bfc8bc203af5 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -9,7 +9,7 @@ // Lime /obj/item/seeds/lime - name = "pack of lime seeds" + name = "lime seed pack" desc = "These are very sour seeds." icon_state = "seed-lime" species = "lime" @@ -33,7 +33,7 @@ // Orange /obj/item/seeds/orange - name = "pack of orange seeds" + name = "orange seed pack" desc = "Sour seeds." icon_state = "seed-orange" species = "orange" @@ -61,7 +61,7 @@ // Lemon /obj/item/seeds/lemon - name = "pack of lemon seeds" + name = "lemon seed pack" desc = "These are sour seeds." icon_state = "seed-lemon" species = "lemon" @@ -86,7 +86,7 @@ // Combustible lemon /obj/item/seeds/firelemon //combustible lemon is too long so firelemon - name = "pack of combustible lemon seeds" + name = "combustible lemon seed pack" desc = "When life gives you lemons, don't make lemonade. Make life take the lemons back! Get mad! I don't want your damn lemons!" icon_state = "seed-firelemon" species = "firelemon" @@ -112,7 +112,7 @@ //3D Orange /obj/item/seeds/orange_3d - name = "pack of extradimensional orange seeds" + name = "extradimensional orange seed pack" desc = "Polygonal seeds." icon_state = "seed-orange" species = "orange" diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index 4e9a9810b4280..e4b6c916f7cc9 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -1,6 +1,6 @@ // Cocoa Pod /obj/item/seeds/cocoapod - name = "pack of cocoa pod seeds" + name = "cocoa pod seed pack" desc = "These seeds grow into cacao trees. They look fattening." //SIC: cocoa is the seeds. The trees are spelled cacao. icon_state = "seed-cocoapod" species = "cocoapod" @@ -31,7 +31,7 @@ // Vanilla Pod /obj/item/seeds/cocoapod/vanillapod - name = "pack of vanilla pod seeds" + name = "vanilla pod seed pack" desc = "These seeds grow into vanilla trees. They look fattening." icon_state = "seed-vanillapod" species = "vanillapod" @@ -52,7 +52,7 @@ distill_reagent = /datum/reagent/consumable/vanilla //Takes longer, but you can get even more vanilla from it. /obj/item/seeds/cocoapod/bungotree - name = "pack of bungo tree seeds" + name = "bungo tree seed pack" desc = "These seeds grow into bungo trees. They appear to be heavy and almost perfectly spherical." icon_state = "seed-bungotree" plant_icon_offset = 4 diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index d5f9f94e1b2df..02f77280c5ab9 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -1,6 +1,6 @@ // Corn /obj/item/seeds/corn - name = "pack of corn seeds" + name = "corn seed pack" desc = "I don't mean to sound corny..." icon_state = "seed-corn" species = "corn" @@ -57,7 +57,7 @@ // Snapcorn /obj/item/seeds/corn/snapcorn - name = "pack of snapcorn seeds" + name = "snapcorn seed pack" desc = "Oh snap!" icon_state = "seed-snapcorn" species = "snapcorn" @@ -100,7 +100,7 @@ //Pepper-corn - Heh funny. /obj/item/seeds/corn/pepper - name = "pack of pepper-corn seeds" + name = "pepper-corn seed pack" desc = "If Peter picked a pack of pepper-corn..." icon_state = "seed-peppercorn" species = "peppercorn" diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index 819d97f321f8d..c2149b7a33006 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -1,5 +1,5 @@ /obj/item/seeds/cotton - name = "pack of cotton seeds" + name = "cotton seed pack" desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary." icon_state = "seed-cotton" species = "cotton" @@ -45,7 +45,7 @@ //reinforced mutated variant /obj/item/seeds/cotton/durathread - name = "pack of durathread seeds" + name = "durathread seed pack" desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly." icon_state = "seed-durathread" species = "durathread" diff --git a/code/modules/hydroponics/grown/cucumber.dm b/code/modules/hydroponics/grown/cucumber.dm index f3712c6a5c90a..a8487a0cac9bc 100644 --- a/code/modules/hydroponics/grown/cucumber.dm +++ b/code/modules/hydroponics/grown/cucumber.dm @@ -1,6 +1,6 @@ // CUCUMBERS YEAH /obj/item/seeds/cucumber - name = "pack of cucumber seeds" + name = "cucumber seed pack" desc = "These seeds grow into cucumber plants." icon_state = "seed-cucumber" species = "cucumber" diff --git a/code/modules/hydroponics/grown/eggplant.dm b/code/modules/hydroponics/grown/eggplant.dm index d4b38c3438bdb..47cbc6d934cd3 100644 --- a/code/modules/hydroponics/grown/eggplant.dm +++ b/code/modules/hydroponics/grown/eggplant.dm @@ -1,6 +1,6 @@ // Eggplant /obj/item/seeds/eggplant - name = "pack of eggplant seeds" + name = "eggplant seed pack" desc = "These seeds grow to produce berries that look nothing like eggs." icon_state = "seed-eggplant" species = "eggplant" @@ -25,7 +25,7 @@ // Egg-Plant /obj/item/seeds/eggplant/eggy - name = "pack of egg-plant seeds" + name = "egg-plant seed pack" desc = "These seeds grow to produce berries that look a lot like eggs." icon_state = "seed-eggy" species = "eggy" diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 84b1414335caf..d4ef53474fc97 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -1,6 +1,6 @@ // Poppy /obj/item/seeds/poppy - name = "pack of poppy seeds" + name = "poppy seed pack" desc = "These seeds grow into poppies." icon_state = "seed-poppy" species = "poppy" @@ -32,7 +32,7 @@ // Lily /obj/item/seeds/poppy/lily - name = "pack of lily seeds" + name = "lily seed pack" desc = "These seeds grow into lilies." icon_state = "seed-lily" species = "lily" @@ -52,7 +52,7 @@ //Spacemans's Trumpet /obj/item/seeds/poppy/lily/trumpet - name = "pack of spaceman's trumpet seeds" + name = "spaceman's trumpet seed pack" desc = "A plant sculped by extensive genetic engineering. The spaceman's trumpet is said to bear no resemblance to its wild ancestors. Inside NT AgriSci circles it is better known as NTPW-0372." icon_state = "seed-trumpet" species = "spacemanstrumpet" @@ -86,7 +86,7 @@ // Geranium /obj/item/seeds/poppy/geranium - name = "pack of geranium seeds" + name = "geranium seed pack" desc = "These seeds grow into geranium." icon_state = "seed-geranium" species = "geranium" @@ -106,7 +106,7 @@ ///Fraxinella seeds. /obj/item/seeds/poppy/geranium/fraxinella - name = "pack of fraxinella seeds" + name = "fraxinella seed pack" desc = "These seeds grow into fraxinella." icon_state = "seed-fraxinella" species = "fraxinella" @@ -130,7 +130,7 @@ // Harebell /obj/item/seeds/harebell - name = "pack of harebell seeds" + name = "harebell seed pack" desc = "These seeds grow into pretty little flowers." icon_state = "seed-harebell" plant_icon_offset = 1 @@ -162,7 +162,7 @@ // Sunflower /obj/item/seeds/sunflower - name = "pack of sunflower seeds" + name = "sunflower seed pack" desc = "These seeds grow into sunflowers." icon_state = "seed-sunflower" species = "sunflower" @@ -203,7 +203,7 @@ // Moonflower /obj/item/seeds/sunflower/moonflower - name = "pack of moonflower seeds" + name = "moonflower seed pack" desc = "These seeds grow into moonflowers." icon_state = "seed-moonflower" lefthand_file = 'icons/mob/inhands/items/food_lefthand.dmi' @@ -231,7 +231,7 @@ // Novaflower /obj/item/seeds/sunflower/novaflower - name = "pack of novaflower seeds" + name = "novaflower seed pack" desc = "These seeds grow into novaflowers." icon_state = "seed-novaflower" species = "novaflower" @@ -266,7 +266,7 @@ // Rose /obj/item/seeds/rose - name = "pack of rose seeds" + name = "rose seed pack" desc = "These seeds grow into roses." icon_state = "seed-rose" species = "rose" @@ -311,7 +311,7 @@ // Carbon Rose /obj/item/seeds/carbon_rose - name = "pack of carbon rose seeds" + name = "carbon rose seed pack" desc = "These seeds grow into carbon roses." icon_state = "seed-carbonrose" species = "carbonrose" diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm index e37d49fa93032..755d0c2920a3f 100644 --- a/code/modules/hydroponics/grown/garlic.dm +++ b/code/modules/hydroponics/grown/garlic.dm @@ -1,5 +1,5 @@ /obj/item/seeds/garlic - name = "pack of garlic seeds" + name = "garlic seed pack" desc = "A packet of extremely pungent seeds." icon_state = "seed-garlic" species = "garlic" diff --git a/code/modules/hydroponics/grown/gatfruit.dm b/code/modules/hydroponics/grown/gatfruit.dm index f64b6eb3bd481..c6de17d6eb684 100644 --- a/code/modules/hydroponics/grown/gatfruit.dm +++ b/code/modules/hydroponics/grown/gatfruit.dm @@ -1,7 +1,7 @@ // Gatfruit /obj/item/seeds/gatfruit - name = "pack of gatfruit seeds" + name = "gatfruit seed pack" desc = "These seeds grow into .357 revolvers." icon_state = "seed-gatfruit" species = "gatfruit" diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 732a6d32b881b..a5cdc08fb7658 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -1,6 +1,6 @@ // Grass /obj/item/seeds/grass - name = "pack of grass seeds" + name = "grass seed pack" desc = "These seeds grow into grass. Yummy!" icon_state = "seed-grass" species = "grass" @@ -42,7 +42,7 @@ //Fairygrass /obj/item/seeds/grass/fairy - name = "pack of fairygrass seeds" + name = "fairygrass seed pack" desc = "These seeds grow into a more mystical grass." icon_state = "seed-fairygrass" species = "fairygrass" @@ -65,7 +65,7 @@ // Carpet /obj/item/seeds/grass/carpet - name = "pack of carpet seeds" + name = "carpet seed pack" desc = "These seeds grow into stylish carpet samples." icon_state = "seed-carpet" species = "carpet" diff --git a/code/modules/hydroponics/grown/hedges.dm b/code/modules/hydroponics/grown/hedges.dm index 9127f70f78fd4..d02949bfd9813 100644 --- a/code/modules/hydroponics/grown/hedges.dm +++ b/code/modules/hydroponics/grown/hedges.dm @@ -1,5 +1,5 @@ /obj/item/seeds/shrub - name = "pack of shrub seeds" + name = "shrub seed pack" desc = "These seeds grow into hedge shrubs." icon_state = "seed-shrub" species = "shrub" diff --git a/code/modules/hydroponics/grown/herbs.dm b/code/modules/hydroponics/grown/herbs.dm index b22be06ec6aca..bc450d6857f18 100644 --- a/code/modules/hydroponics/grown/herbs.dm +++ b/code/modules/hydroponics/grown/herbs.dm @@ -1,6 +1,6 @@ // Herbs /obj/item/seeds/herbs - name = "pack of herb seeds" + name = "herb seed pack" desc = "These seeds grow to produce an assortment of herbs and seasonings." icon_state = "seed-herbs" species = "herbs" diff --git a/code/modules/hydroponics/grown/korta_nut.dm b/code/modules/hydroponics/grown/korta_nut.dm index cfa6c1e5b51f3..457ebff07163e 100644 --- a/code/modules/hydroponics/grown/korta_nut.dm +++ b/code/modules/hydroponics/grown/korta_nut.dm @@ -1,6 +1,6 @@ //Korta Nut /obj/item/seeds/korta_nut - name = "pack of korta nut seeds" + name = "korta nut seed pack" desc = "These seeds grow into korta nut bushes, native to Tizira." icon_state = "seed-korta" species = "kortanut" @@ -29,7 +29,7 @@ //Sweet Korta Nut /obj/item/seeds/korta_nut/sweet - name = "pack of sweet korta nut seeds" + name = "sweet korta nut seed pack" desc = "These seeds grow into sweet korta nuts, a mutation of the original species that produces a thick syrup that Tizirans use for desserts." icon_state = "seed-sweetkorta" species = "kortanut" diff --git a/code/modules/hydroponics/grown/kronkus.dm b/code/modules/hydroponics/grown/kronkus.dm index 90d264230e750..b4ba30a5eddbe 100644 --- a/code/modules/hydroponics/grown/kronkus.dm +++ b/code/modules/hydroponics/grown/kronkus.dm @@ -1,5 +1,5 @@ /obj/item/seeds/kronkus - name = "pack of kronkus seeds" + name = "kronkus seed pack" desc = "A pack of highly illegal kronkus seeds.\nPossession of these seeds carries the death penalty in 7 sectors." icon_state = "seed-kronkus" plant_icon_offset = 6 diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 5dbb70135974f..3aca50ae1be54 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -1,6 +1,6 @@ // Watermelon /obj/item/seeds/watermelon - name = "pack of watermelon seeds" + name = "watermelon seed pack" desc = "These seeds grow into watermelon plants." icon_state = "seed-watermelon" species = "watermelon" @@ -74,7 +74,7 @@ // Holymelon /obj/item/seeds/watermelon/holy - name = "pack of holymelon seeds" + name = "holymelon seed pack" desc = "These seeds grow into holymelon plants." icon_state = "seed-holymelon" species = "holymelon" @@ -159,7 +159,7 @@ /// Barrel melon Seeds /obj/item/seeds/watermelon/barrel - name = "pack of barrelmelon seeds" + name = "barrelmelon seed pack" desc = "These seeds grow into barrelmelon plants." icon_state = "seed-barrelmelon" species = "barrelmelon" diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index c72ce44ef9d6e..9d1d802916bff 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -11,7 +11,7 @@ // Reishi /obj/item/seeds/reishi - name = "pack of reishi mycelium" + name = "reishi mycelium pack" desc = "This mycelium grows into something medicinal and relaxing." icon_state = "mycelium-reishi" species = "reishi" @@ -38,7 +38,7 @@ // Fly Amanita /obj/item/seeds/amanita - name = "pack of fly amanita mycelium" + name = "fly amanita mycelium pack" desc = "This mycelium grows into something horrible." icon_state = "mycelium-amanita" species = "amanita" @@ -65,7 +65,7 @@ // Destroying Angel /obj/item/seeds/angel - name = "pack of destroying angel mycelium" + name = "destroying angel mycelium pack" desc = "This mycelium grows into something devastating." icon_state = "mycelium-angel" species = "angel" @@ -93,7 +93,7 @@ // Liberty Cap /obj/item/seeds/liberty - name = "pack of liberty-cap mycelium" + name = "liberty-cap mycelium pack" desc = "This mycelium grows into liberty-cap mushrooms." icon_state = "mycelium-liberty" species = "liberty" @@ -119,7 +119,7 @@ // Plump Helmet /obj/item/seeds/plump - name = "pack of plump-helmet mycelium" + name = "plump-helmet mycelium pack" desc = "This mycelium grows into helmets... maybe." icon_state = "mycelium-plump" species = "plump" @@ -145,7 +145,7 @@ // Walking Mushroom /obj/item/seeds/plump/walkingmushroom - name = "pack of walking mushroom mycelium" + name = "walking mushroom mycelium pack" desc = "This mycelium will grow into huge stuff!" icon_state = "mycelium-walkingmushroom" species = "walkingmushroom" @@ -171,7 +171,7 @@ // Chanterelle /obj/item/seeds/chanter - name = "pack of chanterelle mycelium" + name = "chanterelle mycelium pack" desc = "This mycelium grows into chanterelle mushrooms." icon_state = "mycelium-chanter" species = "chanter" @@ -213,7 +213,7 @@ //Jupiter Cup /obj/item/seeds/chanter/jupitercup - name = "pack of jupiter cup mycelium" + name = "jupiter cup mycelium pack" desc = "This mycelium grows into jupiter cups. Zeus would be envious at the power at your fingertips." icon_state = "mycelium-jupitercup" species = "jupitercup" @@ -238,7 +238,7 @@ // Glowshroom /obj/item/seeds/glowshroom - name = "pack of glowshroom mycelium" + name = "glowshroom mycelium pack" desc = "This mycelium -glows- into mushrooms!" icon_state = "mycelium-glowshroom" species = "glowshroom" @@ -293,7 +293,7 @@ // Glowcap /obj/item/seeds/glowshroom/glowcap - name = "pack of glowcap mycelium" + name = "glowcap mycelium pack" desc = "This mycelium -powers- into mushrooms!" icon_state = "mycelium-glowcap" species = "glowcap" @@ -317,7 +317,7 @@ //Shadowshroom /obj/item/seeds/glowshroom/shadowshroom - name = "pack of shadowshroom mycelium" + name = "shadowshroom mycelium pack" desc = "This mycelium will grow into something shadowy." icon_state = "mycelium-shadowshroom" species = "shadowshroom" @@ -346,7 +346,7 @@ investigate_log("was planted by [key_name(user)] at [AREACOORD(user)]", INVESTIGATE_BOTANY) /obj/item/seeds/odious_puffball - name = "pack of odious pullball spores" + name = "odious pullball spore pack" desc = "These spores reek! Disgusting." icon_state = "seed-odiouspuffball" species = "odiouspuffball" diff --git a/code/modules/hydroponics/grown/olive.dm b/code/modules/hydroponics/grown/olive.dm index 38102cacb24ea..0b2f52c7a5e7b 100644 --- a/code/modules/hydroponics/grown/olive.dm +++ b/code/modules/hydroponics/grown/olive.dm @@ -1,6 +1,6 @@ // Olive /obj/item/seeds/olive - name = "pack of olive seeds" + name = "olive seed pack" desc = "These seeds grow into olive trees." icon_state = "seed-olive" species = "olive" diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 8f948407a37b8..0d33c3e1f395d 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -1,5 +1,5 @@ /obj/item/seeds/onion - name = "pack of onion seeds" + name = "onion seed pack" desc = "These seeds grow into onions." icon_state = "seed-onion" species = "onion" @@ -29,7 +29,7 @@ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/onion_slice, 2, 15, screentip_verb = "Cut") /obj/item/seeds/onion/red - name = "pack of red onion seeds" + name = "red onion seed pack" desc = "For growing exceptionally potent onions." icon_state = "seed-onionred" species = "onion_red" diff --git a/code/modules/hydroponics/grown/peanut.dm b/code/modules/hydroponics/grown/peanut.dm index 69cf6d9e0568d..6560ec196c918 100644 --- a/code/modules/hydroponics/grown/peanut.dm +++ b/code/modules/hydroponics/grown/peanut.dm @@ -1,6 +1,6 @@ // Peanuts! /obj/item/seeds/peanut - name = "pack of peanut seeds" + name = "peanut seed pack" desc = "These seeds grow into peanut plants." icon_state = "seed-peanut" species = "peanut" diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm index c232ed247c690..66eaec6ff1d54 100644 --- a/code/modules/hydroponics/grown/peas.dm +++ b/code/modules/hydroponics/grown/peas.dm @@ -1,6 +1,6 @@ // Finally, peas. Base plant. /obj/item/seeds/peas - name = "pack of pea pods" + name = "pea pod pack" desc = "These seeds grows into vitamin rich peas!" icon_state = "seed-peas" species = "peas" @@ -29,7 +29,7 @@ // Laughin' Peas /obj/item/seeds/peas/laugh - name = "pack of laughin' peas" + name = "laughin' pea pack" desc = "These seeds give off a very soft purple glow.. they should grow into Laughin' Peas." icon_state = "seed-laughpeas" species = "laughpeas" @@ -61,7 +61,7 @@ // World Peas - Peace at last, peace at last... /obj/item/seeds/peas/laugh/peace - name = "pack of world peas" + name = "world pea pack" desc = "These rather large seeds give off a soothing blue glow..." icon_state = "seed-worldpeas" species = "worldpeas" diff --git a/code/modules/hydroponics/grown/pineapple.dm b/code/modules/hydroponics/grown/pineapple.dm index 3c0e462f38855..5de85e9168f1f 100644 --- a/code/modules/hydroponics/grown/pineapple.dm +++ b/code/modules/hydroponics/grown/pineapple.dm @@ -1,6 +1,6 @@ // Pineapple! /obj/item/seeds/pineapple - name = "pack of pineapple seeds" + name = "pineapple seed pack" desc = "Oooooooooooooh!" icon_state = "seed-pineapple" species = "pineapple" diff --git a/code/modules/hydroponics/grown/plum.dm b/code/modules/hydroponics/grown/plum.dm index cac12bdb1eb5d..c11acdf2db553 100644 --- a/code/modules/hydroponics/grown/plum.dm +++ b/code/modules/hydroponics/grown/plum.dm @@ -1,6 +1,6 @@ // Plum /obj/item/seeds/plum - name = "pack of plum seeds" + name = "plum seed pack" desc = "These seeds grow into plum trees." icon_state = "seed-plum" species = "plum" @@ -28,7 +28,7 @@ // Plumb /obj/item/seeds/plum/plumb - name = "pack of plumb seeds" + name = "plumb seed pack" desc = "These seeds grow into plumb trees." icon_state = "seed-plumb" species = "plumb" diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 837937e41d128..c57111b86d0c0 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -1,6 +1,6 @@ // Potato /obj/item/seeds/potato - name = "pack of potato seeds" + name = "potato seed pack" desc = "Boil 'em! Mash 'em! Stick 'em in a stew!" icon_state = "seed-potato" species = "potato" @@ -50,7 +50,7 @@ // Sweet Potato /obj/item/seeds/potato/sweet - name = "pack of sweet potato seeds" + name = "sweet potato seed pack" desc = "These seeds grow into sweet potato plants." icon_state = "seed-sweetpotato" species = "sweetpotato" diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 11130c153344a..dce207302c306 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -1,6 +1,6 @@ // Pumpkin /obj/item/seeds/pumpkin - name = "pack of pumpkin seeds" + name = "pumpkin seed pack" desc = "These seeds grow into pumpkin vines." icon_state = "seed-pumpkin" plant_icon_offset = 4 @@ -40,7 +40,7 @@ // Blumpkin /obj/item/seeds/pumpkin/blumpkin - name = "pack of blumpkin seeds" + name = "blumpkin seed pack" desc = "These seeds grow into blumpkin vines." icon_state = "seed-blumpkin" species = "blumpkin" diff --git a/code/modules/hydroponics/grown/rainbow_bunch.dm b/code/modules/hydroponics/grown/rainbow_bunch.dm index 4ffad4583c705..c3d21347bf953 100644 --- a/code/modules/hydroponics/grown/rainbow_bunch.dm +++ b/code/modules/hydroponics/grown/rainbow_bunch.dm @@ -1,5 +1,5 @@ /obj/item/seeds/rainbow_bunch - name = "pack of rainbow bunch seeds" + name = "rainbow bunch seed pack" desc = "A pack of seeds that'll grow into a beautiful bush of various colored flowers." icon_state = "seed-rainbowbunch" species = "rainbowbunch" diff --git a/code/modules/hydroponics/grown/random.dm b/code/modules/hydroponics/grown/random.dm index 560e3c71e5ce6..3a97277f0d85c 100644 --- a/code/modules/hydroponics/grown/random.dm +++ b/code/modules/hydroponics/grown/random.dm @@ -1,7 +1,7 @@ //Random seeds; stats, traits, and plant type are randomized for each seed. /obj/item/seeds/random - name = "pack of strange seeds" + name = "strange seed pack" desc = "Mysterious seeds as strange as their name implies. Spooky." icon_state = "seed-x" species = "?????" diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index f412e146db206..602b90f4c3567 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -2,7 +2,7 @@ // Yes, i'm talking about cabbage, baby! No, just kidding, but cabbages are the precursor to replica pods, so they are here as well. /obj/item/seeds/cabbage - name = "pack of cabbage seeds" + name = "cabbage seed pack" desc = "These seeds grow into cabbages." icon_state = "seed-cabbage" species = "cabbage" @@ -31,7 +31,7 @@ ///The actual replica pods themselves! /obj/item/seeds/replicapod - name = "pack of replica pod seeds" + name = "replica pod seed pack" desc = "These seeds grow into replica pods. They say these are used to harvest humans." icon_state = "seed-replicapod" plant_icon_offset = 2 diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 128a246d0ba92..4393d76a5fa22 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -1,6 +1,6 @@ // Carrot /obj/item/seeds/carrot - name = "pack of carrot seeds" + name = "carrot seed pack" desc = "These seeds grow into carrots." icon_state = "seed-carrot" species = "carrot" @@ -45,7 +45,7 @@ // Parsnip /obj/item/seeds/carrot/parsnip - name = "pack of parsnip seeds" + name = "parsnip seed pack" desc = "These seeds grow into parsnips." icon_state = "seed-parsnip" species = "parsnip" @@ -85,7 +85,7 @@ // Cahn'root /obj/item/seeds/carrot/cahnroot - name = "pack of cahn'root seeds" + name = "cahn'root seed pack" desc = "These seeds grow into cahn'roots." icon_state = "seed-cahn'root" species = "cahn'root" @@ -130,7 +130,7 @@ // White-Beet /obj/item/seeds/whitebeet - name = "pack of white-beet seeds" + name = "white-beet seed pack" desc = "These seeds grow into sugary beet producing plants." icon_state = "seed-whitebeet" species = "whitebeet" @@ -156,7 +156,7 @@ // Red Beet /obj/item/seeds/redbeet - name = "pack of redbeet seeds" + name = "redbeet seed pack" desc = "These seeds grow into red beet producing plants." icon_state = "seed-redbeet" species = "redbeet" diff --git a/code/modules/hydroponics/grown/seedling.dm b/code/modules/hydroponics/grown/seedling.dm index 57fd11280b6ed..9ce83acfa9e36 100644 --- a/code/modules/hydroponics/grown/seedling.dm +++ b/code/modules/hydroponics/grown/seedling.dm @@ -1,5 +1,5 @@ /obj/item/seeds/seedling - name = "pack of seedling seeds" + name = "seedling seed pack" desc = "These seeds grow into a floral assistant which can help look after other plants!" icon_state = "seed-seedling" growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' diff --git a/code/modules/hydroponics/grown/sugarcane.dm b/code/modules/hydroponics/grown/sugarcane.dm index 1c5c55fece08d..e7845f1e55607 100644 --- a/code/modules/hydroponics/grown/sugarcane.dm +++ b/code/modules/hydroponics/grown/sugarcane.dm @@ -1,7 +1,7 @@ // Sugarcane /obj/item/seeds/sugarcane - name = "pack of sugarcane seeds" + name = "sugarcane seed pack" desc = "These seeds grow into sugarcane." icon_state = "seed-sugarcane" species = "sugarcane" @@ -28,7 +28,7 @@ ///and bamboo! /obj/item/seeds/bamboo - name = "pack of bamboo seeds" + name = "bamboo seed pack" desc = "A plant known for its flexible and resistant logs." icon_state = "seed-bamboo" species = "bamboo" @@ -59,7 +59,7 @@ //Saltcane - Gross, salty shafts! /obj/item/seeds/sugarcane/saltcane - name = "pack of saltcane seeds" + name = "saltcane seed pack" desc = "These seeds grow into saltcane." icon_state = "seed-saltcane" species = "saltcane" diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index 366dd8b45237e..26a215be720b4 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -1,6 +1,6 @@ // Tea /obj/item/seeds/tea - name = "pack of tea aspera seeds" + name = "tea aspera seed pack" desc = "These seeds grow into tea plants." icon_state = "seed-teaaspera" species = "teaaspera" @@ -27,7 +27,7 @@ // Tea Astra /obj/item/seeds/tea/astra - name = "pack of tea astra seeds" + name = "tea astra seed pack" icon_state = "seed-teaastra" species = "teaastra" plantname = "Tea Astra Plant" @@ -46,7 +46,7 @@ // Coffee /obj/item/seeds/coffee - name = "pack of coffee arabica seeds" + name = "coffee arabica seed pack" desc = "These seeds grow into coffee arabica bushes." icon_state = "seed-coffeea" species = "coffeea" @@ -75,7 +75,7 @@ // Coffee Robusta /obj/item/seeds/coffee/robusta - name = "pack of coffee robusta seeds" + name = "coffee robusta seed pack" desc = "These seeds grow into coffee robusta bushes." icon_state = "seed-coffeer" species = "coffeer" diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm index 87f8253a4d96b..29e8fba6d6a8b 100644 --- a/code/modules/hydroponics/grown/tobacco.dm +++ b/code/modules/hydroponics/grown/tobacco.dm @@ -1,6 +1,6 @@ // Tobacco /obj/item/seeds/tobacco - name = "pack of tobacco seeds" + name = "tobacco seed pack" desc = "These seeds grow into tobacco plants." icon_state = "seed-tobacco" species = "tobacco" @@ -24,7 +24,7 @@ // Space Tobacco /obj/item/seeds/tobacco/space - name = "pack of space tobacco seeds" + name = "space tobacco seed pack" desc = "These seeds grow into space tobacco plants." icon_state = "seed-stobacco" species = "stobacco" diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index e676d822bbf1a..1459887d6facb 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -1,6 +1,6 @@ // Tomato /obj/item/seeds/tomato - name = "pack of tomato seeds" + name = "tomato seed pack" desc = "These seeds grow into tomato plants." icon_state = "seed-tomato" species = "tomato" @@ -29,7 +29,7 @@ // Blood Tomato /obj/item/seeds/tomato/blood - name = "pack of blood-tomato seeds" + name = "blood-tomato seed pack" desc = "These seeds grow into blood-tomato plants." icon_state = "seed-bloodtomato" species = "bloodtomato" @@ -52,7 +52,7 @@ // Blue Tomato /obj/item/seeds/tomato/blue - name = "pack of blue-tomato seeds" + name = "blue-tomato seed pack" desc = "These seeds grow into blue-tomato plants." icon_state = "seed-bluetomato" species = "bluetomato" @@ -77,7 +77,7 @@ // Bluespace Tomato /obj/item/seeds/tomato/blue/bluespace - name = "pack of bluespace tomato seeds" + name = "bluespace tomato seed pack" desc = "These seeds grow into bluespace tomato plants." icon_state = "seed-bluespacetomato" species = "bluespacetomato" @@ -101,7 +101,7 @@ // Killer Tomato /obj/item/seeds/tomato/killer - name = "pack of killer-tomato seeds" + name = "killer-tomato seed pack" desc = "These seeds grow into killer-tomato plants." icon_state = "seed-killertomato" species = "killertomato" diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 1082b51665ff7..a09e4e61b4d15 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -1,5 +1,5 @@ /obj/item/seeds/tower - name = "pack of tower-cap mycelium" + name = "tower-cap mycelium pack" desc = "This mycelium grows into tower-cap mushrooms." icon_state = "mycelium-tower" species = "towercap" @@ -20,7 +20,7 @@ graft_gene = /datum/plant_gene/trait/plant_type/fungal_metabolism /obj/item/seeds/tower/steel - name = "pack of steel-cap mycelium" + name = "steel-cap mycelium pack" desc = "This mycelium grows into steel logs." icon_state = "mycelium-steelcap" species = "steelcap" diff --git a/code/modules/hydroponics/grown/weeds/kudzu.dm b/code/modules/hydroponics/grown/weeds/kudzu.dm index 86b49672705b9..a0a3c9405718c 100644 --- a/code/modules/hydroponics/grown/weeds/kudzu.dm +++ b/code/modules/hydroponics/grown/weeds/kudzu.dm @@ -1,7 +1,7 @@ // A very special plant, deserving its own file. /obj/item/seeds/kudzu - name = "pack of kudzu seeds" + name = "kudzu seed pack" desc = "These seeds grow into a weed that grows incredibly fast." icon_state = "seed-kudzu" plant_icon_offset = 2 diff --git a/code/modules/hydroponics/grown/weeds/nettle.dm b/code/modules/hydroponics/grown/weeds/nettle.dm index 98868b8d6e748..33a0f6288912d 100644 --- a/code/modules/hydroponics/grown/weeds/nettle.dm +++ b/code/modules/hydroponics/grown/weeds/nettle.dm @@ -1,5 +1,5 @@ /obj/item/seeds/nettle - name = "pack of nettle seeds" + name = "nettle seed pack" desc = "These seeds grow into nettles." icon_state = "seed-nettle" plant_icon_offset = 0 @@ -17,7 +17,7 @@ graft_gene = /datum/plant_gene/trait/plant_type/weed_hardy /obj/item/seeds/nettle/death - name = "pack of death-nettle seeds" + name = "death-nettle seed pack" desc = "These seeds grow into death-nettles." icon_state = "seed-deathnettle" species = "deathnettle" diff --git a/code/modules/hydroponics/grown/weeds/starthistle.dm b/code/modules/hydroponics/grown/weeds/starthistle.dm index 74627a31f88e8..af94cf3d98508 100644 --- a/code/modules/hydroponics/grown/weeds/starthistle.dm +++ b/code/modules/hydroponics/grown/weeds/starthistle.dm @@ -1,6 +1,6 @@ // Starthistle /obj/item/seeds/starthistle - name = "pack of starthistle seeds" + name = "starthistle seed pack" desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots." icon_state = "seed-starthistle" plant_icon_offset = 3 @@ -33,7 +33,7 @@ // Corpse flower /obj/item/seeds/starthistle/corpse_flower - name = "pack of corpse flower seeds" + name = "corpse flower seed pack" desc = "A species of plant that emits a horrible odor. The odor stops being produced in difficult atmospheric conditions." icon_state = "seed-corpse-flower" species = "corpse-flower" @@ -46,7 +46,7 @@ //Galaxy Thistle /obj/item/seeds/galaxythistle - name = "pack of galaxythistle seeds" + name = "galaxythistle seed pack" desc = "An impressive species of weed that is thought to have evolved from the simple milk thistle. Contains flavolignans that can help repair a damaged liver." icon_state = "seed-galaxythistle" species = "galaxythistle" diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 101239d8d31aa..18197c006b51e 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -638,5 +638,5 @@ if(length(valid_reagents)) // pick a valid reagent that our receptor seed don't have and add the gene to it var/datum/plant_gene/reagent/selected_reagent = pick(valid_reagents) - genes += selected_reagent + genes += selected_reagent.Copy() reagents_from_genes() diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index 7cc067ed0a2d6..b02dee12cf826 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -574,6 +574,7 @@ attack_verb_simple = list("smash", "slam", "whack", "thwack") icon = 'icons/obj/weapons/staff.dmi' icon_state = "bostaff0" + base_icon_state = "bostaff" inhand_icon_state = "bostaff0" worn_icon_state = "bostaff0" lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' diff --git a/code/modules/lootpanel/contents.dm b/code/modules/lootpanel/contents.dm index 44f4acd47f24c..2fcd4201d8a7c 100644 --- a/code/modules/lootpanel/contents.dm +++ b/code/modules/lootpanel/contents.dm @@ -21,6 +21,8 @@ if(!istype(thing)) stack_trace("Non-atom in the contents of [source_turf]!") continue + if(QDELETED(thing)) + continue if(thing.mouse_opacity == MOUSE_OPACITY_TRANSPARENT) continue if(thing.IsObscured()) diff --git a/code/modules/lootpanel/search_object.dm b/code/modules/lootpanel/search_object.dm index 149be76e71064..2cb0bdf85dba9 100644 --- a/code/modules/lootpanel/search_object.dm +++ b/code/modules/lootpanel/search_object.dm @@ -62,6 +62,7 @@ /datum/search_object/Destroy(force) item = null + icon = null return ..() @@ -75,6 +76,9 @@ /datum/search_object/proc/on_item_moved(atom/source) SIGNAL_HANDLER + if(QDELETED(src)) + return + qdel(src) @@ -82,4 +86,4 @@ /datum/search_object/proc/on_turf_change(turf/source, path, list/new_baseturfs, flags, list/post_change_callbacks) SIGNAL_HANDLER - post_change_callbacks += CALLBACK(src, GLOBAL_PROC_REF(qdel), src) + post_change_callbacks += CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src) diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 1e4e444861155..3a813aebd14a6 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -261,7 +261,7 @@ graft_gene = /datum/plant_gene/trait/fire_resistance /obj/item/seeds/lavaland/cactus - name = "pack of fruiting cactus seeds" + name = "fruiting cactus seed pack" desc = "These seeds grow into fruiting cacti." icon_state = "seed-cactus" species = "cactus" @@ -275,7 +275,7 @@ ///Star Cactus seeds, mutation of lavaland cactus. /obj/item/seeds/star_cactus - name = "pack of star cacti seeds" + name = "star cacti seed pack" desc = "These seeds grow into star cacti." icon_state = "seed-starcactus" species = "starcactus" @@ -303,7 +303,7 @@ distill_reagent = /datum/reagent/consumable/ethanol/tequila /obj/item/seeds/lavaland/polypore - name = "pack of polypore mycelium" + name = "polypore mycelium pack" desc = "This mycelium grows into bracket mushrooms, also known as polypores. Woody and firm, shaft miners often use them for makeshift crafts." icon_state = "mycelium-polypore" species = "polypore" @@ -314,7 +314,7 @@ reagents_add = list(/datum/reagent/consumable/nutriment = 0.04, /datum/reagent/consumable/ethanol = 0.04, /datum/reagent/stabilizing_agent = 0.06, /datum/reagent/consumable/mintextract = 0.02) /obj/item/seeds/lavaland/porcini - name = "pack of porcini mycelium" + name = "porcini mycelium pack" desc = "This mycelium grows into Boletus edulus, also known as porcini. Native to the late Earth, but discovered on Lavaland. Has culinary, medicinal and relaxant effects." icon_state = "mycelium-porcini" species = "porcini" @@ -325,7 +325,7 @@ reagents_add = list(/datum/reagent/consumable/nutriment = 0.06, /datum/reagent/consumable/sugar = 0.06, /datum/reagent/consumable/vitfro = 0.04, /datum/reagent/drug/nicotine = 0.04) /obj/item/seeds/lavaland/inocybe - name = "pack of inocybe mycelium" + name = "inocybe mycelium pack" desc = "This mycelium grows into an inocybe mushroom, a species of Lavaland origin with hallucinatory and toxic effects." icon_state = "mycelium-inocybe" species = "inocybe" @@ -336,7 +336,7 @@ reagents_add = list(/datum/reagent/toxin/mindbreaker = 0.04, /datum/reagent/consumable/entpoly = 0.08, /datum/reagent/drug/mushroomhallucinogen = 0.04) /obj/item/seeds/lavaland/ember - name = "pack of embershroom mycelium" + name = "embershroom mycelium pack" desc = "This mycelium grows into embershrooms, a species of bioluminescent mushrooms native to Lavaland." icon_state = "mycelium-ember" species = "ember" @@ -347,7 +347,7 @@ reagents_add = list(/datum/reagent/consumable/tinlux = 0.04, /datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/drug/space_drugs = 0.02) /obj/item/seeds/lavaland/seraka - name = "pack of seraka mycelium" + name = "seraka mycelium pack" desc = "This mycelium grows into seraka mushrooms, a species of savoury mushrooms originally native to Tizira used in food and traditional medicine." icon_state = "mycelium-seraka" species = "seraka" @@ -358,7 +358,7 @@ reagents_add = list(/datum/reagent/toxin/mushroom_powder = 0.1, /datum/reagent/medicine/coagulant/seraka_extract = 0.02) /obj/item/seeds/lavaland/fireblossom - name = "pack of fire blossom seeds" + name = "fire blossom seed pack" desc = "These seeds grow into fire blossoms." plantname = "Fire Blossom" icon_state = "seed-fireblossom" diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 98a771a06a99d..582af27c3161b 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -318,3 +318,9 @@ /mob/living/basic/get_body_temp_cold_damage_limit() return minimum_survivable_temperature + +/mob/living/basic/proc/hop_on_nearby_turf() + var/dir = pick(GLOB.cardinals) + Move(get_step(src, dir), dir) + animate(src, pixel_y = 18, time = 0.4 SECONDS, flags = ANIMATION_RELATIVE, easing = CUBIC_EASING|EASE_OUT) + animate(pixel_y = -18, time = 0.4 SECONDS, flags = ANIMATION_RELATIVE, easing = CUBIC_EASING|EASE_IN) diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index 9f2b915944bb4..04b3a7864d21e 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -517,7 +517,6 @@ GLOBAL_LIST_INIT(command_strings, list( if(istype(item_to_drop, /obj/item/stock_parts/power_store/cell)) var/obj/item/stock_parts/power_store/cell/dropped_cell = item_to_drop dropped_cell.charge = 0 - dropped_cell.update_appearance() return if(istype(item_to_drop, /obj/item/storage)) 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 75b64d051203a..5ca1ca2cfd5b0 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm @@ -14,6 +14,7 @@ BB_LOBSTROSITY_FINGER_LUST = 0, BB_LOBSTROSITY_NAIVE_HUNTER = FALSE, BB_BASIC_MOB_FLEE_DISTANCE = 8, + BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, BB_OWNER_SELF_HARM_RESPONSES = SHRIMP_HARM_RESPONSES, ) ai_traits = PAUSE_DURING_DO_AFTER @@ -24,7 +25,7 @@ /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/hoard_fingers, /datum/ai_planning_subtree/pet_planning, - /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/find_target_prioritize_traits, /datum/ai_planning_subtree/targeted_mob_ability/lobster, /datum/ai_planning_subtree/flee_target/lobster, /datum/ai_planning_subtree/attack_obstacle_in_path, @@ -43,13 +44,14 @@ BB_LOBSTROSITY_FINGER_LUST = 0, BB_LOBSTROSITY_NAIVE_HUNTER = TRUE, BB_BASIC_MOB_FLEE_DISTANCE = 4, + BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, BB_OWNER_SELF_HARM_RESPONSES = SHRIMP_HARM_RESPONSES, ) planning_subtrees = list( /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/hoard_fingers, /datum/ai_planning_subtree/pet_planning, - /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/find_target_prioritize_traits, /datum/ai_planning_subtree/targeted_mob_ability/lobster, /datum/ai_planning_subtree/flee_target/lobster, /datum/ai_planning_subtree/attack_obstacle_in_path, @@ -100,14 +102,17 @@ 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])) + var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(!isliving(target)) return ..() if (!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) return if (!isnull(controller.blackboard[BB_LOBSTROSITY_TARGET_LIMB])) return + if(controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] && HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN)) + return //juvenile lobstrosities fear me. var/mob/living/living_pawn = controller.pawn - if (DOING_INTERACTION_WITH_TARGET(living_pawn, controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET])) + if (DOING_INTERACTION_WITH_TARGET(living_pawn, target)) return return ..() @@ -118,9 +123,14 @@ if (isnull(target) || !istype(target)) return ..() var/is_vulnerable = FALSE - if(controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] && target.body_position == LYING_DOWN) - is_vulnerable = TRUE - else + if(controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER]) + if(HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN)) + //Trigger lobstrosity PTSD. Don't clear the target so we can run away. + controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE) + return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED + if(target.body_position == LYING_DOWN) + is_vulnerable = TRUE + if(!is_vulnerable) for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS]) if (!HAS_TRAIT(target, trait)) continue @@ -137,9 +147,12 @@ flee_behaviour = /datum/ai_behavior/run_away_from_target/lobster /datum/ai_planning_subtree/flee_target/lobster/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/movable/target = controller.blackboard[target_key] + if(!QDELETED(target) && controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] && HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN)) + return ..() var/datum/action/cooldown/using_action = controller.blackboard[BB_TARGETED_ACTION] if (using_action?.IsAvailable()) - return + return FALSE return ..() /datum/ai_behavior/run_away_from_target/lobster @@ -147,19 +160,23 @@ /datum/ai_behavior/run_away_from_target/lobster/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key) var/atom/target = controller.blackboard[target_key] - if(isnull(target)) + if(QDELETED(target)) return ..() - if(isliving(target)) - var/mob/living/living_target = target - if(controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] && living_target.body_position == LYING_DOWN) + var/is_naive = controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] + var/is_scary = HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN) + + if(!is_naive || !is_scary) //the lobstrosity isn't naive/young and the target isn't a scary fisherman. + if(isliving(target)) + var/mob/living/living_target = target + if(is_naive && living_target.body_position == LYING_DOWN) + controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE) + return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED + for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS]) + if (!HAS_TRAIT(target, trait)) + continue controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE) return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED - for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS]) - if (!HAS_TRAIT(target, trait)) - continue - controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE) - return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED var/mob/living/us = controller.pawn if (us.pulling == target) @@ -174,7 +191,9 @@ /datum/ai_planning_subtree/targeted_mob_ability/lobster/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/atom/target = controller.blackboard[target_key] if(QDELETED(target) || in_range(controller.pawn, target)) - return FALSE + return + if(controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] && HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN)) + return return ..() diff --git a/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm b/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm index b149c6d09728b..87687c5699963 100644 --- a/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm +++ b/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm @@ -74,6 +74,31 @@ if(flying_state == FLY_IN_STATE || flying_state == FLY_OUT_STATE) icon_state = "mining_node_flying" +/mob/living/basic/node_drone/update_overlays() + . = ..() + if(attached_vent) + var/time_remaining = COOLDOWN_TIMELEFT(attached_vent, wave_cooldown) + var/wave_timers + switch(attached_vent?.boulder_size) + if(BOULDER_SIZE_SMALL) + wave_timers = WAVE_DURATION_SMALL + if(BOULDER_SIZE_MEDIUM) + wave_timers = WAVE_DURATION_MEDIUM + if(BOULDER_SIZE_LARGE) + wave_timers = WAVE_DURATION_LARGE + var/remaining_fraction = (time_remaining / wave_timers) + if(remaining_fraction <= 0.3) + . += "node_progress_4" + return + if(remaining_fraction <= 0.55) + . += "node_progress_3" + return + if(remaining_fraction <= 0.80) + . += "node_progress_2" + return + . += "node_progress_1" + return + /mob/living/basic/node_drone/proc/arrive(obj/structure/ore_vent/parent_vent) attached_vent = parent_vent maxHealth = 300 + ((attached_vent.boulder_size/BOULDER_SIZE_SMALL) * 100) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm index 71017bd2207a2..810c45603862b 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm @@ -55,6 +55,12 @@ /// This subtype only exists because if you queue multiple of the same action with different arguments it deletes their stored arguments /datum/ai_behavior/find_potential_targets/nearest/magicarp +/datum/ai_behavior/find_potential_targets/nearest/magicarp/pick_final_target(datum/ai_controller/controller, list/enemies_list) + for(var/atom/atom as anything in enemies_list) + if(HAS_TRAIT(atom, TRAIT_SCARY_FISHERMAN)) + enemies_list -= atom + return ..() + /// Then use it on that target /datum/ai_planning_subtree/targeted_mob_ability/magicarp ability_key = BB_MAGICARP_SPELL diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm index 84b96ae3ce405..f104d3566b347 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm @@ -31,6 +31,9 @@ finish_planning = TRUE /datum/ai_planning_subtree/make_carp_rift/panic_teleport/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/movable/fleeing_from = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(!QDELETED(fleeing_from) && controller.blackboard[BB_CARPS_FEAR_FISHERMAN] && HAS_TRAIT(fleeing_from, TRAIT_SCARY_FISHERMAN)) + return ..() if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) return return ..() @@ -42,6 +45,12 @@ /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport rift_behaviour = /datum/ai_behavior/make_carp_rift/towards/aggressive +/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(!QDELETED(target) && controller.blackboard[BB_CARPS_FEAR_FISHERMAN] && HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN)) + return + return ..() + /** * # Make carp rift * Make a carp rift somewhere @@ -174,7 +183,7 @@ /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] - if (QDELETED(target)) + if (QDELETED(target) || (controller.blackboard[BB_CARPS_FEAR_FISHERMAN] && HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN))) return var/distance_to_target = get_dist(controller.pawn, target) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm index 0befb20987c01..4491ef1149137 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm @@ -12,24 +12,48 @@ BB_BASIC_MOB_STOP_FLEEING = TRUE, BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, + BB_CARPS_FEAR_FISHERMAN = TRUE, ) ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/simple_find_nearest_target_to_flee, + /datum/ai_planning_subtree/find_target_prioritize_traits, + /datum/ai_planning_subtree/make_carp_rift/panic_teleport, + /datum/ai_planning_subtree/flee_target/from_fisherman, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/attack_obstacle_in_path/carp, + /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, + /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, + /datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman, + /datum/ai_planning_subtree/carp_migration, + ) + +///Megacarps. The only difference is that they don't flee from scary fishermen and prioritize them. +/datum/ai_controller/basic_controller/carp/mega + blackboard = list( + BB_BASIC_MOB_STOP_FLEEING = TRUE, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, + BB_CARPS_FEAR_FISHERMAN = FALSE, + ) planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/simple_find_nearest_target_to_flee, /datum/ai_planning_subtree/make_carp_rift/panic_teleport, /datum/ai_planning_subtree/flee_target, /datum/ai_planning_subtree/find_food, - /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/find_target_prioritize_traits, /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/carp_migration, ) - /** * Carp which bites back, but doesn't look for targets. * 'Not hunting targets' includes food (and can rings), because they have been well trained. @@ -39,18 +63,20 @@ BB_BASIC_MOB_STOP_FLEEING = TRUE, BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, + BB_CARPS_FEAR_FISHERMAN = TRUE, ) ai_traits = STOP_MOVING_WHEN_PULLED planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, /datum/ai_planning_subtree/make_carp_rift/panic_teleport, - /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/flee_target/from_fisherman, /datum/ai_planning_subtree/target_retaliate, /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, - /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman, ) /** @@ -61,12 +87,12 @@ planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/simple_find_nearest_target_to_flee, + /datum/ai_planning_subtree/find_target_prioritize_traits, /datum/ai_planning_subtree/make_carp_rift/panic_teleport, - /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/flee_target/from_fisherman, /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/find_nearest_magicarp_spell_target, /datum/ai_planning_subtree/targeted_mob_ability/magicarp, - /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, @@ -83,17 +109,19 @@ BB_BASIC_MOB_STOP_FLEEING = TRUE, BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, + BB_CARPS_FEAR_FISHERMAN = TRUE, ) ai_traits = STOP_MOVING_WHEN_PULLED planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/simple_find_nearest_target_to_flee, /datum/ai_planning_subtree/make_carp_rift/panic_teleport, - /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/flee_target/from_fisherman, /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, - /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman, /datum/ai_planning_subtree/carp_migration, ) diff --git a/code/modules/mob/living/basic/space_fauna/carp/megacarp.dm b/code/modules/mob/living/basic/space_fauna/carp/megacarp.dm index deadeaaa540a6..d82120a37e034 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/megacarp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/megacarp.dm @@ -24,6 +24,7 @@ ridable_data = /datum/component/riding/creature/megacarp greyscale_config = /datum/greyscale_config/carp_mega butcher_results = list(/obj/item/food/fishmeat/carp = 2, /obj/item/stack/sheet/animalhide/carp = 3) + ai_controller = /datum/ai_controller/basic_controller/carp/mega /mob/living/basic/carp/mega/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/basic/vermin/frog.dm b/code/modules/mob/living/basic/vermin/frog.dm index a674169dbd5ce..3a288918dbdc1 100644 --- a/code/modules/mob/living/basic/vermin/frog.dm +++ b/code/modules/mob/living/basic/vermin/frog.dm @@ -109,6 +109,7 @@ /datum/ai_controller/basic_controller/frog blackboard = list( + BB_BASIC_MOB_STOP_FLEEING = TRUE, //We only flee from scary fishermen. BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, BB_OWNER_SELF_HARM_RESPONSES = list( @@ -122,7 +123,8 @@ planning_subtrees = list( /datum/ai_planning_subtree/target_retaliate, /datum/ai_planning_subtree/random_speech/frog, - /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman, + /datum/ai_planning_subtree/flee_target/from_fisherman, /datum/ai_planning_subtree/go_for_swim, ) @@ -131,11 +133,18 @@ /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/random_speech/frog, /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman, + /datum/ai_planning_subtree/flee_target/from_fisherman, ) /datum/ai_controller/basic_controller/frog/suicide_frog + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, //No fear, only hatred. It has nothing to lose + ) + planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/find_target_prioritize_traits, /datum/ai_planning_subtree/basic_melee_attack_subtree, ) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 5e1bdf4282686..04feb94b524a7 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1195,9 +1195,10 @@ GLOBAL_LIST_EMPTY(features_by_species) // Get the insulation value based on the area's temp var/thermal_protection = humi.get_insulation_protection(area_temp) + var/original_bodytemp = humi.bodytemperature // Changes to the skin temperature based on the area - var/area_skin_diff = area_temp - humi.bodytemperature + var/area_skin_diff = area_temp - original_bodytemp if(!humi.on_fire || area_skin_diff > 0) // change rate of 0.05 as area temp has large impact on the surface var/area_skin_change = get_temp_change_amount(area_skin_diff, 0.05 * seconds_per_tick) @@ -1217,7 +1218,7 @@ GLOBAL_LIST_EMPTY(features_by_species) // Core to skin temp transfer, when not on fire if(!humi.on_fire) // Get the changes to the skin from the core temp - var/core_skin_diff = humi.coretemperature - humi.bodytemperature + var/core_skin_diff = humi.coretemperature - original_bodytemp // change rate of 0.045 to reflect temp back to the skin at the slight higher rate then core to skin var/core_skin_change = (1 + thermal_protection) * get_temp_change_amount(core_skin_diff, 0.045 * seconds_per_tick) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index e59a6328aa72e..5b43bf980c4a1 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -11,6 +11,8 @@ obscured |= ITEM_SLOT_NECK if(hidden_slots & HIDEMASK) obscured |= ITEM_SLOT_MASK + if(hidden_slots & HIDEBELT) + obscured |= ITEM_SLOT_BELT if(hidden_slots & HIDEEYES) obscured |= ITEM_SLOT_EYES if(hidden_slots & HIDEEARS) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a7531439573e5..70f268c2a454a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -169,13 +169,8 @@ if(now_pushing) return TRUE - var/they_can_move = TRUE - var/their_combat_mode = FALSE - if(isliving(M)) var/mob/living/L = M - their_combat_mode = L.combat_mode - they_can_move = L.mobility_flags & MOBILITY_MOVE //Also spread diseases for(var/thing in diseases) var/datum/disease/D = thing @@ -205,22 +200,7 @@ return TRUE if(!M.buckled && !M.has_buckled_mobs()) - var/mob_swap = FALSE - var/too_strong = (M.move_resist > move_force) //can't swap with immovable objects unless they help us - if(!they_can_move) //we have to physically move them - if(!too_strong) - mob_swap = TRUE - else - //You can swap with the person you are dragging on grab intent, and restrained people in most cases - if(M.pulledby == src && !too_strong) - mob_swap = TRUE - else if( - !(HAS_TRAIT(M, TRAIT_NOMOBSWAP) || HAS_TRAIT(src, TRAIT_NOMOBSWAP)) &&\ - ((HAS_TRAIT(M, TRAIT_RESTRAINED) && !too_strong) || !their_combat_mode) &&\ - (HAS_TRAIT(src, TRAIT_RESTRAINED) || !combat_mode) - ) - mob_swap = TRUE - if(mob_swap) + if(can_mobswap_with(M)) //switch our position with M if(loc && !loc.Adjacent(M.loc)) return TRUE @@ -273,6 +253,46 @@ if(prob(I.block_chance*2)) return +/mob/living/proc/can_mobswap_with(mob/other) + if (HAS_TRAIT(other, TRAIT_NOMOBSWAP) || HAS_TRAIT(src, TRAIT_NOMOBSWAP)) + return FALSE + + var/they_can_move = TRUE + var/their_combat_mode = FALSE + + if(isliving(other)) + var/mob/living/other_living = other + their_combat_mode = other_living.combat_mode + they_can_move = other_living.mobility_flags & MOBILITY_MOVE + + var/too_strong = other.move_resist > move_force + + // They cannot move, see if we can push through them + if (!they_can_move) + return !too_strong + + // We are pulling them and can move through + if (other.pulledby == src && !too_strong) + return TRUE + + // If we're in combat mode and not restrained we don't try to pass through people + if (combat_mode && !HAS_TRAIT(src, TRAIT_RESTRAINED)) + return FALSE + + // Nor can we pass through non-restrained people in combat mode (or if they're restrained but still too strong for us) + if (their_combat_mode && (!HAS_TRAIT(other, TRAIT_RESTRAINED) || too_strong)) + return FALSE + + if (isnull(other.client) || isnull(client)) + return TRUE + + // If both of us are trying to move in the same direction, let the fastest one through first + if (client.intended_direction == other.client.intended_direction) + return cached_multiplicative_slowdown < other.cached_multiplicative_slowdown + + // Else, sure, let us pass + return TRUE + /mob/living/get_photo_description(obj/item/camera/camera) var/list/holding = list() var/len = length(held_items) diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 3a8cec66efd6f..5c4384302b8d6 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -21,18 +21,30 @@ else logevent("FATAL -- SYSTEM HALT") modularInterface.shutdown_computer() + eye_flash_timer = addtimer(CALLBACK(src, PROC_REF(flash_headlamp)), 2 SECONDS, TIMER_STOPPABLE | TIMER_LOOP) . = ..() locked = FALSE //unlock cover if(!QDELETED(builtInCamera) && builtInCamera.camera_enabled) builtInCamera.toggle_cam(src,0) - toggle_headlamp(TRUE) //So borg lights are disabled when killed. + toggle_headlamp(TRUE) //So borg lights are disabled when killed. drop_all_held_items() // particularly to ensure sight modes are cleared - update_icons() - unbuckle_all_mobs(TRUE) - SSblackbox.ReportDeath(src) + +/mob/living/silicon/robot/proc/flash_headlamp() + if(eye_lights) + eye_lights = null + regenerate_icons() + return + + eye_lights = new() + eye_lights.icon_state = "[model.special_light_key ? "[model.special_light_key]":"[model.cyborg_base_icon]"]_e_r" + eye_lights.color = COLOR_WHITE + SET_PLANE_EXPLICIT(eye_lights, ABOVE_GAME_PLANE, src) + eye_lights.icon = icon + regenerate_icons() + add_overlay(eye_lights) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 3fcf652cc6abb..4871370d16c3d 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -583,6 +583,7 @@ /mob/living/silicon/robot/updatehealth() ..() + update_damage_particles() if(!model.breakable_modules) return @@ -680,6 +681,9 @@ builtInCamera.toggle_cam(src, 0) if(full_heal_flags & HEAL_ADMIN) locked = TRUE + if(eye_flash_timer) + deltimer(eye_flash_timer) + eye_flash_timer = null src.set_stat(CONSCIOUS) notify_ai(AI_NOTIFICATION_NEW_BORG) toggle_headlamp(FALSE, TRUE) //This will reenable borg headlamps if doomsday is currently going on still. diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 0e4e79f84ce50..16da8d89783af 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -186,6 +186,52 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return ..() +#define LOW_DAMAGE_UPPER_BOUND 1/3 +#define MODERATE_DAMAGE_UPPER_BOUND 2/3 + +/mob/living/silicon/robot/proc/update_damage_particles() + var/brute_percent = bruteloss / maxHealth + var/burn_percent = fireloss / maxHealth + + if (brute_percent > MODERATE_DAMAGE_UPPER_BOUND) + if(!smoke_particles) + smoke_particles = new(src, /particles/smoke/cyborg/heavy_damage, PARTICLE_ATTACH_MOB) + else if(!istype(smoke_particles.particles, /particles/smoke/cyborg/heavy_damage)) //TODO: needs to be darker + QDEL_NULL(smoke_particles) + smoke_particles = new(src, /particles/smoke/cyborg/heavy_damage, PARTICLE_ATTACH_MOB) + + else if (brute_percent > LOW_DAMAGE_UPPER_BOUND) + if(!smoke_particles) + smoke_particles = new(src, /particles/smoke/cyborg, PARTICLE_ATTACH_MOB) + else if(!istype(smoke_particles.particles, /particles/smoke/cyborg)) + QDEL_NULL(smoke_particles) + smoke_particles = new(src, /particles/smoke/cyborg, PARTICLE_ATTACH_MOB) + + else + if(smoke_particles) + QDEL_NULL(smoke_particles) + + if (burn_percent > MODERATE_DAMAGE_UPPER_BOUND) + if(!spark_particles) + spark_particles = new(src, /particles/embers/spark/severe, PARTICLE_ATTACH_MOB) + else if(!istype(spark_particles.particles, /particles/embers/spark/severe)) //TODO: needs to be more dramatic + QDEL_NULL(spark_particles) + spark_particles = new(src, /particles/embers/spark/severe, PARTICLE_ATTACH_MOB) + + else if (burn_percent > LOW_DAMAGE_UPPER_BOUND) + if(!spark_particles) + spark_particles = new(src, /particles/embers/spark, PARTICLE_ATTACH_MOB) + else if(!istype(spark_particles.particles, /particles/embers/spark)) + QDEL_NULL(spark_particles) + spark_particles = new(src, /particles/embers/spark, PARTICLE_ATTACH_MOB) + + else + if(spark_particles) + QDEL_NULL(spark_particles) + +#undef LOW_DAMAGE_UPPER_BOUND +#undef MODERATE_DAMAGE_UPPER_BOUND + /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) if (LAZYACCESS(modifiers, RIGHT_CLICK)) if(body_position == STANDING_UP) @@ -214,7 +260,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if(!wiresexposed && !issilicon(user)) if(!cell) return - cell.update_appearance() cell.add_fingerprint(user) to_chat(user, span_notice("You remove \the [cell].")) user.put_in_active_hand(cell) @@ -402,7 +447,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if(stat != DEAD) adjustBruteLoss(30) else - investigate_log("has been gibbed a blob.", INVESTIGATE_DEATHS) + investigate_log("has been gibbed by a blob.", INVESTIGATE_DEATHS) gib(DROP_ALL_REMAINS) return TRUE diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index 33026d70921fb..e6af597bc60b7 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -57,6 +57,8 @@ // Overlay for borg eye lights var/mutable_appearance/eye_lights + ///Holds a reference to the timer taking care of blinking lights on dead cyborgs + var/eye_flash_timer = null // Overlay for borg hat var/mutable_appearance/hat_overlay @@ -115,6 +117,10 @@ var/low_power_mode = FALSE ///So they can initialize sparks whenever/N var/datum/effect_system/spark_spread/spark_system + ///Smoke particle holder for brute damage + var/obj/effect/abstract/particle_holder/smoke_particles = null + ///Spark particle holder for burn damage + var/obj/effect/abstract/particle_holder/spark_particles = null ///Jetpack-like effect. var/ionpulse = FALSE diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index c483d371e1aa3..e2bb112e1565e 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -556,7 +556,6 @@ if(istype(item_to_drop, /obj/item/stock_parts/power_store/cell)) var/obj/item/stock_parts/power_store/cell/dropped_cell = item_to_drop dropped_cell.charge = 0 - dropped_cell.update_appearance() else if(istype(item_to_drop, /obj/item/storage)) var/obj/item/storage/storage_to_drop = item_to_drop diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 6b9b4aa77faee..f3194e88b1862 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -754,7 +754,6 @@ new /obj/item/stack/cable_coil/cut(Tsec) if(cell) cell.forceMove(Tsec) - cell.update_appearance() cell = null new /obj/effect/decal/cleanable/oil(loc) diff --git a/code/modules/mob/mob_update_icons.dm b/code/modules/mob/mob_update_icons.dm index a355a385d9faa..b14da72e83061 100644 --- a/code/modules/mob/mob_update_icons.dm +++ b/code/modules/mob/mob_update_icons.dm @@ -54,6 +54,8 @@ update_worn_shoes(update_obscured = FALSE) if(obscured_flags & HIDEMASK) update_worn_mask(update_obscured = FALSE) + if(obscured_flags & HIDEBELT) + update_worn_belt(update_obscured = FALSE) if(obscured_flags & HIDEEARS) update_worn_ears(update_obscured = FALSE) if(obscured_flags & HIDEEYES) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 78ff7e9952bd1..cf91aaf482c22 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -537,7 +537,7 @@ radial_anchor = get_turf(user.loc) //they're phased out via some module, anchor the radial on the turf so it may still display if (!isnull(anchor_override)) radial_anchor = anchor_override - var/pick = show_radial_menu(user, radial_anchor, items, custom_check = FALSE, require_near = isnull(anchor_override), tooltips = TRUE) + var/pick = show_radial_menu(user, radial_anchor, items, custom_check = FALSE, require_near = isnull(anchor_override), tooltips = TRUE, user_space = !isnull(anchor_override)) if(!pick) return var/module_reference = display_names[pick] diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index 0c13efa1b950c..5f93427f53277 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -173,7 +173,6 @@ /obj/item/mod/core/standard/proc/uninstall_cell() if(!cell) return - cell.update_appearance() cell = null mod.update_charge_alert() diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 1699fc4e2e38e..394ddea0ecdea 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -479,21 +479,21 @@ ), /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEBELT, UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE, SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE, ), /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_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, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, UNSEALED_MESSAGE = BOOT_UNSEAL_MESSAGE, SEALED_MESSAGE = BOOT_SEAL_MESSAGE, @@ -502,7 +502,7 @@ "asteroid" = list( /obj/item/clothing/head/mod = list( UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE|HEADINTERNALS, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, @@ -511,21 +511,21 @@ ), /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEBELT, UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE, SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE, ), /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_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, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, UNSEALED_MESSAGE = BOOT_UNSEAL_MESSAGE, SEALED_MESSAGE = BOOT_SEAL_MESSAGE, diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 5125b70a9a7ad..db9d150f3438a 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -123,7 +123,7 @@ theme = /datum/mod_theme/mining applied_core = /obj/item/mod/core/plasma applied_modules = list( - /obj/item/mod/module/storage, + /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/gps, /obj/item/mod/module/orebag, /obj/item/mod/module/clamp, diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index e14fc483c0b9d..8db88e16ba312 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -286,7 +286,6 @@ icon_state = "apparatus" complexity = 1 incompatible_modules = list(/obj/item/mod/module/mouthhole) - overlay_state_inactive = "module_apparatus" required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK) /// Former flags of the helmet. var/former_helmet_flags = NONE @@ -712,6 +711,7 @@ attached_hat = hat var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) if(istype(helmet)) + helmet.attach_clothing_traits(attached_hat.clothing_traits) former_flags = helmet.flags_cover former_visor_flags = helmet.visor_flags_cover helmet.flags_cover |= attached_hat.flags_cover @@ -734,11 +734,12 @@ balloon_alert(user, "hat removed") else balloon_alert_to_viewers("the hat falls to the floor!") - attached_hat = null var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) if(istype(helmet)) + helmet.detach_clothing_traits(attached_hat) helmet.flags_cover = former_flags helmet.visor_flags_cover = former_visor_flags + attached_hat = null mod.wearer.update_clothing(mod.slot_flags) /obj/item/mod/module/hat_stabilizer/syndicate diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 90fe374cf9c0a..481ccde663b72 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -308,7 +308,6 @@ /obj/machinery/power/apc/Exited(atom/movable/gone, direction) . = ..() if(gone == cell) - cell.update_appearance() cell = null charging = APC_NOT_CHARGING update_appearance() diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index 2072ab145614d..8e4d51a703da6 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -320,7 +320,6 @@ balloon_alert(user, "cell removed") var/turf/user_turf = get_turf(user) cell.forceMove(user_turf) - cell.update_appearance() cell = null charging = APC_NOT_CHARGING update_appearance() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index a8e20cde8c7a0..65b4f01722959 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -565,22 +565,42 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri // General procedures /////////////////////////////////// //you can use wires to heal robotics -/obj/item/stack/cable_coil/attack(mob/living/carbon/human/H, mob/user) - if(!istype(H)) - return ..() - var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) - if(affecting && IS_ROBOTIC_LIMB(affecting)) - if(user == H) - user.visible_message(span_notice("[user] starts to fix some of the wires in [H]'s [affecting.name]."), span_notice("You start fixing some of the wires in [H == user ? "your" : "[H]'s"] [affecting.name].")) - if(!do_after(user, 5 SECONDS, H)) - return - if(H.item_heal(user, 0, 15, "dents", "burnt wires", BODYTYPE_ROBOTIC)) - use(1) +/obj/item/stack/cable_coil/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!ishuman(interacting_with)) + return NONE + + if(user.combat_mode) + return NONE + + return try_heal_loop(interacting_with, user) + +/obj/item/stack/cable_coil/proc/try_heal_loop(atom/interacting_with, mob/living/user, repeating = FALSE) + var/mob/living/carbon/human/attacked_humanoid = interacting_with + var/obj/item/bodypart/affecting = attacked_humanoid.get_bodypart(check_zone(user.zone_selected)) + if(isnull(affecting) || !IS_ROBOTIC_LIMB(affecting)) + return NONE + + if (!affecting.get_damage()) return - else - return ..() + user.visible_message(span_notice("[user] starts to fix some of the wires in [attacked_humanoid == user ? user.p_their() : "[attacked_humanoid]'s"] [affecting.name]."), + span_notice("You start fixing some of the wires in [attacked_humanoid == user ? "your" : "[attacked_humanoid]'s"] [affecting.name].")) + + var/use_delay = repeating ? 1 SECONDS : 0 + if(user == attacked_humanoid) + use_delay = 5 SECONDS + + if(!do_after(user, use_delay, attacked_humanoid)) + return ITEM_INTERACT_BLOCKING + + if (!attacked_humanoid.item_heal(user, brute_heal = 0, burn_heal = 15, heal_message_brute = "dents", heal_message_burn = "burnt wires", required_bodytype = BODYTYPE_ROBOTIC)) + return ITEM_INTERACT_BLOCKING + + if (use(1) && amount > 0) + INVOKE_ASYNC(src, PROC_REF(try_heal_loop), interacting_with, user, TRUE) + + return ITEM_INTERACT_SUCCESS /////////////////////////////////////////////// // Cable laying procedures diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 1e561c6030792..ecab6e4eee9a1 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -78,6 +78,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) /obj/machinery/gravity_generator/part/Destroy() atom_break() if(main_part) + main_part.generator_parts -= src UnregisterSignal(main_part, COMSIG_ATOM_UPDATED_ICON) main_part = null return ..() diff --git a/code/modules/power/lighting/light_construct.dm b/code/modules/power/lighting/light_construct.dm index ec09fdc26924f..902ca9fb0eb3d 100644 --- a/code/modules/power/lighting/light_construct.dm +++ b/code/modules/power/lighting/light_construct.dm @@ -63,7 +63,6 @@ return user.visible_message(span_notice("[user] removes [cell] from [src]!"), span_notice("You remove [cell].")) user.put_in_hands(cell) - cell.update_appearance() cell = null add_fingerprint(user) diff --git a/code/modules/power/power_store.dm b/code/modules/power/power_store.dm index 688dc70908f36..8bbaa5bc0fe58 100644 --- a/code/modules/power/power_store.dm +++ b/code/modules/power/power_store.dm @@ -57,6 +57,13 @@ ) AddElement(/datum/element/connect_loc, loc_connections) + +/obj/item/stock_parts/power_store/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + . = ..() + if(!isturf(old_loc)) + update_appearance() + + /** * Signal proc for [COMSIG_ITEM_MAGICALLY_CHARGED] * diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index d009cabd1a9a3..8a8b4dbacfccc 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -5,6 +5,8 @@ name = "projectile gun" icon_state = "debug" w_class = WEIGHT_CLASS_NORMAL + pickup_sound = 'sound/items/gun_pick_up.ogg' + drop_sound = 'sound/items/gun_drop.ogg' ///sound when inserting magazine var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 3571e0858c8af..9c16133e1ea35 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -3,6 +3,8 @@ name = "energy gun" desc = "A basic energy-based gun." icon = 'icons/obj/weapons/guns/energy.dmi' + pickup_sound = 'sound/items/gun_pick_up.ogg' + drop_sound = 'sound/items/gun_drop.ogg' /// What type of power cell this uses var/obj/item/stock_parts/power_store/cell diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 91b921b4f7c72..237dcb862af50 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -247,11 +247,6 @@ /obj/machinery/chem_master/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/chem_master/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/spritesheet/chemmaster) - ) - /obj/machinery/chem_master/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -273,9 +268,10 @@ //add containers to this category for(var/obj/item/reagent_containers/container as anything in printable_containers[category]) category_list["containers"] += list(list( - "icon" = sanitize_css_class_name("[container]"), "ref" = REF(container), "name" = initial(container.name), + "icon" = initial(container.icon), + "icon_state" = initial(container.icon_state), "volume" = initial(container.volume), )) diff --git a/code/modules/reagents/reagent_containers/misc.dm b/code/modules/reagents/reagent_containers/misc.dm index d2dc2adfb5f76..8b13ab4a54beb 100644 --- a/code/modules/reagents/reagent_containers/misc.dm +++ b/code/modules/reagents/reagent_containers/misc.dm @@ -91,7 +91,6 @@ /obj/item/reagent_containers/cup/maunamug/attack_hand(mob/living/user, list/modifiers) if(cell && open) - cell.update_appearance() user.put_in_hands(cell) cell = null to_chat(user, span_notice("You remove the power cell from [src].")) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index bb426436599c0..dc54dcd7db44b 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -229,6 +229,8 @@ stream_range = 4 amount_per_transfer_from_this = 5 list_reagents = list(/datum/reagent/consumable/condensedcapsaicin = 50) + pickup_sound = 'sound/items/pepper_spray_pick_up.ogg' + drop_sound = 'sound/items/pepper_spray_drop.ogg' /obj/item/reagent_containers/spray/pepper/empty //for protolathe printing list_reagents = null diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 9b26ca860d88d..23ad6fd213dba 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -90,8 +90,7 @@ var/list/boostlist = host.boosted_nodes[id] for(var/booster in boostlist) if(actual_costs[booster]) - var/delta = max(0, actual_costs[booster] - 250) - actual_costs[booster] -= min(boostlist[booster], delta) + actual_costs[booster] = max(actual_costs[booster] - boostlist[booster], 0) return actual_costs diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index be805ae9da82f..6ec7fca37e362 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -715,13 +715,10 @@ if(!dumb_mob.compare_sentience_type(sentience_type)) // Will also return false if not a basic or simple mob, which are the only two we want anyway balloon_alert(user, "invalid creature!") return - if(isnull(potion_reason)) - balloon_alert(user, "no reason for offering set!") - return balloon_alert(user, "offering...") being_used = TRUE var/mob/chosen_one = SSpolling.poll_ghosts_for_target( - question = "[span_danger(user.name)] is offering [span_notice(dumb_mob.name)] an intelligence potion! Reason: [span_boldnotice(potion_reason)]", + question = "[span_danger(user.name)] is offering [span_notice(dumb_mob.name)] an intelligence potion![potion_reason ? " Reason: [span_boldnotice(potion_reason)]" : ""]", check_jobban = ROLE_SENTIENCE, poll_time = 20 SECONDS, checked_target = dumb_mob, diff --git a/code/modules/surgery/organs/organ_movement.dm b/code/modules/surgery/organs/organ_movement.dm index 2889cbe07081b..ff9f753ce18a1 100644 --- a/code/modules/surgery/organs/organ_movement.dm +++ b/code/modules/surgery/organs/organ_movement.dm @@ -161,6 +161,7 @@ UnregisterSignal(organ_owner, COMSIG_ATOM_EXAMINE) SEND_SIGNAL(src, COMSIG_ORGAN_REMOVED, organ_owner) SEND_SIGNAL(organ_owner, COMSIG_CARBON_LOSE_ORGAN, src, special) + ADD_TRAIT(src, TRAIT_USED_ORGAN, ORGAN_TRAIT) var/list/diseases = organ_owner.get_static_viruses() if(!LAZYLEN(diseases)) diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm index 4b3e59a6028c7..806696dcf4f44 100644 --- a/code/modules/tgui_input/text.dm +++ b/code/modules/tgui_input/text.dm @@ -140,9 +140,9 @@ switch(action) if("submit") if(max_length) - if(length(params["entry"]) > max_length) + if(length_char(params["entry"]) > max_length) CRASH("[usr] typed a text string longer than the max length") - if(encode && (length(html_encode(params["entry"])) > max_length)) + if(encode && (length_char(html_encode(params["entry"])) > max_length)) to_chat(usr, span_notice("Your message was clipped due to special character usage.")) set_entry(params["entry"]) closed = TRUE diff --git a/code/modules/unit_tests/fish_unit_tests.dm b/code/modules/unit_tests/fish_unit_tests.dm index 1db534c5e076c..5cb582ca9694a 100644 --- a/code/modules/unit_tests/fish_unit_tests.dm +++ b/code/modules/unit_tests/fish_unit_tests.dm @@ -226,10 +226,11 @@ /datum/unit_test/raise_a_chasm_crab/Run() var/obj/structure/aquarium/crab/aquarium = allocate(/obj/structure/aquarium/crab) - var/mob/living/basic/mining/lobstrosity/juvenile/lobster = aquarium.crabbie.grow_up(1) //one stands for a second - TEST_ASSERT(lobster, "The test aquarium's chasm crab didn't grow up into a lobstrosity.[aquarium.crabbie ? " The aquarium crab is still here and at about [aquarium.crabbie.maturation]% maturation" : ""]") - allocated |= lobster //make sure it's allocated and thus properly deleted when the test is over + SEND_SIGNAL(aquarium.crabbie, COMSIG_FISH_LIFE, 1) //give the fish growth component a small push. + var/mob/living/basic/mining/lobstrosity/juvenile/lobster = locate() in aquarium.loc TEST_ASSERT_EQUAL(lobster.loc, get_turf(aquarium), "The lobstrosity didn't spawn on the aquarium's turf") + TEST_ASSERT(QDELETED(aquarium.crabbie), "The test aquarium's chasm crab didn't delete itself.") + allocated |= lobster //make sure it's allocated and thus properly deleted when the test is over //While ideally impossible to have all traits because of incompatible ones, I want to be sure they don't error out. for(var/trait_type in GLOB.fish_traits) var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index bf963587ae1cc..7e501217eb68c 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -2,9 +2,17 @@ /// Selects a set number of unique items from the uplink, and deducts a percentage discount from them /proc/create_uplink_sales(num, datum/uplink_category/category, limited_stock, list/sale_items) var/list/sales = list() - var/list/sale_items_copy = sale_items.Copy() + var/list/per_category = list() + + for (var/datum/uplink_item/possible_sale as anything in sale_items) + if (!(possible_sale.category in per_category)) + per_category[possible_sale.category] = list() + per_category[possible_sale.category] += possible_sale + for (var/i in 1 to num) - var/datum/uplink_item/taken_item = pick_n_take(sale_items_copy) + var/datum/uplink_category/item_category = pick(per_category) + var/datum/uplink_item/taken_item = pick(per_category[item_category]) + per_category -= item_category var/datum/uplink_item/uplink_item = new taken_item.type() var/discount = uplink_item.get_discount() var/static/list/disclaimer = list( diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm index dae6166d49ceb..b6cdc2fd3d657 100644 --- a/code/modules/uplink/uplink_items/bundle.dm +++ b/code/modules/uplink/uplink_items/bundle.dm @@ -40,18 +40,7 @@ // Don't add telecrystals to the purchase_log since // it's just used to buy more items (including itself!) purchase_log_vis = FALSE - -/datum/uplink_item/bundles_tc/telecrystal/five - name = "5 Raw Telecrystals" - desc = "Five telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." - item = /obj/item/stack/telecrystal/five - cost = 5 - -/datum/uplink_item/bundles_tc/telecrystal/twenty - name = "20 Raw Telecrystals" - desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." - item = /obj/item/stack/telecrystal/twenty - cost = 20 + purchasable_from = NONE /datum/uplink_item/bundles_tc/bundle_a name = "Syndi-kit Tactical" diff --git a/code/modules/uplink/uplink_items/suits.dm b/code/modules/uplink/uplink_items/suits.dm index d940d4eb06769..b66cce4eaece7 100644 --- a/code/modules/uplink/uplink_items/suits.dm +++ b/code/modules/uplink/uplink_items/suits.dm @@ -79,3 +79,4 @@ purchasable_from = ~UPLINK_ALL_SYNDIE_OPS progression_minimum = 90 MINUTES cost = 16 + cant_discount = TRUE diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index c2d37ee6e8348..b4c292202542e 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -149,8 +149,9 @@ /obj/machinery/mecha_part_fabricator/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) return FALSE - if(user.job != JOB_ROBOTICIST) - to_chat(user, span_warning("You clicking and typing but don’t understand what to do with it")) + if(!HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + to_chat(user, span_warning("You're unsure about [emag_card ? "where to swipe [emag_card] over" : "how to override"] [src] for any effect. Maybe if you had more knowledge of robotics...")) + return FALSE obj_flags |= EMAGGED for(var/found_illegal_mech_nods in SSresearch.techweb_nodes) @@ -179,6 +180,9 @@ if(design.build_type & MECHFAB) cached_designs |= design + for(var/datum/design/illegal_disign in illegal_local_designs) + cached_designs |= illegal_disign + var/design_delta = cached_designs.len - previous_design_count if(design_delta > 0) diff --git a/code/modules/vehicles/mecha/mech_melee_attack.dm b/code/modules/vehicles/mecha/mech_melee_attack.dm index 6fe64c879fa71..f37d092b83f32 100644 --- a/code/modules/vehicles/mecha/mech_melee_attack.dm +++ b/code/modules/vehicles/mecha/mech_melee_attack.dm @@ -72,6 +72,22 @@ return return ..() +/obj/vehicle/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) + if(!user.combat_mode) + return FALSE + + mecha_attacker.do_attack_animation(src) + switch(mecha_attacker.damtype) + if(BRUTE) + playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) + if(BURN) + playsound(src, 'sound/items/welder.ogg', 50, TRUE) + else + return + mecha_attacker.visible_message(span_danger("[mecha_attacker] hits [src]!"), span_danger("You hit [src]!"), null, COMBAT_MESSAGE_RANGE) + ..() + return take_damage(mecha_attacker.force, mecha_attacker.damtype, "melee", FALSE, get_dir(src, mecha_attacker)) + /mob/living/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) if(istype(user) && !user.combat_mode) step_away(src, mecha_attacker) diff --git a/code/modules/vehicles/mecha/mecha_ai_interaction.dm b/code/modules/vehicles/mecha/mecha_ai_interaction.dm index 3a681cac97db5..cec3d867e2b6a 100644 --- a/code/modules/vehicles/mecha/mecha_ai_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_ai_interaction.dm @@ -12,7 +12,7 @@ to_chat(user, "[span_userdanger("ASSUME DIRECT CONTROL?")]
") return examine(user) - if(length(return_drivers()) > 0) + if(length(return_occupants()) >= max_occupants) to_chat(user, span_warning("This exosuit has a pilot and cannot be controlled.")) return var/can_control_mech = FALSE @@ -103,6 +103,7 @@ AI.controlled_equipment = src AI.remote_control = src AI.ShutOffDoomsdayDevice() + add_occupant(AI) to_chat(AI, AI.can_dominate_mechs ? span_greenannounce("Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!") :\ span_notice("You have been uploaded to a mech's onboard computer.")) to_chat(AI, "Use Middle-Mouse or the action button in your HUD to toggle equipment safety. Clicks with safety enabled will pass AI commands.") diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm index cecf6b815e249..6a38f65e3bf09 100644 --- a/code/modules/vehicles/motorized_wheelchair.dm +++ b/code/modules/vehicles/motorized_wheelchair.dm @@ -100,7 +100,6 @@ /obj/vehicle/ridden/wheelchair/motorized/attack_hand(mob/living/user, list/modifiers) if(!power_cell || !panel_open) return ..() - power_cell.update_appearance() to_chat(user, span_notice("You remove [power_cell] from [src].")) user.put_in_hands(power_cell) power_cell = null diff --git a/code/modules/vending/subtype.dm b/code/modules/vending/subtype.dm index 9b4f212224ea7..3a1a04ff6e764 100644 --- a/code/modules/vending/subtype.dm +++ b/code/modules/vending/subtype.dm @@ -10,6 +10,7 @@ circuit = null product_slogans = "Spawn \" too annoying? Too lazy to open game panel? This one's for you!;Subtype vendor, for all your debugging woes!" default_price = 0 + onstation = FALSE /// Spawns coders by default var/type_to_vend = /obj/item/food/grown/citrus diff --git a/html/changelogs/AutoChangeLog-pr-85298.yml b/html/changelogs/AutoChangeLog-pr-85298.yml new file mode 100644 index 0000000000000..5c187e2fe2ea2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85298.yml @@ -0,0 +1,5 @@ +author: "Tattle" +delete-after: True +changes: + - qol: "dead cyborgs now blink yellow lights" + - qol: "damaged cyborgs have smoke particles when they've taken brute damage, and sparks for burn" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85365.yml b/html/changelogs/AutoChangeLog-pr-85365.yml new file mode 100644 index 0000000000000..281e4890286a1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85365.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Stop clientless lobstrosities from fishing other lobstrosities, which in turn can fish other lobstrosities and so on." + - balance: "Stop clientless lobstrosities from fishing the lavaland fishing spot chest." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85368.yml b/html/changelogs/AutoChangeLog-pr-85368.yml deleted file mode 100644 index 6cb72d36e4bf1..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-85368.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - image: "All implants have received a fresh coat of paint" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85377.yml b/html/changelogs/AutoChangeLog-pr-85377.yml new file mode 100644 index 0000000000000..8cdac0e80f925 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85377.yml @@ -0,0 +1,5 @@ +author: "SmArtKar" +delete-after: True +changes: + - qol: "Cable coil and welding tool healing now loops similarly to sutures/meshes" + - bugfix: "Fixed cable coil/welding tool heal message not displaying when healing someone else" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85418.yml b/html/changelogs/AutoChangeLog-pr-85418.yml new file mode 100644 index 0000000000000..bd4b81c32d904 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85418.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - qol: "Callouts and MODsuit quick module pickers now track user" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85439.yml b/html/changelogs/AutoChangeLog-pr-85439.yml new file mode 100644 index 0000000000000..b8d347f6044a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85439.yml @@ -0,0 +1,4 @@ +author: "necromanceranne" +delete-after: True +changes: + - bugfix: "Shoving someone onto a table now causes them to become vulnerable to being stunned." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85442.yml b/html/changelogs/AutoChangeLog-pr-85442.yml new file mode 100644 index 0000000000000..c34cd382d40fb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85442.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - qol: "Skills are passed down to bitrunning avatars and then back to the original body." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85443.yml b/html/changelogs/AutoChangeLog-pr-85443.yml new file mode 100644 index 0000000000000..e3459099c07d1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85443.yml @@ -0,0 +1,5 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Bamboo staves can now be wielded" + - bugfix: "Bostaff no longer disappears forever when wielded" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85445.yml b/html/changelogs/AutoChangeLog-pr-85445.yml new file mode 100644 index 0000000000000..918cfdb676eb6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85445.yml @@ -0,0 +1,4 @@ +author: "FlufflesTheDog" +delete-after: True +changes: + - bugfix: "Existing gas flow meters have been recalled and replaced due to a faulty screen connection, and once again convey pressure and temperature" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85447.yml b/html/changelogs/AutoChangeLog-pr-85447.yml new file mode 100644 index 0000000000000..4b7851a03acfb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85447.yml @@ -0,0 +1,5 @@ +author: "Y0SH1M4S73R" +delete-after: True +changes: + - admin: "The layout of the lua editor has been tweaked slightly." + - admin: "In the lua editor, you can now toggle whether to log runtimes the viewed state is involved in." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85448.yml b/html/changelogs/AutoChangeLog-pr-85448.yml new file mode 100644 index 0000000000000..270d19314e31a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85448.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - rscadd: "Adds a bronze dimensional theme" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85454.yml b/html/changelogs/AutoChangeLog-pr-85454.yml new file mode 100644 index 0000000000000..f6b0ce36ed377 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85454.yml @@ -0,0 +1,4 @@ +author: "Majkl-J" +delete-after: True +changes: + - bugfix: "Flashdarks now broduce darkness upon toggling" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85455.yml b/html/changelogs/AutoChangeLog-pr-85455.yml new file mode 100644 index 0000000000000..a1f747620d5a9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85455.yml @@ -0,0 +1,5 @@ +author: "MTandi" +delete-after: True +changes: + - qol: "new uplink UI" + - qol: "made it possible to buy a custom amount of TC, instead of bundles with fixed amounts" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85457.yml b/html/changelogs/AutoChangeLog-pr-85457.yml new file mode 100644 index 0000000000000..9fdd6e881a532 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85457.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Rice hat no longer disappears upon being toggled and can be raised back up. Toggling sprites is now done by alt-clicking" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85461.yml b/html/changelogs/AutoChangeLog-pr-85461.yml new file mode 100644 index 0000000000000..4e218fa179f2d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85461.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Putting people you're fireman carrying into contractor pods no longer sends both of you to zelda's shadow realm" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85462.yml b/html/changelogs/AutoChangeLog-pr-85462.yml new file mode 100644 index 0000000000000..2f30fe9f45dba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85462.yml @@ -0,0 +1,4 @@ +author: "Jacquerel" +delete-after: True +changes: + - admin: "Adds some missing traits to the mob trait list in VV" \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index f4a64a129e247..632d897df753a 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -1493,3 +1493,15 @@ - code_imp: 'improves reagent cross pollination code :cl:' +2024-07-31: + Jacquerel: + - image: Big balls are now much rounder, to more easily slide down into a cannon. + SmArtKar: + - image: All implants have received a fresh coat of paint + rroqc: + - bugfix: 'fix a bug where botany reagents would dissapear from existing plants + + :cl:' + thegrb93: + - bugfix: Fixes getting permanently hot or cold if wearing thermal insulation as + a lizard diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml new file mode 100644 index 0000000000000..7b10ef0da9589 --- /dev/null +++ b/html/changelogs/archive/2024-08.yml @@ -0,0 +1,101 @@ +2024-08-01: + 00-Steven: + - bugfix: You no longer render on top of tall enough objects that get vertically + offset when anchored to a table when standing on the tile directly to the north + of them. Examples are soda and booze dispensers. + - bugfix: Removing the vertical offset some objects get when anchored to a table + can be done by unanchoring it at any point, rather than only on a table. + ArcaneMusic: + - qol: NODE drones summoned to tap a vent within ore vents now display a green status + light to show how much longer they need the vent defended for. + Axidyuwu: + - bugfix: fixes a way of duplicating iron with wallmounted sparklers and light switches + Bisar: + - qol: Machines check their parts during initialization now; this will usually apply + in cases such as a machine in a prefab having been varedited to be upgraded. + - code_imp: All machines check their parts during initialization. + Ghommie: + - rscadd: Added tadpoles, which can be scooped from puddles with right-click. Functionally + they're like most fish, which require an aquarium to survive, and also need + to be fed fairly frequently, however they quickly become frogs after about 3 + minutes of care. + - rscadd: Every station now has a couple puddles. One at the public garden and the + other in prison. + - qol: Changed the name of an aquarium UI button from "Reproduction Prevention" + to "Reproduction and Growth", as it controls both fish breeding and growth. + - rscadd: Carps, frogs and young lobstrosities now fear people wearing fishing hats! + Adults and megacarp favour the 'fight' part of the fear reflex however. + - bugfix: The hat stabilizer module now inherits the clothing traits of the attached + hat. + Helg2: + - bugfix: Emergency climbing hooks now shouldn't spawn on non multi-z stations. + Jackraxxus: + - bugfix: AI mech control beacons and malf AI dominate mech work again. + LT3: + - bugfix: Scanner gate now detects items thrown through it + - bugfix: Scanner gate does not alarm for guns on players with mindshield + - bugfix: Scanner gate does not alarm for guns on players with weapons ID card access + - sound: Reduced volume of scanner gate alarm + MTandi: + - image: Made chem master container icons not blurry + - bugfix: Portable atmos machine circuit boards list correct components + - bugfix: Portable atmos machine circuit boards accept unwrenched fittings + - bugfix: Portable atmos machines are movable on construction + - qol: smart fridge UI now groups items by type+name instead of just type + - qol: smart fridge UI now shows item names next to the images + - qol: smart fridge UI has a list view option (default for chem and viro versions) + - bugfix: fixed smart fridge stacking sounds when dispensing multiple items + - qol: Renamed seed packs to have the plant name at the beginning + Majkl-J: + - bugfix: Fixes the echolocation screen overlay not appearing with default arguments + due to using the wrong icon state + Momo8289: + - bugfix: The charge indicators on power cells now work properly. + - code_imp: Removed some now redundant power cell appearance updates + Rhials: + - qol: Sentience potions can now be used without a provided summon reason. + - rscadd: Spies can now pick their own custom objectives, if they so choose. + Sadboysuss: + - bugfix: The clown planet domain is now completable + - bugfix: rod sounds will now vary in pitch + - bugfix: spray can face spraying will no longer work on light-sensitives with eyewear + and people wearing eye covering masks + - bugfix: birdshot engineering feedback has been applied + SmArtKar: + - bugfix: Bank cards speak once more + - bugfix: Removed a rogue wall grinder on icebox + - bugfix: Silicons and simplemobs can also hear radio chatter now + - bugfix: Heart eater wizard perk no longer works activates on organs that haven't + been used before + - qol: You can now reorder items inside storages by dragging them + - balance: Mining MODsuits are now considered thick clothing and gained expanded + storage. + - image: Mining MODsuits got a slight glowup and hide belts now + - bugfix: Fixed advanced pods showing up as cultist pods + - admin: Subtype vendor no longer requries an ID + - qol: You no longer goofily swap with others trying to move in the same direction + as you if you're not faster than them + - code_imp: Moved mobswap check logic into a separate proc and made it more readable + - balance: Discounts now pick 4-6 items each from a unique category + - balance: Items that cost below 4 TC cannot get discounted anymore + - balance: Elite syndicate MODs for traitors can no longer get discounted + - bugfix: Fixed NT Frontier discounts not applying + Watermelon914: + - admin: Turfs in lua will no longer become invalid on deletion. + - bugfix: Fixes SS13.wait not working when called multiple times before it finishes + waiting. + Xackii: + - bugfix: Justice design no longer disappears + - bugfix: Mechs can attack other mechs in melee + - rscadd: RD can emag mech fabricator(like roboticist). + carlarctg: + - rscdel: Revert "Heretic spell invocations now use one dead language per path" + grungussuss: + - bugfix: the abandoned plasma research facility on icemoon no longer has an item + that shouldn't exist + mc-oofert: + - bugfix: wawastation pharmacy now has a hand labeller + rroqc: + - rscadd: 'durathread robes can now store botany gear + + :cl:' diff --git a/icons/mob/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi index 3a567eac4e724..cb2a472c32ed6 100644 Binary files a/icons/mob/clothing/modsuit/mod_clothing.dmi and b/icons/mob/clothing/modsuit/mod_clothing.dmi differ diff --git a/icons/mob/clothing/modsuit/mod_modules.dmi b/icons/mob/clothing/modsuit/mod_modules.dmi index 3c41dac86b2d4..4f2dc9740d1f7 100644 Binary files a/icons/mob/clothing/modsuit/mod_modules.dmi and b/icons/mob/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/mob/silicon/robots.dmi b/icons/mob/silicon/robots.dmi index 5c79a0f95e39b..c2780ce26abea 100644 Binary files a/icons/mob/silicon/robots.dmi and b/icons/mob/silicon/robots.dmi differ diff --git a/icons/obj/aquarium/fish.dmi b/icons/obj/aquarium/fish.dmi index ab282e1681be9..638c8300f304a 100644 Binary files a/icons/obj/aquarium/fish.dmi and b/icons/obj/aquarium/fish.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_clothing.dmi b/icons/obj/clothing/modsuit/mod_clothing.dmi index 85dd82449709f..6ab49417aa52f 100644 Binary files a/icons/obj/clothing/modsuit/mod_clothing.dmi and b/icons/obj/clothing/modsuit/mod_clothing.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index 6ec143a849e1c..36d95aa61fdbb 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 1f6393a8c51ba..991762dba3d59 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/pipes_n_cables/meter.dmi b/icons/obj/pipes_n_cables/meter.dmi index 0535fda8010bd..fa0d5e3bf4d88 100644 Binary files a/icons/obj/pipes_n_cables/meter.dmi and b/icons/obj/pipes_n_cables/meter.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index f13b10bdf4a8a..489d045968984 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/lua/timer.lua b/lua/timer.lua index 4bcbf111b9be0..e79cc8cdca54b 100644 --- a/lua/timer.lua +++ b/lua/timer.lua @@ -60,8 +60,9 @@ __Timer_timer_process = function(seconds_per_tick) end function Timer.wait(time) + local yieldIndex = _exec.next_yield_index __add_internal_timer(function() - SSlua:queue_resume(state.state, _exec.next_yield_index) + SSlua:queue_resume(state.state, yieldIndex) end, time * 10, false) coroutine.yield() end diff --git a/sound/items/attributions.txt b/sound/items/attributions.txt index a9e708c477c68..9ad1a09d8cb41 100644 --- a/sound/items/attributions.txt +++ b/sound/items/attributions.txt @@ -24,6 +24,21 @@ plastic_pick_up.ogg - https://freesound.org/people/Jessica190091/sounds/491304/ plastic_drop.ogg - https://freesound.org/people/martian/sounds/338854/ , License: CC0 } - edited by sadboysuss +{ +gun_drop.ogg - FN FAL Rifle Load and Cock 01.mp3 by PNMCarrieRailfan -- https://freesound.org/s/682029/ -- License: Attribution NonCommercial 4.0 +gun_pick_up.ogg - FN FAL Rifle Unload and Cock.mp3 by PNMCarrieRailfan -- https://freesound.org/s/682031/ -- License: Attribution NonCommercial 4.0 +handcuffs_drop.ogg - handcuffs.ogg by kimuracarter -- https://freesound.org/s/528749/ -- License: Attribution 3.0 +handcuffs_pick_up.ogg - handcuffs.ogg by kimuracarter -- https://freesound.org/s/528749/ -- License: Attribution 3.0 +plastic_shield_drop.ogg - made by sadboysuss -- License: CC-by-SA +plastic_shield_pick_up.ogg - made by sadboysuss -- License: CC-by-SA +stun_baton_drop.ogg - Fn P90 Submachine Gun 5.7Mm. Mechan; Empty Mag Inserted Into And Pulled Out Slow And Various 02 by PNMCarrieRailfan -- https://freesound.org/s/682041/ -- License: Attribution NonCommercial 4.0 +stun_baton_pick_up.ogg - Fn P90 Submachine Gun 5.7Mm. Mechan; Empty Mag Inserted Into And Pulled Out Slow And Various 02 by PNMCarrieRailfan -- https://freesound.org/s/682041/ -- License: Attribution NonCommercial 4.0 +pepper_spray_drop.ogg - Spray Paint Shake Slow Five.wav by cbakos -- https://freesound.org/s/200376/ -- License: Creative Commons 0 +pepper_spray_pick_up.ogg - Spray Paint Shake Slow Five.wav by cbakos -- https://freesound.org/s/200376/ -- License: Creative Commons 0 +grenade_drop.ogg - made by sadboysuss -- License: CC-by-SA +grenade_pick_up.ogg - made by sadboysuss -- License: CC-by-SA +} - edited by sadboysuss + { skin_drop.ogg - https://freesound.org/people/Crinkem/sounds/501015/ , License: CC4 skin_pick_up.ogg - https://freesound.org/people/Crinkem/sounds/501015/ , License CC3 diff --git a/sound/items/grenade_drop.ogg b/sound/items/grenade_drop.ogg new file mode 100644 index 0000000000000..04627811cd188 Binary files /dev/null and b/sound/items/grenade_drop.ogg differ diff --git a/sound/items/grenade_pick_up.ogg b/sound/items/grenade_pick_up.ogg new file mode 100644 index 0000000000000..d257659f76182 Binary files /dev/null and b/sound/items/grenade_pick_up.ogg differ diff --git a/sound/items/gun_drop.ogg b/sound/items/gun_drop.ogg new file mode 100644 index 0000000000000..21b83bc91d611 Binary files /dev/null and b/sound/items/gun_drop.ogg differ diff --git a/sound/items/gun_pick_up.ogg b/sound/items/gun_pick_up.ogg new file mode 100644 index 0000000000000..6bf6b45a16b26 Binary files /dev/null and b/sound/items/gun_pick_up.ogg differ diff --git a/sound/items/handcuff_finish.ogg b/sound/items/handcuff_finish.ogg new file mode 100644 index 0000000000000..92096837835fe Binary files /dev/null and b/sound/items/handcuff_finish.ogg differ diff --git a/sound/items/handcuffs_drop.ogg b/sound/items/handcuffs_drop.ogg new file mode 100644 index 0000000000000..85b7f172e4852 Binary files /dev/null and b/sound/items/handcuffs_drop.ogg differ diff --git a/sound/items/handcuffs_pick_up.ogg b/sound/items/handcuffs_pick_up.ogg new file mode 100644 index 0000000000000..d3fdc3450bd47 Binary files /dev/null and b/sound/items/handcuffs_pick_up.ogg differ diff --git a/sound/items/holster.ogg b/sound/items/holster.ogg new file mode 100644 index 0000000000000..984e7ad4fea38 Binary files /dev/null and b/sound/items/holster.ogg differ diff --git a/sound/items/pepper_spray_drop.ogg b/sound/items/pepper_spray_drop.ogg new file mode 100644 index 0000000000000..e071c65d3bce4 Binary files /dev/null and b/sound/items/pepper_spray_drop.ogg differ diff --git a/sound/items/pepper_spray_pick_up.ogg b/sound/items/pepper_spray_pick_up.ogg new file mode 100644 index 0000000000000..a474bbd91b3c7 Binary files /dev/null and b/sound/items/pepper_spray_pick_up.ogg differ diff --git a/sound/items/plastic_shield_drop.ogg b/sound/items/plastic_shield_drop.ogg new file mode 100644 index 0000000000000..4d07b48d481fb Binary files /dev/null and b/sound/items/plastic_shield_drop.ogg differ diff --git a/sound/items/plastic_shield_pick_up.ogg b/sound/items/plastic_shield_pick_up.ogg new file mode 100644 index 0000000000000..e18e9617b77de Binary files /dev/null and b/sound/items/plastic_shield_pick_up.ogg differ diff --git a/sound/items/stun_baton_drop.ogg b/sound/items/stun_baton_drop.ogg new file mode 100644 index 0000000000000..1d5d59e9012ba Binary files /dev/null and b/sound/items/stun_baton_drop.ogg differ diff --git a/sound/items/stun_baton_pick_up.ogg b/sound/items/stun_baton_pick_up.ogg new file mode 100644 index 0000000000000..6b87e531fc43e Binary files /dev/null and b/sound/items/stun_baton_pick_up.ogg differ diff --git a/tgstation.dme b/tgstation.dme index a64698fcfbb1d..f24a71f819f7f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -912,6 +912,7 @@ #include "code\datums\ai\basic_mobs\basic_subtrees\find_food.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\find_paper_and_write.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\find_parent.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\find_targets_prioritize_traits.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\flee_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\go_for_swim.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\maintain_distance.dm" @@ -1100,6 +1101,7 @@ #include "code\datums\components\explode_on_attack.dm" #include "code\datums\components\faction_granter.dm" #include "code\datums\components\fertile_egg.dm" +#include "code\datums\components\fish_growth.dm" #include "code\datums\components\fishing_spot.dm" #include "code\datums\components\focused_attacker.dm" #include "code\datums\components\food_storage.dm" diff --git a/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx b/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx index e64673ed5a596..078f3e8026fa8 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx @@ -183,6 +183,8 @@ export const AntagInfoMalf = (props) => { items.push({ id: item.name, name: item.name, + icon: item.icon, + icon_state: item.icon_state, category: category.name, cost: `${item.cost} PT`, desc: item.desc, diff --git a/tgui/packages/tgui/interfaces/AntagInfoSpy.tsx b/tgui/packages/tgui/interfaces/AntagInfoSpy.tsx index 98ed0ae72d2eb..19aee4dfb0fb4 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoSpy.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoSpy.tsx @@ -1,8 +1,13 @@ import { Section, Stack } from 'tgui-core/components'; +import { BooleanLike } from 'tgui-core/react'; import { useBackend } from '../backend'; import { Window } from '../layouts'; -import { Objective, ObjectivePrintout } from './common/Objectives'; +import { + Objective, + ObjectivePrintout, + ReplaceObjectivesButton, +} from './common/Objectives'; const greenText = { fontWeight: 'italics', @@ -18,13 +23,15 @@ type Data = { antag_name: string; uplink_location: string | null; objectives: Objective[]; + can_change_objective: BooleanLike; }; export const AntagInfoSpy = () => { const { data } = useBackend(); - const { antag_name, uplink_location, objectives } = data; + const { antag_name, uplink_location, objectives, can_change_objective } = + data; return ( - + { objectives={objectives} /> + + + { + + } + diff --git a/tgui/packages/tgui/interfaces/Aquarium.tsx b/tgui/packages/tgui/interfaces/Aquarium.tsx index caa0c65d75f65..6f29920fc0bf3 100644 --- a/tgui/packages/tgui/interfaces/Aquarium.tsx +++ b/tgui/packages/tgui/interfaces/Aquarium.tsx @@ -71,10 +71,10 @@ export const Aquarium = (props) => { ))} - + diff --git a/tgui/packages/tgui/interfaces/LuaEditor/Log.tsx b/tgui/packages/tgui/interfaces/LuaEditor/Log.tsx index b4f2b82bb3e9f..be0730a350df1 100644 --- a/tgui/packages/tgui/interfaces/LuaEditor/Log.tsx +++ b/tgui/packages/tgui/interfaces/LuaEditor/Log.tsx @@ -120,8 +120,8 @@ export const Log = (props: LogProps) => { }` : ''} . - - {return_values.length ? ( + {return_values.length ? ( + { }) } /> - ) : ( -
- )} -
+
+ ) : ( +
+ )} ); messageColor = 'green'; @@ -187,7 +187,7 @@ export const Log = (props: LogProps) => { if (chunk) { output = ( <> - {output} + {output}