diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 60c91e51bb..4420059f62 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -41,6 +41,24 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) +"aad" = ( +/obj/structure/bed, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/button/door{ + id = "Dorm4"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "aae" = ( /obj/effect/landmark/carpspawn, /turf/open/space, @@ -577,6 +595,19 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/security/execution/transfer) +"abz" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Dorm5"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) "abA" = ( /obj/machinery/light, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -1688,8 +1719,7 @@ /obj/machinery/button/door{ id = "hos"; name = "HoS Office Shutters"; - pixel_y = -25; - + pixel_y = -25 }, /turf/open/floor/carpet, /area/crew_quarters/heads/hos) @@ -2119,6 +2149,55 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"aeD" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Dorm6"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"aeE" = ( +/obj/structure/bed, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/button/door{ + id = "Dorm3"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"aeF" = ( +/obj/structure/bed, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/button/door{ + id = "Dorm2"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "aeG" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -2495,6 +2574,11 @@ }, /turf/open/floor/plasteel, /area/security/main) +"afn" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel/white, +/area/medical/virology) "afo" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Three" @@ -2515,6 +2599,14 @@ }, /turf/open/space/basic, /area/space) +"afq" = ( +/obj/structure/bed, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath, +/obj/effect/decal/cleanable/semen, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/plating, +/area/maintenance/bar) "aft" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 @@ -7411,24 +7503,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"aqn" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/machinery/button/door{ - id = "Dorm4"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "aqo" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -8209,19 +8283,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"asu" = ( -/obj/structure/bed, -/obj/item/bedsheet/red, -/obj/machinery/button/door{ - id = "Dorm5"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "asv" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -8313,19 +8374,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"asL" = ( -/obj/structure/bed, -/obj/item/bedsheet/red, -/obj/machinery/button/door{ - id = "Dorm6"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "asM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -8932,24 +8980,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness) -"auw" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/machinery/button/door{ - id = "Dorm3"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "aux" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -10816,24 +10846,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) -"ayV" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/machinery/button/door{ - id = "Dorm2"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "ayW" = ( /turf/closed/wall, /area/ai_monitored/storage/eva) @@ -26228,9 +26240,7 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bkx" = ( -/obj/machinery/status_display/supply{ - pixel_y = 2 - }, +/obj/machinery/status_display/supply, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -31345,7 +31355,9 @@ id = "QMLoad" }, /obj/machinery/light, -/obj/machinery/status_display/supply, +/obj/machinery/status_display/supply{ + pixel_y = -32 + }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -33612,7 +33624,9 @@ name = "Station Intercom (General)"; pixel_y = -35 }, -/obj/machinery/status_display/supply, +/obj/machinery/status_display/supply{ + pixel_x = -32 + }, /obj/machinery/computer/security/qm{ dir = 4 }, @@ -39363,11 +39377,6 @@ /obj/machinery/announcement_system, /turf/open/floor/plasteel, /area/tcommsat/computer) -"bOm" = ( -/obj/item/bedsheet, -/obj/structure/bed, -/turf/open/floor/plasteel/white, -/area/medical/virology) "bOn" = ( /obj/machinery/light{ dir = 1 @@ -42629,11 +42638,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/medical/virology) -"bWk" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/plasteel/white, -/area/medical/virology) "bWl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -56667,6 +56671,12 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/white, /area/science/circuit) +"eef" = ( +/obj/machinery/autolathe{ + name = "public autolathe" + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) "evR" = ( /turf/open/floor/plating, /area/maintenance/bar) @@ -57373,14 +57383,6 @@ }, /turf/open/floor/plating, /area/construction) -"rMN" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/item/tank/internals/anesthetic, -/obj/item/clothing/mask/breath, -/obj/effect/decal/cleanable/semen, -/turf/open/floor/plating, -/area/maintenance/bar) "rNc" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -79851,7 +79853,7 @@ sAM imH evR evR -rMN +afq bCq bUs bLv @@ -81613,7 +81615,7 @@ cNG cNJ bLF aZK -bbR +eef bbR bqt cBq @@ -88515,13 +88517,13 @@ aoD aod aqe arf -aqn +aad ath arf -auw +aeE ath arf -ayV +aeF ath dgz aCd @@ -90315,7 +90317,7 @@ cSA aqe arf ari -asu +abz aun auW avR @@ -91343,7 +91345,7 @@ apr aqj arf ark -asL +aeD aun avu awt @@ -96539,7 +96541,7 @@ bof fTg bLV bNd -bOm +afn bPp bQF bRN @@ -98345,7 +98347,7 @@ bRQ bOr bSQ bWj -bWk +afn bXc bYe bNd @@ -98859,7 +98861,7 @@ bRQ bOr bSQ bWj -bWk +afn bXc bYe bNd diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 402633f42b..bfc4a60f08 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -124,6 +124,22 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"aaq" = ( +/obj/structure/bed, +/obj/machinery/status_display{ + pixel_y = 32 + }, +/obj/item/bedsheet/clown, +/turf/open/floor/plasteel/grimy, +/area/hallway/secondary/service) +"aar" = ( +/obj/structure/bed, +/obj/machinery/status_display{ + pixel_y = 32 + }, +/obj/item/bedsheet/mime, +/turf/open/floor/wood, +/area/hallway/secondary/service) "aas" = ( /obj/docking_port/stationary/random{ id = "pod_lavaland1"; @@ -143,6 +159,52 @@ /obj/effect/landmark/xeno_spawn, /turf/open/space, /area/solar/starboard/fore) +"aav" = ( +/obj/structure/bed, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/status_display{ + pixel_y = 32 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"aaw" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"aax" = ( +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"aay" = ( +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/dorms) +"aaz" = ( +/obj/structure/bed, +/obj/machinery/light, +/obj/machinery/status_display{ + pixel_y = -32 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"aaA" = ( +/obj/structure/bed, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "aaE" = ( /obj/structure/lattice/catwalk, /turf/open/space, @@ -13706,14 +13768,6 @@ }, /turf/open/floor/plasteel/grimy, /area/hallway/secondary/service) -"aDF" = ( -/obj/structure/bed, -/obj/machinery/status_display{ - pixel_y = 32 - }, -/obj/item/bedsheet/rainbow, -/turf/open/floor/plasteel/grimy, -/area/hallway/secondary/service) "aDG" = ( /turf/open/floor/plasteel/grimy, /area/hallway/secondary/service) @@ -16868,14 +16922,6 @@ }, /turf/open/floor/wood, /area/hallway/secondary/service) -"aIP" = ( -/obj/structure/bed, -/obj/machinery/status_display{ - pixel_y = 32 - }, -/obj/item/bedsheet/orange, -/turf/open/floor/wood, -/area/hallway/secondary/service) "aIQ" = ( /obj/structure/dresser, /turf/open/floor/wood{ @@ -35021,12 +35067,13 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "blM" = ( -/obj/structure/table, -/obj/item/storage/box/lights/mixed, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/machinery/autolathe{ + name = "public autolathe" + }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "blN" = ( @@ -35043,6 +35090,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/item/storage/box/lights/mixed, /turf/open/floor/plasteel, /area/hallway/primary/fore) "blO" = ( @@ -78958,17 +79006,6 @@ /obj/structure/dresser, /turf/open/floor/carpet, /area/crew_quarters/dorms) -"cCi" = ( -/obj/structure/bed, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/bedsheet/red, -/obj/machinery/status_display{ - pixel_y = 32 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "cCj" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/item/clothing/suit/jacket{ @@ -80986,24 +81023,10 @@ icon_state = "wood-broken2" }, /area/crew_quarters/dorms) -"cFx" = ( -/obj/structure/bed, -/obj/item/bedsheet/black, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "cFy" = ( /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/wood, /area/crew_quarters/dorms) -"cFz" = ( -/obj/structure/bed, -/obj/item/bedsheet/blue, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "cFA" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green, @@ -87800,11 +87823,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cRs" = ( -/obj/structure/bed, -/obj/item/bedsheet/clown, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "cRt" = ( /obj/structure/table/wood, /obj/item/storage/briefcase{ @@ -88878,11 +88896,6 @@ /obj/structure/chair/office/dark, /turf/open/floor/wood, /area/crew_quarters/dorms) -"cTc" = ( -/obj/structure/bed, -/obj/item/bedsheet/mime, -/turf/open/floor/plasteel/grimy, -/area/crew_quarters/dorms) "cTd" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box, @@ -90079,15 +90092,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) -"cUX" = ( -/obj/structure/bed, -/obj/machinery/light, -/obj/item/bedsheet/brown, -/obj/machinery/status_display{ - pixel_y = -32 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "cUY" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/item/clothing/suit/jacket{ @@ -127210,13 +127214,6 @@ dir = 1 }, /area/science/circuit) -"poI" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/item/tank/internals/anesthetic, -/obj/item/clothing/mask/breath, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) "psi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bodycontainer/morgue{ @@ -151683,7 +151680,7 @@ djm fow dod dod -poI +aaA dfY ajr aad @@ -160837,11 +160834,11 @@ ary aAf aBu aCB -aDF +aaq aEJ aFV aDI -aIP +aar aKo aLE aMX @@ -178377,7 +178374,7 @@ cyY cAx cCd cDD -cFx +aaw cGU cAw cJl @@ -178385,7 +178382,7 @@ cLa cMx cIi cPR -cRs +aax cDG cUW cAw @@ -179158,7 +179155,7 @@ cNU cDI cFB cDI -cUX +aaz cAw cYj cZV @@ -179405,7 +179402,7 @@ czc cAw cCg cDG -cFz +aax cGW cIi cJo @@ -180174,7 +180171,7 @@ bHq cxt coI cAw -cCi +aav cDI cFB cDI @@ -180442,7 +180439,7 @@ cMB cIi cPW cRv -cTc +aay cVb cAw cYp diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 1bcb5c20a8..4de1657e48 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2,10 +2,58 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aab" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Cabin3"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) "aac" = ( /obj/effect/landmark/carpspawn, /turf/open/space, /area/space) +"aad" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/button/door{ + id = "Cabin4"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"aae" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Cabin2"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "aaf" = ( /obj/structure/lattice, /turf/open/space, @@ -252,6 +300,19 @@ }, /turf/open/floor/plating, /area/security/prison) +"aaM" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Cabin5"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) "aaN" = ( /obj/structure/cable{ icon_state = "0-2" @@ -294,6 +355,37 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"aaU" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Cabin6"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"aaV" = ( +/obj/machinery/button/door{ + id = "Cabin7"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/obj/structure/bed, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) "aaY" = ( /obj/structure/cable{ icon_state = "1-2" @@ -10141,22 +10233,6 @@ /obj/item/clothing/under/assistantformal, /turf/open/floor/wood, /area/crew_quarters/dorms) -"asV" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/button/door{ - id = "Cabin3"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "asW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -10195,23 +10271,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"ata" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/button/door{ - id = "Cabin4"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "atb" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/machinery/airalarm{ @@ -11892,21 +11951,6 @@ /obj/item/clothing/under/suit_jacket/tan, /turf/open/floor/carpet, /area/crew_quarters/dorms) -"awE" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/button/door{ - id = "Cabin2"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "awF" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -11920,19 +11964,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"awG" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/button/door{ - id = "Cabin5"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "awH" = ( /obj/machinery/newscaster{ pixel_y = 32 @@ -14983,22 +15014,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"aCJ" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/button/door{ - id = "Cabin6"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "aCK" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/machinery/airalarm{ @@ -17575,21 +17590,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/dorms) -"aHS" = ( -/obj/machinery/button/door{ - id = "Cabin7"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 - }, -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "aHT" = ( /obj/structure/chair/wood/normal{ dir = 4 @@ -17692,7 +17692,9 @@ pixel_x = -28; pixel_y = 23 }, -/obj/machinery/status_display/supply, +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, /obj/machinery/conveyor{ dir = 5; id = "QMLoad2" @@ -21617,7 +21619,9 @@ /obj/structure/table, /obj/item/clipboard, /obj/item/stamp/qm, -/obj/machinery/status_display/supply, +/obj/machinery/status_display/supply{ + pixel_x = 32 + }, /turf/open/floor/plasteel, /area/quartermaster/qm) "aQu" = ( @@ -27037,7 +27041,9 @@ /area/hallway/primary/port) "baA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/machinery/status_display/supply, +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, /obj/structure/table, /obj/item/folder/yellow, /obj/effect/turf_decal/tile/brown{ @@ -27920,7 +27926,9 @@ /area/quartermaster/office) "bbS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/machinery/status_display/supply, +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -31526,6 +31534,10 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plasteel, /area/hallway/primary/port) "biO" = ( @@ -32402,10 +32414,6 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bks" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/spawner/lootdrop/maintenance, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -32413,6 +32421,9 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/machinery/autolathe{ + name = "public autolathe" + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bkt" = ( @@ -120042,10 +120053,10 @@ agz aoV dhs arB -asV +aab auf arB -awE +aae axE arB dhA @@ -121584,19 +121595,19 @@ anK aoZ aqk arB -ata +aad aul avp -awG +aaM axJ avp aAj arB -aCJ +aaU aEe arB boS -aHS +aaV aJh aKt aLW diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index dbb26f8808..cef0aefc50 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -2833,7 +2833,9 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hop) "aeP" = ( -/obj/machinery/status_display/supply, +/obj/machinery/status_display/supply{ + pixel_x = -32 + }, /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel, /area/quartermaster/storage) diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 7935a2a3f9..e03ba4fcd2 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2,12 +2,44 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aab" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Dorm3Shutters"; + name = "Privacy Shutters Control"; + pixel_y = 26 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"aac" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Dorm2Shutters"; + name = "Privacy Shutters Control"; + pixel_y = 26; + req_access_txt = "0" + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "aad" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/maintenance/department/science) +"aae" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Dorm1Shutters"; + name = "Privacy Shutters Control"; + pixel_y = 26; + req_access_txt = "0" + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/dorms) "abf" = ( /obj/structure/bed, /turf/open/floor/plating, @@ -8605,16 +8637,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/dorms) -"ave" = ( -/obj/structure/bed, -/obj/item/bedsheet/nanotrasen, -/obj/machinery/button/door{ - id = "Dorm3Shutters"; - name = "Privacy Shutters Control"; - pixel_y = 26 - }, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "avf" = ( /obj/machinery/light/small{ dir = 1 @@ -10058,17 +10080,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/dorms) -"ayj" = ( -/obj/structure/bed, -/obj/item/bedsheet/nanotrasen, -/obj/machinery/button/door{ - id = "Dorm2Shutters"; - name = "Privacy Shutters Control"; - pixel_y = 26; - req_access_txt = "0" - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "ayk" = ( /obj/machinery/light/small{ dir = 1 @@ -11516,17 +11527,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/dorms) -"aBM" = ( -/obj/structure/bed, -/obj/item/bedsheet/nanotrasen, -/obj/machinery/button/door{ - id = "Dorm1Shutters"; - name = "Privacy Shutters Control"; - pixel_y = 26; - req_access_txt = "0" - }, -/turf/open/floor/plasteel/grimy, -/area/crew_quarters/dorms) "aBN" = ( /obj/machinery/light/small{ dir = 1 @@ -17294,7 +17294,7 @@ lootcount = 2; name = "2maintenance loot spawner" }, -/obj/item/clothing/gloves/color/random, +/obj/effect/spawner/lootdrop/gloves, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/bar) "aPD" = ( @@ -21743,7 +21743,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aZj" = ( -/obj/machinery/status_display/supply, +/obj/machinery/status_display/supply{ + pixel_x = -32 + }, /obj/machinery/computer/bounty{ dir = 4 }, @@ -36058,7 +36060,9 @@ /obj/item/folder/white, /obj/item/pen, /obj/item/stamp/rd, -/obj/machinery/status_display/ai, +/obj/machinery/status_display/ai{ + pixel_y = -32 + }, /obj/machinery/camera{ c_tag = "Research Director's Office"; dir = 1; @@ -99268,13 +99272,13 @@ ale asb coe apX -ave +aab awn apX -ayj +aac azr apX -aBM +aae aDb apX oFo diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index d005f1eb40..d796330cc8 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2248,6 +2248,11 @@ }, /turf/open/floor/plasteel, /area/tdome/arena_source) +"fR" = ( +/obj/item/paicard, +/obj/structure/table/wood, +/turf/open/floor/engine/cult, +/area/wizard_station) "fS" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -2935,6 +2940,22 @@ /obj/machinery/capture_the_flag/red, /turf/open/floor/circuit/green/anim, /area/ctf) +"hH" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/seclite, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/paicard, +/turf/open/floor/plasteel/dark, +/area/centcom/ferry) "hI" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -11370,21 +11391,6 @@ /obj/structure/table/reinforced, /turf/open/floor/plasteel/grimy, /area/centcom/ferry) -"AL" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/seclite, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/centcom/ferry) "AM" = ( /obj/machinery/shuttle_manipulator, /turf/open/floor/circuit/green, @@ -25222,7 +25228,7 @@ lI lI lI Ax -qZ +EW qZ qZ Ax @@ -25480,7 +25486,7 @@ lI lI Ax ra -qZ +Bf qZ tX qZ @@ -25736,7 +25742,7 @@ lI lI lI Ax -qZ +fR qZ qZ Ax @@ -56332,7 +56338,7 @@ yr sw sw Ad -AL +hH Bx sw Cv diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 445c29241c..1c8670d5b6 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -239,6 +239,23 @@ }, /turf/open/floor/plasteel, /area/shuttle/pirate) +"as" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/closet/secure_closet/personal, +/obj/effect/decal/cleanable/dirt, +/obj/item/bedsheet/pirate, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"at" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/bedsheet/pirate, +/turf/open/floor/plasteel, +/area/shuttle/pirate) "au" = ( /obj/machinery/door/airlock/hatch{ id_tag = "piratebridgebolt"; @@ -314,6 +331,13 @@ }, /turf/open/floor/plasteel, /area/shuttle/pirate) +"aA" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/item/bedsheet/pirate, +/turf/open/floor/wood, +/area/shuttle/pirate) "aB" = ( /obj/machinery/light/small{ dir = 4 @@ -408,12 +432,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/shuttle/pirate) -"aM" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/wood, -/area/shuttle/pirate) "aN" = ( /obj/machinery/light/small, /obj/machinery/button/door{ @@ -1022,12 +1040,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/shuttle/pirate) -"mD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/shuttle/pirate) "mU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/engineering{ @@ -1172,15 +1184,6 @@ }, /turf/open/floor/wood, /area/shuttle/pirate) -"Ur" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) (1,1,1) = {" af @@ -1231,7 +1234,7 @@ aq ar aj RY -aM +aA ep aH af @@ -1406,9 +1409,9 @@ af af af aj -mD +as bB -Ur +at aj aj aj diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 4e36ea9edf..424436f1b3 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -1,7 +1,81 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/structure/bed, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, +/obj/item/bedsheet/pirate, +/turf/open/floor/plasteel/dark/side{ + dir = 6 + }, +/area/shuttle/caravan/pirate) +"ab" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/machinery/turretid{ + icon_state = "control_kill"; + lethal = 1; + locked = 0; + pixel_y = -30; + req_access = null + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/mob/living/simple_animal/hostile/pirate/ranged{ + environment_smash = 0 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/caravan/pirate) +"ac" = ( +/obj/structure/bed, +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/bedsheet/pirate, +/turf/open/floor/plasteel/dark, +/area/shuttle/caravan/pirate) +"ad" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/pirate/ranged{ + environment_smash = 0 + }, +/turf/open/floor/plasteel, +/area/shuttle/caravan/pirate) +"ae" = ( +/obj/structure/rack, +/obj/item/storage/bag/money/vault, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/mob/living/simple_animal/parrot{ + faction = list("pirate"); + name = "Pegwing" + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/caravan/pirate) "af" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/caravan/pirate) +"ag" = ( +/obj/machinery/light/small, +/obj/structure/bed, +/obj/item/bedsheet/pirate, +/turf/open/floor/plasteel/dark, +/area/shuttle/caravan/pirate) "aE" = ( /obj/structure/closet{ name = "pirate outfits" @@ -89,18 +163,6 @@ }, /turf/open/floor/plasteel/dark, /area/shuttle/caravan/pirate) -"fS" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -24 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/shuttle/caravan/pirate) "fU" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/turf_decal/tile/red, @@ -223,18 +285,6 @@ dir = 1 }, /area/shuttle/caravan/pirate) -"ku" = ( -/obj/structure/rack, -/obj/item/storage/bag/money/vault, -/mob/living/simple_animal/parrot{ - faction = list("pirate"); - name = "Pegwing" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/shuttle/caravan/pirate) "kY" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -502,13 +552,6 @@ /obj/item/reagent_containers/food/drinks/bottle/rum, /turf/open/floor/plasteel/dark, /area/shuttle/caravan/pirate) -"tM" = ( -/mob/living/simple_animal/hostile/pirate/ranged{ - environment_smash = 0 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/shuttle/caravan/pirate) "ul" = ( /obj/structure/table, /obj/item/retractor, @@ -535,17 +578,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/shuttle/caravan/pirate) -"vq" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -26 - }, -/turf/open/floor/plasteel/dark/side{ - dir = 6 - }, -/area/shuttle/caravan/pirate) "vW" = ( /obj/machinery/light/small{ dir = 4 @@ -734,32 +766,6 @@ }, /turf/open/floor/plasteel/dark, /area/shuttle/caravan/pirate) -"EB" = ( -/obj/structure/chair/office/dark{ - dir = 4 - }, -/obj/machinery/turretid{ - icon_state = "control_kill"; - lethal = 1; - locked = 0; - pixel_y = -30; - req_access = null - }, -/mob/living/simple_animal/hostile/pirate/ranged{ - environment_smash = 0 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/shuttle/caravan/pirate) "EK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -1018,12 +1024,6 @@ }, /turf/open/floor/plasteel/dark, /area/shuttle/caravan/pirate) -"Wb" = ( -/obj/machinery/light/small, -/obj/structure/bed, -/obj/item/bedsheet/brown, -/turf/open/floor/plasteel/dark, -/area/shuttle/caravan/pirate) "Xq" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -1181,7 +1181,7 @@ su Ag af jo -tM +ad sr af af @@ -1253,9 +1253,9 @@ Jv af aE SF -vq +aa NM -fS +ac RC oF af @@ -1272,7 +1272,7 @@ hZ wZ de iF -Wb +ag af Jv Jv @@ -1286,7 +1286,7 @@ xg qC pK Sk -ku +ae af qo Jv @@ -1374,7 +1374,7 @@ Jv Jv Bi oO -EB +ab bd Bi Jv diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 210bdf57a6..8d86826ac2 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -131,6 +131,16 @@ #define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) #define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target) #define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): () +#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): (proc args list) + #define COMPONENT_UPPERCASE_SPEECH 1 + // used to access COMSIG_MOB_SAY argslist + #define SPEECH_MESSAGE 1 + // #define SPEECH_BUBBLE_TYPE 2 + #define SPEECH_SPANS 3 + /* #define SPEECH_SANITIZE 4 + #define SPEECH_LANGUAGE 5 + #define SPEECH_IGNORE_SPAM 6 + #define SPEECH_FORCED 7 */ // /mob/living signals #define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 60148e0388..2fe70961f8 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -8,6 +8,7 @@ #define ENABLE_BITFIELD(variable, flag) (variable |= (flag)) #define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag)) #define CHECK_BITFIELD(variable, flag) (variable & flag) +#define TOGGLE_BITFIELD(variable, flag) (variable ^= (flag)) GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768)) diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 55131a26ed..8234059a36 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -16,6 +16,7 @@ #define INVESTIGATE_EXONET "exonet" #define INVESTIGATE_NANITES "nanites" #define INVESTIGATE_CIRCUIT "circuit" +#define INVESTIGATE_RCD "rcd" // Logging types for log_message() #define LOG_ATTACK (1 << 0) diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index e6d4fd126b..8566571928 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -26,6 +26,7 @@ #define NODROP (1<<8) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted. #define ABSTRACT (1<<9) // for all things that are technically items but used for various different stuff #define IMMUTABLE_SLOW (1<<10) //When players should not be able to change the slowdown of the item (Speed potions, ect) +#define SURGICAL_TOOL (1<<12) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) // Flags for the clothing_flags var on /obj/item/clothing @@ -35,3 +36,5 @@ #define MASKINTERNALS (1<<3) // mask allows internals #define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc #define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. +#define VOICEBOX_TOGGLABLE (1<<6) // The voicebox in this clothing can be toggled. +#define VOICEBOX_DISABLED (1<<7) // The voicebox is currently turned off. \ No newline at end of file diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 7f3c063777..99eb892fc8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -112,6 +112,7 @@ #define TRAIT_PARALYSIS_R_ARM "para-r-arm" #define TRAIT_PARALYSIS_L_LEG "para-l-leg" #define TRAIT_PARALYSIS_R_LEG "para-r-leg" +#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech" #define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism" #define TRAIT_STRONG_GRABBER "strong_grabber" #define TRAIT_CALCIUM_HEALER "calcium_healer" diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 7d8eb108f3..1ee5ce986f 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -767,3 +767,27 @@ GLOBAL_LIST_INIT(binary, list("0","1")) return "twelfth" else return "[number]\th" + +/proc/unintelligize(message) + var/prefix=copytext(message,1,2) + if(prefix == ";") + message = copytext(message,2) + else if(prefix in list(":","#")) + prefix += copytext(message,2,3) + message = copytext(message,3) + else + prefix="" + + var/list/words = splittext(message," ") + var/list/rearranged = list() + for(var/i=1;i<=words.len;i++) + var/cword = pick(words) + words.Remove(cword) + var/suffix = copytext(cword,length(cword)-1,length(cword)) + while(length(cword)>0 && suffix in list(".",",",";","!",":","?")) + cword = copytext(cword,1 ,length(cword)-1) + suffix = copytext(cword,length(cword)-1,length(cword) ) + if(length(cword)) + rearranged += cword + message = "[prefix][jointext(rearranged," ")]" + . = message diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 2f69b63ae9..7e078184b7 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1239,19 +1239,21 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) pixel_x = initialpixelx pixel_y = initialpixely -/atom/proc/do_jiggle(targetangle = 45) +/atom/proc/do_jiggle(targetangle = 45, timer = 20) var/matrix/OM = matrix(transform) var/matrix/M = matrix(transform) + var/halftime = timer * 0.5 M.Turn(pick(-targetangle, targetangle)) - animate(src, transform = M, time = 10, easing = ELASTIC_EASING) - animate(src, transform = OM, time = 10, easing = ELASTIC_EASING) + animate(src, transform = M, time = halftime, easing = ELASTIC_EASING) + animate(src, transform = OM, time = halftime, easing = ELASTIC_EASING) -/atom/proc/do_squish(squishx = 1.2, squishy = 0.6) +/atom/proc/do_squish(squishx = 1.2, squishy = 0.6, timer = 20) var/matrix/OM = matrix(transform) var/matrix/M = matrix(transform) + var/halftime = timer * 0.5 M.Scale(squishx, squishy) - animate(src, transform = M, time = 10, easing = BOUNCE_EASING) - animate(src, transform = OM, time = 10, easing = BOUNCE_EASING) + animate(src, transform = M, time = halftime, easing = BOUNCE_EASING) + animate(src, transform = OM, time = halftime, easing = BOUNCE_EASING) /proc/weightclass2text(var/w_class) switch(w_class) @@ -1483,7 +1485,9 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /obj/item/reagent_containers/food/snacks/grown, /obj/item/reagent_containers/food/snacks/grown/mushroom, /obj/item/reagent_containers/food/snacks/grown/nettle, // base type - /obj/item/reagent_containers/food/snacks/deepfryholder + /obj/item/reagent_containers/food/snacks/deepfryholder, + /obj/item/reagent_containers/food/snacks/grown/shell, + /obj/item/reagent_containers/food/snacks/store/bread ) blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index c37e6fa531..b861af633d 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -140,6 +140,8 @@ GLOBAL_LIST_INIT(bitfields, list( "MASKINTERNALS" = MASKINTERNALS, "NOSLIP" = NOSLIP, "THICKMATERIAL" = THICKMATERIAL, + "VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE, + "VOICEBOX_DISABLED" = VOICEBOX_DISABLED, ), "tesla_flags" = list( "TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE, @@ -171,4 +173,9 @@ GLOBAL_LIST_INIT(bitfields, list( "RAD_PROTECT_CONTENTS" = RAD_PROTECT_CONTENTS, "RAD_NO_CONTAMINATE" = RAD_NO_CONTAMINATE, ), - )) + "disease_flags" = list( + "CURABLE" = CURABLE, + "CAN_CARRY" = CAN_CARRY, + "CAN_RESIST" = CAN_RESIST + ), + )) \ No newline at end of file diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 7f9e0c6ca5..ef460cd54c 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -43,7 +43,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/assembly/timer = 3, /obj/item/flashlight = 4, /obj/item/flashlight/pen = 1, - /obj/item/flashlight/glowstick/random = 4, + /obj/effect/spawner/lootdrop/glowstick = 4, /obj/effect/spawner/lootdrop/mre = 3, /obj/item/multitool = 2, /obj/item/radio/off = 2, @@ -69,7 +69,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/crowbar = 1, /obj/item/crowbar/red = 1, /obj/item/extinguisher = 11, - //obj/item/gun/ballistic/revolver/russian = 1, //disabled until lootdrop is a proper world proc. /obj/item/hand_labeler = 1, /obj/item/paper/crumpled = 1, /obj/item/pen = 1, @@ -102,7 +101,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/assembly/signaler = 2, /obj/item/assembly/mousetrap = 2, /obj/item/reagent_containers/syringe = 2, - /obj/item/clothing/gloves/color/random = 8, + /obj/effect/spawner/lootdrop/gloves = 8, /obj/item/clothing/shoes/laceup = 1, /obj/item/storage/secure/briefcase = 3, /obj/item/storage/toolbox/artistic = 2, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 3d6de49a6a..22210bfd08 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -366,11 +366,15 @@ SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) var/turf/T = get_turf(src) if(T && user.TurfAdjacent(T)) - if(user.listed_turf == T) - user.listed_turf = null - else - user.listed_turf = T - user.client.statpanel = T.name + user.listed_turf = T + user.client.statpanel = T.name + +// Use this instead of /mob/proc/AltClickOn(atom/A) where you only want turf content listing without additional atom alt-click interaction +/atom/proc/AltClickNoInteract(mob/user, atom/A) + var/turf/T = get_turf(A) + if(T && user.TurfAdjacent(T)) + user.listed_turf = T + user.client.statpanel = T.name /mob/proc/TurfAdjacent(turf/T) return T.Adjacent(src) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 2a14d232aa..3896c3eac3 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -64,7 +64,7 @@ to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto return // CIT CHANGE - ditto - if(force && HAS_TRAIT(user, TRAIT_PACIFISM)) + if(force && damtype != STAMINA && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "You don't want to harm other living beings!") return diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 6cacc90fcb..299d7f64f8 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -31,7 +31,7 @@ ShiftClickOn(A) return if(modifiers["alt"]) - AltClickOn(A) + AltClickNoInteract(src, A) return if(modifiers["ctrl"]) CtrlClickOn(A) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 144a6dd117..0c3181a019 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -126,9 +126,9 @@ SUBSYSTEM_DEF(ticker) if(!GLOB.syndicate_code_phrase) - GLOB.syndicate_code_phrase = generate_code_phrase() + GLOB.syndicate_code_phrase = generate_code_phrase(return_list=TRUE) if(!GLOB.syndicate_code_response) - GLOB.syndicate_code_response = generate_code_phrase() + GLOB.syndicate_code_response = generate_code_phrase(return_list=TRUE) start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10) if(CONFIG_GET(flag/randomize_shift_time)) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index c92db7cd01..d0eb0b9ce2 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -71,7 +71,6 @@ SUBSYSTEM_DEF(timer) for(var/I in second_queue) log_world(get_timer_debug_string(I)) - var/cut_start_index = 1 var/next_clienttime_timer_index = 0 var/len = length(clienttime_timers) @@ -94,14 +93,14 @@ SUBSYSTEM_DEF(timer) if(ctime_timer.flags & TIMER_LOOP) ctime_timer.spent = 0 - clienttime_timers.Insert(ctime_timer, 1) - cut_start_index++ + ctime_timer.timeToRun = REALTIMEOFDAY + ctime_timer.wait + BINARY_INSERT(ctime_timer, clienttime_timers, datum/timedevent, timeToRun) else qdel(ctime_timer) if (next_clienttime_timer_index) - clienttime_timers.Cut(cut_start_index,next_clienttime_timer_index+1) + clienttime_timers.Cut(1, next_clienttime_timer_index+1) if (MC_TICK_CHECK) return diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm index 3731397170..56a3f3969b 100644 --- a/code/datums/brain_damage/brain_trauma.dm +++ b/code/datums/brain_damage/brain_trauma.dm @@ -32,16 +32,18 @@ //Called when given to a mob /datum/brain_trauma/proc/on_gain() to_chat(owner, gain_text) + RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech) //Called when removed from a mob /datum/brain_trauma/proc/on_lose(silent) if(!silent) to_chat(owner, lose_text) + UnregisterSignal(owner, COMSIG_MOB_SAY) //Called when hearing a spoken message /datum/brain_trauma/proc/on_hear(message, speaker, message_language, raw_message, radio_freq) return message //Called when speaking -/datum/brain_trauma/proc/on_say(message) - return message +/datum/brain_trauma/proc/handle_speech(datum/source, list/speech_args) + UnregisterSignal(owner, COMSIG_MOB_SAY) diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index f2fec3bb63..c049a7db33 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -68,18 +68,12 @@ lose_text = "" /datum/brain_trauma/mild/speech_impediment/on_gain() - owner.dna.add_mutation(UNINTELLIGIBLE) - ..() - -//no fiddling with genetics to get out of this one -/datum/brain_trauma/mild/speech_impediment/on_life() - if(!(GLOB.mutations_list[UNINTELLIGIBLE] in owner.dna.mutations)) - on_gain() - ..() + ADD_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT) + . = ..() /datum/brain_trauma/mild/speech_impediment/on_lose() - owner.dna.remove_mutation(UNINTELLIGIBLE) - ..() + REMOVE_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT) + . = ..() /datum/brain_trauma/mild/concussion name = "Concussion" diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index 71a5f21454..6723c89ba5 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -78,14 +78,13 @@ break return message -/datum/brain_trauma/mild/phobia/on_say(message) +/datum/brain_trauma/mild/phobia/handle_speech(datum/source, list/speech_args) for(var/word in trigger_words) var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") - if(findtext(message, reg)) + if(findtext(speech_args[SPEECH_MESSAGE], reg)) to_chat(owner, "You can't bring yourself to say the word \"[word]\"!") - return "" - return message + speech_args[SPEECH_MESSAGE] = "" /datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word) next_scare = world.time + 120 diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 612af13392..653b8a98c0 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -199,10 +199,9 @@ addtimer(CALLBACK(src, /datum/brain_trauma/severe/split_personality.proc/switch_personalities), 10) return message -/datum/brain_trauma/severe/split_personality/brainwashing/on_say(message) - if(findtext(message, codeword)) - return "" //oh hey did you want to tell people about the secret word to bring you back? - return message +/datum/brain_trauma/severe/split_personality/brainwashing/handle_speech(datum/source, list/speech_args) + if(findtext(speech_args[SPEECH_MESSAGE], codeword)) + speech_args[SPEECH_MESSAGE] = "" //oh hey did you want to tell people about the secret word to bring you back? /mob/living/split_personality/traitor name = "split personality" diff --git a/code/datums/components/bouncy.dm b/code/datums/components/bouncy.dm new file mode 100644 index 0000000000..f6a2a89195 --- /dev/null +++ b/code/datums/components/bouncy.dm @@ -0,0 +1,40 @@ +/datum/component/bouncy + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/bouncy_mod = 1 + var/list/bounce_signals = list(COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_HIT_REACT, COMSIG_ITEM_ATTACK) + +/datum/component/bouncy/Initialize(_bouncy_mod, list/_bounce_signals) + if(!ismovableatom(parent)) + return COMPONENT_INCOMPATIBLE + if(_bouncy_mod) + bouncy_mod = _bouncy_mod + if(_bounce_signals) + bounce_signals = _bounce_signals + +/datum/component/bouncy/InheritComponent(datum/component/bouncy/B, original, _bouncy_mod, list/_bounce_signals) + if(_bouncy_mod) + bouncy_mod = max(bouncy_mod, _bouncy_mod) + if(_bounce_signals) + var/list/diff_bounces = difflist(bounce_signals, _bounce_signals, TRUE) + for(var/bounce in diff_bounces) + bounce_signals += bounce + RegisterSignal(parent, bounce, .proc/bounce_up) + +/datum/component/bouncy/RegisterWithParent() + RegisterSignal(parent, bounce_signals, .proc/bounce_up) + +/datum/component/bouncy/UnregisterFromParent() + UnregisterSignal(parent, bounce_signals) + +/datum/component/bouncy/proc/bounce_up(datum/source) + var/atom/movable/A = parent + switch(rand(1, 3)) + if(1) + A.do_jiggle(45 + rand(-10, 10) * bouncy_mod, 14) + if(2) + var/min_b = 0.6/bouncy_mod + var/max_b = 1.2 * bouncy_mod + A.do_squish(rand(min_b, max_b), rand(min_b, max_b), 14) + if(3) + var/pixelshift = 8 * bouncy_mod + A.Shake(pixelshift, pixelshift, duration = 15) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index c5966452bb..8982530ab6 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -21,6 +21,9 @@ GLOBAL_LIST_EMPTY(uplinks) var/datum/uplink_purchase_log/purchase_log var/list/uplink_items var/hidden_crystals = 0 + var/unlock_note + var/unlock_code + var/failsafe_code /datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20) if(!isitem(parent)) @@ -219,7 +222,10 @@ GLOBAL_LIST_EMPTY(uplinks) /datum/component/uplink/proc/new_ringtone(datum/source, mob/living/user, new_ring_text) var/obj/item/pda/master = parent - if(trim(lowertext(new_ring_text)) != trim(lowertext(master.lock_code))) //why is the lock code stored on the pda? + if(trim(lowertext(new_ring_text)) != trim(lowertext(unlock_code))) + if(trim(lowertext(new_ring_text)) == trim(lowertext(failsafe_code))) + failsafe() + return COMPONENT_STOP_RINGTONE_CHANGE return locked = FALSE interact(null, user) @@ -233,7 +239,9 @@ GLOBAL_LIST_EMPTY(uplinks) /datum/component/uplink/proc/new_frequency(datum/source, list/arguments) var/obj/item/radio/master = parent var/frequency = arguments[1] - if(frequency != master.traitor_frequency) + if(frequency != unlock_code) + if(frequency == failsafe_code) + failsafe() return locked = FALSE if(ismob(master.loc)) @@ -243,9 +251,38 @@ GLOBAL_LIST_EMPTY(uplinks) /datum/component/uplink/proc/pen_rotation(datum/source, degrees, mob/living/carbon/user) var/obj/item/pen/master = parent - if(degrees != master.traitor_unlock_degrees) + if(degrees != unlock_code) + if(degrees == failsafe_code) //Getting failsafes on pens is risky business + failsafe() return locked = FALSE master.degrees = 0 interact(null, user) - to_chat(user, "Your pen makes a clicking noise, before quickly rotating back to 0 degrees!") \ No newline at end of file + to_chat(user, "Your pen makes a clicking noise, before quickly rotating back to 0 degrees!") + +/datum/component/uplink/proc/setup_unlock_code() + unlock_code = generate_code() + var/obj/item/P = parent + if(istype(parent,/obj/item/pda)) + unlock_note = "Uplink Passcode: [unlock_code] ([P.name])." + else if(istype(parent,/obj/item/radio)) + unlock_note = "Radio Frequency: [format_frequency(unlock_code)] ([P.name])." + else if(istype(parent,/obj/item/pen)) + unlock_note = "Uplink Degrees: [unlock_code] ([P.name])." + +/datum/component/uplink/proc/generate_code() + if(istype(parent,/obj/item/pda)) + return "[rand(100,999)] [pick(GLOB.phonetic_alphabet)]" + else if(istype(parent,/obj/item/radio)) + return sanitize_frequency(rand(MIN_FREQ, MAX_FREQ)) + else if(istype(parent,/obj/item/pen)) + return rand(1, 360) + +/datum/component/uplink/proc/failsafe() + if(!parent) + return + var/turf/T = get_turf(parent) + if(!T) + return + explosion(T,1,2,3) + qdel(parent) //Alternatively could brick the uplink. diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 64f453cd48..b2241d59ba 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -26,3 +26,30 @@ if(4) if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) , forced = "pierrot's throat") + +/datum/disease/pierrot_throat/after_add() + RegisterSignal(affected_mob, COMSIG_MOB_SAY, .proc/handle_speech) + +/datum/disease/pierrot_throat/proc/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + var/list/split_message = splittext(message, " ") //List each word in the message + var/applied = 0 + for (var/i in 1 to length(split_message)) + if(prob(3 * stage)) //Stage 1: 3% Stage 2: 6% Stage 3: 9% Stage 4: 12% + if(findtext(split_message[i], "*") || findtext(split_message[i], ";") || findtext(split_message[i], ":")) + continue + split_message[i] = "HONK" + if (applied++ > stage) + break + if (applied) + speech_args[SPEECH_SPANS] |= SPAN_CLOWN // a little bonus + message = jointext(split_message, " ") + speech_args[SPEECH_MESSAGE] = message + +/datum/disease/pierrot_throat/Destroy() + UnregisterSignal(affected_mob, COMSIG_MOB_SAY) + return ..() + +/datum/disease/pierrot_throat/remove_disease() + UnregisterSignal(affected_mob, COMSIG_MOB_SAY) + return ..() \ No newline at end of file diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 938515625d..33e92e4de5 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -185,25 +185,6 @@ if(DNA_TAUR_BLOCK) construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len) -/datum/dna/proc/mutations_say_mods(message) - if(message) - for(var/datum/mutation/human/M in mutations) - message = M.say_mod(message) - return message - -/datum/dna/proc/mutations_get_spans() - var/list/spans = list() - for(var/datum/mutation/human/M in mutations) - spans |= M.get_spans() - return spans - -/datum/dna/proc/species_get_spans() - var/list/spans = list() - if(species) - spans |= species.get_spans() - return spans - - /datum/dna/proc/is_same_as(datum/dna/D) if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species) if(species.type == D.species.type && features == D.features && blood_type == D.blood_type) diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index fe16b9459f..b3c57e4838 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -198,7 +198,8 @@ GLOBAL_LIST_EMPTY(explosions) var/list/items = list() for(var/I in T) var/atom/A = I - items += A.GetAllContents() + if (!A.prevent_content_explosion()) //The atom/contents_explosion() proc returns null if the contents ex_acting has been handled by the atom, and TRUE if it hasn't. + items += A.GetAllContents() for(var/O in items) var/atom/A = O if(!QDELETED(A)) diff --git a/code/datums/looping_sounds/looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm similarity index 91% rename from code/datums/looping_sounds/looping_sound.dm rename to code/datums/looping_sounds/_looping_sound.dm index 2eba36dc90..1b7a304494 100644 --- a/code/datums/looping_sounds/looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -11,7 +11,6 @@ chance (num) Chance per loop to play a mid_sound volume (num) Sound output volume - muted (bool) Private. Used to stop the sound loop. max_loops (num) The max amount of loops to run for. direct (bool) If true plays directly to provided atoms instead of from them */ @@ -68,7 +67,7 @@ if(!chance || prob(chance)) play(get_sound(starttime)) if(!timerid) - timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_STOPPABLE | TIMER_LOOP) + timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_LOOP) /datum/looping_sound/proc/play(soundfile) var/list/atoms_cache = output_atoms @@ -84,10 +83,7 @@ playsound(thing, S, volume) /datum/looping_sound/proc/get_sound(starttime, _mid_sounds) - if(!_mid_sounds) - . = mid_sounds - else - . = _mid_sounds + . = _mid_sounds || mid_sounds while(!isfile(.) && !isnull(.)) . = pickweight(.) @@ -96,7 +92,7 @@ if(start_sound) play(start_sound) start_wait = start_length - addtimer(CALLBACK(src, .proc/sound_loop), start_wait) + addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME) /datum/looping_sound/proc/on_stop() if(end_sound) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 127413262c..4283d7f78f 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -195,7 +195,7 @@ /obj/item/clothing/gloves/krav_maga/combatglovesplus name = "combat gloves plus" desc = "These tactical gloves are fireproof and shock resistant, and using nanochip technology it teaches you the powers of krav maga." - icon_state = "black" + icon_state = "combat" item_state = "blackglovesplus" siemens_coefficient = 0 permeability_coefficient = 0.05 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 90affe0228..7d150d890d 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -233,13 +233,10 @@ /datum/mind/proc/remove_antag_equip() var/list/Mob_Contents = current.get_contents() for(var/obj/item/I in Mob_Contents) - if(istype(I, /obj/item/pda)) - var/obj/item/pda/P = I - P.lock_code = "" - - else if(istype(I, /obj/item/radio)) - var/obj/item/radio/R = I - R.traitor_frequency = 0 + var/datum/component/uplink/O = I.GetComponent(/datum/component/uplink) +//Todo make this reset signal + if(O) + O.unlock_code = null /datum/mind/proc/remove_all_antag() //For the Lazy amongst us. remove_changeling() @@ -304,33 +301,22 @@ . = 0 else . = uplink_loc - uplink_loc.AddComponent(/datum/component/uplink, traitor_mob.key) - var/unlock_note - - if(uplink_loc == R) - R.traitor_frequency = sanitize_frequency(rand(MIN_FREQ, MAX_FREQ)) - - if(!silent) - to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [R.name]. Simply dial the frequency [format_frequency(R.traitor_frequency)] to unlock its hidden features.") - unlock_note = "Radio Frequency: [format_frequency(R.traitor_frequency)] ([R.name])." - else if(uplink_loc == PDA) - PDA.lock_code = "[rand(100,999)] [pick(GLOB.phonetic_alphabet)]" - - if(!silent) - to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[PDA.lock_code]\" into the ringtone select to unlock its hidden features.") - unlock_note = "Uplink Passcode: [PDA.lock_code] ([PDA.name])." - - else if(uplink_loc == P) - P.traitor_unlock_degrees = rand(1, 360) - - if(!silent) - to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [P.traitor_unlock_degrees] from its starting position to unlock its hidden features.") - unlock_note = "Uplink Degrees: [P.traitor_unlock_degrees] ([P.name])." + var/datum/component/uplink/U = uplink_loc.AddComponent(/datum/component/uplink, traitor_mob.key) + if(!U) + CRASH("Uplink creation failed.") + U.setup_unlock_code() + if(!silent) + if(uplink_loc == R) + to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [R.name]. Simply dial the frequency [format_frequency(U.unlock_code)] to unlock its hidden features.") + else if(uplink_loc == PDA) + to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[U.unlock_code]\" into the ringtone select to unlock its hidden features.") + else if(uplink_loc == P) + to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [U.unlock_code] from its starting position to unlock its hidden features.") if(uplink_owner) - uplink_owner.antag_memory += unlock_note + "
" + uplink_owner.antag_memory += U.unlock_note + "
" else - traitor_mob.mind.store_memory(unlock_note) + traitor_mob.mind.store_memory(U.unlock_note) //Link a new mobs mind to the creator of said mob. They will join any team they are currently on, and will only switch teams when their creator does. diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 7de9ca8b4a..efa248b4f0 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -105,13 +105,6 @@ GLOBAL_LIST_EMPTY(mutations_list) return 0 return 1 -/datum/mutation/human/proc/say_mod(message) - if(message) - return message - -/datum/mutation/human/proc/get_spans() - return list() - /mob/living/carbon/proc/update_mutations_overlay() return diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 0c760f4620..85cecca489 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -15,6 +15,7 @@ ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK) owner.update_body_parts() SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk) + RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech) /datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity) if(proximity) //no telekinetic hulk attack @@ -32,8 +33,11 @@ REMOVE_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK) owner.update_body_parts() SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "hulk") + UnregisterSignal(owner, COMSIG_MOB_SAY) -/datum/mutation/human/hulk/say_mod(message) +/datum/mutation/human/hulk/proc/handle_speech(original_message, wrapped_message) + var/message = wrapped_message[1] if(message) - message = "[uppertext(replacetext(message, ".", "!"))]!!" - return message + message = "[replacetext(message, ".", "!")]!!" + wrapped_message[1] = message + return COMPONENT_UPPERCASE_SPEECH diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index d986672924..21adc944f6 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -17,9 +17,20 @@ text_gain_indication = "You feel an off sensation in your voicebox." text_lose_indication = "The off sensation passes." -/datum/mutation/human/wacky/get_spans() - return list(SPAN_SANS) +/datum/mutation/human/wacky/on_acquiring(mob/living/carbon/human/owner) + . = ..() + if(.) + return + RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech) +/datum/mutation/human/wacky/on_losing(mob/living/carbon/human/owner) + . = ..() + if(.) + return + UnregisterSignal(owner, COMSIG_MOB_SAY) + +/datum/mutation/human/wacky/proc/handle_speech(datum/source, list/speech_args) + speech_args[SPEECH_SPANS] |= SPAN_SANS /datum/mutation/human/mute name = "Mute" @@ -28,12 +39,14 @@ text_lose_indication = "You feel able to speak freely again." /datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner) - if(..()) + . = ..() + if(.) return ADD_TRAIT(owner, TRAIT_MUTE, GENETIC_MUTATION) /datum/mutation/human/mute/on_losing(mob/living/carbon/human/owner) - if(..()) + . = ..() + if(.) return REMOVE_TRAIT(owner, TRAIT_MUTE, GENETIC_MUTATION) @@ -45,7 +58,20 @@ text_gain_indication = "You feel so happy. Nothing can be wrong with anything. :)" text_lose_indication = "Everything is terrible again. :(" -/datum/mutation/human/smile/say_mod(message) +/datum/mutation/human/smile/on_acquiring(mob/living/carbon/human/owner) + . = ..() + if(.) + return + RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech) + +/datum/mutation/human/smile/on_losing(mob/living/carbon/human/owner) + . = ..() + if(.) + return + UnregisterSignal(owner, COMSIG_MOB_SAY) + +/datum/mutation/human/smile/proc/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] if(message) message = " [message] " //Time for a friendly game of SS13 @@ -92,7 +118,7 @@ message = replacetext(message," cunt "," privates ") message = replacetext(message," dick "," jerk ") message = replacetext(message," vagina "," privates ") - return trim(message) + speech_args[SPEECH_MESSAGE] = trim(message) /datum/mutation/human/unintelligible @@ -102,30 +128,17 @@ text_gain_indication = "You can't seem to form any coherent thoughts!" text_lose_indication = "Your mind feels more clear." -/datum/mutation/human/unintelligible/say_mod(message) - if(message) - var/prefix=copytext(message,1,2) - if(prefix == ";") - message = copytext(message,2) - else if(prefix in list(":","#")) - prefix += copytext(message,2,3) - message = copytext(message,3) - else - prefix="" +/datum/mutation/human/unintelligible/on_acquiring(mob/living/carbon/human/owner) + . = ..() + if(.) + return + ADD_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, GENETIC_MUTATION) - var/list/words = splittext(message," ") - var/list/rearranged = list() - for(var/i=1;i<=words.len;i++) - var/cword = pick(words) - words.Remove(cword) - var/suffix = copytext(cword,length(cword)-1,length(cword)) - while(length(cword)>0 && suffix in list(".",",",";","!",":","?")) - cword = copytext(cword,1 ,length(cword)-1) - suffix = copytext(cword,length(cword)-1,length(cword) ) - if(length(cword)) - rearranged += cword - message ="[prefix][jointext(rearranged," ")]" - return message +/datum/mutation/human/unintelligible/on_losing(mob/living/carbon/human/owner) + . = ..() + if(.) + return + REMOVE_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, GENETIC_MUTATION) /datum/mutation/human/swedish @@ -135,7 +148,20 @@ text_gain_indication = "You feel Swedish, however that works." text_lose_indication = "The feeling of Swedishness passes." -/datum/mutation/human/swedish/say_mod(message) +/datum/mutation/human/swedish/on_acquiring(mob/living/carbon/human/owner) + . = ..() + if(.) + return + RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech) + +/datum/mutation/human/swedish/on_losing(mob/living/carbon/human/owner) + . = ..() + if(.) + return + UnregisterSignal(owner, COMSIG_MOB_SAY) + +/datum/mutation/human/swedish/proc/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] if(message) message = replacetext(message,"w","v") message = replacetext(message,"j","y") @@ -144,7 +170,7 @@ message = replacetext(message,"o",pick("�","�","o")) if(prob(30)) message += " Bork[pick("",", bork",", bork, bork")]!" - return message + speech_args[SPEECH_MESSAGE] = trim(message) /datum/mutation/human/chav @@ -154,7 +180,20 @@ text_gain_indication = "Ye feel like a reet prat like, innit?" text_lose_indication = "You no longer feel like being rude and sassy." -/datum/mutation/human/chav/say_mod(message) +/datum/mutation/human/chav/on_acquiring(mob/living/carbon/human/owner) + . = ..() + if(.) + return + RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech) + +/datum/mutation/human/chav/on_losing(mob/living/carbon/human/owner) + . = ..() + if(.) + return + UnregisterSignal(owner, COMSIG_MOB_SAY) + +/datum/mutation/human/chav/proc/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] if(message) message = " [message] " message = replacetext(message," looking at "," gawpin' at ") @@ -178,7 +217,7 @@ message = replacetext(message," break "," do ") message = replacetext(message," your "," yer ") message = replacetext(message," security "," coppers ") - return trim(message) + speech_args[SPEECH_MESSAGE] = trim(message) /datum/mutation/human/elvis @@ -199,7 +238,20 @@ if(prob(15)) owner.visible_message("[owner] [pick("jiggles their hips", "rotates their hips", "gyrates their hips", "taps their foot", "dances to an imaginary song", "jiggles their legs", "snaps their fingers")]!") -/datum/mutation/human/elvis/say_mod(message) +/datum/mutation/human/elvis/on_acquiring(mob/living/carbon/human/owner) + . = ..() + if(.) + return + RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech) + +/datum/mutation/human/elvis/on_losing(mob/living/carbon/human/owner) + . = ..() + if(.) + return + UnregisterSignal(owner, COMSIG_MOB_SAY) + +/datum/mutation/human/elvis/proc/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] if(message) message = " [message] " message = replacetext(message," i'm not "," I aint ") @@ -211,7 +263,7 @@ message = replacetext(message," yes ",pick(" sure", "yea ")) message = replacetext(message," faggot "," square ") message = replacetext(message," muh valids "," getting my kicks ") - return trim(message) + speech_args[SPEECH_MESSAGE] = trim(message) /datum/mutation/human/stoner diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f2eb23808e..88fe2c8d13 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -289,8 +289,11 @@ to_chat(user, "You can't move while buckled to [src]!") return +/atom/proc/prevent_content_explosion() + return FALSE + /atom/proc/contents_explosion(severity, target) - return + return //For handling the effects of explosions on contents that would not normally be effected /atom/proc/ex_act(severity, target) set waitfor = FALSE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index f88f4f8e41..83762240bc 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -14,6 +14,7 @@ var/verb_exclaim = "exclaims" var/verb_whisper = "whispers" var/verb_yell = "yells" + var/speech_span var/inertia_dir = 0 var/atom/inertia_last_loc var/inertia_moving = 0 diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index a24d846f15..94ca86e0dd 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -275,7 +275,7 @@ Credit where due: gloves = /obj/item/clothing/gloves/color/yellow belt = /obj/item/storage/belt/utility/servant backpack_contents = list(/obj/item/storage/box/engineer = 1, \ - /obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1) + /obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1, /obj/item/reagent_containers/food/drinks/holyoil = 1) id = /obj/item/pda var/plasmaman //We use this to determine if we should activate internals in post_equip() @@ -338,6 +338,10 @@ Credit where due: CLOCKCULTCHANGELOG\ \
\ +
  • Zelus oil: A new reagent. It can be used to heal the faithful to Ratvar, or kill heretics and moreso stun blood cultists,\ + or splashed onto metal sheets to make brass. This chemical can be found in minimal quantities by grinding brass sheets.\ +
  • Brass Flasks:Intended to store Zelus Oil in, but can also be used as fragile single use throwing weapons in a pinch! \ + These are crafted with a single sheet of brass and fit in the Clockwork Cuirass' suit storage.\ Good luck!" /obj/item/paper/servant_primer/Initialize() diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 959bcfab4d..884b818f32 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -96,10 +96,10 @@ GLOBAL_LIST_EMPTY(announcement_systems) message = "The arrivals shuttle has been damaged. Docking for repairs..." if(channels.len == 0) - radio.talk_into(src, message, null, list(SPAN_ROBOT), get_default_language()) + radio.talk_into(src, message, null) else for(var/channel in channels) - radio.talk_into(src, message, channel, list(SPAN_ROBOT), get_default_language()) + radio.talk_into(src, message, channel) //config stuff diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index c751ba007a..71dcb89ce7 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -49,12 +49,9 @@ if(next_warning < world.time && prob(15)) var/area/A = get_area(loc) var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!" - radio.talk_into(src, message, radio_channel, get_spans()) + radio.talk_into(src, message, radio_channel) next_warning = world.time + minimum_time_between_warnings -/obj/machinery/computer/bank_machine/get_spans() - . = ..() | SPAN_ROBOT - /obj/machinery/computer/bank_machine/ui_interact(mob/user) . = ..() var/dat = "[station_name()] secure vault. Authorized personnel only.
    " diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 36a5c6ede4..ba9b6fc225 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -6,7 +6,7 @@ #define CLONE_INITIAL_DAMAGE 150 //Clones in clonepods start with 150 cloneloss damage and 150 brainloss damage, thats just logical #define MINIMUM_HEAL_LEVEL 40 -#define SPEAK(message) radio.talk_into(src, message, radio_channel, get_spans(), get_default_language()) +#define SPEAK(message) radio.talk_into(src, message, radio_channel) /obj/machinery/clonepod name = "cloning pod" diff --git a/code/game/machinery/computer/arcade/minesweeper.dm b/code/game/machinery/computer/arcade/minesweeper.dm index fe69860f76..e90e05966c 100644 --- a/code/game/machinery/computer/arcade/minesweeper.dm +++ b/code/game/machinery/computer/arcade/minesweeper.dm @@ -250,11 +250,11 @@ itemname = "a syndicate bomb beacon" new /obj/item/sbeacondrop/bomb(loc) if(2) - itemname = "a grenade launcher" - new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(loc) - new /obj/item/ammo_casing/a40mm(loc) - new /obj/item/ammo_casing/a40mm(loc) - new /obj/item/ammo_casing/a40mm(loc) + itemname = "a rocket launcher" + new /obj/item/gun/ballistic/rocketlauncher/unrestricted(loc) + new /obj/item/ammo_casing/caseless/rocket(loc) + new /obj/item/ammo_casing/caseless/rocket(loc) + new /obj/item/ammo_casing/caseless/rocket(loc) if(3) itemname = "two bags of c4" new /obj/item/storage/backpack/duffelbag/syndie/c4(loc) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 7284b3c738..03c60be91c 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -81,12 +81,6 @@ to_chat(usr, "The drip beeps: Warning, incompatible creature!") return - var/mob/living/L - if(isliving(target)) - L = target - if(!L.can_inject(usr, 1)) - return - if(Adjacent(target) && usr.Adjacent(target)) if(beaker) usr.visible_message("[usr] attaches [src] to [target].", "You attach [src] to [target].") diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index f2c216ca98..ad9a846bdc 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -323,7 +323,7 @@ GLOBAL_LIST_EMPTY(allConsoles) emergency = "Medical" if(radio_freq) Radio.set_frequency(radio_freq) - Radio.talk_into(src,"[emergency] emergency in [department]!!",radio_freq,get_spans(),get_default_language()) + Radio.talk_into(src,"[emergency] emergency in [department]!!",radio_freq) update_icon() addtimer(CALLBACK(src, .proc/clear_emergency), 3000) @@ -382,7 +382,7 @@ GLOBAL_LIST_EMPTY(allConsoles) screen = 6 if(radio_freq) - Radio.talk_into(src,"[alert]: [message]",radio_freq,get_spans(),get_default_language()) + Radio.talk_into(src, "[alert]: [message]", radio_freq) switch(priority) if(2) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index d8c0fbeeb3..2e5a13beb2 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -305,7 +305,7 @@ name = "\improper SRM-8 missile rack" desc = "A weapon for combat exosuits. Shoots light explosive missiles." icon_state = "mecha_missilerack" - projectile = /obj/item/projectile/bullet/srmrocket + projectile = /obj/item/projectile/bullet/a84mm_he fire_sound = 'sound/weapons/grenadelaunch.ogg' projectiles = 8 projectile_energy_cost = 1000 diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 0e543a3642..bdb949a570 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -30,6 +30,18 @@ loot_spawned++ return INITIALIZE_HINT_QDEL +/obj/effect/spawner/lootdrop/bedsheet + icon = 'icons/obj/bedsheets.dmi' + icon_state = "random_bedsheet" + name = "random dorms bedsheet" + loot = list(/obj/item/bedsheet = 8, /obj/item/bedsheet/blue = 8, /obj/item/bedsheet/green = 8, + /obj/item/bedsheet/grey = 8, /obj/item/bedsheet/orange = 8, /obj/item/bedsheet/purple = 8, + /obj/item/bedsheet/red = 8, /obj/item/bedsheet/yellow = 8, /obj/item/bedsheet/brown = 8, + /obj/item/bedsheet/black = 8, /obj/item/bedsheet/patriot = 3, /obj/item/bedsheet/rainbow = 3, + /obj/item/bedsheet/ian = 3, /obj/item/bedsheet/runtime = 3, /obj/item/bedsheet/nanotrasen = 3, + /obj/item/bedsheet/pirate = 1, /obj/item/bedsheet/cosmos = 1, /obj/item/bedsheet/gondola = 1 + ) + /obj/effect/spawner/lootdrop/armory_contraband name = "armory contraband gun spawner" lootdoubles = FALSE @@ -108,6 +120,33 @@ loot = GLOB.maintenance_loot . = ..() +/obj/effect/spawner/lootdrop/glowstick + name = "random colored glowstick" + icon = 'icons/obj/lighting.dmi' + icon_state = "random_glowstick" + +/obj/effect/spawner/lootdrop/glowstick/Initialize() + loot = typesof(/obj/item/flashlight/glowstick) + . = ..() + + +/obj/effect/spawner/lootdrop/gloves + name = "random gloves" + desc = "These gloves are supposed to be a random color..." + icon = 'icons/obj/clothing/gloves.dmi' + icon_state = "random_gloves" + loot = list( + /obj/item/clothing/gloves/color/orange = 1, + /obj/item/clothing/gloves/color/red = 1, + /obj/item/clothing/gloves/color/blue = 1, + /obj/item/clothing/gloves/color/purple = 1, + /obj/item/clothing/gloves/color/green = 1, + /obj/item/clothing/gloves/color/grey = 1, + /obj/item/clothing/gloves/color/light_brown = 1, + /obj/item/clothing/gloves/color/brown = 1, + /obj/item/clothing/gloves/color/white = 1, + /obj/item/clothing/gloves/color/rainbow = 1) + /obj/effect/spawner/lootdrop/crate_spawner name = "lootcrate spawner" //USE PROMO CODE "SELLOUT" FOR 20% OFF! lootdoubles = FALSE diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2af7be2564..cb979e8188 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -230,9 +230,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) research_msg += "." to_chat(user, research_msg.Join()) -/obj/item/proc/speechModification(message) //for message modding by mask slot. - return message - /obj/item/interact(mob/user) add_fingerprint(user) ui_interact(user) @@ -647,11 +644,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) else . = "" - -//when an item modify our speech spans when in our active hand. Override this to modify speech spans. -/obj/item/proc/get_held_item_speechspans(mob/living/carbon/user) - return - /obj/item/hitby(atom/movable/AM) return diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 38d64be99c..8895bffd70 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -414,10 +414,12 @@ RLD return FALSE if(do_after(user, rcd_results["delay"] * delay_mod, target = A)) if(checkResource(rcd_results["cost"], user)) + var/atom/cached = A if(A.rcd_act(user, src, rcd_results["mode"])) useResource(rcd_results["cost"], user) activate() - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + investigate_log("[user] used [src] on [cached] (now [A]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD) + playsound(src, 'sound/machines/click.ogg', 50, 1) return TRUE /obj/item/construction/rcd/Initialize() @@ -622,6 +624,7 @@ RLD sheetmultiplier = 16 var/mode = LIGHT_MODE actions_types = list(/datum/action/item_action/pick_color) + ammo_sections = 5 var/wallcost = 10 var/floorcost = 15 @@ -642,7 +645,7 @@ RLD ..() /obj/item/construction/rld/update_icon() - icon_state = "rld-[round(matter/35)]" + icon_state = "rld-[round((matter/max_matter) * 5, 1)]" ..() diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 29f0cf27f9..55d1a2c78a 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -19,6 +19,9 @@ else return ..() +/obj/item/toy/plush/carpplushie/dehy_carp/plop(obj/item/toy/plush/Daddy) + return FALSE + /obj/item/toy/plush/carpplushie/dehy_carp/proc/Swell() desc = "It's growing!" visible_message("[src] swells up!") diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 15c88d168f..45baa542d4 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -68,7 +68,6 @@ GLOBAL_LIST_EMPTY(PDAs) var/last_everyone //No text for everyone spamming var/last_noise //Also no honk spamming that's bad too var/ttone = "beep" //The ringtone! - var/lock_code = "" // Lockcode to unlock uplink var/honkamt = 0 //How many honks left when infected with honk.exe var/mimeamt = 0 //How many silence left when infected with mime.exe var/note = "Congratulations, your station has chosen the Thinktronic 5230 Personal Data Assistant! To help with navigation, we have provided the following definitions. North: Fore. South: Aft. West: Port. East: Starboard. Quarter is either side of aft." //Current note in the notepad function @@ -123,7 +122,7 @@ GLOBAL_LIST_EMPTY(PDAs) inserted_item = new inserted_item(src) else inserted_item = new /obj/item/pen(src) - update_icon() + update_icon(FALSE, TRUE) /obj/item/pda/CtrlShiftClick(mob/living/user) . = ..() @@ -144,8 +143,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(QDELETED(src) || isnull(new_icon) || new_icon == icon || M.incapacitated() || !in_range(M,src)) return icon = new_icon - set_new_overlays() - update_icon() + update_icon(FALSE, TRUE) to_chat(M, "[src] is now skinned as '[choice]'.") /obj/item/pda/proc/set_new_overlays() @@ -187,8 +185,7 @@ GLOBAL_LIST_EMPTY(PDAs) var/pref_skin = GLOB.pda_reskins[user.client.prefs.pda_skin] if(icon != pref_skin) icon = pref_skin - set_new_overlays() - update_icon() + update_icon(FALSE, TRUE) equipped = TRUE /obj/item/pda/proc/update_label() @@ -203,7 +200,9 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/pda/GetID() return id -/obj/item/pda/update_icon(alert = FALSE) +/obj/item/pda/update_icon(alert = FALSE, new_overlays = FALSE) + if(new_overlays) + set_new_overlays() cut_overlays() add_overlay(alert ? current_overlays[PDA_OVERLAY_ALERT] : current_overlays[PDA_OVERLAY_SCREEN]) var/mutable_appearance/overlay = new() diff --git a/code/game/objects/items/devices/PDA/virus_cart.dm b/code/game/objects/items/devices/PDA/virus_cart.dm index d35b2b58cf..d85c5d72d8 100644 --- a/code/game/objects/items/devices/PDA/virus_cart.dm +++ b/code/game/objects/items/devices/PDA/virus_cart.dm @@ -98,7 +98,7 @@ GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, target) if(!hidden_uplink) hidden_uplink = target.AddComponent(/datum/component/uplink) - target.lock_code = lock_code + hidden_uplink.unlock_code = lock_code else hidden_uplink.hidden_crystals += hidden_uplink.telecrystals //Temporarially hide the PDA's crystals, so you can't steal telecrystals. hidden_uplink.telecrystals = telecrystals diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index 9163fb0849..7f3c7f3bfc 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -17,7 +17,7 @@ var/eject_port = "ingestion" var/escape_in_progress = FALSE var/message_cooldown - var/breakout_time = 300 + var/breakout_time = 150 var/tmp/last_hearcheck = 0 var/tmp/list/hearing_mobs var/list/items_preserved = list() @@ -77,7 +77,7 @@ to_chat(user, "Your [src] is already occupied.") return user.visible_message("[hound.name] is carefully inserting [target.name] into their [src].", "You start placing [target] into your [src]...") - if(!patient && iscarbon(target) && !target.buckled && do_after (user, 50, target = target)) + if(!patient && iscarbon(target) && !target.buckled && do_after (user, 100, target = target)) if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. return //If they moved away, you can't eat them. @@ -420,6 +420,7 @@ desc = "Equipment for medical hound. A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves." icon = 'icons/mob/dogborg.dmi' icon_state = "sleeper" + breakout_time = 30 //Medical sleepers should be designed to be as easy as possible to get out of. /obj/item/dogborg/sleeper/K9 //The K9 portabrig name = "Mobile Brig" @@ -429,6 +430,7 @@ inject_amount = 0 min_health = -100 injection_chems = null //So they don't have all the same chems as the medihound! + breakout_time = 300 /obj/item/storage/attackby(obj/item/dogborg/sleeper/K9, mob/user, proximity) if(istype(K9)) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index d8b539ac27..722510dccb 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -512,17 +512,6 @@ name = "pink glowstick" color = LIGHT_COLOR_PINK -/obj/item/flashlight/glowstick/random - name = "random colored glowstick" - icon_state = "random_glowstick" - color = null - -/obj/item/flashlight/glowstick/random/Initialize() - ..() - var/T = pick(typesof(/obj/item/flashlight/glowstick) - /obj/item/flashlight/glowstick/random) - new T(loc) - return INITIALIZE_HINT_QDEL - /obj/item/flashlight/spotlight //invisible lighting source name = "disco light" desc = "Groovy..." diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index 661d38ce6b..5894b559ae 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -234,11 +234,18 @@ w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/instrument) -/obj/item/instrument/harmonica/speechModification(message) +/obj/item/instrument/harmonica/proc/handle_speech(datum/source, list/speech_args) if(song.playing && ismob(loc)) to_chat(loc, "You stop playing the harmonica to talk...") song.playing = FALSE - return message + +/obj/item/instrument/harmonica/equipped(mob/M, slot) + . = ..() + RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + +/obj/item/instrument/harmonica/dropped(mob/M) + . = ..() + UnregisterSignal(M, COMSIG_MOB_SAY) /obj/item/instrument/bikehorn name = "gilded bike horn" diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 4b244e3002..347bb6894d 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -17,13 +17,25 @@ user.say("AAAAAAAAAAAARGHHHHH", forced="megaphone suicide")//he must have died while coding this return OXYLOSS -/obj/item/megaphone/get_held_item_speechspans(mob/living/carbon/user) - if(spamcheck > world.time) - to_chat(user, "\The [src] needs to recharge!") +/obj/item/megaphone/equipped(mob/M, slot) + . = ..() + if (slot == SLOT_HANDS) + RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else - playsound(loc, 'sound/items/megaphone.ogg', 100, 0, 1) - spamcheck = world.time + 50 - return voicespan + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/megaphone/dropped(mob/M) + . = ..() + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/megaphone/proc/handle_speech(mob/living/carbon/user, list/speech_args) + if (user.get_active_held_item() == src) + if(spamcheck > world.time) + to_chat(user, "\The [src] needs to recharge!") + else + playsound(loc, 'sound/items/megaphone.ogg', 100, 0, 1) + spamcheck = world.time + 50 + speech_args[SPEECH_SPANS] |= voicespan /obj/item/megaphone/emag_act(mob/user) if(obj_flags & EMAGGED) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 719fe6ddd8..1d51aabf86 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -16,7 +16,6 @@ var/on = TRUE var/frequency = FREQ_COMMON - var/traitor_frequency = 0 // If tuned to this frequency, uplink will be unlocked. var/canhear_range = 3 // The range around the radio in which mobs can hear what it receives. var/emped = 0 // Tracks the number of EMPs currently stacked. @@ -190,7 +189,7 @@ /obj/item/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language) if(!spans) - spans = M.get_spans() + spans = list(M.speech_span) if(!language) language = M.get_default_language() INVOKE_ASYNC(src, .proc/talk_into_impl, M, message, channel, spans.Copy(), language) diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 34ce6bc521..62c41f7155 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -282,9 +282,7 @@ var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead magichead.item_flags |= NODROP //curses! magichead.flags_inv &= ~HIDEFACE //so you can still see their face - magichead.voicechange = TRUE //NEEEEIIGHH - if(!user.dropItemToGround(user.wear_mask)) - qdel(user.wear_mask) + user.dropItemToGround(user.wear_mask, TRUE) user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE) qdel(src) else diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index 49a5cfaf35..f9d00b6213 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -8,7 +8,7 @@ name = "artistic toolbox" desc = "A toolbox painted bright green. Looking at it makes you feel uneasy." icon_state = "his_grace" - item_state = "artistic_toolbox" + item_state = "toolbox_green" lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' icon = 'icons/obj/items_and_weapons.dmi' diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 44ccd7aad5..7524fc9007 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -15,7 +15,7 @@ var/mopping = 0 var/mopcount = 0 var/mopcap = 5 - var/stamusage = 5 + var/stamusage = 2 force_string = "robust... against germs" var/insertable = TRUE @@ -94,7 +94,7 @@ force = 6 throwforce = 8 throw_range = 4 - stamusage = 2 + stamusage = 1 var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water. var/refill_rate = 1 //Rate per process() tick mop refills itself var/refill_reagent = "water" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 12de29c76e..b5bb4fa233 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -16,6 +16,7 @@ var/obj/item/toy/plush/plush_child var/obj/item/toy/plush/paternal_parent //who initiated creation var/obj/item/toy/plush/maternal_parent //who owns, see love() + var/static/list/breeding_blacklist = typecacheof(/obj/item/toy/plush/carpplushie/dehy_carp) // you cannot have sexual relations with this plush var/list/scorned = list() //who the plush hates var/list/scorned_by = list() //who hates the plush, to remove external references on Destroy() var/heartbroken = FALSE @@ -203,9 +204,9 @@ else if(Kisser.partner == src && !plush_child) //the one advancing does not take ownership of the child and we have a one child policy in the toyshop user.visible_message("[user] is going to break [Kisser] and [src] by bashing them like that.", "[Kisser] passionately embraces [src] in your hands. Look away you perv!") - plop(Kisser) - user.visible_message("Something drops at the feet of [user].", - "The miracle of oh god did that just come out of [src]?!") + if(plop(Kisser)) + user.visible_message("Something drops at the feet of [user].", + "The miracle of oh god did that just come out of [src]?!") //then comes protection, or abstinence if we are catholic else if(Kisser.partner == src && plush_child) @@ -271,7 +272,10 @@ /obj/item/toy/plush/proc/plop(obj/item/toy/plush/Daddy) if(partner != Daddy) - return //we do not have bastards in our toyshop + return FALSE //we do not have bastards in our toyshop + + if(is_type_in_typecache(Daddy, breeding_blacklist)) + return FALSE // some love is forbidden if(prob(50)) //it has my eyes plush_child = new type(get_turf(loc)) @@ -574,10 +578,6 @@ icon_state = "vulken" item_state = "vulken" -/obj/item/toy/plush/snakeplushie/jecca - icon_state = "jecca" - item_state = "jecca" - /obj/item/toy/plush/nukeplushie name = "operative plushie" desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." @@ -630,13 +630,9 @@ /obj/item/toy/plush/mothplushie name = "insect plushie" desc = "An adorable stuffed toy that resembles some kind of insect" - icon_state = "cydia" - item_state = "cydia" - squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1) - -/obj/item/toy/plush/mothplushie/bumble icon_state = "bumble" item_state = "bumble" + squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1) /obj/item/toy/plush/mothplushie/nameko icon_state = "nameko" diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index a9f0e038df..15127c2e0e 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -159,11 +159,13 @@ armor = list("melee" = 25, "bullet" = 25, "laser" = 5, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 80) lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - item_state = "makeshift_shield" + icon = 'icons/obj/items_and_weapons.dmi' + item_state = "metal" + icon_state = "makeshift_shield" materials = list(MAT_METAL = 18000) slot_flags = null - block_chance = 25 - force = 5 + block_chance = 35 + force = 10 throwforce = 7 /obj/item/shield/riot/tower @@ -171,8 +173,11 @@ desc = "A massive shield that can block a lot of attacks, can take a lot of abuse before braking." armor = list("melee" = 95, "bullet" = 95, "laser" = 75, "energy" = 60, "bomb" = 90, "bio" = 90, "rad" = 0, "fire" = 90, "acid" = 10) //Armor for the item, dosnt transfer to user item_state = "metal" + icon_state = "metal" + icon = 'icons/obj/items_and_weapons.dmi' block_chance = 75 //1/4 shots will hit* - force = 10 + force = 16 slowdown = 2 throwforce = 15 //Massive pice of metal w_class = WEIGHT_CLASS_HUGE + item_flags = SLOWS_WHILE_IN_HAND diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index f9d4878fab..01351ab2e2 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -36,6 +36,7 @@ GLOBAL_LIST_INIT(human_recipes, list( \ GLOBAL_LIST_INIT(gondola_recipes, list ( \ new/datum/stack_recipe("gondola mask", /obj/item/clothing/mask/gondola, 1), \ new/datum/stack_recipe("gondola suit", /obj/item/clothing/under/gondola, 2), \ + new/datum/stack_recipe("gondola bedsheet", /obj/item/bedsheet/gondola, 1), \ )) /obj/item/stack/sheet/animalhide/gondola diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index b17bc87ffd..e1ecf6d14d 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -424,6 +424,8 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ new/datum/stack_recipe("receiver - brass skewer", /obj/structure/destructible/clockwork/trap/brass_skewer, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_ADJACENT), \ new/datum/stack_recipe("receiver - steam vent", /obj/structure/destructible/clockwork/trap/steam_vent, 3, time = 30, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \ new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \ + null, + new/datum/stack_recipe("brass flask", /obj/item/reagent_containers/food/drinks/holyoil/null), \ )) @@ -441,7 +443,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ throw_range = 3 turf_type = /turf/open/floor/clockwork novariants = FALSE - grind_results = list("iron" = 5, "teslium" = 15) + grind_results = list("iron" = 5, "teslium" = 15, "holyoil" = 1) merge_type = /obj/item/stack/tile/brass /obj/item/stack/tile/brass/narsie_act() diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index c2929dafbd..eb71311c96 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -487,7 +487,7 @@ item_state = "duffel-syndieammo" /obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun - desc = "A large duffel bag, packed to the brim with Bulldog shotgun ammo." + desc = "A large duffel bag, packed to the brim with Bulldog shotgun drum magazines." /obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun/PopulateContents() for(var/i in 1 to 6) @@ -497,14 +497,14 @@ new /obj/item/ammo_box/magazine/m12g/dragon(src) /obj/item/storage/backpack/duffelbag/syndie/ammo/smg - desc = "A large duffel bag, packed to the brim with C20r magazines." + desc = "A large duffel bag, packed to the brim with C-20r magazines." /obj/item/storage/backpack/duffelbag/syndie/ammo/smg/PopulateContents() for(var/i in 1 to 9) new /obj/item/ammo_box/magazine/smgm45(src) /obj/item/storage/backpack/duffelbag/syndie/c20rbundle - desc = "A large duffel bag containing a C20r, some magazines, and a cheap looking suppressor." + desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor." /obj/item/storage/backpack/duffelbag/syndie/c20rbundle/PopulateContents() new /obj/item/ammo_box/magazine/smgm45(src) @@ -513,7 +513,7 @@ new /obj/item/suppressor/specialoffer(src) /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle - desc = "A large duffel bag containing a Bulldog, several drums, and a collapsed hardsuit." + desc = "A large duffel bag containing a Bulldog, some drums, and a pair of thermal imaging glasses." /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle/PopulateContents() new /obj/item/ammo_box/magazine/m12g(src) @@ -522,16 +522,7 @@ new /obj/item/clothing/glasses/thermal/syndi(src) /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle - desc = "A large duffel bag containing a medical equipment, a Donksoft machine gun, a big jumbo box of darts, and a knock-off pair of magboots." - -/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents() - new /obj/item/clothing/shoes/magboots/syndie(src) - new /obj/item/storage/firstaid/tactical(src) - new /obj/item/gun/ballistic/automatic/l6_saw/toy(src) - new /obj/item/ammo_box/foambox/riot(src) - -/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle - desc = "A large duffel bag containing a medical equipment, a Donksoft machine gun, a big jumbo box of darts, and a knock-off pair of magboots." + desc = "A large duffel bag containing a tactical medkit, a Donksoft machine gun, a big jumbo box of riot darts, and a knock-off pair of magboots." /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents() new /obj/item/clothing/shoes/magboots/syndie(src) @@ -540,7 +531,7 @@ new /obj/item/ammo_box/foambox/riot(src) /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle - desc = "A large duffel bag containing a deadly chemicals, a chemical spray, chemical grenade, a Donksoft assault rifle, riot grade darts, a minature syringe gun, and a box of syringes." + desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, a Donksoft assault rifle, box of riot grade darts, a dart pistol, and a box of syringes." /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle/PopulateContents() new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src) @@ -562,7 +553,7 @@ new /obj/item/grenade/plastic/x4(src) /obj/item/storage/backpack/duffelbag/syndie/firestarter - desc = "A large duffel bag containing New Russian pyro backpack sprayer, a pistol, a pipebomb, fireproof hardsuit, ammo, and other equipment." + desc = "A large duffel bag containing a New Russian pyro backpack sprayer, Elite hardsuit, a Stechkin APS pistol, minibomb, ammo, and other equipment." /obj/item/storage/backpack/duffelbag/syndie/firestarter/PopulateContents() new /obj/item/clothing/under/syndicate/soviet(src) diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index 46676b5adb..bca13f2a45 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -68,9 +68,8 @@ ..() /obj/item/storage/briefcase/sniperbundle - desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding. Smells like L'Air du Temps." + desc = "Its label reads \"genuine hardened Captain leather\", but suspiciously has no other tags or branding. Smells like L'Air du Temps." force = 10 - /obj/item/storage/briefcase/sniperbundle/PopulateContents() ..() // in case you need any paperwork done after your rampage new /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate(src) @@ -82,7 +81,7 @@ /obj/item/storage/briefcase/modularbundle - desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding." + desc = "Its label reads \"genuine hardened Captain leather\", but suspiciously has no other tags or branding." force = 10 /obj/item/storage/briefcase/modularbundle/PopulateContents() diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index b2313969f0..5b99bb85bf 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST_EMPTY(rubber_toolbox_icons) + /obj/item/storage/toolbox name = "toolbox" desc = "Danger. Very robust." @@ -16,21 +18,25 @@ hitsound = 'sound/weapons/smash.ogg' var/latches = "single_latch" var/has_latches = TRUE + var/can_rubberify = TRUE -/obj/item/storage/toolbox/Initialize() +/obj/item/storage/toolbox/Initialize(mapload) . = ..() if(has_latches) if(prob(10)) latches = "double_latch" if(prob(1)) latches = "triple_latch" + if(mapload && can_rubberify && prob(5)) + rubberify() update_icon() /obj/item/storage/toolbox/update_icon() ..() cut_overlays() if(has_latches) - add_overlay(latches) + var/icon/I = icon('icons/obj/storage.dmi', latches) + add_overlay(I) /obj/item/storage/toolbox/suicide_act(mob/user) @@ -39,8 +45,6 @@ /obj/item/storage/toolbox/emergency name = "emergency toolbox" - icon_state = "red" - item_state = "toolbox_red" /obj/item/storage/toolbox/emergency/PopulateContents() new /obj/item/crowbar/red(src) @@ -59,6 +63,7 @@ name = "rusty red toolbox" icon_state = "toolbox_red_old" has_latches = FALSE + can_rubberify = FALSE /obj/item/storage/toolbox/mechanical name = "mechanical toolbox" @@ -77,6 +82,7 @@ name = "rusty blue toolbox" icon_state = "toolbox_blue_old" has_latches = FALSE + can_rubberify = FALSE /obj/item/storage/toolbox/mechanical/old/heirloom name = "old, robust toolbox" //this will be named "X family toolbox" @@ -151,6 +157,7 @@ resistance_flags = FIRE_PROOF | ACID_PROOF w_class = WEIGHT_CLASS_HUGE attack_verb = list("robusted", "crushed", "smashed") + can_rubberify = FALSE var/fabricator_type = /obj/item/clockwork/replica_fabricator/scarab /obj/item/storage/toolbox/brass/ComponentInitialize() @@ -191,6 +198,7 @@ item_state = "toolbox_blue" w_class = WEIGHT_CLASS_HUGE //heyo no bohing this! force = 18 //spear damage + can_rubberify = FALSE /obj/item/storage/toolbox/plastitanium/afterattack(atom/A, mob/user, proximity) . = ..() @@ -204,7 +212,7 @@ name = "artistic toolbox" desc = "A toolbox painted bright green. Why anyone would store art supplies in a toolbox is beyond you, but it has plenty of extra space." icon_state = "green" - item_state = "artistic_toolbox" + item_state = "toolbox_green" w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox! /obj/item/storage/toolbox/artistic/ComponentInitialize() @@ -253,9 +261,55 @@ /obj/item/storage/toolbox/gold_fake // used in crafting name = "golden toolbox" - desc = "A gold plated toolbox, fancy and harmless do to the gold plating being on cardboard!" + desc = "A gold plated toolbox, fancy and harmless due to the gold plating being on cardboard!" icon_state = "gold" item_state = "gold" has_latches = FALSE force = 0 throwforce = 0 + can_rubberify = FALSE + +/obj/item/storage/toolbox/proc/rubberify() + name = "rubber [name]" + desc = replacetext(desc, "Danger", "Bouncy") + desc = replacetext(desc, "robust", "safe") + desc = replacetext(desc, "heavier", "bouncier") + DISABLE_BITFIELD(flags_1, CONDUCT_1) + materials = null + damtype = STAMINA + force += 3 //to compensate the higher stamina K.O. threshold compared to actual health. + throwforce += 3 + attack_verb += "bounced" + hitsound = 'sound/effects/clownstep1.ogg' + if(!GLOB.rubber_toolbox_icons[icon_state]) + generate_rubber_toolbox_icon() + icon = GLOB.rubber_toolbox_icons[icon_state] + AddComponent(/datum/component/bouncy) + . = ..() + +/obj/item/storage/toolbox/proc/generate_rubber_toolbox_icon() + var/icon/new_icon = icon(icon, icon_state) + var/icon/smooth = icon('icons/obj/storage.dmi', "rubber_toolbox_blend") + new_icon.Blend(smooth, ICON_MULTIPLY) + new_icon = fcopy_rsc(new_icon) + GLOB.rubber_toolbox_icons[icon_state] = new_icon + +/obj/item/storage/toolbox/rubber + name = "rubber toolbox" + desc = "Bouncy. Very safe." + flags_1 = null + materials = null + damtype = STAMINA + force = 17 + throwforce = 17 + attack_verb = list("robusted", "bounced") + can_rubberify = FALSE //we are already the future. + +/obj/item/storage/toolbox/rubber/Initialize() + icon_state = pick("blue", "red", "yellow", "green") + item_state = "toolbox_[icon_state]" + if(!GLOB.rubber_toolbox_icons[icon_state]) + generate_rubber_toolbox_icon() + icon = GLOB.rubber_toolbox_icons[icon_state] + . = ..() + AddComponent(/datum/component/bouncy) \ No newline at end of file diff --git a/code/game/objects/items/taster.dm b/code/game/objects/items/taster.dm index 8363c63c2c..3828beb921 100644 --- a/code/game/objects/items/taster.dm +++ b/code/game/objects/items/taster.dm @@ -6,10 +6,9 @@ w_class = WEIGHT_CLASS_TINY - var/taste_sensitivity = 15 + speech_span = null -/obj/item/taster/get_spans() - return list() + var/taste_sensitivity = 15 /obj/item/taster/afterattack(atom/O, mob/user, proximity) . = ..() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 274afe15e0..9239973247 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -294,7 +294,7 @@ name = "windup toolbox" desc = "A replica toolbox that rumbles when you turn the key." icon_state = "his_grace" - item_state = "artistic_toolbox" + item_state = "toolbox_green" lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' var/active = FALSE diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 2db2cd08d8..70a05a8d40 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -48,7 +48,12 @@ /obj/hitby(atom/movable/AM) ..() - take_damage(AM.throwforce, BRUTE, "melee", 1, get_dir(src, AM)) + var/throwdamage = AM.throwforce + if(isobj(AM)) + var/obj/O = AM + if(O.damtype == STAMINA) + throwdamage = 0 + take_damage(throwdamage, BRUTE, "melee", 1, get_dir(src, AM)) /obj/ex_act(severity, target) if(resistance_flags & INDESTRUCTIBLE) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index fd6a9f2141..6dd8a43130 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -2,6 +2,7 @@ /obj var/crit_fail = FALSE animate_movement = 2 + speech_span = SPAN_ROBOT var/obj_flags = CAN_BE_HIT var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. @@ -204,9 +205,6 @@ if(!anchored || current_size >= STAGE_FIVE) step_towards(src,S) -/obj/get_spans() - return ..() | SPAN_ROBOT - /obj/get_dumping_location(datum/component/storage/source,mob/user) return get_turf(src) diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index 964f60cb73..1ab28a33de 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -294,6 +294,16 @@ icon = "the_lightbulb" desc = "A cafe popular among moths and moffs. Once shut down for a week after the bartender used mothballs to protect her spare uniforms." +/datum/barsign/cybersylph + name = "Cyber Sylph's" + icon = "cybersylph" + desc = "A cafe renowed for its out-of-boundaries futuristic insignia." + +/datum/barsign/meow_mix + name = "Meow Mix" + icon = "meow_mix" + desc = "No, we don't serve catnip, officer!" + /datum/barsign/hiddensigns hidden = TRUE diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 89dcc75042..b493f84240 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -225,6 +225,39 @@ LINEN BINS item_color = "ian" dream_messages = list("a dog", "a corgi", "woof", "bark", "arf") +/obj/item/bedsheet/runtime + icon_state = "sheetruntime" + item_color = "runtime" + dream_messages = list("a kitty", "a cat", "meow", "purr", "nya~") + +/obj/item/bedsheet/pirate + name = "pirate's bedsheet" + desc = "It has a Jolly Roger emblem on it and has a faint scent of grog." + icon_state = "sheetpirate" + item_color = "black" + dream_messages = list("doing whatever oneself wants", "cause a pirate is free", "being a pirate", "stealing", "landlubbers", "gold", "a buried treasure", "yarr", "avast", "a swashbuckler", "sailing the Seven Seas", "a parrot", "a monkey", "an island", "a talking skull") + +/obj/item/bedsheet/gondola + name = "gondola bedsheet" + desc = "A precious bedsheet made from the hide of a rare and peculiar critter." + icon_state = "sheetgondola" + item_color = "cargo" + var/g_mouth + var/g_eyes + +/obj/item/bedsheet/gondola/Initialize() + . = ..() + g_mouth = "sheetgondola_mouth[rand(1, 4)]" + g_eyes = "sheetgondola_eyes[rand(1, 4)]" + add_overlay(g_mouth) + add_overlay(g_eyes) + +/obj/item/bedsheet/gondola/worn_overlays(isinhands = FALSE, icon_file) + . = ..() + if(!isinhands) + . += mutable_appearance(icon_file, g_mouth) + . += mutable_appearance(icon_file, g_eyes) + /obj/item/bedsheet/cosmos name = "cosmic space bedsheet" desc = "Made from the dreams of those who wonder at the stars." @@ -258,7 +291,6 @@ LINEN BINS var/list/sheets = list() var/obj/item/hidden = null - /obj/structure/bedsheetbin/examine(mob/user) ..() if(amount < 1) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 6fac5da2a5..00d1690d86 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -262,7 +262,7 @@ if(isobj(AM)) if(prob(50) && anchored && !broken) var/obj/O = AM - if(O.throwforce != 0)//don't want to let people spam tesla bolts, this way it will break after time + if(O.throwforce != 0 && O.damtype != STAMINA)//don't want to let people spam tesla bolts, this way it will break after time var/turf/T = get_turf(src) var/obj/structure/cable/C = T.get_cable_node() if(C) diff --git a/code/game/say.dm b/code/game/say.dm index 0788310038..4ce1d3c710 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -23,7 +23,7 @@ GLOBAL_LIST_INIT(freqtospan, list( return if(message == "" || !message) return - spans |= get_spans() + spans |= speech_span if(!language) language = get_default_language() send_speech(message, 7, src, , spans, message_language=language) @@ -40,10 +40,6 @@ GLOBAL_LIST_INIT(freqtospan, list( var/atom/movable/AM = _AM AM.Hear(rendered, src, message_language, message, , spans, message_mode) -//To get robot span classes, stuff like that. -/atom/movable/proc/get_spans() - return list() - /atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE) //This proc uses text() because it is faster than appending strings. Thanks BYOND. //Basic span @@ -87,7 +83,7 @@ GLOBAL_LIST_INIT(freqtospan, list( else return verb_say -/atom/movable/proc/say_quote(input, list/spans=list(), message_mode) +/atom/movable/proc/say_quote(input, list/spans=list(speech_span), message_mode) if(!input) input = "..." @@ -97,7 +93,7 @@ GLOBAL_LIST_INIT(freqtospan, list( var/spanned = attach_spans(input, spans) return "[say_mod(input, message_mode)][spanned ? ", \"[spanned]\"" : ""]" // Citadel edit [spanned ? ", \"[spanned]\"" : ""]" - + /atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode) if(has_language(language)) var/atom/movable/AM = speaker.GetSource() diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index bff955086c..253a6ead90 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -144,6 +144,7 @@ barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY + var/dropped_brass var/uses_overlay = TRUE var/obj/effect/clockwork/overlay/floor/realappearence @@ -201,7 +202,10 @@ return /turf/open/floor/clockwork/crowbar_act(mob/living/user, obj/item/I) - if(baseturfs == type) + if(islist(baseturfs)) + if(type in baseturfs) + return TRUE + else if(baseturfs == type) return TRUE user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...") if(I.use_tool(src, user, 70, volume=80)) @@ -210,7 +214,14 @@ return TRUE /turf/open/floor/clockwork/make_plating() - new /obj/item/stack/tile/brass(src) + if(!dropped_brass) + new /obj/item/stack/tile/brass(src) + dropped_brass = TRUE + if(islist(baseturfs)) + if(type in baseturfs) + return + else if(baseturfs == type) + return return ..() /turf/open/floor/clockwork/narsie_act() diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 8e1926115f..ae6482abbd 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -4,7 +4,7 @@ var/F = file("[GLOB.log_directory]/[subject].html") WRITE_FILE(F, "[TIME_STAMP("hh:mm:ss", FALSE)] [REF(src)] ([x],[y],[z]) || [src] [message]
    ") -/client/proc/investigate_show(subject in list("notes, memos, watchlist", INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_CIRCUIT, INVESTIGATE_NANITES) ) +/client/proc/investigate_show(subject in list("notes, memos, watchlist", INVESTIGATE_RCD, INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_CIRCUIT, INVESTIGATE_NANITES) ) set name = "Investigate" set category = "Admin" if(!holder) diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm index a97c0bf116..8b824f8fb0 100644 --- a/code/modules/admin/chat_commands.dm +++ b/code/modules/admin/chat_commands.dm @@ -78,13 +78,13 @@ GLOBAL_LIST(round_end_notifiees) /datum/tgs_chat_command/notify name = "notify" help_text = "Pings the invoker when the round ends" - admin_only = TRUE + admin_only = FALSE /datum/tgs_chat_command/notify/Run(datum/tgs_chat_user/sender, params) if(!SSticker.IsRoundInProgress() && SSticker.HasRoundStarted()) return "[sender.mention], the round has already ended!" LAZYINITLIST(GLOB.round_end_notifiees) - GLOB.round_end_notifiees[sender.mention] = TRUE + GLOB.round_end_notifiees["<@[sender.mention]>"] = TRUE return "I will notify [sender.mention] when the round ends." /datum/tgs_chat_command/sdql @@ -140,4 +140,4 @@ GLOBAL_LIST(round_end_notifiees) log_admin("[sender.friendly_name] has added [params] to the current round's bunker bypass list.") message_admins("[sender.friendly_name] has added [params] to the current round's bunker bypass list.") - return "[params] has been added to the current round's bunker bypass list." \ No newline at end of file + return "[params] has been added to the current round's bunker bypass list." diff --git a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm index e60209cb7b..3cb90d64bb 100644 --- a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm @@ -57,7 +57,7 @@ return ..() /mob/living/simple_animal/hostile/blob/proc/blob_chat(msg) - var/spanned_message = say_quote(msg, get_spans()) + var/spanned_message = say_quote(msg) var/rendered = "\[Blob Telepathy\] [real_name] [spanned_message]" for(var/M in GLOB.mob_list) if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob)) diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm index ddf745c0f9..d32e38c194 100644 --- a/code/modules/antagonists/blob/blob/overmind.dm +++ b/code/modules/antagonists/blob/blob/overmind.dm @@ -210,7 +210,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) src.log_talk(message, LOG_SAY) - var/message_a = say_quote(message, get_spans()) + var/message_a = say_quote(message) var/rendered = "\[Blob Telepathy\] [name]([blob_reagent_datum.name]) [message_a]" for(var/mob/M in GLOB.mob_list) diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm index 277aeca48d..4956a756e9 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm @@ -69,7 +69,7 @@ heat_protection = CHEST|GROIN|LEGS resistance_flags = FIRE_PROOF | ACID_PROOF armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel) + allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/holyoil) /obj/item/clothing/suit/armor/clockwork/Initialize() . = ..() diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm index 30c84f5312..12af249bee 100644 --- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm +++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm @@ -21,8 +21,9 @@ /obj/item/clockwork/construct_chassis/Destroy() GLOB.poi_list -= src - var/list/spawners = GLOB.mob_spawners[name] - LAZYREMOVE(spawners, src) + LAZYREMOVE(GLOB.mob_spawners[name], src) + if(!LAZYLEN(GLOB.mob_spawners[name])) + GLOB.mob_spawners -= name . = ..() /obj/item/clockwork/construct_chassis/examine(mob/user) diff --git a/code/modules/antagonists/clockcult/clock_mobs.dm b/code/modules/antagonists/clockcult/clock_mobs.dm index bd9c52b19f..6268d15d44 100644 --- a/code/modules/antagonists/clockcult/clock_mobs.dm +++ b/code/modules/antagonists/clockcult/clock_mobs.dm @@ -19,6 +19,7 @@ bubble_icon = "clock" light_color = "#E42742" death_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' + speech_span = SPAN_ROBOT var/playstyle_string = "You are a bug, yell at whoever spawned you!" var/empower_string = "You have nothing to empower, yell at the coders!" //Shown to the mob when the herald beacon activates @@ -26,9 +27,6 @@ . = ..() update_values() -/mob/living/simple_animal/hostile/clockwork/get_spans() - return ..() | SPAN_ROBOT - /mob/living/simple_animal/hostile/clockwork/Login() ..() add_servant_of_ratvar(src, TRUE) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 4056ac1cea..112a31f44d 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -1,13 +1,21 @@ -//Harvest; activated ly clicking the target, will try to drain their essence. /mob/living/simple_animal/revenant/ClickOn(atom/A, params) //revenants can't interact with the world directly. - A.examine(src) + var/list/modifiers = params2list(params) + if(modifiers["shift"]) + ShiftClickOn(A) + return + if(modifiers["alt"]) + AltClickNoInteract(src, A) + return + if(ishuman(A)) if(A in drained_mobs) to_chat(src, "[A]'s soul is dead and empty." ) else if(in_range(src, A)) Harvest(A) + +//Harvest; activated ly clicking the target, will try to drain their essence. /mob/living/simple_animal/revenant/proc/Harvest(mob/living/carbon/human/target) if(!castcheck(0)) return diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 0a4a82b862..9fb2c3e2b7 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -100,6 +100,7 @@ deathmessage = "explodes with a sharp pop!" light_color = LIGHT_COLOR_CYAN hud_type = /datum/hud/swarmer + speech_span = SPAN_ROBOT var/resources = 0 //Resource points, generated by consuming metal/glass var/max_resources = 100 @@ -126,9 +127,6 @@ if(statpanel("Status")) stat("Resources:",resources) -/mob/living/simple_animal/hostile/swarmer/get_spans() - return ..() | SPAN_ROBOT - /mob/living/simple_animal/hostile/swarmer/emp_act() . = ..() if(. & EMP_PROTECT_SELF) @@ -666,7 +664,7 @@ set_light(0) /mob/living/simple_animal/hostile/swarmer/proc/swarmer_chat(msg) - var/rendered = "Swarm communication - [src] [say_quote(msg, get_spans())]" + var/rendered = "Swarm communication - [src] [say_quote(msg)]" for(var/i in GLOB.mob_list) var/mob/M = i if(isswarmer(M)) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 47823a2dc4..828e19e3f6 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -18,7 +18,7 @@ /datum/antagonist/traitor/on_gain() if(owner.current && isAI(owner.current)) traitor_kind = TRAITOR_AI - + SSticker.mode.traitors += owner owner.special_role = special_role if(give_objectives) @@ -48,7 +48,7 @@ A.verbs -= /mob/living/silicon/ai/proc/choose_modules A.malf_picker.remove_malf_verbs(A) qdel(A.malf_picker) - + SSticker.mode.traitors -= owner if(!silent && owner.current) to_chat(owner.current," You are no longer the [special_role]! ") @@ -244,14 +244,16 @@ return var/mob/traitor_mob=owner.current - to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") - to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]") - to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]") + var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") + var/responses = jointext(GLOB.syndicate_code_response, ", ") - antag_memory += "Code Phrase: [GLOB.syndicate_code_phrase]
    " - antag_memory += "Code Response: [GLOB.syndicate_code_response]
    " + var/dat = "The Syndicate have provided you with the following codewords to identify fellow agents:\n" + dat += "Code Phrase: [phrases]\n" + dat += "Code Response: [responses]" + to_chat(traitor_mob, dat) - to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") + antag_memory += "Code Phrase: [phrases]
    " + antag_memory += "Code Response: [responses]
    " /datum/antagonist/traitor/proc/add_law_zero() var/mob/living/silicon/ai/killer = owner.current diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index bfe60cd573..552b9dbd64 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -167,10 +167,11 @@ on = FALSE update_icon() playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors. - radio.talk_into(src, "Patient fully restored", radio_channel, get_spans(), get_default_language()) + var/msg = "Patient fully restored." if(autoeject) // Eject if configured. - radio.talk_into(src, "Auto ejecting patient now", radio_channel, get_spans(), get_default_language()) + msg += " Auto ejecting patient now." open_machine() + radio.talk_into(src, msg, radio_channel) return var/datum/gas_mixture/air1 = airs[1] diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 8a1bae5e68..b52dc158e4 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -1,18 +1,22 @@ /obj/machinery/atmospherics/components/unary/thermomachine - name = "thermomachine" - desc = "Heats or cools gas in connected pipes." icon = 'icons/obj/atmospherics/components/thermomachine.dmi' icon_state = "freezer" - var/icon_state_off = "freezer" - var/icon_state_on = "freezer_1" - var/icon_state_open = "freezer-o" + + name = "thermomachine" + desc = "Heats or cools gas in connected pipes." + density = TRUE max_integrity = 300 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 30) layer = OBJ_LAYER circuit = /obj/item/circuitboard/machine/thermomachine + pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY + var/icon_state_off = "freezer" + var/icon_state_on = "freezer_1" + var/icon_state_open = "freezer-o" + var/min_temperature = 0 var/max_temperature = 0 var/target_temperature = T20C @@ -45,6 +49,13 @@ if(showpipe) add_overlay(getpipeimage(icon, "scrub_cap", initialize_directions)) +/obj/machinery/atmospherics/components/unary/thermomachine/examine(mob/user) + . = ..() + . += "The thermostat is set to [target_temperature]K ([(T0C-target_temperature)*-1]C)." + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Efficiency [(heat_capacity/5000)*100]%." + . += "Temperature range [min_temperature]K - [max_temperature]K ([(T0C-min_temperature)*-1]C - [(T0C-max_temperature)*-1]C)." + /obj/machinery/atmospherics/components/unary/thermomachine/process_atmos() ..() if(!on || !nodes[1]) @@ -155,6 +166,16 @@ update_icon() +/obj/machinery/atmospherics/components/unary/thermomachine/CtrlClick(mob/living/user) + var/area/A = get_area(src) + var/turf/T = get_turf(src) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + return + on = !on + update_icon() + investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS) + message_admins("[src.name] was turned [on ? "on" : "off"] [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") + /obj/machinery/atmospherics/components/unary/thermomachine/freezer name = "freezer" icon_state = "freezer" @@ -174,6 +195,13 @@ if(target_temperature == initial(target_temperature)) target_temperature = min_temperature +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom + name = "cold room freezer" + +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom/Initialize() + . = ..() + target_temperature = T0C-80 + /obj/machinery/atmospherics/components/unary/thermomachine/freezer/RefreshParts() ..() var/L @@ -181,6 +209,15 @@ L += M.rating min_temperature = max(T0C - (initial(min_temperature) + L * 15), TCMB) //73.15K with T1 stock parts +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/AltClick(mob/living/user) + var/area/A = get_area(src) + var/turf/T = get_turf(src) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + return + target_temperature = min_temperature + investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) + message_admins("[src.name] was minimized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") + /obj/machinery/atmospherics/components/unary/thermomachine/heater name = "heater" icon_state = "heater" @@ -201,3 +238,12 @@ for(var/obj/item/stock_parts/micro_laser/M in component_parts) L += M.rating max_temperature = T20C + (initial(max_temperature) * L) //573.15K with T1 stock parts + +/obj/machinery/atmospherics/components/unary/thermomachine/heater/AltClick(mob/living/user) + var/area/A = get_area(src) + var/turf/T = get_turf(src) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + return + target_temperature = max_temperature + investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) + message_admins("[src.name] was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 07cc5c8225..74f81ec9a0 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -72,9 +72,9 @@ /obj/effect/mob_spawn/Destroy() GLOB.poi_list -= src var/job_name = job_description ? job_description : name - GLOB.mob_spawners -= job_name + LAZYREMOVE(GLOB.mob_spawners[job_name], src) if(!LAZYLEN(GLOB.mob_spawners[job_name])) - LAZYREMOVE(GLOB.mob_spawners[job_name], src) + GLOB.mob_spawners -= job_name return ..() /obj/effect/mob_spawn/proc/can_latejoin() //If it can be taken from the lobby. diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 5a33d8bd44..89e221c339 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -29,7 +29,7 @@ var/effectQuiet = FALSE //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) var/effectMissile = FALSE //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground var/effectCircle = FALSE //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here - var/style = STYLE_STANDARD //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. + var/style = STYLE_STANDARD //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. var/reversing = FALSE //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom var/landingSound //Admin sound to play when the pod lands var/openingSound //Admin sound to play when the pod opens @@ -76,7 +76,7 @@ /obj/structure/closet/supplypod/tool_interact(obj/item/W, mob/user) if (bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways. - return FALSE + return FALSE else ..() @@ -86,13 +86,15 @@ /obj/structure/closet/supplypod/contents_explosion() //Supplypods also protect their contents from the harmful effects of fucking exploding. return +/obj/structure/closet/supplypod/prevent_content_explosion() //Useful for preventing epicenter explosions from damaging contents + return TRUE + /obj/structure/closet/supplypod/toggle(mob/living/user) //Supplypods shouldn't be able to be manually opened under any circumstances, as the open() proc generates supply order datums return /obj/structure/closet/supplypod/proc/preOpen() //Called before the open() proc. Handles anything that occurs right as the pod lands. var/turf/T = get_turf(src) var/list/B = explosionSize //Mostly because B is more readable than explosionSize :p - var/boomTotal = 0 //A counter used to check if the explosion does nothing if (landingSound) playsound(get_turf(src), landingSound, soundVolume, 0, 0) for (var/mob/living/M in T) @@ -108,10 +110,8 @@ M.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs M.adjustBruteLoss(damage) - for (var/i in B) - boomTotal += i //Count up all the values of the explosion - if (boomTotal != 0) //If the explosion list isn't all zeroes, call an explosion + if (B[1] || B[2] || B[3] || B[4]) //If the explosion list isn't all zeroes, call an explosion explosion(get_turf(src), B[1], B[2], B[3], flame_range = B[4], silent = effectQuiet, ignorecap = istype(src, /obj/structure/closet/supplypod/centcompod)) //less advanced equipment than bluespace pod, so larger explosion when landing else if (!effectQuiet) //If our explosion list IS all zeroes, we still make a nice explosion sound (unless the effectQuiet var is true) playsound(src, "explosion", landingSound ? 15 : 80, 1) @@ -150,10 +150,10 @@ playsound(get_turf(holder), leavingSound, soundVolume, 0, 0) if (reversing) //If we're reversing, we call the close proc. This sends the pod back up to centcom close(holder) - else if (bluespace) //If we're a bluespace pod, then delete ourselves (along with our holder, if a seperate holder exists) - if (style != STYLE_INVISIBLE) + else if (bluespace) //If we're a bluespace pod, then delete ourselves (along with our holder, if a seperate holder exists) + if (style != STYLE_INVISIBLE) do_sparks(5, TRUE, holder) //Create some sparks right before closing - qdel(src) //Delete ourselves and the holder + qdel(src) //Delete ourselves and the holder if (holder != src) qdel(holder) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 0cd96eaebc..e95a836a0d 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -32,7 +32,7 @@ . = ..() siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75) -/obj/item/clothing/gloves/cut +/obj/item/clothing/gloves/cut desc = "These gloves would protect the wearer from electric shock.. if the fingers were covered." name = "fingerless insulated gloves" icon_state = "yellowcut" @@ -218,32 +218,3 @@ /obj/item/clothing/gloves/color/white/redcoat item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way. - -/obj/item/clothing/gloves/color/random - name = "random gloves" - desc = "These gloves are supposed to be a random color..." - icon_state = "random_gloves" - item_state = "wgloves" - item_color = "mime" - -/obj/item/clothing/gloves/color/random/Initialize() - ..() - var/list/gloves = list( - /obj/item/clothing/gloves/color/orange = 1, - /obj/item/clothing/gloves/color/red = 1, - /obj/item/clothing/gloves/color/blue = 1, - /obj/item/clothing/gloves/color/purple = 1, - /obj/item/clothing/gloves/color/green = 1, - /obj/item/clothing/gloves/color/grey = 1, - /obj/item/clothing/gloves/color/light_brown = 1, - /obj/item/clothing/gloves/color/brown = 1, - /obj/item/clothing/gloves/color/white = 1, - /obj/item/clothing/gloves/color/rainbow = 1) - - var/obj/item/clothing/gloves/color/selected = pick(gloves) - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - H.equip_to_slot_or_del(new selected(H), SLOT_GLOVES) - else - new selected(loc) - return INITIALIZE_HINT_QDEL diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 07817ec4e4..429401a626 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -47,6 +47,7 @@ name = "captain's beret" desc = "A beret fit for a leader." icon_state = "capberet" + dynamic_hair_suffix = "" dog_fashion = null @@ -62,6 +63,7 @@ name = "head of personnel's beret" desc = "The symbol of true bureaucratic micromanagement, although in a fancy form." icon_state = "hopberet" + dynamic_hair_suffix = "" dog_fashion = null @@ -184,33 +186,41 @@ mode = DRILL_CANADIAN return TRUE -/obj/item/clothing/head/warden/drill/speechModification(M) - if(copytext(M, 1, 2) != "*") - if(mode == DRILL_DEFAULT) - M = " [M]" - return trim(M) - if(mode == DRILL_SHOUTING) - M = " [M]!" - return trim(M) - if(mode == DRILL_YELLING) - M = " [M]!!" - return trim(M) - if(mode == DRILL_CANADIAN) - M = " [M]" - var/list/canadian_words = strings("canadian_replacement.json", "canadian") +/obj/item/clothing/head/warden/drill/equipped(mob/M, slot) + . = ..() + if (slot == SLOT_HEAD) + RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + else + UnregisterSignal(M, COMSIG_MOB_SAY) - for(var/key in canadian_words) - var/value = canadian_words[key] - if(islist(value)) - value = pick(value) +/obj/item/clothing/head/warden/drill/dropped(mob/M) + . = ..() + UnregisterSignal(M, COMSIG_MOB_SAY) - M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]") - M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]") - M = replacetextEx(M, " [key]", " [value]") +/obj/item/clothing/head/warden/drill/proc/handle_speech(datum/source, mob/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") + switch (mode) + if(DRILL_SHOUTING) + message += "!" + if(DRILL_YELLING) + message += "!!" + if(DRILL_CANADIAN) + message = " [message]" + var/list/canadian_words = strings("canadian_replacement.json", "canadian") - if(prob(30)) - M += pick(", eh?", ", EH?") - return trim(M) + for(var/key in canadian_words) + var/value = canadian_words[key] + if(islist(value)) + value = pick(value) + + message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") + message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") + message = replacetextEx(message, " [key]", " [value]") + + if(prob(30)) + message += pick(", eh?", ", EH?") + speech_args[SPEECH_MESSAGE] = message /obj/item/clothing/head/beret/sec name = "security beret" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index d9c151a47b..277ce2a8ad 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -330,9 +330,21 @@ icon_state = "beretblack" dynamic_hair_suffix = "" -/obj/item/clothing/head/frenchberet/speechModification(M) - if(copytext(M, 1, 2) != "*") - M = " [M]" +/obj/item/clothing/head/frenchberet/equipped(mob/M, slot) + . = ..() + if (slot == SLOT_HEAD) + RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + else + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/clothing/head/frenchberet/dropped(mob/M) + . = ..() + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/clothing/head/frenchberet/proc/handle_speech(datum/source, mob/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") + message = " [message]" var/list/french_words = strings("french_replacement.json", "french") for(var/key in french_words) @@ -340,10 +352,10 @@ if(islist(value)) value = pick(value) - M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]") - M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]") - M = replacetextEx(M, " [key]", " [value]") + message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") + message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") + message = replacetextEx(message, " [key]", " [value]") if(prob(3)) - M += pick(" Honh honh honh!"," Honh!"," Zut Alors!") - return trim(M) + message += pick(" Honh honh honh!"," Honh!"," Zut Alors!") + speech_args[SPEECH_MESSAGE] = trim(message) diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 8f10184f86..9ee2ebcd54 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -5,12 +5,54 @@ slot_flags = ITEM_SLOT_MASK strip_delay = 40 equip_delay_other = 40 + var/modifies_speech = FALSE var/mask_adjusted = 0 var/adjusted_flags = null var/muzzle_var = NORMAL_STYLE mutantrace_variation = NO_MUTANTRACE_VARIATION //most masks have overrides, but not all probably. +/obj/item/clothing/mask/attack_self(mob/user) + if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) + TOGGLE_BITFIELD(clothing_flags, VOICEBOX_DISABLED) + var/status = !CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED) + to_chat(user, "You turn the voice box in [src] [status ? "on" : "off"].") + +/obj/item/clothing/mask/equipped(mob/M, slot) + . = ..() + if (slot == SLOT_WEAR_MASK && modifies_speech) + RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + else + UnregisterSignal(M, COMSIG_MOB_SAY) + if(!ishuman(M)) + return + var/mob/living/carbon/human/H = M + var/datum/species/pref_species = H.dna.species + + if(mutantrace_variation) + if("mam_snouts" in pref_species.default_features) + if(H.dna.features["mam_snouts"] != "None") + muzzle_var = ALT_STYLE + else + muzzle_var = NORMAL_STYLE + + else if("snout" in pref_species.default_features) + if(H.dna.features["snout"] != "None") + muzzle_var = ALT_STYLE + else + muzzle_var = NORMAL_STYLE + + else + muzzle_var = NORMAL_STYLE + + H.update_inv_wear_mask() + +/obj/item/clothing/mask/dropped(mob/M) + . = ..() + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/clothing/mask/proc/handle_speech() + /obj/item/clothing/mask/worn_overlays(isinhands = FALSE) . = list() if(!isinhands) @@ -20,31 +62,6 @@ IF_HAS_BLOOD_DNA(src) . += mutable_appearance('icons/effects/blood.dmi', "maskblood") -/obj/item/clothing/mask/equipped(mob/user, slot) - ..() - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/datum/species/pref_species = H.dna.species - - if(mutantrace_variation) - if("mam_snouts" in pref_species.default_features) - if(H.dna.features["mam_snouts"] != "None") - muzzle_var = ALT_STYLE - else - muzzle_var = NORMAL_STYLE - - else if("snout" in pref_species.default_features) - if(H.dna.features["snout"] != "None") - muzzle_var = ALT_STYLE - else - muzzle_var = NORMAL_STYLE - - else - muzzle_var = NORMAL_STYLE - - H.update_inv_wear_mask() - - /obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE) ..() if(ismob(loc)) diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index c0752d9799..3960bdadeb 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -20,9 +20,11 @@ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR w_class = WEIGHT_CLASS_SMALL mutantrace_variation = MUTANTRACE_VARIATION + modifies_speech = TRUE -/obj/item/clothing/mask/luchador/speechModification(message) - if(copytext(message, 1, 2) != "*") +/obj/item/clothing/mask/luchador/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") message = replacetext(message, "captain", "CAPITÁN") message = replacetext(message, "station", "ESTACIÓN") message = replacetext(message, "sir", "SEÑOR") @@ -42,7 +44,7 @@ message = uppertext(message) //Things end up looking better this way (no mixed cases), and it fits the macho wrestler image. if(prob(25)) message += " OLE!" - return message + speech_args[SPEECH_MESSAGE] = message /obj/item/clothing/mask/luchador/tecnicos name = "Tecnicos Mask" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 9476c50603..1716992e45 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -46,10 +46,12 @@ /obj/item/clothing/mask/fakemoustache/italian name = "italian moustache" desc = "Made from authentic Italian moustache hairs. Gives the wearer an irresistable urge to gesticulate wildly." + modifies_speech = TRUE -/obj/item/clothing/mask/fakemoustache/italian/speechModification(M) - if(copytext(M, 1, 2) != "*") - M = " [M]" +/obj/item/clothing/mask/fakemoustache/italian/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") + message = " [message]" var/list/italian_words = strings("italian_replacement.json", "italian") for(var/key in italian_words) @@ -57,13 +59,13 @@ if(islist(value)) value = pick(value) - M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]") - M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]") - M = replacetextEx(M, " [key]", " [value]") + message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") + message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") + message = replacetextEx(message, " [key]", " [value]") if(prob(3)) - M += pick(" Ravioli, ravioli, give me the formuoli!"," Mamma-mia!"," Mamma-mia! That's a spicy meat-ball!", " La la la la la funiculi funicula!") - return trim(M) + message += pick(" Ravioli, ravioli, give me the formuoli!"," Mamma-mia!"," Mamma-mia! That's a spicy meat-ball!", " La la la la la funiculi funicula!") + speech_args[SPEECH_MESSAGE] = trim(message) /obj/item/clothing/mask/joy name = "joy mask" @@ -77,32 +79,20 @@ icon_state = "pig" item_state = "pig" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + clothing_flags = VOICEBOX_TOGGLABLE w_class = WEIGHT_CLASS_SMALL - actions_types = list(/datum/action/item_action/toggle_voice_box) - var/voicechange = 0 + modifies_speech = TRUE -/obj/item/clothing/mask/pig/attack_self(mob/user) - voicechange = !voicechange - to_chat(user, "You turn the voice box [voicechange ? "on" : "off"]!") +/obj/item/clothing/mask/pig/handle_speech(datum/source, list/speech_args) + if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) + speech_args[SPEECH_MESSAGE] = pick("Oink!","Squeeeeeeee!","Oink Oink!") -/obj/item/clothing/mask/pig/speechModification(message) - if(voicechange) - message = pick("Oink!","Squeeeeeeee!","Oink Oink!") - return message - -/obj/item/clothing/mask/spig //needs to be different otherwise you could turn the speedmodification off and on +/obj/item/clothing/mask/pig/cursed //needs to be different otherwise you could turn the speedmodification off and on name = "Pig face" desc = "It looks like a mask, but closer inspection reveals it's melded onto this persons face!" //It's only ever going to be attached to your face. - icon_state = "pig" - item_state = "pig" - flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - w_class = WEIGHT_CLASS_SMALL - var/voicechange = 1 - -/obj/item/clothing/mask/spig/speechModification(message) - if(voicechange) - message = pick("Oink!","Squeeeeeeee!","Oink Oink!") - return message + flags_inv = HIDEFACIALHAIR + clothing_flags = NONE + item_flags = NODROP ///frog mask - reeee!! /obj/item/clothing/mask/frog @@ -112,47 +102,47 @@ item_state = "frog" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR w_class = WEIGHT_CLASS_SMALL - var/voicechange = TRUE + clothing_flags = VOICEBOX_TOGGLABLE + modifies_speech = TRUE -/obj/item/clothing/mask/frog/attack_self(mob/user) - voicechange = !voicechange - to_chat(user, "You turn the voice box [voicechange ? "on" : "off"]!") - -/obj/item/clothing/mask/frog/speechModification(message) //whenever you speak - if(voicechange) +/obj/item/clothing/mask/frog/handle_speech(datum/source, list/speech_args) //whenever you speak + if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) if(prob(5)) //sometimes, the angry spirit finds others words to speak. - message = pick("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!") + speech_args[SPEECH_MESSAGE] = pick("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!") else - message = pick("Ree!!", "Reee!!","REEE!!","REEEEE!!") //but its usually just angry gibberish, - return message + speech_args[SPEECH_MESSAGE] = pick("Ree!!", "Reee!!","REEE!!","REEEEE!!") //but its usually just angry gibberish, /obj/item/clothing/mask/frog/cursed + clothing_flags = NONE item_flags = NODROP //reee!! -/obj/item/clothing/mask/frog/cursed/attack_self(mob/user) - return //no voicebox to alter. - /obj/item/clothing/mask/frog/cursed/equipped(mob/user, slot) var/mob/living/carbon/C = user if(C.wear_mask == src) to_chat(user, "[src] was cursed! Ree!!") return ..() - /obj/item/clothing/mask/cowmask - name = "Cowface" - desc = "It looks like a mask, but closer inspection reveals it's melded onto this persons face!" + name = "Cow mask" + desc = "A rubber cow mask," icon = 'icons/mob/mask.dmi' icon_state = "cowmask" item_state = "cowmask" + clothing_flags = VOICEBOX_TOGGLABLE flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR w_class = WEIGHT_CLASS_SMALL - var/voicechange = 1 + modifies_speech = TRUE -/obj/item/clothing/mask/cowmask/speechModification(message) - if(voicechange) - message = pick("Moooooooo!","Moo!","Moooo!") - return message +/obj/item/clothing/mask/cowmask/handle_speech(datum/source, list/speech_args) + if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) + speech_args[SPEECH_MESSAGE] = pick("Moooooooo!","Moo!","Moooo!") + +/obj/item/clothing/mask/cowmask/cursed + name = "cow face" + desc = "It looks like a cow mask, but closer inspection reveals it's melded onto this persons face!" + flags_inv = HIDEFACIALHAIR + clothing_flags = NONE + item_flags = NODROP /obj/item/clothing/mask/horsehead name = "horse head mask" @@ -161,12 +151,18 @@ item_state = "horsehead" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEYES|HIDEEARS w_class = WEIGHT_CLASS_SMALL - var/voicechange = 1 + clothing_flags = VOICEBOX_TOGGLABLE -/obj/item/clothing/mask/horsehead/speechModification(message) - if(voicechange) - message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") - return message +/obj/item/clothing/mask/horsehead/handle_speech(datum/source, list/speech_args) + if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) + speech_args[SPEECH_MESSAGE] = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") + +/obj/item/clothing/mask/horsehead/cursed + name = "horse face" + desc = "It initially looks like a mask, but it's melded into the poor person's face." + clothing_flags = NONE + flags_inv = HIDEFACIALHAIR + item_flags = NODROP /obj/item/clothing/mask/rat name = "rat mask" @@ -285,16 +281,18 @@ item_state = "gondola" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR w_class = WEIGHT_CLASS_SMALL + modifies_speech = TRUE -/obj/item/clothing/mask/gondola/speechModification(M) - if(copytext(M, 1, 2) != "*") - M = " [M]" +/obj/item/clothing/mask/gondola/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") + message = " [message]" var/list/spurdo_words = strings("spurdo_replacement.json", "spurdo") for(var/key in spurdo_words) var/value = spurdo_words[key] if(islist(value)) value = pick(value) - M = replacetextEx(M,regex(uppertext(key),"g"), "[uppertext(value)]") - M = replacetextEx(M,regex(capitalize(key),"g"), "[capitalize(value)]") - M = replacetextEx(M,regex(key,"g"), "[value]") - return trim(M) + message = replacetextEx(message,regex(uppertext(key),"g"), "[uppertext(value)]") + message = replacetextEx(message,regex(capitalize(key),"g"), "[capitalize(value)]") + message = replacetextEx(message,regex(key,"g"), "[value]") + speech_args[SPEECH_MESSAGE] = trim(message) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index a6bcf23a2d..d314a4c48e 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -9,7 +9,7 @@ /obj/item/clothing/shoes/combat //basic syndicate combat boots for nuke ops and mob corpses name = "combat boots" desc = "High speed, low drag combat boots." - icon_state = "jackboots" + icon_state = "combat" item_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index d9654b395d..e041d566e9 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -100,6 +100,9 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 /obj/effect/immovablerod/ex_act(severity, target) return 0 +/obj/structure/closet/supplypod/prevent_content_explosion() + return TRUE + /obj/effect/immovablerod/singularity_act() return diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index 1407a98518..901337cd52 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -17,6 +17,8 @@ continue if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured continue + if(!(MOB_ORGANIC in H.mob_biotypes)) //biotype sleeper bugs strike again, once again making appendicitis pick a target that can't take it + continue var/foundAlready = FALSE //don't infect someone that already has appendicitis for(var/datum/disease/appendicitis/A in H.diseases) foundAlready = TRUE diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 5cd5d2c5c6..88f72d27c3 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -689,7 +689,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( chosen = capitalize(pick(speak_messages)) chosen = replacetext(chosen, "%TARGETNAME%", target_name) var/image/speech_overlay = image('icons/mob/talk.dmi', person, "default0", layer = ABOVE_MOB_LAYER) - var/message = target.compose_message(person,understood_language,chosen,null,person.get_spans(),face_name = TRUE) + var/message = target.compose_message(person,understood_language,chosen,null,list(person.speech_span),face_name = TRUE) feedback_details += "Type: Talk, Source: [person.real_name], Message: [message]" to_chat(target, message) if(target.client) @@ -705,7 +705,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) humans += H person = pick(humans) - var/message = target.compose_message(person,understood_language,chosen,"[FREQ_COMMON]",person.get_spans(),face_name = TRUE) + var/message = target.compose_message(person,understood_language,chosen,"[FREQ_COMMON]",list(person.speech_span),face_name = TRUE) feedback_details += "Type: Radio, Source: [person.real_name], Message: [message]" to_chat(target, message) qdel(src) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index a2a1c6d03f..f85668d2b8 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -202,6 +202,19 @@ desc = "A flask of holy water...it's been sitting in the Necropolis a while though." list_reagents = list("hell_water" = 100) +/obj/item/reagent_containers/food/drinks/holyoil + name = "flask of zelus oil" + desc = "A brass flask of Zelus oil, a viscous fluid with a scenting of brass - this flask may be sipped or thrown." + icon_state = "zelusflask" + list_reagents = list("holyoil" = 30) //Powerfull + volume = 30 + foodtype = NONE + force = 12 //Same as a toolbox + throwforce = 18 + +/obj/item/reagent_containers/food/drinks/holyoil/null + list_reagents = list("holyoil" = 0) + /obj/item/reagent_containers/food/drinks/bottle/vermouth name = "Goldeneye vermouth" desc = "Sweet, sweet dryness~" diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 51433da841..132e000893 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -1,6 +1,10 @@ //////////////////////////////////////////////////////////////////////////////// /// Food. //////////////////////////////////////////////////////////////////////////////// +/// Note: When adding food items with dummy parents, make sure to add +/// the parent to the exclusion list in code/__HELPERS/unsorted.dm's +/// get_random_food proc. +//////////////////////////////////////////////////////////////////////////////// /obj/item/reagent_containers/food possible_transfer_amounts = list() volume = 50 //Sets the default container amount for all food items. diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 085cf61769..31e99535d1 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -24,7 +24,8 @@ "blackpepper" = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"), "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"), - "mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks.")) + "mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."), + "peanut_butter" = list("peanutbutter", "peanut butter jar", "A deliciously and sticky spread made from peanuts.")) var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. /obj/item/reagent_containers/food/condiment/suicide_act(mob/living/carbon/user) diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 9d63d48f34..0b12ee4fcf 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -53,7 +53,7 @@ H.adjust_blurriness(1) H.visible_message("[H] is creamed by [src]!", "You've been creamed by [src]!") playsound(H, "desceration", 50, TRUE) - reagents.trans_to(H,15) //Transfers the cream pies total volume of reagents to target on it + reagents.trans_to(H,15) //Cream pie combat if(!H.creamed) // one layer at a time H.add_overlay(creamoverlay) H.creamed = TRUE @@ -61,6 +61,7 @@ qdel(src) /obj/item/reagent_containers/food/snacks/pie/cream/nostun + list_reagents = list("laughter" = 15) stunning = FALSE /obj/item/reagent_containers/food/snacks/pie/cream/body diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm index 1b602b6759..17a710ada2 100644 --- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm +++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm @@ -52,6 +52,33 @@ list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "vitamin" = 2) foodtype = GRAIN | FRUIT +/obj/item/reagent_containers/food/snacks/jellysandwich/pbj + name = "\improper PB & J sandwich" + desc = "A grand creation of peanut butter, jelly and bread! An all-american classic." + icon_state = "pbjsandwich" + tastes = list("bread" = 1, "jelly" = 1, "peanuts" = 1) + +/obj/item/reagent_containers/food/snacks/jellysandwich/pbj/cherry + bonus_reagents = list("cherryjelly" = 5, "peanut_butter" = 5, "vitamin" = 2) + list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "peanut_butter" = 5, "vitamin" = 2) + foodtype = GRAIN | FRUIT + +/obj/item/reagent_containers/food/snacks/jellysandwich/pbj/slime + bonus_reagents = list("slimejelly" = 5, "peanut_butter" = 5, "vitamin" = 2) + list_reagents = list("nutriment" = 2, "slimejelly" = 5, "peanut_butter" = 5, "vitamin" = 2) + foodtype = GRAIN | TOXIC + +/obj/item/reagent_containers/food/snacks/peanutbutter_sandwich + name = "peanut butter sandwich" + desc = "You wish you had some jelly to go with this..." + icon = 'icons/obj/food/burgerbread.dmi' + icon_state = "peanutbuttersandwich" + trash = /obj/item/trash/plate + bitesize = 3 + bonus_reagents = list("peanut_butter" = 5, "vitamin" = 2) + list_reagents = list("nutriment" = 2, "peanut_butter" = 5, "vitamin" = 2) + foodtype = GRAIN + /obj/item/reagent_containers/food/snacks/notasandwich name = "not-a-sandwich" desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache." @@ -83,6 +110,19 @@ list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 2) foodtype = GRAIN | TOXIC | SUGAR +/obj/item/reagent_containers/food/snacks/peanut_buttertoast + name = "peanut butter toast" + desc = "A slice of toast covered with delicious peanut butter." + icon = 'icons/obj/food/burgerbread.dmi' + icon_state = "peanutbuttertoast" + trash = /obj/item/trash/plate + bitesize = 3 + bonus_reagents = list("peanut_butter" = 5, "vitamin" = 2) + list_reagents = list("nutriment" = 1, "peanut_butter" = 5, "vitamin" = 2) + tastes = list("toast" = 1, "peanuts" = 1) + foodtype = GRAIN + + /obj/item/reagent_containers/food/snacks/twobread name = "two bread" desc = "This seems awfully bitter." diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 3f917273b4..35ce25bbaf 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -138,6 +138,10 @@ for (var/mob/M in src) M.forceMove(drop_location()) +/obj/machinery/processor/container_resist(mob/living/user) + user.forceMove(drop_location()) + user.visible_message("[user] crawls free of the processor!") + /obj/machinery/processor/slime name = "slime processor" desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating." diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 0c4e2c2e30..a6240e5b48 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -116,7 +116,7 @@ result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime subcategory = CAT_MISCFOOD -/datum/crafting_recipe/food/jelliedyoast +/datum/crafting_recipe/food/jelliedtoast name = "Jellied toast" reqs = list( /datum/reagent/consumable/cherryjelly = 5, @@ -125,6 +125,15 @@ result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry subcategory = CAT_MISCFOOD +/datum/crafting_recipe/food/peanutbuttertoast + name = "Peanut butter toast" + reqs = list( + /datum/reagent/consumable/peanut_butter = 5, + /obj/item/reagent_containers/food/snacks/breadslice/plain = 1 + ) + result = /obj/item/reagent_containers/food/snacks/peanut_buttertoast + subcategory = CAT_MISCFOOD + /datum/crafting_recipe/food/twobread name = "Two bread" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm index 133713ac75..127b2cc238 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm @@ -43,6 +43,48 @@ result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry subcategory = CAT_SANDWICH +/datum/crafting_recipe/food/pbj_slimesandwich + name = "PB&J sandwich" + reqs = list( + /datum/reagent/toxin/slimejelly = 5, + /datum/reagent/consumable/peanut_butter = 5, + /obj/item/reagent_containers/food/snacks/breadslice/plain = 2, + ) + result = /obj/item/reagent_containers/food/snacks/jellysandwich/pbj/slime + subcategory = CAT_SANDWICH + +/datum/crafting_recipe/food/pbj_slimesandwich/alt + reqs = list( + /obj/item/reagent_containers/food/snacks/jelliedtoast/slime = 1, + /obj/item/reagent_containers/food/snacks/peanut_buttertoast = 1, + ) + +/datum/crafting_recipe/food/pbj_sandwich + name = "PB&J sandwich" + reqs = list( + /datum/reagent/consumable/cherryjelly = 5, + /datum/reagent/consumable/peanut_butter = 5, + /obj/item/reagent_containers/food/snacks/breadslice/plain = 2, + ) + result = /obj/item/reagent_containers/food/snacks/jellysandwich/pbj/cherry + subcategory = CAT_SANDWICH + +/datum/crafting_recipe/food/pbj_sandwich/alt + reqs = list( + /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry = 1, + /obj/item/reagent_containers/food/snacks/peanut_buttertoast = 1, + ) + +/datum/crafting_recipe/peanutbutter_sandwich + name = "Peanut butter sandwich" + reqs = list( + /datum/reagent/consumable/peanut_butter = 5, + /obj/item/reagent_containers/food/snacks/breadslice/plain = 2, + ) + result = /obj/item/reagent_containers/food/snacks/peanutbutter_sandwich + subcategory = CAT_SANDWICH + + /datum/crafting_recipe/food/notasandwich name = "Not a sandwich" reqs = list( diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 33884f8ef0..cf11b77879 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -303,6 +303,7 @@ h1.alert, h2.alert {color: #000000;} .userdanger {color: #ff0000; font-weight: bold; font-size: 24px;} .danger {color: #ff0000;} .warning {color: #ff0000; font-style: italic;} +.alertwarning {color: #FF0000; font-weight: bold} .boldwarning {color: #ff0000; font-style: italic; font-weight: bold} .announce {color: #228b22; font-weight: bold;} .boldannounce {color: #ff0000; font-weight: bold;} @@ -316,6 +317,8 @@ h1.alert, h2.alert {color: #000000;} .unconscious {color: #0000ff; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} .green {color: #03ff39;} +.red {color: #FF0000} +.blue {color: #215cff} .nicegreen {color: #14a833;} .userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;} .love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;} diff --git a/code/modules/hydroponics/grown/peanuts.dm b/code/modules/hydroponics/grown/peanuts.dm new file mode 100644 index 0000000000..2423300cc4 --- /dev/null +++ b/code/modules/hydroponics/grown/peanuts.dm @@ -0,0 +1,30 @@ +/obj/item/seeds/peanutseed + name = "pack of peanut seeds" + desc = "These seeds grow to produce fruits botanically classified as legumes, but mundanely referred as nuts." + icon_state = "seed-peanut" + species = "peanut" + plantname = "Peanut Vines" + product = /obj/item/reagent_containers/food/snacks/grown/peanut + yield = 6 + growthstages = 4 + growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + reagents_add = list("vitamin" = 0.02, "nutriment" = 0.15, "cooking_oil" = 0.03) + +/obj/item/reagent_containers/food/snacks/grown/peanut + seed = /obj/item/seeds/peanutseed + name = "peanut" + desc = "Peanuts for the peanut gallery!" //get me a better description, boys. + icon_state = "peanut" + filling_color = "#C4AE7A" + bitesize = 100 + foodtype = VEGETABLES + dried_type = /obj/item/reagent_containers/food/snacks/roasted_peanuts + cooked_type = /obj/item/reagent_containers/food/snacks/roasted_peanuts + +/obj/item/reagent_containers/food/snacks/roasted_peanuts + name = "roasted peanuts" + desc = "A handful of roasted peanuts, with or without salt." + icon_state = "roasted_peanuts" + foodtype = VEGETABLES + list_reagents = list("nutriment" = 6, "vitamin" = 1) + juice_results = list("peanut_butter" = 3) \ No newline at end of file diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 86efc4c74a..3975da18b6 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -112,7 +112,7 @@ var/brightness = get_pin_data(IC_INPUT, 2) if(new_color && isnum(brightness)) - brightness = CLAMP(brightness, 0, 4) + brightness = CLAMP(brightness, 0, 10) light_rgb = new_color light_brightness = brightness @@ -411,4 +411,4 @@ if(assembly) assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT) else - investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT) \ No newline at end of file + investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT) diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 5193545c4b..4a628c5f34 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -112,7 +112,7 @@ GLOBAL_LIST(labor_sheet_values) else if(!(obj_flags & EMAGGED)) Radio.set_frequency(FREQ_SECURITY) - Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY, get_spans(), get_default_language()) + Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY) to_chat(usr, "Shuttle received message and will be sent shortly.") /obj/machinery/mineral/labor_claim_console/proc/check_auth() @@ -149,7 +149,7 @@ GLOBAL_LIST(labor_sheet_values) var/obj/item/stack/sheet/inp = I points += inp.point_value * inp.amount return ..() - + /**********************Point Lookup Console**************************/ /obj/machinery/mineral/labor_points_checker name = "points checking console" diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 315ffff7c7..4ccac5f9d7 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -164,7 +164,7 @@ return var/obj/effect/mob_spawn/MS = pick(GLOB.mob_spawners[href_list["JoinAsGhostRole"]]) - if(MS?.attack_ghost(src, latejoinercalling = TRUE)) + if(MS.attack_ghost(src, latejoinercalling = TRUE)) SSticker.queued_players -= src SSticker.queue_delay = 4 qdel(src) @@ -444,6 +444,8 @@ if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE) available_job_count++ for(var/spawner in GLOB.mob_spawners) + if(!LAZYLEN(spawner)) + continue var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner]) if(!istype(S) || !S.can_latejoin()) continue @@ -468,10 +470,12 @@ "Security" = list(jobs = list(), titles = GLOB.security_positions, color = "#ff9999"), ) for(var/spawner in GLOB.mob_spawners) + if(!LAZYLEN(spawner)) + continue var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner]) if(!istype(S) || !S.can_latejoin()) continue - categorizedJobs["Ghost Role"]["jobs"] += S + categorizedJobs["Ghost Role"]["jobs"] += spawner for(var/datum/job/job in SSjob.occupations) if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 76b416772e..97b29ca4e1 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -5,6 +5,7 @@ var/datum/dna/stored/stored_dna // dna var for brain. Used to store dna, brain dna is not considered like actual dna, brain.has_dna() returns FALSE. stat = DEAD //we start dead by default see_invisible = SEE_INVISIBLE_LIVING + speech_span = SPAN_ROBOT /mob/living/brain/Initialize() . = ..() diff --git a/code/modules/mob/living/brain/say.dm b/code/modules/mob/living/brain/say.dm index ce0a09c27f..b7d7e1d7fc 100644 --- a/code/modules/mob/living/brain/say.dm +++ b/code/modules/mob/living/brain/say.dm @@ -10,14 +10,11 @@ ..() -/mob/living/brain/get_spans() - return ..() | SPAN_ROBOT - /mob/living/brain/radio(message, message_mode, list/spans, language) if(message_mode == MODE_HEADSET && istype(container, /obj/item/mmi)) var/obj/item/mmi/R = container if(R.radio) - R.radio.talk_into(src, message, , get_spans(), language) + R.radio.talk_into(src, message, language = language) return ITALICS | REDUCE_RANGE else return ..() diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index b921aea67e..5f1e1a2830 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -4,7 +4,7 @@ if(!message) return - var/message_a = say_quote(message, get_spans()) + var/message_a = say_quote(message) var/rendered = "Hivemind, [shown_name] [message_a]" for(var/mob/S in GLOB.player_list) if(!S.stat && S.hivecheck()) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 673249b186..56be62c75e 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -10,29 +10,6 @@ else . = ..() -/mob/living/carbon/human/treat_message(message) - message = dna.species.handle_speech(message,src) - if(diseases.len) - for(var/datum/disease/pierrot_throat/D in diseases) - var/list/temp_message = splittext(message, " ") //List each word in the message - var/list/pick_list = list() - for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line - pick_list += i - for(var/i=1, ((i <= D.stage) && (i <= temp_message.len)), i++) //Loop for each stage of the disease or until we run out of words - if(prob(3 * D.stage)) //Stage 1: 3% Stage 2: 6% Stage 3: 9% Stage 4: 12% - var/H = pick(pick_list) - if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) - continue - temp_message[H] = "HONK" - pick_list -= H //Make sure that you dont HONK the same word twice - message = jointext(temp_message, " ") - message = ..(message) - message = dna.mutations_say_mods(message) - return message - -/mob/living/carbon/human/get_spans() - return ..() | dna.mutations_get_spans() | dna.species_get_spans() - /mob/living/carbon/human/GetVoice() if(istype(wear_mask, /obj/item/clothing/mask/chameleon)) var/obj/item/clothing/mask/chameleon/V = wear_mask diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 3324b07217..fabffaab60 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1158,13 +1158,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) return 1 return FALSE -/datum/species/proc/handle_speech(message, mob/living/carbon/human/H) - return message - -//return a list of spans or an empty list -/datum/species/proc/get_spans() - return list() - /datum/species/proc/check_weakness(obj/item, mob/living/attacker) return FALSE diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index da7de39a03..4a7580e978 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -68,17 +68,17 @@ /obj/item/organ/tongue/dullahan zone = "abstract" + modifies_speech = TRUE -/obj/item/organ/tongue/dullahan/TongueSpeech(var/message) +/obj/item/organ/tongue/dullahan/handle_speech(datum/source, list/speech_args) if(ishuman(owner)) var/mob/living/carbon/human/H = owner if(H.dna.species.id == "dullahan") var/datum/species/dullahan/D = H.dna.species if(isobj(D.myhead.loc)) var/obj/O = D.myhead.loc - O.say(message) - message = "" - return message + O.say(speech_args[SPEECH_MESSAGE]) + speech_args[SPEECH_MESSAGE] = "" /obj/item/organ/ears/dullahan zone = "abstract" diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 2907caff13..2c663b4094 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -519,6 +519,11 @@ ..() last_banana = world.time last_honk = world.time + RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) + +/datum/species/golem/bananium/on_species_loss(mob/living/carbon/C) + . = ..() + UnregisterSignal(C, COMSIG_MOB_SAY) /datum/species/golem/bananium/random_name(gender,unique,lastname) var/clown_name = pick(GLOB.clown_names) @@ -567,9 +572,8 @@ /datum/species/golem/bananium/spec_death(gibbed, mob/living/carbon/human/H) playsound(get_turf(H), 'sound/misc/sadtrombone.ogg', 70, 0) -/datum/species/golem/bananium/get_spans() - return list(SPAN_CLOWN) - +/datum/species/golem/bananium/proc/handle_speech(datum/source, list/speech_args) + speech_args[SPEECH_SPANS] |= SPAN_CLOWN /datum/species/golem/runic name = "Runic Golem" @@ -646,14 +650,16 @@ /datum/species/golem/clockwork/on_species_gain(mob/living/carbon/human/H) . = ..() H.faction |= "ratvar" + RegisterSignal(H, COMSIG_MOB_SAY, .proc/handle_speech) /datum/species/golem/clockwork/on_species_loss(mob/living/carbon/human/H) if(!is_servant_of_ratvar(H)) H.faction -= "ratvar" + UnregisterSignal(H, COMSIG_MOB_SAY) . = ..() -/datum/species/golem/clockwork/get_spans() - return SPAN_ROBOT //beep +/datum/species/golem/clockwork/proc/handle_speech(datum/source, list/speech_args) + speech_args[SPEECH_SPANS] |= SPAN_ROBOT //beep /datum/species/golem/clockwork/spec_death(gibbed, mob/living/carbon/human/H) gibbed = !has_corpse ? FALSE : gibbed @@ -951,7 +957,7 @@ sexes = FALSE fixed_mut_color = "ffffff" attack_verb = "rattl" - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS) inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH,TRAIT_CALCIUM_HEALER) info_text = "As a Bone Golem, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice." var/datum/action/innate/bonechill/bonechill diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index b218b2cefc..2b487d4349 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -5,6 +5,7 @@ default_color = "00FF90" say_mod = "chirps" species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) + mutantlungs = /obj/item/organ/lungs/slime mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur") //CIT CHANGE default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None") //CIT CHANGE inherent_traits = list(TRAIT_TOXINLOVER) diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index 7e838c857f..0ebd6e795b 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -28,6 +28,11 @@ /datum/species/synth/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) ..() assume_disguise(old_species, H) + RegisterSignal(H, COMSIG_MOB_SAY, .proc/handle_speech) + +/datum/species/synth/on_species_loss(mob/living/carbon/human/H) + . = ..() + UnregisterSignal(H, COMSIG_MOB_SAY) /datum/species/synth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.id == "synthflesh") @@ -110,18 +115,12 @@ else return ..() - -/datum/species/synth/get_spans() - if(fake_species) - return fake_species.get_spans() - return list() - - -/datum/species/synth/handle_speech(message, mob/living/carbon/human/H) - if(H.health > disguise_fail_health) - if(fake_species) - return fake_species.handle_speech(message,H) - else - return ..() - else - return ..() \ No newline at end of file +/datum/species/synth/proc/handle_speech(datum/source, list/speech_args) + if (isliving(source)) // yeah it's gonna be living but just to be clean + var/mob/living/L = source + if(fake_species && L.health > disguise_fail_health) + switch (fake_species.type) + if (/datum/species/golem/bananium) + speech_args[SPEECH_SPANS] |= SPAN_CLOWN + if (/datum/species/golem/clockwork) + speech_args[SPEECH_SPANS] |= SPAN_ROBOT \ No newline at end of file diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b2eb83d668..9dd55c361e 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -250,38 +250,39 @@ //MIASMA if(breath_gases[/datum/gas/miasma]) var/miasma_partialpressure = (breath_gases[/datum/gas/miasma]/breath.total_moles())*breath_pressure + if(miasma_partialpressure > MINIMUM_MOLES_DELTA_TO_MOVE) - if(prob(1 * miasma_partialpressure)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) - miasma_disease.name = "Unknown" - ForceContractDisease(miasma_disease, TRUE, TRUE) + if(prob(0.05 * miasma_partialpressure)) + var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) + miasma_disease.name = "Unknown" + ForceContractDisease(miasma_disease, TRUE, TRUE) - //Miasma side effects - switch(miasma_partialpressure) - if(1 to 5) - // At lower pp, give out a little warning - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell") - if(prob(5)) - to_chat(src, "There is an unpleasant smell in the air.") - if(5 to 20) - //At somewhat higher pp, warning becomes more obvious - if(prob(15)) - to_chat(src, "You smell something horribly decayed inside this room.") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell) - if(15 to 30) - //Small chance to vomit. By now, people have internals on anyway - if(prob(5)) - to_chat(src, "The stench of rotting carcasses is unbearable!") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) - vomit() - if(30 to INFINITY) - //Higher chance to vomit. Let the horror start - if(prob(25)) - to_chat(src, "The stench of rotting carcasses is unbearable!") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) - vomit() - else - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell") + //Miasma side effects + switch(miasma_partialpressure) + if(1 to 5) + // At lower pp, give out a little warning + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell") + if(prob(5)) + to_chat(src, "There is an unpleasant smell in the air.") + if(5 to 20) + //At somewhat higher pp, warning becomes more obvious + if(prob(15)) + to_chat(src, "You smell something horribly decayed inside this room.") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell) + if(15 to 30) + //Small chance to vomit. By now, people have internals on anyway + if(prob(5)) + to_chat(src, "The stench of rotting carcasses is unbearable!") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) + vomit() + if(30 to INFINITY) + //Higher chance to vomit. Let the horror start + if(prob(25)) + to_chat(src, "The stench of rotting carcasses is unbearable!") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) + vomit() + else + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell") //Clear all moods if no miasma at all @@ -344,7 +345,7 @@ var/list/cached_gases = miasma_turf.air.gases - cached_gases[/datum/gas/miasma] += 0.02 + cached_gases[/datum/gas/miasma] += 0.1 /mob/living/carbon/proc/handle_blood() return diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index f6e43f487f..47c9b6beb8 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -1,37 +1,17 @@ -/mob/living/carbon/treat_message(message) - for(var/datum/brain_trauma/trauma in get_traumas()) - message = trauma.on_say(message) - message = ..(message) - var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) - if(!T) //hoooooouaah! - var/regex/tongueless_lower = new("\[gdntke]+", "g") - var/regex/tongueless_upper = new("\[GDNTKE]+", "g") - if(copytext(message, 1, 2) != "*") - message = tongueless_lower.Replace(message, pick("aa","oo","'")) - message = tongueless_upper.Replace(message, pick("AA","OO","'")) - else - message = T.TongueSpeech(message) - if(wear_mask) - message = wear_mask.speechModification(message) - if(head) - message = head.speechModification(message) - return message +/mob/living/carbon/proc/handle_tongueless_speech(mob/living/carbon/speaker, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + var/static/regex/tongueless_lower = new("\[gdntke]+", "g") + var/static/regex/tongueless_upper = new("\[GDNTKE]+", "g") + if(message[1] != "*") + message = tongueless_lower.Replace(message, pick("aa","oo","'")) + message = tongueless_upper.Replace(message, pick("AA","OO","'")) + speech_args[SPEECH_MESSAGE] = message /mob/living/carbon/can_speak_vocal(message) if(silent) return 0 return ..() -/mob/living/carbon/get_spans() - . = ..() - var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) - if(T) - . |= T.get_spans() - - var/obj/item/I = get_active_held_item() - if(I) - . |= I.get_held_item_speechspans(src) - /mob/living/carbon/could_speak_in_language(datum/language/dt) var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(T) @@ -39,10 +19,21 @@ else . = initial(dt.flags) & TONGUELESS_SPEECH -/mob/living/carbon/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/living/carbon/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) . = ..() if(!client) return for(var/T in get_traumas()) var/datum/brain_trauma/trauma = T - message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) \ No newline at end of file + message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) + + if (src.mind.has_antag_datum(/datum/antagonist/traitor)) + for (var/codeword in GLOB.syndicate_code_phrase) + var/regex/codeword_match = new("([codeword])", "ig") + message = codeword_match.Replace(message, "$1") + + for (var/codeword in GLOB.syndicate_code_response) + var/regex/codeword_match = new("([codeword])", "ig") + message = codeword_match.Replace(message, "$1") + + return message diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index e2f62b054c..155ff15d5b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -175,13 +175,16 @@ GLOBAL_LIST_INIT(department_radio_keys, list( else src.log_talk(message, LOG_SAY, forced_by=forced) - message = treat_message(message) + message = treat_message(message) // unfortunately we still need this + var/sigreturn = SEND_SIGNAL(src, COMSIG_MOB_SAY, args) + if (sigreturn & COMPONENT_UPPERCASE_SPEECH) + message = uppertext(message) if(!message) return last_words = message - spans |= get_spans() + spans |= speech_span if(language) var/datum/language/L = GLOB.language_datum_instances[language] @@ -229,9 +232,14 @@ GLOBAL_LIST_INIT(department_radio_keys, list( // Recompose message for AI hrefs, language incomprehension. message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = hear_intercept(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + show_message(message, 2, deaf_message, deaf_type) return message +/mob/living/proc/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) + return message + /mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode) var/static/list/eavesdropping_modes = list(MODE_WHISPER = TRUE, MODE_WHISPER_CRIT = TRUE) var/eavesdrop_range = 0 @@ -327,6 +335,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list( return null /mob/living/proc/treat_message(message) + + if(HAS_TRAIT(src, TRAIT_UNINTELLIGIBLE_SPEECH)) + message = unintelligize(message) + if(derpspeech) message = derpspeech(message, stuttering) @@ -389,8 +401,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list( else . = ..() -/mob/living/whisper(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null) - say("#[message]", bubble_type, spans, sanitize, language) +/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) + say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced) /mob/living/get_language_holder(shadow=TRUE) if(mind && shadow) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 928bd63dd1..4ac5c1f0bb 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -49,7 +49,7 @@ else padloc = "(UNKNOWN)" src.log_talk(message, LOG_SAY, tag="HOLOPAD in [padloc]") - send_speech(message, 7, T, "robot", get_spans(), language) + send_speech(message, 7, T, "robot", language = language) to_chat(src, "Holopad transmitted, [real_name] \"[message]\"") else to_chat(src, "No holopad connected.") diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 99484f395e..164a3e7389 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -29,6 +29,13 @@ if(!L.temporarilyRemoveItemFromInventory(card)) to_chat(src, "Error: Unable to expand to mobile form. Chassis is restrained by some device or person.") return FALSE + if(istype(card.loc, /obj/item/integrated_circuit/input/pAI_connector)) + var/obj/item/integrated_circuit/input/pAI_connector/C = card.loc + C.RemovepAI() + C.visible_message("[src] ejects itself from [C]!") + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) + C.installed_pai = null + C.push_data() forceMove(get_turf(card)) card.forceMove(src) if(client) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e71e269222..29fbd39e2c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -580,6 +580,19 @@ else return ..() +/mob/living/silicon/robot/crowbar_act(mob/living/user, obj/item/I) //TODO: make fucking everything up there in that attackby() proc use the proper tool_act() procs. But honestly, who has time for that? 'cause I know for sure that you, the person reading this, sure as hell doesn't. + var/validbreakout = FALSE + for(var/obj/item/dogborg/sleeper/S in held_items) + if(!LAZYLEN(S.contents)) + continue + if(!validbreakout) + visible_message("[user] wedges [I] into the crevice separating [S] from [src]'s chassis, and begins to pry...", "You wedge [I] into the crevice separating [S] from [src]'s chassis, and begin to pry...") + validbreakout = TRUE + S.go_out() + if(validbreakout) + return TRUE + return ..() + /mob/living/silicon/robot/verb/unlock_own_cover() set category = "Robot Commands" set name = "Unlock Cover" diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index aca35762de..1d38a3c5a6 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -1,14 +1,10 @@ - -/mob/living/silicon/get_spans() - return ..() | SPAN_ROBOT - /mob/living/proc/robot_talk(message) log_talk(message, LOG_SAY) var/desig = "Default Cyborg" //ezmode for taters if(issilicon(src)) var/mob/living/silicon/S = src desig = trim_left(S.designation + " " + S.job) - var/message_a = say_quote(message, get_spans()) + var/message_a = say_quote(message) var/rendered = "Robotic Talk, [name] [message_a]" for(var/mob/M in GLOB.player_list) if(M.binarycheck()) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index d0e3fc8b1c..13520774c5 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -12,6 +12,7 @@ possible_a_intents = list(INTENT_HELP, INTENT_HARM) mob_biotypes = list(MOB_ROBOTIC) rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE + speech_span = SPAN_ROBOT var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/last_lawchange_announce = 0 @@ -69,6 +70,9 @@ /mob/living/silicon/contents_explosion(severity, target) return +/mob/living/silicon/prevent_content_explosion() + return TRUE + /mob/living/silicon/proc/cancelAlarm() return diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index e9978d1e62..ce99e301c5 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -23,6 +23,7 @@ verb_yell = "alarms" initial_language_holder = /datum/language_holder/synthetic bubble_icon = "machine" + speech_span = SPAN_ROBOT faction = list("neutral", "silicon" , "turret") @@ -348,13 +349,10 @@ if((!on) || (!message)) return if(channel && Radio.channels[channel])// Use radio if we have channel key - Radio.talk_into(src, message, channel, get_spans(), get_default_language()) + Radio.talk_into(src, message, channel) else say(message) -/mob/living/simple_animal/bot/get_spans() - return ..() | SPAN_ROBOT - /mob/living/simple_animal/bot/radio(message, message_mode, list/spans, language) . = ..() if(. != 0) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 3a5d02315b..c194233c42 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -28,13 +28,29 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1) childtype = list(/mob/living/simple_animal/pet/dog/corgi/puppy = 95, /mob/living/simple_animal/pet/dog/corgi/puppy/void = 5) animal_species = /mob/living/simple_animal/pet/dog - var/shaved = 0 - var/obj/item/inventory_head - var/obj/item/inventory_back - var/nofur = 0 //Corgis that have risen past the material plane of existence. gold_core_spawnable = FRIENDLY_SPAWN can_be_held = TRUE collar_type = "corgi" + var/obj/item/inventory_head + var/obj/item/inventory_back + var/shaved = FALSE + var/nofur = FALSE //Corgis that have risen past the material plane of existence. + +/mob/living/simple_animal/pet/dog/corgi/Destroy() + QDEL_NULL(inventory_head) + QDEL_NULL(inventory_back) + return ..() + +/mob/living/simple_animal/pet/dog/corgi/handle_atom_del(atom/A) + if(A == inventory_head) + inventory_head = null + update_corgi_fluff() + regenerate_icons() + if(A == inventory_back) + inventory_back = null + update_corgi_fluff() + regenerate_icons() + return ..() /mob/living/simple_animal/pet/dog/pug name = "\improper pug" @@ -80,23 +96,17 @@ regenerate_icons() /mob/living/simple_animal/pet/dog/corgi/show_inv(mob/user) - user.set_machine(src) - if(user.stat) + if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return + user.set_machine(src) var/dat = "
    Inventory of [name]

    " - if(inventory_head) - dat += "
    Head: [inventory_head] (Remove)" - else - dat += "
    Head: Nothing" - if(inventory_back) - dat += "
    Back: [inventory_back] (Remove)" - else - dat += "
    Back: Nothing" + dat += "
    Head: [inventory_head]" : "add_inv=head'>Nothing"]" + dat += "
    Back: [inventory_back]" : "add_inv=back'>Nothing"]" + dat += "
    Collar: [pcollar]" : "add_inv=collar'>Nothing"]" - user << browse(dat, text("window=mob[];size=325x500", real_name)) - onclose(user, "mob[real_name]") - return + user << browse(dat, "window=mob[REF(src)];size=325x500") + onclose(user, "mob[REF(src)]") /mob/living/simple_animal/pet/dog/corgi/getarmor(def_zone, type) var/armorval = 0 @@ -128,7 +138,7 @@ if(do_after(user, 50, target = src)) user.visible_message("[user] shaves [src]'s hair using \the [O].") playsound(loc, 'sound/items/welder2.ogg', 20, 1) - shaved = 1 + shaved = TRUE icon_living = "[initial(icon_living)]_shaved" icon_dead = "[initial(icon_living)]_shaved_dead" if(stat == CONSCIOUS) @@ -147,18 +157,18 @@ L.visible_message("[L] scoops up [src]!") /mob/living/simple_animal/pet/dog/corgi/Topic(href, href_list) - if(usr.stat) + if(!(iscarbon(usr) || iscyborg(usr)) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + usr << browse(null, "window=mob[REF(src)]") + usr.unset_machine() return //Removing from inventory if(href_list["remove_inv"]) - if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr))) - return var/remove_from = href_list["remove_inv"] switch(remove_from) if(BODY_ZONE_HEAD) if(inventory_head) - inventory_head.forceMove(drop_location()) + usr.put_in_hands(inventory_head) inventory_head = null update_corgi_fluff() regenerate_icons() @@ -167,24 +177,32 @@ return if("back") if(inventory_back) - inventory_back.forceMove(drop_location()) + usr.put_in_hands(inventory_back) inventory_back = null update_corgi_fluff() regenerate_icons() else to_chat(usr, "There is nothing to remove from its [remove_from].") return + if("collar") + if(pcollar) + usr.put_in_hands(pcollar) + pcollar = null + update_corgi_fluff() + regenerate_icons() show_inv(usr) //Adding things to inventory else if(href_list["add_inv"]) - if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr))) - return var/add_to = href_list["add_inv"] switch(add_to) + if("collar") + add_collar(usr.get_active_held_item(), usr) + update_corgi_fluff() + if(BODY_ZONE_HEAD) place_on_head(usr.get_active_held_item(),usr) @@ -229,7 +247,7 @@ show_inv(usr) else - ..() + return ..() //Corgis are supposed to be simpler, so only a select few objects can actually be put //to be compatible with them. The objects are below. @@ -560,7 +578,7 @@ icon_state = "void_puppy" icon_living = "void_puppy" icon_dead = "void_puppy_dead" - nofur = 1 + nofur = TRUE unsuitable_atmos_damage = 0 minbodytemp = TCMB maxbodytemp = T0C + 40 diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index cf3742fcc5..e6bf7b3f20 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -37,6 +37,7 @@ gender = NEUTER mob_biotypes = list(MOB_ROBOTIC) speak_emote = list("chirps") + speech_span = SPAN_ROBOT bubble_icon = "machine" initial_language_holder = /datum/language_holder/drone mob_size = MOB_SIZE_SMALL diff --git a/code/modules/mob/living/simple_animal/friendly/drone/say.dm b/code/modules/mob/living/simple_animal/friendly/drone/say.dm index 16bf370f02..7a5967948f 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/say.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/say.dm @@ -1,13 +1,3 @@ -///////////// -//DRONE SAY// -///////////// -//Drone speach - -/mob/living/simple_animal/drone/get_spans() - return ..() | SPAN_ROBOT - - - //Base proc for anything to call /proc/_alert_drones(msg, dead_can_hear = 0, atom/source, mob/living/faction_checked_mob, exact_faction_match) if (dead_can_hear && source) @@ -31,7 +21,7 @@ /mob/living/simple_animal/drone/proc/drone_chat(msg) - alert_drones("Drone Chat: [name] [say_quote(msg, get_spans())]", TRUE) + alert_drones("Drone Chat: [name] [say_quote(msg)]", TRUE) /mob/living/simple_animal/drone/binarycheck() return TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index 8df0ee83fe..c24dc6857a 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -2,21 +2,30 @@ icon = 'icons/mob/pets.dmi' mob_size = MOB_SIZE_SMALL mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) - var/obj/item/clothing/neck/petcollar/pcollar - var/collar_type - var/unique_pet = FALSE blood_volume = BLOOD_VOLUME_NORMAL + var/unique_pet = FALSE // if the mob can be renamed + var/obj/item/clothing/neck/petcollar/pcollar + var/collar_type //if the mob has collar sprites, define them. + +/mob/living/simple_animal/pet/handle_atom_del(atom/A) + if(A == pcollar) + pcollar = null + return ..() + +/mob/living/simple_animal/pet/proc/add_collar(obj/item/clothing/neck/petcollar/P, mob/user) + if(QDELETED(P) || pcollar) + return + if(!user.transferItemToLoc(P, src)) + return + pcollar = P + regenerate_icons() + to_chat(user, "You put the [P] around [src]'s neck.") + if(P.tagname && !unique_pet) + fully_replace_character_name(null, "\proper [P.tagname]") /mob/living/simple_animal/pet/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/clothing/neck/petcollar) && !pcollar && collar_type) - var/obj/item/clothing/neck/petcollar/P = O - pcollar = P.type - regenerate_icons() - to_chat(user, "You put the [P] around [src]'s neck.") - if(P.tagname && !unique_pet) - real_name = "\proper [P.tagname]" - name = real_name - qdel(P) + add_collar(O, user) return if(istype(O, /obj/item/newspaper)) @@ -35,12 +44,16 @@ pcollar = new(src) regenerate_icons() +/mob/living/simple_animal/pet/Destroy() + QDEL_NULL(pcollar) + return ..() + /mob/living/simple_animal/pet/revive(full_heal = 0, admin_revive = 0) - if(..()) + . = ..() + if(.) if(collar_type) collar_type = "[initial(collar_type)]" regenerate_icons() - . = TRUE /mob/living/simple_animal/pet/death(gibbed) ..(gibbed) @@ -50,7 +63,8 @@ /mob/living/simple_animal/pet/gib() if(pcollar) - new pcollar(drop_location()) + pcollar.forceMove(drop_location()) + pcollar = null ..() /mob/living/simple_animal/pet/regenerate_icons() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index a07e46a289..301b270e36 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -41,6 +41,9 @@ QDEL_NULL(internal) . = ..() +/mob/living/simple_animal/hostile/megafauna/prevent_content_explosion() + return TRUE + /mob/living/simple_animal/hostile/megafauna/death(gibbed) if(health > 0) return diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 4fdf431fa0..fc53483eda 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -181,94 +181,85 @@ */ /mob/living/simple_animal/parrot/show_inv(mob/user) user.set_machine(src) - var/dat = "

    Inventory of [name]

    " - if(ears) - dat += "
    Headset: [ears] (Remove)" - else - dat += "
    Headset: Nothing" - user << browse(dat, "window=mob[real_name];size=325x500") - onclose(user, "mob[real_name]") + var/dat = "

    Inventory of [name]

    " + dat += "
    Headset: [ears]" : "add_inv=ears'>Nothing"]" + + user << browse(dat, "window=mob[REF(src)];size=325x500") + onclose(user, "window=mob[REF(src)]") /mob/living/simple_animal/parrot/Topic(href, href_list) - - //Can the usr physically do this? - if(usr.incapacitated() || !usr.Adjacent(loc)) + if(!(iscarbon(usr) || iscyborg(usr)) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + usr << browse(null, "window=mob[REF(src)]") + usr.unset_machine() return - //Is the usr's mob type able to do this? (lolaliens) - if(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr)) + //Removing from inventory + if(href_list["remove_inv"]) + var/remove_from = href_list["remove_inv"] + switch(remove_from) + if("ears") + if(!ears) + to_chat(usr, "There is nothing to remove from its [remove_from]!") + return + if(!stat) + say("[available_channels.len ? "[pick(available_channels)] " : null]BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") + ears.forceMove(drop_location()) + ears = null + for(var/possible_phrase in speak) + if(copytext(possible_phrase,1,3) in GLOB.department_radio_keys) + possible_phrase = copytext(possible_phrase,3) - //Removing from inventory - if(href_list["remove_inv"]) - var/remove_from = href_list["remove_inv"] - switch(remove_from) - if("ears") - if(ears) - if(!stat) - if(available_channels.len) - src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") - else - src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") - ears.forceMove(src.loc) - ears = null - for(var/possible_phrase in speak) - if(copytext(possible_phrase,1,3) in GLOB.department_radio_keys) - possible_phrase = copytext(possible_phrase,3) - else - to_chat(usr, "There is nothing to remove from its [remove_from]!") + //Adding things to inventory + else if(href_list["add_inv"]) + var/add_to = href_list["add_inv"] + if(!usr.get_active_held_item()) + to_chat(usr, "You have nothing in your hand to put on its [add_to]!") + return + switch(add_to) + if("ears") + if(ears) + to_chat(usr, "It's already wearing something!") + return + else + var/obj/item/item_to_add = usr.get_active_held_item() + if(!item_to_add) return - //Adding things to inventory - else if(href_list["add_inv"]) - var/add_to = href_list["add_inv"] - if(!usr.get_active_held_item()) - to_chat(usr, "You have nothing in your hand to put on its [add_to]!") - return - switch(add_to) - if("ears") - if(ears) - to_chat(usr, "It's already wearing something!") + if( !istype(item_to_add, /obj/item/radio/headset) ) + to_chat(usr, "This object won't fit!") return - else - var/obj/item/item_to_add = usr.get_active_held_item() - if(!item_to_add) - return - if( !istype(item_to_add, /obj/item/radio/headset) ) - to_chat(usr, "This object won't fit!") - return + var/obj/item/radio/headset/headset_to_add = item_to_add - var/obj/item/radio/headset/headset_to_add = item_to_add + if(!usr.transferItemToLoc(headset_to_add, src)) + return + ears = headset_to_add + to_chat(usr, "You fit the headset onto [src].") - if(!usr.transferItemToLoc(headset_to_add, src)) - return - src.ears = headset_to_add - to_chat(usr, "You fit the headset onto [src].") + clearlist(available_channels) + for(var/ch in headset_to_add.channels) + switch(ch) + if("Engineering") + available_channels.Add(":e") + if("Command") + available_channels.Add(":c") + if("Security") + available_channels.Add(":s") + if("Science") + available_channels.Add(":n") + if("Medical") + available_channels.Add(":m") + if("Supply") + available_channels.Add(":u") + if("Service") + available_channels.Add(":v") - clearlist(available_channels) - for(var/ch in headset_to_add.channels) - switch(ch) - if("Engineering") - available_channels.Add(":e") - if("Command") - available_channels.Add(":c") - if("Security") - available_channels.Add(":s") - if("Science") - available_channels.Add(":n") - if("Medical") - available_channels.Add(":m") - if("Supply") - available_channels.Add(":u") - if("Service") - available_channels.Add(":v") - - if(headset_to_add.translate_binary) - available_channels.Add(":b") - else - ..() + if(headset_to_add.translate_binary) + available_channels.Add(":b") + else + return ..() /* diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index ebb34fe77a..07985215d8 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -61,7 +61,7 @@ break if(Target in view(1,src)) - if(issilicon(Target)) + if(!CanFeedon(Target)) //If they're not able to be fed upon, ignore them. if(!Atkcool) Atkcool = 1 spawn(45) @@ -600,7 +600,8 @@ phrases += "[M]... friend..." if (nutrition < get_hunger_nutrition()) phrases += "[M]... feed me..." - say (pick(phrases)) + if(!stat) + say (pick(phrases)) /mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it if (is_adult) diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 96e84a1754..a3e2f48b75 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -48,34 +48,58 @@ var/mob/living/simple_animal/slime/S = owner S.Feed() -/mob/living/simple_animal/slime/proc/CanFeedon(mob/living/M) +/mob/living/simple_animal/slime/proc/CanFeedon(mob/living/M, silent = FALSE) if(!Adjacent(M)) - return 0 + return FALSE if(buckled) Feedstop() - return 0 + return FALSE + + if(issilicon(M)) + return FALSE + + if(isanimal(M)) + var/mob/living/simple_animal/S = M + if(S.damage_coeff[TOX] <= 0 && S.damage_coeff[CLONE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us. + if(silent) + return FALSE + to_chat(src, "[pick("This subject is incompatible", \ + "This subject does not have life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nourished", "This subject is not food")]!") + return FALSE if(isslime(M)) + if(silent) + return FALSE to_chat(src, "I can't latch onto another slime...") - return 0 + return FALSE if(docile) + if(silent) + return FALSE to_chat(src, "I'm not hungry anymore...") - return 0 + return FALSE if(stat) + if(silent) + return FALSE to_chat(src, "I must be conscious to do this...") - return 0 + return FALSE if(M.stat == DEAD) + if(silent) + return FALSE to_chat(src, "This subject does not have a strong enough life energy...") - return 0 + return FALSE if(locate(/mob/living/simple_animal/slime) in M.buckled_mobs) + if(silent) + return FALSE to_chat(src, "Another slime is already feeding on this subject...") - return 0 - return 1 + return FALSE + return TRUE /mob/living/simple_animal/slime/proc/Feedon(mob/living/M) M.unbuckle_all_mobs(force=1) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in CanFeedon()) diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 251739c935..930656228d 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -91,14 +91,15 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( if(!totalMembers.len) return - for(var/X in totalMembers) - var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type. - if(!A.pipe_vision_img) - A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir) - A.pipe_vision_img.plane = ABOVE_HUD_PLANE - pipes_shown += A.pipe_vision_img - if(client) - client.images += A.pipe_vision_img + if(client) + for(var/X in totalMembers) + var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type. + if(in_view_range(client.mob, A)) + if(!A.pipe_vision_img) + A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir) + A.pipe_vision_img.plane = ABOVE_HUD_PLANE + client.images += A.pipe_vision_img + pipes_shown += A.pipe_vision_img movement_type |= VENTCRAWLING diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 9e127d4746..ecb869790c 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -69,16 +69,11 @@ if(name != real_name) alt_name = " (died as [real_name])" - var/K - - if(key) - K = src.key - - var/spanned = src.say_quote(message, get_spans()) + var/spanned = say_quote(message) message = emoji_parse(message) var/rendered = "DEAD: [name][alt_name] [emoji_parse(spanned)]" log_talk(message, LOG_SAY, tag="DEAD") - deadchat_broadcast(rendered, follow_target = src, speaker_key = K) + deadchat_broadcast(rendered, follow_target = src, speaker_key = key) /mob/proc/check_emote(message) if(copytext(message, 1, 2) == "*") diff --git a/code/modules/mob/say_readme.dm b/code/modules/mob/say_readme.dm index 00e0f66246..0e76d9b6ed 100644 --- a/code/modules/mob/say_readme.dm +++ b/code/modules/mob/say_readme.dm @@ -78,10 +78,6 @@ global procs say_quote(input, spans, message_mode) Adds a verb and quotes to a message. Also attaches span classes to a message. Verbs are determined by verb_say/verb_ask/verb_yell variables. Called on the speaker. - get_spans(input, spans) - Returns the list of spans that are always applied to messages of this atom. - Always return ..() | + youroutput when overriding this proc! - /mob say_dead(message) Sends a message to all dead people. Does not use Hear(). diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm index 2200af7cab..e97e39643a 100644 --- a/code/modules/ninja/suit/mask.dm +++ b/code/modules/ninja/suit/mask.dm @@ -17,16 +17,19 @@ Contents: item_state = "s-ninja_mask" strip_delay = 120 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + modifies_speech = TRUE -/obj/item/clothing/mask/gas/space_ninja/speechModification(message) - if(copytext(message, 1, 2) != "*") +/obj/item/clothing/mask/gas/space_ninja/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") var/list/temp_message = text2list(message, " ") var/list/pick_list = list() - for(var/i = 1, i <= temp_message.len, i++) + for(var/i in 1 to temp_message.len) pick_list += i - for(var/i=1, i <= abs(temp_message.len/3), i++) + for(var/i in 1 to abs(temp_message.len/3)) var/H = pick(pick_list) - if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue + if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) + continue temp_message[H] = ninjaspeak(temp_message[H]) pick_list -= H message = list2text(temp_message, " ") @@ -56,5 +59,4 @@ Contents: message = replacetext(message, "than", "sen") message = replacetext(message, ".", "") message = lowertext(message) - - return message + speech_args[SPEECH_MESSAGE] = message diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm index c98a0440e3..334136cc33 100644 --- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm +++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm @@ -18,8 +18,8 @@ It is possible to destroy the net by the occupant or someone else. can_buckle = 1 buckle_lying = 0 buckle_prevents_pull = TRUE - var/mob/living/carbon/affecting//Who it is currently affecting, if anyone. - var/mob/living/carbon/master//Who shot web. Will let this person know if the net was successful or failed. + var/mob/living/carbon/affecting //Who it is currently affecting, if anyone. + var/mob/living/carbon/master //Who shot web. Will let this person know if the net was successful or failed. var/check = 15//30 seconds before teleportation. Could be extended I guess. var/success = FALSE diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm index 41f7b8af83..61355ca89b 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm @@ -7,28 +7,26 @@ //If there's only one valid target, let's actually try to capture it, rather than forcing //the user to fiddle with the dialog displaying a list of one //Also, let's make this smarter and not list mobs you can't currently net. - var/Candidates[] - for(var/mob/mob in oview(H)) - if(!mob.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame. - //to_chat(H, "[C.p_they(TRUE)] will bring no honor to your Clan!") + var/list/candidates + for(var/mob/M in oview(H)) + if(!M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame. continue - if(locate(/obj/structure/energy_net) in get_turf(mob))//Check if they are already being affected by an energy net. - //to_chat(H, "[C.p_they(TRUE)] are already trapped inside an energy net!") - continue - for(var/turf/T in getline(get_turf(H), get_turf(mob))) - if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy. - //to_chat(H, "You may not use an energy net through solid obstacles!") + for(var/obj/structure/energy_net/E in get_turf(M))//Check if they are already being affected by an energy net. + if(E.affecting == M) continue - Candidates+=mob + LAZYADD(candidates, M) - if(Candidates.len == 1) - C = Candidates[1] + if(!LAZYLEN(candidates)) + return FALSE + + if(candidates.len == 1) + C = candidates[1] else - C = input("Select who to capture:","Capture who?",null) as null|mob in Candidates + C = input("Select who to capture:","Capture who?",null) as null|mob in candidates if(QDELETED(C)||!(C in oview(H))) - return 0 + return FALSE if(!ninjacost(200,N_STEALTH_CANCEL)) H.Beam(C,"n_beam",time=15) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 6125ac9b82..a5900aa196 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -25,7 +25,6 @@ pressure_resistance = 2 grind_results = list("iron" = 2, "iodine" = 1) var/colour = "black" //what colour the ink is! - var/traitor_unlock_degrees = 0 var/degrees = 0 var/font = PEN_FONT diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index d87f9821ef..026c39c6cf 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -184,9 +184,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) to_chat(H, "You get headaches just from looking at it.") return -/obj/machinery/power/supermatter_crystal/get_spans() - return list(SPAN_ROBOT) - #define CRITICAL_TEMPERATURE 10000 /obj/machinery/power/supermatter_crystal/proc/get_status() @@ -244,10 +241,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) add_overlay(causality_field, TRUE) var/speaking = "[emergency_alert] The supermatter has reached critical integrity failure. Emergency causality destabilization field has been activated." - radio.talk_into(src, speaking, common_channel, get_spans(), get_default_language()) + radio.talk_into(src, speaking, common_channel, language = get_default_language()) for(var/i in SUPERMATTER_COUNTDOWN_TIME to 0 step -10) if(damage < explosion_point) // Cutting it a bit close there engineers - radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel, get_spans(), get_default_language()) + radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel) cut_overlay(causality_field, TRUE) final_countdown = FALSE return @@ -258,7 +255,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) speaking = "[DisplayTimeText(i, TRUE)] remain before causality stabilization." else speaking = "[i*0.1]..." - radio.talk_into(src, speaking, common_channel, get_spans(), get_default_language()) + radio.talk_into(src, speaking, common_channel) sleep(10) explode() @@ -459,27 +456,27 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) alarm() if(damage > emergency_point) - radio.talk_into(src, "[emergency_alert] Integrity: [get_integrity()]%", common_channel, get_spans(), get_default_language()) + radio.talk_into(src, "[emergency_alert] Integrity: [get_integrity()]%", common_channel) lastwarning = REALTIMEOFDAY if(!has_reached_emergency) investigate_log("has reached the emergency point for the first time.", INVESTIGATE_SUPERMATTER) message_admins("[src] has reached the emergency point [ADMIN_JMP(src)].") has_reached_emergency = TRUE else if(damage >= damage_archived) // The damage is still going up - radio.talk_into(src, "[warning_alert] Integrity: [get_integrity()]%", engineering_channel, get_spans(), get_default_language()) + radio.talk_into(src, "[warning_alert] Integrity: [get_integrity()]%", engineering_channel) lastwarning = REALTIMEOFDAY - (WARNING_DELAY * 5) else // Phew, we're safe - radio.talk_into(src, "[safe_alert] Integrity: [get_integrity()]%", engineering_channel, get_spans(), get_default_language()) + radio.talk_into(src, "[safe_alert] Integrity: [get_integrity()]%", engineering_channel) lastwarning = REALTIMEOFDAY if(power > POWER_PENALTY_THRESHOLD) - radio.talk_into(src, "Warning: Hyperstructure has reached dangerous power level.", engineering_channel, get_spans(), get_default_language()) + radio.talk_into(src, "Warning: Hyperstructure has reached dangerous power level.", engineering_channel) if(powerloss_inhibitor < 0.5) - radio.talk_into(src, "DANGER: CHARGE INERTIA CHAIN REACTION IN PROGRESS.", engineering_channel, get_spans(), get_default_language()) + radio.talk_into(src, "DANGER: CHARGE INERTIA CHAIN REACTION IN PROGRESS.", engineering_channel) if(combined_gas > MOLE_PENALTY_THRESHOLD) - radio.talk_into(src, "Warning: Critical coolant mass reached.", engineering_channel, get_spans(), get_default_language()) + radio.talk_into(src, "Warning: Critical coolant mass reached.", engineering_channel) if(damage > explosion_point) countdown() @@ -653,6 +650,13 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) else L.show_message("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.", 2) +//Do not blow up our internal radio +/obj/machinery/power/supermatter_crystal/contents_explosion(severity, target) + return + +/obj/machinery/power/supermatter_crystal/prevent_content_explosion() + return TRUE + /obj/machinery/power/supermatter_crystal/engine is_main_engine = TRUE diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm index 154d269cd9..a6b65f79e3 100644 --- a/code/modules/projectiles/ammunition/caseless/_caseless.dm +++ b/code/modules/projectiles/ammunition/caseless/_caseless.dm @@ -6,9 +6,10 @@ /obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread) if (..()) //successfully firing moveToNullspace() - return 1 + QDEL_NULL(src) + return TRUE else - return 0 + return FALSE /obj/item/ammo_casing/caseless/update_icon() ..() diff --git a/code/modules/projectiles/ammunition/caseless/rocket.dm b/code/modules/projectiles/ammunition/caseless/rocket.dm index 0b74f6ff8c..bc693d96bc 100644 --- a/code/modules/projectiles/ammunition/caseless/rocket.dm +++ b/code/modules/projectiles/ammunition/caseless/rocket.dm @@ -1,7 +1,15 @@ -/obj/item/ammo_casing/caseless/a84mm - desc = "An 84mm anti-armour rocket." +/obj/item/ammo_casing/caseless/rocket + name = "\improper PM-9HE" + desc = "An 84mm High Explosive rocket. Fire at people and pray." caliber = "84mm" - icon_state = "s-casing-live" + icon_state = "srm-8" + projectile_type = /obj/item/projectile/bullet/a84mm_he + +/obj/item/ammo_casing/caseless/rocket/hedp + name = "\improper PM-9HEDP" + desc = "An 84mm High Explosive Dual Purpose rocket. Pointy end toward mechs." + caliber = "84mm" + icon_state = "84mm-hedp" projectile_type = /obj/item/projectile/bullet/a84mm /obj/item/ammo_casing/caseless/a75 diff --git a/code/modules/projectiles/boxes_magazines/internal/grenade.dm b/code/modules/projectiles/boxes_magazines/internal/grenade.dm index 12325a0299..79a005ee8a 100644 --- a/code/modules/projectiles/boxes_magazines/internal/grenade.dm +++ b/code/modules/projectiles/boxes_magazines/internal/grenade.dm @@ -11,7 +11,7 @@ max_ammo = 1 /obj/item/ammo_box/magazine/internal/rocketlauncher - name = "grenade launcher internal magazine" - ammo_type = /obj/item/ammo_casing/caseless/a84mm + name = "rocket launcher internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/rocket caliber = "84mm" max_ammo = 1 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 542e4ecffa..fb3ed19f82 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -32,9 +32,10 @@ var/fire_delay = 0 //rate of fire for burst firing and semi auto var/firing_burst = 0 //Prevent the weapon from firing again while already firing var/semicd = 0 //cooldown handler - var/weapon_weight = WEAPON_LIGHT + var/weapon_weight = WEAPON_LIGHT //currently only used for inaccuracy var/spread = 0 //Spread induced by the gun itself. var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. + var/inaccuracy_modifier = 1 lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' @@ -170,7 +171,7 @@ return if(weapon_weight == WEAPON_HEAVY && user.get_inactive_held_item()) - to_chat(user, "You need both hands free to fire [src]!") + to_chat(user, "You need both hands free to fire \the [src]!") return //DUAL (or more!) WIELDING @@ -422,7 +423,7 @@ if(alight) alight.Remove(user) -/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params) +/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer) if(!ishuman(user) || !ishuman(target)) return @@ -438,7 +439,7 @@ semicd = TRUE - if(!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH) + if(!bypass_timer && (!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) if(user) if(user == target) user.visible_message("[user] decided not to shoot.") @@ -538,3 +539,13 @@ if(A == chambered) chambered = null update_icon() + +/obj/item/gun/proc/getinaccuracy(mob/living/user) + if(!iscarbon(user)) + return FALSE + else + var/mob/living/carbon/holdingdude = user + if(istype(holdingdude) && holdingdude.combatmode) + return (max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0) * inaccuracy_modifier) + else + return ((weapon_weight * 25) * inaccuracy_modifier) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 157cf1f03f..1117bc1000 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -7,6 +7,7 @@ var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info var/obj/item/ammo_box/magazine/magazine var/casing_ejector = TRUE //whether the gun ejects the chambered casing + var/magazine_wording = "magazine" /obj/item/gun/ballistic/Initialize() . = ..() @@ -57,7 +58,7 @@ if (!magazine && istype(AM, mag_type)) if(user.transferItemToLoc(AM, src)) magazine = AM - to_chat(user, "You load a new magazine into \the [src].") + to_chat(user, "You load a new [magazine_wording] into \the [src].") if(magazine.ammo_count()) playsound(src, "gun_insert_full_magazine", 70, 1) if(!chambered) @@ -72,7 +73,7 @@ to_chat(user, "You cannot seem to get \the [src] out of your hands!") return else if (magazine) - to_chat(user, "There's already a magazine in \the [src].") + to_chat(user, "There's already a [magazine_wording] in \the [src].") if(istype(A, /obj/item/suppressor)) var/obj/item/suppressor/S = A if(!can_suppress) @@ -222,7 +223,7 @@ /obj/item/suppressor name = "suppressor" - desc = "A universal syndicate small-arms suppressor for maximum espionage." + desc = "A syndicate small-arms suppressor for maximum espionage." icon = 'icons/obj/guns/projectile.dmi' icon_state = "suppressor" w_class = WEIGHT_CLASS_TINY @@ -231,6 +232,4 @@ /obj/item/suppressor/specialoffer name = "cheap suppressor" - desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits all weapons." - icon = 'icons/obj/guns/projectile.dmi' - icon_state = "suppressor" + desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits some weapons." diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index aacdd46059..f6356dce99 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -74,25 +74,92 @@ update_icon() chamber_round() -/obj/item/gun/ballistic/automatic/atlauncher - desc = "A pre-loaded, single shot anti-armour launcher." - name = "anti-armour grenade launcher" +/obj/item/gun/ballistic/rocketlauncher + name = "\improper PML-9" + desc = "A reusable rocket propelled grenade launcher. The words \"NT this way\" and an arrow have been written near the barrel." icon_state = "rocketlauncher" item_state = "rocketlauncher" mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher fire_sound = 'sound/weapons/rocketlaunch.ogg' w_class = WEIGHT_CLASS_BULKY can_suppress = FALSE + pin = /obj/item/firing_pin/implant/pindicate burst_size = 1 fire_delay = 0 - select = 0 - actions_types = list() + inaccuracy_modifier = 0.7 casing_ejector = FALSE weapon_weight = WEAPON_HEAVY + magazine_wording = "rocket" -/obj/item/gun/ballistic/automatic/atlauncher/attack_self() - return +/obj/item/gun/ballistic/rocketlauncher/unrestricted + pin = /obj/item/firing_pin -/obj/item/gun/ballistic/automatic/atlauncher/update_icon() - ..() - icon_state = "rocketlauncher[magazine ? "-[get_ammo(1)]" : ""]" \ No newline at end of file +/obj/item/gun/ballistic/rocketlauncher/handle_atom_del(atom/A) + if(A == chambered) + chambered = null + if(!QDELETED(magazine)) + QDEL_NULL(magazine) + if(A == magazine) + magazine = null + if(!QDELETED(chambered)) + QDEL_NULL(chambered) + update_icon() + return ..() + +/obj/item/gun/ballistic/rocketlauncher/can_shoot() + return chambered?.BB + +/obj/item/gun/ballistic/rocketlauncher/attack_self_tk(mob/user) + return //too difficult to remove the rocket with TK + +/obj/item/gun/ballistic/rocketlauncher/attack_self(mob/living/user) + if(magazine) + var/obj/item/ammo_casing/AC = chambered + if(AC) + if(!user.put_in_hands(AC)) + AC.bounce_away(FALSE, NONE) + to_chat(user, "You remove \the [AC] from \the [src]!") + playsound(src, 'sound/weapons/gun_magazine_remove_full.ogg', 70, TRUE) + chambered = null + else + to_chat(user, "There's no [magazine_wording] in [src].") + update_icon() + +/obj/item/gun/ballistic/rocketlauncher/attackby(obj/item/A, mob/user, params) + if(magazine && istype(A, /obj/item/ammo_casing)) + if(user.temporarilyRemoveItemFromInventory(A)) + if(!chambered) + to_chat(user, "You load a new [A] into \the [src].") + playsound(src, "gun_insert_full_magazine", 70, 1) + chamber_round() + update_icon() + return TRUE + else + to_chat(user, "You cannot seem to get \the [A] out of your hands!") + +/obj/item/gun/ballistic/rocketlauncher/update_icon() + icon_state = "[initial(icon_state)]-[chambered ? "1" : "0"]" + +/obj/item/gun/ballistic/rocketlauncher/suicide_act(mob/living/user) + user.visible_message("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!", \ + "You aim [src] at the ground to perform a bisnasty rocket jump...") + if(can_shoot()) + user.notransform = TRUE + playsound(src, 'sound/vehicles/rocketlaunch.ogg', 80, 1, 5) + animate(user, pixel_z = 300, time = 30, easing = LINEAR_EASING) + sleep(70) + animate(user, pixel_z = 0, time = 5, easing = LINEAR_EASING) + sleep(5) + user.notransform = FALSE + process_fire(user, user, TRUE) + if(!QDELETED(user)) //if they weren't gibbed by the explosion, take care of them for good. + user.gib() + return MANUAL_SUICIDE + else + sleep(5) + shoot_with_empty_chamber(user) + sleep(20) + user.visible_message("[user] looks about the room realizing [user.p_theyre()] still there. [user.p_they(TRUE)] proceed to shove [src] down their throat and choke [user.p_them()]self with it!", \ + "You look around after realizing you're still here, then proceed to choke yourself to death with [src]!") + sleep(20) + return OXYLOSS diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index c6f0956880..6e2c9dc62a 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -243,7 +243,7 @@ /obj/item/gun/energy/printer name = "cyborg lmg" - desc = "A machinegun that fires 3d-printed flechettes slowly regenerated using a cyborg's internal power source." + desc = "A LMG that fires 3D-printed flechettes. They are slowly resupplied using the cyborg's internal power source." icon_state = "l6closed0" icon = 'icons/obj/guns/projectile.dmi' cell_type = "/obj/item/stock_parts/cell/secborg" diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 6518b2a4d5..e15810c6bb 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -9,13 +9,14 @@ return TRUE /obj/item/projectile/bullet/a84mm - name ="anti-armour rocket" + name ="\improper HEDP rocket" desc = "USE A WEEL GUN" - icon_state= "atrocket" + icon_state= "84mm-hedp" damage = 80 var/anti_armour_damage = 200 armour_penetration = 100 dismemberment = 100 + ricochets_max = 0 /obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE) ..() @@ -29,17 +30,17 @@ S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25) return TRUE -/obj/item/projectile/bullet/srmrocket - name ="SRM-8 Rocket" +/obj/item/projectile/bullet/a84mm_he + name ="\improper HE missile" desc = "Boom." icon_state = "missile" damage = 30 ricochets_max = 0 //it's a MISSILE -/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0) +/obj/item/projectile/bullet/a84mm_he/on_hit(atom/target, blocked=0) ..() if(!isliving(target)) //if the target isn't alive, so is a wall or something explosion(target, 0, 1, 2, 4) else explosion(target, 0, 0, 2, 4) - return TRUE + return TRUE \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index d0c08d9534..7efa13898d 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -438,6 +438,14 @@ . = 1 ..() +/datum/reagent/consumable/peanut_butter + name = "Peanut Butter" + id = "peanut_butter" + description = "A popular food paste made from ground dry-roasted peanuts." + color = "#C29261" + nutriment_factor = 15 * REAGENTS_METABOLISM + taste_description = "peanuts" + /datum/reagent/consumable/cornoil name = "Corn Oil" id = "cornoil" diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 890403691e..9c63846620 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -206,7 +206,12 @@ /datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(is_servant_of_ratvar(M)) - to_chat(M, "A darkness begins to spread its unholy tendrils through your mind, purging the Justiciar's influence!") + to_chat(M, "A fog spreads through your mind, purging the Justiciar's influence!") + ..() + +/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + if(iscultist(M)) + to_chat(M, "A fog spreads through your mind, weakening your connection to the veil and purging Nar-sie's influence") ..() /datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M) @@ -261,7 +266,7 @@ qdel(R) T.Bless() -/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke +/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke name = "Unholy Water" id = "unholywater" description = "Something that shouldn't exist on this plane of existence." @@ -280,7 +285,7 @@ M.AdjustStun(-40, 0) M.AdjustKnockdown(-40, 0) M.adjustStaminaLoss(-10, 0) - M.adjustToxLoss(-2, 0) + M.adjustToxLoss(-2, 0, TRUE) M.adjustOxyLoss(-2, 0) M.adjustBruteLoss(-2, 0) M.adjustFireLoss(-2, 0) @@ -309,6 +314,45 @@ M.adjustBrainLoss(5, 150) holder.remove_reagent(id, 1) +/datum/reagent/fuel/holyoil //Its oil + name = "Zelus Oil" + id = "holyoil" + description = "Oil blessed by a greater being." + taste_description = "metallic oil" + +/datum/reagent/fuel/holyoil/on_mob_life(mob/living/carbon/M) + if(is_servant_of_ratvar(M)) + M.drowsyness = max(M.drowsyness-5, 0) + M.AdjustUnconscious(-60, 0) + M.AdjustStun(-30, 0) + M.AdjustKnockdown(-70, 0) + M.adjustStaminaLoss(-15, 0) + M.adjustToxLoss(-5, 0, TRUE) + M.adjustOxyLoss(-3, 0) + M.adjustBruteLoss(-3, 0) + M.adjustFireLoss(-5, 0) + if(iscultist(M)) + M.AdjustUnconscious(1, 0) + M.AdjustStun(10, 0) + M.AdjustKnockdown(20, 0) + M.adjustStaminaLoss(15, 0) + else + M.adjustToxLoss(3, 0) + M.adjustOxyLoss(2, 0) + M.adjustStaminaLoss(10, 0) + holder.remove_reagent(id, 1) + return TRUE + +//We only get 30u to start with... + +/datum/reagent/fuel/holyoil/reaction_obj(obj/O, reac_volume) + . = ..() + if(istype(O, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = O + reac_volume = min(reac_volume, M.amount) + new/obj/item/stack/tile/brass(get_turf(M), reac_volume) + M.use(reac_volume) + /datum/reagent/medicine/omnizine/godblood name = "Godblood" id = "godblood" @@ -1879,4 +1923,4 @@ if(added_length >= 0.20) //Only add the length if it's greater than or equal to 0.2. This is to prevent people from smoking the reagents and causing the penis to update constantly. P.length += added_length P.update() - ..() \ No newline at end of file + ..() diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index db5f7b198c..8edca91a91 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -216,7 +216,7 @@ /datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder) var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract begins to vibrate adorably!") + T.visible_message("The slime extract starts to feel extremely cold!") addtimer(CALLBACK(src, .proc/freeze, holder), 50) var/obj/item/slime_extract/M = holder.my_atom deltimer(M.qdel_timer) @@ -227,7 +227,8 @@ if(holder && holder.my_atom) var/turf/open/T = get_turf(holder.my_atom) if(istype(T)) - T.atmos_spawn_air("nitrogen=50;TEMP=2.7") + var/datum/gas/gastype = /datum/gas/nitrogen + T.atmos_spawn_air("[initial(gastype.id)]=50;TEMP=2.7") /datum/chemical_reaction/slime/slimefireproof name = "Slime Fireproof" @@ -370,6 +371,11 @@ /datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder) for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) + if(slime.docile) //Undoes docility, but doesn't make rabid. + slime.visible_message("[slime] forgets its training, becoming wild once again!") + slime.docile = FALSE + slime.update_name() + continue slime.rabid = 1 slime.visible_message("The [slime] is driven into a frenzy!") ..() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 9bc6bef8a5..9d10b9356a 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -53,7 +53,7 @@ /obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity) . = ..() - if((!proximity) || !check_allowed_items(target,target_self=1)) + if((!proximity) || !spillable || !check_allowed_items(target,target_self=1)) return if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it. diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 3ee7d344dc..7ccc41c232 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -219,7 +219,7 @@ /datum/design/mech_missile_rack name = "Exosuit Weapon (SRM-8 Missile Rack)" - desc = "Allows for the construction of SRM-8 Missile Rack." + desc = "Allows for the construction of an SRM-8 Missile Rack." id = "mech_missile_rack" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 03c0582245..214ef36afe 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -330,8 +330,8 @@ departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/suppressor - name = "Universal Suppressor" - desc = "A reverse-engineered universal suppressor that fits on most small arms with threaded barrels." + name = "Suppressor" + desc = "A reverse-engineered suppressor that fits on most small arms with threaded barrels." id = "suppressor" build_type = PROTOLATHE materials = list(MAT_METAL = 2000, MAT_SILVER = 500) diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index ab314cb33c..d3a268047e 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -70,9 +70,13 @@ rogue_types = list(/datum/nanite_program/brain_decay) /datum/nanite_program/brain_heal/check_conditions() - if(!host_mob.getBrainLoss()) - return FALSE - return ..() + if(iscarbon(host_mob)) + var/mob/living/carbon/C = host_mob + if(length(C.get_traumas())) + return ..() + if(host_mob.getBrainLoss()) + return ..() + return FALSE /datum/nanite_program/brain_heal/active_effect() host_mob.adjustBrainLoss(-1, TRUE) @@ -187,10 +191,14 @@ rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) /datum/nanite_program/brain_heal_advanced/check_conditions() - if(!host_mob.getBrainLoss()) - return FALSE - return ..() - + if(iscarbon(host_mob)) + var/mob/living/carbon/C = host_mob + if(length(C.get_traumas())) + return ..() + if(host_mob.getBrainLoss()) + return ..() + return FALSE + /datum/nanite_program/brain_heal_advanced/active_effect() host_mob.adjustBrainLoss(-2, TRUE) if(iscarbon(host_mob) && prob(10)) diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 881c830e5e..ff55a87dfa 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -186,6 +186,7 @@ Chilling extracts: /obj/item/slimecross/chilling/sepia/do_effect(mob/user) user.visible_message("[src] shatters, freezing time itself!") + allies -= user //support class new /obj/effect/timestop(get_turf(user), 2, 300, allies) ..() @@ -267,7 +268,7 @@ Chilling extracts: addtimer(CALLBACK(src, .proc/boom), 50) /obj/item/slimecross/chilling/oil/proc/boom() - explosion(get_turf(src), -1, -1, 3, 10) //Large radius, but mostly light damage. + explosion(get_turf(src), -1, -1, 10, 0) //Large radius, but mostly light damage, and no flash. qdel(src) /obj/item/slimecross/chilling/black @@ -307,4 +308,4 @@ Chilling extracts: user.visible_message("[src] reflects an array of dazzling colors and light, energy rushing to nearby doors!") for(var/obj/machinery/door/airlock/door in area) new /obj/effect/forcefield/slimewall/rainbow(door.loc) - return ..() + return ..() \ No newline at end of file diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 76d444da18..85819da52a 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -633,6 +633,12 @@ to_chat(user, "The slime is dead!") return + if(M.rabid) //Stops being rabid, but doesn't become truly docile. + to_chat(M, "You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.") + to_chat(user, "You feed the slime the potion, calming its rabid rage.") + M.rabid = FALSE + qdel(src) + return M.docile = 1 M.nutrition = 700 to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.") diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index 86132cf834..1258b9f4b8 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -35,7 +35,9 @@ /obj/item/assault_pod/attack_self(mob/living/user) var/target_area - target_area = input("Area to land", "Select a Landing Zone", target_area) in GLOB.teleportlocs + target_area = input("Area to land", "Select a Landing Zone", target_area) as null|anything in GLOB.teleportlocs + if(!target_area) + return var/area/picked_area = GLOB.teleportlocs[target_area] if(!src || QDELETED(src)) return diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index d41fd6a79b..020b4b29ab 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -199,7 +199,7 @@ . = ..() -/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null) +/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null, silent = FALSE) if(!isnum(set_coefficient)) var/security_num = seclevel2num(get_security_level()) switch(security_num) @@ -228,7 +228,8 @@ else SSshuttle.emergencyLastCallLoc = null - priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlecalled.ogg', "Priority") + if(!silent) + priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlecalled.ogg', "Priority") /obj/docking_port/mobile/emergency/cancel(area/signalOrigin) if(mode != SHUTTLE_CALL) diff --git a/code/modules/spells/spell_types/barnyard.dm b/code/modules/spells/spell_types/barnyard.dm index 01b24fef98..b6a7878470 100644 --- a/code/modules/spells/spell_types/barnyard.dm +++ b/code/modules/spells/spell_types/barnyard.dm @@ -37,14 +37,13 @@ "Your face starts burning up, but the flames are repulsed by your anti-magic protection!") return - var/list/masks = list(/obj/item/clothing/mask/spig, /obj/item/clothing/mask/cowmask, /obj/item/clothing/mask/horsehead) + var/list/masks = list(/obj/item/clothing/mask/pig/cursed, /obj/item/clothing/mask/cowmask/cursed, /obj/item/clothing/mask/horsehead/cursed) var/list/mSounds = list('sound/magic/pighead_curse.ogg', 'sound/magic/cowhead_curse.ogg', 'sound/magic/horsehead_curse.ogg') var/randM = rand(1,3) var/choice = masks[randM] var/obj/item/clothing/mask/magichead = new choice - magichead.item_flags |= NODROP magichead.flags_inv = null target.visible_message("[target]'s face bursts into flames, and a barnyard animal's head takes its place!", \ "Your face burns up, and shortly after the fire you realise you have the face of a barnyard animal!") diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index bc1fc980bb..13686e2069 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -42,6 +42,7 @@ GLOBAL_LIST_INIT(summoned_guns, list( /obj/item/gun/ballistic/revolver/grenadelauncher, /obj/item/gun/ballistic/revolver/golden, /obj/item/gun/ballistic/automatic/sniper_rifle, + /obj/item/gun/ballistic/rocketlauncher, /obj/item/gun/medbeam, /obj/item/gun/energy/laser/scatter, /obj/item/gun/energy/gravity_gun)) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 0302dd2cae..ea336bea19 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -46,7 +46,7 @@ /obj/item/organ/cyberimp/chest/reviver name = "Reviver implant" - desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!" + desc = "This implant will attempt to revive and heal you if you lose consciousness. For the faint of heart!" icon_state = "chest_implant" implant_color = "#AD0000" slot = ORGAN_SLOT_HEART_AID diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 64be29c339..ef358c48da 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -288,51 +288,52 @@ gas_breathed = breath_gases[/datum/gas/stimulum] if (gas_breathed > gas_stimulation_min) var/existing = H.reagents.get_reagent_amount("stimulum") - H.reagents.add_reagent("stimulum",max(0, 1 - existing)) + H.reagents.add_reagent("stimulum", max(0, 5 - existing)) breath_gases[/datum/gas/stimulum]-=gas_breathed // Miasma if (breath_gases[/datum/gas/miasma]) var/miasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/miasma]) + if(miasma_pp > MINIMUM_MOLES_DELTA_TO_MOVE) - //Miasma sickness - if(prob(0.5 * miasma_pp)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) - miasma_disease.name = "Unknown" - miasma_disease.try_infect(owner) + //Miasma sickness + if(prob(0.05 * miasma_pp)) + var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) + miasma_disease.name = "Unknown" + miasma_disease.try_infect(owner) - // Miasma side effects - switch(miasma_pp) - if(1 to 5) - // At lower pp, give out a little warning - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell") - if(prob(5)) - to_chat(owner, "There is an unpleasant smell in the air.") - if(5 to 15) - //At somewhat higher pp, warning becomes more obvious - if(prob(15)) - to_chat(owner, "You smell something horribly decayed inside this room.") - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell) - if(15 to 30) - //Small chance to vomit. By now, people have internals on anyway - if(prob(5)) - to_chat(owner, "The stench of rotting carcasses is unbearable!") - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) - owner.vomit() - if(30 to INFINITY) - //Higher chance to vomit. Let the horror start - if(prob(15)) - to_chat(owner, "The stench of rotting carcasses is unbearable!") - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) - owner.vomit() - else - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell") + // Miasma side effects + switch(miasma_pp) + if(1 to 5) + // At lower pp, give out a little warning + SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell") + if(prob(5)) + to_chat(owner, "There is an unpleasant smell in the air.") + if(5 to 15) + //At somewhat higher pp, warning becomes more obvious + if(prob(15)) + to_chat(owner, "You smell something horribly decayed inside this room.") + SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell) + if(15 to 30) + //Small chance to vomit. By now, people have internals on anyway + if(prob(5)) + to_chat(owner, "The stench of rotting carcasses is unbearable!") + SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) + owner.vomit() + if(30 to INFINITY) + //Higher chance to vomit. Let the horror start + if(prob(15)) + to_chat(owner, "The stench of rotting carcasses is unbearable!") + SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) + owner.vomit() + else + SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell") - // In a full miasma atmosphere with 101.34 pKa, about 10 disgust per breath, is pretty low compared to threshholds - // Then again, this is a purely hypothetical scenario and hardly reachable - owner.adjust_disgust(0.1 * miasma_pp) + // In a full miasma atmosphere with 101.34 pKa, about 10 disgust per breath, is pretty low compared to threshholds + // Then again, this is a purely hypothetical scenario and hardly reachable + owner.adjust_disgust(0.1 * miasma_pp) - breath_gases[/datum/gas/miasma]-=gas_breathed + breath_gases[/datum/gas/miasma]-=gas_breathed // Clear out moods when no miasma at all else @@ -442,3 +443,14 @@ heat_level_1_threshold = 400 // better adapted for heat, obv. Lavaland standard is 300 heat_level_2_threshold = 600 // up 200 from level 1, 1000 is silly but w/e for level 3 +/obj/item/organ/lungs/slime + name = "vacuole" + desc = "A large organelle designed to store oxygen and other important gasses." + + safe_toxins_max = 0 //We breathe this to gain POWER. + +/obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) + . = ..() + if (breath.gases[/datum/gas/plasma]) + var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma]) + owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 0e672de225..ccfc21f878 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -8,6 +8,7 @@ var/list/languages_possible var/say_mod = null var/taste_sensitivity = 15 // lower is more sensitive. + var/modifies_speech = FALSE var/static/list/languages_possible_base = typecacheof(list( /datum/language/common, /datum/language/draconic, @@ -24,24 +25,25 @@ . = ..() languages_possible = languages_possible_base -/obj/item/organ/tongue/get_spans() - return list() - -/obj/item/organ/tongue/proc/TongueSpeech(var/message) - return message +/obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args) /obj/item/organ/tongue/Insert(mob/living/carbon/M, special = 0) ..() if(say_mod && M.dna && M.dna.species) M.dna.species.say_mod = say_mod + if (modifies_speech) + RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + M.UnregisterSignal(M, COMSIG_MOB_SAY) /obj/item/organ/tongue/Remove(mob/living/carbon/M, special = 0) ..() if(say_mod && M.dna && M.dna.species) M.dna.species.say_mod = initial(M.dna.species.say_mod) + UnregisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + M.RegisterSignal(M, COMSIG_MOB_SAY, /mob/living/carbon/.proc/handle_tongueless_speech) /obj/item/organ/tongue/could_speak_in_language(datum/language/dt) - . = is_type_in_typecache(dt, languages_possible) + return is_type_in_typecache(dt, languages_possible) /obj/item/organ/tongue/lizard name = "forked tongue" @@ -49,14 +51,16 @@ icon_state = "tonguelizard" say_mod = "hisses" taste_sensitivity = 10 // combined nose + tongue, extra sensitive + modifies_speech = TRUE -/obj/item/organ/tongue/lizard/TongueSpeech(var/message) - var/regex/lizard_hiss = new("s+", "g") - var/regex/lizard_hiSS = new("S+", "g") - if(copytext(message, 1, 2) != "*") +/obj/item/organ/tongue/lizard/handle_speech(datum/source, list/speech_args) + var/static/regex/lizard_hiss = new("s+", "g") + var/static/regex/lizard_hiSS = new("S+", "g") + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") message = lizard_hiss.Replace(message, "sss") message = lizard_hiSS.Replace(message, "SSS") - return message + speech_args[SPEECH_MESSAGE] = message /obj/item/organ/tongue/fly name = "proboscis" @@ -64,14 +68,16 @@ icon_state = "tonguefly" say_mod = "buzzes" taste_sensitivity = 25 // you eat vomit, this is a mercy + modifies_speech = TRUE -/obj/item/organ/tongue/fly/TongueSpeech(var/message) - var/regex/fly_buzz = new("z+", "g") - var/regex/fly_buZZ = new("Z+", "g") - if(copytext(message, 1, 2) != "*") +/obj/item/organ/tongue/fly/handle_speech(datum/source, list/speech_args) + var/static/regex/fly_buzz = new("z+", "g") + var/static/regex/fly_buZZ = new("Z+", "g") + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") message = fly_buzz.Replace(message, "zzz") message = fly_buZZ.Replace(message, "ZZZ") - return message + speech_args[SPEECH_MESSAGE] = message /obj/item/organ/tongue/abductor name = "superlingual matrix" @@ -79,9 +85,11 @@ icon_state = "tongueayylmao" say_mod = "gibbers" taste_sensitivity = 101 // ayys cannot taste anything. + modifies_speech = TRUE -/obj/item/organ/tongue/abductor/TongueSpeech(var/message) +/obj/item/organ/tongue/abductor/handle_speech(datum/source, list/speech_args) //Hacks + var/message = speech_args[SPEECH_MESSAGE] var/mob/living/carbon/human/user = usr var/rendered = "[user.name]: [message]" user.log_talk(message, LOG_SAY, tag="abductor") @@ -97,7 +105,7 @@ for(var/mob/M in GLOB.dead_mob_list) var/link = FOLLOW_LINK(M, user) to_chat(M, "[link] [rendered]") - return "" + speech_args[SPEECH_MESSAGE] = "" /obj/item/organ/tongue/zombie name = "rotting tongue" @@ -105,9 +113,10 @@ icon_state = "tonguezombie" say_mod = "moans" taste_sensitivity = 32 + modifies_speech = TRUE -/obj/item/organ/tongue/zombie/TongueSpeech(var/message) - var/list/message_list = splittext(message, " ") +/obj/item/organ/tongue/zombie/handle_speech(datum/source, list/speech_args) + var/list/message_list = splittext(speech_args[SPEECH_MESSAGE], " ") var/maxchanges = max(round(message_list.len / 1.5), 2) for(var/i = rand(maxchanges / 2, maxchanges), i > 0, i--) @@ -120,7 +129,7 @@ if(prob(20) && message_list.len > 3) message_list.Insert(insertpos, "[pick("BRAINS", "Brains", "Braaaiinnnsss", "BRAAAIIINNSSS")]...") - return jointext(message_list, " ") + speech_args[SPEECH_MESSAGE] = jointext(message_list, " ") /obj/item/organ/tongue/alien name = "alien tongue" @@ -128,6 +137,7 @@ icon_state = "tonguexeno" say_mod = "hisses" taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED + modifies_speech = TRUE // not really, they just hiss var/static/list/languages_possible_alien = typecacheof(list( /datum/language/xenocommon, /datum/language/common, @@ -139,9 +149,8 @@ . = ..() languages_possible = languages_possible_alien -/obj/item/organ/tongue/alien/TongueSpeech(var/message) +/obj/item/organ/tongue/alien/handle_speech(datum/source, list/speech_args) playsound(owner, "hiss", 25, 1, 1) - return message /obj/item/organ/tongue/bone name = "bone \"tongue\"" @@ -150,7 +159,7 @@ say_mod = "rattles" attack_verb = list("bitten", "chattered", "chomped", "enamelled", "boned") taste_sensitivity = 101 // skeletons cannot taste anything - + modifies_speech = TRUE var/chattering = FALSE var/phomeme_type = "sans" var/list/phomeme_types = list("sans", "papyrus") @@ -159,29 +168,20 @@ . = ..() phomeme_type = pick(phomeme_types) -/obj/item/organ/tongue/bone/TongueSpeech(var/message) - . = message - - if(chattering) - //Annoy everyone nearby with your chattering. - chatter(message, phomeme_type, usr) - -/obj/item/organ/tongue/bone/get_spans() - . = ..() - // Feature, if the tongue talks directly, it will speak with its span +/obj/item/organ/tongue/bone/handle_speech(datum/source, list/speech_args) + if (chattering) + chatter(speech_args[SPEECH_MESSAGE], phomeme_type, source) switch(phomeme_type) if("sans") - . |= SPAN_SANS + speech_args[SPEECH_SPANS] |= SPAN_SANS if("papyrus") - . |= SPAN_PAPYRUS + speech_args[SPEECH_SPANS] |= SPAN_PAPYRUS /obj/item/organ/tongue/bone/plasmaman name = "plasma bone \"tongue\"" desc = "Like animated skeletons, Plasmamen vibrate their teeth in order to produce speech." icon_state = "tongueplasma" - -/obj/item/organ/tongue/bone/plasmaman/get_spans() - return + modifies_speech = FALSE /obj/item/organ/tongue/robot name = "robotic voicebox" @@ -190,10 +190,18 @@ icon_state = "tonguerobot" say_mod = "states" attack_verb = list("beeped", "booped") + modifies_speech = TRUE taste_sensitivity = 25 // not as good as an organic tongue + var/electronics_magic = TRUE /obj/item/organ/tongue/robot/can_speak_in_language(datum/language/dt) - . = TRUE // THE MAGIC OF ELECTRONICS + return ..() || electronics_magic -/obj/item/organ/tongue/robot/get_spans() - return ..() | SPAN_ROBOT +/obj/item/organ/tongue/robot/handle_speech(datum/source, list/speech_args) + speech_args[SPEECH_SPANS] |= SPAN_ROBOT + +/obj/item/organ/tongue/robot/ipc + name = "positronic voicebox" + say_mod = "beeps" + desc = "A voice synthesizer used by IPCs to smoothly interface with organic lifeforms." + electronics_magic = FALSE \ No newline at end of file diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index c9a3871511..b013e7f252 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -49,9 +49,14 @@ var/datum/surgery_step/S = get_surgery_step() if(S) - if(S.try_op(user, target, user.zone_selected, user.get_active_held_item(), src, try_to_fail)) - return 1 - return 0 + var/obj/item/tool = user.get_active_held_item() + if(S.try_op(user, target, user.zone_selected, tool, src, try_to_fail)) + return TRUE + if(iscyborg(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache + return TRUE + if(tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it + to_chat(user, "This step requires a different tool!") + return TRUE /datum/surgery/proc/get_surgery_step() var/step_type = steps[status] diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 517dfb412a..db7445e0b0 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "retractor" materials = list(MAT_METAL=6000, MAT_GLASS=3000) + item_flags = SURGICAL_TOOL flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_TINY @@ -33,6 +34,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "hemostat" materials = list(MAT_METAL=5000, MAT_GLASS=2500) + item_flags = SURGICAL_TOOL flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_TINY attack_verb = list("attacked", "pinched") @@ -66,6 +68,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "cautery" materials = list(MAT_METAL=2500, MAT_GLASS=750) + item_flags = SURGICAL_TOOL flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_TINY attack_verb = list("burnt") @@ -102,6 +105,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' hitsound = 'sound/weapons/circsawhit.ogg' materials = list(MAT_METAL=10000, MAT_GLASS=6000) + item_flags = SURGICAL_TOOL flags_1 = CONDUCT_1 force = 15 w_class = WEIGHT_CLASS_NORMAL @@ -151,6 +155,7 @@ throw_speed = 3 throw_range = 5 materials = list(MAT_METAL=4000, MAT_GLASS=1000) + item_flags = SURGICAL_TOOL attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP_ACCURATE @@ -209,6 +214,7 @@ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' hitsound = 'sound/weapons/circsawhit.ogg' throwhitsound = 'sound/weapons/pierce.ogg' + item_flags = SURGICAL_TOOL flags_1 = CONDUCT_1 force = 15 w_class = WEIGHT_CLASS_NORMAL @@ -278,6 +284,7 @@ desc = "A container for holding body parts." icon = 'icons/obj/storage.dmi' icon_state = "evidenceobj" + item_flags = SURGICAL_TOOL /obj/item/organ_storage/afterattack(obj/item/I, mob/user, proximity) . = ..() diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index 2e91879006..b008682745 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -57,4 +57,3 @@ /obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20) . = ..() AddComponent(/datum/component/uplink, owner, TRUE, FALSE, null, tc_amount) - traitor_unlock_degrees = 360 diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index af1c954c5b..905c710e6a 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -85,18 +85,18 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) return pick(4;0.75,2;0.5,1;0.25) /datum/uplink_item/proc/purchase(mob/user, datum/component/uplink/U) - var/atom/A = spawn_item(item, user) + var/atom/A = spawn_item(item, user, U) if(purchase_log_vis && U.purchase_log) U.purchase_log.LogPurchase(A, src, cost) -/datum/uplink_item/proc/spawn_item(spawn_item, mob/user) - if(!spawn_item) +/datum/uplink_item/proc/spawn_item(spawn_path, mob/user, datum/component/uplink/U) + if(!spawn_path) return var/atom/A - if(ispath(spawn_item)) - A = new spawn_item(get_turf(user)) + if(ispath(spawn_path)) + A = new spawn_path(get_turf(user)) else - A = spawn_item + A = spawn_path if(ishuman(user) && istype(A, /obj/item)) var/mob/living/carbon/human/H = user if(H.put_in_hands(A)) @@ -117,23 +117,23 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/bundles_TC/chemical name = "Bioterror bundle" - desc = "For the madman: Contains Bioterror spray, Bioterror grenade, chemicals, syringe gun, box of syringes,\ - Donksoft assault rifle, and some darts. Remember: Seal suit and equip internals before use." + desc = "For the madman: Contains a handheld Bioterror chem sprayer, a Bioterror foam grenade, a box of lethal chemicals, a dart pistol, \ + box of syringes, Donksoft assault rifle, and some riot darts. Remember: Seal suit and equip internals before use." item = /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle cost = 30 // normally 42 include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/bundles_TC/bulldog name = "Bulldog bundle" - desc = "Lean and mean: Optimised for people that want to get up close and personal. Contains the popular \ - Bulldog shotgun, two 12g drums, and a pair of Thermal imaging goggles." + desc = "Lean and mean: Optimized for people that want to get up close and personal. Contains the popular \ + Bulldog shotgun, a 12g buckshot drum, a 12g taser slug drum and a pair of Thermal imaging goggles." item = /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle cost = 13 // normally 16 include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/bundles_TC/c20r name = "C-20r bundle" - desc = "Old faithful: The classic C-20r, bundled with two magazines, and a (surplus) suppressor at discount price." + desc = "Old Faithful: The classic C-20r, bundled with two magazines, and a (surplus) suppressor at discount price." item = /obj/item/storage/backpack/duffelbag/syndie/c20rbundle cost = 14 // normally 16 include_modes = list(/datum/game_mode/nuclear) @@ -147,8 +147,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/bundles_TC/medical name = "Medical bundle" - desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a Donksoft machine gun, \ - a box of ammo, and a pair of magboots to rescue your friends in no-gravity environments." + desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a tactical medkit, \ + a Donksoft LMG, a box of riot darts and a pair of magboots to rescue your friends in no-gravity environments." item = /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle cost = 15 // normally 20 include_modes = list(/datum/game_mode/nuclear) @@ -170,15 +170,18 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/bundles_TC/sniper name = "Sniper bundle" - desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, a hollow-point \ - a soporific knockout magazine, a free surplus supressor, and a worn out suit and tie." + desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, \ + two soporific knockout magazines, a free surplus supressor, and a sharp-looking tactical turtleneck suit. \ + We'll throw in a free red tie if you order NOW." item = /obj/item/storage/briefcase/sniperbundle cost = 20 // normally 26 include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/bundles_TC/firestarter name = "Spetsnaz Pyro bundle" - desc = "For systematic suppression of carbon lifeforms in close range: Contains a specialist Pyrotechnic equipment, foreign pistol, two magazines, a pipebomb, and a stimulant syringe." + desc = "For systematic suppression of carbon lifeforms in close quarters: Contains a lethal New Russian backpack spray, Elite hardsuit, \ + Stechkin APS pistol, two magazines, a minibomb and a stimulant syringe. \ + Order NOW and comrade Boris will throw in an extra tracksuit." item = /obj/item/storage/backpack/duffelbag/syndie/firestarter cost = 30 include_modes = list(/datum/game_mode/nuclear) @@ -187,7 +190,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "Syndicate Bundle" desc = "Syndicate Bundles are specialized groups of items that arrive in a plain box. \ These items are collectively worth more than 20 telecrystals, but you do not know which specialization \ - you will receive." + you will receive. May contain discontinued and/or exotic items." item = /obj/item/storage/box/syndicate cost = 20 exclude_modes = list(/datum/game_mode/nuclear) @@ -216,7 +219,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) var/list/uplink_items = get_uplink_items(SSticker && SSticker.mode? SSticker.mode : null, FALSE) var/crate_value = starting_crate_value - var/obj/structure/closet/crate/C = spawn_item(/obj/structure/closet/crate, user) + var/obj/structure/closet/crate/C = spawn_item(/obj/structure/closet/crate, user, U) if(U.purchase_log) U.purchase_log.LogPurchase(C, src, cost) while(crate_value) @@ -287,6 +290,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/dangerous category = "Conspicuous and Dangerous Weapons" +/datum/uplink_item/dangerous/rawketlawnchair + name = "84mm Rocket Propelled Grenade Launcher" + desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \ + Guaranteed to send your target out with a bang or your money back!" + item = /obj/item/gun/ballistic/rocketlauncher + cost = 8 + surplus = 30 + include_modes = list(/datum/game_mode/nuclear) + /datum/uplink_item/dangerous/antitank name = "Anti Tank Pistol" desc = "Essentially amounting to a sniper rifle with no stock and barrel (or indeed, any rifling at all), \ @@ -327,7 +339,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/dangerous/bioterror name = "Biohazardous Chemical Sprayer" - desc = "A chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \ + desc = "A handheld chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \ Cooperative, the deadly blend it comes stocked with will disorient, damage, and disable your foes... \ Use with extreme caution, to prevent exposure to yourself and your fellow operatives." item = /obj/item/reagent_containers/spray/chemsprayer/bioterror @@ -418,7 +430,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 30 include_modes = list(/datum/game_mode/nuclear) -/datum/uplink_item/badass/rapid +/datum/uplink_item/dangerous/rapid name = "Gloves of the North Star" desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk." item = /obj/item/clothing/gloves/rapid @@ -427,7 +439,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/dangerous/guardian name = "Holoparasites" desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an \ - organic host as a home base and source of fuel." + organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host." item = /obj/item/storage/box/syndie_kit/guardian cost = 15 refundable = TRUE @@ -450,7 +462,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/dangerous/carbine name = "M-90gl Carbine" desc = "A fully-loaded, specialized three-round burst carbine that fires 5.56mm ammunition from a 30 round magazine \ - with a togglable 40mm under-barrel grenade launcher." + with a toggleable 40mm underbarrel grenade launcher." item = /obj/item/gun/ballistic/automatic/m90 cost = 18 surplus = 50 @@ -490,7 +502,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/dangerous/revolver name = "Syndicate Revolver" - desc = "A brutally simple syndicate revolver that fires .357 Magnum rounds and has 7 chambers." + desc = "A brutally simple Syndicate revolver that fires .357 Magnum rounds and has 7 chambers." item = /obj/item/gun/ballistic/revolver/syndie cost = 13 surplus = 50 @@ -498,7 +510,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/dangerous/foamsmg name = "Toy Submachine Gun" - desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine." + desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade darts with a 20-round magazine." item = /obj/item/gun/ballistic/automatic/c20r/toy cost = 5 surplus = 0 @@ -514,7 +526,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) /datum/uplink_item/dangerous/foampistol - name = "Toy Gun with Riot Darts" + name = "Toy Pistol with Riot Darts" desc = "An innocent-looking toy pistol designed to fire foam darts. Comes loaded with riot-grade \ darts effective at incapacitating a target." item = /obj/item/gun/ballistic/automatic/toy/pistol/riot @@ -594,7 +606,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_weapons/romerol_kit name = "Romerol" - desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. On death, these nodules take control of the dead body, causing limited revivification, along with slurred speech, aggression, and the ability to infect others with this agent." + desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. \ + On death, these nodules take control of the dead body, causing limited revivification, \ + along with slurred speech, aggression, and the ability to infect others with this agent." item = /obj/item/storage/box/syndie_kit/romerol cost = 25 cant_discount = TRUE @@ -604,7 +618,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "Sleepy Pen" desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a \ strong anesthetic and a chemical that prevents the target from speaking. \ - The pen holds one dose of the mixture, and can be refilled. Note that before the target \ + The pen holds one dose of the mixture, and can be refilled with any chemicals. Note that before the target \ falls asleep, they will be able to move and act." item = /obj/item/pen/sleepy cost = 4 @@ -618,9 +632,9 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes include_modes = list(/datum/game_mode/nuclear/clown_ops) /datum/uplink_item/stealthy_weapons/suppressor - name = "Universal Suppressor" - desc = "Fitted for use on any small caliber weapon with a threaded barrel, this suppressor will silence the \ - shots of the weapon for increased stealth and superior ambushing capability." + name = "Suppressor" + desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. \ + It is compatible with many small ballistic guns including the Stechkin and C-20r, but not revolvers or energy guns." item = /obj/item/suppressor cost = 1 surplus = 10 @@ -655,21 +669,24 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/ammo/pistolap name = "10mm Armour Piercing Magazine" - desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. These rounds are less effective at injuring the target but penetrate protective gear." + desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \ + These rounds are less effective at injuring the target but penetrate protective gear." item = /obj/item/ammo_box/magazine/m10mm/ap cost = 2 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) /datum/uplink_item/ammo/pistolhp name = "10mm Hollow Point Magazine" - desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. These rounds are more damaging but ineffective against armour." + desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \ + These rounds are more damaging but ineffective against armour." item = /obj/item/ammo_box/magazine/m10mm/hp cost = 3 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) /datum/uplink_item/ammo/pistolfire name = "10mm Incendiary Magazine" - desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. Loaded with incendiary rounds which ignite the target." + desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \ + Loaded with incendiary rounds which inflict little damage, but ignite the target." item = /obj/item/ammo_box/magazine/m10mm/fire cost = 2 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) @@ -706,7 +723,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/ammo/shotgun/meteor name = "12g Meteorslug Shells" desc = "An alternative 8-round meteorslug magazine for use in the Bulldog shotgun. \ - Great for blasting airlocks off their frames." + Great for blasting airlocks off their frames and knocking down enemies." item = /obj/item/ammo_box/magazine/m12g/meteor include_modes = list(/datum/game_mode/nuclear) @@ -750,13 +767,12 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes name = ".45 Ammo Duffel Bag" desc = "A duffel bag filled with enough .45 ammo to supply an entire team, at a discounted price." item = /obj/item/storage/backpack/duffelbag/syndie/ammo/smg - cost = 20 + cost = 20 //instead of 27 TC include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/smg name = ".45 SMG Magazine" - desc = "An additional 24-round .45 magazine suitable for use with the C-20r submachine gun. \ - These bullets pack a lot of punch that can knock most targets down, but do limited overall damage." + desc = "An additional 24-round .45 magazine suitable for use with the C-20r submachine gun." item = /obj/item/ammo_box/magazine/smgm45 cost = 3 include_modes = list(/datum/game_mode/nuclear) @@ -786,7 +802,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/ammo/carbine name = "5.56mm Toploader Magazine" desc = "An additional 30-round 5.56mm magazine; suitable for use with the M-90gl carbine. \ - These bullets pack less punch than 1.95mm rounds, but they still offer more power than .45 ammo." + These bullets pack less punch than 7.12x82mm rounds, but they still offer more power than .45 ammo." item = /obj/item/ammo_box/magazine/m556 cost = 4 include_modes = list(/datum/game_mode/nuclear) @@ -799,7 +815,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/ammo/machinegun/basic name = "1.95x129mm Box Magazine" desc = "A 50-round magazine of 1.95x129mm ammunition for use with the L6 SAW. \ - By the time you need to use this, you'll already be on a pile of corpses." + By the time you need to use this, you'll already be standing on a pile of corpses" item = /obj/item/ammo_box/magazine/mm195x129 /datum/uplink_item/ammo/machinegun/ap @@ -821,9 +837,25 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." item = /obj/item/ammo_box/magazine/mm195x129/incen +/datum/uplink_item/ammo/rocket + include_modes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/ammo/rocket/basic + name = "84mm HE Rocket" + desc = "A low-yield anti-personnel HE rocket. Gonna take you out in style!" + item = /obj/item/ammo_casing/caseless/rocket + cost = 4 + +/datum/uplink_item/ammo/rocket/hedp + name = "84mm HEDP Rocket" + desc = "A high-yield HEDP rocket; extremely effective against armored targets, as well as surrounding personnel. \ + Strike fear into the hearts of your enemies." + item = /obj/item/ammo_casing/caseless/rocket/hedp + cost = 6 + /datum/uplink_item/ammo/pistolaps name = "9mm Handgun Magazine" - desc = "An additional 15-round 9mm magazine, compatible with the Stetchkin APS pistol, found in the Spetsnaz Pyro bundle." + desc = "An additional 15-round 9mm magazine, compatible with the Stechkin APS pistol, found in the Spetsnaz Pyro bundle." item = /obj/item/ammo_box/magazine/pistolm9mm cost = 2 include_modes = list(/datum/game_mode/nuclear) @@ -847,7 +879,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/ammo/toydarts name = "Box of Riot Darts" - desc = "A box of 40 Donksoft foam riot darts, for reloading any compatible foam dart gun. Don't forget to share!" + desc = "A box of 40 Donksoft riot darts, for reloading any compatible foam dart magazine. Don't forget to share!" item = /obj/item/ammo_box/foambox/riot cost = 2 surplus = 0 @@ -871,7 +903,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes category = "Grenades and Explosives" /datum/uplink_item/explosives/bioterrorfoam - name = "Chemical Foam Grenade" + name = "Bioterror Foam Grenade" desc = "A powerful chemical foam grenade which creates a deadly torrent of foam that will mute, blind, confuse, \ mutate, and irritate carbon lifeforms. Specially brewed by Tiger Cooperative chemical weapons specialists \ using additional spore toxin. Ensure suit is sealed before use." @@ -901,7 +933,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/explosives/c4 name = "Composition C-4" desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, sabotage equipment, or connect \ - an assembly to it in order to alter the way it detonates. It has a modifiable timer with a \ + an assembly to it in order to alter the way it detonates. It can be attached to almost all objects and has a modifiable timer with a \ minimum setting of 10 seconds." item = /obj/item/grenade/plastic/c4 cost = 1 @@ -915,8 +947,9 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/explosives/x4bag name = "Bag of X-4 explosives" - desc = "Contains 3 X-4 plastic explosives. Similar, but more powerful than C-4. X-4 can be placed on a solid surface, such as a wall or window, and it will \ - blast through the wall, injuring anything on the opposite side, while being safer to the user. For when you want a wider, deeper, hole." + desc = "Contains 3 X-4 shaped plastic explosives. Similar to C4, but with a stronger blast that is directional instead of circular. \ + X-4 can be placed on a solid surface, such as a wall or window, and it will blast through the wall, injuring anything on the opposite side, while being safer to the user. \ + For when you want a controlled explosion that leaves a wider, deeper, hole." item = /obj/item/storage/backpack/duffelbag/syndie/x4 cost = 4 // cant_discount = TRUE @@ -937,16 +970,15 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes name = "Detomatix PDA Cartridge" desc = "When inserted into a personal digital assistant, this cartridge gives you four opportunities to \ detonate PDAs of crewmembers who have their message feature enabled. \ - The concussive effect from the explosion will knock the recipient out for a short period, and deafen \ - them for longer. Beware, it has a chance to detonate your PDA." + The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer." item = /obj/item/cartridge/virus/syndicate cost = 5 restricted = TRUE /datum/uplink_item/explosives/emp name = "EMP Grenades and Implanter Kit" - desc = "A box that contains two EMP grenades and an EMP implant. Useful to disrupt communication, \ - security's energy weapons, and silicon lifeforms when you're in a tight spot." + desc = "A box that contains five EMP grenades and an EMP implant with three uses. Useful to disrupt communications, \ + security's energy weapons and silicon lifeforms when you're in a tight spot." item = /obj/item/storage/box/syndie_kit/emp cost = 2 @@ -963,7 +995,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/explosives/grenadier name = "Grenadier's belt" - desc = "A belt of a large variety of lethally dangerous and destructive grenades." + desc = "A belt containing 26 lethally dangerous and destructive grenades. Comes with an extra multitool and screwdriver." item = /obj/item/storage/belt/grenade/full include_modes = list(/datum/game_mode/nuclear) cost = 22 @@ -1050,7 +1082,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/support/reinforcement/assault_borg name = "Syndicate Assault Cyborg" - desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel." + desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. \ + Comes equipped with a self-resupplying LMG, a grenade launcher, energy sword, emag, pinpointer, flash and crowbar." item = /obj/item/antag_spawner/nuke_ops/borg_tele/assault refundable = TRUE cost = 65 @@ -1058,17 +1091,18 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/support/reinforcement/medical_borg name = "Syndicate Medical Cyborg" - desc = "A combat medic cyborg, with potent healing reagents and a medical beam gun, but limited offensive potential." + desc = "A combat medical cyborg. Has limited offensive potential, but makes more than up for it with its support capabilities. \ + It comes equipped with a nanite hypospray, a medical beamgun, combat defibrillator, full surgical kit including an energy saw, an emag, pinpointer and flash. \ + Thanks to its organ storage bag, it can perform surgery as well as any humanoid." item = /obj/item/antag_spawner/nuke_ops/borg_tele/medical refundable = TRUE cost = 35 restricted = TRUE /datum/uplink_item/support/gygax - name = "Gygax Exosuit" + name = "Dark Gygax Exosuit" desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent \ - for hit-and-run style attacks. This model lacks a method of space propulsion, and therefore it is \ - advised to utilize the drop pod if you wish to make use of it." + for hit-and-run style attacks. Features an incendiary carbine, flash bang launcher, teleporter, ion thrusters and a Tesla energy array." item = /obj/mecha/combat/gygax/dark/loaded cost = 80 @@ -1081,8 +1115,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/support/mauler name = "Mauler Exosuit" - desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring, \ - and deployable smoke." + desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring \ + and deployable smoke. Comes equipped with an LMG, scattershot carbine, missile rack, an antiprojectile armor booster and a Tesla energy array." item = /obj/mecha/combat/marauder/mauler/loaded cost = 140 @@ -1111,7 +1145,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/stealthy_tools/chameleon name = "Chameleon Kit" - desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more!" + desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \ + Due to budget cuts, the shoes don't provide protection against slipping." item = /obj/item/storage/box/syndie_kit/chameleon cost = 2 exclude_modes = list(/datum/game_mode/nuclear) @@ -1125,7 +1160,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/stealthy_tools/codespeak_manual name = "Codespeak Manual" - desc = "Syndicate agents can be trained to use a series of codewords to convey complex information, which sounds like random concepts and drinks to anyone listening. This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. This is the deluxe edition, which has unlimited used." + desc = "Syndicate agents can be trained to use a series of codewords to convey complex information, which sounds like random concepts and drinks to anyone listening. \ + This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. This is the deluxe edition, which has unlimited uses." item = /obj/item/codespeak_manual/unlimited cost = 3 @@ -1141,12 +1177,31 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/stealthy_tools/emplight name = "EMP Flashlight" - desc = "A small, self-charging, short-ranged EMP device disguised as a flashlight. \ - Useful for disrupting headsets, cameras, and borgs during stealth operations." + desc = "A small, self-recharging, short-ranged EMP device disguised as a working flashlight. \ + Useful for disrupting headsets, cameras, doors, lockers and borgs during stealth operations. \ + Attacking a target with this flashlight will direct an EM pulse at it and consumes a charge." item = /obj/item/flashlight/emp cost = 2 surplus = 30 +/datum/uplink_item/stealthy_tools/failsafe + name = "Failsafe Uplink Code" + desc = "When entered the uplink will self-destruct immidiately." + item = /obj/effect/gibspawner/generic + cost = 1 + surplus = 0 + restricted = TRUE + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + +/datum/uplink_item/stealthy_tools/failsafe/spawn_item(spawn_path, mob/user, datum/component/uplink/U) + if(!U) + return + U.failsafe_code = U.generate_code() + to_chat(user, "The new failsafe code for this uplink is now : [U.failsafe_code].") + if(user.mind) + user.mind.store_memory("Failsafe code for [U.parent] : [U.failsafe_code]") + return U.parent //For log icon + /datum/uplink_item/stealthy_tools/mulligan name = "Mulligan" desc = "Screwed up and have security on your tail? This handy syringe will give you a completely new identity \ @@ -1173,7 +1228,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/stealthy_tools/jammer name = "Radio Jammer" - desc = "This device will disrupt any nearby outgoing radio communication when activated." + desc = "This device will disrupt any nearby outgoing radio communication when activated. Does not affect binary chat." item = /obj/item/jammer cost = 5 @@ -1204,7 +1259,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/suits/space_suit name = "Syndicate Space Suit" - desc = "This red and black syndicate space suit is less encumbering than Nanotrasen variants, \ + desc = "This red and black Syndicate space suit is less encumbering than Nanotrasen variants, \ fits inside bags, and has a weapon slot. Nanotrasen crew members are trained to report red space suit \ sightings, however." item = /obj/item/storage/box/syndie_kit/space @@ -1212,7 +1267,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/suits/hardsuit name = "Syndicate Hardsuit" - desc = "The feared suit of a syndicate nuclear agent. Features slightly better armoring and a built in jetpack \ + desc = "The feared suit of a Syndicate nuclear agent. Features slightly better armoring and a built in jetpack \ that runs off standard atmospheric tanks. Toggling the suit in and out of \ combat mode will allow you all the mobility of a loose fitting uniform without sacrificing armoring. \ Additionally the suit is collapsible, making it small enough to fit within a backpack. \ @@ -1223,8 +1278,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/suits/hardsuit/elite name = "Elite Syndicate Hardsuit" - desc = "An upgraded, elite version of the syndicate hardsuit. It features fireproofing, and also \ - provides the user with superior armor and mobility compared to the standard syndicate hardsuit." + desc = "An upgraded, elite version of the Syndicate hardsuit. It features fireproofing, and also \ + provides the user with superior armor and mobility compared to the standard Syndicate hardsuit." item = /obj/item/clothing/suit/space/hardsuit/syndi/elite cost = 8 include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) @@ -1232,7 +1287,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/suits/hardsuit/shielded name = "Shielded Syndicate Hardsuit" - desc = "An upgraded version of the standard syndicate hardsuit. It features a built-in energy shielding system. \ + desc = "An upgraded version of the standard Syndicate hardsuit. It features a built-in energy shielding system. \ The shields can handle up to three impacts within a short duration and will rapidly recharge while not under fire." item = /obj/item/clothing/suit/space/hardsuit/shielded/syndi cost = 30 @@ -1245,15 +1300,15 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/cutouts name = "Adaptive Cardboard Cutouts" - desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. This pack contains three as well as a \ - crayon for changing their appearances." + desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. \ + This pack contains three as well as a crayon for changing their appearances." item = /obj/item/storage/box/syndie_kit/cutouts cost = 1 surplus = 20 /datum/uplink_item/device_tools/assault_pod name = "Assault Pod Targeting Device" - desc = "Use to select the landing zone of your assault pod." + desc = "Use this to select the landing zone of your assault pod." item = /obj/item/assault_pod cost = 30 surplus = 0 @@ -1298,8 +1353,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/camera_bug name = "Camera Bug" - desc = "Enables you to view all cameras on the network and track a target. Bugging cameras allows you \ - to disable them remotely." + desc = "Enables you to view all cameras on the main network, set up motion alerts and track a target. \ + Bugging cameras allows you to disable them remotely." item = /obj/item/camera_bug cost = 1 surplus = 90 @@ -1326,7 +1381,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/fakenucleardisk name = "Decoy Nuclear Authentication Disk" - desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. Don't try to give this to us to complete your objective, we know better!" + desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. \ + Don't try to give this to us to complete your objective, we know better!" item = /obj/item/disk/nuclear/fake cost = 1 surplus = 1 @@ -1334,7 +1390,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/frame name = "F.R.A.M.E. PDA Cartridge" desc = "When inserted into a personal digital assistant, this cartridge gives you five PDA viruses which \ - when used cause the targeted PDA to become a new uplink with zero TCs, and immediately become unlocked. \ + when used cause the targeted PDA to become a new uplink with zero TCs, and immediately become unlocked. \ You will receive the unlock code upon activating the virus, and the new uplink may be charged with \ telecrystals normally." item = /obj/item/cartridge/virus/frame @@ -1343,7 +1399,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/toolbox name = "Full Syndicate Toolbox" - desc = "The syndicate toolbox is a suspicious black and red. It comes loaded with a full tool set including a \ + desc = "The Syndicate toolbox is a suspicious black and red. It comes loaded with a full tool set including a \ multitool and combat gloves that are resistant to shocks and heat." item = /obj/item/storage/toolbox/syndicate cost = 1 @@ -1366,7 +1422,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/medgun name = "Medbeam Gun" desc = "A wonder of Syndicate engineering, the Medbeam gun, or Medi-Gun enables a medic to keep his fellow \ - operatives in the fight, even while under fire." + operatives in the fight, even while under fire. Don't cross the streams!" item = /obj/item/gun/medbeam cost = 15 include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) @@ -1388,9 +1444,9 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/powersink name = "Power Sink" - desc = "When screwed to wiring attached to a power grid and activated, this large device places excessive \ + desc = "When screwed to wiring attached to a power grid and activated, this large device lights up and places excessive \ load on the grid, causing a station-wide blackout. The sink is large and cannot be stored in most \ - traditional bags and boxes." + traditional bags and boxes. Caution: Will explode if the powernet contains sufficient amounts of energy." item = /obj/item/powersink cost = 6 @@ -1399,7 +1455,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes desc = "A radioactive microlaser disguised as a standard Nanotrasen health analyzer. When used, it emits a \ powerful burst of radiation, which, after a short delay, can incapacitate all but the most protected \ of humanoids. It has two settings: intensity, which controls the power of the radiation, \ - and wavelength, which controls how long the radiation delay is." + and wavelength, which controls the delay before the effect kicks in." item = /obj/item/healthanalyzer/rad_laser cost = 3 @@ -1414,7 +1470,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/medkit name = "Syndicate Combat Medic Kit" desc = "This first aid kit is a suspicious brown and red. Included is a combat stimulant injector \ - for rapid healing, a medical HUD for quick identification of injured personnel, \ + for rapid healing, a medical night vision HUD for quick identification of injured personnel, \ and other supplies helpful for a field medic." item = /obj/item/storage/firstaid/tactical cost = 4 @@ -1429,7 +1485,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/surgerybag_adv name = "Advanced Syndicate Surgery Duffel Bag" - desc = "The Syndicate surgery duffel bag is a toolkit containing all newest surgery tools, surgical drapes, \ + desc = "The Syndicate surgery duffel bag is a toolkit containing all advanced surgery tools, surgical drapes, \ a Syndicate brand MMI, a straitjacket, a muzzle, and a full Syndicate Combat Medic Kit." item = /obj/item/storage/backpack/duffelbag/syndie/surgery_adv cost = 10 @@ -1445,7 +1501,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/syndietome name = "Syndicate Tome" - desc = "Using rare artifacts acquired at great cost, the syndicate has reverse engineered \ + desc = "Using rare artifacts acquired at great cost, the Syndicate has reverse engineered \ the seemingly magical books of a certain cult. Though lacking the esoteric abilities \ of the originals, these inferior copies are still quite useful, being able to provide \ both weal and woe on the battlefield, even if they do occasionally bite off a finger." @@ -1464,7 +1520,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/potion name = "Syndicate Sentience Potion" item = /obj/item/slimepotion/slime/sentience/nuclear - desc = "A potion recovered at great risk by undercover syndicate operatives and then subsequently modified with syndicate technology. Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors." + desc = "A potion recovered at great risk by undercover Syndicate operatives and then subsequently modified with Syndicate technology. \ + Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors." cost = 2 include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) restricted = TRUE @@ -1478,7 +1535,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/implants/adrenal name = "Adrenal Implant" desc = "An implant injected into the body, and later activated at the user's will. It will inject a chemical \ - cocktail which has a mild healing effect along with removing all stuns and increasing movement speed." + cocktail which removes all incapacitating effects, lets the user run faster and has a mild healing effect." item = /obj/item/storage/box/syndie_kit/imp_adrenal cost = 8 player_minimum = 25 @@ -1517,28 +1574,30 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/implants/radio name = "Internal Syndicate Radio Implant" - desc = "An implant injected into the body, allowing the use of an internal syndicate radio. Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection." + desc = "An implant injected into the body, allowing the use of an internal Syndicate radio. \ + Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection." item = /obj/item/storage/box/syndie_kit/imp_radio cost = 4 restricted = TRUE /datum/uplink_item/implants/reviver name = "Reviver Implant" - desc = "This implant will attempt to revive you if you lose consciousness. Comes with an autosurgeon." + desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon." item = /obj/item/autosurgeon/reviver cost = 8 include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/implants/stealthimplant name = "Stealth Implant" - desc = "This one-of-a-kind implant will make you almost invisible if you play your cards right." + desc = "This one-of-a-kind implant will make you almost invisible as long as you don't don't excessively move around. \ + On activation, it will conceal you inside a chameleon cardboard box that is only revealed once someone bumps into it." item = /obj/item/implanter/stealth cost = 8 /datum/uplink_item/implants/storage name = "Storage Implant" desc = "An implant injected into the body, and later activated at the user's will. It will open a small bluespace \ - pocket capable of storing two items." + pocket capable of storing two regular-sized items." item = /obj/item/storage/box/syndie_kit/imp_storage cost = 8 @@ -1551,7 +1610,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/implants/uplink name = "Uplink Implant" - desc = "An implant injected into the body, and later activated at the user's will. Has no telecrystals, must be charged by the use of physical telecrystals. Undetectable (except via surgery), and excellent for escaping confinement." + desc = "An implant injected into the body, and later activated at the user's will. Has no telecrystals and must be charged by the use of physical telecrystals. \ + Undetectable (except via surgery), and excellent for escaping confinement." item = /obj/item/storage/box/syndie_kit/imp_uplink cost = 4 // An empty uplink is kinda useless. @@ -1610,7 +1670,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes with a minimum of 60 seconds, and can be bolted to the floor with a wrench to prevent \ movement. The bomb is bulky and cannot be moved; upon ordering this item, a smaller beacon will be \ transported to you that will teleport the actual bomb to it upon activation. Note that this bomb can \ - be defused, and some crew may attempt to do so." + be defused, and some crew may attempt to do so. \ + The bomb core can be pried out and manually detonated with other explosives." item = /obj/item/sbeacondrop/clownbomb cost = 15 restricted_roles = list("Clown") @@ -1638,7 +1699,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/role_restricted/haunted_magic_eightball name = "Haunted Magic Eightball" - desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. Be warned, that spirits are often capricious or just little assholes. To use, simply speak your question aloud, then begin shaking." + desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. \ + Be warned, that spirits are often capricious or just little assholes. To use, simply speak your question aloud, then begin shaking." item = /obj/item/toy/eightball/haunted cost = 2 restricted_roles = list("Curator") @@ -1657,14 +1719,16 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/role_restricted/explosive_hot_potato name = "Exploding Hot Potato" - desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead." + desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. \ + The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead." item = /obj/item/hot_potato/syndicate cost = 4 restricted_roles = list("Cook", "Botanist", "Clown", "Mime") /datum/uplink_item/role_restricted/ez_clean_bundle name = "EZ Clean Grenade Bundle" - desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. The acid only affects carbon-based creatures." + desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. \ + The acid only affects carbon-based creatures." item = /obj/item/storage/box/syndie_kit/ez_clean cost = 6 surplus = 20 @@ -1679,7 +1743,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/role_restricted/mimery name = "Guide to Advanced Mimery Series" - desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. Obviously only works for Mimes." + desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. \ + Obviously only works for Mimes." cost = 12 item = /obj/item/storage/box/syndie_kit/mimery restricted_roles = list("Mime") @@ -1694,7 +1759,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/role_restricted/pressure_mod name = "Kinetic Accelerator Pressure Mod" - desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity." + desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. \ + Occupies 35% mod capacity." item = /obj/item/borg/upgrade/modkit/indoors cost = 5 //you need two for full damage, so total of 10 for maximum damage limited_stock = 2 //you can't use more than two! @@ -1702,7 +1768,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/role_restricted/kitchen_gun name = "Kitchen Gun (TM)" - desc = "A revolutionary .45 caliber cleaning solution! Say goodbye to daily stains and dirty surfaces with Kitchen Gun (TM)! Just five shots from Kitchen Gun (TM), and it'll sparkle like new! Includes two extra ammunition clips!" + desc = "A revolutionary .45 caliber cleaning solution! Say goodbye to daily stains and dirty surfaces with Kitchen Gun (TM)! \ + Just five shots from Kitchen Gun (TM), and it'll sparkle like new! Includes two extra ammunition clips!" cost = 10 surplus = 40 restricted_roles = list("Cook", "Janitor") @@ -1717,7 +1784,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/role_restricted/magillitis_serum name = "Magillitis Serum Autoinjector" - desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." + desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. \ + Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." item = /obj/item/reagent_containers/hypospray/magillitis cost = 15 restricted_roles = list("Geneticist", "Chief Medical Officer") @@ -1767,7 +1835,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/badass/costumes/obvious_chameleon name = "Broken Chameleon Kit" - desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! Please note that this kit did NOT pass quality control." + desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \ + Please note that this kit did NOT pass quality control." item = /obj/item/storage/box/syndie_kit/chameleon/broken /datum/uplink_item/badass/costumes @@ -1777,7 +1846,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/badass/costumes/centcom_official name = "CentCom Official Costume" - desc = "Ask the crew to \"inspect\" their nuclear disk and weapons system, and then when they decline, pull out a fully automatic rifle and gun down the Captain. Radio headset does not include key. No gun included." + desc = "Ask the crew to \"inspect\" their nuclear disk and weapons system, and then when they decline, pull out a fully automatic rifle and gun down the Captain. \ + Radio headset does not include encryption key. No gun included." item = /obj/item/storage/box/syndie_kit/centcom_costume /datum/uplink_item/badass/costumes/clown diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index a5ba06e6fb..137242c547 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -45,7 +45,7 @@ var/datum/component/riding/D = GetComponent(/datum/component/riding) //1.5 (movespeed as of this change) multiplied by 6.7 gets ABOUT 10 (rounded), the old constant for the wheelchair that gets divided by how many arms they have //if that made no sense this simply makes the wheelchair speed change along with movement speed delay - D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / min(user.get_num_arms(), 2) + D.vehicle_move_delay = round((CONFIG_GET(number/movedelay/run_delay) * 4) / min(user.get_num_arms(), 2), world.tick_lag) return ..() /obj/vehicle/ridden/wheelchair/Moved() diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index 9aa11c7bfb..4594048256 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -23,6 +23,7 @@ /obj/item/seeds/lime = 3, /obj/item/seeds/onion = 3, /obj/item/seeds/orange = 3, + /obj/item/seeds/peanutseed = 3, /obj/item/seeds/pineapple = 3, /obj/item/seeds/potato = 3, /obj/item/seeds/poppy = 3, diff --git a/html/changelogs/AutoChangeLog-pr-8632.yml b/html/changelogs/AutoChangeLog-pr-8632.yml new file mode 100644 index 0000000000..b2f74869c2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8632.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - rscadd: "Traitor codewords are now highlighted for traitors." diff --git a/html/changelogs/AutoChangeLog-pr-8663.yml b/html/changelogs/AutoChangeLog-pr-8663.yml new file mode 100644 index 0000000000..3f5aeacd3c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8663.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Adding in peanuts, peanut butter, peanut butter toasts and sandwiches, and the PB&J sandwich. +The peanuts contain a little bit of extractable cooking oil (similarly to soy beans) and can be microwaved or dried in a drying rack to make roasted peanuts, which can be mixed in a all-in-one-grinder for peanut butter, required to make those sandwiches." diff --git a/html/changelogs/AutoChangeLog-pr-8709.yml b/html/changelogs/AutoChangeLog-pr-8709.yml new file mode 100644 index 0000000000..4aa6fd9b1d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8709.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - bugfix: "A bunch of minor issues with xenobiology are no more!" diff --git a/html/changelogs/AutoChangeLog-pr-8734.yml b/html/changelogs/AutoChangeLog-pr-8734.yml new file mode 100644 index 0000000000..4f746c4cd5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8734.yml @@ -0,0 +1,5 @@ +author: "Ghommie (original PR by coiax)" +delete-after: True +changes: + - code_imp: "Randomly coloured gloves and randomly coloured glowsticks now have +slightly different typepaths, but otherwise function the same." diff --git a/html/changelogs/AutoChangeLog-pr-8740.yml b/html/changelogs/AutoChangeLog-pr-8740.yml new file mode 100644 index 0000000000..1966f34331 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8740.yml @@ -0,0 +1,5 @@ +author: "Ghommie (original PR by Denton)" +delete-after: True +changes: + - tweak: "Nanotrasen has started shipping more types of bedsheets to its stations." + - rscadd: "Added in Runtime, Pirate and Gondola bedsheets. The second one can also be found in some pirate ships, while the last can be crafted from gondola hides." diff --git a/html/changelogs/AutoChangeLog-pr-8750.yml b/html/changelogs/AutoChangeLog-pr-8750.yml new file mode 100644 index 0000000000..a3ff5e8a91 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8750.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - bugfix: "Fixes brain damage/trauma healing nanites so they actually work while there are only traumas." diff --git a/html/changelogs/AutoChangeLog-pr-8761.yml b/html/changelogs/AutoChangeLog-pr-8761.yml new file mode 100644 index 0000000000..4ee792c3a6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8761.yml @@ -0,0 +1,5 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "melee and block harm" + - bugfix: "sprites*" diff --git a/html/changelogs/AutoChangeLog-pr-8765.yml b/html/changelogs/AutoChangeLog-pr-8765.yml new file mode 100644 index 0000000000..2cac0773ad --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8765.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "Merges the end-of-shift and its shuttle autocall announcements into one." + - bugfix: "Prevents the end-of-shift shuttle from being recalled (even if to no avail)." diff --git a/html/changelogs/AutoChangeLog-pr-8790.yml b/html/changelogs/AutoChangeLog-pr-8790.yml new file mode 100644 index 0000000000..0c0e6cd116 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8790.yml @@ -0,0 +1,6 @@ +author: "Bhijn" +delete-after: True +changes: + - rscadd: "It's now possible to forcefully eject the occupants of a dogborg's sleeper by using a crowbar on them. This action is instant." + - tweak: "Resist values for dogborg sleepers have been adjusted. The baseline has been decreased from 30 seconds to 15 seconds. Medihound sleepers have a resist timer of 3 seconds. Sechound sleepers retain a resist timer of 30 seconds." + - tweak: "It now takes 10 full seconds to insert people into your sleeper. This should hopefully give people some more room to breathe and react to a dogborg attempting to sleeper someone either for no reason or in a way that violates law 2." diff --git a/html/changelogs/AutoChangeLog-pr-8794.yml b/html/changelogs/AutoChangeLog-pr-8794.yml new file mode 100644 index 0000000000..612a3e655b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8794.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixing the `(pointless) badassary` category appearing between the `dangerous and conspicious` and `stealthy and inconspicious` categories." + - bugfix: "Combat gloves plus now properly use the combat gloves sprite." diff --git a/html/changelogs/AutoChangeLog-pr-8800.yml b/html/changelogs/AutoChangeLog-pr-8800.yml new file mode 100644 index 0000000000..7b397ec23e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8800.yml @@ -0,0 +1,4 @@ +author: "Sishen1542, original by Skoglol" +delete-after: True +changes: + - rscadd: "Heaters/freezers now support ctrl clicking to turn on and alt clicking to min/max target temperature." diff --git a/html/changelogs/AutoChangeLog-pr-8802.yml b/html/changelogs/AutoChangeLog-pr-8802.yml new file mode 100644 index 0000000000..b97119c32d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8802.yml @@ -0,0 +1,6 @@ +author: "Ghommie (original PRs by ShizCalev, MrDoombringer, AnturK, bgobandit, 81Denton and actioninja)" +delete-after: True +changes: + - rscadd: "Failsafe codes for uplinks are now available for purchase." + - rscadd: "Nuke Ops now have the ability to purchase a usable RPG, the PML-9, as well as a couple different types of rockets for it. you can also suicide rocket jump with them!" + - spellcheck: "Improved Uplink item descriptions and formatting." diff --git a/html/changelogs/AutoChangeLog-pr-8805.yml b/html/changelogs/AutoChangeLog-pr-8805.yml new file mode 100644 index 0000000000..8abefd9ce2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8805.yml @@ -0,0 +1,4 @@ +author: "Linzolle" +delete-after: True +changes: + - bugfix: "supply display are now properly on the wall" diff --git a/html/changelogs/AutoChangeLog-pr-8812.yml b/html/changelogs/AutoChangeLog-pr-8812.yml new file mode 100644 index 0000000000..0de67cfe59 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8812.yml @@ -0,0 +1,4 @@ +author: "Sishen1542, original by XDTM" +delete-after: True +changes: + - rscadd: "Using the wrong surgery tool during surgery no longer attacks the patient, if on help or disarm intent." diff --git a/html/changelogs/AutoChangeLog-pr-8819.yml b/html/changelogs/AutoChangeLog-pr-8819.yml new file mode 100644 index 0000000000..0b750fccb6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8819.yml @@ -0,0 +1,4 @@ +author: "Sishen1542" +delete-after: True +changes: + - rscadd: "Added public autolathes to all maps." diff --git a/html/changelogs/AutoChangeLog-pr-8820.yml b/html/changelogs/AutoChangeLog-pr-8820.yml new file mode 100644 index 0000000000..3e83e29cc3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8820.yml @@ -0,0 +1,4 @@ +author: "Ghommie (original PR by variableundefined)" +delete-after: True +changes: + - bugfix: "Cancel button to assault pod destination selector." diff --git a/html/changelogs/AutoChangeLog-pr-8821.yml b/html/changelogs/AutoChangeLog-pr-8821.yml new file mode 100644 index 0000000000..f45caba949 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8821.yml @@ -0,0 +1,7 @@ +author: "Ghommie (original PRs by ShizCalev)" +delete-after: True +changes: + - tweak: "Corgi collars can now be removed!" + - tweak: "Updated the corgi & parrot inventory panels to use the same formatting as other mobs" + - bugfix: "Fixed corgi inventory panels not closing properly." + - bugfix: "Fixed the parrot inventory panel not closing properly if you're not able to interact with it." diff --git a/html/changelogs/AutoChangeLog-pr-8823.yml b/html/changelogs/AutoChangeLog-pr-8823.yml new file mode 100644 index 0000000000..b334bfbd7e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8823.yml @@ -0,0 +1,4 @@ +author: "Ghommie (Original PR by tralezab)" +delete-after: True +changes: + - bugfix: "Fixes an issue with spontaneous appendicitis picking incompatible mob biotypes." diff --git a/html/changelogs/AutoChangeLog-pr-8824.yml b/html/changelogs/AutoChangeLog-pr-8824.yml new file mode 100644 index 0000000000..6a12573112 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8824.yml @@ -0,0 +1,4 @@ +author: "Ghommie (original PR by Mickyan)" +delete-after: True +changes: + - bugfix: "Fixed being unable to smother people using the damp rag" diff --git a/html/changelogs/AutoChangeLog-pr-8825.yml b/html/changelogs/AutoChangeLog-pr-8825.yml new file mode 100644 index 0000000000..a56be4e2ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8825.yml @@ -0,0 +1,6 @@ +author: "Ghommie (original PR by MrDoomBringer, AnturK and YPOQ)" +delete-after: True +changes: + - bugfix: "Explosions will no longer damage wizards in rod form, the supermatter monitoring radio and megafauna GPS." + - bugfix: "Supplypods no longer detonate their contents." + - bugfix: "Fixed silicon items (e.g. cyborg modules) being destroyed by explosion epicenters." diff --git a/html/changelogs/AutoChangeLog-pr-8826.yml b/html/changelogs/AutoChangeLog-pr-8826.yml new file mode 100644 index 0000000000..3f7520b84e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8826.yml @@ -0,0 +1,9 @@ +author: "Ghommie (original PR by Skoglol)" +delete-after: True +changes: + - code_imp: "New helper proc for alt-click turf listing, bypasses any interaction overrides." + - code_imp: "Ghosts and revenants now use the new proc." + - bugfix: "Ghosts can no longer toggleopen sleepers, adjust skateboard speed or close laptops" + - bugfix: "Revenant can now alt-click turf to list contents." + - tweak: "Revenant now slightly less nosy, use shift click to examine." + - tweak: "Alt-clicking the same turf again no longer closes the turf listing tab." diff --git a/html/changelogs/AutoChangeLog-pr-8827.yml b/html/changelogs/AutoChangeLog-pr-8827.yml new file mode 100644 index 0000000000..e1aaadd698 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8827.yml @@ -0,0 +1,4 @@ +author: "Ghommie (original PR by ninjanomnom)" +delete-after: True +changes: + - bugfix: "Gaps between sounds in some looping sound effects should no longer happen as much under heavy server lag." diff --git a/html/changelogs/AutoChangeLog-pr-8828.yml b/html/changelogs/AutoChangeLog-pr-8828.yml new file mode 100644 index 0000000000..4278a14ae1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8828.yml @@ -0,0 +1,4 @@ +author: "Ghommie (original PR by Skoglol)" +delete-after: True +changes: + - bugfix: "Reduced ventcrawl lag greatly." diff --git a/html/changelogs/AutoChangeLog-pr-8834.yml b/html/changelogs/AutoChangeLog-pr-8834.yml new file mode 100644 index 0000000000..0b7a7b30c5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8834.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixes the space ninja's energy netting." diff --git a/html/changelogs/AutoChangeLog-pr-8835.yml b/html/changelogs/AutoChangeLog-pr-8835.yml new file mode 100644 index 0000000000..cf646b879b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8835.yml @@ -0,0 +1,4 @@ +author: "Linzolle" +delete-after: True +changes: + - tweak: "consistency in hop and cap berets" diff --git a/html/changelogs/AutoChangeLog-pr-8841.yml b/html/changelogs/AutoChangeLog-pr-8841.yml new file mode 100644 index 0000000000..8bb73dac26 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8841.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Adding one pAI to the wizard shuttle and ERT prep room" diff --git a/html/changelogs/AutoChangeLog-pr-8842.yml b/html/changelogs/AutoChangeLog-pr-8842.yml new file mode 100644 index 0000000000..8a8903b7e5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8842.yml @@ -0,0 +1,4 @@ +author: "UristMcAstronaut" +delete-after: True +changes: + - bugfix: "allows a pai to activate its holoform while in a pai connector without getting derped." diff --git a/html/changelogs/AutoChangeLog-pr-8843.yml b/html/changelogs/AutoChangeLog-pr-8843.yml new file mode 100644 index 0000000000..74a3cc07e8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8843.yml @@ -0,0 +1,4 @@ +author: "Coolgat3" +delete-after: True +changes: + - imageadd: "added combat boots sprite" diff --git a/html/changelogs/AutoChangeLog-pr-8844.yml b/html/changelogs/AutoChangeLog-pr-8844.yml new file mode 100644 index 0000000000..05f0f2fb22 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8844.yml @@ -0,0 +1,6 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixes the rocket launcher being unreloadable." + - balance: "Buffed its accuracy a bit." + - tweak: "Replaced the grenade launcher emagged minesweeper loot with the rocket launcher like it was originally supposed to be." diff --git a/html/changelogs/AutoChangeLog-pr-8846.yml b/html/changelogs/AutoChangeLog-pr-8846.yml new file mode 100644 index 0000000000..26b1dad6d5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8846.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Rubber Toolboxes." diff --git a/html/changelogs/AutoChangeLog-pr-8847.yml b/html/changelogs/AutoChangeLog-pr-8847.yml new file mode 100644 index 0000000000..678b3d433b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8847.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Porting in two bar signs: Cyber Sylph's and Meow Mix." diff --git a/html/changelogs/AutoChangeLog-pr-8852.yml b/html/changelogs/AutoChangeLog-pr-8852.yml new file mode 100644 index 0000000000..4d49f26831 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8852.yml @@ -0,0 +1,4 @@ +author: "Tupinambis" +delete-after: True +changes: + - imagedel: "Removes a moth plush from the game." diff --git a/html/changelogs/AutoChangeLog-pr-8853.yml b/html/changelogs/AutoChangeLog-pr-8853.yml new file mode 100644 index 0000000000..1507e8620d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8853.yml @@ -0,0 +1,6 @@ +author: "Ghommie (original PRs by Naksu and coiax, loser)" +delete-after: True +changes: + - code_imp: "Cleaned up saycode" + - bugfix: "Taking mutadone while having the communication disorder brain trauma will no longer spam your chat with messages." + - rscadd: "IPCs now come with a subtype of robotic tongue without the omnilingual ability, instead of innately having robotic voice spans." diff --git a/html/changelogs/AutoChangeLog-pr-8854.yml b/html/changelogs/AutoChangeLog-pr-8854.yml new file mode 100644 index 0000000000..fc45d2087e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8854.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixing stamina damage melee weaponry being unusable by pacifists, and still damaging objects and triggering electrified grilles when thrown." diff --git a/html/changelogs/AutoChangeLog-pr-8858.yml b/html/changelogs/AutoChangeLog-pr-8858.yml new file mode 100644 index 0000000000..6fc057f88d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8858.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - bugfix: "Made unholy water healtoxinlover" diff --git a/html/changelogs/AutoChangeLog-pr-8860.yml b/html/changelogs/AutoChangeLog-pr-8860.yml new file mode 100644 index 0000000000..95593b1dad --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8860.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Zelus Oil, brass flasks" diff --git a/html/changelogs/AutoChangeLog-pr-8870.yml b/html/changelogs/AutoChangeLog-pr-8870.yml new file mode 100644 index 0000000000..08c9860a30 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8870.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "Toned down many species' female chest sprites to fit the smaller cups." + - bugfix: "Fixed some body parts sprites inconsistencies, such as the W/E female and male chest sprites being the same in some species, and jellypeople's legs being one tile off on W/E" diff --git a/html/changelogs/AutoChangeLog-pr-8872.yml b/html/changelogs/AutoChangeLog-pr-8872.yml new file mode 100644 index 0000000000..a79ec48298 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8872.yml @@ -0,0 +1,5 @@ +author: "deathride58" +delete-after: True +changes: + - balance: "Normal mops now only use 2 stamina to mop a tile, nerfed from their previous value of 5 stamina per tile mopped." + - balance: "Advanced mops now only use 1 stamina to mop turfs, from their former value of 2 stam." diff --git a/icons/emoji.dmi b/icons/emoji.dmi index 128a3b243c..089c0ff3f8 100644 Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index 70aeba6a69..fc6fafb275 100644 Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 3bb3874d35..7f10d992bc 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/inhands/equipment/shields_lefthand.dmi b/icons/mob/inhands/equipment/shields_lefthand.dmi index e9d0dd0d2b..3f29410f98 100644 Binary files a/icons/mob/inhands/equipment/shields_lefthand.dmi and b/icons/mob/inhands/equipment/shields_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/shields_righthand.dmi b/icons/mob/inhands/equipment/shields_righthand.dmi index dda17156fe..2c3f291e43 100644 Binary files a/icons/mob/inhands/equipment/shields_righthand.dmi and b/icons/mob/inhands/equipment/shields_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_lefthand.dmi b/icons/mob/inhands/equipment/toolbox_lefthand.dmi index b2fa42ce5e..801df7abb8 100644 Binary files a/icons/mob/inhands/equipment/toolbox_lefthand.dmi and b/icons/mob/inhands/equipment/toolbox_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_righthand.dmi b/icons/mob/inhands/equipment/toolbox_righthand.dmi index ccb15982dd..f38ddfc9a4 100644 Binary files a/icons/mob/inhands/equipment/toolbox_righthand.dmi and b/icons/mob/inhands/equipment/toolbox_righthand.dmi differ diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi index 3463065bc7..5eb270d23f 100644 Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 24ede3c513..6282e555fa 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi index 50bfbace89..2c4d401088 100644 Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi index 73dcad452b..1cc99e09e9 100644 Binary files a/icons/obj/bedsheets.dmi and b/icons/obj/bedsheets.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index db0634181b..8d7bd55426 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index dc3aca6b19..7822cdb8c2 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi index c40dfaaa22..cd7fc1742b 100644 Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index ad3073a140..f64dfd4740 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 6292f7e21a..92b5203f5d 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi index 9fc1520175..63cf069186 100644 Binary files a/icons/obj/hydroponics/growing_vegetables.dmi and b/icons/obj/hydroponics/growing_vegetables.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index 054aa47bbd..a1ab5b08e5 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index 4c898aecd3..5a2088c332 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index 586bca61aa..9048739e0c 100644 Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index bff1b631c3..ad1d34836d 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 9037bfc0d0..2a6ec3955a 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/modular_citadel/code/controllers/subsystem/shuttle.dm b/modular_citadel/code/controllers/subsystem/shuttle.dm index bb4592f819..ce3f062bdd 100644 --- a/modular_citadel/code/controllers/subsystem/shuttle.dm +++ b/modular_citadel/code/controllers/subsystem/shuttle.dm @@ -1,6 +1,7 @@ -/datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end after 3 hours has passed. - if((world.realtime - SSshuttle.realtimeofstart) > auto_call && EMERGENCY_IDLE_OR_RECALLED) //3 hours - SSshuttle.emergency.request() - priority_announce("The shift has come to an end and the shuttle called.") +/datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end after 2 hours have passed. + if((world.realtime - SSshuttle.realtimeofstart) > auto_call && EMERGENCY_IDLE_OR_RECALLED) //2 hours + SSshuttle.emergency.request(silent = TRUE) + priority_announce("The shift has come to an end and the shuttle called. [seclevel2num(get_security_level()) == SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [emergency.timeLeft(600)] minutes.", null, 'sound/ai/shuttlecalled.ogg', "Priority") log_game("Round time limit reached. Shuttle has been auto-called.") message_admins("Round time limit reached. Shuttle called.") + emergencyNoRecall = TRUE diff --git a/modular_citadel/code/modules/admin/chat_commands.dm b/modular_citadel/code/modules/admin/chat_commands.dm index deb3de589e..918b1dda5a 100644 --- a/modular_citadel/code/modules/admin/chat_commands.dm +++ b/modular_citadel/code/modules/admin/chat_commands.dm @@ -4,7 +4,7 @@ /datum/tgs_chat_command/wheelofsalt/Run(datum/tgs_chat_user/sender, params) var/saltresult = "The wheel of salt [pick("clatters","screams","vibrates","clanks","resonates","groans","moans","squeaks","emits a[pick(" god-forsaken"," lewd"," creepy"," generic","n orgasmic"," demonic")] [pick("airhorn","bike horn","trumpet","clown","latex","vore","dog","laughing")] noise")] as it spins violently... And it seems the salt of the day is the " - var/saltprimarysubject = "[pick("combat","medical","grab","furry","wall","orgasm","cat","ERP","lizard","dog","latex","vision cone","atmospherics","table","chem","vore","dogborg","Skylar Lineman","Mekhi Anderson","Peppermint","rework","cum","dick","cockvore","Medihound","sleeper","belly sleeper","door wires","flightsuit","coder privilege","Developer abuse","ban reason","github self merge","red panda","beret","male catgirl","powergame","hexacrocin","Discord server","Clitadel","Cargonia","Solarian Republic","Main and RP merger","bluespace","salt","chem dispenser theft","Botany","moth","BWOINK","anal vore","stamina","Mason Jakops","mining","noodle","milf","Lavaland","Necropolis","Ashwalker","Chase Redtail","Drew Mint","Pavel Marsk","Jecca Qua","Joker Amari","Durgit","chaplain","Antag","nanite","Syndicate","Nar-Sie","Ratvar","Cult","maint","Foam-Force","AI","cyborg","ghost","clockwork","cyberpunk","vaporwave","Clown","Leon Beech","Mime","security","research","Megafauna","Bubblegum","Ash Drake","Legion","Colossus","White Shuttle","Changeling","Cowboy","Space Ninja","Poly","Revolutionary","Skyrim","forbidden fruits","xenomorph","blob","Nuclear Operative","crossdressing")]" + var/saltprimarysubject = "[pick("combat","medical","grab","furry","wall","orgasm","cat","ERP","lizard","dog","latex","vision cone","atmospherics","table","chem","vore","dogborg","Skylar Lineman","Mekhi Anderson","Peppermint","rework","cum","dick","cockvore","Medihound","sleeper","belly sleeper","door wires","flightsuit","coder privilege","Developer abuse","ban reason","github self merge","red panda","beret","male catgirl","powergame","hexacrocin","Discord server","Clitadel","Cargonia","Solarian Republic","Main and RP merger","bluespace","salt","chem dispenser theft","Botany","moth","BWOINK","anal vore","stamina","Mason Jakops","mining","noodle","milf","Lavaland","Necropolis","Ashwalker","Chase Redtail","Drew Mint","Pavel Marsk","Joker Amari","Durgit","chaplain","Antag","nanite","Syndicate","Nar-Sie","Ratvar","Cult","maint","Foam-Force","AI","cyborg","ghost","clockwork","cyberpunk","vaporwave","Clown","Leon Beech","Mime","security","research","Megafauna","Bubblegum","Ash Drake","Legion","Colossus","White Shuttle","Changeling","Cowboy","Space Ninja","Poly","Revolutionary","Skyrim","forbidden fruits","xenomorph","blob","Nuclear Operative","crossdressing")]" var/saltsecondarysubject = "[pick("rework","changes","r34","ban","removal","addition","leak","proposal","fanart","introduction","tabling","ERP","bikeshedding","crossdressing","sprites","semen keg","argument","theft","nerf","screeching","salt","creampie","lewding","murder","kissing","marriage","replacement","fucking","ship","netflix adaptation","dance","remaster","system","voyeur","decoration","pre-order","bukkake","seduction","worship","gangbang","handholding")]" if(prob(10)) saltresult += "@here for your salt, all day every day" diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index ab03e83b44..347f1fffea 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -423,8 +423,15 @@ datum/gear/darksabresheath path = /obj/item/clothing/under/trendy_fit ckeywhitelist = list("midgetdragon") +/datum/gear/singery + name = "Yellow Performer Outfit" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/singery + ckeywhitelist = list("maxlynchy") + /datum/gear/csheet name = "NT Bedsheet" category = SLOT_NECK path = /obj/item/bedsheet/captain - ckeywhitelist = list("tikibomb") \ No newline at end of file + ckeywhitelist = list("tikibomb") + diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm index bbbe863ec2..25b8daf2cb 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -11,6 +11,7 @@ mutant_bodyparts = list("ipc_screen", "ipc_antenna") default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None") meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc + mutanttongue = /obj/item/organ/tongue/robot/ipc exotic_blood = "oil" @@ -27,9 +28,6 @@ screen.Remove(C) ..() -/datum/species/ipc/get_spans() - return SPAN_ROBOT - /datum/action/innate/monitor_change name = "Screen Change" check_flags = AB_CHECK_CONSCIOUS diff --git a/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm b/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm index 2bfd63a25d..78e18fdb5e 100644 --- a/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm +++ b/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm @@ -41,6 +41,10 @@ devourable = TRUE digestable = TRUE +/mob/living/simple_animal/kiwi + devourable = TRUE + digestable = TRUE + //STATION PETS /mob/living/simple_animal/pet devourable = TRUE @@ -65,7 +69,6 @@ /mob/living/simple_animal/sloth devourable = TRUE digestable = TRUE - feeding = TRUE /mob/living/simple_animal/parrot devourable = TRUE @@ -84,57 +87,48 @@ /mob/living/simple_animal/hostile/lizard devourable = TRUE digestable = TRUE + feeding = TRUE + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/alien - devourable = TRUE - digestable = TRUE feeding = TRUE vore_active = TRUE isPredator = TRUE vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/bear - devourable = TRUE - digestable = TRUE feeding = TRUE vore_active = TRUE isPredator = TRUE vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/poison/giant_spider - devourable = TRUE - digestable = TRUE feeding = TRUE vore_active = TRUE + isPredator = TRUE vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/retaliate/poison/snake - devourable = TRUE - digestable = TRUE feeding = TRUE vore_active = TRUE isPredator = TRUE vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/gorilla - devourable = TRUE - digestable = TRUE feeding = TRUE vore_active = TRUE isPredator = TRUE vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/asteroid/goliath - devourable = TRUE - digestable = TRUE - feeding = TRUE + feeding = TRUE //for pet Goliaths I guess or something. vore_active = TRUE isPredator = TRUE vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/carp - devourable = TRUE - digestable = TRUE feeding = TRUE vore_active = TRUE isPredator = TRUE diff --git a/modular_citadel/code/modules/projectiles/gun.dm b/modular_citadel/code/modules/projectiles/gun.dm index ea8af7c74c..317f68b4c4 100644 --- a/modular_citadel/code/modules/projectiles/gun.dm +++ b/modular_citadel/code/modules/projectiles/gun.dm @@ -9,13 +9,3 @@ return 0 else return ..() - -/obj/item/gun/proc/getinaccuracy(mob/living/user) - if(!iscarbon(user)) - return 0 - else - var/mob/living/carbon/holdingdude = user - if(istype(holdingdude) && holdingdude.combatmode) - return max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0) - else - return weapon_weight * 25 diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi index 5f72d1013b..1e12d2bf1a 100644 Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ diff --git a/sound/vehicles/rocketlaunch.ogg b/sound/vehicles/rocketlaunch.ogg new file mode 100644 index 0000000000..d0ee9c7248 Binary files /dev/null and b/sound/vehicles/rocketlaunch.ogg differ diff --git a/strings/traumas.json b/strings/traumas.json index f83a023491..81b4fbe902 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -132,7 +132,8 @@ "ahelp help security powergaming with mindshields???", ";,g absorbing @pick(roles)", ";chemist can u @pick(create_verbs) holy @pick(mellens) for @pick(s_roles)???!!", - "@pick(semicolon) LIZZARRD SPEAKIGN IN EVIL BULL LANGUAGE SCI!!" + "@pick(semicolon) LIZZARRD SPEAKIGN IN EVIL BULL LANGUAGE SCI!!", + "@pick(semicolon)POST REBOOT MESSAGE LOLOL FUCK FUCK FUCK YOU" ], "mutations": [ @@ -295,4 +296,4 @@ "bluh daymon", "wizzerd" ] -} \ No newline at end of file +} diff --git a/tgstation.dme b/tgstation.dme index bb47c443ff..3a14a0700b 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -336,6 +336,7 @@ #include "code\datums\components\_component.dm" #include "code\datums\components\anti_magic.dm" #include "code\datums\components\armor_plate.dm" +#include "code\datums\components\bouncy.dm" #include "code\datums\components\butchering.dm" #include "code\datums\components\caltrop.dm" #include "code\datums\components\chasm.dm" @@ -444,8 +445,8 @@ #include "code\datums\helper_datums\icon_snapshot.dm" #include "code\datums\helper_datums\teleport.dm" #include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\looping_sounds\_looping_sound.dm" #include "code\datums\looping_sounds\item_sounds.dm" -#include "code\datums\looping_sounds\looping_sound.dm" #include "code\datums\looping_sounds\machinery_sounds.dm" #include "code\datums\looping_sounds\weather.dm" #include "code\datums\martial\boxing.dm" @@ -1719,6 +1720,7 @@ #include "code\modules\hydroponics\grown\mushrooms.dm" #include "code\modules\hydroponics\grown\nettle.dm" #include "code\modules\hydroponics\grown\onion.dm" +#include "code\modules\hydroponics\grown\peanuts.dm" #include "code\modules\hydroponics\grown\pineapple.dm" #include "code\modules\hydroponics\grown\potato.dm" #include "code\modules\hydroponics\grown\pumpkin.dm"