diff --git a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fishinghole.dmm b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fishinghole.dmm new file mode 100644 index 000000000000..277d2d79154d --- /dev/null +++ b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fishinghole.dmm @@ -0,0 +1,648 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ag" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair/stool/bamboo, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"ak" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/trashbin, +/obj/effect/turf_decal/pool, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/template_noop) +"bv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/pool{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/template_noop) +"eW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/pool{ + dir = 1 + }, +/turf/open/floor/wood, +/area/template_noop) +"hn" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair/stool/bamboo, +/obj/structure/chair/stool/bamboo, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"kF" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/green/filled/line, +/turf/open/floor/plasteel/white, +/area/template_noop) +"lf" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/obj/structure/railing/corner, +/turf/open/floor/wood, +/area/template_noop) +"li" = ( +/turf/open/water/safe, +/area/template_noop) +"nH" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken, +/obj/machinery/vending/dinnerware, +/turf/open/floor/plasteel/blackwhite, +/area/template_noop) +"of" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/trashbin, +/turf/open/floor/plasteel/blackwhite, +/area/template_noop) +"oW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/wood, +/area/template_noop) +"pj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/template_noop) +"qR" = ( +/obj/effect/spawner/lootdrop/trashbin, +/turf/open/water/safe, +/area/template_noop) +"rS" = ( +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"sb" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/railing, +/turf/open/floor/wood, +/area/template_noop) +"tg" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/twohanded/fishingrod, +/obj/structure/rack, +/obj/item/poster/random_contraband, +/obj/item/picket_sign, +/obj/item/picket_sign, +/obj/item/picket_sign, +/obj/item/picket_sign, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/template_noop) +"tw" = ( +/obj/machinery/griddle, +/obj/item/reagent_containers/food/snacks/deadmouse, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/blackwhite, +/area/template_noop) +"tO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/glass, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"uj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/table/glass, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"vX" = ( +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/template_noop) +"wk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/template_noop) +"xi" = ( +/obj/item/reagent_containers/food/snacks/fish/goldfish{ + bitecount = 0; + length = 1; + weight = 2 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/pool{ + dir = 4 + }, +/turf/open/floor/wood, +/area/template_noop) +"xG" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/grill, +/turf/open/floor/plasteel/blackwhite, +/area/template_noop) +"yw" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/pool{ + dir = 4 + }, +/turf/open/floor/wood, +/area/template_noop) +"zC" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/turf/open/floor/plasteel/blackwhite, +/area/template_noop) +"AR" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/blackwhite, +/area/template_noop) +"BO" = ( +/obj/machinery/smartfridge/food, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/reagent_containers/food/snacks/carpmeat/fish, +/obj/item/reagent_containers/food/snacks/carpmeat/fish, +/obj/item/reagent_containers/food/snacks/carpmeat/fish, +/obj/item/reagent_containers/food/snacks/carpmeat/fish, +/turf/open/floor/plasteel/blackwhite, +/area/template_noop) +"Cj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"Ei" = ( +/obj/machinery/vending/fishing, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken{ + dir = 1 + }, +/turf/open/floor/plasteel/checker, +/area/template_noop) +"ED" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/pool/corner, +/obj/structure/railing/corner, +/turf/open/floor/wood, +/area/template_noop) +"EH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/smartfridge/drying_rack, +/turf/open/floor/plasteel/checker, +/area/template_noop) +"EQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/vending/cola/random{ + tilted = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/template_noop) +"FV" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/template_noop) +"GH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/turf/open/floor/plasteel/checker, +/area/template_noop) +"GJ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/pool/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/template_noop) +"GL" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"He" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/template_noop) +"Ig" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/pool{ + dir = 1 + }, +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/template_noop) +"JM" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/blackwhite, +/area/template_noop) +"Ke" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/template_noop) +"KU" = ( +/obj/effect/landmark/blobstart, +/turf/open/water/safe, +/area/template_noop) +"LT" = ( +/obj/structure/rack, +/obj/item/radio, +/obj/item/relic, +/obj/item/twohanded/fishingrod, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/template_noop) +"Mq" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/pool/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/template_noop) +"Mw" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/template_noop) +"MA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/pool, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner, +/turf/open/floor/wood, +/area/template_noop) +"MI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/twohanded/fishingrod, +/obj/structure/rack, +/obj/item/pet_carrier, +/turf/open/floor/plasteel/checker, +/area/template_noop) +"Ng" = ( +/obj/machinery/smartfridge/drinks, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/reagent_containers/food/drinks/beer/stout, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/stout, +/turf/open/floor/plasteel/blackwhite, +/area/template_noop) +"Og" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/wood, +/area/template_noop) +"Ou" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/checker, +/area/template_noop) +"OV" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/template_noop) +"Pj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/railing, +/turf/open/floor/wood, +/area/template_noop) +"Qj" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/water/safe, +/area/template_noop) +"Rc" = ( +/obj/machinery/vending/fishing, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"RS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/railing, +/obj/effect/turf_decal/pool, +/turf/open/floor/wood, +/area/template_noop) +"SA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair/stool/bamboo, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"SM" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/trashbin, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/template_noop) +"Tw" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/turf/open/floor/wood, +/area/template_noop) +"Uj" = ( +/obj/structure/rack, +/obj/item/soap/homemade, +/obj/item/soap/homemade, +/obj/item/twohanded/fishingrod, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/template_noop) +"Wi" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/glass, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"Xp" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/pool{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/template_noop) +"YR" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/pool/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/template_noop) +"Ze" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/template_noop) +"ZB" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/pool{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner, +/turf/open/floor/wood, +/area/template_noop) +"ZO" = ( +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/simple_animal/mouse, +/turf/open/floor/plasteel/checker, +/area/template_noop) + +(1,1,1) = {" +Wi +tO +tO +uj +FV +Pj +Ng +BO +of +xG +"} +(2,1,1) = {" +SA +SA +ag +hn +FV +sb +JM +of +of +tw +"} +(3,1,1) = {" +Cj +rS +ED +yw +Xp +ZB +xi +Mq +AR +zC +"} +(4,1,1) = {" +Rc +GL +RS +qR +li +li +li +eW +AR +nH +"} +(5,1,1) = {" +oW +oW +ak +li +Qj +li +li +bv +oW +oW +"} +(6,1,1) = {" +Og +Og +MA +li +li +KU +li +Ig +Og +Og +"} +(7,1,1) = {" +Ei +Ou +RS +li +li +li +qR +eW +Mw +Ze +"} +(8,1,1) = {" +EH +Ou +GJ +Tw +OV +lf +Tw +YR +vX +kF +"} +(9,1,1) = {" +EH +Ou +ZO +Ou +FV +Pj +He +Ke +pj +kF +"} +(10,1,1) = {" +GH +Ou +MI +tg +SM +Pj +Uj +LT +wk +EQ +"} diff --git a/_maps/RandomRuins/StationRuins/maint/3x3/3x3_vendoraccident.dmm b/_maps/RandomRuins/StationRuins/maint/3x3/3x3_vendoraccident.dmm new file mode 100644 index 000000000000..29ddea7b5a6e --- /dev/null +++ b/_maps/RandomRuins/StationRuins/maint/3x3/3x3_vendoraccident.dmm @@ -0,0 +1,76 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/vending/snack/random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/template_noop) +"c" = ( +/obj/machinery/vending/autodrobe/all_access, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/template_noop) +"i" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/spawner/lootdrop/trashbin, +/turf/open/floor/plating, +/area/template_noop) +"p" = ( +/obj/machinery/vending/cola/random{ + tilted = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/template_noop) +"s" = ( +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/trashbin, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"B" = ( +/obj/item/holochip{ + credits = 50 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/template_noop) +"I" = ( +/obj/machinery/vending/cigarette, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/template_noop) +"P" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/glowstick, +/obj/effect/spawner/lootdrop/gloves, +/turf/open/floor/plating, +/area/template_noop) +"W" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/organ_spawner, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/decal/remains/human, +/turf/open/floor/plating, +/area/template_noop) + +(1,1,1) = {" +I +s +a +"} +(2,1,1) = {" +P +B +i +"} +(3,1,1) = {" +p +W +c +"} diff --git a/_maps/RandomRuins/StationRuins/maint/3x5/3x5_dissection.dmm b/_maps/RandomRuins/StationRuins/maint/3x5/3x5_dissection.dmm index 3797c0030f8d..81fd0e4e5d64 100644 --- a/_maps/RandomRuins/StationRuins/maint/3x5/3x5_dissection.dmm +++ b/_maps/RandomRuins/StationRuins/maint/3x5/3x5_dissection.dmm @@ -79,7 +79,7 @@ /obj/effect/decal/cleanable/blood/old, /obj/item/organ/eyes, /obj/item/organ/eyes/moth, -/obj/item/organ/eyes/preternis, +/obj/item/organ/eyes/robotic/preternis, /obj/item/organ/eyes/snail, /turf/open/floor/plasteel/white, /area/template_noop) diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 9555f915f477..26555d3c074d 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -29646,27 +29646,6 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) -"aZU" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/surgical_drapes, -/obj/item/retractor, -/obj/item/cautery, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) "aZV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -29867,28 +29846,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/science/robotics/lab) -"baj" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/circular_saw, -/obj/item/scalpel{ - pixel_y = 16 - }, -/obj/item/hemostat, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) "bak" = ( /obj/machinery/computer/operating{ dir = 1; @@ -95909,6 +95866,25 @@ icon_state = "panelscorched" }, /area/security/prison) +"pmX" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "pnQ" = ( /obj/structure/lattice, /obj/structure/girder/reinforced, @@ -98541,6 +98517,25 @@ }, /turf/open/floor/plasteel/dark, /area/medical/chemistry) +"saU" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath/medical, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "sbr" = ( /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -139712,7 +139707,7 @@ cHi waG bhC aCK -baj +saU bak aZS bOL @@ -140226,7 +140221,7 @@ azN aAo aBw aHM -aZU +pmX bgB bez aJV diff --git a/_maps/map_files/YogStation/YogStation.dmm b/_maps/map_files/YogStation/YogStation.dmm index 9e968be2484b..1a63f6e988f0 100644 --- a/_maps/map_files/YogStation/YogStation.dmm +++ b/_maps/map_files/YogStation/YogStation.dmm @@ -21633,6 +21633,36 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) +"bUA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/holosign/surgery, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "bVa" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -26746,6 +26776,26 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"dDo" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/button/door{ + id = "surgery_shutters"; + name = "Surgery shutters"; + pixel_x = 26; + pixel_y = 6; + req_access_txt = "45"; + req_one_access_txt = null + }, +/obj/machinery/computer/operating, +/obj/machinery/button/holosign{ + id = "surgery"; + pixel_x = 26; + pixel_y = -4 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "dDp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister/water_vapor, @@ -32595,21 +32645,6 @@ /obj/item/pen/red, /turf/open/floor/wood, /area/vacant_room) -"gKi" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/button/door{ - id = "surgery_shutters"; - name = "Surgery shutters"; - pixel_x = 26; - pixel_y = 6; - req_access_txt = "45"; - req_one_access_txt = null - }, -/obj/machinery/computer/operating, -/turf/open/floor/plasteel/white, -/area/medical/surgery) "gKy" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -45552,6 +45587,26 @@ }, /turf/open/floor/plating, /area/hallway/secondary/exit) +"mYj" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/holosign/surgery{ + id = "surgery" + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "mYS" = ( /obj/machinery/camera{ c_tag = "Atmospherics South West"; @@ -56967,26 +57022,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"sKm" = ( -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) "sKs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 @@ -58814,23 +58849,6 @@ }, /turf/open/floor/plasteel/dark, /area/storage/tech) -"tEa" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) "tEk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /obj/structure/disposalpipe/segment{ @@ -61908,35 +61926,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/chief) -"vhN" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) "vhP" = ( /obj/structure/sign/poster/contraband/power{ pixel_y = 32 @@ -63806,6 +63795,29 @@ "wkN" = ( /turf/closed/wall, /area/science/nanite) +"wls" = ( +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/holosign/surgery{ + id = "surgery" + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "wlG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 @@ -106188,7 +106200,7 @@ bvj bvj bvj shz -sKm +wls bvj tDe tVV @@ -106961,7 +106973,7 @@ urv uMu vYV oQs -tEa +mYj tzM ulL oEY @@ -107470,7 +107482,7 @@ hoP kub hLI iYd -gKi +dDo gQe doF hnj @@ -107730,7 +107742,7 @@ adK adK adK adK -vhN +bUA adK adK jrP diff --git a/_maps/map_files/Yogsmeta/Yogsmeta.dmm b/_maps/map_files/Yogsmeta/Yogsmeta.dmm index 6b5b43774eae..c21e6e4d6875 100644 --- a/_maps/map_files/Yogsmeta/Yogsmeta.dmm +++ b/_maps/map_files/Yogsmeta/Yogsmeta.dmm @@ -12704,11 +12704,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aDU" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/fulltile, -/turf/open/floor/plating, -/area/security/courtroom) "aDV" = ( /obj/machinery/vending/cigarette, /turf/open/floor/plasteel/dark, @@ -112066,7 +112061,7 @@ aHD aHD aHD aHD -aDU +aTk aRX aTk aUF diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm index ac50f313351c..a785a9580a8b 100644 --- a/code/__DEFINES/ai.dm +++ b/code/__DEFINES/ai.dm @@ -47,7 +47,7 @@ GLOBAL_LIST_INIT(ai_project_categories, list( #define AI_MAX_RAM_PER_RACK 4 ///How many AI research points does 1 THz generate? -#define AI_RESEARCH_PER_CPU 7.5 +#define AI_RESEARCH_PER_CPU 8.5 //How long between each data core being able to send a warning. Wouldn't want any spam if we had jittery temps would we? #define AI_DATA_CORE_WARNING_COOLDOWN (5 MINUTES) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index f0105efad5ae..bcfdfb97bfc0 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -259,6 +259,7 @@ #define TRAIT_ANOREXIC "anorexic" #define TRAIT_SHIFTY_EYES "shifty_eyes" #define TRAIT_ANXIOUS "anxious" +#define TRAIT_SEE_REAGENTS "see_reagents" // common trait sources #define TRAIT_GENERIC "generic" diff --git a/code/__DEFINES/{yogs_defines}/status_effects.dm b/code/__DEFINES/{yogs_defines}/status_effects.dm index be062a00a610..2c28115d2e1b 100644 --- a/code/__DEFINES/{yogs_defines}/status_effects.dm +++ b/code/__DEFINES/{yogs_defines}/status_effects.dm @@ -1 +1,3 @@ #define STATUS_EFFECT_VOIDED /datum/status_effect/voided //originally the void spell where you disappear and leave an invincible shadow guy but now it's a status effect + +#define STATUS_EFFECT_DODGING /datum/status_effect/dodging //granted by using the dodge roll, grants 1.5 seconds of godmode to replicate invincibility frames diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 2f4efd1b5734..06c8e6305975 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -73,6 +73,10 @@ SUBSYSTEM_DEF(research) science_tech.last_bitcoins = bitcoins // Doesn't take tick drift into account for(var/i in bitcoins) bitcoins[i] *= income_time_difference / 10 + if(science_tech.stored_research_points[i]) + var/boost_amt = clamp(0, bitcoins[i], science_tech.stored_research_points[i]) //up to 2x research speed when burning stored research + bitcoins[i] += boost_amt + science_tech.remove_stored_point_type(i, boost_amt) science_tech.add_point_list(bitcoins) last_income = world.time diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 670be33752ee..0fb6810f229d 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -62,7 +62,7 @@ special_screen_obj = "honked_nose" special_screen_replace = FALSE -/datum/mood_event/perform_cpr +/datum/mood_event/saved_life description = "It feels good to save a life.\n" mood_change = 6 timeout = 5 MINUTES diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 53931fd84e3f..fd9d50c1d6f1 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -302,6 +302,11 @@ /obj/machinery/button/crematorium/indestructible resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF +/obj/machinery/button/holosign + name = "holosign button" + desc = "A remote control switch for a holosign." + device_type = /obj/item/assembly/control/holosign + /obj/item/wallframe/button name = "button frame" desc = "Used for building buttons." diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index f10a32b43ee3..b6d11deeb55e 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -126,8 +126,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays) var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) if(D) D.adjust_money(point_gain) - linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, point_gain) - say("Explosion details and mixture analyzed and sold to the highest bidder for $[point_gain], with a reward of [point_gain] points.") + linked_techweb.add_stored_point_type(TECHWEB_POINT_TYPE_DEFAULT, point_gain) + say("Explosion details and mixture analyzed and sold to the highest bidder for $[point_gain], with a reward of [point_gain] points to be processed by research servers.") else //you've made smaller bombs say("Data already captured. Aborting.") diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm new file mode 100644 index 000000000000..70b15d62e138 --- /dev/null +++ b/code/game/machinery/holosign.dm @@ -0,0 +1,35 @@ +////////////////////HOLOSIGN/////////////////////////////////////// +/obj/machinery/holosign + name = "holosign" + desc = "Small wall-mounted holographic projector" + icon = 'icons/obj/holosign.dmi' + icon_state = "sign_off" + layer = 4 + var/lit = FALSE + var/id = null + var/on_icon = "sign_on" + +/obj/machinery/holosign/proc/toggle() + if(!is_operational()) + lit = FALSE + else + lit = !lit + update_icon() + +/obj/machinery/holosign/update_icon() + if(!lit) + icon_state = initial(icon_state) + set_light(0) + else + icon_state = on_icon + set_light(1, 0.5, l_color = COLOR_BLUE_LIGHT) + +/obj/machinery/holosign/power_change() + if(!is_operational()) + lit = FALSE + update_icon() + +/obj/machinery/holosign/surgery + name = "surgery holosign" + desc = "Small wall-mounted holographic projector. This one reads SURGERY." + on_icon = "surgery" diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 3adaf0c62e96..4106eb536d0e 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -624,6 +624,7 @@ H.emote("gasp") H.Jitter(100) SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "saved_life", /datum/mood_event/saved_life) log_combat(user, H, "revived", defib) if(req_defib) defib.deductcharge(revivecost) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index ee311128efa2..391ffb580d49 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -228,7 +228,7 @@ desc = "Can hold security gear like handcuffs and flashes." icon_state = "securitybelt" item_state = "security"//Could likely use a better one. - w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_BULKY content_overlays = TRUE /obj/item/storage/belt/security/ComponentInitialize() @@ -246,6 +246,10 @@ /obj/item/clothing/glasses, /obj/item/ammo_casing/shotgun, /obj/item/ammo_box, + /obj/item/storage/box/rubbershot, + /obj/item/storage/box/lethalshot, + /obj/item/storage/box/breacherslug, + /obj/item/storage/box/beanbag, /obj/item/reagent_containers/food/snacks/donut, /obj/item/kitchen/knife/combat, /obj/item/flashlight/seclite, @@ -254,6 +258,7 @@ /obj/item/clothing/gloves, /obj/item/restraints/legcuffs/bola, /obj/item/holosign_creator/security, + /obj/item/shield/riot/tele, /obj/item/barrier_taperoll/police )) @@ -272,6 +277,11 @@ icon_state = "securitybelt_hos" item_state = "security_hos" +/obj/item/storage/belt/security/chief/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 7 + /obj/item/storage/belt/security/chief/full/PopulateContents() new /obj/item/reagent_containers/spray/pepper(src) new /obj/item/restraints/handcuffs(src) @@ -279,6 +289,7 @@ new /obj/item/assembly/flash/handheld(src) new /obj/item/melee/baton/loaded(src) new /obj/item/barrier_taperoll/police(src) + new /obj/item/shield/riot/tele(src) update_icon() /obj/item/storage/belt/security/webbing @@ -292,7 +303,7 @@ /obj/item/storage/belt/security/webbing/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 6 + STR.max_items = 7 /obj/item/storage/belt/mining name = "explorer's webbing" @@ -545,11 +556,6 @@ icon_state = "assaultbelt" item_state = "security" -/obj/item/storage/belt/military/assault/ComponentInitialize() - . = ..() - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 6 - /obj/item/storage/belt/grenade name = "grenadier belt" desc = "A belt for holding grenades." @@ -657,7 +663,7 @@ /obj/item/storage/belt/bandolier/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 18 + STR.max_items = 24 STR.display_numerical_stacking = TRUE STR.set_holdable(list( /obj/item/ammo_casing/shotgun @@ -668,6 +674,7 @@ desc = "A holster to carry a handgun and ammo. WARNING: Badasses only." icon_state = "holster" item_state = "holster" + w_class = WEIGHT_CLASS_NORMAL alternate_worn_layer = UNDER_SUIT_LAYER /obj/item/storage/belt/holster/ComponentInitialize() diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index c9d5eb16ddda..7ae8e84d389d 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -802,42 +802,66 @@ /obj/item/storage/box/rubbershot name = "box of rubber shots" - desc = "A box full of rubber shots, designed for riot shotguns." + desc = "A box full of rubber shots designed for shotguns. The box itself is designed for holding any kind of shotgun shell." icon_state = "rubbershot_box" illustration = null +/obj/item/storage/box/rubbershot/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 7 + STR.set_holdable(list(/obj/item/ammo_casing/shotgun)) + /obj/item/storage/box/rubbershot/PopulateContents() for(var/i in 1 to 7) new /obj/item/ammo_casing/shotgun/rubbershot(src) /obj/item/storage/box/lethalshot name = "box of lethal shotgun shots" - desc = "A box full of lethal shots, designed for riot shotguns." + desc = "A box full of lethal shots designed for shotguns. The box itself is designed for holding any kind of shotgun shell." icon_state = "lethalshot_box" illustration = null +/obj/item/storage/box/lethalshot/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 7 + STR.set_holdable(list(/obj/item/ammo_casing/shotgun)) + /obj/item/storage/box/lethalshot/PopulateContents() for(var/i in 1 to 7) new /obj/item/ammo_casing/shotgun/buckshot(src) /obj/item/storage/box/breacherslug name = "box of breaching shotgun shells" - desc = "A box full of breaching slugs, designed for rapid entry." + desc = "A box full of breaching slugs designed for rapid entry. The box itself is designed for holding any kind of shotgun shell." icon_state = "breachershot_box" illustration = null +/obj/item/storage/box/breacherslug/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 7 + STR.set_holdable(list(/obj/item/ammo_casing/shotgun)) + /obj/item/storage/box/breacherslug/PopulateContents() for(var/i in 1 to 7) new /obj/item/ammo_casing/shotgun/breacher(src) /obj/item/storage/box/beanbag name = "box of beanbags" - desc = "A box full of beanbag shells." + desc = "A box full of beanbag shells designed for shotguns. The box itself is designed for holding any kind of shotgun shell." icon_state = "rubbershot_box" illustration = null +/obj/item/storage/box/beanbag/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 7 + STR.set_holdable(list(/obj/item/ammo_casing/shotgun)) + /obj/item/storage/box/beanbag/PopulateContents() - for(var/i in 1 to 6) + for(var/i in 1 to 7) new /obj/item/ammo_casing/shotgun/beanbag(src) /obj/item/storage/box/actionfigure diff --git a/code/game/objects/items/syndicateReverseCard.dm b/code/game/objects/items/syndicateReverseCard.dm index 656582f7bb92..165642ef518b 100644 --- a/code/game/objects/items/syndicateReverseCard.dm +++ b/code/game/objects/items/syndicateReverseCard.dm @@ -4,7 +4,7 @@ name = "Red Reverse" icon = 'icons/obj/toy.dmi' icon_state = "sc_Red Reverse_uno" - desc = "a card." + desc = "A card." w_class = WEIGHT_CLASS_TINY var/used = FALSE //has this been used before? If not, give no hints about it's nature diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 0b611dc6cdce..ee04a896974b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -944,7 +944,7 @@ /obj/item/toy/cards/singlecard name = "card" - desc = "a card" + desc = "A card." icon = 'icons/obj/toy.dmi' icon_state = "singlecard_down_nanotrasen" w_class = WEIGHT_CLASS_TINY diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 78ab39afe075..a028326a5442 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -231,14 +231,16 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/katana/cursed/basalt name = "basalt katana" - desc = "a katana made out of hardened basalt. Deals more damage to lavaland mobs." + desc = "a katana made out of hardened basalt. Particularly damaging to lavaland fauna. (Activate this item in hand to dodge roll in the direction you're facing)" icon_state = "basalt_katana" item_state = "basalt_katana" - force = 25 + force = 18 block_chance = 20 - var/fauna_damage_bonus = 35 - var/fauna_damage_type = BURN + var/fauna_damage_bonus = 52 + var/fauna_damage_type = BRUTE + var/next_roll + var/roll_dist = 3 /obj/item/katana/cursed/basalt/afterattack(atom/target, mob/user, proximity) . = ..() @@ -250,6 +252,33 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 L.apply_damage(fauna_damage_bonus,fauna_damage_type) playsound(L, 'sound/weapons/sear.ogg', 100, 1) +/obj/item/katana/cursed/basalt/attack_self(mob/living/user) + if(world.time > next_roll) + var/stam_cost = 15 + var/turf/T = get_turf(user) + if(is_mining_level(T.z)) + stam_cost = 5 + var/turf/landing_turf = get_ranged_target_turf(user, user.dir, roll_dist) + var/spin_direction = FALSE + user.adjustStaminaLoss(stam_cost) + if (user.getStaminaLoss() >= 100) + user.throw_at(landing_turf, 2, 2) + user.Paralyze(4 SECONDS) + user.visible_message(span_warning("You're too tired tired to finish the roll!")) + else + playsound(user, 'yogstation/sound/items/dodgeroll.ogg', 50, TRUE) + user.apply_status_effect(STATUS_EFFECT_DODGING) + if(user.dir == EAST || user.dir == NORTH) + spin_direction = TRUE + passtable_on(user, src) + user.setMovetype(user.movement_type | FLYING) + user.safe_throw_at(landing_turf, 4, 1, spin = FALSE) + user.SpinAnimation(speed = 3, loops = 1, clockwise = spin_direction, segments = 3, parallel = TRUE) + passtable_off(user, src) + user.setMovetype(user.movement_type & ~FLYING) + next_roll = world.time + 1 SECONDS + else + to_chat(user, span_notice("You need to catch your breath before you can roll again!")) /obj/item/katana/suicide_act(mob/user) diff --git a/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm b/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm index 9e2fadc69dd4..ef96e171cc75 100644 --- a/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm +++ b/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm @@ -151,7 +151,7 @@ /obj/structure/closet/bluespace/external/Destroy() SSbluespace_locker.external_locker = null - SSbluespace_locker.bluespaceify_random_locker() + SSbluespace_locker.redistribute_locker() return ..() /obj/structure/closet/bluespace/external/can_open() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index e4731c22be69..bd1c9d023d0e 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -63,8 +63,9 @@ new /obj/item/storage/lockbox/loyalty(src) new /obj/item/clothing/mask/gas/sechailer/swat(src) new /obj/item/storage/box/flashbangs(src) - new /obj/item/shield/riot/tele(src) - new /obj/item/storage/belt/security/chief/full(src) + new /obj/item/restraints/handcuffs(src) + new /obj/item/assembly/flash/handheld(src) + new /obj/item/melee/baton/loaded(src) new /obj/item/gun/energy/e_gun/hos(src) new /obj/item/flashlight/seclite(src) new /obj/item/pinpointer/nuke(src) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index cd6d81b8c3b6..772dd90c3456 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -531,7 +531,7 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/AllowDrop() return TRUE -/turf/proc/add_vomit_floor(mob/living/M, toxvomit = NONE) +/turf/proc/add_vomit_floor(mob/living/M, toxvomit = NONE, purge_ratio = 0.1) var/obj/effect/decal/cleanable/vomit/V = new /obj/effect/decal/cleanable/vomit(src, M.get_static_viruses()) @@ -540,19 +540,21 @@ GLOBAL_LIST_EMPTY(station_turfs) V = locate() in src if(!V) return - // Make toxins and blazaam vomit look different + // Apply the proper icon set based on vomit type if(toxvomit == VOMIT_PURPLE) V.icon_state = "vomitpurp_[pick(1,4)]" else if (toxvomit == VOMIT_TOXIC) V.icon_state = "vomittox_[pick(1,4)]" - if (iscarbon(M)) - var/mob/living/carbon/C = M - if(C.reagents) - clear_reagents_to_vomit_pool(C,V) + if (purge_ratio && iscarbon(M)) + clear_reagents_to_vomit_pool(M, V, purge_ratio) -/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V) - M.reagents.trans_to(V, M.reagents.total_volume / 10, transfered_by = M) - for(var/datum/reagent/R in M.reagents.reagent_list) //clears the stomach of anything that might be digested as food +/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V, purge_ratio = 0.1) + var/chemicals_lost = M.reagents.total_volume * purge_ratio + if(V.reagents.total_volume + chemicals_lost > V.reagents.maximum_volume) + V.reagents.total_volume -= chemicals_lost + M.reagents.trans_to(V, chemicals_lost, transfered_by = M) + //clear the stomach of anything even not food + for(var/datum/reagent/R in M.reagents.reagent_list) if(istype(R, /datum/reagent/consumable)) var/datum/reagent/consumable/nutri_check = R if(nutri_check.nutriment_factor >0) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index ec7263b903e2..7f69fe3267ab 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -200,6 +200,8 @@ //omg this is dumb, just fill in both their tickets // yogs start - Yog Tickets admin_ticket_log(src, msg, FALSE) + if(!recipient.current_ticket) // creates a ticket if there is no ticket of this user + new /datum/admin_help(msg, recipient, TRUE) // yogs - Yog Tickets if(recipient.current_ticket && !recipient.current_ticket.handling_admin) recipient.current_ticket.Administer() // yogs end - Yog Tickets diff --git a/code/modules/antagonists/bloodsuckers/bloodsucker_daylight.dm b/code/modules/antagonists/bloodsuckers/bloodsucker_daylight.dm index 5960ff7569ba..ca02ccc0c14f 100644 --- a/code/modules/antagonists/bloodsuckers/bloodsucker_daylight.dm +++ b/code/modules/antagonists/bloodsuckers/bloodsucker_daylight.dm @@ -106,15 +106,15 @@ if(bloodsucker_minds.current) switch(danger_level) if(1) - bloodsucker_minds.current.playsound_local(null, 'sound/effects/griffin_3.ogg', 50 + danger_level, 1) + bloodsucker_minds.current.playsound_local(null, 'sound/effects/griffin_3.ogg', 50 + danger_level, TRUE) if(2) - bloodsucker_minds.current.playsound_local(null, 'sound/effects/griffin_5.ogg', 50 + danger_level, 1) + bloodsucker_minds.current.playsound_local(null, 'sound/effects/griffin_5.ogg', 50 + danger_level, TRUE) if(3) - bloodsucker_minds.current.playsound_local(null, 'sound/effects/alert.ogg', 75, 1) + bloodsucker_minds.current.playsound_local(null, 'sound/effects/alert.ogg', 75, TRUE) if(4) - bloodsucker_minds.current.playsound_local(null, 'sound/ambience/ambimystery.ogg', 100, 1) + bloodsucker_minds.current.playsound_local(null, 'sound/ambience/ambimystery.ogg', 100, TRUE) if(5) - bloodsucker_minds.current.playsound_local(null, 'sound/spookoween/ghosty_wind.ogg', 90, 1) + bloodsucker_minds.current.playsound_local(null, 'sound/spookoween/ghosty_wind.ogg', 90, TRUE) if(vassalwarn != "") for(var/datum/mind/vassal_minds as anything in get_antag_minds(/datum/antagonist/vassal)) if(!istype(vassal_minds)) @@ -136,7 +136,7 @@ var/datum/antagonist/bloodsucker/bloodsuckerdatum = bloodsucker_minds.has_antag_datum(/datum/antagonist/bloodsucker) if(!istype(bloodsuckerdatum)) continue - if(istype(bloodsucker_minds.current.loc, /obj/structure)) + if(isstructure(bloodsucker_minds.current.loc)) if(istype(bloodsucker_minds.current.loc, /obj/structure/closet/crate/coffin)) // Coffins offer the BEST protection SEND_SIGNAL(bloodsucker_minds.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/coffinsleep) continue diff --git a/code/modules/antagonists/bloodsuckers/bloodsucker_frenzy.dm b/code/modules/antagonists/bloodsuckers/bloodsucker_frenzy.dm index dead5c58c35d..0df490c1760c 100644 --- a/code/modules/antagonists/bloodsuckers/bloodsucker_frenzy.dm +++ b/code/modules/antagonists/bloodsuckers/bloodsucker_frenzy.dm @@ -59,6 +59,7 @@ // Give the other Frenzy effects ADD_TRAIT(owner, TRAIT_MUTE, FRENZY_TRAIT) ADD_TRAIT(owner, TRAIT_DEAF, FRENZY_TRAIT) + ADD_TRAIT(owner, TRAIT_REDUCED_DAMAGE_SLOWDOWN, FRENZY_TRAIT) if(user.IsAdvancedToolUser()) was_tooluser = TRUE ADD_TRAIT(owner, TRAIT_MONKEYLIKE, SPECIES_TRAIT) @@ -80,6 +81,7 @@ to_chat(owner, span_warning("You come back to your senses.")) REMOVE_TRAIT(owner, TRAIT_MUTE, FRENZY_TRAIT) REMOVE_TRAIT(owner, TRAIT_DEAF, FRENZY_TRAIT) + REMOVE_TRAIT(owner, TRAIT_REDUCED_DAMAGE_SLOWDOWN, FRENZY_TRAIT) if(was_tooluser) REMOVE_TRAIT(owner, TRAIT_MONKEYLIKE, SPECIES_TRAIT) was_tooluser = FALSE diff --git a/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm b/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm index 041cc91e9a9c..52426c6fae00 100644 --- a/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm +++ b/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm @@ -37,8 +37,8 @@ var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(/datum/antagonist/bloodsucker) if(bloodsuckerdatum) . += "" - . += "Current Frenzy Enter: [FRENZY_THRESHOLD_ENTER + (bloodsuckerdatum.humanity_lost * 10)]" - . += "Current Frenzy Leave: [FRENZY_THRESHOLD_EXIT + (bloodsuckerdatum.humanity_lost * 10)]" + . += "Current Frenzy Enter: [FRENZY_THRESHOLD_ENTER + bloodsuckerdatum.humanity_lost * 10]" + . += "Current Frenzy Leave: [FRENZY_THRESHOLD_EXIT + bloodsuckerdatum.humanity_lost * 10]" . += "Blood Drank: [bloodsuckerdatum.total_blood_drank]" if(bloodsuckerdatum.current_task) . += "Task Blood Drank: [bloodsuckerdatum.task_blood_drank]" diff --git a/code/modules/antagonists/bloodsuckers/bloodsucker_mobs.dm b/code/modules/antagonists/bloodsuckers/bloodsucker_mobs.dm index 30c76e233163..0e32b2da38ec 100644 --- a/code/modules/antagonists/bloodsuckers/bloodsucker_mobs.dm +++ b/code/modules/antagonists/bloodsuckers/bloodsucker_mobs.dm @@ -196,7 +196,8 @@ if(bloodsucker) if(ishuman(bloodsucker)) var/mob/living/carbon/human/user = bloodsucker - if(user.blood_volume < 560) + var/datum/antagonist/bloodsucker/bloodsuckerdatum = src.mind.has_antag_datum(/datum/antagonist/bloodsucker) + if(user.blood_volume < FRENZY_THRESHOLD_EXIT + bloodsuckerdatum.humanity_lost * 10) user.blood_volume += 10 adjustFireLoss(2.5) updatehealth() //3 minutes to die diff --git a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm index e7137503c513..4210c1dfadb5 100644 --- a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm +++ b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm @@ -24,8 +24,6 @@ var/humanity_lost = 0 ///Have we been broken the Masquerade? var/broke_masquerade = FALSE - ///Blood required to enter Frenzy - var/frenzy_threshold = FRENZY_THRESHOLD_ENTER ///If we are currently in a Frenzy var/frenzied = FALSE ///If we have a task assigned diff --git a/code/modules/antagonists/bloodsuckers/powers/gangrel.dm b/code/modules/antagonists/bloodsuckers/powers/gangrel.dm index 4a3cdca1cc1a..94a40f379e7e 100644 --- a/code/modules/antagonists/bloodsuckers/powers/gangrel.dm +++ b/code/modules/antagonists/bloodsuckers/powers/gangrel.dm @@ -42,9 +42,9 @@ if(DIGITIGRADE in user_species.species_traits) user_species.species_traits -= DIGITIGRADE minortransformdone = TRUE - user_species.punchdamagelow += 5.0 - user_species.punchdamagehigh += 5.0 //stronk - user_species.armor += 30 + user.dna.species.punchdamagelow += 5.0 + user.dna.species.punchdamagehigh += 5.0 //stronk + user.dna.species.armor += 30 to_chat(user, span_notice("You aren't strong enough to morph into something stronger! But you do certainly feel more feral and stronger than before.")) else to_chat(user, span_notice("You still haven't evolved your ability yet.")) @@ -56,9 +56,9 @@ if(DIGITIGRADE in user_species.species_traits) user_species.species_traits -= DIGITIGRADE mediumtransformdone = TRUE - user_species.punchdamagelow += 7.5 - user_species.punchdamagehigh += 7.5 //very stronk - user_species.armor += 35 + user.dna.species.punchdamagelow += 7.5 + user.dna.species.punchdamagehigh += 7.5 //very stronk + user.dna.species.armor += 35 to_chat(owner, span_notice("You transform into a gorrila-ey beast, you feel stronger!")) else to_chat(owner, span_notice("You still haven't evolved your ability yet.")) diff --git a/code/modules/antagonists/bloodsuckers/powers/gohome.dm b/code/modules/antagonists/bloodsuckers/powers/gohome.dm index e82d4475b61b..d0b86fa0d0eb 100644 --- a/code/modules/antagonists/bloodsuckers/powers/gohome.dm +++ b/code/modules/antagonists/bloodsuckers/powers/gohome.dm @@ -57,6 +57,7 @@ if(GOHOME_FLICKER_TWO) INVOKE_ASYNC(src, .proc/flicker_lights, 4, 60) if(GOHOME_TELEPORT) + do_mob(user, user, 1 SECONDS, TRUE) INVOKE_ASYNC(src, .proc/teleport_to_coffin, user) teleporting_stage++ @@ -64,24 +65,24 @@ . = ..() if(!.) return FALSE - if(!isturf(owner.loc)) + if(!isturf(user.loc)) return FALSE if(!bloodsuckerdatum_power.coffin) - to_chat(owner, span_warning("Your coffin has been destroyed! You no longer have a destination.")) + to_chat(user, span_warning("Your coffin has been destroyed! You no longer have a destination.")) return FALSE return TRUE /datum/action/bloodsucker/gohome/proc/flicker_lights(flicker_range, beat_volume) for(var/obj/machinery/light/nearby_lights in view(flicker_range, get_turf(owner))) nearby_lights.flicker(5) - playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', beat_volume, 1) + playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', beat_volume, TRUE) /datum/action/bloodsucker/gohome/proc/teleport_to_coffin(mob/living/carbon/user) var/drop_item = FALSE - var/turf/current_turf = get_turf(owner) + var/turf/current_turf = get_turf(user) // If we aren't in the dark, anyone watching us will cause us to drop out stuff if(current_turf && current_turf.lighting_object && current_turf.get_lumcount() >= 0.2) - for(var/mob/living/watchers in viewers(world.view, get_turf(owner)) - owner) + for(var/mob/living/watchers in viewers(world.view, get_turf(user)) - user) if(!watchers.client) continue if(watchers.has_unlimited_silicon_privilege) @@ -99,10 +100,10 @@ var/obj/item/legcuffs = user.legcuffed user.dropItemToGround(legcuffs) if(drop_item) - for(var/obj/item/literally_everything in owner) - owner.dropItemToGround(literally_everything, TRUE) + for(var/obj/item/literally_everything in user) + user.dropItemToGround(literally_everything, TRUE) - playsound(current_turf, 'sound/magic/summon_karp.ogg', 60, 1) + playsound(current_turf, 'sound/magic/summon_karp.ogg', 60, TRUE) var/datum/effect_system/steam_spread/bloodsucker/puff = new /datum/effect_system/steam_spread/bloodsucker() puff.set_up(3, 0, current_turf) puff.start() @@ -112,13 +113,13 @@ new new_mob(current_turf) /// TELEPORT: Move to Coffin & Close it! user.set_resting(TRUE, TRUE, FALSE) - do_teleport(owner, bloodsuckerdatum_power.coffin, no_effects = TRUE, forced = TRUE, channel = TELEPORT_CHANNEL_QUANTUM) + do_teleport(user, bloodsuckerdatum_power.coffin, no_effects = TRUE, forced = TRUE, channel = TELEPORT_CHANNEL_QUANTUM) user.Stun(3 SECONDS, TRUE) // Puts me inside. - if(!bloodsuckerdatum_power.coffin.insert(owner)) + if(!bloodsuckerdatum_power.coffin.close(user)) // CLOSE LID: If fail, force me in. - bloodsuckerdatum_power.coffin.close(owner) - playsound(bloodsuckerdatum_power.coffin.loc, bloodsuckerdatum_power.coffin.close_sound, 15, 1, -3) + bloodsuckerdatum_power.coffin.insert(user) + playsound(bloodsuckerdatum_power.coffin.loc, bloodsuckerdatum_power.coffin.close_sound, 15, TRUE, -3) DeactivatePower() diff --git a/code/modules/antagonists/bloodsuckers/powers/targeted/brawn.dm b/code/modules/antagonists/bloodsuckers/powers/targeted/brawn.dm index fb7331e8c56c..fcb5dc33d384 100644 --- a/code/modules/antagonists/bloodsuckers/powers/targeted/brawn.dm +++ b/code/modules/antagonists/bloodsuckers/powers/targeted/brawn.dm @@ -45,8 +45,8 @@ if(!istype(closet)) return FALSE closet.visible_message( - span_warning("closet] tears apart as [user] bashes it open from within!"), - span_warning("closet] tears apart as you bash it open from within!"), + span_warning("[closet] tears apart as [user] bashes it open from within!"), + span_warning("[closet] tears apart as you bash it open from within!"), ) to_chat(user, span_warning("We bash [closet] wide open!")) addtimer(CALLBACK(src, .proc/break_closet, user, closet), 1) @@ -80,7 +80,7 @@ // Did we end up using our ability? If so, play the sound effect and return TRUE if(used) - playsound(get_turf(user), 'sound/effects/grillehit.ogg', 80, 1, -1) + playsound(get_turf(user), 'sound/effects/grillehit.ogg', 80, TRUE, -1) return used // This is its own proc because its done twice, to repeat code copypaste. @@ -96,7 +96,7 @@ return FALSE var/mob/pulled_mob = owner.pulledby var/pull_power = pulled_mob.grab_state - playsound(get_turf(pulled_mob), 'sound/effects/woodhit.ogg', 75, 1, -1) + playsound(get_turf(pulled_mob), 'sound/effects/woodhit.ogg', 75, TRUE, -1) // Knock Down (if Living) if(isliving(pulled_mob)) var/mob/living/hit_target = pulled_mob @@ -133,7 +133,7 @@ target.Knockdown(min(5, rand(10, 10 * powerlevel))) // Attack! to_chat(owner, span_warning("You punch [target]!")) - playsound(get_turf(target), 'sound/weapons/punch4.ogg', 60, 1, -1) + playsound(get_turf(target), 'sound/weapons/punch4.ogg', 60, TRUE, -1) user.do_attack_animation(target, ATTACK_EFFECT_SMASH) var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(target.zone_selected)) target.apply_damage(hitStrength, BRUTE, affecting) @@ -153,11 +153,11 @@ return FALSE target_closet.visible_message(span_danger("[target_closet] breaks open as [user] bashes it!")) addtimer(CALLBACK(src, .proc/break_closet, user, target_closet), 1) - playsound(get_turf(user), 'sound/effects/grillehit.ogg', 80, 1, -1) + playsound(get_turf(user), 'sound/effects/grillehit.ogg', 80, TRUE, -1) // Target Type: Door else if(istype(target_atom, /obj/machinery/door) && level_current >= 4) var/obj/machinery/door/target_airlock = target_atom - playsound(get_turf(user), 'sound/machines/airlock_alien_prying.ogg', 40, 1, -1) + playsound(get_turf(user), 'sound/machines/airlock_alien_prying.ogg', 40, TRUE, -1) to_chat(owner, span_warning("You prepare to tear open [target_airlock]...")) if(!do_mob(user, target_airlock, 2.5 SECONDS)) return FALSE @@ -165,7 +165,7 @@ target_airlock.visible_message(span_danger("[target_airlock] breaks open as [user] bashes it!")) user.Stun(10) user.do_attack_animation(target_airlock, ATTACK_EFFECT_SMASH) - playsound(get_turf(target_airlock), 'sound/effects/bang.ogg', 30, 1, -1) + playsound(get_turf(target_airlock), 'sound/effects/bang.ogg', 30, TRUE, -1) target_airlock.open(2) // open(2) is like a crowbar or jaws of life. /datum/action/bloodsucker/targeted/brawn/CheckValidTarget(atom/target_atom) diff --git a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm index 7f99c1fb1208..4a94505bec52 100644 --- a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm @@ -36,7 +36,7 @@ to_chat(owner.current, span_warning("You hit the maximum amount of lost Humanity, you are far from Human.")) return humanity_lost += value - to_chat(owner.current, span_warning("You feel as if you lost some of your humanity, you will now enter Frenzy at [FRENZY_THRESHOLD_ENTER + (humanity_lost * 10)] Blood.")) + to_chat(owner.current, span_warning("You feel as if you lost some of your humanity, you will now enter Frenzy at [FRENZY_THRESHOLD_ENTER + humanity_lost * 10] Blood.")) /// mult: SILENT feed is 1/3 the amount /datum/antagonist/bloodsucker/proc/HandleFeeding(mob/living/carbon/target, mult=1, power_level) @@ -236,7 +236,7 @@ // BLOOD_VOLUME_GOOD: [336] - Pale // handled in bloodsucker_integration.dm // BLOOD_VOLUME_EXIT: [560] - Exit Frenzy (If in one) This is high because we want enough to kill the poor soul they feed off of. - if(owner.current.blood_volume >= FRENZY_THRESHOLD_EXIT && frenzied) + if(owner.current.blood_volume >= (FRENZY_THRESHOLD_EXIT + humanity_lost * 10) && frenzied) owner.current.remove_status_effect(STATUS_EFFECT_FRENZY) // BLOOD_VOLUME_BAD: [224] - Jitter if(owner.current.blood_volume < BLOOD_VOLUME_BAD(owner.current) && prob(0.5) && !HAS_TRAIT(owner.current, TRAIT_NODEATH) && !HAS_TRAIT(owner.current, TRAIT_MASQUERADE)) @@ -246,7 +246,7 @@ owner.current.blur_eyes(8 - 8 * (owner.current.blood_volume / BLOOD_VOLUME_BAD(owner.current))) // The more blood, the better the Regeneration, get too low blood, and you enter Frenzy. - if(owner.current.blood_volume < (FRENZY_THRESHOLD_ENTER + (humanity_lost * 10)) && !frenzied) + if(owner.current.blood_volume < (FRENZY_THRESHOLD_ENTER + humanity_lost * 10) && !frenzied) if(!iscarbon(owner.current)) return if(owner.current.stat == DEAD) @@ -276,18 +276,18 @@ owner.current.apply_status_effect(STATUS_EFFECT_FRENZY) return if(2 to INFINITY) - AddBloodVolume(560 - user.blood_volume) //so it doesn't happen multiple times and refills your blood when you get out again + AddBloodVolume(FRENZY_THRESHOLD_EXIT + humanity_lost * 10 - user.blood_volume) //so it doesn't happen multiple times and refills your blood when you get out again if(!do_mob(user, user, 2 SECONDS, TRUE)) return - playsound(user.loc, 'sound/weapons/slash.ogg', 25, 1) + playsound(user.loc, 'sound/weapons/slash.ogg', 25, TRUE) to_chat(user, span_warning("You skin rips and tears.")) if(!do_mob(user, user, 1 SECONDS, TRUE)) return - playsound(user.loc, 'sound/weapons/slashmiss.ogg', 25, 1) + playsound(user.loc, 'sound/weapons/slashmiss.ogg', 25, TRUE) to_chat(user, span_warning("You heart pumps blackened blood into your veins as your skin turns into fur.")) if(!do_mob(user, user, 1 SECONDS, TRUE)) return - playsound(user.loc, 'sound/weapons/slice.ogg', 25, 1) + playsound(user.loc, 'sound/weapons/slice.ogg', 25, TRUE) to_chat(user, span_boldnotice("YOU HAVE AWOKEN.")) var/mob/living/simple_animal/hostile/bloodsucker/werewolf/ww if(!ww || ww.stat == DEAD) diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index f3b95767f025..813a3dd1d0fe 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -15,7 +15,7 @@ var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if (E) E.flash_protect = 2 //Adjust the user's eyes' flash protection - if(istype(E, /obj/item/organ/eyes/preternis)) + if(istype(E, /obj/item/organ/eyes/robotic/preternis)) E.Remove(user, 1) var/obj/item/organ/eyes/neweyes = new(user) neweyes.Insert(user, 1) @@ -54,4 +54,4 @@ else E.flash_protect = 0 user.update_sight() - ..() \ No newline at end of file + ..() diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 234b195b24d2..8eeb9b14795b 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -15,7 +15,7 @@ H.leave_victim() if(iscarbon(user)) var/mob/living/carbon/C = user - C.vomit(0, toxic = TRUE) + C.vomit(0) to_chat(user, span_notice("A parasite exits our form.")) ..() var/list/bad_organs = list( @@ -30,7 +30,7 @@ O.Remove(user) if(iscarbon(user)) var/mob/living/carbon/C = user - C.vomit(0, toxic = TRUE) + C.vomit(0) O.forceMove(get_turf(user)) user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10) diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index e578faa77e43..908c91926919 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -145,3 +145,18 @@ C.cremate(usr) addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50) + + +/obj/item/assembly/control/holosign + name = "holosign controller" + desc = "A remote controller for a holosign." + +/obj/item/assembly/control/holosign/activate() + if(cooldown) + return + cooldown = TRUE + for(var/obj/machinery/holosign/H in GLOB.machines) + if(H.id == id) + H.toggle() + + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 619c6fa3c982..7447108793e6 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -95,7 +95,7 @@ /obj/item/clothing/gloves/bracer/cuffs name = "rabid cuffs" - desc = "Chainless manacles fashioned after one of the hungriest slaughter demons. Wearing these invokes a hunger in the wearer that can only be sated by bloodshed." + desc = "Wristbands fashioned after one of the hungriest slaughter demons. Wearing these invokes a hunger in the wearer that can only be sated by bloodshed." icon_state = "cuff" item_state = "cuff" var/obj/effect/proc_holder/swipe/swipe_ability @@ -116,7 +116,7 @@ obj/effect/proc_holder/swipe name = "Swipe" - desc = "Swipe at a target area, dealing damage and consuming dead entities to heal yourself. Creatures take 30 damage while people and cyborgs take 10 damage. Consumed creatures explode into gibs and give the most healing, and people and cyborgs heal for the least. People and cyborgs who have been thoroughly burned and bruised heal you for slightly more! People are ineligible for total consumption." + desc = "Swipe at a target area, dealing damage to heal yourself. Creatures take 60 damage while people and cyborgs take 20 damage. Living creatures hit with this ability will heal the user for 13 brute/burn/poison while dead ones heal for 20 and get butchered, while killing a creature with a swipe will heal the user for 33. People and cyborgs hit will heal for 5." action_background_icon_state = "bg_demon" action_icon = 'icons/mob/actions/actions_items.dmi' action_icon_state = "cuff" @@ -154,32 +154,33 @@ obj/effect/proc_holder/swipe return if(!istype(T)) return + if(!(T in range(9, caller))) + to_chat(caller, warning("The target is too far!")) + return new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T) new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T) - to_chat(L, span_userdanger("A claw swipes at you!")) + to_chat(L, span_userdanger("Claws reach out from the floor and maul you!")) to_chat(ranged_ability_user, "You summon claws at [L]'s location!") + L.visible_message(span_warning("[caller] rends [L]!")) for(L in range(0,T)) playsound(T, 'sound/magic/demon_attack1.ogg', 80, 5, -1) if(isanimal(L)) - L.adjustBruteLoss(30) + L.adjustBruteLoss(60) + if(L.stat != DEAD) + caller.adjustBruteLoss(-13) + caller.adjustFireLoss(-13) + caller.adjustToxLoss(-13) if(L.stat == DEAD) L.gib() + to_chat(caller, span_notice("You're able to consume the body entirely!")) caller.adjustBruteLoss(-20) caller.adjustFireLoss(-20) caller.adjustToxLoss(-20) - caller.blood_volume = BLOOD_VOLUME_NORMAL(caller)*1.10 - L.adjustBruteLoss(10) - if(L.getBruteLoss()+L.getFireLoss() >= 299) - to_chat(caller, span_notice("You're able to consume a bit more of the body, as it was previously softened up!")) - caller.adjustBruteLoss(-15) - caller.adjustFireLoss(-15) - caller.adjustToxLoss(-15) - caller.blood_volume = BLOOD_VOLUME_NORMAL(caller)*1.05 - if(L.stat == DEAD) + if(iscarbon(L)) + L.adjustBruteLoss(20) caller.adjustBruteLoss(-5) caller.adjustFireLoss(-5) caller.adjustToxLoss(-5) - caller.blood_volume = BLOOD_VOLUME_NORMAL(caller)*1.01 COOLDOWN_START(src, scan_cooldown, cooldown) addtimer(CALLBACK(src, .proc/cooldown_over, ranged_ability_user), cooldown) remove_ranged_ability() diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 0fea05dee27f..d355c8e00a57 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -469,6 +469,18 @@ list_reagents = list(/datum/reagent/consumable/space_cola = 30) foodtype = SUGAR +/obj/item/reagent_containers/food/drinks/soda_cans/rootbeer + name = "Root Beer" + desc = "A soft drink made from roots. Non-Alcoholic." + custom_price = 10 + icon_state = "Rootbeer_Mug" + list_reagents = list(/datum/reagent/consumable/rootbeer = 30) + foodtype = SUGAR + +/obj/item/reagent_containers/food/drinks/soda_cans/rootbeer/Initialize() + icon_state = pick("Rootbeer_Mug","Rootbeer_AW","Rootbeer_Barq") + . = ..() + /obj/item/reagent_containers/food/drinks/soda_cans/tonic name = "T-Borg's tonic water" desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 65675db9e43c..2902ce96937e 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -118,6 +118,7 @@ new V(podman) podman.hardset_dna(null,null,null,podman.real_name,blood_type, new /datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman podman.set_cloned_appearance() + podman.dna.species.exotic_blood = max(reagents_add) || /datum/reagent/water log_cloning("[key_name(mind)] cloned as a podman via [src] in [parent] at [AREACOORD(parent)].") to_chat(podman, span_notice("You do not remember your death, how you died, or who killed you. See rule 1.6.")) //yogs diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index dfebb5973bd2..509b5150224c 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -46,6 +46,7 @@ id_type = /obj/item/card/id/silver pda_type = /obj/item/pda/heads/hos + belt = /obj/item/storage/belt/security/chief/full ears = /obj/item/radio/headset/heads/hos/alt uniform = /obj/item/clothing/under/rank/head_of_security uniform_skirt = /obj/item/clothing/under/rank/head_of_security/skirt @@ -56,9 +57,7 @@ head = /obj/item/clothing/head/HoS/beret glasses = /obj/item/clothing/glasses/hud/security/sunglasses suit_store = /obj/item/gun/energy/e_gun - r_pocket = /obj/item/assembly/flash/handheld - l_pocket = /obj/item/restraints/handcuffs - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/modular_computer/tablet/phone/preset/advanced/command=1) //yogs - removed departmental budget ID //come here often? + backpack_contents = list(/obj/item/modular_computer/tablet/phone/preset/advanced/command=1) //yogs - removed departmental budget ID //come here often? backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 700e715620d0..f392bd1ae875 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -35,6 +35,7 @@ /datum/outfit/job/miner name = "Shaft Miner" + var/static/gps_number = 1 jobtype = /datum/job/mining pda_type = /obj/item/pda/shaftminer @@ -59,6 +60,16 @@ chameleon_extras = /obj/item/gun/energy/kinetic_accelerator +/datum/outfit/job/miner/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(visualsOnly) + return + if(H.stat == DEAD) + return + for(var/obj/item/gps/G in H.contents) + G.gpstag = "MINE[gps_number]" + gps_number ++ + /datum/outfit/job/miner/equipped name = "Shaft Miner (Equipment)" suit = /obj/item/clothing/suit/hooded/explorer diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index b2151549626f..92144faa1626 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -1136,9 +1136,10 @@ GLOBAL_LIST_EMPTY(bloodmen_list) #define COOLDOWN 150 #define COOLDOWN_HUMAN 100 #define COOLDOWN_ANIMAL 60 +#define COOLDOWN_SPLASH 100 /obj/item/melee/knuckles name = "bloody knuckles" - desc = "Knuckles born of a desire for violence. Made to ensure their victims stay in the fight until there's a winner." + desc = "Knuckles born of a desire for violence. Made to ensure their victims stay in the fight until there's a winner. Activating these knuckles covers several meters ahead of the user with blood." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "bloodyknuckle" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' @@ -1148,7 +1149,9 @@ GLOBAL_LIST_EMPTY(bloodmen_list) force = 18 var/next_reach = 0 var/next_grip = 0 + var/next_splash = 0 var/next_knuckle = 0 + var/splash_range = 9 attack_verb = list("thrashed", "pummeled", "walloped") actions_types = list(/datum/action/item_action/reach, /datum/action/item_action/visegrip) @@ -1168,6 +1171,19 @@ GLOBAL_LIST_EMPTY(bloodmen_list) return next_knuckle = world.time + COOLDOWN_ANIMAL +/obj/item/melee/knuckles/attack_self(mob/living/user) + var/turf/T = get_turf(user) + if(next_splash > world.time) + to_chat(user, span_warning("You can't do that yet!")) + return + user.visible_message(span_warning("[user] splashes blood from their knuckles!")) + playsound(T, 'sound/effects/splat.ogg', 80, 5, -1) + for(var/i = 0 to splash_range) + if(T) + user.add_splatter_floor(T) + T = get_step(T,user.dir) + next_splash = world.time + COOLDOWN + /obj/item/melee/knuckles/ui_action_click(mob/living/user, action) var/mob/living/U = user if(istype(action, /datum/action/item_action/reach)) @@ -1575,15 +1591,15 @@ GLOBAL_LIST_EMPTY(bloodmen_list) /obj/item/organ/grandcore/Remove(mob/living/carbon/H, special = 0) H.faction -= "blooded" - H.RemoveSpell (/obj/effect/proc_holder/spell/targeted/touch/raise, /obj/effect/proc_holder/spell/aoe_turf/horde) - H.RemoveSpell (new /obj/effect/proc_holder/spell/aoe_turf/horde) + H.RemoveSpell (/obj/effect/proc_holder/spell/targeted/touch/raise) + H.RemoveSpell (/obj/effect/proc_holder/spell/aoe_turf/horde) ..() /datum/action/item_action/organ_action/threebloodlings name = "Summon bloodlings" - desc = "Summon a conjure a few bloodlings at the cost of 13% blood (8 brain damage for those without blood)." + desc = "Summon a conjure a few bloodlings at the cost of 6% blood or 8 brain damage for races without blood." var/next_expulsion = 0 - var/cooldown = 10 //wheres the risk if it has a reasonable cooldown? + var/cooldown = 10 /datum/action/item_action/organ_action/threebloodlings/Trigger() var/mob/living/carbon/H = owner @@ -1596,6 +1612,6 @@ GLOBAL_LIST_EMPTY(bloodmen_list) to_chat(H, "Your head pounds as you produce bloodlings!") else to_chat(H, "You spill your blood, and it comes to life as bloodlings!") - H.blood_volume -= 70 //like 13% of your blood taken + H.blood_volume -= 35 spawn_atom_to_turf(/mob/living/simple_animal/hostile/asteroid/hivelordbrood/bloodling, owner, 3, TRUE) //think 1 in 4 is a good chance of not being targeted by fauna next_expulsion = world.time + cooldown diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 10d3a3f44183..94b3d3eba86a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -498,8 +498,8 @@ return 0 return ..() -/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE) - if(HAS_TRAIT(src, TRAIT_NOHUNGER)) +/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) + if((HAS_TRAIT(src, TRAIT_NOHUNGER) || HAS_TRAIT(src, TRAIT_TOXINLOVER)) && !force) return TRUE if(istype(src.loc, /obj/effect/dummy)) //cannot vomit while phasing/vomitcrawling @@ -539,12 +539,9 @@ add_splatter_floor(T) if(stun) adjustBruteLoss(3) - else if(src.reagents.has_reagent(/datum/reagent/consumable/ethanol/blazaam, needs_metabolizing = TRUE)) - if(T) - T.add_vomit_floor(src, VOMIT_PURPLE) else if(T) - T.add_vomit_floor(src, VOMIT_TOXIC)//toxic barf looks different + T.add_vomit_floor(src, vomit_type, purge_ratio) //toxic barf looks different || call purge when doing detoxicfication to pump more chems out of the stomach. T = get_step(T, dir) if (is_blocked_turf(T)) break diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5bb356837e3e..85fc9056735c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -627,7 +627,7 @@ return src.visible_message("[src] performs CPR on [C.name]!", span_notice("You perform CPR on [C.name].")) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "perform_cpr", /datum/mood_event/perform_cpr) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "saved_life", /datum/mood_event/saved_life) C.cpr_time = world.time log_combat(src, C, "CPRed") SSachievements.unlock_achievement(/datum/achievement/cpr, client) @@ -869,8 +869,8 @@ override = dna.species.override_float ..() -/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = 0, stun = 1, distance = 0, message = 1, toxic = 0) - if(blood && (NOBLOOD in dna.species.species_traits)) +/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) + if(blood && (NOBLOOD in dna.species.species_traits) && !HAS_TRAIT(src, TRAIT_TOXINLOVER)) if(message) visible_message(span_warning("[src] dry heaves!"), \ span_userdanger("You try to throw up, but there's nothing in your stomach!")) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index b329ff9fcfcd..4dbb0d58a909 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -178,6 +178,8 @@ return TRUE if(isclothing(wear_mask) && (wear_mask.clothing_flags & SCAN_REAGENTS)) return TRUE + if(HAS_TRAIT(src, TRAIT_SEE_REAGENTS)) + return TRUE /// When we're joining the game in [/mob/dead/new_player/proc/create_character], we increment our scar slot then store the slot in our mind datum. /mob/living/carbon/human/proc/increment_scar_slot() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a685a17423ce..3eca7a5c4d9a 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -286,7 +286,7 @@ if(getToxLoss() >= 45 && nutrition > 20) lastpuke += prob(50) if(lastpuke >= 50) // about 25 second delay I guess - vomit(20, toxic = TRUE) + vomit(20) lastpuke = 0 diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 4267667cac86..e069593fe10b 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -21,6 +21,7 @@ DISREGUARD THIS FILE IF YOU'RE INTENDING TO CHANGE ASPECTS OF PLAYER CONTROLLED punchstunthreshold = 9 //TF2 no-crits special payday_modifier = 0.7 //Neutrally viewed by NT meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant + exotic_blood = /datum/reagent/water disliked_food = MEAT | DAIRY | SEAFOOD | MICE liked_food = VEGETABLES | FRUIT | GRAIN changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT diff --git a/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm b/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm index 4f834751d05c..1a962ddd48e2 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm @@ -13,6 +13,8 @@ GLOBAL_VAR_INIT(primary_data_core, null) idle_power_usage = 1000 use_power = IDLE_POWER_USE + critical_machine = TRUE + var/primary = FALSE var/valid_ticks = MAX_AI_DATA_CORE_TICKS //Limited to MAX_AI_DATA_CORE_TICKS. Decrement by 1 every time we have an invalid tick, opposite when valid diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm index ae0322de805b..83dd669e488c 100644 --- a/code/modules/projectiles/boxes_magazines/external/smg.dm +++ b/code/modules/projectiles/boxes_magazines/external/smg.dm @@ -3,7 +3,7 @@ icon_state = "46x30mmt-20" ammo_type = /obj/item/ammo_casing/c46x30mm caliber = "4.6x30mm" - max_ammo = 20 + max_ammo = 22 /obj/item/ammo_box/magazine/wt550m9/update_icon() ..() diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index ee3e270b34d8..633418ed4441 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -83,12 +83,13 @@ /obj/item/gun/ballistic/automatic/wt550 name = "security auto rifle" - desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Automatic Rifle. Has a single fire burst mode, but you still can't figure out what advantage that has over semi automatic." + desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Automatic Rifle. Has a two-round burst or a semi-automatic firing mode." icon_state = "wt550" item_state = "arg" mag_type = /obj/item/ammo_box/magazine/wt550m9 fire_delay = 2 - burst_size = 1 + burst_size = 2 + weapon_weight = WEAPON_MEDIUM can_suppress = FALSE can_bayonet = TRUE knife_x_offset = 25 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 1590376f3916..ca2cd87abf4c 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -579,6 +579,8 @@ else var/mob/living/L = target if(!direct_target) + if(!CHECK_BITFIELD(L.mobility_flags, MOBILITY_STAND) && (L in range(2, starting))) //if we're shooting over someone who's prone and nearby bc formations are cool and not going to be unbalanced + return FALSE if(!CHECK_BITFIELD(L.mobility_flags, MOBILITY_USE | MOBILITY_STAND | MOBILITY_MOVE) || !(L.stat == CONSCIOUS)) //If they're able to 1. stand or 2. use items or 3. move, AND they are not softcrit, they are not stunned enough to dodge projectiles passing over. return FALSE return TRUE diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 7b3a39fadc73..46253574cc8a 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -63,7 +63,7 @@ /obj/item/projectile/bullet/pellet var/tile_dropoff = 0.45 - var/tile_dropoff_s = 0.5 + var/tile_dropoff_s = 0.35 /obj/item/projectile/bullet/pellet/shotgun_buckshot name = "buckshot pellet" @@ -80,7 +80,7 @@ /obj/item/projectile/bullet/pellet/shotgun_rubbershot name = "rubbershot pellet" damage = 3 - stamina = 11 + stamina = 13 sharpness = SHARP_NONE /obj/item/projectile/bullet/pellet/shotgun_cryoshot diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index ba380e30df28..b0d45465a4ab 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -10,22 +10,22 @@ /obj/item/projectile/bullet/c46x30mm name = "4.6x30mm bullet" - damage = 20 + damage = 13 wound_bonus = -5 bare_wound_bonus = 5 armour_penetration = 20 /obj/item/projectile/bullet/c46x30mm_ap name = "4.6x30mm armor-piercing bullet" - damage = 15 + damage = 10 armour_penetration = 50 /obj/item/projectile/bullet/incendiary/c46x30mm name = "4.6x30mm incendiary bullet" - damage = 10 + damage = 7 fire_stacks = 1 /obj/item/projectile/bullet/c46x30mm_rubber name = "4.6x30mm rubber bullet" - damage = 5 - stamina = 20 //slightly more effective than the detective's revolver when fired in bursts + damage = 4 + stamina = 21 //slightly more effective than the detective's revolver when fired in bursts diff --git a/code/modules/projectiles/projectile/reusable/arrow.dm b/code/modules/projectiles/projectile/reusable/arrow.dm index cd6313b206de..7ee6be11f570 100644 --- a/code/modules/projectiles/projectile/reusable/arrow.dm +++ b/code/modules/projectiles/projectile/reusable/arrow.dm @@ -5,7 +5,7 @@ flag = MELEE icon_state = "arrow" ammo_type = /obj/item/ammo_casing/caseless/arrow - var/embed_chance = 0.5 + var/embed_chance = 0.4 var/break_chance = 10 var/fauna_damage_bonus = 20 @@ -40,7 +40,7 @@ name = "Ashen arrow" desc = "Fire Hardened arrow." damage = 25 - embed_chance = 0.3 + embed_chance = 0.25 break_chance = 0 ammo_type = /obj/item/ammo_casing/caseless/arrow/ash @@ -49,7 +49,7 @@ desc = "An arrow made from bone, wood, and sinew." damage = 30 armour_penetration = 20 - embed_chance = 0.4 + embed_chance = 0.33 break_chance = 0 ammo_type = /obj/item/ammo_casing/caseless/arrow/bone_tipped @@ -68,7 +68,7 @@ damage = 25 fauna_damage_bonus = 40 armour_penetration = 35 - embed_chance = 0.5 + embed_chance = 0.4 break_chance = 0 ammo_type = /obj/item/ammo_casing/caseless/arrow/chitin @@ -76,8 +76,8 @@ name = "Bamboo arrow" desc = "An arrow made from bamboo." damage = 10 - embed_chance = 0.7 - break_chance = 67 + embed_chance = 0.5 + break_chance = 50 ammo_type = /obj/item/ammo_casing/caseless/arrow/bamboo /obj/item/projectile/bullet/reusable/arrow/bronze //Inferior metal. Slightly better than ashen @@ -93,16 +93,16 @@ name = "Glass arrow" desc = "Glass tipped arrow" damage = 15 - embed_chance = 0.5 - break_chance = 33 + embed_chance = 0.3 + break_chance = 25 ammo_type = /obj/item/ammo_casing/caseless/arrow/glass /obj/item/projectile/bullet/reusable/arrow/glass/plasma //Immensely capable of puncturing through materials; plasma is a robust material, more capable of slicing through protection name = "Plasma Glass arrow" desc = "Plasma Glass tipped arrow" - damage = 15 - armour_penetration = 50 - embed_chance = 0.5 + damage = 18 + armour_penetration = 60 + embed_chance = 0.4 break_chance = 0 ammo_type = /obj/item/ammo_casing/caseless/arrow/glass/plasma @@ -139,7 +139,7 @@ . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target - M.apply_damage(10, BURN) + M.apply_damage(8, BURN) M.adjust_fire_stacks(1) M.IgniteMob() @@ -148,7 +148,7 @@ icon_state = "arrow_energy" damage = 25 damage_type = BURN - var/embed_chance = 0.5 + var/embed_chance = 0.4 var/obj/item/embed_type = /obj/item/ammo_casing/caseless/arrow/energy /obj/item/projectile/energy/arrow/on_hit(atom/target, blocked = FALSE) @@ -163,7 +163,7 @@ name = "disabler bolt" icon_state = "arrow_disable" light_color = LIGHT_COLOR_BLUE - damage = 20 + damage = 40 damage_type = STAMINA embed_type = /obj/item/ammo_casing/caseless/arrow/energy/disabler diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 1102ebcd142b..80cc308cf2d3 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -469,6 +469,7 @@ /datum/reagent/consumable/tea, /datum/reagent/consumable/icetea, /datum/reagent/consumable/space_cola, + /datum/reagent/consumable/rootbeer, /datum/reagent/consumable/spacemountainwind, /datum/reagent/consumable/dr_gibb, /datum/reagent/consumable/space_up, diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index c555556bbb9c..86bdbf870cdb 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -479,6 +479,20 @@ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) ..() +/datum/reagent/consumable/rootbeer + name = "Root Beer" + description = "Beer, but not." + color = "#251505" // rgb: 16, 8, 0 + taste_description = "root and beer" + glass_icon_state = "glass_brown" + glass_name = "glass of root beer" + glass_desc = "A glass of refreshing fizzing root beer." + +/datum/reagent/consumable/rootbeer/on_mob_life(mob/living/carbon/M) + M.drowsyness = max(0,M.drowsyness-5) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + ..() + /datum/reagent/consumable/nuka_cola name = "Nuka Cola" description = "Cola, cola never changes." diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 349eacbf9eb1..f1f338b611ce 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -343,6 +343,17 @@ category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/cyberimp_science_analyzer + name = "Chemical Analyzer Implant" + desc = "These cybernetic eye implants will allow rapid identification of reagents. Wiggle eyes to control." + id = "ci-scihud" + build_type = PROTOLATHE | MECHFAB + construction_time = 50 + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plastic = 150) + build_path = /obj/item/organ/cyberimp/eyes/hud/science + category = list("Implants", "Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + /datum/design/cyberimp_xray name = "X-ray Eyes" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 7028911e967e..567ba415525f 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -310,7 +310,7 @@ /datum/design/mag_oldsmg name = "WT-550 Auto Gun Magazine (4.6x30mm)" - desc = "A 20 round magazine for the out of date security WT-550 Auto Rifle." + desc = "A 22 round magazine for the out of date security WT-550 Auto Rifle." id = "mag_oldsmg" build_type = PROTOLATHE materials = list(/datum/material/iron = 4000) @@ -320,7 +320,7 @@ /datum/design/mag_oldsmg/ap_mag name = "WT-550 Auto Gun Armour Piercing Magazine (4.6x30mm AP)" - desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle." + desc = "A 22 round armour piercing magazine for the out of date security WT-550 Auto Rifle." id = "mag_oldsmg_ap" materials = list(/datum/material/iron = 6000, /datum/material/silver = 600) build_path = /obj/item/ammo_box/magazine/wt550m9/wtap @@ -328,7 +328,7 @@ /datum/design/mag_oldsmg/ic_mag name = "WT-550 Auto Gun Incendiary Magazine (4.6x30mm IC)" - desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle." + desc = "A 22 round armour piercing magazine for the out of date security WT-550 Auto Rifle." id = "mag_oldsmg_ic" materials = list(/datum/material/iron = 6000, /datum/material/silver = 600, /datum/material/glass = 1000) build_path = /obj/item/ammo_box/magazine/wt550m9/wtic @@ -336,7 +336,7 @@ /datum/design/mag_oldsmg/rubber_mag name = "WT-550 Auto Gun Rubber Bullet Magazine (4.6x30mm Rubber)" - desc = "A 20 round rubber bullet magazine for the out of date security WT-550 Auto Rifle." + desc = "A 22 round rubber bullet magazine for the out of date security WT-550 Auto Rifle." id = "mag_oldsmg_rubber" materials = list(/datum/material/iron = 4000) build_path = /obj/item/ammo_box/magazine/wt550m9/wtr diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index 0c1a0ce2515b..c4c7b8417602 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -14,6 +14,7 @@ var/list/hidden_nodes = list() //Hidden nodes. id = TRUE. Used for unhiding nodes when requirements are met by removing the entry of the node. var/list/deconstructed_items = list() //items already deconstructed for a generic point boost. path = list(point_type = points) var/list/research_points = list() //Available research points. type = number + var/list/stored_research_points = list() //Stored research, up to doubles server mining when present. type = number var/list/obj/machinery/computer/rdconsole/consoles_accessing = list() var/id = "generic" var/list/research_logs = list() //IC logs. @@ -142,6 +143,7 @@ /datum/techweb/proc/get_researched_nodes() return researched_nodes - hidden_nodes +/// procs for modifying a specific point type amount /datum/techweb/proc/add_point_type(type, amount) if(!SSresearch.point_types[type] || (amount <= 0)) return FALSE @@ -160,6 +162,25 @@ research_points[type] = max(0, research_points[type] - amount) return TRUE +/// procs for modifying a specific point type's stored research amount +/datum/techweb/proc/add_stored_point_type(type, amount) + if(!SSresearch.point_types[type] || (amount <= 0)) + return FALSE + stored_research_points[type] = max(0, stored_research_points[type] + amount) + return TRUE + +/datum/techweb/proc/modify_stored_point_type(type, amount) + if(!SSresearch.point_types[type]) + return FALSE + stored_research_points[type] = max(0, stored_research_points[type] + amount) + return TRUE + +/datum/techweb/proc/remove_stored_point_type(type, amount) + if(!SSresearch.point_types[type] || (amount <= 0)) + return FALSE + stored_research_points[type] = max(0, stored_research_points[type] - amount) + return TRUE + /datum/techweb/proc/add_design_by_id(id, custom = FALSE) return add_design(SSresearch.techweb_design_by_id(id), custom) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 5b2e00bd62af..00887016893e 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -547,7 +547,7 @@ display_name = "Cybernetic Implants" description = "Electronic implants that improve humans." prereq_ids = list("adv_biotech", "datatheory") - design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-diaghud") + design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-scihud", "ci-diaghud") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/research/techweb/layout.dm b/code/modules/research/techweb/layout.dm index 80c986c9ebef..3f2a0c33c30a 100644 --- a/code/modules/research/techweb/layout.dm +++ b/code/modules/research/techweb/layout.dm @@ -75,10 +75,6 @@ ui_x = 288 ui_y = -96 -/datum/techweb_node/xenoorgan_biotech - ui_x = 256 - ui_y = -64 - /datum/techweb_node/bio_process ui_x = 224 ui_y = -224 @@ -219,6 +215,10 @@ ui_x = 32 ui_y = -832 +/datum/techweb_node/xenoorgan_biotech + ui_x = 256 + ui_y = -64 + /datum/techweb_node/cyborg_upg_med ui_x = 352 ui_y = -160 @@ -287,6 +287,14 @@ ui_x = 480 ui_y = -32 +/datum/techweb_node/ai_cpu_advanced + ui_x = 992 + ui_y = 64 + +/datum/techweb_node/ai_ram_high_cap + ui_x = 544 + ui_y = 64 + /datum/techweb_node/spacepod_storage ui_x = 96 ui_y = -832 @@ -327,10 +335,6 @@ ui_x = 96 ui_y = -448 -/datum/techweb_node/magmite_mining - ui_x = 160 - ui_y = -512 - /datum/techweb_node/janitor ui_x = -320 ui_y = -160 @@ -371,6 +375,18 @@ ui_x = -256 ui_y = -224 +/datum/techweb_node/ai_cpu_bluespace + ui_x = 992 + ui_y = 192 + +/datum/techweb_node/ai_ram_bluespace + ui_x = 544 + ui_y = 192 + +/datum/techweb_node/ai_architecture_bluespace + ui_x = 768 + ui_y = 160 + /datum/techweb_node/adv_plasma ui_x = 32 ui_y = -384 @@ -395,6 +411,14 @@ ui_x = -576 ui_y = -96 +/datum/techweb_node/ai_cpu_1 + ui_x = 896 + ui_y = 64 + +/datum/techweb_node/ai_ram_1 + ui_x = 640 + ui_y = 64 + /datum/techweb_node/emp_super ui_x = -224 ui_y = -128 @@ -435,6 +459,18 @@ ui_x = -416 ui_y = -256 +/datum/techweb_node/ai_cpu_experimental + ui_x = 992 + ui_y = 128 + +/datum/techweb_node/ai_ram_hyper + ui_x = 544 + ui_y = 128 + +/datum/techweb_node/magmite_mining + ui_x = 160 + ui_y = -512 + /datum/techweb_node/mech_diamond_drill ui_x = 96 ui_y = -512 @@ -479,6 +515,14 @@ ui_x = -416 ui_y = -320 +/datum/techweb_node/ai_cpu_3 + ui_x = 896 + ui_y = 192 + +/datum/techweb_node/ai_ram_3 + ui_x = 640 + ui_y = 192 + /datum/techweb_node/spacepod_advplasmacutter ui_x = 160 ui_y = -640 @@ -499,6 +543,18 @@ ui_x = -576 ui_y = -32 +/datum/techweb_node/ai_architecture_256 + ui_x = 768 + ui_y = 96 + +/datum/techweb_node/ai_cpu_2 + ui_x = 896 + ui_y = 128 + +/datum/techweb_node/ai_ram_2 + ui_x = 640 + ui_y = 128 + /datum/techweb_node/xenology ui_x = 480 ui_y = -96 diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm index 4cf19ca5dd0b..756ce49e4d13 100644 --- a/code/modules/spells/spell_types/conjure.dm +++ b/code/modules/spells/spell_types/conjure.dm @@ -101,7 +101,7 @@ /obj/effect/proc_holder/spell/aoe_turf/horde name = "Horde" - desc = "Bring all your existing bloodmen to you at the cost of 18% blood (15 brain damage for those without blood)." + desc = "Bring all your existing bloodmen to you at the cost of 3% blood per bloodman or 5 brain damage per bloodman if you're a bloodless race." action_icon = 'icons/mob/actions/actions_cult.dmi' action_icon_state = "horde" var/list/summon_type = list("/mob/living/simple_animal/hostile/asteroid/hivelord/legion/bloodman") @@ -123,7 +123,7 @@ user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) to_chat(usr, span_notice("You can almost feel your brain writhing as you call your bloodmen to you.")) else - user.blood_volume -= 30 + user.blood_volume -= 15 to_chat(usr, span_notice("You feel yourself becoming paler with every minion called.")) if(T) bloodman.forceMove(T) diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 724248192792..0f18c664b5a2 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -141,18 +141,19 @@ /obj/item/melee/touch_attack/raisehand name = "\improper raise bloodman" - desc = "Blood covers your hand like a glove as it waits for a new host." + desc = "Prepare to raise a bloodman for about 5% of your blood or 5 brain damage if you're a bloodless race." on_use_sound = 'sound/magic/wandodeath.ogg' icon_state = "flagellation" item_state = "hivehand" color = "#FF0000" + /obj/item/melee/touch_attack/raisehand/afterattack(atom/target, mob/living/carbon/user, proximity) var/mob/living/carbon/human/M = target if(!ishuman(M) || M.stat != DEAD) - to_chat(M, span_notice("You must be targeting a dead humanoid!")) + to_chat(user, span_notice("You must be targeting a dead humanoid!")) return if(GLOB.bloodmen_list.len > 2) - to_chat(M, span_notice("You can't control that many minions!")) + to_chat(user, span_notice("You can't control that many minions!")) return if(NOBLOOD in M.dna.species.species_traits) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) @@ -163,9 +164,8 @@ L.stored_mob = M M.forceMove(L) qdel(src) - user.blood_volume -= 50 // 9% blood cost, cheaper than the other spell because its not like you can stop near a corpse or find one near you in a fight - to_chat(user, "You curse the body with your blood, leaving you feeling a bit light-headed.") - + user.blood_volume -= 25 + to_chat(user, span_notice("You curse the body with your blood, leaving you feeling a bit light-headed.")) /obj/item/melee/touch_attack/pacifism name = "\improper pacifism touch" diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm index a4fb116a2b7f..3b06f41a4882 100644 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ b/code/modules/spells/spell_types/touch_attacks.dm @@ -104,9 +104,9 @@ hand_path = /obj/item/melee/touch_attack/pacifism school = "evocation" - charge_max = 600 + charge_max = 1 MINUTES clothes_req = FALSE - cooldown_min = 2 MINUTES + cooldown_min = 20 SECONDS action_icon ='icons/mob/gondolas.dmi' action_icon_state = "gondola" diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 1289ddc587e1..7115f32f923c 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -45,3 +45,15 @@ name = "Contraband Security HUD Implant" desc = "A Cybersun Industries brand Security HUD Implant. These illicit cybernetic eye implants will display a security HUD over everything you see." syndicate_implant = TRUE + +/obj/item/organ/cyberimp/eyes/hud/science + name = "Chemical Analyzer implant" + desc = "These cybernetic eye implants will allow rapid identification of reagents." + +/obj/item/organ/cyberimp/eyes/hud/science/Insert(var/mob/living/carbon/M, var/special = 0, drop_if_replaced = FALSE) + ..() + ADD_TRAIT(owner, TRAIT_SEE_REAGENTS, src) + +/obj/item/organ/cyberimp/eyes/hud/science/Remove(var/mob/living/carbon/M, var/special = 0) + REMOVE_TRAIT(owner, TRAIT_SEE_REAGENTS, src) + ..() diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm new file mode 100644 index 000000000000..45b57042b1ed --- /dev/null +++ b/code/modules/surgery/stomachpump.dm @@ -0,0 +1,53 @@ +/datum/surgery/stomach_pump + name = "Stomach Pump" + steps = list( + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/incise, + /datum/surgery_step/clamp_bleeders, + /datum/surgery_step/stomach_pump, + /datum/surgery_step/close) + + target_mobtypes = list(/mob/living/carbon/human) + possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = TRUE + ignore_clothes = FALSE + +/datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target) + var/obj/item/organ/stomach/target_stomach = target.getorganslot(ORGAN_SLOT_STOMACH) + if(HAS_TRAIT(target, TRAIT_HUSK)) + return FALSE + if(!target_stomach) + return FALSE + return ..() + +//Working the stomach by hand in such a way that you induce vomiting. +/datum/surgery_step/stomach_pump + name = "Pump Stomach" + accept_hand = TRUE + repeatable = TRUE + time = 2 SECONDS + +/datum/surgery_step/stomach_pump/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, span_notice("You begin pumping [target]'s stomach..."), + span_notice("[user] begins to pump [target]'s stomach."), + span_notice("[user] begins to press on [target]'s chest.")) + display_pain(target, "You feel a horrible sloshing feeling in your gut! You're going to be sick!") + +/datum/surgery_step/stomach_pump/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + if(ishuman(target)) + var/mob/living/carbon/human/target_human = target + display_results(user, target, span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"), + span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"), + "[user] forces [target_human] to vomit!") + target_human.vomit(20, FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 0.67) //higher purge ratio than regular vomiting + return ..() + +/datum/surgery_step/stomach_pump/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(ishuman(target)) + var/mob/living/carbon/human/target_human = target + display_results(user, target, span_warning("You screw up, brusing [target_human]'s chest!"), + span_warning("[user] screws up, brusing [target_human]'s abdomen!"), + span_warning("[user] screws up!")) + target_human.adjustOrganLoss(ORGAN_SLOT_STOMACH, 10) + target_human.adjustBruteLoss(5) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 0274b588e0cd..92714731a597 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -104,6 +104,8 @@ if(IS_MEDICAL(user)) user_speed_mod = 0.8 + var/previous_loc = user.loc + if(do_after(user, time * tool_speed_mod * user_speed_mod, target)) var/prob_chance = 100 @@ -129,7 +131,9 @@ surgery.status++ if(surgery.status > surgery.steps.len) surgery.complete() - + else + if(!(previous_loc == user.loc)) + move_ouchie(user, target, target_zone, tool, advance) surgery.step_in_progress = FALSE return advance @@ -248,8 +252,27 @@ var/final_ouchie_chance = SURGERY_FUCKUP_CHANCE * ouchie_mod if(!prob(final_ouchie_chance)) return - user.visible_message(span_boldwarning("[target] flinches, bumping [user]'s [tool ? tool.name : "hand"] into something important!"), span_boldwarning("[target] flinches, bumping your [tool ? tool.name : "hand"] into something important!")) + user.visible_message(span_boldwarning("[target] flinches, bumping [user]'s [tool ? tool.name : "hand"] into something important!"), span_boldwarning("[target] flinches, bumping your [tool ? tool.name : "hand"] into something important!")) target.apply_damage(fuckup_damage, fuckup_damage_type, target_zone) //if(ishuman(target) &&fuckup_damage_type == BRUTE && prob(final_ouchie_chance/2)) //var/mob/living/carbon/human/H = target //H.bleed_rate += min(fuckup_damage/4, 10) + +///Deal damage if the user moved during the op +/datum/surgery_step/proc/move_ouchie(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, success) + user.visible_message(span_boldwarning("[user] bumps [p_their(FALSE, user)] [tool ? tool.name : "hand"] into something important!"), span_boldwarning("You move, bumping your [tool ? tool.name : "hand"] into something important!")) + target.apply_damage(fuckup_damage, fuckup_damage_type, target_zone) + +/** + * Sends a pain message to the target, including a chance of screaming. + * + * Arguments: + * * target - Who the message will be sent to + * * pain_message - The message to be displayed + * * mechanical_surgery - Boolean flag that represents if a surgery step is done on a mechanical limb (therefore does not force scream) + */ +/datum/surgery_step/proc/display_pain(mob/living/target, pain_message, mechanical_surgery = FALSE) + if(!HAS_TRAIT(target, TRAIT_SURGERY_PREPARED)) + to_chat(target, span_userdanger(pain_message)) + if(prob(30) && !mechanical_surgery) + target.emote("scream") diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 82b77793eeda..4298c723052e 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -465,6 +465,9 @@ GLOBAL_LIST_EMPTY(vending_products) break /obj/machinery/vending/proc/tilt(mob/fatty, crit=FALSE) + var/no_tipper = FALSE + if(!fatty) + no_tipper = TRUE visible_message("[src] tips over!") tilted = TRUE layer = ABOVE_MOB_LAYER @@ -476,7 +479,7 @@ GLOBAL_LIST_EMPTY(vending_products) if(forcecrit) crit_case = forcecrit - if(in_range(fatty, src)) + if(no_tipper || in_range(fatty, src)) for(var/mob/living/L in get_turf(fatty)) var/mob/living/carbon/C = L @@ -544,7 +547,7 @@ GLOBAL_LIST_EMPTY(vending_products) M.Turn(pick(90, 270)) transform = M - if(get_turf(fatty) != get_turf(src)) + if(fatty && get_turf(fatty) != get_turf(src)) throw_at(get_turf(fatty), 1, 1, spin=FALSE) /obj/machinery/vending/proc/untilt(mob/user) diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index b8410e719044..4e430624691a 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -13,6 +13,7 @@ /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10, /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10, /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10, + /obj/item/reagent_containers/food/drinks/soda_cans/rootbeer=10, /obj/item/reagent_containers/glass/beaker/waterbottle = 10) contraband = list(/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6, /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6, diff --git a/config/game_options.txt b/config/game_options.txt index 896c6fc3c00d..17241a984872 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -20,7 +20,7 @@ REVIVAL_BRAIN_LIFE -1 JOB_SPECIES_WHITELIST /datum/job/captain human JOB_SPECIES_WHITELIST /datum/job/hop human JOB_SPECIES_WHITELIST /datum/job/hos human,lizard -JOB_SPECIES_WHITELIST /datum/job/chief_engineer human,plasmaman,moth,ethereal,preternis, polysmorph +JOB_SPECIES_WHITELIST /datum/job/chief_engineer human,plasmaman,moth,ethereal,preternis,polysmorph JOB_SPECIES_WHITELIST /datum/job/rd human,pod,plasmaman,ethereal,preternis,polysmorph JOB_SPECIES_WHITELIST /datum/job/cmo human,lizard,pod,moth diff --git a/html/changelog.html b/html/changelog.html index 5f9e21ac3598..6f0c1a81a0b5 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -58,6 +58,156 @@ -->