diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..543058728f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "byond", + "request": "launch", + "name": "Launch DreamSeeker", + "preLaunchTask": "Build All", + "dmb": "${workspaceFolder}/${command:CurrentDMB}" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index f290e9f369..849a5165e1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,8 +6,11 @@ "typescript.tsdk": "./tgui/.yarn/sdks/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true, "search.exclude": { - "tgui/.yarn": true, - "tgui/.pnp.*": true + "**/.yarn": true, + "**/.pnp.*": true + }, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true }, "workbench.editorAssociations": [ { @@ -17,5 +20,14 @@ ], "files.eol": "\n", "gitlens.advanced.blame.customArguments": ["-w"], - "tgstationTestExplorer.project.resultsType": "json" + "tgstationTestExplorer.project.resultsType": "json", + "[javascript]": { + "editor.rulers": [80] + }, + "[typescript]": { + "editor.rulers": [80] + }, + "[scss]": { + "editor.rulers": [80] + } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000..b7d12f0527 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,55 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "process", + "command": "tools/build/build", + "windows": { + "command": ".\\tools\\build\\build.bat" + }, + "options": { + "env": { + "DM_EXE": "${config:dreammaker.byondPath}" + } + }, + "problemMatcher": [ + "$dreammaker", + "$tsc", + "$eslint-stylish" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "dependsOn": "dm: reparse", + "label": "Build All" + }, + { + "type": "dreammaker", + "dme": "tgstation.dme", + "problemMatcher": [ + "$dreammaker" + ], + "group": "build", + "label": "dm: build - tgstation.dme" + }, + { + "type": "shell", + "command": "tgui/bin/tgui", + "windows": { + "command": ".\\tgui\\bin\\tgui.bat" + }, + "problemMatcher": [ + "$tsc", + "$eslint-stylish" + ], + "group": "build", + "label": "tgui: build" + }, + { + "command": "${command:dreammaker.reparse}", + "group": "build", + "label": "dm: reparse" + } + ] +} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm index c2bdea157e..ed882850cf 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm @@ -499,10 +499,6 @@ /mob/living/simple_animal/hostile/alien, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) -"bD" = ( -/obj/structure/alien/weeds, -/turf/template_noop, -/area/ruin/unpowered/xenonest) "dE" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, @@ -1573,8 +1569,8 @@ aa aa aa ac -bD -bD +ag +ag aa "} (20,1,1) = {" @@ -1625,7 +1621,7 @@ aa aa aa ac -bD +ag aa "} (21,1,1) = {" @@ -1676,8 +1672,8 @@ ac aa aa ac -bD -bD +ag +ag "} (22,1,1) = {" ab @@ -1727,8 +1723,8 @@ ac ac ac aW -bD -bD +ag +ag "} (23,1,1) = {" ab @@ -1778,8 +1774,8 @@ ag aw ar ag -bD -bD +ag +ag "} (24,1,1) = {" ab @@ -1829,8 +1825,8 @@ ag aw ar ag -bD -bD +ag +ag "} (25,1,1) = {" ab @@ -1880,8 +1876,8 @@ ac ac ac ac -bD -bD +ag +ag "} (26,1,1) = {" ab diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 9ace5cf95b..aacedbca82 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -23919,11 +23919,11 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/maintenance/port) "bfe" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/maintenance/port) "bff" = ( @@ -25957,7 +25957,7 @@ /area/medical/paramedic) "bkd" = ( /obj/machinery/camera{ - c_tag = "Medbay Morgue"; + c_tag = "Paramedic Disbatch"; dir = 8; network = list("ss13","medbay") }, @@ -26360,7 +26360,7 @@ req_access_txt = "6" }, /turf/open/floor/plasteel/dark, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "blb" = ( /obj/machinery/door/airlock/command{ name = "Captain's Quarters"; @@ -27606,13 +27606,13 @@ /obj/structure/sign/warning/radiation/rad_area{ pixel_x = 32 }, -/obj/structure/cable{ - icon_state = "0-2" - }, /obj/structure/cable{ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plating, /area/engineering/gravity_generator) "bnX" = ( @@ -33974,12 +33974,12 @@ }, /obj/machinery/bloodbankgen, /obj/machinery/camera{ - c_tag = "Medbay Recovery Room"; + c_tag = "Medbay Surgery Storage"; dir = 6; network = list("ss13","medbay") }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/storage) "bCD" = ( /obj/machinery/computer/operating, /turf/open/floor/plasteel/white/side, @@ -34354,11 +34354,14 @@ /area/engineering/storage/tech) "bDA" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/storage) "bDB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -34366,6 +34369,9 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/white/side{ dir = 4 }, @@ -35118,7 +35124,7 @@ dir = 4 }, /turf/closed/wall, -/area/medical/medbay/central) +/area/medical/storage) "bFn" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -35130,12 +35136,12 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/machinery/light/small{ - dir = 1 - }, /obj/effect/decal/cleanable/blood/old, +/obj/machinery/airalarm{ + pixel_y = 23 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/storage) "bFp" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood/random, @@ -35162,8 +35168,11 @@ dir = 8; sortType = 6 }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/storage) "bFq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/yellow, @@ -35187,8 +35196,11 @@ /obj/structure/disposalpipe/segment, /obj/structure/closet/crate/freezer/surplus_limbs, /obj/item/reagent_containers/glass/beaker/synthflesh, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/storage) "bFu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -35222,8 +35234,9 @@ "bFx" = ( /obj/structure/disposalpipe/segment, /obj/machinery/limbgrower, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/storage) "bFy" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -35809,7 +35822,7 @@ dir = 4 }, /turf/closed/wall, -/area/medical/medbay/central) +/area/medical/storage) "bGR" = ( /obj/structure/table, /obj/item/storage/belt/medical{ @@ -35860,11 +35873,9 @@ /area/medical/medbay/central) "bGW" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, /turf/closed/wall, -/area/medical/medbay/central) +/area/medical/storage) "bGX" = ( /obj/machinery/light{ dir = 8 @@ -37012,7 +37023,7 @@ dir = 9 }, /turf/closed/wall, -/area/medical/medbay/central) +/area/medical/storage) "bJB" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers, /turf/open/floor/plasteel, @@ -40879,8 +40890,8 @@ /turf/open/floor/plasteel, /area/engineering/atmos) "bTT" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 }, /obj/machinery/meter, /turf/open/floor/plasteel, @@ -52309,7 +52320,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/science/robotics/mechbay) +/area/maintenance/department/medical/morgue) "cHF" = ( /obj/machinery/button/door{ id = "Skynet_launch"; @@ -54428,7 +54439,7 @@ "fvk" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, -/area/medical/medbay/central) +/area/medical/storage) "fvY" = ( /obj/machinery/computer/cryopod{ pixel_y = 26 @@ -55768,6 +55779,9 @@ req_access_txt = "45" }, /obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/medical/surgery) "iVJ" = ( @@ -56031,7 +56045,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/reagent_dispensers/fueltank, +/obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/maintenance/port) "jyO" = ( @@ -56248,6 +56262,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plasteel, /area/engineering/engine_smes) "jLv" = ( @@ -56560,7 +56575,7 @@ dir = 6 }, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "0-2" }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) @@ -57358,6 +57373,7 @@ /area/service/bar) "moS" = ( /obj/machinery/atmospherics/pipe/manifold4w/yellow/visible, +/obj/machinery/meter, /turf/open/floor/plasteel, /area/engineering/atmos) "mps" = ( @@ -57521,6 +57537,19 @@ /obj/structure/falsewall, /turf/open/floor/plating, /area/security/prison) +"mJf" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engineering/gravity_generator) "mJo" = ( /obj/structure/door_assembly/door_assembly_mai, /obj/item/electronics/airlock, @@ -57562,9 +57591,6 @@ name = "Gravity Generator"; req_access_txt = "11" }, -/obj/structure/cable{ - icon_state = "1-8" - }, /turf/open/floor/plasteel/dark, /area/engineering/gravity_generator) "mOG" = ( @@ -58231,9 +58257,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/light{ dir = 4; light_color = "#c1caff" @@ -60411,6 +60434,9 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engineering/atmos) +"tBV" = ( +/turf/closed/wall, +/area/medical/storage) "tCa" = ( /obj/structure/table/wood, /obj/item/instrument/guitar{ @@ -60524,6 +60550,9 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) "tJS" = ( @@ -60754,10 +60783,10 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "ugu" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, /obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) "uhm" = ( @@ -61009,8 +61038,17 @@ dir = 4 }, /obj/structure/disposalpipe/segment, +/obj/machinery/power/apc{ + areastring = "/area/medical/storage"; + name = "Medbay Surgery Storage"; + pixel_x = 1; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/storage) "uFZ" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ @@ -61117,10 +61155,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/terminal, /turf/closed/wall/r_wall, /area/engineering/gravity_generator) "uRn" = ( @@ -61327,15 +61361,24 @@ /turf/open/floor/plating, /area/maintenance/port) "vob" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/meter, /turf/open/floor/plasteel, -/area/engineering/gravity_generator) +/area/engineering/atmos) "voW" = ( /obj/structure/pool/Lboard, /turf/open/pool, /area/commons/fitness/pool) +"voZ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/storage) "vpY" = ( /obj/structure/closet/lasertag/blue, /obj/item/clothing/under/misc/pj/blue, @@ -61527,10 +61570,13 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "vFr" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) "vGn" = ( @@ -62156,9 +62202,6 @@ /turf/open/floor/carpet/royalblue, /area/maintenance/starboard/aft) "xgC" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/power/apc{ areastring = "/area/engineering/gravity_generator"; dir = 8; @@ -62172,13 +62215,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable{ - icon_state = "0-2" - }, /obj/machinery/light{ dir = 8; light_color = "#e8eaff" }, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) "xgF" = ( @@ -62188,13 +62231,10 @@ }, /area/maintenance/bar) "xhS" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) "xhV" = ( @@ -81844,7 +81884,7 @@ aQN aQN aZA aPA -aWv +jxF aYb aZE aZE @@ -82615,7 +82655,7 @@ aQW aQW xDM aPA -jxF +aWv aYb aZE bjp @@ -84992,7 +85032,7 @@ btG rXl xgC ugu -bnV +mJf bph bih big @@ -85247,7 +85287,7 @@ xTy xTy tJK xTy -vob +xTy xhS mOB bph @@ -86153,7 +86193,7 @@ aaa aaa gXs gXs -aaH +gXs abc abu abu @@ -87036,11 +87076,11 @@ bCq bSs ceY ccw -ccw +cjJ cnR cgT cjJ -ccw +cjJ ccw ccw ccw @@ -95226,10 +95266,10 @@ aJq bHt bBz bzs -bof +tBV bFm bGI -bof +tBV cBD bKD bLO @@ -95483,7 +95523,7 @@ bwu kPj bBB eBX -bof +tBV bFp uFV fvk @@ -95740,7 +95780,7 @@ aJq bAj aJq aKG -bof +tBV bFo bDA bFt @@ -95997,9 +96037,9 @@ byX aXh bmE bCA -bof +tBV bCC -bDA +voZ bFx bGW bKI @@ -96267,7 +96307,7 @@ bPc bQs cez ceA -daq +bTT bUN bOd bOd @@ -97299,9 +97339,9 @@ moS kGv bUS cCE -bTT -bUS +bXU bUS +vob bUS bXU bUS diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 8c382e56e8..2e84b729e7 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -7322,6 +7322,22 @@ }, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) +"avT" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "avX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -7726,6 +7742,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"ayq" = ( +/obj/structure/sign/warning/electricshock, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) "ayS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -13232,7 +13255,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/secondary/service) +/area/maintenance/port/fore) "aYA" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -18573,6 +18596,18 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) +"bxE" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "bxV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -33522,7 +33557,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/security/range) +/area/maintenance/starboard) "cqi" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, @@ -39771,6 +39806,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "cQw" = ( @@ -40614,6 +40650,7 @@ id = "xeno4"; name = "Creature Cell #4" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/science/xenobiology) "cRX" = ( @@ -40654,6 +40691,7 @@ id = "xeno4"; name = "Creature Cell #4" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/xenobiology) "cRZ" = ( @@ -40665,6 +40703,7 @@ id = "xeno5"; name = "Creature Cell #5" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/science/xenobiology) "cSa" = ( @@ -40705,6 +40744,7 @@ id = "xeno5"; name = "Creature Cell #5" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/xenobiology) "cSc" = ( @@ -40716,6 +40756,7 @@ id = "xeno6"; name = "Creature Cell #6" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/science/xenobiology) "cSd" = ( @@ -40756,6 +40797,7 @@ id = "xeno6"; name = "Creature Cell #6" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/xenobiology) "cSf" = ( @@ -41528,6 +41570,10 @@ /area/science/xenobiology) "cTA" = ( /obj/structure/sign/warning/electricshock, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/closed/wall/r_wall, /area/science/xenobiology) "cTB" = ( @@ -41539,6 +41585,9 @@ id = "xenosecure"; name = "Secure Pen Shutters" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "cTC" = ( @@ -41548,16 +41597,19 @@ network = list("xeno") }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cTD" = ( /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cTE" = ( @@ -41600,6 +41652,7 @@ req_access_txt = "55" }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "cTI" = ( @@ -41622,6 +41675,7 @@ dir = 1 }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "cTK" = ( @@ -41639,6 +41693,7 @@ req_access_txt = "55" }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "cTM" = ( @@ -41654,6 +41709,7 @@ dir = 1 }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "cTN" = ( @@ -41679,6 +41735,7 @@ req_access_txt = "55" }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "cTP" = ( @@ -42650,6 +42707,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, /area/science/xenobiology) "cVF" = ( @@ -42751,18 +42809,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"cVN" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cVO" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -43488,10 +43534,12 @@ dir = 4; name = "emergency shower" }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/stripes/end{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cXd" = ( @@ -43539,12 +43587,12 @@ dir = 8; name = "emergency shower" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, /obj/effect/turf_decal/stripes/end{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cXh" = ( @@ -43560,6 +43608,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cXi" = ( @@ -44311,6 +44362,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "cYL" = ( @@ -44386,11 +44438,11 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cYS" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, /turf/open/floor/plasteel, /area/science/xenobiology) "cYT" = ( @@ -45144,22 +45196,26 @@ id = "xenosecure"; name = "Secure Pen Shutters" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "dar" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "das" = ( /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "dat" = ( @@ -45191,6 +45247,7 @@ /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "daw" = ( @@ -45220,6 +45277,7 @@ req_access_txt = "55" }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "day" = ( @@ -45233,6 +45291,7 @@ }, /obj/structure/disposalpipe/trunk, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "daz" = ( @@ -45246,6 +45305,7 @@ req_access_txt = "55" }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "daA" = ( @@ -45259,6 +45319,7 @@ req_access_txt = "55" }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "daB" = ( @@ -46056,6 +46117,9 @@ dir = 5 }, /obj/machinery/shieldwallgen/xenobiologyaccess, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "dcd" = ( @@ -46067,6 +46131,10 @@ pixel_y = -22 }, /obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/binary/valve/digital{ + icon_state = "dvalve_map-2"; + dir = 8 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "dce" = ( @@ -46075,6 +46143,9 @@ }, /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/canister/bz, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "dcf" = ( @@ -46100,6 +46171,7 @@ id = "xeno1"; name = "Creature Cell #1" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/science/xenobiology) "dch" = ( @@ -46138,6 +46210,7 @@ id = "xeno1"; name = "Creature Cell #1" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/xenobiology) "dcj" = ( @@ -46150,6 +46223,7 @@ id = "xeno2"; name = "Creature Cell #2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/science/xenobiology) "dck" = ( @@ -46188,6 +46262,7 @@ id = "xeno2"; name = "Creature Cell #2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/xenobiology) "dcm" = ( @@ -46200,6 +46275,7 @@ id = "xeno3"; name = "Creature Cell #3" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/science/xenobiology) "dcn" = ( @@ -46238,6 +46314,7 @@ id = "xeno3"; name = "Creature Cell #3" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/xenobiology) "dcp" = ( @@ -47050,7 +47127,9 @@ /turf/open/floor/plasteel, /area/maintenance/port) "ddQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/closed/wall/r_wall, /area/science/xenobiology) "ddR" = ( @@ -47068,6 +47147,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "ddS" = ( @@ -47718,8 +47798,8 @@ "dfb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, /turf/open/floor/plating, /area/maintenance/port) @@ -48270,6 +48350,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/maintenance/port) "dgn" = ( @@ -49101,7 +49182,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/maintenance/port) "dhU" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, @@ -65044,6 +65125,10 @@ network = list("ss13","medbay") }, /obj/effect/turf_decal/delivery, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, /turf/open/floor/plasteel, /area/medical/virology) "dQh" = ( @@ -71534,6 +71619,9 @@ }, /turf/open/floor/plasteel/dark, /area/command/heads_quarters/hos) +"emZ" = ( +/turf/closed/wall, +/area/hallway/primary/port) "enl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/corner, @@ -72053,24 +72141,6 @@ /obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engineering/atmos) -"exg" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 - }, -/area/command/heads_quarters/ce) "exo" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -73716,6 +73786,11 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"fdK" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, +/turf/open/floor/plasteel, +/area/science/xenobiology) "fdM" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -77434,6 +77509,13 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"grf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + icon_state = "pipe11-2"; + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) "grh" = ( /obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, @@ -77548,6 +77630,10 @@ icon_state = "wood-broken2" }, /area/service/abandoned_gambling_den/secondary) +"gux" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/service/abandoned_gambling_den) "guH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -77750,6 +77836,23 @@ }, /turf/open/floor/plasteel/white, /area/command/heads_quarters/cmo) +"gzQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + icon_state = "inje_map-2"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "gAA" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -79736,20 +79839,6 @@ }, /turf/open/floor/plasteel/dark, /area/service/library) -"hkJ" = ( -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 - }, -/area/command/heads_quarters/ce) "hkK" = ( /obj/structure/table/reinforced, /obj/item/electronics/firelock, @@ -80892,6 +80981,16 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/cargo/storage) +"hDD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply, +/turf/open/floor/plasteel, +/area/science/xenobiology) "hDE" = ( /obj/machinery/light{ dir = 4 @@ -84797,6 +84896,11 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/command/nuke_storage) +"iMf" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/manifold4w/supply, +/turf/open/floor/plasteel, +/area/science/xenobiology) "iMm" = ( /obj/structure/cable{ icon_state = "2-4" @@ -86319,6 +86423,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -86983,6 +87090,14 @@ }, /turf/open/floor/plasteel/white, /area/command/heads_quarters/cmo) +"jyy" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/science/xenobiology) "jyI" = ( /obj/structure/chair/stool/bar, /obj/item/radio/intercom{ @@ -87610,6 +87725,24 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/cargo/qm) +"jJL" = ( +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "jJT" = ( /obj/machinery/photocopier, /obj/machinery/firealarm{ @@ -89074,6 +89207,20 @@ }, /turf/open/floor/plasteel/dark/corner, /area/engineering/atmospherics_engine) +"kiv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "kiP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -91485,6 +91632,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, /area/command/heads_quarters/ce) "laA" = ( @@ -92055,6 +92205,14 @@ icon_state = "chapel" }, /area/service/chapel/main) +"lnO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/science/xenobiology) "lnY" = ( /obj/structure/weightmachine/stacklifter, /obj/effect/turf_decal/tile/neutral{ @@ -92807,9 +92965,6 @@ /area/engineering/break_room) "lCx" = ( /obj/structure/table/reinforced, -/obj/structure/cable/white{ - icon_state = "1-2" - }, /obj/item/clipboard, /obj/item/toy/figure/ce, /obj/effect/turf_decal/tile/neutral{ @@ -93154,6 +93309,20 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/aisat/exterior) +"lIV" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "lIY" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/green{ @@ -93328,9 +93497,6 @@ /area/service/abandoned_gambling_den) "lLv" = ( /obj/structure/table/reinforced, -/obj/structure/cable/white{ - icon_state = "2-4" - }, /obj/item/folder/blue{ pixel_x = 3; pixel_y = 3 @@ -94196,9 +94362,6 @@ /obj/item/gps/engineering{ gpstag = "CE0" }, -/obj/machinery/newscaster{ - pixel_y = 32 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -94212,6 +94375,15 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/power/apc{ + areastring = "/area/command/heads_quarters/ce"; + dir = 1; + name = "Chief Engineer's APC"; + pixel_y = 30 + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, /turf/open/floor/plasteel/dark, /area/command/heads_quarters/ce) "mcu" = ( @@ -95678,6 +95850,13 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"mFc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/port) "mFj" = ( /obj/machinery/disposal/bin, /obj/machinery/airalarm{ @@ -96636,6 +96815,16 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engineering/main) +"mSI" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "mSP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/reagent_dispensers/fueltank, @@ -96682,6 +96871,17 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"mTS" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "mTU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment{ @@ -96976,6 +97176,12 @@ /obj/structure/chair/office/dark, /turf/open/floor/wood, /area/commons/dorms) +"mYQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/circuit) "mYT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/cardboard, @@ -97892,6 +98098,20 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/service/hydroponics/garden/abandoned) +"nqC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "nqX" = ( /obj/structure/table/wood, /obj/item/storage/dice, @@ -100233,6 +100453,12 @@ "ohd" = ( /turf/open/floor/plasteel/freezer, /area/service/kitchen) +"ohp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) "ohv" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/random, @@ -101340,6 +101566,17 @@ /obj/structure/sign/poster/random, /turf/closed/wall, /area/service/bar/atrium) +"oCR" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "oDg" = ( /obj/structure/lattice, /turf/open/space, @@ -101727,6 +101964,17 @@ }, /turf/open/floor/plasteel/dark, /area/service/chapel/office) +"oJE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/science/xenobiology) "oKj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -101785,6 +102033,20 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/command/storage/eva) +"oKZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "oLg" = ( /obj/machinery/vending/cart, /obj/machinery/computer/security/telescreen/entertainment{ @@ -102570,6 +102832,22 @@ }, /turf/open/floor/plating, /area/command/heads_quarters/hos) +"paH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "paM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/disposalpipe/segment{ @@ -103610,6 +103888,12 @@ }, /turf/open/floor/plasteel, /area/cargo/sorting) +"puJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/science/circuit) "puK" = ( /obj/machinery/light, /obj/machinery/status_display/evac{ @@ -106478,7 +106762,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/commons/dorms) +/area/maintenance/starboard) "qtk" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, @@ -107263,6 +107547,14 @@ icon_state = "chapel" }, /area/service/chapel/main) +"qMB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/science/xenobiology) "qMI" = ( /obj/structure/table/wood, /obj/item/storage/briefcase, @@ -109033,25 +109325,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/service/hydroponics) -"rts" = ( -/obj/structure/cable/white, -/obj/machinery/power/apc{ - areastring = "/area/command/heads_quarters/ce"; - name = "Chief Engineer's APC"; - pixel_y = -26 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/command/heads_quarters/ce) "rtx" = ( /obj/structure/table/wood, /obj/item/storage/briefcase{ @@ -111073,6 +111346,7 @@ /turf/open/floor/wood, /area/service/library/abandoned) "saw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/science/circuit) "sax" = ( @@ -111944,6 +112218,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engineering/main) +"spV" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/science/xenobiology) "sqb" = ( /obj/structure/cable/white, /obj/effect/turf_decal/stripes/line{ @@ -114382,6 +114662,10 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/cargo/storage) +"thh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/science/research/abandoned) "tin" = ( /obj/machinery/light{ dir = 1 @@ -115242,7 +115526,7 @@ /turf/open/floor/plasteel/dark, /area/engineering/atmos) "tvv" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, /turf/closed/wall/r_wall, @@ -115872,6 +116156,19 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engineering/storage/tech) +"tGF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/command/heads_quarters/ce) "tGL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -116745,6 +117042,19 @@ }, /turf/open/floor/plating, /area/command/heads_quarters/ce) +"tXb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/science/xenobiology) "tXd" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -117470,9 +117780,6 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/structure/cable/white{ - icon_state = "1-8" - }, /obj/machinery/light{ dir = 4 }, @@ -117487,6 +117794,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, /turf/open/floor/plasteel/dark, /area/command/heads_quarters/ce) "uiv" = ( @@ -118679,6 +118990,12 @@ }, /turf/open/floor/plasteel, /area/engineering/atmospherics_engine) +"uGN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/science/circuit) "uGQ" = ( /obj/structure/table/glass, /obj/item/clipboard, @@ -120902,9 +121219,6 @@ /area/service/chapel/office) "vBq" = ( /obj/structure/table/reinforced, -/obj/structure/cable/white{ - icon_state = "1-2" - }, /obj/item/cartridge/engineering{ pixel_x = 6 }, @@ -121006,6 +121320,11 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/cargo/qm) +"vDi" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/space/nearstation) "vDp" = ( /obj/structure/cable/white{ icon_state = "2-4" @@ -121911,6 +122230,22 @@ /obj/effect/spawner/lootdrop/keg, /turf/open/floor/plating, /area/service/abandoned_gambling_den) +"vXq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/command/heads_quarters/ce) "vXw" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -122483,6 +122818,22 @@ }, /turf/closed/wall/r_wall, /area/engineering/atmospherics_engine) +"wiI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "wiL" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -123714,10 +124065,6 @@ /obj/item/cartridge/atmos, /obj/item/cartridge/atmos, /obj/item/cartridge/atmos, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, /obj/item/stamp/ce, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -124096,6 +124443,22 @@ }, /turf/closed/wall/r_wall, /area/engineering/gravity_generator) +"wKw" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "wKz" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -126002,6 +126365,14 @@ }, /turf/open/floor/plasteel, /area/security/office) +"xxJ" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/science/xenobiology) "xxK" = ( /obj/structure/table/reinforced, /obj/item/crowbar/red, @@ -127016,6 +127387,22 @@ }, /turf/open/floor/plasteel/dark, /area/commons/fitness/recreation) +"xPN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "xQl" = ( /obj/machinery/airalarm{ dir = 1; @@ -151303,13 +151690,13 @@ mMB pRP kkO mcs -mHG +tGF xKr lLv lCx vBq -hkJ -rts +ikP +vXq qjg ine vJe @@ -151562,7 +151949,7 @@ kkO nZq jpC ivQ -exg +tbI tbI ilG hbc @@ -152076,7 +152463,7 @@ kkO jKf prr qPW -xSN +kkO sSa jry pTd @@ -152890,6 +153277,7 @@ cLs cJT caE caE +puJ saw saw saw @@ -152897,18 +153285,17 @@ saw saw saw saw -saw -dhQ -dhQ -dhQ -dhQ -dhQ -dhQ -dhQ -dhQ -efN -ajr -aaa +thh +thh +thh +thh +thh +thh +thh +thh +gux +vDi +spV aaa aad aaa @@ -153147,7 +153534,7 @@ cEo ddO cQt dgl -dhR +mYQ djn dle dmr @@ -153404,7 +153791,7 @@ cRP ddP deW cKk -dhR +mYQ jjN hNZ hic @@ -153658,10 +154045,10 @@ cMY cMY cMY cMY -cMY -cCM +ohp +mFc dgm -dhR +uGN djp qpq dmt @@ -153915,7 +154302,7 @@ cWV cNd cNd cNd -cMY +cLI cLO lEm gmj @@ -154172,7 +154559,7 @@ cON cON cON dcb -cMY +cLI deX dgn dhR @@ -154423,13 +154810,13 @@ cMW cOG cMY cNd +xPN +paH +gzQ +oKZ +avT cNd -cNd -cNd -cNd -cNd -cNd -cMY +cLI deX dgo dhR @@ -154680,13 +155067,13 @@ ceb cCM cMY cMY -cTA -cNd +ayq cNd +wiI cYK cTA -cMY -cMY +grf +cLI deY cKl dhR @@ -154943,7 +155330,7 @@ cWW cYL daq dcc -cMY +cLI cOD cKj dhR @@ -155199,8 +155586,8 @@ cVD cWX cYM dar -cRS -cMY +mSI +cLI deZ dgo dhR @@ -155452,12 +155839,12 @@ cOJ cNc cRT cTD -cVE +bxE cWY cVE das dcd -cMY +cLI deX dgo dhR @@ -155714,7 +156101,7 @@ cWZ cYN dat dce -cMY +cLI dfa dgp fGq @@ -156429,7 +156816,7 @@ pzz kRu iio aMN -alf +emZ bqm bsp bug @@ -156476,17 +156863,17 @@ caE cJZ cLI cNd -cNd -cNd +oKZ +kiv cRW cTH -cVI -cRS -cYQ +iMf +xxJ +lnO dav dcg ddR -cNd +wKw cNd cMY djz @@ -156686,7 +157073,7 @@ vgS xnz iio aMO -alf +emZ bqn bsq buh @@ -156738,7 +157125,7 @@ cNd cRX cTI cVJ -cWY +jJL cYR daw dch @@ -156943,7 +157330,7 @@ lNq skw iio aMN -alf +emZ bqo bsr fzc @@ -156990,17 +157377,17 @@ caE cKa cLI cNd -cNd +lIV cQv cRY cTJ -cVK +tXb cXc cYS dax dci -cNd -cNd +nqC +paH cNd cMY djB @@ -157504,17 +157891,17 @@ caE cKg cLI cNd -cNd -cNd +oKZ +kiv cRZ cTL -cVK -cXd -cYU +hDD +mTS +oJE day dcj ddR -cNd +wKw cNd cMY djD @@ -158018,17 +158405,17 @@ cqL cKi cLI cNd -cNd +lIV cQv cSb cTM -cVK -cXd -cYU +tXb +oCR +cYS daz dcl -cNd -cNd +nqC +paH cNd cMY sYo @@ -158532,17 +158919,17 @@ cjp cJZ cLI cNd -cNd -cNd +oKZ +kiv cSc cTO -cVN +hDD cXg -cYU +oJE dav dcm ddR -cNd +wKw cNd cMY djH @@ -159046,17 +159433,17 @@ ceb cJZ cLI cNd -cNd +lIV cQv cSe cTJ -cVI -cRS -cYQ +qMB +jyy +fdK daA dco -cNd -cNd +nqC +paH cNd cMY djJ diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 9b70a54282..0570a6d480 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -16060,10 +16060,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=14-Starboard-Central"; - location = "13.3-Engineering-Central" - }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, @@ -21712,7 +21708,7 @@ icon_state = "1-2" }, /obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=13.3-Engineering-Central"; + codes_txt = "patrol;next_patrol=14-Starboard-Central"; location = "13.2-Tcommstore" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -25521,6 +25517,9 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/item/paicard{ + pixel_x = -8 + }, /turf/open/floor/plasteel/white, /area/science/research) "cav" = ( @@ -44287,6 +44286,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cRW" = ( @@ -44298,10 +44300,13 @@ name = "containment blast door" }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "cRX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cRY" = ( @@ -44313,6 +44318,7 @@ name = "test chamber blast door" }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/science/xenobiology) "cRZ" = ( @@ -44325,6 +44331,9 @@ name = "containment blast door" }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "cSa" = ( @@ -44395,10 +44404,12 @@ /turf/open/floor/engine, /area/science/xenobiology) "cSi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cSj" = ( @@ -44429,6 +44440,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cSm" = ( @@ -44443,6 +44457,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cSn" = ( @@ -44474,10 +44491,16 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/science/xenobiology) "cSr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cSs" = ( @@ -44489,6 +44512,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cSt" = ( @@ -44507,6 +44533,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/science/xenobiology) "cSw" = ( @@ -44520,6 +44549,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cSx" = ( @@ -44537,16 +44569,6 @@ /mob/living/simple_animal/slime, /turf/open/floor/engine, /area/science/xenobiology) -"cSA" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "cSB" = ( /obj/structure/table/reinforced, /obj/machinery/button/door{ @@ -44564,6 +44586,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cSD" = ( @@ -44576,6 +44601,9 @@ name = "containment blast door" }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "cSE" = ( @@ -44625,10 +44653,12 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "cSK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cSL" = ( @@ -44641,6 +44671,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cSM" = ( @@ -44655,6 +44686,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cSN" = ( @@ -44672,6 +44706,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/science/xenobiology) "cSO" = ( @@ -44683,6 +44720,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cSP" = ( @@ -44705,6 +44745,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/science/xenobiology) "cSR" = ( @@ -44718,6 +44761,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cSS" = ( @@ -44737,6 +44783,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cST" = ( @@ -44756,6 +44805,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cSV" = ( @@ -44803,6 +44855,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cTa" = ( @@ -44823,6 +44876,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cTc" = ( @@ -44840,18 +44896,14 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/science/xenobiology) "cTe" = ( -/obj/machinery/door/window/northleft{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen #6"; - req_access_txt = "55" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /turf/open/floor/plasteel, /area/science/xenobiology) @@ -44868,6 +44920,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/science/xenobiology) "cTj" = ( @@ -44952,6 +45007,7 @@ }, /obj/structure/table/reinforced, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "cTs" = ( @@ -44993,6 +45049,7 @@ /obj/item/clothing/glasses/science, /obj/structure/table, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "cTA" = ( @@ -45057,6 +45114,9 @@ icon_state = "1-2" }, /obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cUN" = ( @@ -45092,6 +45152,7 @@ icon_state = "4-8" }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cVd" = ( @@ -45549,6 +45610,7 @@ /area/science/xenobiology) "daC" = ( /obj/structure/sign/warning/electricshock, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/science/xenobiology) "daD" = ( @@ -46190,6 +46252,9 @@ /area/science/xenobiology) "dcy" = ( /obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcz" = ( @@ -46204,8 +46269,8 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, /turf/open/floor/plasteel/white, /area/science/xenobiology) @@ -46355,6 +46420,9 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcR" = ( @@ -46366,6 +46434,9 @@ name = "containment blast door" }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "dcS" = ( @@ -46416,6 +46487,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "dcW" = ( @@ -46427,6 +46501,9 @@ name = "containment blast door" }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "dcX" = ( @@ -46439,16 +46516,21 @@ name = "containment blast door" }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "dcY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ icon_state = "4-8" }, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcZ" = ( @@ -46473,6 +46555,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "ddb" = ( @@ -46680,6 +46763,7 @@ name = "test chamber blast door" }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/xenobiology) "ddx" = ( @@ -49268,6 +49352,9 @@ /area/hallway/secondary/exit/departure_lounge) "dDI" = ( /obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "dDJ" = ( @@ -50813,6 +50900,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/commons/fitness/recreation) +"ezU" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "eAd" = ( /obj/machinery/door/airlock/highsecurity{ name = "Secure Tech Storage"; @@ -53094,7 +53189,10 @@ /turf/open/floor/plasteel, /area/engineering/atmos) "fVD" = ( -/obj/machinery/pool/drain, +/obj/machinery/pool/drain{ + drain_suck_range = 2; + item_suction_range = 1 + }, /turf/open/pool, /area/commons/fitness/pool) "fVX" = ( @@ -53466,6 +53564,13 @@ }, /turf/open/floor/wood, /area/service/theater) +"ggU" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Air to Distro" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "ghb" = ( /turf/open/floor/plating, /area/engineering/main) @@ -54416,6 +54521,12 @@ }, /turf/open/floor/plasteel, /area/security/office) +"gLN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "gLV" = ( /obj/machinery/vending/boozeomat, /obj/machinery/light/small{ @@ -54653,6 +54764,12 @@ /obj/item/clothing/under/suit/tan, /turf/open/floor/carpet, /area/commons/dorms) +"gTs" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "gTN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -54780,6 +54897,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) "gZF" = ( @@ -56618,6 +56738,12 @@ "icE" = ( /turf/closed/wall, /area/security/office) +"idm" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "idx" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -57339,6 +57465,11 @@ "izZ" = ( /turf/open/floor/engine/n2o, /area/engineering/atmos) +"iAD" = ( +/obj/structure/sign/warning/electricshock, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/science/xenobiology) "iAK" = ( /obj/structure/window/reinforced, /obj/effect/turf_decal/tile/red{ @@ -57465,6 +57596,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) "iFq" = ( @@ -57642,6 +57776,12 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/command/nuke_storage) +"iIk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "iIJ" = ( /obj/item/instrument/violin, /obj/structure/table/wood, @@ -58602,6 +58742,12 @@ }, /turf/open/floor/plasteel, /area/service/bar) +"jqj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "jra" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -60102,6 +60248,13 @@ }, /turf/open/floor/plasteel, /area/engineering/break_room) +"kje" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8; + name = "Xenobiology air connection" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "kjA" = ( /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/yellow, @@ -61593,6 +61746,12 @@ dir = 5 }, /area/service/kitchen) +"lbz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "lbV" = ( /obj/item/folder/white{ pixel_x = 4; @@ -61817,6 +61976,12 @@ }, /turf/open/floor/plasteel, /area/service/hydroponics/garden) +"lhY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "lix" = ( /obj/structure/window/reinforced{ dir = 1 @@ -63138,6 +63303,12 @@ dir = 1 }, /area/engineering/atmos) +"lYC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "lYW" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -65516,6 +65687,16 @@ }, /turf/open/floor/plating, /area/commons/fitness/pool) +"nBJ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "nBX" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -65813,6 +65994,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood, /area/service/library) +"nPc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/science/xenobiology) "nPf" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -67529,6 +67714,9 @@ pixel_y = 24 }, /obj/machinery/computer/atmos_control, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/checker, /area/engineering/atmos) "oOi" = ( @@ -70934,10 +71122,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) "qID" = ( @@ -73737,11 +73925,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/command/storage/eva) -"spO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/turf/open/floor/plating, -/area/engineering/atmos) "spZ" = ( /obj/structure/chair/stool, /turf/open/floor/plasteel/chapel, @@ -74083,7 +74266,7 @@ }, /obj/machinery/door/firedoor, /turf/open/floor/plating, -/area/science/circuit) +/area/maintenance/starboard/aft) "sFR" = ( /obj/structure/cable{ icon_state = "2-8" @@ -74283,9 +74466,6 @@ }, /turf/open/floor/plasteel/dark, /area/command/bridge) -"sKV" = ( -/turf/open/space/basic, -/area/command/heads_quarters/captain) "sLs" = ( /obj/effect/decal/cleanable/cobweb, /obj/machinery/field/generator, @@ -75259,6 +75439,10 @@ dir = 5 }, /area/service/kitchen) +"tpE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/engine, +/area/science/xenobiology) "tpO" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -76385,7 +76569,7 @@ icon_state = "1-2" }, /turf/open/floor/plating, -/area/service/library) +/area/maintenance/port) "ubJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/yellow{ @@ -76672,13 +76856,18 @@ }, /turf/open/floor/wood, /area/service/library) +"uiZ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "ujb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/engineering/gravity_generator) "ujE" = ( @@ -78596,6 +78785,13 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel, /area/engineering/atmos) +"vzs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/mob/living/simple_animal/slime, +/turf/open/floor/engine, +/area/science/xenobiology) "vzO" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -78997,6 +79193,10 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/storage/tech) +"vNv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/science/xenobiology) "vNx" = ( /obj/machinery/computer/security, /obj/machinery/computer/security/telescreen{ @@ -80256,7 +80456,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/commons/vacant_room/office) +/area/maintenance/port) "wxP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -81536,6 +81736,12 @@ }, /turf/open/floor/plasteel, /area/commons/toilet/auxiliary) +"xjK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "xjY" = ( /obj/machinery/holopad, /turf/open/floor/wood, @@ -82347,6 +82553,12 @@ dir = 1 }, /area/engineering/atmos) +"xGQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "xGS" = ( /obj/structure/window/reinforced{ dir = 8 @@ -82429,6 +82641,10 @@ }, /turf/open/floor/plasteel, /area/cargo/storage) +"xIL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/engine, +/area/science/xenobiology) "xJf" = ( /obj/structure/window/reinforced{ dir = 8 @@ -97479,8 +97695,8 @@ dne aip dne dne -dne -dne +aRA +aRA dne baf bbK @@ -116070,16 +116286,16 @@ cRi cRe cRi cSg -cSn -cSn +lbz +xjK cSd cSg -cSn -cSn +lbz +xjK cSd cSg -cSn -cSn +lbz +xjK cRi cTA cTn @@ -116327,16 +116543,16 @@ cRi cRD cSd cSg -cSn -cSn +xGQ +iIk cSd cSg -cSn -cSn +xGQ +iIk cSd cSg -cSn -cSn +xGQ +iIk cRi cRi cTq @@ -116851,14 +117067,14 @@ cSI cSj cTb cST -cSd +nPc cSL cVa cTr cRY daC -cSn -cSn +xIL +lhY cSn cRi dmq @@ -117099,11 +117315,11 @@ dcG cSe cSi cSr -cSA +dcY cSG cSK cSr -cSA +dcY cSW cSK cSr @@ -117355,15 +117571,15 @@ cRk dcH cSf cSl -cSJ +uiZ cSa cSJ -cSJ +nBJ cUM cUN cSJ -cSJ -cSJ +nBJ +uiZ cSV cSJ cSX @@ -117879,14 +118095,14 @@ cSI dcV cTe dda -cSd +vNv cSZ -ddn +ezU cTz ddv -daC -cSn -cSn +iAD +tpE +gTs daN cRi dmr @@ -118121,8 +118337,8 @@ aaa cRi doj dcp -cSt -cSt +idm +lYC dcK cSd cRW @@ -118382,16 +118598,16 @@ dcy cSt dcL cSd -cSn -cSn +iIk +xGQ cSg cSd -cSn -cSn +iIk +xGQ cSg cSd -cSn -cSn +iIk +xGQ cSg cRi cRi @@ -118635,20 +118851,20 @@ aaa cRi dce cSt -cSt +ggU dcC dcM cSd -cSn -cSn +iIk +gLN cSg cSd -cSn -cSn +iIk +gLN cSg cSd -cSn -cSn +iIk +gLN cSg cRi ddh @@ -118892,19 +119108,19 @@ aaa cRi dcf dcr -dcr +kje dcD dcN cSd -cSn +jqj cSx cSF cSd -cSy +vzs dbp cSF cSd -cSn +jqj dbt cSF cRi @@ -121853,7 +122069,7 @@ oRp oRp aaa aai -sKV +aaa aaa aaa aaa @@ -125272,7 +125488,7 @@ mMn mMn iAK tie -spO +rid cfw mTL ilE @@ -125726,7 +125942,7 @@ mNX xXs pHX qIq -kCp +jgc gZo nPJ kCp @@ -126300,7 +126516,7 @@ mMn tSa guR elE -spO +rid cfw mTL ygg @@ -130424,7 +130640,7 @@ aaf aaf aaa aaa -sKV +aaa aaa aaa aaa diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 7bfabf432d..27a4cb8491 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -705,7 +705,7 @@ icon_state = "4-8" }, /turf/open/floor/plating, -/area/commons/fitness/pool) +/area/maintenance/department/crew_quarters/dorms) "abG" = ( /obj/structure/cable{ icon_state = "1-2" @@ -3392,6 +3392,10 @@ /obj/vehicle/ridden/secway, /obj/item/key/security, /obj/effect/turf_decal/bot, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, /turf/open/floor/plasteel/showroomfloor, /area/security/office) "ais" = ( @@ -4891,6 +4895,10 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, /turf/open/floor/plasteel, /area/security/brig) "alz" = ( @@ -10747,6 +10755,11 @@ name = "Port Solar APC"; pixel_y = 23 }, +/obj/machinery/camera{ + c_tag = "Port Bow Solar"; + dir = 9; + name = "solar camera" + }, /turf/open/floor/plating, /area/maintenance/solars/port) "ayD" = ( @@ -24639,6 +24652,12 @@ }, /turf/open/space, /area/solars/starboard) +"beW" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engineering/atmos) "beY" = ( /obj/machinery/camera{ c_tag = "Arrivals Central"; @@ -37279,7 +37298,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/science/mixing) +/area/maintenance/department/science) "bGB" = ( /obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -37809,6 +37828,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/item/radio/intercom{ + pixel_x = 30; + pixel_y = -2 + }, /turf/open/floor/plasteel, /area/science/mixing) "bHI" = ( @@ -40347,15 +40370,9 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/components/binary/pump{ +/obj/machinery/atmospherics/components/binary/pump/on{ dir = 8; - name = "Mix to Ports" - }, -/turf/open/floor/plasteel, -/area/engineering/atmos) -"bNk" = ( -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 + name = "Unfiltered to Mix" }, /turf/open/floor/plasteel, /area/engineering/atmos) @@ -40364,8 +40381,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Unfiltered & Air to Mix" }, /turf/open/floor/plasteel, /area/engineering/atmos) @@ -40801,23 +40819,19 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) -"bOo" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel, -/area/engineering/atmos) "bOp" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Pure to Mix" }, /turf/open/floor/plasteel, /area/engineering/atmos) "bOq" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Pure to Mix" +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 1 }, /turf/open/floor/plasteel, /area/engineering/atmos) @@ -40836,7 +40850,7 @@ /turf/open/floor/engine/vacuum, /area/science/mixing) "bOu" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input{ dir = 4 }, /turf/open/floor/plating/airless, @@ -41081,13 +41095,6 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) -"bPa" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engineering/atmos) "bPd" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ dir = 8 @@ -41399,7 +41406,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engineering/atmos) "bPW" = ( @@ -41777,14 +41783,16 @@ /turf/open/floor/plasteel, /area/engineering/atmos) "bQK" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, /area/engineering/atmos) "bQL" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engineering/atmos) "bQM" = ( @@ -41792,9 +41800,8 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Unfiltered to Mix" +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 }, /turf/open/floor/plasteel, /area/engineering/atmos) @@ -42101,8 +42108,7 @@ /turf/open/floor/plasteel, /area/engineering/atmos) "bRw" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engineering/atmos) "bRx" = ( @@ -45936,14 +45942,8 @@ /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "bZV" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - req_access_txt = "13" - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) +/turf/closed/wall, +/area/hallway/primary/fore) "bZY" = ( /turf/closed/wall, /area/service/chapel/office) @@ -52330,7 +52330,6 @@ /area/service/library) "czp" = ( /obj/structure/table/wood, -/obj/item/disk/nuclear/fake, /obj/item/barcodescanner, /turf/open/floor/plasteel/dark, /area/service/library) @@ -53827,6 +53826,12 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) +"eEd" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engineering/atmos) "eEp" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -55196,6 +55201,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/construction/mining/aux_base) +"hEi" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engineering/atmos) "hEX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -56737,6 +56751,12 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/engineering/main) +"kWG" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engineering/atmos) "kWQ" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/structure/cable/yellow{ @@ -57367,6 +57387,11 @@ name = "Starboard Solar APC"; pixel_x = -25 }, +/obj/machinery/camera{ + c_tag = "Starboard Solar"; + dir = 10; + name = "solar camera" + }, /turf/open/floor/plating, /area/maintenance/solars/starboard) "mwg" = ( @@ -57441,6 +57466,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/maintenance/department/engine) +"mAR" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engineering/atmos) "mCe" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -58847,6 +58881,10 @@ }, /turf/open/floor/wood, /area/service/lawoffice) +"pEM" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/plasteel, +/area/engineering/atmos) "pFe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/red{ @@ -59368,6 +59406,13 @@ }, /turf/open/floor/plasteel/dark, /area/maintenance/department/crew_quarters/dorms) +"qQu" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engineering/atmos) "qRl" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -60108,6 +60153,13 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"sGJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/plasteel, +/area/engineering/atmos) "sIK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -61029,6 +61081,12 @@ }, /turf/open/floor/engine, /area/engineering/main) +"uST" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Mix to Ports" + }, +/turf/open/floor/plasteel, +/area/engineering/atmos) "uUQ" = ( /obj/machinery/door/airlock/maintenance{ name = "Engineering Maintenance"; @@ -61261,8 +61319,14 @@ /turf/open/floor/plating, /area/maintenance/department/science) "vtT" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, /turf/open/floor/plating, -/area/maintenance/solars/port) +/area/maintenance/department/cargo) "vuP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -62179,7 +62243,7 @@ "xuv" = ( /obj/item/broken_bottle, /turf/open/floor/plating, -/area/maintenance/solars/port) +/area/maintenance/department/security/brig) "xvO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -79788,11 +79852,11 @@ atp aus aiu wxb -axC +aiu xuv -azN -vtT -vtT +aoe +ajD +ajD aiu apB aiu @@ -82360,8 +82424,8 @@ apE avq apE ajM -aiu -aiu +bZV +bZV gSH xJy sJr @@ -99640,7 +99704,7 @@ bJN bKS bMe bNh -bOo +pEM bOX bMf bMf @@ -100154,9 +100218,9 @@ bHw bKU bOr bPU +kWG bRw -bPa -bMf +beW bMf bMf bMf @@ -100410,13 +100474,13 @@ bIF bHw bKV bOX -bUv +eEd bQL -bPa -bMf -bMf -bMf +uST +pEM bMf +qQu +qQu bSU bTT bUv @@ -100670,10 +100734,10 @@ bMg bNj bOp bPV -bPV -bPV -bPV -bPV +hEi +sGJ +bUw +bUw bUw bUw bUw @@ -100924,8 +100988,8 @@ bIH bHw cqG bOX -bNk bOq +mAR bPd bPW bPW @@ -106255,7 +106319,7 @@ aaF aaF aaF abF -aaF +aiS aiS atn awC @@ -107807,8 +107871,8 @@ aaa aaa aaa aaa -aEl -aFi +aEj +vtT aEj aaa aEj @@ -108064,9 +108128,9 @@ aaa aaa aaa aaa -aEj -bZV -aEj +cdm +cdm +cdm aaa aaa aaa @@ -108321,9 +108385,9 @@ aaa aaa aaa aaa -ahi -ahi -ahi +bBW +bBW +bBW aaa aaa aaa diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index e23159a2bd..56d0ca606f 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -1,102 +1,415 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 +/obj/machinery/porta_turret/syndicate/energy/pirate{ + dir = 1; + faction = list("pirate"); + icon_state = "standard_lethal" }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, /area/shuttle/pirate) "ab" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/obj/structure/grille, +/turf/open/floor/plating/airless, /area/shuttle/pirate) "ac" = ( -/obj/machinery/computer/shuttle/pirate, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/structure/girder, +/obj/item/stack/rods{ + amount = 3 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/shuttle/pirate) "ad" = ( -/obj/structure/table, -/obj/machinery/button/door{ - id = "piratebridge"; - name = "Bridge Shutters Control"; - pixel_y = -5 +/obj/structure/girder, +/obj/item/stack/rods{ + amount = 5 }, -/obj/item/radio/intercom{ - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/shuttle/pirate) "ae" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/turf/closed/wall/r_wall/syndicate/pirate, /area/shuttle/pirate) "af" = ( /turf/template_noop, /area/template_noop) "ag" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/obj/structure/window/reinforced, +/obj/structure/frame/machine, +/obj/item/crowbar, +/turf/open/floor/plating/airless, /area/shuttle/pirate) "ah" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/obj/structure/window/reinforced, +/obj/structure/frame/machine, +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/plating/airless, /area/shuttle/pirate) "ai" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/frame/computer{ + anchored = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small, /turf/open/floor/pod/dark, /area/shuttle/pirate) "aj" = ( /turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, /area/shuttle/pirate) "ak" = ( -/obj/machinery/airalarm/all_access{ +/obj/structure/grille, +/obj/structure/window/plastitanium/pirate, +/obj/machinery/door/poddoor/shutters{ + id = "cuttershutters"; + name = "Blast Shutters" + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"al" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/syndicate{ dir = 4; pixel_x = -24 }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"am" = ( +/obj/structure/rack, +/obj/machinery/nuclearbomb/beer{ + desc = "A nuclear fission warhead designed to be fired from a high-speed matter-propellent cannon to turn some unlucky sod in the distance into a sun. This one has a jolly roger crudely painted on the side of it. Interestingly, there's a tap on the back and it sloshes when it moves."; + name = "\improper Very Real Nuclear Explosive" + }, /obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"an" = ( +/obj/machinery/porta_turret/syndicate/energy/pirate{ + dir = 4; + faction = list("pirate"); + icon_state = "standard_lethal" + }, +/turf/closed/wall/r_wall/syndicate/pirate, +/area/shuttle/pirate) +"aq" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"ar" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/syndicate{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"as" = ( +/obj/machinery/door/airlock/hatch{ + aiControlDisabled = 1; + name = "Port Gun Battery"; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/wooden/crude{ + layer = 3.13 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"at" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "piratebridge" + }, +/obj/structure/grille, +/obj/structure/window/plastitanium/pirate, +/obj/machinery/door/poddoor/shutters{ + id = "cuttershutters"; + name = "Blast Shutters" + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"ay" = ( +/obj/machinery/recharger{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "cuttershutters"; + name = "Corvette Shutters Control"; + pixel_x = 6; + pixel_y = -3; + req_access_txt = "150" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"az" = ( +/obj/machinery/door/airlock/hatch{ + aiControlDisabled = 1; + name = "Starboard Gun Battery"; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/wooden/crude{ + layer = 3.13 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"aA" = ( +/obj/machinery/porta_turret/syndicate/energy/pirate{ + dir = 8; + faction = list("pirate"); + icon_state = "standard_lethal" + }, +/turf/closed/wall/r_wall/syndicate/pirate, +/area/shuttle/pirate) +"aB" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"aC" = ( +/obj/structure/rack{ + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "minibar_left"; + name = "skeletal minibar" + }, +/obj/machinery/chem_dispenser/drinks{ + dir = 0; + pixel_y = 12 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"aD" = ( +/obj/structure/rack{ + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "minibar_right"; + name = "skeletal minibar" + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/bedsheet/pirate{ + pixel_y = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"aE" = ( +/obj/machinery/vending/boozeomat, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"aF" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/shuttle/pirate, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"aG" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/turretid{ + icon_state = "control_kill"; + lethal = 1; + locked = 0; + pixel_y = -24; + req_access = "150" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"aH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/syndicate{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"aI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"aJ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"aK" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "piratebridgebolt"; + name = "Bridge Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -24; + req_access_txt = "150"; + specialfunctions = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"aL" = ( +/obj/machinery/computer/security, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"aM" = ( +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/med{ + pixel_y = 8 + }, +/obj/item/wirecutters{ + pixel_y = 8 + }, +/obj/item/weldingtool/mini{ + pixel_y = -6 + }, +/obj/item/reagent_containers/medspray/sterilizine{ + pixel_x = 6; + pixel_y = -12 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"aN" = ( +/obj/structure/table/optable, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/robot_debris{ + layer = 2.81; + pixel_x = -2; + pixel_y = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pirate) +"aO" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/frame/computer{ + anchored = 1; + dir = 8 + }, +/obj/structure/sign/departments/showers{ + pixel_y = 32 + }, +/obj/item/shard{ + pixel_x = -4; + pixel_y = -4 + }, +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pirate) +"aP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"aQ" = ( +/obj/machinery/shuttle_scrambler, +/obj/item/radio/intercom{ + freerange = 1; + name = "Station Intercom (General)"; + pixel_x = -26 + }, +/obj/effect/turf_decal/box, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"aR" = ( /obj/machinery/light/small{ dir = 8 }, @@ -116,31 +429,30 @@ pixel_y = -6 }, /obj/item/reagent_containers/food/snacks/chocolatebar, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/shuttle/pirate) -"al" = ( -/obj/machinery/loot_locator, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ +"aS" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel, /area/shuttle/pirate) -"am" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +"aT" = ( +/obj/machinery/door/airlock/hatch{ + aiControlDisabled = 1; + id_tag = "piratebridgebolt"; + name = "Bridge"; + req_access_txt = "150" + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -151,60 +463,82 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/shuttle/pirate) -"an" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "piratebridgebolt"; - name = "Bridge Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -24; - specialfunctions = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel/dark, -/area/shuttle/pirate) -"ao" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"ap" = ( -/obj/machinery/door/airlock/hatch{ - name = "Port Gun Battery" - }, -/obj/structure/barricade/wooden/crude, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"aU" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced, +/obj/item/book/manual/wiki/surgery{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/clipboard{ + pixel_x = 2 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/surgical_drapes, +/obj/item/scalpel{ + pixel_y = 16 + }, +/obj/item/wrench{ + pixel_y = 12 + }, +/obj/item/pen{ + pixel_x = -4; + pixel_y = 12 + }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/shuttle/pirate) -"aq" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +"aV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"aW" = ( +/obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/window/reinforced, +/obj/structure/sink{ + dir = 4; + pixel_x = 6 + }, +/obj/machinery/shower{ + dir = 1; + pixel_y = 4 + }, +/obj/structure/curtain, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"ar" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/box/white, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"aX" = ( +/obj/structure/closet/crate/medical, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/under/rank/medical/doctor/blue, +/obj/item/clothing/shoes/sneakers/white, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"aY" = ( /obj/structure/table, /obj/item/storage/fancy/cigarettes{ pixel_x = 2; @@ -232,388 +566,853 @@ pixel_x = -10; pixel_y = -2 }, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"as" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/closet/secure_closet/personal, /obj/effect/decal/cleanable/dirt, -/obj/item/bedsheet/pirate, +/obj/structure/sign/poster/official/high_class_martini{ + pixel_x = -32 + }, /turf/open/floor/plasteel, /area/shuttle/pirate) -"at" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/bedsheet/pirate, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"au" = ( -/obj/machinery/door/airlock/hatch{ - id_tag = "piratebridgebolt"; - name = "Bridge" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ +"aZ" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/shuttle/pirate) -"av" = ( -/obj/machinery/door/airlock/hatch{ - name = "Starboard Gun Battery" +"ba" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/bottle/whiskey{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/shard, +/obj/item/chair/stool/bar, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"bb" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/flask, +/obj/item/reagent_containers/food/condiment/milk{ + pixel_x = -12; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"bc" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, -/obj/structure/barricade/wooden/crude, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/shuttle/pirate) -"aw" = ( +"bd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"be" = ( +/obj/machinery/loot_locator, +/obj/item/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_x = 27 + }, +/obj/effect/turf_decal/box, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bg" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Pirate Corvette APC"; + pixel_y = 23; + req_access = null + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/airalarm/syndicate{ + pixel_y = 24 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bi" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters{ + id = "cuttermedbay"; + name = "Blast Shutters" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bj" = ( +/obj/effect/turf_decal/caution/stand_clear/white{ + dir = 4 + }, +/obj/effect/turf_decal/bot_white, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bk" = ( +/obj/structure/sign/departments/medbay/alt{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bm" = ( +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bn" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bo" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_x = 32 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/shuttle/pirate) +"br" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/shuttle/pirate) +"bs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/dark, +/area/shuttle/pirate) +"bt" = ( +/obj/structure/chair/stool/bar, +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel/dark, +/area/shuttle/pirate) +"bu" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/departments/cargo{ + pixel_x = -32 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bw" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bx" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"by" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bA" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters{ + id = "cuttermedbay"; + name = "Blast Shutters" + }, +/obj/machinery/button/door{ + id = "cuttermedbay"; + pixel_y = -24; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bB" = ( +/obj/effect/turf_decal/caution/stand_clear/white{ + dir = 4 + }, +/obj/effect/turf_decal/bot_white, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/departments/examroom{ + pixel_x = -32; + pixel_y = -32 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bD" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bF" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/directions/dorms{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bG" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bH" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 5 + }, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_x = -8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/shuttle/pirate) +"bI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"ax" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"ay" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"az" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"aA" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/obj/item/bedsheet/pirate, -/turf/open/floor/wood, -/area/shuttle/pirate) -"aB" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/computer/monitor/secret{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/all_access{ +/obj/item/chair/stool, +/obj/machinery/light, +/obj/machinery/airalarm/syndicate{ dir = 1; pixel_y = -24 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/shuttle/pirate) -"aC" = ( -/obj/machinery/shuttle_scrambler, +"bJ" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/shuttle/pirate) -"aD" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aF" = ( -/obj/machinery/door/airlock/external/glass{ - id_tag = "pirateportexternal" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aH" = ( -/obj/structure/shuttle/engine/propulsion/left, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"aI" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aJ" = ( -/obj/machinery/door/airlock/external/glass{ - id_tag = "pirateportexternal" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aK" = ( -/obj/structure/shuttle/engine/propulsion, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"aL" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aN" = ( -/obj/machinery/light/small, -/obj/machinery/button/door{ - id = "pirateportexternal"; - name = "External Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -4; - pixel_y = -24; - specialfunctions = 4 - }, -/obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aO" = ( -/obj/machinery/light/small, -/obj/machinery/button/door{ - id = "piratestarboardexternal"; - name = "External Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 4; - pixel_y = -24; - specialfunctions = 4 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aQ" = ( -/obj/machinery/porta_turret/syndicate/energy/pirate{ - dir = 1; - faction = list("pirate"); - icon_state = "standard_lethal" - }, -/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, -/area/shuttle/pirate) -"aR" = ( -/obj/machinery/porta_turret/syndicate/energy/pirate{ - faction = list("pirate"); - icon_state = "standard_lethal" - }, -/turf/closed/wall/r_wall/syndicate/pirate, -/area/shuttle/pirate) -"aS" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aU" = ( -/obj/structure/sign/departments/engineering, -/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, -/area/shuttle/pirate) -"aV" = ( -/obj/effect/mob_spawn/human/pirate{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/shuttle/pirate) -"aW" = ( -/obj/machinery/light/small{ - dir = 8 +"bK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/shuttle/pirate) +"bL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch{ + aiControlDisabled = 1; + name = "Spirits Lounge"; + req_access_txt = "150" + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bN" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ dir = 4; + req_access = "150"; x_offset = -3; y_offset = 7 }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bO" = ( +/obj/machinery/computer/monitor/secret{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bP" = ( +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/syndie/x4{ + pixel_y = 8 + }, +/obj/item/grenade/smokebomb{ + pixel_x = -5 + }, +/obj/item/grenade/smokebomb{ + pixel_x = 5 + }, +/obj/effect/turf_decal/box/red, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bQ" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pirate) +"bR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/box/white, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"bT" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/glass/bottle/bicaridine{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/reagent_containers/glass/bottle/kelotane{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/item/reagent_containers/glass/bottle/antitoxin{ + layer = 3.01; + pixel_x = 2 + }, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + layer = 3.01; + pixel_x = -6 + }, +/obj/item/clipboard{ + layer = 2.99; + pixel_x = 16; + pixel_y = 4 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = 14; + pixel_y = 6 + }, +/obj/item/reagent_containers/dropper{ + pixel_x = 15; + pixel_y = -2 + }, +/obj/item/reagent_containers/hypospray/medipen{ + pixel_x = 16; + pixel_y = 11 + }, +/obj/item/reagent_containers/hypospray/medipen{ + pixel_x = 16; + pixel_y = 7 + }, +/obj/machinery/light, +/obj/machinery/airalarm/syndicate{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bU" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/bodybags{ + pixel_y = 4 + }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/glass/bottle/charcoal{ + layer = 3.01; + pixel_x = -6 + }, +/obj/item/reagent_containers/glass/bottle/dexalin{ + layer = 3.01; + pixel_x = 2 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch{ + aiControlDisabled = 1; + name = "Captain's Quarters"; + req_access_txt = "150" + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bX" = ( +/obj/item/shard{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot_white, +/obj/machinery/door/window/southleft{ + name = "Surgical Ward"; + req_access_txt = "150" + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bZ" = ( +/obj/machinery/computer/piratepad_control{ + dir = 0 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_y = 22 + }, +/obj/structure/sign/directions/supply{ + pixel_y = 30 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"ca" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pirate) +"cb" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pirate) +"cc" = ( +/obj/machinery/piratepad{ + pixel_y = 6 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/box, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/sign/directions/command{ + dir = 1; + pixel_y = 22 + }, +/obj/structure/sign/directions/engineering{ + pixel_y = 30 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch{ + aiControlDisabled = 1; + name = "Crew's Quarters"; + req_access_txt = "150" + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"ce" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/bedsheet/pirate, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/shuttle/pirate) +"cf" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/shuttle/pirate) +"cg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/shuttle/pirate) +"ch" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/syndicate{ + pixel_y = 24 + }, +/turf/open/floor/wood, +/area/shuttle/pirate) +"ci" = ( +/obj/structure/closet/crate, +/obj/item/storage/bag/money/vault, +/obj/item/stack/sheet/mineral/gold{ + amount = 3; + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/stack/sheet/mineral/silver{ + amount = 8; + pixel_x = 2; + pixel_y = -1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cj" = ( +/obj/machinery/vending/dinnerware, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/shuttle/pirate) +"ck" = ( +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"cl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"cn" = ( +/obj/item/tank/internals/oxygen/yellow, +/obj/item/clothing/suit/space/syndicate/green/dark{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/clothing/head/helmet/space/syndicate/green/dark{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/clothing/mask/breath, +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random{ + pixel_x = -32 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"co" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cp" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/dark, +/area/shuttle/pirate) +"cr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/syndicate{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/pirate) +"cs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm{ dir = 1; pixel_y = -24 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/mineral/plastitanium/red, /area/shuttle/pirate) -"be" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"ct" = ( +/obj/structure/mirror{ + pixel_y = 32 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/shuttle/pirate) -"bf" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/turretid{ - icon_state = "control_kill"; - lethal = 1; - locked = 0; - pixel_y = -24; - req_access = null - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/shuttle/pirate) -"bg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/gun/energy/laser{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/gun/energy/laser{ - pixel_y = 3 - }, -/obj/machinery/recharger, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"bk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"bl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/airalarm/all_access{ +/obj/structure/sink{ pixel_y = 24 }, +/obj/structure/curtain, +/obj/machinery/shower{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/gun/energy/laser{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/gun/energy/laser{ - pixel_y = 3 - }, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"bm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/box/white, /turf/open/floor/pod/dark, /area/shuttle/pirate) -"bo" = ( -/obj/machinery/light/small{ - dir = 4 +"cu" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/item/gun/energy/laser{ + pixel_x = -3; + pixel_y = 2 }, -/obj/structure/sign/warning/vacuum/external{ +/obj/item/gun/energy/laser{ + pixel_y = -1 + }, +/obj/item/gun/energy/laser{ + pixel_x = 2; + pixel_y = -4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random{ pixel_x = 32 }, -/turf/open/floor/plating, +/turf/open/floor/pod/dark, /area/shuttle/pirate) -"br" = ( +"cv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/chair/wood/normal{ + dir = 4 + }, +/turf/open/floor/wood, +/area/shuttle/pirate) +"cw" = ( /obj/structure/table/wood, /obj/item/storage/box/matches, /obj/item/reagent_containers/food/drinks/bottle/rum{ @@ -627,244 +1426,398 @@ }, /obj/item/clothing/mask/cigarette/cigar, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/light, +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 + }, /turf/open/floor/wood, /area/shuttle/pirate) -"bt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/melee/transforming/energy/sword/pirate{ - pixel_x = -1; - pixel_y = 6 - }, -/obj/item/melee/transforming/energy/sword/pirate{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/melee/transforming/energy/sword/pirate{ - pixel_x = 13; - pixel_y = 6 - }, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"bu" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"bv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"bx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"by" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/piratepad, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"bA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"bB" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"bC" = ( -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"bF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 5 - }, -/obj/item/book/manual/wiki/barman_recipes{ - pixel_x = -8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"bH" = ( -/obj/machinery/vending/boozeomat, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"bI" = ( -/obj/machinery/light/small, -/obj/machinery/computer/piratepad_control{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"bJ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +"cy" = ( +/obj/effect/mob_spawn/human/pirate/captain{ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/wood, /area/shuttle/pirate) -"bK" = ( +"cz" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sink{ - pixel_y = 24 - }, -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, +/area/shuttle/pirate) +"cA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/shuttle/pirate) -"bM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock{ - name = "Crew Cabin" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/pirate{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/turf_decal/box/red, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/light, +/obj/structure/sign/poster/contraband/random{ + pixel_x = -32 }, /turf/open/floor/plasteel/dark, /area/shuttle/pirate) -"bO" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - dir = 1; - name = "Pirate Corvette APC"; - pixel_y = 23; - req_access = null - }, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, +"cB" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"bP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/effect/mob_spawn/human/pirate{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/obj/effect/turf_decal/box/red, +/turf/open/floor/plasteel/dark, /area/shuttle/pirate) -"bQ" = ( -/obj/structure/cable{ +"cC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/large, +/obj/machinery/jukebox{ + anchored = 0; + desc = "Formally known as the SSDD, the Space Shanty Delivery Device is employed by various rings of the piracy scene for its capability of raising crew morale with its inspiring tunes. Unfortunately, this one doesn't seem as if it has many records pertaining to its designated topic on hand."; + name = "\improper Space Shanty Delivery Device"; + req_one_access = null + }, +/obj/item/clothing/head/collectable/pirate{ + pixel_x = 1; + pixel_y = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cD" = ( +/obj/machinery/suit_storage_unit/pirate, +/obj/effect/turf_decal/box, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/large, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cF" = ( +/obj/structure/shuttle/engine/heater, +/obj/effect/spawner/structure/window/plastitanium/pirate, +/obj/structure/window/reinforced/tinted{ + layer = 3.1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"cG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, +/area/shuttle/pirate) +"cH" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/mineral/plastitanium{ + amount = 20 + }, +/obj/item/stack/cable_coil/yellow{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/cable_coil/yellow{ + pixel_x = 2; + pixel_y = -2 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cI" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line, +/obj/structure/tank_dispenser/oxygen, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pirate) +"cJ" = ( +/obj/structure/table/reinforced, +/obj/item/pickaxe, +/obj/effect/decal/cleanable/dirt, +/obj/item/pickaxe{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/extinguisher/mini{ + pixel_x = 4 + }, +/obj/item/extinguisher/mini{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/flashlight/seclite{ + pixel_x = -12; + pixel_y = 6 + }, +/obj/item/flashlight/seclite{ + pixel_x = -10 + }, +/obj/item/crowbar/red{ + pixel_x = -20; + pixel_y = 2 + }, +/obj/item/crowbar/red{ + pixel_x = -16; + pixel_y = -4 + }, +/obj/structure/sign/poster/contraband/random{ + pixel_y = -32 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cK" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/lethalshot{ + pixel_y = 8 + }, +/obj/item/gun/ballistic/shotgun/automatic/combat{ + pixel_y = 16 + }, +/obj/item/melee/transforming/energy/sword/pirate{ + pixel_x = -1; + pixel_y = 0 + }, +/obj/item/melee/transforming/energy/sword/pirate{ + pixel_x = 6; + pixel_y = 0 + }, +/obj/item/melee/transforming/energy/sword/pirate{ + pixel_x = 13; + pixel_y = 0 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cL" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/bedsheet/pirate, +/obj/effect/decal/cleanable/dirt, +/obj/item/bedsheet/pirate, +/obj/item/storage/backpack/satchel, +/turf/open/floor/plasteel/dark, +/area/shuttle/pirate) +"cM" = ( +/obj/structure/shuttle/engine/heater, +/obj/effect/spawner/structure/window/plastitanium/pirate, +/obj/structure/window/reinforced/tinted{ + layer = 3.1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 4; + layer = 3.1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"cN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/dresser, +/turf/open/floor/wood, +/area/shuttle/pirate) +"cO" = ( +/obj/structure/cable/yellow{ icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch{ + aiControlDisabled = 1; + name = "Engineering"; + req_access_txt = "150" + }, +/turf/open/floor/pod/dark, /area/shuttle/pirate) -"bX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/terminal{ +"cP" = ( +/obj/structure/shuttle/engine/heater, +/obj/effect/spawner/structure/window/plastitanium/pirate, +/obj/structure/window/reinforced/tinted{ + layer = 3.1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 8; + layer = 3.1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"cR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable{ - icon_state = "0-8" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"cS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/structure/rack, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/airalarm/syndicate{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"cT" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cV" = ( +/obj/machinery/suit_storage_unit/pirate, +/obj/effect/turf_decal/box, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_eye_protection{ + pixel_x = -32 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"cW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/effect/turf_decal/stripes/white/full, +/obj/machinery/power/smes/engineering{ + charge = 1e+006 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"cX" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"cY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + target_pressure = 405.3 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"cZ" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, +/area/shuttle/pirate) +"da" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"db" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = 32 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"dc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold4w/supply/visible, +/obj/machinery/airalarm/syndicate{ + pixel_y = 24 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"dd" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 8 + }, +/obj/effect/turf_decal/box, +/obj/structure/sign/departments/engineering{ + pixel_y = 32 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"de" = ( +/obj/item/storage/box/lights/bulbs, /obj/item/storage/toolbox/mechanical{ pixel_y = 4 }, +/obj/item/multitool, +/obj/item/storage/belt/utility{ + pixel_x = 2; + pixel_y = -4 + }, /obj/item/flashlight{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/box/lights/bulbs, /obj/item/stack/sheet/mineral/plasma{ amount = 10 }, -/obj/item/multitool, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"bZ" = ( -/obj/machinery/door/airlock/external/glass{ - id_tag = "piratestarboardexternal" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/rack, +/obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/fire{ + pixel_x = 32 + }, /turf/open/floor/plating, /area/shuttle/pirate) -"ce" = ( -/obj/machinery/door/airlock/external/glass{ - id_tag = "piratestarboardexternal" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, +"dg" = ( /obj/docking_port/mobile/pirate{ dwidth = 11; height = 16; @@ -872,7 +1825,7 @@ movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "Pirate Ship"; port_direction = 2; - width = 17 + width = 23 }, /obj/docking_port/stationary{ dwidth = 11; @@ -882,612 +1835,798 @@ width = 17 }, /obj/structure/fans/tiny, -/turf/open/floor/plating, +/obj/machinery/door/poddoor/shutters{ + id = "cuttereva"; + name = "EVA Shutters" + }, +/obj/machinery/button/door{ + id = "cuttereva"; + name = "EVA Shutters"; + pixel_x = 26; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/wooden/crude{ + layer = 3.13 + }, +/turf/open/floor/pod/dark, /area/shuttle/pirate) -"db" = ( -/obj/structure/shuttle/engine/heater, -/obj/effect/spawner/structure/window/plastitanium/pirate, +"dk" = ( +/obj/structure/shuttle/engine/large, /turf/open/floor/plating/airless, /area/shuttle/pirate) -"df" = ( +"dl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/eastleft{ + name = "EVA Storage"; + req_access_txt = "150" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"dm" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"dn" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"do" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"dp" = ( +/obj/machinery/porta_turret/syndicate/energy/pirate{ + faction = list("pirate"); + icon_state = "standard_lethal" + }, +/turf/closed/wall/r_wall/syndicate/pirate, +/area/shuttle/pirate) +"dq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"dr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"ds" = ( +/obj/item/crowbar, +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"dt" = ( +/obj/machinery/door/airlock/external/glass{ + aiControlDisabled = 1; + id_tag = "piratestarboardexternal"; + name = "EVA Airlock"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/structure/barricade/wooden/crude{ + layer = 3.13 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"dv" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/sign/poster/official/wtf_is_co2{ + pixel_y = -32 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pirate) +"dw" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"dx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"dy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/item/wrench, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/shuttle/pirate) +"dz" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/random{ + pixel_y = -32 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"dA" = ( +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"dB" = ( +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/large, +/obj/item/stack/sheet/mineral/plastitanium{ + amount = 20 + }, +/obj/item/clothing/gloves/color/fyellow/old{ + pixel_y = 2 + }, +/obj/item/clothing/gloves/color/fyellow/old{ + pixel_y = -2 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"dC" = ( +/obj/structure/shuttle/engine/propulsion/left, +/turf/open/floor/plating, +/area/shuttle/pirate) +"dD" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating, +/area/shuttle/pirate) +"dE" = ( +/obj/structure/shuttle/engine/propulsion/right, +/turf/open/floor/plating, +/area/shuttle/pirate) +"kI" = ( +/obj/structure/sign/barsign, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, +/area/shuttle/pirate) +"mq" = ( +/obj/machinery/porta_turret/syndicate/energy/pirate{ + dir = 8; + faction = list("pirate"); + icon_state = "standard_lethal" + }, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, +/area/shuttle/pirate) +"ol" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"pw" = ( /obj/machinery/porta_turret/syndicate/energy/pirate{ dir = 4; faction = list("pirate"); icon_state = "standard_lethal" }, -/turf/closed/wall/r_wall/syndicate/pirate, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, /area/shuttle/pirate) -"dy" = ( -/obj/structure/chair/wood/normal, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +"sE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/floor/wood, +/area/shuttle/pirate) +"un" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/floor/wood, +/area/shuttle/pirate) +"vT" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/machinery/light/small{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"yP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/shuttle/pirate) -"dU" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/sign/directions/dorms{ + pixel_y = -22 }, /turf/open/floor/plasteel/dark, /area/shuttle/pirate) -"ek" = ( -/obj/effect/turf_decal/stripes/line, +"BD" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/structure/sign/poster/contraband/revolver{ - pixel_x = 32 - }, -/obj/item/storage/backpack/duffelbag/syndie/x4{ - pixel_y = 8 - }, -/obj/item/grenade/smokebomb{ - pixel_x = -5 - }, -/obj/item/grenade/smokebomb{ - pixel_x = 5 - }, -/obj/item/pickaxe/drill/diamonddrill, -/obj/item/pickaxe/drill/diamonddrill, -/obj/item/pickaxe/drill/diamonddrill, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"ep" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/shuttle/engine/heater, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"er" = ( -/obj/structure/shuttle/engine/propulsion/right, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"et" = ( -/obj/structure/grille, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"eu" = ( -/obj/structure/girder, -/obj/item/stack/rods{ - amount = 3 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"ew" = ( -/obj/structure/girder, -/obj/item/stack/rods{ - amount = 5 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"ex" = ( -/obj/structure/window/reinforced, -/obj/structure/frame/machine, -/obj/item/wrench, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"ey" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "piratebridge" - }, -/obj/structure/grille, -/obj/structure/window/plastitanium/pirate, -/turf/open/floor/plating, -/area/shuttle/pirate) -"ez" = ( -/obj/structure/window/reinforced, -/obj/structure/frame/machine, -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"eA" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/frame/computer{ - anchored = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"eE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"fW" = ( -/turf/closed/wall/r_wall/syndicate/pirate, -/area/shuttle/pirate) -"fY" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"gY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"km" = ( -/obj/machinery/atmospherics/components/unary/tank/air, -/obj/effect/turf_decal/bot, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"mU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"np" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot, -/obj/machinery/airalarm/all_access{ - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"vB" = ( -/obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/storage/box/lethalshot, -/obj/item/gun/ballistic/shotgun/automatic/combat{ - pixel_x = -2; - pixel_y = 2 - }, -/turf/open/floor/pod/light, +/turf/open/floor/mineral/plastitanium/red, /area/shuttle/pirate) -"wf" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/shuttle/pirate) -"wR" = ( -/obj/machinery/porta_turret/syndicate/energy/pirate{ - dir = 8; - faction = list("pirate"); - icon_state = "standard_lethal" - }, -/turf/closed/wall/r_wall/syndicate/pirate, -/area/shuttle/pirate) -"yi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/hatch{ - name = "Armory Access" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"zw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock{ - name = "Captain's Quarters" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/shuttle/pirate) -"Gk" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/suit_storage_unit/pirate, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"JT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/storage/bag/money/vault, -/obj/item/stack/sheet/mineral/gold{ - amount = 3; - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/stack/sheet/mineral/silver{ - amount = 8; - pixel_x = 2; - pixel_y = -1 - }, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"Oe" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +"HH" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/turf/open/floor/plasteel, -/area/shuttle/pirate) -"OD" = ( -/obj/machinery/airalarm/all_access{ - pixel_y = 24 - }, -/obj/structure/sign/poster/contraband/random{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/shuttle/pirate) -"OL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /turf/open/floor/plasteel, /area/shuttle/pirate) -"RY" = ( -/obj/effect/mob_spawn/human/pirate/captain{ - dir = 4 - }, -/obj/machinery/airalarm/all_access{ - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random{ - pixel_x = -32 - }, -/turf/open/floor/wood, -/area/shuttle/pirate) (1,1,1) = {" af af af -fW -aj -aj -aj -aj -aj -aj -aj -wR af af af af +af +af +af +af +af +af +ae +aj +aj +mq +af +af +af "} (2,1,1) = {" af -et -eu -ex -eA -aa -ap -aw -ak -bF +af +af +af +af +af +af +aA aj aj aj -fW +aj +aj +aj +cF +ck +dk +af af af "} (3,1,1) = {" -aQ -aj -aj -aj -aj -aj -aj -ax -aq -ar -aj -RY -aA -ep -aH -af -"} -(4,1,1) = {" af af af -af -af -af -ey -ay -Oe -OL -zw -dy -br -ep -er -af -"} -(5,1,1) = {" -af -af -af -af -af -af -aj -az -bx -bH -aj +ae aj aj aj aj aR +aY +cj +bH +aj +ce +cM +ck +ck +af +af +af +"} +(4,1,1) = {" +af +ab +ac +ag +ai +al +as +ol +vT +aZ +bq +bI +aj +cf +cN +cP +ck +dk +af +af +"} +(5,1,1) = {" +aa +aj +aj +aj +aj +am +kI +aC +aB +HH +br +bJ +bV +cg +cv +cF +ck +ck +af +af "} (6,1,1) = {" af af af -ey -ey +af +ae +aj +aj +aD +aB +ba +bs +yP +aj +ch +cw aj aj aj -yi aj -aj -Gk -aS -aF -aI -aJ +af "} (7,1,1) = {" af af -ey -ey -aC -aW +af +af +af +af +at +aE +aS +bb +bt +bK aj -bg -gY -JT -aj -km -aN +cy aj aj +cD +cT aj +af "} (8,1,1) = {" af af -ey -ab -ae -bf +af +af +af +af aj -bl -fY -ai -aU -be -aD -aG -db -aH +aj +aj +aj +aj +bL +aj +aj +aj +cV +dl +dv +aj +dp "} (9,1,1) = {" af af -ey -ac -ag -am -au -bm -by -bm -mU -aL -bP -bX -db -aK +af +af +af +ak +aj +bN +aj +bZ +bu +bM +cn +cC +aj +cW +dm +dw +cF +dC "} (10,1,1) = {" af af -ey -ad -ah -an +af +af +ak +ak +aQ +aG aj -bt -gY -bI +cc +bv +bM +co +cE aj -bO -bQ -bk -db -er +cX +dn +dx +cF +dD "} (11,1,1) = {" af af -ey -ey -al -aB -aj -ek -bA -vB -aj -np -aO -aj -aj +af +af +ak +ay +aV +aH aj +ci +bw +cl +cp +cp +cO +cY +do +dy +cF +dE "} (12,1,1) = {" af af af -ey -ey +af +ak +aF +bc +aI +aT +bf +bx +cm +cs +cG +cG +dc +dq +dz aj aj -aj -yi -aj -aj -Gk -aS -bZ -bo -ce "} (13,1,1) = {" af af af af -af -af +ak +aL +bd +aJ aj -as -bB -at +bg +by +bP +ca +cH aj -aj -aj -aj -aj -aR +dd +dr +dA +cF +dC "} (14,1,1) = {" af af af af -af -af -ey -eE -bC -bJ -bM -dU -aV -ep -aH -af +ak +ak +be +aK +aj +bh +bz +bQ +cb +cJ +aj +de +ds +dB +cF +dD "} (15,1,1) = {" -aQ -aj -aj -aj -aj -aj -aj -bu -aj -wf -aj -OD -aV -ep -er af +af +af +af +af +ak +aj +bO +aj +bi +bA +aj +cu +cK +aj +aj +dt +cZ +cF +dE "} (16,1,1) = {" af -et -ew -ez -eA -ao -av -bv -aj -bK -aj -aj -aj -fW af af +af +af +af +aj +aj +aj +bj +bB +aj +aj +aj +aj +cI +cR +da +aj +dp "} (17,1,1) = {" af af af -fW -aj -aj -aj -aj -aj -aj -aj -df af af af +at +aM +aU +bk +bC +bR +aj +cL +cz +aj +cS +db +dg +af +"} +(18,1,1) = {" +af +af +af +af +ae +aj +aj +aN +bX +bl +bD +bS +cd +cq +cA +aj +aj +aj +aj +af +"} +(19,1,1) = {" +aa +aj +aj +aj +aj +aq +aj +aO +aW +bm +bE +bF +aj +cr +cB +cF +ck +dk +af +af +"} +(20,1,1) = {" +af +ab +ad +ah +ai +ar +az +aP +aP +bn +BD +bT +aj +sE +un +cM +ck +ck +af +af +"} +(21,1,1) = {" +af +af +af +ae +aj +aj +aj +aj +aX +bo +bG +bU +aj +ct +cP +ck +dk +af +af +af +"} +(22,1,1) = {" +af +af +af +af +af +af +af +an +aj +aj +aj +aj +aj +aj +cF +ck +ck +af +af +af +"} +(23,1,1) = {" +af +af +af +af +af +af +af +af +af +af +af +af +af +ae +aj +aj +pw +af +af af "} diff --git a/_maps/templates/shelter_4.dmm b/_maps/templates/shelter_4.dmm new file mode 100644 index 0000000000..abb85a09f8 --- /dev/null +++ b/_maps/templates/shelter_4.dmm @@ -0,0 +1,191 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium/survival/pod, +/area/survivalpod/nonpowered) +"j" = ( +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"k" = ( +/obj/item/gps/computer, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"p" = ( +/obj/machinery/light, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"x" = ( +/obj/machinery/smartfridge/survival_pod, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"H" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table/survival_pod, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"J" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"P" = ( +/obj/machinery/door/airlock/survival_pod, +/obj/machinery/poweredfans, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"U" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Y" = ( +/obj/machinery/power/apc/auto_name/north, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) + +(1,1,1) = {" +a +a +a +a +a +P +a +a +a +a +a +"} +(2,1,1) = {" +a +j +j +J +j +j +j +j +j +j +a +"} +(3,1,1) = {" +a +j +j +j +j +j +j +j +j +j +a +"} +(4,1,1) = {" +a +U +j +j +j +j +j +j +j +p +a +"} +(5,1,1) = {" +a +j +j +j +j +j +j +j +j +j +a +"} +(6,1,1) = {" +P +j +j +j +j +j +j +j +j +j +P +"} +(7,1,1) = {" +a +Y +j +j +j +j +j +j +j +j +a +"} +(8,1,1) = {" +a +H +j +j +j +j +j +j +j +p +a +"} +(9,1,1) = {" +a +x +j +j +j +j +j +j +j +j +a +"} +(10,1,1) = {" +a +k +j +j +j +j +j +j +j +j +a +"} +(11,1,1) = {" +a +a +a +a +a +P +a +a +a +a +a +"} diff --git a/code/__DEFINES/_flags/item_flags.dm b/code/__DEFINES/_flags/item_flags.dm index 7da71e22cb..529499127d 100644 --- a/code/__DEFINES/_flags/item_flags.dm +++ b/code/__DEFINES/_flags/item_flags.dm @@ -51,3 +51,4 @@ #define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances #define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment. #define ORGAN_EDIBLE (1<<7) //is a snack? :D +#define ORGAN_SYNTHETIC_EMP (1<<6) //Synthetic organ affected by an EMP. Deteriorates over time. diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 311bfb03d1..de3044b67a 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -83,6 +83,8 @@ #define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) #define COMPONENT_ATOM_BLOCK_EXIT 1 #define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc) +/// From base of atom/wave_ex_act(): (datum/wave_explosion/explosion, args) +#define COMSIG_ATOM_WAVE_EX_ACT "atom_wave_ex_act" ///from base of atom/ex_act(): (severity, target) #define COMSIG_ATOM_EX_ACT "atom_ex_act" ///from base of atom/emp_act(): (severity) diff --git a/code/__DEFINES/explosion.dm b/code/__DEFINES/explosion.dm new file mode 100644 index 0000000000..adba852ff1 --- /dev/null +++ b/code/__DEFINES/explosion.dm @@ -0,0 +1,86 @@ +// THIS IS INSANITY +// These are how wave explosions track when there's not only one direction to keep track of (diagonals, etc) +#define WEX_DIR_NORTH NORTH +#define WEX_DIR_SOUTH SOUTH +#define WEX_DIR_EAST EAST +#define WEX_DIR_WEST WEST +#define WEX_ALLDIRS (WEX_DIR_NORTH | WEX_DIR_SOUTH | WEX_DIR_EAST | WEX_DIR_WEST) + +/// Default explosion power to consider an explosion over +#define EXPLOSION_POWER_DEAD 2.5 +/// Default explosion falloff +#define EXPLOSION_DEFAULT_FALLOFF_MULTIPLY 0.98 +/// Default explosion constant falloff +#define EXPLOSION_DEFAULT_FALLOFF_SUBTRACT 5 +/// Block amount at which point having 0 block resistance will result in a full block +#define EXPLOSION_POWER_NO_RESIST_THRESHOLD 5 + +/// Explosion power quantization +#define EXPLOSION_POWER_QUANTIZATION_ACCURACY 0.1 + +// [explosion_flags] variable on /atom +/// No blocking if we're not dense +#define EXPLOSION_FLAG_DENSITY_DEPENDENT (1<<0) +/// If we survive the explosion, we block ALL the power and ignore the results of wave_ex_act(). +#define EXPLOSION_FLAG_HARD_OBSTACLE (1<<1) + +// Standardized explosion powers +/// Maxcap +#define EXPLOSION_POWER_MAXCAP 500 +/// erases shreds from explosions/item damage +#define EXPLOSION_POWER_ERASE_SHREDS 400 +/// Gibs most mobs +#define EXPLOSION_POWER_NORMAL_MOB_GIB 400 + +// Walls +#define EXPLOSION_POWER_WALL_SCRAPE 400 +#define EXPLOSION_POWER_WALL_DISMANTLE 300 +#define EXPLOSION_POWER_WALL_MINIMUM_DISMANTLE 200 + +#define EXPLOSION_POWER_RWALL_SCRAPE 450 +#define EXPLOSION_POWER_RWALL_DISMANTLE 400 +#define EXPLOSION_POWER_RWALL_MINIMUM_DISMANTLE 300 + +// Floors +#define EXPLOSION_POWER_FLOOR_TILE_BREAK 50 +#define EXPLOSION_POWER_FLOOR_MINIMUM_TURF_BREAK 125 +#define EXPLOSION_POWER_FLOOR_TURF_BREAK_BONUS 225 +#define EXPLOSION_POWER_FLOOR_TURF_BREAK 350 +#define EXPLOSION_POWER_FLOOR_TURF_SCRAPE 425 +#define EXPLOSION_POWER_FLOOR_SHIELDED_IMMUNITY 250 + +// Helpers +/// Explosion power to object damage (without taking into consideration armor) +#define EXPLOSION_POWER_STANDARD_SCALE_OBJECT_DAMAGE(power, multiplier) (power>500)?(10*(power**0.6)*multiplier):(0.1*(power**1.3)*multiplier) +/// Explosion power to object damage for hard obstacles +#define EXPLOSION_POWER_STANDARD_SCALE_HARD_OBSTACLE_DAMAGE(power, multiplier) (power>500)?(10*(power**0.6)*multiplier):(0.15*(power**1.3)*multiplier) +/// Explosion power to object damage for windows +#define EXPLOSION_POWER_STANDARD_SCALE_WINDOW_DAMAGE(power, multiplier) (power>500)?(10*(power**0.6)*multiplier):(0.2*(power**1.3)*multiplier) +/// Default brute damage to do to living things +#define EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, multiplier) ((power / 2) * multiplier) + +// Damage factors +/// Factor to multiply damage to a door by if it's open (and therefore not blocking the explosion) +#define EXPLOSION_DAMAGE_OPEN_DOOR_FACTOR 0.25 + +// Standardized explosion constant blocks +#define EXPLOSION_BLOCK_WINDOW 10 +#define EXPLOSION_BLOCK_MACHINE 20 +#define EXPLOSION_BLOCK_SPACE 20 +#define EXPLOSION_BLOCK_REINFORCED_WINDOW 50 +#define EXPLOSION_BLOCK_DENSE_FILLER 50 +#define EXPLOSION_BLOCK_WALL 75 +#define EXPLOSION_BLOCK_BLAST_PROOF 250 +#define EXPLOSION_BLOCK_BOROSILICATE_WINDOW 250 +#define EXPLOSION_BLOCK_EXTREME 250 + +// Standardized explosion factor blocks +#define EXPLOSION_DAMPEN_MACHINE 0.95 +#define EXPLOSION_DAMPEN_SPACE 0.95 +#define EXPLOSION_DAMPEN_WINDOW 0.95 +#define EXPLOSION_DAMPEN_REINFORCED_WINDOW 0.9 +#define EXPLOSION_DAMPEN_DENSE_FILLER 0.85 +#define EXPLOSION_DAMPEN_WALL 0.8 +#define EXPLOSION_DAMPEN_BOROSILICATE_WINDOW 0.65 +#define EXPLOSION_DAMPEN_BLAST_PROOF 0.65 +#define EXPLOSION_DAMPEN_EXTREME 0.5 diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm index 8ab33689d3..37584d892d 100644 --- a/code/__DEFINES/layers_planes.dm +++ b/code/__DEFINES/layers_planes.dm @@ -77,6 +77,7 @@ #define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible #define TABLE_LAYER 2.8 #define TRAY_LAYER 2.85 +#define GATEWAY_UNDERLAY_LAYER 2.85 #define BELOW_OBJ_LAYER 2.9 #define LOW_ITEM_LAYER 2.95 //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index deb578464f..2c8001b086 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -180,6 +180,7 @@ #define FIRE_PRIORITY_PROJECTILES 200 #define FIRE_PRIORITY_TICKER 200 #define FIRE_PRIORITY_ATMOS_ADJACENCY 300 +#define FIRE_PRIORITY_EXPLOSIONS 350 #define FIRE_PRIORITY_STATPANEL 390 #define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_RUNECHAT 410 @@ -219,7 +220,6 @@ A.flags_1 &= ~OVERLAY_QUEUED_1;\ } while(FALSE) - /** Create a new timer and add it to the queue. * Arguments: diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ded183ba0b..3807b66b06 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -165,6 +165,7 @@ #define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events" #define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events #define TRAIT_PUGILIST "pugilist" //This guy punches people for a living +#define TRAIT_NOPUGILIST "nopugilist" // for preventing ((((((((((extreme)))))))))) punch stacking #define TRAIT_KI_VAMPIRE "ki-vampire" //when someone with this trait rolls maximum damage on a punch and stuns the target, they regain some stamina and do clone damage #define TRAIT_MAULER "mauler" // this guy punches the shit out of people to hurt them, not to drain their stamina #define TRAIT_PASSTABLE "passtable" diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index b8c009ff4f..0a17f0d1df 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -14,7 +14,6 @@ //socks init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list) //bodypart accessories (blizzard intensifies) - init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/lizard, GLOB.animated_tails_list_lizard) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human) @@ -68,6 +67,7 @@ for(var/spath in subtypesof(/datum/species)) var/datum/species/S = new spath() GLOB.species_list[S.id] = spath + GLOB.species_datums[S.id] = S //Surgeries for(var/path in subtypesof(/datum/surgery)) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 513437e57e..02af6fab79 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -64,8 +64,6 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list) if(!GLOB.legs_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list) - if(!GLOB.body_markings_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list) if(!GLOB.wings_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list) if(!GLOB.deco_wings_list.len) @@ -115,15 +113,6 @@ continue if(!S.ckeys_allowed) snowflake_mam_tails_list[S.name] = mtpath - var/list/snowflake_markings_list = list() - for(var/mmpath in GLOB.mam_body_markings_list) - var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[mmpath] - if(istype(instance, /datum/sprite_accessory)) - var/datum/sprite_accessory/S = instance - if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies)) - continue - if(!S.ckeys_allowed) - snowflake_markings_list[S.name] = mmpath var/list/snowflake_ears_list = list() for(var/mepath in GLOB.mam_ears_list) var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[mepath] @@ -177,7 +166,6 @@ "ears" = "None", "frills" = pick(GLOB.frills_list), "spines" = pick(GLOB.spines_list), - "body_markings" = pick(GLOB.body_markings_list), "legs" = pick("Plantigrade","Digitigrade"), "caps" = pick(GLOB.caps_list), "insect_wings" = pick(GLOB.insect_wings_list), @@ -187,7 +175,7 @@ "arachnid_spinneret" = pick(GLOB.arachnid_spinneret_list), "arachnid_mandibles" = pick(GLOB.arachnid_mandibles_list), "taur" = "None", - "mam_body_markings" = snowflake_markings_list.len ? pick(snowflake_markings_list) : "None", + "mam_body_markings" = list(), "mam_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None", "mam_snouts" = snowflake_mam_snouts_list ? pick(snowflake_mam_snouts_list) : "None", "mam_tail" = snowflake_mam_tails_list ? pick(snowflake_mam_tails_list) : "None", @@ -320,6 +308,8 @@ GLOBAL_LIST_INIT(nonstandard_skin_tones, list("orange")) GLOBAL_LIST_EMPTY(species_list) +GLOBAL_LIST_EMPTY(species_datums) + /proc/age2agedescription(age) switch(age) if(0 to 1) diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm index de225b3b53..fa655efce4 100644 --- a/code/__HELPERS/reagents.dm +++ b/code/__HELPERS/reagents.dm @@ -95,3 +95,9 @@ if("I'm feeling lucky") chosen_id = pick(subtypesof(/datum/reagent)) return chosen_id + +/proc/find_reagent_object_from_type(input) + if(GLOB.chemical_reagents_list[input]) //prefer IDs! + return GLOB.chemical_reagents_list[input] + else + return null diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 75ce77302b..2c13f30707 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -551,8 +551,7 @@ ///How many players joined the round. var/total_players = GLOB.joined_player_list.len var/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote)) - for(var/i in SSeconomy.generated_accounts) - var/datum/bank_account/current_acc = SSeconomy.generated_accounts[i] + for(var/datum/bank_account/current_acc in SSeconomy.generated_accounts) if(typecache_bank[current_acc.type]) continue station_vault += current_acc.account_balance diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index f0a8a4e2c6..d94c677a42 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -17,7 +17,6 @@ GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name //Socks GLOBAL_LIST_EMPTY_TYPED(socks_list, /datum/sprite_accessory/underwear/socks) //stores socks indexed by name //Lizard Bits (all datum lists indexed by name) -GLOBAL_LIST_EMPTY(body_markings_list) GLOBAL_LIST_EMPTY(tails_list_lizard) GLOBAL_LIST_EMPTY(animated_tails_list_lizard) GLOBAL_LIST_EMPTY(snouts_list) @@ -55,7 +54,6 @@ GLOBAL_LIST_INIT(mutant_reference_list, list( "frills" = GLOB.frills_list, "horns" = GLOB.horns_list, "ears" = GLOB.ears_list, - "body_markings" = GLOB.body_markings_list, "wings" = GLOB.wings_list, "wingsopen" = GLOB.wings_open_list, "deco_wings" = GLOB.deco_wings_list, @@ -299,7 +297,7 @@ GLOBAL_LIST_INIT(roundstart_languages, get_roundstart_languages()) //locked parts are those that your picked species requires to have //unlocked parts are those that anyone can choose on customisation regardless //parts not in unlocked, but in all, are thus locked -GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns")) +GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns")) GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff")) //parts in either of the above two lists that require a second option that allows them to be coloured @@ -350,3 +348,8 @@ GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow" //list of eye types, corresponding to a respective left and right icon state for the set of eyes GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "cyclops")) + +//list linking bodypart bitflags to their actual names +GLOBAL_LIST_INIT(bodypart_names, list(num2text(HEAD) = "Head", num2text(CHEST) = "Chest", num2text(LEG_LEFT) = "Left Leg", num2text(LEG_RIGHT) = "Right Leg", num2text(ARM_LEFT) = "Left Arm", num2text(ARM_RIGHT) = "Right Arm")) +// list linking bodypart names back to the bitflags +GLOBAL_LIST_INIT(bodypart_values, list("Head" = num2text(HEAD), "Chest" = num2text(CHEST), "Left Leg" = num2text(LEG_LEFT), "Right Leg" = num2text(LEG_RIGHT), "Left Arm" = num2text(ARM_LEFT), "Right Arm" = num2text(ARM_RIGHT))) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index a1b7a74384..d1fff25dae 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -89,6 +89,7 @@ //Generic living #define ui_living_pull "EAST-1:28,CENTER-2:15" #define ui_living_health "EAST-1:28,CENTER:15" +#define ui_living_healthdoll "EAST-1:28,CENTER-1:15" //Monkeys #define ui_monkey_head "CENTER-5:13,SOUTH:5" diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 929e01c6d9..7d22b70cbc 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -13,7 +13,6 @@ GLOBAL_LIST_EMPTY(radial_menus) icon_state = "radial_slice" var/choice var/next_page = FALSE - var/tooltips = FALSE /obj/screen/radial/slice/MouseEntered(location, control, params) . = ..() diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 34fd90f4f0..b27abad841 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -637,6 +637,11 @@ name = "health doll" screen_loc = ui_healthdoll +/obj/screen/healthdoll/living + icon_state = "fullhealth0" + screen_loc = ui_living_healthdoll + var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update + /obj/screen/mood name = "mood" icon_state = "mood5" diff --git a/code/_onclick/hud/simple_animal.dm b/code/_onclick/hud/simple_animal.dm new file mode 100644 index 0000000000..ef46c0d66e --- /dev/null +++ b/code/_onclick/hud/simple_animal.dm @@ -0,0 +1,15 @@ +/datum/hud/living/simple_animal + ui_style = 'icons/mob/screen_gen.dmi' +/datum/hud/living/simple_animal/New(mob/living/owner) + ..() + pull_icon = new /obj/screen/pull() + pull_icon.icon = ui_style + pull_icon.update_icon() + pull_icon.screen_loc = ui_living_pull + pull_icon.hud = src + static_inventory += pull_icon + + //mob health doll! assumes whatever sprite the mob is + healthdoll = new /obj/screen/healthdoll/living() + healthdoll.hud = src + infodisplay += healthdoll diff --git a/code/controllers/subsystem/activity.dm b/code/controllers/subsystem/activity.dm index 24cd1802f0..0a8d248e58 100644 --- a/code/controllers/subsystem/activity.dm +++ b/code/controllers/subsystem/activity.dm @@ -61,14 +61,14 @@ SUBSYSTEM_DEF(activity) for(var/threat in threat_history) . = max(threat_history[threat], .) -/datum/controller/subsystem/activity/proc/on_explosion(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) +/datum/controller/subsystem/activity/proc/on_explosion(datum/source, atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) if(!("explosions" in deferred_threats)) deferred_threats["explosions"] = 0 var/area/A = get_area(epicenter) if(is_station_level(epicenter.z) && (A.area_flags & BLOBS_ALLOWED) && !istype(A, /area/asteroid)) deferred_threats["explosions"] += devastation_range**2 + heavy_impact_range**2 / 4 + light_impact_range**2 / 8 // 75 for a maxcap -/datum/controller/subsystem/activity/proc/on_death(mob/M, gibbed) +/datum/controller/subsystem/activity/proc/on_death(datum/source, mob/M, gibbed) if(!("crew_deaths" in deferred_threats)) deferred_threats["crew_deaths"] = 0 if(M?.mind && SSjob.GetJob(M.mind.assigned_role)) diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm new file mode 100644 index 0000000000..30a05a7505 --- /dev/null +++ b/code/controllers/subsystem/explosions.dm @@ -0,0 +1,23 @@ +SUBSYSTEM_DEF(explosions) + name = "Explosions" + wait = 1 + flags = SS_TICKER + priority = FIRE_PRIORITY_EXPLOSIONS + var/static/list/datum/wave_explosion/wave_explosions = list() + var/static/list/datum/wave_explosion/active_wave_explosions = list() + var/static/list/datum/wave_explosion/currentrun = list() + +/datum/controller/subsystem/explosions/fire(resumed) + if(!resumed) + currentrun = active_wave_explosions.Copy() + var/datum/wave_explosion/E + var/ran = 0 + while(length(currentrun) && !MC_TICK_CHECK) + ran = 0 + for(var/i in currentrun) + E = i + if(E.tick()) + currentrun -= E + ran++ + if(!ran) + break diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 58238247ff..a7a3e87672 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -713,7 +713,8 @@ SUBSYSTEM_DEF(ticker) 'sound/roundend/disappointed.ogg', 'sound/roundend/gondolabridge.ogg', 'sound/roundend/haveabeautifultime.ogg', - 'sound/roundend/CitadelStationHasSeenBetterDays.ogg'\ + 'sound/roundend/CitadelStationHasSeenBetterDays.ogg', + 'sound/roundend/approachingbaystation.ogg'\ ) SEND_SOUND(world, sound(round_end_sound)) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index 4c418bb8dc..f41396ad67 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -52,8 +52,15 @@ return strength -= strength / hl3_release_date if(strength <= RAD_BACKGROUND_RADIATION) - qdel(src) + addtimer(CALLBACK(src, .proc/check_dissipate), 5 SECONDS) + return PROCESS_KILL +/datum/component/radioactive/proc/check_dissipate() + if(strength <= RAD_BACKGROUND_RADIATION) + qdel(src) + return + if(!(datum_flags & DF_ISPROCESSING)) // keep going + START_PROCESSING(SSradiation, src) /datum/component/radioactive/proc/glow_loop(atom/movable/master) var/filter = master.get_filter("rad_glow") diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index 20e1a0a4e2..1e3fff8a17 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -57,7 +57,7 @@ /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, /obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/automatic/magrifle/pistol, - /obj/item/toy/plush/snakeplushie, /obj/item/gun/energy/e_gun/mini + /obj/item/toy/plush/snakeplushie, /obj/item/gun/energy/e_gun/mini, /obj/item/gun/ballistic/derringer )) /datum/component/storage/concrete/pockets/shoes/clown/Initialize() diff --git a/code/datums/explosion2.dm b/code/datums/explosion2.dm new file mode 100644 index 0000000000..75f65e4b23 --- /dev/null +++ b/code/datums/explosion2.dm @@ -0,0 +1,378 @@ +/// Creates a wave explosion at a certain place +/proc/wave_explosion(turf/target, power, factor = EXPLOSION_DEFAULT_FALLOFF_MULTIPLY, constant = EXPLOSION_DEFAULT_FALLOFF_SUBTRACT, flash = 0, fire = 0, atom/source, speed = 0, + silent = FALSE, bypass_logging = FALSE, block_resistance = 1, start_immediately = TRUE) + if(!istype(target) || (power <= EXPLOSION_POWER_DEAD)) + return + if(!bypass_logging) + var/logstring = "Wave explosion at [COORD(target)]: [power]/[factor]/[constant]/[flash]/[fire]/[speed] initial/factor/constant/flash/fire/speed" + log_game(logstring) + message_admins(logstring) + return new /datum/wave_explosion(target, power, factor, constant, flash, fire, source, speed, silent, start_immediately, block_resistance) + +/** + * New force-blastwave explosion system + */ +/datum/wave_explosion + /// Next unique numerical ID + var/static/next_id = 0 + /// Our unique nuumerical ID + var/id + /// world.time we started at + var/start_time + /// Are we currently running? + var/running = FALSE + /// Are we currently finished? + var/finished = FALSE + /// What atom we originated from, if any + var/atom/source + + /// Explosion power at which point to consider to be a dead expansion + var/power_considered_dead = EXPLOSION_POWER_DEAD + /// Explosion power we were initially at + var/power_initial + /// Base explosion power falloff multiplier (applied first) + var/power_falloff_factor = EXPLOSION_DEFAULT_FALLOFF_MULTIPLY + /// Base explosion power falloff subtract (applied second) + var/power_falloff_constant = EXPLOSION_DEFAULT_FALLOFF_SUBTRACT + /// Flash range + var/flash_range = 0 + /// Fire probability per tile + var/fire_probability = 0 + /// Are we silent/do we make the screenshake/sounds? + var/silent = FALSE + + // Modifications + /// Object damage mod + var/object_damage_mod = 1 + /// Hard obstcales get this mod INSTEAD of object damage mod + var/hard_obstacle_mod = 1 + /// Window shatter mod. Overrides both [hard_obstcale_mod] and [object_damage_mod] + var/window_shatter_mod = 1 + /// Wall destruction mod + var/wall_destroy_mod = 1 + /// Mob damage mod + var/mob_damage_mod = 1 + /// Mob gib mod + var/mob_gib_mod = 1 + /// Mob deafen mod + var/mob_deafen_mod = 1 + /// block = block / this, if 0 any block is absolute + var/block_resistance = 1 + + // Rewrite count: 2 + // Each cycle is a "perfect ring". + // We run into the problem that diagonal hitboxes don't exist on 2d grid games. + // How we deal with this is this: + // The first half of each cycle explodes cardinal directions awaiting expansion first + // Diagonals get added to a potential diagonals list. + // The second half of each cycle checks the potential diagonals list. If something isn't on the exploded list, + // we know it's a valid diagonal and explode it. + // Then all exploded turfs are flushed to exploded_last and it continues. + // Direction bitflags use the WEX_DIR_X flags so we can keep track of more than one direction in a single field + // The insanity begins when I realized that doing cardinals are easy but diagonals require: + // - Tallying the explosive power that should go into it + // - Exploding it afterwards using the tallied power rather than passed power (so corners aren't far weaker unless there's one side of it blocked) + // Expanding the explosion power of the now exploded diagonal into the two dirs its cardinals are in + // If this is done using a perfect algorithm it should be relatively efficient and result in a near-perfect shockwave simulation. + + /// The last ring that's been exploded. Any turfs in this will completely ignore the current cycle. Turf = TRUE + var/list/turf/exploded_last = list() + /// The "edges" + dirs that need to be processed this cycle. turf = dir flags + var/list/turf/edges = list() + /// The powers of the current turf edges. turf = power + var/list/turf/powers = list() + + /// What cycle are we on? + var/cycle + /// When we started the current cycle + var/cycle_start + /// Time to wait between cycles + var/cycle_speed = 0 + /// Current index for list + var/index = 1 + +/datum/wave_explosion/New(turf/initial, power, factor = EXPLOSION_DEFAULT_FALLOFF_MULTIPLY, constant = EXPLOSION_DEFAULT_FALLOFF_SUBTRACT, flash = 0, fire = 0, atom/source, speed = 0, silent = FALSE, autostart = TRUE, block_resistance = 1) + id = ++next_id + if(next_id > SHORT_REAL_LIMIT) + next_id = 0 + SSexplosions.wave_explosions += src + src.power_initial = power + src.power_falloff_factor = factor + src.power_falloff_constant = constant + src.flash_range = flash + src.fire_probability = fire + src.source = source + src.cycle_speed = speed + src.silent = silent + src.block_resistance = block_resistance + if(!istype(initial)) + stack_trace("Wave explosion created without a turf. This better be for debugging purposes.") + return + if(autostart) + start(initial) + +/datum/wave_explosion/Destroy() + if(running) + stop(FALSE) + return ..() + +/datum/wave_explosion/proc/start(list/turf/_starting) + if(running) + CRASH("Attempted to start() a running wave explosion") + if(!islist(_starting)) + _starting = list(_starting) + var/list/mob/to_flash = list() + var/list/feedback = list() + var/list/mob/mob_potential_shake = list() + var/list/mob/closest_to = list() + for(var/i in 1 to _starting.len) + var/turf/starting = _starting[i] + edges[starting] = WEX_ALLDIRS + powers[starting] = power_initial + var/x0 = starting.x + var/y0 = starting.y + var/z0 = starting.z + var/area/areatype = get_area(starting) + feedback += list(list("power" = power_initial, factor = "factor", constant = "constant", flash = "flash", fire = "fire", speed = "speed", "x" = x0, "y" = y0, "z" = z0, "area" = areatype.type, "time" = TIME_STAMP("YYYY-MM-DD hh:mm:ss", 1))) + // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. + // Stereo users will also hear the direction of the explosion! + + // Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions. + // 3/7/14 will calculate to 80 + 35 + + if(!silent) + for(var/mob/M in GLOB.player_list) + // Double check for client + var/turf/M_turf = get_turf(M) + if(M_turf && M_turf.z == z0) + var/dist = get_dist(M_turf, starting) + if(isnull(mob_potential_shake[M])) + mob_potential_shake[M] = dist + closest_to[M] = starting + else if(mob_potential_shake[M] < dist) + mob_potential_shake[M] = dist + closest_to[M] = starting + + for(var/array in GLOB.doppler_arrays) + var/obj/machinery/doppler_array/A = array + A.sense_wave_explosion(starting, power_initial, cycle_speed) + + // Flash mobs + if(flash_range) + for(var/mob/living/L in viewers(flash_range, starting)) + to_flash |= L + + if(!silent) + var/frequency = get_rand_frequency() + var/sound/explosion_sound = sound(get_sfx("explosion")) + var/sound/far_explosion_sound = sound('sound/effects/explosionfar.ogg') + + var/far_dist = sqrt(power_initial) * 7.5 + + for(var/mob/M in mob_potential_shake) + var/dist = mob_potential_shake[M] + var/baseshakeamount + if(sqrt(power_initial) - dist > 0) + baseshakeamount = sqrt((sqrt(power_initial) - dist)*0.1) + // If inside the blast radius + world.view - 2 + if(dist <= round(2 * sqrt(power_initial) + world.view - 2, 1)) + M.playsound_local(closest_to[M], null, 100, 1, frequency, max_distance = 5, S = explosion_sound) + if(baseshakeamount > 0) + shake_camera(M, 25, clamp(baseshakeamount, 0, 10)) + // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. + else if(dist <= far_dist) + var/far_volume = clamp(far_dist, 30, 50) // Volume is based on explosion size and dist + far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion + M.playsound_local(closest_to[M], null, far_volume, 1, frequency, max_distance = 5, S = far_explosion_sound) + if(baseshakeamount > 0) + shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5)) + + for(var/i in 1 to to_flash.len) + var/mob/living/L = to_flash[i] + L.flash_act() + + SSblackbox.record_feedback("associative", "wave_explosion", 1, feedback) + + if(!cycle) + cycle = 1 + SSexplosions.active_wave_explosions += src + running = TRUE + cycle_start = world.time - cycle_speed + tick() + +/datum/wave_explosion/proc/stop(delete = TRUE) + SSexplosions.active_wave_explosions -= src + SSexplosions.currentrun -= src + edges = null + powers = null + exploded_last = null + cycle = null + running = FALSE + qdel(src) + +#define SHOULD_SUSPEND ((cycle_start + cycle_speed) > world.time) + +/** + * Called by SSexplosions to propagate this. + * Return TRUE if postponed + */ +/datum/wave_explosion/proc/tick() + /// Each tick goes through one full cycle. + // This can be changed to a "continuous process" system where indexes are tracked if needed. + if(!src.edges.len) + // we're done + finished = TRUE + stop(TRUE) + return TRUE + if(SHOULD_SUSPEND) + return TRUE + // Set up variables + var/turf/T + var/turf/expanding + var/power + var/returned + var/blocked + var/dir + // insanity define to explode a turf with a certain amount of power, direction, and set returned. +#define WEX_ACT(_T, _P, _D) \ + returned = max(0, _T.wave_explode(_P, src, _D)); \ + blocked = _P - returned; \ + if(!block_resistance) { \ + if(blocked > EXPLOSION_POWER_NO_RESIST_THRESHOLD) { \ + returned = 0; \ + } \ + } \ + else if(blocked) { \ + returned = _P - (blocked / block_resistance); \ + }; \ + returned = round((returned * power_falloff_factor) - power_falloff_constant, EXPLOSION_POWER_QUANTIZATION_ACCURACY); \ + if(prob(fire_probability)) { \ + new /obj/effect/hotspot(_T); \ + }; + + // Cache hot lists + var/list/turf/edges = src.edges + var/list/turf/powers = src.powers + var/list/turf/exploded_last = src.exploded_last + + // prepare expansions + var/list/turf/edges_next = list() + var/list/turf/powers_next = list() + var/list/turf/powers_returned = list() + var/list/turf/diagonals = list() + var/list/turf/diagonal_powers = list() + var/list/turf/diagonal_powers_max = list() + + // to_chat(world, "DEBUG: cycle start edges [english_list_assoc(edges)]") + + // Process cardinals: + // Explode all cardinals and expand in directions, gathering all cardinals it should go to. + // Power for when things meet in the middle should be the greatest of the two. + for(var/i in edges) + T = i + power = powers[T] + dir = edges[T] + WEX_ACT(T, power, dir) + if(returned < power_considered_dead) + continue + powers_returned[T] = returned + // diagonal power calc when multiple things hit one diagonal +#define CALCULATE_DIAGONAL_POWER(existing, adding, maximum) min(maximum, existing + adding) + // diagonal hitting cardinal expansion +#define CALCULATE_DIAGONAL_CROSS_POWER(existing, adding) max(existing, adding) + // insanity define to mark the next set of cardinals. +#define CARDINAL_MARK(ndir, cdir, edir) \ + if(edir & cdir) { \ + CARDINAL_MARK_NOCHECK(ndir, cdir, edir); \ + }; + +#define CARDINAL_MARK_NOCHECK(ndir, cdir, edir) \ + expanding = get_step(T,ndir); \ + if(expanding && !exploded_last[expanding] && !edges[expanding]) { \ + powers_next[expanding] = max(powers_next[expanding], returned); \ + edges_next[expanding] = (cdir | edges_next[expanding]); \ + }; + + // insanity define to do diagonal marking as 2 substeps +#define DIAGONAL_SUBSTEP(ndir, cdir, edir) \ + expanding = get_step(T,ndir); \ + if(expanding && !exploded_last[expanding] && !edges[expanding]) { \ + if(!edges_next[expanding]) { \ + diagonal_powers_max[expanding] = max(diagonal_powers_max[expanding], returned, powers[T]); \ + diagonal_powers[expanding] = CALCULATE_DIAGONAL_POWER(diagonal_powers[expanding], returned, diagonal_powers_max[expanding]); \ + diagonals[expanding] = (cdir | diagonals[expanding]); \ + }; \ + else { \ + powers_next[expanding] = CALCULATE_DIAGONAL_CROSS_POWER(powers_next[expanding], returned); \ + }; \ + }; + + // insanity define to mark the diagonals that would otherwise be missed +#define DIAGONAL_MARK(ndir, cdir, edir) \ + if(edir & cdir) { \ + DIAGONAL_MARK_NOCHECK(ndir, cdir, edir); \ + }; + + // this only works because right now, WEX_DIR_X is the same as a byond dir + // and we know we're only passing in one dir at a time. + // if this ever stops being the case, and explosions break when you touch this, now you know why. +#define DIAGONAL_MARK_NOCHECK(ndir, cdir, edir) \ + DIAGONAL_SUBSTEP(turn(ndir, 90), turn(cdir, 90), edir); \ + DIAGONAL_SUBSTEP(turn(ndir, -90), turn(cdir, -90), edir); + + // mark +#define MARK(ndir, cdir, edir) \ + if(edir & cdir) { \ + CARDINAL_MARK_NOCHECK(ndir, cdir, edir); \ + DIAGONAL_MARK_NOCHECK(ndir, cdir, edir); \ + }; + CARDINAL_MARK(NORTH, WEX_DIR_NORTH, dir) + CARDINAL_MARK(SOUTH, WEX_DIR_SOUTH, dir) + CARDINAL_MARK(EAST, WEX_DIR_EAST, dir) + CARDINAL_MARK(WEST, WEX_DIR_WEST, dir) + + // to_chat(world, "DEBUG: cycle mid edges_next [english_list_assoc(edges_next)]") + + // Sweep after cardinals for diagonals + for(var/i in edges) + T = i + power = powers[T] + dir = edges[T] + returned = powers_returned[T] + DIAGONAL_MARK(NORTH, WEX_DIR_NORTH, dir) + DIAGONAL_MARK(SOUTH, WEX_DIR_SOUTH, dir) + DIAGONAL_MARK(EAST, WEX_DIR_EAST, dir) + DIAGONAL_MARK(WEST, WEX_DIR_WEST, dir) + + // to_chat(world, "DEBUG: cycle mid diagonals [english_list_assoc(diagonals)]") + + // Process diagonals: + for(var/i in diagonals) + T = i + power = diagonal_powers[T] + dir = diagonals[T] + WEX_ACT(T, power, dir) + if(returned < power_considered_dead) + continue + CARDINAL_MARK(NORTH, WEX_DIR_NORTH, dir) + CARDINAL_MARK(SOUTH, WEX_DIR_SOUTH, dir) + CARDINAL_MARK(EAST, WEX_DIR_EAST, dir) + CARDINAL_MARK(WEST, WEX_DIR_WEST, dir) + + // to_chat(world, "DEBUG: cycle end edges_next [english_list_assoc(edges_next)]") + + // flush lists + src.exploded_last = edges + diagonals + src.edges = edges_next + src.powers = powers_next + cycle++ + cycle_start = world.time + +#undef SHOULD_SUSPEND + +#undef WEX_ACT + +#undef DIAGONAL_SUBSTEP +#undef DIAGONAL_MARK +#undef CARDINAL_MARK +#undef MARK diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 7855c4e87b..c1aed96d61 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -142,7 +142,8 @@ // Can most things breathe? if(trace_gases) continue - if(A.get_moles(/datum/gas/oxygen) >= 16) + var/oxy_moles = A.get_moles(/datum/gas/oxygen) + if(oxy_moles < 16 || oxy_moles > 50) continue if(A.get_moles(/datum/gas/plasma)) continue diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index d6e2b1a2c0..a55e947709 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -167,6 +167,7 @@ ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT) ADD_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT) ADD_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT) + ADD_TRAIT(H, TRAIT_NOPUGILIST, SLEEPING_CARP_TRAIT) // cqc doesn't get this as it's intended to be able to stack with northstar gloves H.physiology.brute_mod *= 0.4 //brute is really not gonna cut it H.physiology.burn_mod *= 0.7 //burn is distinctly more useful against them than brute but they're still resistant H.physiology.stamina_mod *= 0.4 //You take less stamina damage overall, but you do not reduce the damage from stun batons as much @@ -183,14 +184,15 @@ REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT) REMOVE_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT) REMOVE_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT) - H.physiology.brute_mod *= (1/0.4) //brute is really not gonna cut it - H.physiology.burn_mod *= (1/0.7) //burn is distinctly more useful against them than brute but they're still resistant - H.physiology.stamina_mod *= (1/0.4) //You take less stamina damage overall, but you do not reduce the damage from stun batons as much - H.physiology.stun_mod *= (1/0.3) //for those rare stuns - H.physiology.pressure_mod *= (1/0.3) //go hang out with carp - H.physiology.cold_mod *= (1/0.3) //cold mods are different to burn mods, they do stack however - H.physiology.heat_mod *= (1/2) //this is mostly so sleeping carp has a viable weakness. Cooking them alive. Setting them on fire and heating them will be their biggest weakness. The reason for this is....filet jokes. - H.physiology.stamina_buffer_mod *= (1/0.75) //to help with some stamina + REMOVE_TRAIT(H, TRAIT_NOPUGILIST, SLEEPING_CARP_TRAIT) + H.physiology.brute_mod = initial(H.physiology.brute_mod) + H.physiology.burn_mod = initial(H.physiology.burn_mod) + H.physiology.stamina_mod = initial(H.physiology.stamina_mod) + H.physiology.stun_mod = initial(H.physiology.stun_mod) + H.physiology.pressure_mod = initial(H.physiology.pressure_mod) //no more carpies + H.physiology.cold_mod = initial(H.physiology.cold_mod) + H.physiology.heat_mod = initial(H.physiology.heat_mod) + H.physiology.stamina_buffer_mod = initial(H.physiology.stamina_buffer_mod) H.faction -= "carp" //:( /mob/living/carbon/human/proc/sleeping_carp_help() diff --git a/code/datums/mutations/space_adaptation.dm b/code/datums/mutations/space_adaptation.dm index a3a2f10f2f..8b2263c2f2 100644 --- a/code/datums/mutations/space_adaptation.dm +++ b/code/datums/mutations/space_adaptation.dm @@ -11,7 +11,7 @@ /datum/mutation/human/space_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() if(!(type in visual_indicators)) - visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "space_adapt", -MUTATIONS_LAYER)) /datum/mutation/human/space_adaptation/get_visual_indicator() return visual_indicators[type][1] diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 18674cdb17..3009831da7 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -36,6 +36,14 @@ ///Value used to increment ex_act() if reactionary_explosions is on var/explosion_block = 0 + /// Flags for explosions + var/explosion_flags = NONE + /// Amount to decrease wave explosions by + var/wave_explosion_block = 0 + /// Amount to multiply wave explosions by + var/wave_explosion_multiply = 1 + + //its inherent color, the colored paint applied on it, special color effect etc... /** * used to store the different colors on an atom * @@ -43,7 +51,6 @@ */ var/list/atom_colours - /// a very temporary list of overlays to remove var/list/remove_overlays /// a very temporary list of overlays to add @@ -556,6 +563,34 @@ contents_explosion(severity, target) SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) +/** + * Called when a wave explosion hits this atom. Do not override this. + * + * Returns explosion power to "allow through". + */ +/atom/proc/wave_explode(power, datum/wave_explosion/explosion, dir) + set waitfor = FALSE + // SHOULD_NOT_SLEEP(TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + SEND_SIGNAL(src, COMSIG_ATOM_WAVE_EX_ACT, args) + . = wave_ex_act(power, explosion, dir) // this must happen first for stuff like destruction/damage to tick. + if(isnull(.)) + stack_trace("wave_ex_act on [type] failed to return a number. defaulting to no blocking.") + return power + if((explosion_flags & EXPLOSION_FLAG_DENSITY_DEPENDENT) && !density) + return power // no block + else if((explosion_flags & EXPLOSION_FLAG_HARD_OBSTACLE) && !QDELETED(src)) + return 0 // fully blocked + +/** + * Called when a wave explosion hits this atom. + * + * Returns explosion power to "allow through". Standard handling and flag overrides in [wave_explode()]. + */ +/atom/proc/wave_ex_act(power, datum/wave_explosion/explosion, dir) + // SHOULD_NOT_SLEEP(TRUE) + return power * wave_explosion_multiply - wave_explosion_block + /atom/proc/blob_act(obj/structure/blob/B) SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index fbda722e4f..098f1a2ea0 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -55,6 +55,9 @@ ///Internal holder for emissive blocker object, do not use directly use blocks_emissive var/atom/movable/emissive_blocker/em_block + /// Should we use tooltips, if the thing does not have the code implemented `get_tooltip_data()`, it will default to examine(src) + var/tooltips = FALSE + /atom/movable/Initialize(mapload) . = ..() @@ -576,7 +579,7 @@ //TODO: Better floating /atom/movable/proc/float(on, throw_override) - if(throwing || !throw_override) + if(throwing && !throw_override) return if(on && !(movement_type & FLOATING)) animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index d26f8c5639..2ccf7d317d 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -96,6 +96,10 @@ Class Procs: flags_ricochet = RICOCHET_HARD ricochet_chance_mod = 0.3 + explosion_flags = EXPLOSION_FLAG_DENSITY_DEPENDENT + wave_explosion_block = EXPLOSION_BLOCK_MACHINE + wave_explosion_multiply = EXPLOSION_DAMPEN_MACHINE + anchored = TRUE interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 048247c630..822302789f 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -79,10 +79,12 @@ if (obj_flags & EMAGGED) return obj_flags |= EMAGGED + SSshuttle.shuttle_purchase_requirements_met |= "emagged" if (authenticated) authorize_access = get_all_accesses() to_chat(user, "You scramble the communication routing circuits!") playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) + SSshuttle.shuttle_purchase_requirements_met["emagged"] = TRUE return /obj/machinery/computer/communications/ui_act(action, list/params) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index f4a65ce984..477f72ee3b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -54,6 +54,8 @@ assemblytype = /obj/structure/door_assembly normalspeed = 1 explosion_block = 1 + wave_explosion_block = EXPLOSION_BLOCK_WALL + wave_explosion_multiply = EXPLOSION_DAMPEN_WALL hud_possible = list(DIAG_AIRLOCK_HUD) interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN @@ -686,7 +688,7 @@ else . += "It looks very robust." - if(hasSiliconAccessInArea(user) && (!stat & BROKEN)) + if(hasSiliconAccessInArea(user) && !(stat & BROKEN)) . += "Shift-click [src] to [ density ? "open" : "close"] it." . += "Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts." . += "Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it." diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 63a8ad22d4..a20374f878 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -16,6 +16,11 @@ interaction_flags_atom = INTERACT_ATOM_UI_INTERACT + wave_explosion_block = EXPLOSION_BLOCK_DENSE_FILLER + wave_explosion_multiply = EXPLOSION_DAMPEN_DENSE_FILLER + + explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE | EXPLOSION_FLAG_DENSITY_DEPENDENT + var/secondsElectrified = 0 var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close var/shockedby @@ -412,3 +417,8 @@ /obj/machinery/door/GetExplosionBlock() return density ? real_explosion_block : 0 + +/obj/machinery/door/wave_explosion_damage(power, datum/wave_explosion/explosion) + . = ..() + if(!density) + return . * EXPLOSION_DAMAGE_OPEN_DOOR_FACTOR diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index 1ec5b3c373..0c64151bca 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -71,3 +71,6 @@ /obj/machinery/door/password/ex_act(severity, target) return + +/obj/machinery/door/password/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return 0 //no. diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 4226d8a439..8c7fc692bc 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -8,6 +8,8 @@ closingLayer = CLOSED_BLASTDOOR_LAYER sub_door = TRUE explosion_block = 3 + wave_explosion_block = EXPLOSION_BLOCK_BLAST_PROOF + wave_explosion_multiply = EXPLOSION_DAMPEN_BLAST_PROOF heat_proof = TRUE safe = FALSE max_integrity = 600 diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index dd885542c9..af7545d3c9 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -360,6 +360,8 @@ max_integrity = 300 //Stronger doors for prison (regular window door health is 200) reinf = 1 explosion_block = 1 + wave_explosion_block = EXPLOSION_BLOCK_REINFORCED_WINDOW + wave_explosion_multiply = EXPLOSION_DAMPEN_REINFORCED_WINDOW /obj/machinery/door/window/brigdoor/security/cell name = "cell door" diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 1cdb81ee1d..2066e88f85 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -114,6 +114,44 @@ GLOBAL_LIST_EMPTY(doppler_arrays) LAZYADD(message_log, messages.Join(" ")) return TRUE +/obj/machinery/doppler_array/proc/sense_wave_explosion(turf/epicenter, power, speed) + if(stat & NOPOWER) + return FALSE + var/turf/zone = get_turf(src) + if(zone.z != epicenter.z) + return FALSE + + if(next_announce > world.time) + return FALSE + next_announce = world.time + cooldown + + var/distance = get_dist(epicenter, zone) + var/direct = get_dir(zone, epicenter) + + if(distance > max_dist) + return FALSE + if(!(direct & dir) && !integrated) + return FALSE + + + var/list/messages = list("Explosive shockwave detected.", \ + "Epicenter at: grid ([epicenter.x],[epicenter.y]). Shockwave expanding at a theoretical speed of [speed] m/s.", \ + "Wave energy: [power]MJ.") + + if(integrated) + var/obj/item/clothing/head/helmet/space/hardsuit/helm = loc + if(!helm || !istype(helm, /obj/item/clothing/head/helmet/space/hardsuit)) + return FALSE + helm.display_visor_message("Waveform explosion detected! Wave energy: [power]MJ.") + else + for(var/message in messages) + say(message) + if(LAZYLEN(message_log) > list_limit) + say("Storage buffer is full! Clearing buffers...") + LAZYCLEARLIST(message_log) + LAZYADD(message_log, messages.Join(" ")) + return TRUE + /obj/machinery/doppler_array/examine(mob/user) . = ..() . += "Its dish is facing to the [dir2text(dir)]." diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index aa1d05884e..dc87322b57 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -1,9 +1,5 @@ -#define LIMBGROWER_MAIN_MENU 1 -#define LIMBGROWER_CATEGORY_MENU 2 -#define LIMBGROWER_CHEMICAL_MENU 3 -//use these for the menu system - - +/// The limbgrower. Makes organd and limbs with synthflesh and chems. +/// See [limbgrower_designs.dm] for everything we can make. /obj/machinery/limbgrower name = "limb grower" desc = "It grows new limbs using Synthflesh." @@ -15,161 +11,235 @@ active_power_usage = 100 circuit = /obj/item/circuitboard/machine/limbgrower - var/operating = FALSE - var/disabled = FALSE + /// The category of limbs we're browing in our UI. + var/selected_category = "human" + /// If we're currently printing something. var/busy = FALSE - var/prod_coeff = 1 + /// How efficient our machine is. Better parts = less chemicals used and less power used. Range of 1 to 0.25. + var/production_coefficient = 1 + /// How long it takes for us to print a limb. Affected by production_coefficient. + var/production_speed = 3 SECONDS + /// The design we're printing currently. var/datum/design/being_built + /// Our internal techweb for limbgrower designs. var/datum/techweb/stored_research - var/selected_category - var/screen = 1 + /// All the categories of organs we can print. var/list/categories = list( - "human" = /datum/species/human, - "lizard" = /datum/species/lizard, - "mammal" = /datum/species/mammal, - "insect" = /datum/species/insect, - "fly" = /datum/species/fly, - "plasmaman" = /datum/species/plasmaman, - "xeno" = /datum/species/xeno, - "other" = /datum/species, - ) - var/list/stored_species = list() + "human", + "lizard", + "mammal", + "insect", + "fly", + "plasmaman", + "xeno", + "other", + ) var/obj/item/disk/data/dna_disk /obj/machinery/limbgrower/Initialize() create_reagents(100, OPENCONTAINER) stored_research = new /datum/techweb/specialized/autounlocking/limbgrower - for(var/i in categories) - var/species = categories[i] - stored_species[i] = new species() . = ..() + AddComponent(/datum/component/plumbing/simple_demand) + AddComponent(/datum/component/simple_rotation, ROTATION_WRENCH | ROTATION_CLOCKWISE, null, CALLBACK(src, .proc/can_be_rotated)) -/obj/machinery/limbgrower/ui_interact(mob/user) +/obj/machinery/limbgrower/ui_interact(mob/user, datum/tgui/ui) . = ..() - if(!is_operational()) - return + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Limbgrower", src) + ui.open() - var/dat = main_win(user) +/obj/machinery/limbgrower/ui_data(mob/user) + var/list/data = list() - switch(screen) - if(LIMBGROWER_MAIN_MENU) - dat = main_win(user) - if(LIMBGROWER_CATEGORY_MENU) - dat = category_win(user,selected_category) - if(LIMBGROWER_CHEMICAL_MENU) - dat = chemical_win(user) + for(var/datum/reagent/reagent_id in reagents.reagent_list) + var/list/reagent_data = list( + reagent_name = reagent_id.name, + reagent_amount = reagent_id.volume, + reagent_type = reagent_id.type + ) + data["reagents"] += list(reagent_data) - var/datum/browser/popup = new(user, "Limb Grower", name, 400, 500) - popup.set_content(dat) - popup.open() + data["total_reagents"] = reagents.total_volume + data["max_reagents"] = reagents.maximum_volume + data["busy"] = busy + var/list/disk_data = list() + disk_data["disk"] = dna_disk //Do i, the machine, have a disk? + disk_data["name"] = dna_disk?.fields["name"] //Name for the human saved if there is one + data["disk"] = disk_data + + return data + +/obj/machinery/limbgrower/ui_static_data(mob/user) + var/list/data = list() + data["categories"] = list() + + var/species_categories = categories.Copy() + for(var/species in species_categories) + species_categories[species] = list() + for(var/design_id in stored_research.researched_designs) + var/datum/design/limb_design = SSresearch.techweb_design_by_id(design_id) + for(var/found_category in species_categories) + if(found_category in limb_design.category) + species_categories[found_category] += limb_design + + for(var/category in species_categories) + var/list/category_data = list( + name = category, + designs = list(), + ) + for(var/datum/design/found_design in species_categories[category]) + var/list/all_reagents = list() + for(var/reagent_typepath in found_design.reagents_list) + var/datum/reagent/reagent_id = find_reagent_object_from_type(reagent_typepath) + var/list/reagent_data = list( + name = reagent_id.name, + amount = (found_design.reagents_list[reagent_typepath] * production_coefficient), + ) + all_reagents += list(reagent_data) + + category_data["designs"] += list(list( + parent_category = category, + name = found_design.name, + id = found_design.id, + needed_reagents = all_reagents, + )) + + data["categories"] += list(category_data) + + return data /obj/machinery/limbgrower/on_deconstruction() - for(var/obj/item/reagent_containers/glass/G in component_parts) - reagents.trans_to(G, G.reagents.maximum_volume) + for(var/obj/item/reagent_containers/glass/our_beaker in component_parts) + reagents.trans_to(our_beaker, our_beaker.reagents.maximum_volume) ..() -/obj/machinery/limbgrower/attackby(obj/item/O, mob/user, params) - if(busy) +/obj/machinery/limbgrower/attackby(obj/item/user_item, mob/living/user, params) + if (busy) to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.") return - if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", O)) - updateUsrDialog() + if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", user_item)) + ui_close(user) return - if(panel_open && default_deconstruction_crowbar(O)) - return - - if(user.a_intent == INTENT_HARM) //so we can hit the machine + if(user_item.tool_behaviour == TOOL_WRENCH && panel_open) return ..() - if(istype(O, /obj/item/disk)) + if(panel_open && default_deconstruction_crowbar(user_item)) + return + + if(istype(user_item, /obj/item/disk)) if(dna_disk) to_chat(user, "\The [src] already has a dna disk, take it out first!") return else - O.forceMove(src) - dna_disk = O - to_chat(user, "You insert \the [O] into \the [src].") + user_item.forceMove(src) + dna_disk = user_item + to_chat(user, "You insert \the [user_item] into \the [src].") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) return -/obj/machinery/limbgrower/Topic(href, href_list) - if(..()) + if(user.a_intent != INTENT_HELP) + return ..() + +/obj/machinery/limbgrower/proc/can_be_rotated() + if(panel_open) + return TRUE + return FALSE + +/obj/machinery/limbgrower/ui_act(action, list/params) + . = ..() + if(.) return - if (!busy) - if(href_list["menu"]) - screen = text2num(href_list["menu"]) - if(href_list["category"]) - selected_category = href_list["category"] + if (busy) + to_chat(usr, "\The [src] is busy. Please wait for completion of previous operation.") + return - if(href_list["disposeI"]) //Get rid of a reagent incase you add the wrong one by mistake - reagents.del_reagent(text2path(href_list["disposeI"])) + switch(action) - if(href_list["make"]) + if("empty_reagent") + reagents.del_reagent(text2path(params["reagent_type"])) + . = TRUE - ///////////////// - //href protection - being_built = stored_research.isDesignResearchedID(href_list["make"]) //check if it's a valid design + if("eject_disk") + eject_disk(usr) + + if("make_limb") + being_built = stored_research.isDesignResearchedID(params["design_id"]) if(!being_built) - return + CRASH("[src] was passed an invalid design id!") + /// All the reagents we're using to make our organ. + var/list/consumed_reagents_list = being_built.reagents_list.Copy() + /// The amount of power we're going to use, based on how much reagent we use. + var/power = 0 - var/synth_cost = being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff - var/power = max(2000, synth_cost/5) + for(var/reagent_id in consumed_reagents_list) + consumed_reagents_list[reagent_id] *= production_coefficient + if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id])) + audible_message("\The [src] buzzes.") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + return - if(reagents.has_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff)) - busy = TRUE - use_power(power) - flick("limbgrower_fill",src) - icon_state = "limbgrower_idleon" - addtimer(CALLBACK(src, .proc/build_item),32*prod_coeff) + power = max(2000, (power + consumed_reagents_list[reagent_id])) - if(href_list["dna_disk"]) - var/mob/living/carbon/user = usr - if(istype(user)) - if(!dna_disk) - var/obj/item/disk/diskette = user.get_active_held_item() - if(istype(diskette)) - diskette.forceMove(src) - dna_disk = diskette - to_chat(user, "You insert \the [diskette] into \the [src].") - else - dna_disk.forceMove(src.loc) - user.put_in_active_hand(dna_disk) - to_chat(user, "You remove \the [dna_disk] from \the [src].") - dna_disk = null - else - to_chat(user, "You are unable to grasp \the [dna_disk] disk from \the [src].") - else - to_chat(usr, "\The [src] is busy. Please wait for completion of previous operation.") + busy = TRUE + use_power(power) + flick("limbgrower_fill",src) + icon_state = "limbgrower_idleon" + selected_category = params["active_tab"] + addtimer(CALLBACK(src, .proc/build_item, consumed_reagents_list), production_speed * production_coefficient) + . = TRUE - updateUsrDialog() return -/obj/machinery/limbgrower/proc/build_item() - if(reagents.has_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff)) //sanity check, if this happens we are in big trouble - reagents.remove_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff) - var/buildpath = being_built.build_path - if(ispath(buildpath, /obj/item/bodypart)) //This feels like spaghetti code, but i need to initiliaze a limb somehow - build_limb(buildpath) - else if(ispath(buildpath, /obj/item/organ/genital)) //genitals are uhh... customizable - build_genital(buildpath) - else - //Just build whatever it is - new buildpath(loc) - else - src.visible_message(" Something went very wrong and there isnt enough synthflesh anymore!") - busy = FALSE - flick("limbgrower_unfill",src) - icon_state = "limbgrower_idleoff" - updateUsrDialog() +/* + * The process of beginning to build a limb or organ. + * Goes through and sanity checks that we actually have enough reagent to build our item. + * Then, remove those reagents from our reagents datum. + * + * After the reagents are handled, we can proceede with making the limb or organ. (Limbs are handled in a separate proc) + * + * modified_consumed_reagents_list - the list of reagents we will consume on build, modified by the production coefficient. + */ +/obj/machinery/limbgrower/proc/build_item(list/modified_consumed_reagents_list) + for(var/reagent_id in modified_consumed_reagents_list) + if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])) + audible_message("\The [src] buzzes.") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + break -/obj/machinery/limbgrower/proc/build_limb(buildpath) + reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + + var/built_typepath = being_built.build_path + // If we have a bodypart, we need to initialize the limb on its own. Otherwise we can build it here. + if(ispath(built_typepath, /obj/item/bodypart)) + build_limb(built_typepath) + else if(ispath(built_typepath, /obj/item/organ/genital)) //genitals are uhh... customizable + build_genital(built_typepath) + else + new built_typepath(loc) + + busy = FALSE + flick("limbgrower_unfill", src) + icon_state = "limbgrower_idleoff" + +/* + * The process of putting together a limb. + * This is called from after we remove the reagents, so this proc is just initializing the limb type. + * + * This proc handles skin / mutant color, greyscaling, names and descriptions, and various other limb creation steps. + * + * built_typepath - the path of the bodypart we're building. + */ +/obj/machinery/limbgrower/proc/build_limb(built_typepath) //i need to create a body part manually using a set icon (otherwise it doesnt appear) var/obj/item/bodypart/limb - var/datum/species/selected = stored_species[selected_category] - limb = new buildpath(loc) + var/datum/species/selected = GLOB.species_datums[selected_category] + limb = new built_typepath(loc) limb.base_bp_icon = selected.icon_limbs || DEFAULT_BODYPART_ICON_ORGANIC limb.species_id = selected.limbs_id limb.color_src = (MUTCOLORS in selected.species_traits ? MUTCOLORS : (selected.use_skintones ? SKINTONE : FALSE)) @@ -189,135 +259,103 @@ BP.name = "\improper synthetic [lowertext(selected.name)] [limb.name]" BP.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]." -/obj/machinery/limbgrower/proc/build_genital(buildpath) +/* + * Builds genitals, modifies to be the same + * as the person's cloning data on the data disk + */ +/obj/machinery/limbgrower/proc/build_genital(built_typepath) //i needed to create a way to customize gene tools using dna var/list/features = dna_disk?.fields["features"] if(length(features)) - switch(buildpath) + switch(built_typepath) if(/obj/item/organ/genital/penis) var/obj/item/organ/genital/penis/penis = new(loc) if(features["has_cock"]) penis.shape = features["cock_shape"] penis.length = features["cock_shape"] penis.diameter_ratio = features["cock_diameter_ratio"] - penis.color = sanitize_hexcolor(features["cock_color"], 6) - penis.update_icon() + penis.color = sanitize_hexcolor(features["cock_color"], 6, TRUE) + penis.update() if(/obj/item/organ/genital/testicles) var/obj/item/organ/genital/testicles/balls = new(loc) if(features["has_balls"]) - balls.color = sanitize_hexcolor(features["balls_color"], 6) + balls.color = sanitize_hexcolor(features["balls_color"], 6, TRUE) balls.shape = features["balls_shape"] balls.size = features["balls_size"] balls.fluid_rate = features["balls_cum_rate"] balls.fluid_mult = features["balls_cum_mult"] balls.fluid_efficiency = features["balls_efficiency"] + balls.update() if(/obj/item/organ/genital/vagina) var/obj/item/organ/genital/vagina/vegana = new(loc) - if(features["has_vagina"]) - vegana.color = sanitize_hexcolor(features["vag_color"], 6) + if(features["has_vag"]) + vegana.color = sanitize_hexcolor(features["vag_color"], 6, TRUE) vegana.shape = features["vag_shape"] + vegana.update() if(/obj/item/organ/genital/breasts) var/obj/item/organ/genital/breasts/boobs = new(loc) if(features["has_breasts"]) - boobs.color = sanitize_hexcolor(features["breasts_color"], 6) + boobs.color = sanitize_hexcolor(features["breasts_color"], 6, TRUE) boobs.size = features["breasts_size"] boobs.shape = features["breasts_shape"] if(!features["breasts_producing"]) boobs.genital_flags &= ~(GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH) + boobs.update() else - new buildpath(loc) + new built_typepath(loc) else - new buildpath(loc) + new built_typepath(loc) /obj/machinery/limbgrower/RefreshParts() reagents.maximum_volume = 0 - for(var/obj/item/reagent_containers/glass/G in component_parts) - reagents.maximum_volume += G.volume - G.reagents.trans_to(src, G.reagents.total_volume) - var/T=1.2 - for(var/obj/item/stock_parts/manipulator/M in component_parts) - T -= M.rating*0.2 - prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 + for(var/obj/item/reagent_containers/glass/our_beaker in component_parts) + reagents.maximum_volume += our_beaker.volume + our_beaker.reagents.trans_to(src, our_beaker.reagents.total_volume) + production_coefficient = 1.2 + for(var/obj/item/stock_parts/manipulator/our_manipulator in component_parts) + production_coefficient -= our_manipulator.rating * 0.2 + production_coefficient = clamp(production_coefficient, 0, 1) // coefficient goes from 1 -> 0.8 -> 0.6 -> 0.4 /obj/machinery/limbgrower/examine(mob/user) . = ..() + if(!panel_open) + . += "It looks like as if the panel were open you could rotate it with a wrench." + else + . += "The panel is open." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
Synthflesh consumption at [prod_coeff*100]%." + . += "The status display reads: Storing up to [reagents.maximum_volume]u of reagents.
Reagent consumption rate at [production_coefficient * 100]%.
" -/obj/machinery/limbgrower/proc/main_win(mob/user) - var/dat = "

[src] Menu:


" - dat += "[dna_disk ? "Remove" : "Insert"] cloning data disk" - dat += "
" - dat += "Chemical Storage" - dat += materials_printout() - dat += "" - - for(var/C in categories) - dat += "" - dat += "" - //one category per line - - dat += "
[C]
" - return dat - -/obj/machinery/limbgrower/proc/category_win(mob/user,selected_category) - var/dat = "Return to main menu" - dat += "

Browsing [selected_category]:


" - dat += materials_printout() - - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - if(!(selected_category in D.category)) - continue - if(disabled || !can_build(D)) - dat += "[D.name]" - else - dat += "[D.name]" - dat += "[get_design_cost(D)]
" - - dat += "
" - return dat - - -/obj/machinery/limbgrower/proc/chemical_win(mob/user) - var/dat = "Return to main menu" - dat += "

Browsing Chemical Storage:


" - dat += materials_printout() - - for(var/datum/reagent/R in reagents.reagent_list) - dat += "[R.name]: [R.volume]" - dat += "Purge
" - - dat += "
" - return dat - -/obj/machinery/limbgrower/proc/materials_printout() - var/dat = "Total amount:> [reagents.total_volume] / [reagents.maximum_volume] cm3
" - return dat - -/obj/machinery/limbgrower/proc/can_build(datum/design/D) - return (reagents.has_reagent(/datum/reagent/medicine/synthflesh, D.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff)) //Return whether the machine has enough synthflesh to produce the design - -/obj/machinery/limbgrower/proc/get_design_cost(datum/design/D) - var/dat - if(D.reagents_list[/datum/reagent/medicine/synthflesh]) - dat += "[D.reagents_list[/datum/reagent/medicine/synthflesh] * prod_coeff] Synthetic flesh " - return dat +/* + * Checks our reagent list to see if a design can be built. + * + * limb_design - the design we're checking for buildability. + * + * returns TRUE if we have enough reagent to build it. Returns FALSE if we do not. + */ +/obj/machinery/limbgrower/proc/can_build(datum/design/limb_design) + for(var/datum/reagent/reagent_id in limb_design.reagents_list) + if(!reagents.has_reagent(reagent_id, limb_design.reagents_list[reagent_id] * production_coefficient)) + return FALSE + return TRUE +/// Emagging a limbgrower allows you to build synthetic armblades. /obj/machinery/limbgrower/emag_act(mob/user) . = ..() if(obj_flags & EMAGGED) return - for(var/id in SSresearch.techweb_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(id) - if((D.build_type & LIMBGROWER) && ("emagged" in D.category)) - stored_research.add_design(D) + for(var/design_id in SSresearch.techweb_designs) + var/datum/design/found_design = SSresearch.techweb_design_by_id(design_id) + if((found_design.build_type & LIMBGROWER) && ("emagged" in found_design.category)) + stored_research.add_design(found_design) to_chat(user, "A warning flashes onto the screen, stating that safety overrides have been deactivated!") obj_flags |= EMAGGED - return TRUE + update_static_data(user) /obj/machinery/limbgrower/AltClick(mob/living/user) . = ..() + eject_disk(user) + +/obj/machinery/limbgrower/proc/eject_disk(mob/user) if(istype(user) && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) if(busy) to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.") @@ -326,6 +364,7 @@ dna_disk.forceMove(src.loc) user.put_in_active_hand(dna_disk) to_chat(user, "You remove \the [dna_disk] from \the [src].") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) dna_disk = null else to_chat(user, "\The [src] has doesn't have a disk on it!") diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index bb566f4d87..fe4ab20617 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -50,6 +50,10 @@ /obj/effect/decal/cleanable/glass/ex_act() qdel(src) +/obj/effect/decal/cleanable/glass/wave_ex_act(power, datum/wave_explosion/explosion, dir) + qdel(src) + return power + /obj/effect/decal/cleanable/glass/plasma icon_state = "plasmatiny" @@ -131,6 +135,9 @@ /obj/effect/decal/cleanable/greenglow/ex_act() return +/obj/effect/decal/cleanable/greenglow/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /obj/effect/decal/cleanable/cobweb name = "cobweb" desc = "Somebody should remove that." @@ -253,6 +260,11 @@ if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion. qdel(src) +/obj/effect/decal/cleanable/shreds/wave_ex_act(power, datum/wave_explosion/explosion, dir) + if(power > EXPLOSION_POWER_ERASE_SHREDS) + qdel(src) + return power // no block + /obj/effect/decal/cleanable/shreds/Initialize() pixel_x = rand(-10, 10) pixel_y = rand(-10, 10) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 640675bea5..bb8cad4fbc 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -309,6 +309,10 @@ /obj/structure/foamedmetal/resin/Initialize() . = ..() + neutralize_air() + addtimer(CALLBACK(src, .proc/neutralize_air), 5) // yeah this sucks, maybe when auxmos is out + +/obj/structure/foamedmetal/resin/proc/neutralize_air() if(isopenturf(loc)) var/turf/open/O = loc O.ClearWet() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 5dd9b9928c..cbfd5ef5a0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -248,6 +248,14 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb loc = null loc = T +/obj/item/wave_ex_act(power, datum/wave_explosion/explosion, dir) + . = ..() + if(!anchored) + var/throw_dist = round(rand(3, max(3, 2.5 * sqrt(power))), 1) + throw_speed = EXPLOSION_THROW_SPEED + var/turf/target = get_ranged_target_turf(src, dir, throw_dist) + throw_at(target, throw_dist, EXPLOSION_THROW_SPEED) + /obj/item/examine(mob/user) //This might be spammy. Remove? . = ..() diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index b28de437ed..8edd1c2a76 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -157,7 +157,7 @@ to_chat(user, "You need to get closer!") return if(use_paint(user) && isturf(F)) - F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, turn(stored_dir, -dir2angle(F.dir)), CLEAN_STRONG, color, null, null, alpha) + F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_STRONG, color, null, null, alpha) /obj/item/airlock_painter/decal/attack_self(mob/user) if((ink) && (ink.charges >= 1)) @@ -180,6 +180,11 @@ stored_decal_total = "[stored_decal][yellow_fix][stored_color]" return +/obj/item/airlock_painter/decal/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/decals) + ) + /obj/item/airlock_painter/decal/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -189,6 +194,7 @@ /obj/item/airlock_painter/decal/ui_data(mob/user) var/list/data = list() data["decal_direction"] = stored_dir + data["decal_dir_text"] = dir2text(stored_dir) data["decal_color"] = stored_color data["decal_style"] = stored_decal data["decal_list"] = list() diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 7d2b0ed832..df7d6467f0 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -553,6 +553,9 @@ /obj/item/card/id/syndicate/locked_banking bank_support = ID_LOCKED_BANK_ACCOUNT +/obj/item/card/id/pirate + access = list(ACCESS_SYNDICATE) + /obj/item/card/id/captains_spare name = "captain's spare ID" desc = "The spare ID of the High Lord himself." diff --git a/code/game/objects/items/chromosome.dm b/code/game/objects/items/chromosome.dm index 3acf3cfe5c..f5b693879b 100644 --- a/code/game/objects/items/chromosome.dm +++ b/code/game/objects/items/chromosome.dm @@ -75,18 +75,3 @@ desc = "A chromosome that reduces action based mutation cooldowns by by 50%." icon_state = "energy" energy_coeff = 0.5 - -/obj/item/chromosome/reinforcer - name = "reinforcement chromosome" - desc = "A chromosome that renders mutations immune to mutadone." - icon_state = "reinforcer" - weight = 3 - -/obj/item/chromosome/reinforcer/can_apply(datum/mutation/human/HM) - if(!HM || !(HM.can_chromosome == CHROMOSOME_NONE)) - return FALSE - return !HM.mutadone_proof - -/obj/item/chromosome/reinforcer/apply(datum/mutation/human/HM) - HM.mutadone_proof = TRUE - ..() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index e584cad9e8..aa48930d6c 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -649,6 +649,9 @@ pre_noise = TRUE post_noise = FALSE + var/stun_delay = 0 // how long it takes for you to be able to stun someone with the spraycan again + var/last_stun_time = 0 + /obj/item/toy/crayon/spraycan/isValidSurface(surface) return (istype(surface, /turf/open/floor) || istype(surface, /turf/closed/wall)) @@ -716,7 +719,8 @@ if(C.client) C.blur_eyes(3) C.blind_eyes(1) - if(C.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS. + if(C.get_eye_protection() <= 0 && (last_stun_time + stun_delay) <= world.time) // no eye protection? ARGH IT BURNS. + last_stun_time = world.time C.confused = max(C.confused, 3) C.DefaultCombatKnockdown(60) if(ishuman(C) && actually_paints) @@ -771,6 +775,7 @@ name = "cyborg spraycan" desc = "A metallic container containing shiny synthesised paint." charges = -1 + stun_delay = 5 SECONDS /obj/item/toy/crayon/spraycan/borg/draw_on(atom/target,mob/user,proximity, params) var/diff = ..() diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 7f2fe6a01d..2e7cef2c9f 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -100,6 +100,42 @@ "[user] is slitting [user.p_their()] stomach open with the [src.name]! It looks like [user.p_theyre()] trying to commit seppuku.")) return (BRUTELOSS) +/obj/item/kitchen/efink + name = "E-Fink" + icon_state = "efink" + desc = "The E-Fink is a product by Mending Solutions Inc. Unfortunately it can only mend sliced meat, fruits and dough back to their original state. Unbutchering is not possible." + flags_1 = CONDUCT_1 + force = 10 + w_class = WEIGHT_CLASS_SMALL + throwforce = 10 + hitsound = 'sound/weapons/bladesliceb.ogg' + throw_speed = 3 + throw_range = 6 + custom_materials = list(/datum/material/iron=12000) + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + sharpness = SHARP_POINTY + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + var/bayonet = FALSE //Can this be attached to a gun? + wound_bonus = -5 + bare_wound_bonus = 10 + custom_price = PRICE_NORMAL + +/obj/item/kitchen/efink/Initialize() + . = ..() + AddComponent(/datum/component/butchering, 80 - force, 100, force - 10) //bonus chance increases depending on force + +/obj/item/kitchen/efink/attack(mob/living/carbon/M, mob/living/carbon/user) + if(user.zone_selected == BODY_ZONE_PRECISE_EYES) + return eyestab(M,user) + else + return ..() + +/obj/item/kitchen/efink/suicide_act(mob/user) + user.visible_message(pick("[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.", \ + "[user] is slitting [user.p_their()] throat with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.", \ + "[user] is slitting [user.p_their()] stomach open with the [src.name]! It looks like [user.p_theyre()] trying to commit seppuku.")) + return (BRUTELOSS) + /obj/item/kitchen/knife/ritual name = "ritual knife" desc = "The unearthly energies that once powered this blade are now dormant." @@ -248,6 +284,24 @@ /obj/item/kitchen/rollingpin/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins flattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS + +/obj/item/kitchen/unrollingpin + name = "unrolling pin" + desc = "For when you accidentally flattened something." + icon_state = "unrolling_pin" + force = 8 + throwforce = 5 + throw_speed = 3 + throw_range = 7 + w_class = WEIGHT_CLASS_NORMAL + custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 1.5) + attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") + custom_price = PRICE_ALMOST_CHEAP + +/obj/item/kitchen/unrollingpin/suicide_act(mob/living/carbon/user) + user.visible_message("[user] begins unflattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") + return BRUTELOSS + /* Trays moved to /obj/item/storage/bag */ /obj/item/kitchen/knife/scimitar diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 224c4ffb9b..80466832a6 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -135,8 +135,8 @@ /obj/item/organ/cyberimp/arm/toolset, /obj/item/organ/cyberimp/arm/surgery, /obj/item/organ/cyberimp/chest/thrusters, - /obj/item/organ/lungs/cybernetic, - /obj/item/organ/liver/cybernetic) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof + /obj/item/organ/lungs/cybernetic/tier3, + /obj/item/organ/liver/cybernetic/tier3) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof for(var/V in templist) var/atom/A = V augment_list[initial(A.name)] = A diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 6e66f833c2..f888927411 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -383,7 +383,7 @@ . = ..() /obj/item/stack/medical/mesh/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - if(!is_open & user.get_inactive_held_item() == src) + if(!is_open && (user.get_inactive_held_item() == src)) to_chat(user, "You need to open [src] first.") return . = ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 3f84844743..ffcd15c39e 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -248,6 +248,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ null, \ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \ new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \ + new/datum/stack_recipe("unrolling pin", /obj/item/kitchen/unrollingpin, 2, time = 30), \ new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \ new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\ new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index e73097bf18..f68084d63a 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -367,7 +367,7 @@ /obj/item/storage/fancy/cigarettes/derringer/AltClick(mob/living/carbon/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return - var/obj/item/W = (locate(/obj/item/ammo_casing/a357) in contents) || (locate(/obj/item/clothing/mask/cigarette) in contents) || locate(/obj/item/ammo_casing/g4570) //Easy access smokes and bullets + var/obj/item/W = (locate(/obj/item/ammo_casing/a357) in contents) || (locate(/obj/item/clothing/mask/cigarette) in contents) ||(locate(/obj/item/gun/ballistic/derringer) in contents) || (locate(/obj/item/ammo_casing/c38) in contents) || locate(/obj/item/ammo_casing/g4570) in contents//Easy access smokes and bullets if(W && contents.len > 0) SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user) user.put_in_hands(W) @@ -382,6 +382,7 @@ new /obj/item/ammo_casing/a357(src) new /obj/item/ammo_casing/a357(src) new /obj/item/ammo_casing/a357(src) + new /obj/item/ammo_casing/a357(src) new /obj/item/clothing/mask/cigarette/syndicate(src) //For traitors with luck/class @@ -404,6 +405,7 @@ new /obj/item/ammo_casing/g4570(src) new /obj/item/ammo_casing/g4570(src) new /obj/item/ammo_casing/g4570(src) + new /obj/item/ammo_casing/g4570(src) new /obj/item/clothing/mask/cigarette/xeno(src) //For Cargomen, looking for a good deal on arms, with no quarrels as to where they're from. @@ -419,6 +421,7 @@ new /obj/item/ammo_casing/c38/lethal(src) new /obj/item/ammo_casing/c38/lethal(src) new /obj/item/ammo_casing/c38/lethal(src) + new /obj/item/ammo_casing/c38/lethal(src) new /obj/item/clothing/mask/cigarette/shadyjims (src) ///////////// //CIGAR BOX// diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 73a21e4a25..02f2009667 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -71,6 +71,19 @@ if(3) take_damage(rand(10, 90), BRUTE, "bomb", 0) +/obj/wave_ex_act(power, datum/wave_explosion/explosion, dir) + if(resistance_flags & INDESTRUCTIBLE) + return power + . = ..() + if(explosion.source == src) + obj_integrity = 0 + qdel(src) + return + take_damage(wave_explosion_damage(power, explosion), BRUTE, "bomb", 0) + +/obj/proc/wave_explosion_damage(power, datum/wave_explosion/explosion) + return (explosion_flags & EXPLOSION_FLAG_HARD_OBSTACLE)? EXPLOSION_POWER_STANDARD_SCALE_HARD_OBSTACLE_DAMAGE(power, explosion.hard_obstacle_mod) : EXPLOSION_POWER_STANDARD_SCALE_OBJECT_DAMAGE(power, explosion.object_damage_mod) + /obj/bullet_act(obj/item/projectile/P) . = ..() playsound(src, P.hitsound, 50, 1) diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index eb652c5180..f63f3afbd9 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -56,6 +56,11 @@ name = "gear crate" icon_state = "secgearcrate" +/obj/structure/closet/crate/secure/soviet + desc = "A crate, purportedly from Space Russia." + name = "soviet crate" + icon_state = "sovietcrate" + /obj/structure/closet/crate/secure/hydroponics desc = "A crate with a lock on it, painted in the scheme of the station's botanists." name = "secure hydroponics crate" diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index 9032a80d91..7d13af1e3e 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -73,3 +73,15 @@ name = "wumborian fugu den" desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?" mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu) + +/obj/structure/spawner/clown + name = "Laughing Larry" + desc = "A laughing, jovial figure. Something seems stuck in his throat." + icon_state = "clownbeacon" + icon = 'icons/obj/device.dmi' + max_integrity = 200 + max_mobs = 15 + spawn_time = 150 + mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob) + spawn_text = "climbs out of" + faction = list("clown") diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index fba79ac2b0..6356424aaf 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -127,7 +127,7 @@ to_chat(user, "Throwing [pushed_mob] onto the table might hurt them!") return var/added_passtable = FALSE - if(!pushed_mob.pass_flags & PASSTABLE) + if(!(pushed_mob.pass_flags & PASSTABLE)) added_passtable = TRUE pushed_mob.pass_flags |= PASSTABLE pushed_mob.Move(src.loc) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 53bcd28fa1..e40e158895 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -43,6 +43,10 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) attack_hand_speed = CLICK_CD_MELEE attack_hand_is_action = TRUE + explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE + wave_explosion_block = EXPLOSION_BLOCK_WINDOW + wave_explosion_multiply = EXPLOSION_DAMPEN_WINDOW + /// Electrochromatic status var/electrochromatic_status = NOT_ELECTROCHROMATIC /// Electrochromatic ID. Set the first character to ! to replace with a SSmapping generated pseudorandom obfuscated ID for mapping purposes. @@ -111,6 +115,9 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) return TRUE return FALSE +/obj/structure/window/wave_explosion_damage(power, datum/wave_explosion/explosion) + return EXPLOSION_POWER_STANDARD_SCALE_WINDOW_DAMAGE(power, explosion.window_shatter_mod) + /obj/structure/window/narsie_act() add_atom_colour(NARSIE_WINDOW_COLOUR, FIXED_COLOUR_PRIORITY) @@ -520,6 +527,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) max_integrity = 50 explosion_block = 1 + wave_explosion_block = EXPLOSION_BLOCK_REINFORCED_WINDOW + wave_explosion_multiply = EXPLOSION_DAMPEN_REINFORCED_WINDOW glass_type = /obj/item/stack/sheet/rglass rad_insulation = RAD_HEAVY_INSULATION ricochet_chance_mod = 0.8 @@ -545,6 +554,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100) max_integrity = 150 explosion_block = 1 + wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW + wave_explosion_multiply = EXPLOSION_DAMPEN_BOROSILICATE_WINDOW glass_type = /obj/item/stack/sheet/plasmaglass cleanable_type = /obj/effect/decal/cleanable/glass/plasma rad_insulation = RAD_NO_INSULATION @@ -570,6 +581,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100) max_integrity = 500 explosion_block = 2 + wave_explosion_block = EXPLOSION_BLOCK_EXTREME + wave_explosion_multiply = EXPLOSION_BLOCK_EXTREME glass_type = /obj/item/stack/sheet/plasmarglass /obj/structure/window/plasma/reinforced/spawner/east @@ -742,6 +755,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) max_integrity = 80 armor = list("melee" = 60, "bullet" = 25, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) explosion_block = 2 //fancy AND hard to destroy. the most useful combination. + wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW + wave_explosion_multiply = EXPLOSION_DAMPEN_BOROSILICATE_WINDOW decon_speed = 40 glass_type = /obj/item/stack/tile/brass glass_amount = 1 diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 9c6dbf1912..46d0bd9486 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -6,6 +6,8 @@ blocks_air = 1 rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_insulation = RAD_MEDIUM_INSULATION + wave_explosion_block = 10 + wave_explosion_multiply = 0.75 /// How much we block yelling var/yelling_resistance = 40 @@ -30,6 +32,7 @@ name = "wall" icon = 'icons/turf/walls.dmi' explosion_block = 50 + wave_explosion_block = INFINITY /turf/closed/indestructible/rust_heretic_act() return diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 565d5640e3..e5034e4b2f 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -12,6 +12,19 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY + /// Minimum explosion power to break tile + var/explosion_power_break_tile = EXPLOSION_POWER_FLOOR_TILE_BREAK + /// Minimum explosion power to break turf + var/explosion_power_break_turf = EXPLOSION_POWER_FLOOR_TURF_BREAK + //// Minimum explosion power to scrape away the floor + var/explosion_power_turf_scrape = EXPLOSION_POWER_FLOOR_TURF_SCRAPE + //// Shielded turfs are completely protected from anything under this + var/explosion_power_protect_shielded = EXPLOSION_POWER_FLOOR_SHIELDED_IMMUNITY + /// Starting from here, there's a chance for this to break + var/explosion_power_minimum_chance_break = EXPLOSION_POWER_FLOOR_MINIMUM_TURF_BREAK + /// Starting from here, +20% chance to break turf. + var/explosion_power_break_turf_bonus = EXPLOSION_POWER_FLOOR_TURF_BREAK_BONUS + var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default var/icon_plating = "plating" thermal_conductivity = 0.004 @@ -98,6 +111,48 @@ src.break_tile() src.hotspot_expose(1000,CELL_VOLUME) +/turf/open/floor/wave_ex_act(power, datum/wave_explosion/explosion, dir) + var/shielded = is_shielded() + . = ..() + if(shielded) + if(power < explosion_power_protect_shielded) + return + else + power -= explosion_power_protect_shielded + hotspot_expose(1000, CELL_VOLUME) + if(power < explosion_power_break_tile) + return + if(power < explosion_power_minimum_chance_break) + if(prob(33 + ((explosion_power_break_turf - power) / (explosion_power_break_turf - explosion_power_break_tile)))) + break_tile() + return + if((power < explosion_power_turf_scrape) && ((power >= explosion_power_break_turf) || prob((1 - ((explosion_power_break_turf - power) / (explosion_power_break_turf - explosion_power_minimum_chance_break))) * 100 + ((power > explosion_power_break_turf_bonus)? 20 : 0)))) + switch(pick(1, 2;75, 3)) + if(1) + if(!length(baseturfs) || !ispath(baseturfs[baseturfs.len-1], /turf/open/floor)) + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + ReplaceWithLattice() + else + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) + if(prob(33)) + new /obj/item/stack/sheet/metal(src) + return + if(2) + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) + return + if(3) + if(prob(80)) + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + return + else + break_tile() + hotspot_expose(1000,CELL_VOLUME) + if(prob(33)) + new /obj/item/stack/sheet/metal(src) + if(power >= explosion_power_turf_scrape) + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) + return + /turf/open/floor/is_shielded() for(var/obj/structure/A in contents) if(A.level == 3) diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 03d5cecc26..620c9adfc8 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -12,6 +12,11 @@ sheet_amount = 1 girder_type = /obj/structure/girder/reinforced explosion_block = 2 + wave_explosion_block = EXPLOSION_BLOCK_BLAST_PROOF + wave_explosion_multiply = EXPLOSION_DAMPEN_BLAST_PROOF + explosion_power_to_scrape = EXPLOSION_POWER_RWALL_SCRAPE + explosion_power_to_dismantle = EXPLOSION_POWER_RWALL_DISMANTLE + explosion_power_minimum_chance_dismantle = EXPLOSION_POWER_RWALL_MINIMUM_DISMANTLE rad_insulation = RAD_HEAVY_INSULATION /turf/closed/wall/r_wall/deconstruction_hints(mob/user) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 79ca5add10..76dc6533b6 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -6,6 +6,8 @@ icon = 'icons/turf/walls/wall.dmi' icon_state = "wall" explosion_block = 1 + wave_explosion_block = EXPLOSION_BLOCK_WALL + wave_explosion_multiply = EXPLOSION_DAMPEN_WALL flags_1 = DEFAULT_RICOCHET_1 flags_ricochet = RICOCHET_HARD thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT @@ -15,6 +17,14 @@ baseturfs = /turf/open/floor/plating + explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE + /// Explosion power to disintegrate the wall + var/explosion_power_to_scrape = EXPLOSION_POWER_WALL_SCRAPE + /// Explosion power to dismantle the wall + var/explosion_power_to_dismantle = EXPLOSION_POWER_WALL_DISMANTLE + /// Explosion power to potentially dismantle the wall + var/explosion_power_minimum_chance_dismantle = EXPLOSION_POWER_WALL_MINIMUM_DISMANTLE + var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through. var/slicing_duration = 100 //default time taken to slice the wall var/sheet_type = /obj/item/stack/sheet/metal @@ -91,6 +101,13 @@ if(!density) ..() +/turf/closed/wall/wave_ex_act(power, datum/wave_explosion/explosion, dir) + . = ..() + var/resultant_power = power * explosion.wall_destroy_mod + if(resultant_power >= explosion_power_to_scrape) + ScrapeAway() + else if((resultant_power >= explosion_power_to_dismantle) || ((resultant_power >= explosion_power_minimum_chance_dismantle) && prob(((resultant_power - explosion_power_minimum_chance_dismantle) / (explosion_power_to_dismantle - explosion_power_minimum_chance_dismantle)) * 100))) + dismantle_wall(prob((resultant_power - explosion_power_to_dismantle)/(explosion_power_to_scrape - explosion_power_to_dismantle)), TRUE) /turf/closed/wall/blob_act(obj/structure/blob/B) if(prob(50)) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 0905fb2e9c..b1a4efc97e 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -8,6 +8,8 @@ temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT heat_capacity = 700000 + wave_explosion_multiply = EXPLOSION_DAMPEN_SPACE + wave_explosion_block = EXPLOSION_BLOCK_SPACE var/destination_z var/destination_x diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 7e61364e2a..29b2db20ba 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -462,6 +462,24 @@ GLOBAL_LIST_EMPTY(station_turfs) A.ex_act(severity, target) CHECK_TICK +/turf/wave_ex_act(power, datum/wave_explosion/explosion, dir) + . = ..() + var/affecting_level + if(is_shielded()) + affecting_level = 3 + else if(intact) + affecting_level = 2 + else + affecting_level = 1 + var/atom/A + for(var/i in contents) + if(. <= 0) + return 0 + A = i + if(!QDELETED(A) && A.level >= affecting_level) + . = A.wave_explode(., explosion, dir) + maptext = "[.]" + /turf/narsie_act(force, ignore_mobs, probability = 20) . = (prob(probability) || force) for(var/I in src) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 96eb4e4a0f..9e784e72cb 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -96,6 +96,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/cmd_select_equipment, /client/proc/cmd_admin_gib_self, /client/proc/drop_bomb, + /client/proc/drop_wave_explosion, /client/proc/set_dynex_scale, /client/proc/drop_dynex_bomb, /client/proc/cinematic, @@ -550,6 +551,51 @@ GLOBAL_PROTECT(admin_verbs_hideable) log_admin("[key_name(usr)] created an admin explosion at [epicenter.loc].") SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/drop_wave_explosion() + set category = "Special Verbs" + set name = "Drop Wave Explosion" + set desc = "Cause an explosive shockwave at your location." + + var/power = input(src, "Wave initial power", "Power", 50) as num|null + if(isnull(power)) + return + var/falloff = input(src, "Wave innate falloff factor", "Falloff", EXPLOSION_DEFAULT_FALLOFF_MULTIPLY) as num|null + if(isnull(falloff)) + return + falloff = max(0, falloff) + if(falloff > 1) + to_chat(src, "Aborting: Falloff cannot be higher tahn 1.") + return + var/constant = input(src, "Wave innate falloff constant", "Constant", EXPLOSION_DEFAULT_FALLOFF_SUBTRACT) as num|null + if(isnull(constant)) + return + if(constant < 0) + to_chat(src, "Aborting: Falloff constant cannot be less than 0.") + return + var/fire = input(src, "Probability per tile of fire?", "Fire Probability", 0) as num|null + if(isnull(fire)) + return + var/speed = input(src, "Speed in ticks to wait between cycles? 0 for fast as possible", "Wait", 0) as num|null + if(isnull(speed)) + return + var/block_resistance = input(src, "DANGEROUS: Block resistance? USE 1 IF YOU DO NOT KNOW WHAT YOU ARE DOING.", "Block Negation", 1) as num|null + if(isnull(block_resistance)) + return + block_resistance = max(0, block_resistance) + if(power > 500) + var/sure = alert(src, "Explosion power is extremely high. Are you absolutely sure?", "Uhh...", "No", "Yes") + if(sure != "Yes") + return + // point of no return + var/turf/target = get_turf(mob) + if(!target) + to_chat(src, "Cannot proceed. Not on turf.") + return + message_admins("[ADMIN_LOOKUPFLW(usr)] creating an admin explosion at [target.loc].") + log_admin("[key_name(usr)] created an admin explosion at [target.loc].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Wave Explosion") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + wave_explosion(target, power, falloff, constant, null, fire, speed = speed, block_resistance = block_resistance) + /client/proc/drop_dynex_bomb() set category = "Admin.Fun" set name = "Drop DynEx Bomb" diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm index 84071d76f4..2d1aa63a91 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -104,7 +104,7 @@ GLOBAL_VAR(antag_prototypes) var/datum/component/activity/activity = current.GetComponent(/datum/component/activity) if(activity) out += "Activity level: [activity.activity_level]
" - out += "Hasn't changed areas in approximately [activity.not_moved_counter] seconds" + out += "Hasn't changed areas in approximately [activity.not_moved_counter] seconds
" var/special_statuses = get_special_statuses() if(length(special_statuses)) diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 0679d9ffac..9a74b63040 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -41,7 +41,6 @@ H.dna.features["horns"] = pick(GLOB.horns_list) H.dna.features["frills"] = pick(GLOB.frills_list) H.dna.features["spines"] = pick(GLOB.spines_list) - H.dna.features["body_markings"] = pick(GLOB.body_markings_list) H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list) H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list) H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm index 4f518b7f8e..ca07f9a50b 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm @@ -238,3 +238,9 @@ /proc/__nan() var/list/L = json_decode("{\"value\":NaN}") return L["value"] + +/** + * Wrapper to return a copy of contents, as SDQL2 can't tell an internal list from a normal list. + */ +/atom/proc/_contents() + return contents.Copy() diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 7e7bac9ff0..59eee83b35 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -571,6 +571,26 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(src)] has created a command report") SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/cmd_admin_make_priority_announcement() + set category = "Admin.Events" + set name = "Make Priority Announcement" + + if(!check_rights(R_ADMIN)) + return + + var/input = input(usr, "Enter a priority announcement. Ensure it makes sense IC.", "What?", "") as message|null + if(!input) + return + + var/title = input(src, "What should the title be?", "What?","") as text|null + + var/special_name = input(src, "Who is making the announcement?", "Who?", "") as text|null + priority_announce(input, title, sender_override = special_name) + + log_admin("[key_name(src)] has sent a priority announcement: [input]") + message_admins("[key_name_admin(src)] has made a priority announcement") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Priority Announcement") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/proc/cmd_change_command_name() set category = "Admin.Events" set name = "Change Command Name" diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 93b2e20271..b92b659183 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -111,7 +111,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/datum/skill_modifier/job/M = GLOB.skill_modifiers[GET_SKILL_MOD_ID(A, type)] if(istype(M)) M.name = "[name] Training" - owner.AddComponent(/datum/component/activity) + owner.current.AddComponent(/datum/component/activity) SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src) /datum/antagonist/proc/is_banned(mob/M) @@ -164,14 +164,12 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/remove_blacklisted_quirks() var/mob/living/L = owner.current if(istype(L)) - var/list/my_quirks = L.client?.prefs.all_quirks.Copy() - SSquirks.filter_quirks(my_quirks,blacklisted_quirks) for(var/q in L.roundstart_quirks) var/datum/quirk/Q = q - if(!(SSquirks.quirk_name_by_path(Q.type) in my_quirks)) + if(Q.type in blacklisted_quirks) if(initial(Q.antag_removal_text)) to_chat(L, "[initial(Q.antag_removal_text)]") - L.remove_quirk(Q.type) + qdel(Q) //Returns the team antagonist belongs to if any. /datum/antagonist/proc/get_team() diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 0d1496039a..ec6bb2c928 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -680,6 +680,11 @@ glove_type = /obj/item/clothing/gloves/fingerless/pugilist/cling // just punch his head off dude glove_name_simple = "bone gauntlets" +/obj/effect/proc_holder/changeling/gloves/gauntlets/sting_action(mob/living/user) + if(HAS_TRAIT(user, TRAIT_NOPUGILIST)) + to_chat(user, "We would gain nothing by forming our fists into brute-force weapons when we are trained in precision martial arts!") + return + /obj/item/clothing/gloves/fingerless/pugilist/cling // switches between lesser GotNS and Big Punchy Rib Breaky Hands name = "hewn bone gauntlets" icon_state = "ling_gauntlets" diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index f1ce13a90f..e8ae133ede 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -115,7 +115,7 @@ skewee.visible_message("[skewee] painfully slides back down [src].") if(skewee.stat >= UNCONSCIOUS) return //by ratvar, no more spamming my deadchat, holy fuck - skewee.say("Oof, ouch owwie!!", forced = "fail brass skewer removal") + skewee.emote("pain") return skewee.visible_message("[skewee] comes free of [src] with a squelching pop!", \ "You come free of [src]!") diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index 0dd9cf6bea..86ef2afacb 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -62,13 +62,24 @@ /datum/action/innate/heretic_shatter/IsAvailable() if(IS_HERETIC(holder) || IS_HERETIC_MONSTER(holder)) - return TRUE + return ..() else return FALSE /datum/action/innate/heretic_shatter/Activate() if(do_after(holder,10, target = holder)) - var/turf/safe_turf = find_safe_turf(zlevels = sword.z, extended_safety_checks = TRUE) + if(!sword || QDELETED(sword)) + return + if(!IsAvailable()) //Never trust the user. + return + var/swordz = (get_turf(sword))?.z //SHOULD usually have a turf but if it doesn't better be prepared. + if(!swordz) + to_chat(holder, "[sword] flickers but remains in place, as do you...") + return + var/turf/safe_turf = find_safe_turf(zlevels = swordz, extended_safety_checks = TRUE) + if(!safe_turf) + to_chat(holder, "[sword] flickers but remains in place, as do you...") + return do_teleport(holder,safe_turf,forceMove = TRUE,channel=TELEPORT_CHANNEL_MAGIC) to_chat(holder,"You feel a gust of energy flow through your body... the Rusted Hills heard your call...") qdel(sword) @@ -218,8 +229,8 @@ flags_inv = NONE flags_cover = NONE desc = "Black like tar, doesn't reflect any light. Runic symbols line the outside, with each flash you lose comprehension of what you are seeing." - item_flags = EXAMINE_SKIP armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + obj_flags = NONE | EXAMINE_SKIP /obj/item/clothing/suit/hooded/cultrobes/void name = "void cloak" @@ -242,9 +253,10 @@ //We need to account for the hood shenanigans, and that way we can make sure items always fit, even if one of the slots is used by the fucking hood. if(suittoggled) to_chat(carbon_user,"The light shifts around you making the cloak invisible!") - else + obj_flags |= EXAMINE_SKIP + else if(obj_flags & EXAMINE_SKIP) // ensures that it won't toggle visibility if raising the hood failed to_chat(carbon_user,"The kaleidoscope of colours collapses around you, as the cloak shifts to visibility!") - item_flags = suittoggled ? EXAMINE_SKIP : ~EXAMINE_SKIP + obj_flags ^= EXAMINE_SKIP else to_chat(carbon_user,"You can't force the hood onto your head!") diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index 4aeb2e1b73..4d6576ee92 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -50,7 +50,7 @@ /obj/item/melee/touch_attack/mansus_fist/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!proximity_flag | target == user) + if(!proximity_flag || (target == user)) return playsound(user, 'sound/items/welder.ogg', 75, TRUE) if(ishuman(target)) diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm index 8184beb3aa..aa927ffcfc 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm @@ -24,7 +24,7 @@ var/check = FALSE if(ismob(target)) var/mob/living/mobster = target - if(!mobster.mob_biotypes & MOB_ROBOTIC) + if(!(mobster.mob_biotypes & MOB_ROBOTIC)) return FALSE else check = TRUE diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 7d669e5c41..eb98635e65 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -633,7 +633,7 @@ This is here to make the tiles around the station mininuke change when it's arme AddComponent(/datum/component/stationloving, !fake) /obj/item/disk/nuclear/process() - ++process_tick + process_tick++ if(fake) STOP_PROCESSING(SSobj, src) CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck") @@ -650,7 +650,7 @@ This is here to make the tiles around the station mininuke change when it's arme disk_comfort_level++ if(disk_comfort_level >= 2) //Sleep tight, disky. - if(process_tick % 30) + if(!(process_tick % 30)) visible_message("[src] sleeps soundly. Sleep tight, disky.") if(last_disk_move < world.time - 5000 && prob((world.time - 5000 - last_disk_move)*0.0001)) var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 7e4c5c5343..31989fe241 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -177,6 +177,9 @@ /mob/living/simple_animal/revenant/ex_act(severity, target) return 1 //Immune to the effects of explosions. +/mob/living/simple_animal/revenant/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /mob/living/simple_animal/revenant/blob_act(obj/structure/blob/B) return //blah blah blobs aren't in tune with the spirit world, or something. diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index a26d081f08..f616f2c848 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -84,6 +84,9 @@ if(slam_cooldown + slam_cooldown_time > world.time) to_chat(src, "Your slam ability is still on cooldown!") return + if(!isopenturf(loc)) + to_chat(src, "You need to be on open flooring to do that!") + return face_atom(A) var/mob/living/victim = A diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index e32fcee639..8eedd640a7 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -345,6 +345,14 @@ InsertAll("", each, GLOB.alldirs) ..() +/datum/asset/spritesheet/decals + name = "decals" + +/datum/asset/spritesheet/decals/register() + for(var/each in list('icons/turf/decals.dmi')) + InsertAll("", each, GLOB.alldirs) + ..() + /datum/asset/spritesheet/supplypods name = "supplypods" diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 4f057ca9be..f714a94646 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -44,7 +44,7 @@ return FALSE /turf/proc/ImmediateCalculateAdjacentTurfs() - var/canpass = CANATMOSPASS(src, src) + var/canpass = CANATMOSPASS(src, src) var/canvpass = CANVERTICALATMOSPASS(src, src) for(var/direction in GLOB.cardinals_multiz) var/turf/T = get_step_multiz(src, direction) @@ -79,31 +79,27 @@ if (atmos_adjacent_turfs) adjacent_turfs = atmos_adjacent_turfs.Copy() else - adjacent_turfs = list() + return list() // don't bother checking diagonals, diagonals are going to be cardinal checks anyways. if (!alldir) return adjacent_turfs - var/turf/curloc = src - - for (var/direction in GLOB.diagonals_multiz) - var/matchingDirections = 0 - var/turf/S = get_step_multiz(curloc, direction) - if(!S) + var/turf/other + var/turf/mid + for (var/d in GLOB.diagonals) + other = get_step(src, d) + if(!other) + continue + // NS step + mid = get_step(src, NSCOMPONENT(d)) + if((mid in adjacent_turfs) && (get_step(mid, EWCOMPONENT(d)) in adjacent_turfs)) + adjacent_turfs += other + continue + // EW step + mid = get_step(src, EWCOMPONENT(d)) + if((mid in adjacent_turfs) && (get_step(mid, NSCOMPONENT(d)) in adjacent_turfs)) + adjacent_turfs += other continue - - for (var/checkDirection in GLOB.cardinals_multiz) - var/turf/checkTurf = get_step(S, checkDirection) - if(!S.atmos_adjacent_turfs || !S.atmos_adjacent_turfs[checkTurf]) - continue - - if (adjacent_turfs[checkTurf]) - matchingDirections++ - - if (matchingDirections >= 2) - adjacent_turfs += S - break - return adjacent_turfs /atom/proc/air_update_turf(command = 0) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 5540cd7529..551c1c5536 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -4,10 +4,10 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation) GLOBAL_LIST_EMPTY(gateway_destinations) /** - * Corresponds to single entry in gateway control. - * - * Will NOT be added automatically to GLOB.gateway_destinations list. - */ + * Corresponds to single entry in gateway control. + * + * Will NOT be added automatically to GLOB.gateway_destinations list. + */ /datum/gateway_destination var/name = "Unknown Destination" var/wait = 0 /// How long after roundstart this destination becomes active @@ -85,7 +85,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) . = "Exit gateway unpowered." /datum/gateway_destination/gateway/get_target_turf() - return get_step(target_gateway.portal,SOUTH) + return get_step(target_gateway, SOUTH) /datum/gateway_destination/gateway/post_transfer(atom/movable/AM) . = ..() @@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) name = "gateway" desc = "A mysterious gateway built by unknown hands, it allows for faster than light travel to far-flung locations." icon = 'icons/obj/machines/gateway.dmi' - icon_state = "off" + icon_state = "portal_frame" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF // 3x2 offset by one row @@ -171,10 +171,16 @@ GLOBAL_LIST_EMPTY(gateway_destinations) var/datum/gateway_destination/target /// bumper object, the thing that starts actual teleport var/obj/effect/gateway_portal_bumper/portal + /// Visual object for handling the viscontents + /// DISABLED DUE TO BYOND BUG CAUSING STACK OVERFLOWS OF ANY HUMAN INSTANTIATION NEAR AN ACTIVATED GATEWAY. + /// Probably due to it referencing each other through the gateway (there's a deep loop, maybe BYOND isn't catching something when it usually would) + // var/obj/effect/gateway_portal_effect/portal_visuals /obj/machinery/gateway/Initialize() generate_destination() update_icon() + // portal_visuals = new + // vis_contents += portal_visuals return ..() /obj/machinery/gateway/proc/generate_destination() @@ -191,6 +197,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) if(use_power == ACTIVE_POWER_USE) use_power = IDLE_POWER_USE update_icon() + // portal_visuals.reset_visuals() /obj/machinery/gateway/process() if((stat & (NOPOWER)) && use_power) @@ -198,12 +205,6 @@ GLOBAL_LIST_EMPTY(gateway_destinations) deactivate() return -/obj/machinery/gateway/update_icon_state() - if(target) - icon_state = "on" - else - icon_state = "off" - /obj/machinery/gateway/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE) return @@ -216,6 +217,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) return target = D target.activate(destination) + // portal_visuals.setup_visuals(target) generate_bumper() use_power = ACTIVE_POWER_USE update_icon() @@ -307,7 +309,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) try_to_connect(D) return TRUE if("deactivate") - if(G && G.target) + if(G?.target) G.deactivate() return TRUE @@ -324,3 +326,39 @@ GLOBAL_LIST_EMPTY(gateway_destinations) /obj/item/paper/fluff/gateway info = "Congratulations,

Your station has been selected to carry out the Gateway Project.

The equipment will be shipped to you at the start of the next quarter.
You are to prepare a secure location to house the equipment as outlined in the attached documents.

--Nanotrasen Bluespace Research" name = "Confidential Correspondence, Pg 1" + +/obj/effect/gateway_portal_effect + appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + vis_flags = VIS_INHERIT_ID + layer = GATEWAY_UNDERLAY_LAYER //Slightly lower than gateway itself + var/alpha_icon = 'icons/obj/machines/gateway.dmi' + var/alpha_icon_state = "portal_mask" + var/datum/gateway_destination/our_destination + + +/obj/effect/gateway_portal_effect/proc/setup_visuals(datum/gateway_destination/D) + our_destination = D + update_portal_filters() + +/obj/effect/gateway_portal_effect/proc/reset_visuals() + our_destination = null + update_portal_filters() + +/obj/effect/gateway_portal_effect/proc/update_portal_filters() + clear_filters() + vis_contents = null + + if(!our_destination) + return + + + add_filter("portal_alpha", 1, list("type" = "alpha", "icon" = icon(alpha_icon, alpha_icon_state), "x" = 32, "y" = 32)) + add_filter("portal_blur", 1, list("type" = "blur", "size" = 0.5)) + add_filter("portal_ripple", 1, list("type" = "ripple", "size" = 2, "radius" = 1, "falloff" = 1, "y" = 7)) + + animate(get_filter("portal_ripple"), time = 1.3 SECONDS, loop = -1, easing = LINEAR_EASING, radius = 32) + + var/turf/center_turf = our_destination.get_target_turf() + + vis_contents += block(locate(center_turf.x - 1, center_turf.y - 1, center_turf.z), locate(center_turf.x + 1, center_turf.y + 1, center_turf.z)) diff --git a/code/modules/cargo/exports/organs_robotics.dm b/code/modules/cargo/exports/organs_robotics.dm index b65cf28949..08340e6a56 100644 --- a/code/modules/cargo/exports/organs_robotics.dm +++ b/code/modules/cargo/exports/organs_robotics.dm @@ -75,7 +75,7 @@ cost = 250 unit_name = "heart" export_types = list(/obj/item/organ/heart) - exclude_types = list(/obj/item/organ/heart/cursed, /obj/item/organ/heart/cybernetic) + exclude_types = list(/obj/item/organ/heart/cursed, /obj/item/organ/heart/cybernetic/tier2, /obj/item/organ/heart/cybernetic/tier3) /datum/export/organs/tongue cost = 75 @@ -92,29 +92,30 @@ cost = 50 //can be replaced unit_name = "stomach" export_types = list(/obj/item/organ/stomach) + exclude_types = list(/obj/item/organ/stomach/cybernetic/tier2, /obj/item/organ/stomach/cybernetic/tier3) /datum/export/organs/lungs cost = 150 unit_name = "lungs" - export_types = list(/obj/item/organ/lungs) - exclude_types = list(/obj/item/organ/lungs/cybernetic, /obj/item/organ/lungs/cybernetic/upgraded) + export_types = list(/obj/item/organ/lungs,) + exclude_types = list(/obj/item/organ/lungs/cybernetic/tier2, /obj/item/organ/lungs/cybernetic/tier3) /datum/export/organs/liver cost = 175 unit_name = "liver" export_types = list(/obj/item/organ/liver) - exclude_types = list(/obj/item/organ/liver/cybernetic, /obj/item/organ/liver/cybernetic/upgraded) + exclude_types = list(/obj/item/organ/liver/cybernetic/tier2, /obj/item/organ/liver/cybernetic/tier3) /datum/export/organs/cybernetic cost = 225 unit_name = "cybernetic organ" - export_types = list(/obj/item/organ/liver/cybernetic, /obj/item/organ/lungs/cybernetic, /obj/item/organ/eyes/robotic, /obj/item/organ/heart/cybernetic) - exclude_types = list(/obj/item/organ/lungs/cybernetic/upgraded, /obj/item/organ/liver/cybernetic/upgraded) + export_types = list(/obj/item/organ/liver/cybernetic/tier2, /obj/item/organ/lungs/cybernetic/tier2, /obj/item/organ/eyes/robotic/shield, /obj/item/organ/eyes/robotic/glow, /obj/item/organ/stomach/cybernetic/tier2, /obj/item/organ/heart/cybernetic/tier2) + exclude_types = list(/obj/item/organ/liver/cybernetic/tier3, /obj/item/organ/lungs/cybernetic/tier3, /obj/item/organ/eyes/robotic/xray, /obj/item/organ/eyes/robotic/thermals, /obj/item/organ/stomach/cybernetic/tier3, /obj/item/organ/heart/cybernetic/tier3) /datum/export/organs/upgraded cost = 275 unit_name = "upgraded cybernetic organ" - export_types = list(/obj/item/organ/lungs/cybernetic/upgraded, /obj/item/organ/liver/cybernetic/upgraded) + export_types = list(/obj/item/organ/liver/cybernetic/tier3, /obj/item/organ/lungs/cybernetic/tier3, /obj/item/organ/eyes/robotic/xray, /obj/item/organ/eyes/robotic/thermals, /obj/item/organ/stomach/cybernetic/tier3, /obj/item/organ/heart/cybernetic/tier3) /datum/export/organs/tail // yeah have fun pulling this off someone without catching a bwoink cost = 500 diff --git a/code/modules/cargo/packs/armory.dm b/code/modules/cargo/packs/armory.dm index bf79a3ed15..de3e657386 100644 --- a/code/modules/cargo/packs/armory.dm +++ b/code/modules/cargo/packs/armory.dm @@ -176,6 +176,7 @@ /obj/effect/spawner/bundle/crate/surplusrifle, /obj/item/storage/toolbox/ammo/surplus) crate_name = "surplus military crate" + crate_type = /obj/structure/closet/crate/secure/soviet /datum/supply_pack/security/armory/russian/fill(obj/structure/closet/crate/C) for(var/i in 1 to 5) @@ -239,7 +240,6 @@ desc = "Hey kid.. c'mere. Boss says we need to offload these, to any buyer, no questions asked. You pay us, we give you three of these guns, no strings attached. Locks are to ensure they get to PAYING customers." cost = 2000 contraband = TRUE - can_private_buy = TRUE contains = list(/obj/item/storage/fancy/cigarettes/derringer/smuggled, /obj/item/storage/fancy/cigarettes/derringer/smuggled, /obj/item/storage/fancy/cigarettes/derringer/smuggled, diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index cf9cc5e0d1..16554b61ab 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -80,15 +80,15 @@ /datum/supply_pack/security/russianclothing name = "Russian Surplus Clothing" - desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproff armor, a few union suits and some warm hats!" + desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproof armor, a few union suits and some warm hats!" contraband = TRUE cost = 5750 // Its basicly sec suits, good boots/gloves - contains = list(/obj/item/clothing/suit/armor/navyblue/russian, - /obj/item/clothing/suit/armor/navyblue/russian, + contains = list(/obj/item/clothing/under/syndicate/rus_army, + /obj/item/clothing/under/syndicate/rus_army, /obj/item/clothing/shoes/combat, /obj/item/clothing/shoes/combat, - /obj/item/clothing/head/ushanka, - /obj/item/clothing/head/ushanka, + /obj/item/clothing/head/helmet/rus_helmet, + /obj/item/clothing/head/helmet/rus_helmet, /obj/item/clothing/suit/armor/bulletproof, /obj/item/clothing/suit/armor/bulletproof, /obj/item/clothing/head/helmet/alt, @@ -98,23 +98,23 @@ /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas) crate_name = "surplus russian clothing" - crate_type = /obj/structure/closet/crate/internals + crate_type = /obj/structure/closet/crate/secure/soviet /datum/supply_pack/security/russian_partisan name = "Russian Partisan Gear" desc = "An old russian partisan equipment crate, comes with a full russian outfit, a loaded surplus rifle and a second magazine." contraband = TRUE - access = FALSE cost = 6500 contains = list(/obj/item/clothing/suit/armor/navyblue/russian, /obj/item/clothing/shoes/combat, - /obj/item/clothing/head/ushanka, + /obj/item/clothing/head/helmet/rus_helmet, /obj/item/clothing/suit/armor/bulletproof, /obj/item/clothing/head/helmet/alt, /obj/item/clothing/gloves/tackler/combat/insulated, + /obj/item/clothing/under/syndicate/rus_army, /obj/item/clothing/mask/gas) crate_name = "surplus russian gear" - crate_type = /obj/structure/closet/crate/internals + crate_type = /obj/structure/closet/crate/secure/soviet /datum/supply_pack/security/russian_partisan/fill(obj/structure/closet/crate/C) ..() @@ -241,7 +241,7 @@ access = FALSE access_any = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS) contains = list(/obj/item/ammo_box/c38/dumdum) - crate_name = ".38 match crate" + crate_name = ".38 dumdum crate" /datum/supply_pack/security/match name = ".38 Match Grade Speedloader" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 81d267fcf1..251bcc72ad 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -124,7 +124,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/eye_type = DEFAULT_EYES_TYPE //Eye type var/split_eye_colors = FALSE var/datum/species/pref_species = new /datum/species/human() //Mutant race - var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = list(), "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) var/custom_speech_verb = "default" //if your say_mod is to be something other than your races var/custom_tongue = "default" //if your tongue is to be something other than your races @@ -514,7 +514,76 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 + // rp marking selection + // assume you can only have mam markings or regular markings or none, never both + var/marking_type + if(parent.can_have_part("mam_body_markings")) + marking_type = "mam_body_markings" + if(marking_type) + dat += APPEARANCE_CATEGORY_COLUMN + dat += "

[GLOB.all_mutant_parts[marking_type]]

" // give it the appropriate title for the type of marking + dat += "Add marking" + // list out the current markings you have + if(length(features[marking_type])) + dat += "" + var/list/markings = features[marking_type] + if(!islist(markings)) + // something went terribly wrong + markings = list() + var/list/reverse_markings = reverseList(markings) + for(var/list/marking_list in reverse_markings) + var/marking_index = markings.Find(marking_list) // consider changing loop to go through indexes over lists instead of using Find here + var/limb_value = marking_list[1] + var/actual_name = GLOB.bodypart_names[num2text(limb_value)] // get the actual name from the bitflag representing the part the marking is applied to + var/color_marking_dat = "" + var/number_colors = 1 + var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]] + var/matrixed_sections = S.covered_limbs[actual_name] + if(S && matrixed_sections) + // if it has nothing initialize it to white + if(length(marking_list) == 2) + var/first = "#FFFFFF" + var/second = "#FFFFFF" + var/third = "#FFFFFF" + if(features["mcolor"]) + first = "#[features["mcolor"]]" + if(features["mcolor2"]) + second = "#[features["mcolor2"]]" + if(features["mcolor3"]) + third = "#[features["mcolor3"]]" + marking_list += list(list(first, second, third)) // just assume its 3 colours if it isnt it doesnt matter we just wont use the other values + // index magic + var/primary_index = 1 + var/secondary_index = 2 + var/tertiary_index = 3 + switch(matrixed_sections) + if(MATRIX_GREEN) + primary_index = 2 + if(MATRIX_BLUE) + primary_index = 3 + if(MATRIX_RED_BLUE) + secondary_index = 2 + if(MATRIX_GREEN_BLUE) + primary_index = 2 + secondary_index = 3 + + // we know it has one matrixed section at minimum + color_marking_dat += "   " + // if it has a second section, add it + if(matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL) + color_marking_dat += "   " + number_colors = 2 + // if it has a third section, add it + if(matrixed_sections == MATRIX_ALL) + color_marking_dat += "   " + number_colors = 3 + color_marking_dat += " Change
" + dat += "" + dat += "
[marking_list[2]] - [actual_name] ˄ ˅ X [color_marking_dat]
" + for(var/mutant_part in GLOB.all_mutant_parts) + if(mutant_part == "mam_body_markings") + continue if(parent.can_have_part(mutant_part)) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -533,8 +602,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(accessory) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future var/mutant_string = accessory.mutant_part_string - if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings)) - continue var/primary_feature = "[mutant_string]_primary" var/secondary_feature = "[mutant_string]_secondary" var/tertiary_feature = "[mutant_string]_tertiary" @@ -1726,13 +1793,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) pref_species = new newtype() //let's ensure that no weird shit happens on species swapping. custom_species = null - if(!parent.can_have_part("body_markings")) - features["body_markings"] = "None" if(!parent.can_have_part("mam_body_markings")) - features["mam_body_markings"] = "None" + features["mam_body_markings"] = list() if(parent.can_have_part("mam_body_markings")) if(features["mam_body_markings"] == "None") - features["mam_body_markings"] = "Plain" + features["mam_body_markings"] = list() if(parent.can_have_part("tail_lizard")) features["tail_lizard"] = "Smooth" if(pref_species.id == "felinid") @@ -1961,14 +2026,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_spines) features["spines"] = new_spines - if("body_markings") - var/new_body_markings - new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in GLOB.body_markings_list - if(new_body_markings) - features["body_markings"] = new_body_markings - if(new_body_markings != "None") - features["mam_body_markings"] = "None" - if("legs") var/new_legs new_legs = input(user, "Choose your character's legs:", "Character Preference") as null|anything in GLOB.legs_list @@ -2088,26 +2145,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_ears) features["mam_ears"] = new_ears - if("mam_body_markings") - var/list/snowflake_markings_list = list() - for(var/path in GLOB.mam_body_markings_list) - var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path] - if(istype(instance, /datum/sprite_accessory)) - var/datum/sprite_accessory/S = instance - if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id)) - continue - if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey))) - snowflake_markings_list[S.name] = path - var/new_mam_body_markings - new_mam_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in snowflake_markings_list - if(new_mam_body_markings) - features["mam_body_markings"] = new_mam_body_markings - if(new_mam_body_markings != "None") - features["body_markings"] = "None" - else if(new_mam_body_markings == "None") - features["mam_body_markings"] = "Plain" - features["body_markings"] = "None" - //Xeno Bodyparts if("xenohead")//Head or caste type var/new_head @@ -2133,7 +2170,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["xenodorsal"] = new_dors //every single primary/secondary/tertiary colouring done at once - if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","body_markings_primary","body_markings_secondary","body_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary") + if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary") var/the_feature = features[href_list["preference"]] if(!the_feature) features[href_list["preference"]] = "FFFFFF" @@ -2390,6 +2427,111 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/selected_body_sprite = input(user, "Choose your desired body sprite", "Character Preference") as null|anything in pref_species.allowed_limb_ids if(selected_body_sprite) chosen_limb_id = selected_body_sprite //this gets sanitized before loading + + if("marking_down") + // move the specified marking down + var/index = text2num(href_list["marking_index"]) + var/marking_type = href_list["marking_type"] + if(index && marking_type && features[marking_type] && index != length(features[marking_type])) + var/index_down = index + 1 + var/markings = features[marking_type] + var/first_marking = markings[index] + var/second_marking = markings[index_down] + markings[index] = second_marking + markings[index_down] = first_marking + + if("marking_up") + // move the specified marking up + var/index = text2num(href_list["marking_index"]) + var/marking_type = href_list["marking_type"] + if(index && marking_type && features[marking_type] && index != 1) + var/index_up = index - 1 + var/markings = features[marking_type] + var/first_marking = markings[index] + var/second_marking = markings[index_up] + markings[index] = second_marking + markings[index_up] = first_marking + + if("marking_remove") + // move the specified marking up + var/index = text2num(href_list["marking_index"]) + var/marking_type = href_list["marking_type"] + if(index && marking_type && features[marking_type]) + // because linters are just absolutely awful: + var/list/L = features[marking_type] + L.Cut(index, index + 1) + + if("marking_add") + // add a marking + var/marking_type = href_list["marking_type"] + if(marking_type && features[marking_type]) + var/selected_limb = input(user, "Choose the limb to apply to.", "Character Preference") as null|anything in list("Head", "Chest", "Left Arm", "Right Arm", "Left Leg", "Right Leg", "All") + if(selected_limb) + var/list/marking_list = GLOB.mam_body_markings_list + var/list/snowflake_markings_list = list() + for(var/path in marking_list) + var/datum/sprite_accessory/S = marking_list[path] + if(istype(S)) + if(istype(S, /datum/sprite_accessory/mam_body_markings)) + var/datum/sprite_accessory/mam_body_markings/marking = S + if(!(selected_limb in marking.covered_limbs) && selected_limb != "All") + continue + + if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey))) + snowflake_markings_list[S.name] = path + + var/selected_marking = input(user, "Select the marking to apply to the limb.") as null|anything in snowflake_markings_list + if(selected_marking) + if(selected_limb != "All") + var/limb_value = text2num(GLOB.bodypart_values[selected_limb]) + features[marking_type] += list(list(limb_value, selected_marking)) + else + var/datum/sprite_accessory/mam_body_markings/S = marking_list[selected_marking] + for(var/limb in S.covered_limbs) + var/limb_value = text2num(GLOB.bodypart_values[limb]) + features[marking_type] += list(list(limb_value, selected_marking)) + + if("marking_color") + var/index = text2num(href_list["marking_index"]) + var/marking_type = href_list["marking_type"] + if(index && marking_type && features[marking_type]) + // work out the input options to show the user + var/list/options = list("Primary") + var/number_colors = text2num(href_list["number_colors"]) + var/color_number = 1 // 1-3 which color are we editing + if(number_colors >= 2) + options += "Secondary" + if(number_colors == 3) + options += "Tertiary" + var/color_option = input(user, "Select the colour you wish to edit") as null|anything in options + if(color_option) + if(color_option == "Secondary") color_number = 2 + if(color_option == "Tertiary") color_number = 3 + // perform some magic on the color number + var/list/marking_list = features[marking_type][index] + var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]] + var/matrixed_sections = S.covered_limbs[GLOB.bodypart_names[num2text(marking_list[1])]] + if(color_number == 1) + switch(matrixed_sections) + if(MATRIX_GREEN) + color_number = 2 + if(MATRIX_BLUE) + color_number = 3 + else if(color_number == 2) + switch(matrixed_sections) + if(MATRIX_RED_BLUE) + color_number = 3 + if(MATRIX_GREEN_BLUE) + color_number = 3 + + var/color_list = features[marking_type][index][3] + var/new_marking_color = input(user, "Choose your character's marking color:", "Character Preference","#"+color_list[color_number]) as color|null + if(new_marking_color) + var/temp_hsv = RGBtoHSV(new_marking_color) + if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV(MINIMUM_MUTANT_COLOR)[3]) // mutantcolors must be bright, but only if they affect the skin + color_list[color_number] = "#[sanitize_hexcolor(new_marking_color, 6)]" + else + to_chat(user, "Invalid color. Your color is not bright enough.") else switch(href_list["preference"]) //CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 864bf5335a..45c5357c4d 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 50 +#define SAVEFILE_VERSION_MAX 52 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -283,7 +283,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car qdel(temporary_gear_item) //it's double packed into a list because += will union the two lists contents - S["loadout"] = safe_json_encode(loadout_data) + S["loadout"] = loadout_data if(current_version < 48) //unlockable loadout items but we need to clear bad data from a mistake S["unlockable_loadout"] = list() @@ -295,6 +295,51 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car L -= ROLE_SYNDICATE S["be_special"] << L + if(current_version < 51) //humans can have digi legs now, make sure they dont default to them or human players will murder me in my sleep + if(S["species"] == SPECIES_HUMAN) + features["legs"] = "Plantigrade" + + if(current_version < 52) // rp markings means markings are now stored as a list, lizard markings now mam like the rest + var/marking_type + var/species_id = S["species"] + var/datum/species/actual_species = GLOB.species_datums[species_id] + + // convert lizard markings to lizard markings + if(species_id == SPECIES_LIZARD && S["feature_lizard_body_markings"]) + features["mam_body_markings"] = features["body_markings"] + + // convert mam body marking data to the new rp marking data + if(actual_species.mutant_bodyparts["mam_body_markings"] && S["feature_mam_body_markings"]) marking_type = "feature_mam_body_markings" + + if(marking_type) + var/old_marking_value = S[marking_type] + var/list/color_list = list("#FFFFFF","#FFFFFF","#FFFFFF") + + if(S["feature_mcolor"]) color_list[1] = "#" + S["feature_mcolor"] + if(S["feature_mcolor2"]) color_list[2] = "#" + S["feature_mcolor2"] + if(S["feature_mcolor3"]) color_list[3] = "#" + S["feature_mcolor3"] + + var/list/marking_list = list() + for(var/part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, CHEST, HEAD)) + var/list/copied_color_list = color_list.Copy() + var/datum/sprite_accessory/mam_body_markings/mam_marking = GLOB.mam_body_markings_list[old_marking_value] + var/part_name = GLOB.bodypart_names[num2text(part)] + if(length(mam_marking.covered_limbs) && mam_marking.covered_limbs[part_name]) + var/matrixed_sections = mam_marking.covered_limbs[part_name] + // just trust me this is fine + switch(matrixed_sections) + if(MATRIX_GREEN) + copied_color_list[1] = copied_color_list[2] + if(MATRIX_BLUE) + copied_color_list[1] = copied_color_list[3] + if(MATRIX_RED_BLUE) + copied_color_list[2] = copied_color_list[3] + if(MATRIX_GREEN_BLUE) + copied_color_list[1] = copied_color_list[2] + copied_color_list[2] = copied_color_list[3] + marking_list += list(list(part, old_marking_value, copied_color_list)) + features["mam_body_markings"] = marking_list + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return @@ -579,7 +624,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/savefile/S = new /savefile(path) if(!S) return FALSE - features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) S.cd = "/" if(!slot) @@ -649,7 +694,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_lizard_horns"] >> features["horns"] S["feature_lizard_frills"] >> features["frills"] S["feature_lizard_spines"] >> features["spines"] - S["feature_lizard_body_markings"] >> features["body_markings"] S["feature_lizard_legs"] >> features["legs"] S["feature_human_tail"] >> features["tail_human"] S["feature_human_ears"] >> features["ears"] @@ -718,7 +762,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"] S["feature_mcolor2"] >> features["mcolor2"] S["feature_mcolor3"] >> features["mcolor3"] - S["feature_mam_body_markings"] >> features["mam_body_markings"] + // note safe json decode will runtime the first time it migrates but this is fine and it solves itself don't worry about it if you see it error + features["mam_body_markings"] = safe_json_decode(S["feature_mam_body_markings"]) S["feature_mam_tail"] >> features["mam_tail"] S["feature_mam_ears"] >> features["mam_ears"] S["feature_mam_tail_animated"] >> features["mam_tail_animated"] @@ -848,7 +893,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list) features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list) features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list) - features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list) features["legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Plantigrade") features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None") features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list) @@ -1017,7 +1061,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_human_ears"] , features["ears"]) WRITE_FILE(S["feature_lizard_frills"] , features["frills"]) WRITE_FILE(S["feature_lizard_spines"] , features["spines"]) - WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"]) WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"]) WRITE_FILE(S["feature_horns_color"] , features["horns_color"]) diff --git a/code/modules/client/verbs/autobunker.dm b/code/modules/client/verbs/autobunker.dm index 620854b9ed..367f1944cc 100644 --- a/code/modules/client/verbs/autobunker.dm +++ b/code/modules/client/verbs/autobunker.dm @@ -3,7 +3,7 @@ set desc = "Authorizes your account in the panic bunker of any servers connected to this function." set category = "OOC" - if(!(prefs.db_flags & DB_FLAG_AGE_CONFIRMATION_INCOMPLETE)) + if(prefs.db_flags & DB_FLAG_AGE_CONFIRMATION_INCOMPLETE) to_chat(src, "You are not age verified.") return diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index c79dee926c..01d27531e1 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -358,6 +358,12 @@ ..() user.cure_blind("blindfold_[REF(src)]") +/obj/item/clothing/glasses/fakeblindfold + name = "thin blindfold" + desc = "Covers the eyes, but not thick enough to obscure vision. Mostly for aesthetic." + icon_state = "blindfoldwhite" + item_state = "blindfoldwhite" + /obj/item/clothing/glasses/sunglasses/blindfold/white name = "blind personnel blindfold" desc = "Indicates that the wearer suffers from blindness." diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index a558abbfe8..a337439931 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -37,14 +37,19 @@ /obj/item/clothing/gloves/fingerless/pugilist/equipped(mob/user, slot) . = ..() if(slot == SLOT_GLOVES) - use_buffs(user, TRUE) wornonce = TRUE + if((HAS_TRAIT(user, TRAIT_NOPUGILIST))) + to_chat(user, "What purpose is there to don the weapons of pugilism if you're already well-practiced in martial arts? Mixing arts is blasphemous!") + return + use_buffs(user, TRUE) /obj/item/clothing/gloves/fingerless/pugilist/dropped(mob/user) . = ..() if(wornonce) - use_buffs(user, FALSE) wornonce = FALSE + if((HAS_TRAIT(user, TRAIT_NOPUGILIST))) + return + use_buffs(user, FALSE) /obj/item/clothing/gloves/fingerless/pugilist/proc/use_buffs(mob/user, buff) if(buff) // tarukaja @@ -67,6 +72,7 @@ H.dna.species.punchdamagehigh -= enhancement H.dna.species.punchdamagelow -= enhancement H.dna.species.punchwoundbonus -= wound_enhancement + H.dna?.species?.attack_sound_override = null if(!silent) to_chat(user, "With [src] off of your arms, you feel less ready to punch things.") @@ -223,6 +229,50 @@ parry_cooldown = 0 parry_failed_clickcd_duration = 0 +/obj/item/clothing/gloves/fingerless/pugilist/mauler + name = "mauler gauntlets" + desc = "Plastitanium gauntlets coated in a thick nano-weave carbon material and implanted with nanite injectors that boost the wielder's strength six-fold." + icon_state = "mauler_gauntlets" + item_state = "mauler_gauntlets" + transfer_prints = FALSE + body_parts_covered = ARMS|HANDS + cold_protection = ARMS|HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + armor = list("melee" = 30, "bullet" = 30, "laser" = 10, "energy" = 10, "bomb" = 55, "bio" = 15, "rad" = 15, "fire" = 80, "acid" = 50) + siemens_coefficient = 0 + permeability_coefficient = 0.05 + strip_delay = 80 + enhancement = 12 // same as the changeling gauntlets but without changeling utility + wound_enhancement = 12 + silent = TRUE + inherited_trait = TRAIT_CHUNKYFINGERS // your fingers are fat because the gloves are + secondary_trait = TRAIT_MAULER // commit table slam + +/obj/item/clothing/gloves/fingerless/pugilist/mauler/equipped(mob/user, slot) + . = ..() + if(slot == SLOT_GLOVES) + wornonce = TRUE + if((HAS_TRAIT(user, TRAIT_NOPUGILIST))) + return + use_mauls(user, TRUE) + +/obj/item/clothing/gloves/fingerless/pugilist/mauler/dropped(mob/user) + . = ..() + if(wornonce) + wornonce = FALSE + if((HAS_TRAIT(user, TRAIT_NOPUGILIST))) + return + use_mauls(user, FALSE) + +/obj/item/clothing/gloves/fingerless/pugilist/mauler/proc/use_mauls(mob/user, maul) + if(maul) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.dna?.species?.attack_sound_override = 'sound/weapons/mauler_punch.ogg' + if(silent) + to_chat(H, "You feel prickles around your wrists as [src] cling to them - strength courses through your veins!") + /obj/item/clothing/gloves/botanic_leather name = "botanist's leather gloves" desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin. They're also quite warm." @@ -253,7 +303,6 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) strip_mod = 1.5 - /obj/item/clothing/gloves/bracer name = "bone bracers" desc = "For when you're expecting to get slapped on the wrist. Offers modest protection to your arms." diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index afe74de6a0..8091ce331b 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -89,10 +89,8 @@ /datum/outfit/pirate/space suit = /obj/item/clothing/suit/space/pirate head = /obj/item/clothing/head/helmet/space/pirate/bandana - mask = /obj/item/clothing/mask/breath - suit_store = /obj/item/tank/internals/oxygen ears = /obj/item/radio/headset/syndicate - id = /obj/item/card/id + id = /obj/item/card/id/pirate /datum/outfit/pirate/space/captain head = /obj/item/clothing/head/helmet/space/pirate diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index cc14424980..6858de59df 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -535,3 +535,9 @@ to_chat(user, "You insert [I] into [src].") B.use(10) icon_state = initial(icon_state) + +/obj/item/clothing/shoes/swagshoes + name = "swag shoes" + desc = "They got me for my foams!" + icon_state = "SwagShoes" + item_state = "SwagShoes" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 6732f1c86c..254ed60c03 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -145,7 +145,7 @@ /obj/item/clothing/suit/armor/riot name = "riot suit" desc = "A suit of semi-flexible polycarbonate body armor with heavy padding to protect against melee attacks. Helps the wearer resist shoving in close quarters." - icon_state = "riot" + icon_state = "swat" item_state = "swat_suit" body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index f8292738ee..60d82292ef 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -355,3 +355,10 @@ name = "Sakura Kimono'" icon_state = "sakura_kimono" item_state = "sakura_kimono" + +/obj/item/clothing/under/costume/swagoutfit + name = "Swag outfit" + desc = "Why don't you go secure some bitches?" + icon_state = "SwagOutfit" + item_state = "SwagOutfit" + can_adjust = FALSE diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 7d4ea66d30..b9480a646c 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -61,7 +61,7 @@ originMachine.visible_message("[originMachine] beeps and seems lifeless.") kill() return - vendingMachines = listclearnulls(vendingMachines) + listclearnulls(vendingMachines) if(!vendingMachines.len) //if every machine is infected for(var/obj/machinery/vending/upriser in infectedMachines) if(prob(70) && !QDELETED(upriser)) diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 388a4fdac0..d284146ea3 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -206,6 +206,7 @@ icon_screen = "syndishuttle" icon_keyboard = "syndie_key" light_color = LIGHT_COLOR_RED + req_access = list(ACCESS_SYNDICATE) possible_destinations = "pirateship_away;pirateship_home;pirateship_custom" /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate @@ -214,8 +215,8 @@ shuttleId = "pirateship" lock_override = CAMERA_LOCK_STATION shuttlePortId = "pirateship_custom" - x_offset = 9 - y_offset = 0 + x_offset = 11 + y_offset = 1 see_hidden = FALSE /obj/docking_port/mobile/pirate @@ -224,11 +225,7 @@ rechargeTime = 3 MINUTES /obj/machinery/suit_storage_unit/pirate - suit_type = /obj/item/clothing/suit/space - helmet_type = /obj/item/clothing/head/helmet/space - mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/tank/jetpack/void - // storage_type = /obj/item/tank/internals/oxygen + storage_type = /obj/item/tank/jetpack/carbondioxide /obj/machinery/loot_locator name = "Booty Locator" diff --git a/code/modules/events/supernova.dm b/code/modules/events/supernova.dm index 6fc2fb0c4c..ca64984cde 100644 --- a/code/modules/events/supernova.dm +++ b/code/modules/events/supernova.dm @@ -17,24 +17,29 @@ announceWhen = rand(4, 60) supernova = new SSsun.suns += supernova - if(prob(20)) - power = rand(5,100) / 100 - else - power = rand(5,5000) / 100 + switch(rand(1,5)) + if(1) + power = rand(5,100) / 100 + if(2) + power = rand(5,500) / 100 + if(3) + power = rand(5,1000) / 100 + if(4, 5) + power = rand(5,5000) / 100 supernova.azimuth = rand(0, 359) supernova.power_mod = 0 /datum/round_event/supernova/announce() - var/message = "Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux. [power > 1 ? "Short burts of radiation may be possible, so please prepare accordingly." : ""]" + var/message = "[station_name()]: Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux; if the supernova is close to your sun in the sky, your solars may receive this as a power boost.[power > 1 ? " Short burts of radiation may be possible, so please prepare accordingly." : ""] We hope you enjoy the light." if(prob(power * 25)) - priority_announce(message) + priority_announce(message, sender_override = "Nanotrasen Meteorology Division") else print_command_report(message) /datum/round_event/supernova/start() supernova.power_mod = 0.001 * power - var/explosion_size = rand(1000000000, 999999999) + var/explosion_size = rand(1000000000, 10000000000) var/turf/epicenter = get_turf_in_angle(supernova.azimuth, SSmapping.get_station_center(), round(world.maxx * 0.45)) for(var/array in GLOB.doppler_arrays) var/obj/machinery/doppler_array/A = array @@ -51,13 +56,15 @@ supernova.power_mod = min(supernova.power_mod*1.2, power) if(activeFor > endWhen-10) supernova.power_mod /= 4 - if(prob(round(supernova.power_mod)) && prob(5) && storm_count < 5 && !SSweather.get_weather_by_type(/datum/weather/rad_storm)) + if(prob(round(supernova.power_mod*2)) && prob(3) && storm_count < 5 && !SSweather.get_weather_by_type(/datum/weather/rad_storm)) SSweather.run_weather(/datum/weather/rad_storm/supernova) storm_count++ /datum/round_event/supernova/end() SSsun.suns -= supernova qdel(supernova) + priority_announce("The supernova's flux is now negligible. Radiation storms have ceased. Have a pleasant shift, [station_name()], and thank you for bearing with nature.", + sender_override = "Nanotrasen Meteorology Division") /datum/weather/rad_storm/supernova weather_duration_lower = 50 diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index e31a9704df..7377913c15 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -305,6 +305,15 @@ /obj/item/reagent_containers/food/drinks/bottle/hcider/empty list_reagents = null +/obj/item/reagent_containers/food/drinks/bottle/amaretto + name = "Luini Amaretto" + desc = "A gentle and syrup-like drink that tastes of almonds and apricots." + icon_state = "disaronno" + list_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 100) + +/obj/item/reagent_containers/food/drinks/bottle/amaretto/empty + list_reagents = null + /obj/item/reagent_containers/food/drinks/bottle/grappa name = "Phillipes well-aged Grappa" desc = "Bottle of Grappa." @@ -615,6 +624,10 @@ icon_state = "hcider" name = "Sealed Cider" +/obj/item/export/bottle/amaretto + icon_state = "disaronno" + name = "Sealed Amaretto" + /obj/item/export/bottle/cognac icon_state = "cognacbottle" name = "Sealed Cognac" diff --git a/code/modules/food_and_drinks/food/snacks/dough.dm b/code/modules/food_and_drinks/food/snacks/dough.dm index e071fb3df7..10b8c946fc 100644 --- a/code/modules/food_and_drinks/food/snacks/dough.dm +++ b/code/modules/food_and_drinks/food/snacks/dough.dm @@ -26,6 +26,17 @@ else ..() +/obj/item/reagent_containers/food/snacks/flatdough/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/kitchen/unrollingpin)) + if(isturf(loc)) + new /obj/item/reagent_containers/food/snacks/dough(loc) + to_chat(user, "You unflatten [src].") + qdel(src) + else + to_chat(user, "You need to put [src] on a surface to undo the rolling!") + else + ..() + // sliceable into 3xdoughslices /obj/item/reagent_containers/food/snacks/flatdough @@ -98,6 +109,17 @@ else ..() +/obj/item/reagent_containers/food/snacks/piedough/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/kitchen/unrollingpin)) + if(isturf(loc)) + new /obj/item/reagent_containers/food/snacks/cakebatter(loc) + to_chat(user, "You unflatten [src].") + qdel(src) + else + to_chat(user, "You need to put [src] on a surface to undo the rolling!") + else + ..() + /obj/item/reagent_containers/food/snacks/piedough name = "pie dough" desc = "Cook it to get a pie." diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 972f9a8cc3..363e263ad4 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -29,6 +29,7 @@ id = /datum/reagent/consumable/nuka_cola results = list(/datum/reagent/consumable/nuka_cola = 6) required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/space_cola = 6) + mix_message = "The bitter-sweet smell of radiation almost makes you wish for a space winter." /datum/chemical_reaction/moonshine name = "Moonshine" @@ -36,6 +37,7 @@ results = list(/datum/reagent/consumable/ethanol/moonshine = 10) required_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 5) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) + mix_message = "As the moisture in the glass settles, your entire face burns from the reaction's alcoholic virility." /datum/chemical_reaction/wine name = "Wine" @@ -112,6 +114,7 @@ id = /datum/reagent/consumable/ethanol/screwdrivercocktail results = list(/datum/reagent/consumable/ethanol/screwdrivercocktail = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/orangejuice = 1) + mix_message = "The mixture billows a sweet scent of orange, promptly drowned out by a thick nose-scrunching cloud of potato liquor." /datum/chemical_reaction/bloody_mary name = "Bloody Mary" @@ -142,18 +145,21 @@ id = /datum/reagent/consumable/ethanol/toxins_special results = list(/datum/reagent/consumable/ethanol/toxins_special = 5) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vermouth = 1, /datum/reagent/toxin/plasma = 2) + mix_message = "The surface of the mixture sets ablaze as toxic gas erupts into a mystical cloud of fire, shortly settling to but a humble - albeit eternal blaze." /datum/chemical_reaction/beepsky_smash name = "Beepksy Smash" id = /datum/reagent/consumable/ethanol/beepsky_smash results = list(/datum/reagent/consumable/ethanol/beepsky_smash = 5) required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/ethanol/quadruple_sec = 2, /datum/reagent/iron = 1) + mix_message = "You can hear the law nearby." /datum/chemical_reaction/doctor_delight name = "The Doctor's Delight" id = /datum/reagent/consumable/doctor_delight results = list(/datum/reagent/consumable/doctor_delight = 5) required_reagents = list(/datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/medicine/cryoxadone = 1) + mix_message = "The scent of medicine hits you like a truck!" /datum/chemical_reaction/irish_cream name = "Irish Cream" @@ -166,6 +172,7 @@ id = /datum/reagent/consumable/ethanol/manly_dorf results = list(/datum/reagent/consumable/ethanol/manly_dorf = 3) required_reagents = list (/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/ale = 2) + mix_message = "You can feel the hair growing on your chest!" /datum/chemical_reaction/greenbeer name = "Green Beer" @@ -233,6 +240,7 @@ id = /datum/reagent/consumable/ethanol/hiveminderaser results = list(/datum/reagent/consumable/ethanol/hiveminderaser = 4) required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/thirteenloko = 1, /datum/reagent/consumable/grenadine = 1) + mix_message = "Your head throbs as the purple-colored mixture swirls with alien-like vigor!" /datum/chemical_reaction/manhattan name = "Manhattan" @@ -269,6 +277,8 @@ id = /datum/reagent/consumable/ethanol/singulo results = list(/datum/reagent/consumable/ethanol/singulo = 10) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 5, /datum/reagent/radium = 1, /datum/reagent/consumable/ethanol/wine = 5) + mix_message = "A horrible screeching fills your ears, and a wave of dread washes over you..." + mix_sound = 'sound/effects/supermatter.ogg' /datum/chemical_reaction/alliescocktail name = "Allies Cocktail" @@ -447,6 +457,8 @@ id = /datum/reagent/consumable/ethanol/syndicatebomb results = list(/datum/reagent/consumable/ethanol/syndicatebomb = 2) required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/whiskey_cola = 1) + mix_message = "You can hear beeping coming from behind you." + mix_sound = 'sound/items/timer.ogg' /datum/chemical_reaction/erikasurprise name = "Erika Surprise" @@ -459,30 +471,38 @@ id = /datum/reagent/consumable/ethanol/devilskiss results = list(/datum/reagent/consumable/ethanol/devilskiss = 3) required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/rum = 1) + mix_message = "You can hear faint whispering in your ear and a burning on your cheeks as the mixture blends together into with a fiery swirl." /datum/chemical_reaction/hippiesdelight name = "Hippies Delight" id = /datum/reagent/consumable/ethanol/hippies_delight results = list(/datum/reagent/consumable/ethanol/hippies_delight = 2) required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 1, /datum/reagent/consumable/ethanol/gargle_blaster = 1) + mix_message = "You can like... Smell the flowers, man - as the drink mixes." /datum/chemical_reaction/bananahonk name = "Banana Honk" id = /datum/reagent/consumable/ethanol/bananahonk results = list(/datum/reagent/consumable/ethanol/bananahonk = 2) required_reagents = list(/datum/reagent/consumable/laughter = 1, /datum/reagent/consumable/cream = 1) + mix_message = "The mixture honks. Honk!" + mix_sound = 'sound/items/bikehorn.ogg' /datum/chemical_reaction/silencer name = "Silencer" id = /datum/reagent/consumable/ethanol/silencer results = list(/datum/reagent/consumable/ethanol/silencer = 3) required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/sugar = 1) + mix_message = "As the drink mixes, you can hear nothing..." + mix_sound = null /datum/chemical_reaction/driestmartini name = "Driest Martini" id = /datum/reagent/consumable/ethanol/driestmartini results = list(/datum/reagent/consumable/ethanol/driestmartini = 2) required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/ethanol/gin = 1) + mix_message = "You feel like a prune beneath a sun as the mixture yanks the moisture from your tongue - yet, it's all so silent." + mix_sound = null /datum/chemical_reaction/thirteenloko name = "Thirteen Loko" @@ -519,12 +539,14 @@ id = /datum/reagent/consumable/gibbfloats results = list(/datum/reagent/consumable/gibbfloats = 15) required_reagents = list(/datum/reagent/consumable/dr_gibb = 5, /datum/reagent/consumable/ice = 5, /datum/reagent/consumable/cream = 5) + mix_message = "As the cream floats to the top of the glass, you can feel your cholesterol levels rising just looking at it." /datum/chemical_reaction/triple_citrus name = "triple_citrus" id = /datum/reagent/consumable/triple_citrus results = list(/datum/reagent/consumable/triple_citrus = 5) required_reagents = list(/datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/orangejuice = 1) + mix_message = "The glass's contents shift colors from a rainbow of fruity twinges before settling with a distinct flowery smell." /datum/chemical_reaction/grape_soda name = "grape soda" @@ -567,6 +589,7 @@ results = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 4) required_reagents = list(/datum/reagent/consumable/ethanol/hooch = 1, /datum/reagent/consumable/ethanol/absinthe = 1, /datum/reagent/consumable/ethanol/manly_dorf = 1, /datum/reagent/consumable/ethanol/syndicatebomb = 1) mix_message = "The mixture turns to a sickening froth." + mix_sound = 'sound/FermiChem/bufferadd.ogg' /datum/chemical_reaction/lemonade name = "Lemonade" @@ -601,9 +624,17 @@ id = /datum/reagent/consumable/ethanol/cogchamp results = list(/datum/reagent/consumable/ethanol/cogchamp = 3) required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol/screwdrivercocktail = 1) - mix_message = "You hear faint sounds of gears turning as it mixes." + mix_message = "You hear faint sounds of gears turning as the mixture gives off virulent plumes of steam." mix_sound = 'sound/machines/clockcult/steam_whoosh.ogg' +/datum/chemical_reaction/pinotmort + name = "Pinot Mort" + id = /datum/reagent/consumable/ethanol/pinotmort + results = list(/datum/reagent/consumable/ethanol/pinotmort = 4) + required_reagents = list(/datum/reagent/ash = 2, /datum/reagent/consumable/ethanol/lizardwine = 1, /datum/reagent/consumable/vitfro = 1) + mix_message = "You hear an undescribable scream as it mixes... You're not sure how to feel about this." + mix_sound = 'sound/effects/tendril_destroyed.ogg' + /datum/chemical_reaction/quadruplesec name = "Quadruple Sec" id = /datum/reagent/consumable/ethanol/quadruple_sec @@ -736,18 +767,22 @@ id = /datum/reagent/consumable/pwr_game results = list(/datum/reagent/consumable/pwr_game = 5) required_reagents = list(/datum/reagent/consumable/sodawater = 1, /datum/reagent/colorful_reagent/crayonpowder/black = 1, /datum/reagent/consumable/sodiumchloride = 1) + mix_message = "The mixture froths as it turns black, rousing a nauseating aroma of sweat and salt before settling to an eerie purple color." /datum/chemical_reaction/pinkmilk name = "Strawberry Milk" id = /datum/reagent/consumable/pinkmilk results = list(/datum/reagent/consumable/pinkmilk = 2) required_reagents = list(/datum/reagent/consumable/strawberryjuice = 1, /datum/reagent/consumable/milk = 1) + mix_message = "You feel a sweet aroma drift up your nose as the lactic mixture swirls. It reminds you of... a cafeteria." /datum/chemical_reaction/blank_paper name = "Blank Paper" id = /datum/reagent/consumable/ethanol/blank_paper results = list(/datum/reagent/consumable/ethanol/blank_paper = 3) required_reagents = list(/datum/reagent/consumable/ethanol/silencer = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nuka_cola = 1) + mix_message = "As the drink mixes, you can hear nothing..." + mix_sound = null /datum/chemical_reaction/wizz_fizz name = "Wizz Fizz" @@ -777,18 +812,22 @@ id = /datum/reagent/consumable/ethanol/turbo results = list(/datum/reagent/consumable/ethanol/turbo = 5) required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pwr_game = 1) + mix_message = "The mixture pops and fizzles, it's going to bl- oh, nevermind." /datum/chemical_reaction/old_timer name = "Old Timer" id = /datum/reagent/consumable/ethanol/old_timer results = list(/datum/reagent/consumable/ethanol/old_timer = 6) required_reagents = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3, /datum/reagent/consumable/parsnipjuice = 2, /datum/reagent/consumable/ethanol/alexander = 1) + mix_message = "You hear a faded record playing in the distance. Then, you hear nothing." + mix_sound = null /datum/chemical_reaction/rubberneck name = "Rubberneck" id = /datum/reagent/consumable/ethanol/rubberneck results = list(/datum/reagent/consumable/ethanol/rubberneck = 10) required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/grey_bull = 5, /datum/reagent/consumable/astrotame = 1) + mix_message = "The mixture boils and bubbles as the faint scent of rubber and heart disease hits your nose." /datum/chemical_reaction/duplex name = "Duplex" @@ -801,6 +840,7 @@ id = /datum/reagent/consumable/ethanol/trappist results = list(/datum/reagent/consumable/ethanol/trappist = 5) required_reagents = list(/datum/reagent/consumable/ethanol/ale = 2, /datum/reagent/water/holywater = 2, /datum/reagent/consumable/sugar = 1) + mix_message = "As the mixture froths, you swear you can hear a distant holy choir." /datum/chemical_reaction/cream_soda name = "Cream Soda" @@ -813,6 +853,8 @@ id = /datum/reagent/consumable/ethanol/blazaam results = list(/datum/reagent/consumable/ethanol/blazaam = 3) required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/peachjuice = 1, /datum/reagent/bluespace = 1) + mix_message = "The mixture- hey, where'd all the liquid go? Oh, there it is." + mix_sound = 'sound/magic/Teleport_app.ogg' /datum/chemical_reaction/planet_cracker name = "Planet Cracker" @@ -833,6 +875,7 @@ results = list(/datum/reagent/consumable/ethanol/gunfire = 4) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/tea = 3) mix_message = "A loud popping begins to fill the air as the drink is mixed." + mix_sound = 'sound/effects/wounds/sizzle1.ogg' /datum/chemical_reaction/hellfire name = "Hellfire" @@ -840,6 +883,7 @@ results = list(/datum/reagent/consumable/ethanol/hellfire = 4) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/ethanol/crevice_spike = 1) mix_message = "The liquid begins to churn as it changes to an amber orange and catches on fire." + mix_sound = 'sound/FermiChem/bufferadd.ogg' /datum/chemical_reaction/sins_delight name = "Sins Delight" @@ -853,6 +897,7 @@ id = /datum/reagent/consumable/ethanol/strawberry_daiquiri results = list(/datum/reagent/consumable/ethanol/strawberry_daiquiri = 7) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/strawberryjuice = 2, /datum/reagent/consumable/ice = 1) + mix_message = "The mixture settles as a nostril-flaring waft of strawberry hits your nose." /datum/chemical_reaction/miami_vice name = "Miami Vice" @@ -871,18 +916,22 @@ id = /datum/reagent/consumable/ethanol/liz_fizz results = list(/datum/reagent/consumable/ethanol/liz_fizz = 5) required_reagents = list(/datum/reagent/consumable/triple_citrus = 3, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) + mix_message = "The smell of cream and lime hits your nose as everything feels very real for a split moment. You want to lick your eye." /datum/chemical_reaction/hotlime_miami name = "Hotlime Miami" id = /datum/reagent/consumable/ethanol/hotlime_miami results = list(/datum/reagent/consumable/ethanol/hotlime_miami = 2) required_reagents = list(/datum/reagent/medicine/ephedrine = 1, /datum/reagent/consumable/ethanol/pina_colada = 1) + mix_message = "You can hear synthwave in the distance as you can feel your blood boiling with rage." /datum/chemical_reaction/mauna_loa name = "Mauna Loa" id = /datum/reagent/consumable/ethanol/mauna_loa results = list(/datum/reagent/consumable/ethanol/mauna_loa = 5) required_reagents = list(/datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/bahama_mama = 2) + mix_message = "The drink erupts as a plume of lava sprays all over the place! Oh, wait, it's just luke-warm liquor." + mix_sound = 'sound/effects/wounds/sizzle2.ogg' /datum/chemical_reaction/commander_and_chief name = "Commander and Chief" @@ -891,6 +940,22 @@ required_reagents = list(/datum/reagent/consumable/ethanol/alliescocktail = 50, /datum/reagent/consumable/ethanol/champagne = 20, /datum/reagent/consumable/doctor_delight = 10, /datum/reagent/consumable/ethanol/quintuple_sec = 10, /datum/reagent/consumable/ethanol/screwdrivercocktail = 10) mix_message = "When your powers combine, I am Captain Pl-..." +/datum/chemical_reaction/godfather + results = list(/datum/reagent/consumable/ethanol/godfather = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/whiskey = 1) + +/datum/chemical_reaction/godmother + results = list(/datum/reagent/consumable/ethanol/godmother = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/vodka = 1) + +/datum/chemical_reaction/amaretto_alexander + results = list(/datum/reagent/consumable/ethanol/amaretto_alexander = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/cream = 1) + +/datum/chemical_reaction/ginger_amaretto + results = list(/datum/reagent/consumable/ethanol/ginger_amaretto = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/sol_dry = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/lemonjuice = 1) + ////////////////////////////////////////// Tea Base Drinks ////////////////////////////////////// /datum/chemical_reaction/mush @@ -898,6 +963,7 @@ id = /datum/reagent/consumable/tea/mush results = list(/datum/reagent/consumable/tea/mush = 3) required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 3, /datum/reagent/consumable/tea = 3) + mix_message = "The liquid stirs with a mixture of psychedelic colors that makes stars peek from the corner of your vision." /datum/chemical_reaction/foresttea1 name = "Forest Tea" @@ -959,7 +1025,7 @@ id = /datum/reagent/consumable/catnip_tea results = list(/datum/reagent/consumable/catnip_tea = 3) required_reagents = list(/datum/reagent/consumable/tea = 5, /datum/reagent/pax/catnip = 2) - + mix_message = "The mixture seems to purr aloud as it stirs together." ////////////////////////////////////////// Race Base Drinks ////////////////////////////////////// @@ -968,54 +1034,65 @@ id = /datum/reagent/consumable/ethanol/species_drink/coldscales results = list(/datum/reagent/consumable/ethanol/species_drink/coldscales = 3) required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/toxin/slimejelly = 1, /datum/reagent/consumable/menthol = 1) + mix_message = "Bubbles erupt from the glass and spill all over the place as it mixes, before settling with the faint smell of a reptile enclosure." /datum/chemical_reaction/oil_drum name = "Oil Drum" id = /datum/reagent/consumable/ethanol/species_drink/oil_drum results = list(/datum/reagent/consumable/ethanol/species_drink/oil_drum = 3) required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oil = 1, /datum/reagent/consumable/ethanol/champagne = 12) + mix_message = "You can taste oil in your mouth as the newly-formed mixture floats to the top of the glass." /datum/chemical_reaction/nord_king name = "Nord King" id = /datum/reagent/consumable/ethanol/species_drink/nord_king results = list(/datum/reagent/consumable/ethanol/species_drink/nord_king = 10) required_reagents = list(/datum/reagent/consumable/ethanol = 5, /datum/reagent/consumable/honey = 1, /datum/reagent/consumable/ethanol/red_mead = 10) + mix_message = "You can feel hair growing on places it shouldn't be as the smell of salt water and flame burns into your senses." /datum/chemical_reaction/velvet_kiss name = "Velvet Kiss" id = /datum/reagent/consumable/ethanol/species_drink/velvet_kiss results = list(/datum/reagent/consumable/ethanol/species_drink/velvet_kiss = 15) //Limited races use this required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/consumable/tea = 1, /datum/reagent/consumable/ethanol/wine = 10) + mix_message = "The taste of blood rolls off your tongue as the mixture oozes a crimson secretion." /datum/chemical_reaction/abduction_fruit name = "Abduction Fruit" id = /datum/reagent/consumable/ethanol/species_drink/abduction_fruit results = list(/datum/reagent/consumable/ethanol/species_drink/abduction_fruit = 3) required_reagents = list(/datum/reagent/consumable/limejuice = 10, /datum/reagent/consumable/strawberryjuice = 5, /datum/reagent/consumable/watermelonjuice = 10) + mix_message = "The mixture forms with a green cloud of smoke, carrying with a smell of bovines and medicine." /datum/chemical_reaction/bug_zapper name = "Bug Zapper" id = /datum/reagent/consumable/ethanol/species_drink/bug_zapper results = list(/datum/reagent/consumable/ethanol/species_drink/bug_zapper = 20) //Harder to make required_reagents = list(/datum/reagent/consumable/lemonjuice = 10, /datum/reagent/teslium = 1, /datum/reagent/copper = 10) + mix_message = "The mixture comes to life with a spark and a zap - shortly after, you can hear the faint buzzing of moths circling your head." + mix_sound = 'sound/weapons/taser.ogg' /datum/chemical_reaction/mush_crush name = "Mush Crush" id = /datum/reagent/consumable/ethanol/species_drink/mush_crush results = list(/datum/reagent/consumable/ethanol/species_drink/mush_crush = 10) required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/ash = 5, /datum/reagent/toxin/coffeepowder = 10) + mix_message = "The mixture sputters and coughs as a mushroom suddenly emerges from the glass!" /datum/chemical_reaction/darkbrew name = "Darkbrew" id = /datum/reagent/consumable/ethanol/species_drink/darkbrew results = list(/datum/reagent/consumable/ethanol/species_drink/darkbrew = 20)//Limited races use this required_reagents = list(/datum/reagent/liquid_dark_matter = 5, /datum/reagent/toxin/bungotoxin = 5, /datum/reagent/toxin/coffeepowder = 10) + mix_message = "As the glass turns into a shadowy pit, you can smell... nothing." /datum/chemical_reaction/hollow_bone name = "Hollow Bone" id = /datum/reagent/consumable/ethanol/species_drink/hollow_bone results = list(/datum/reagent/consumable/ethanol/species_drink/hollow_bone = 10) required_reagents = list(/datum/reagent/toxin/bonehurtingjuice = 5, /datum/reagent/consumable/milk = 10, /datum/reagent/consumable/coconutmilk = 10) + mix_message = "Your bones feel weak." + mix_sound = 'sound/effects/wounds/crack1.ogg' /datum/chemical_reaction/frisky_kitty name = "Frisky Kitty" @@ -1023,6 +1100,7 @@ results = list(/datum/reagent/consumable/ethanol/species_drink/frisky_kitty = 2) required_reagents = list(/datum/reagent/consumable/catnip_tea = 1, /datum/reagent/consumable/milk = 1) required_temp = 296 //Just above room temp (22.85'C) + mix_message = "The drink bubbles over the rim as it settles, and the smell of wet fur and felines makes it feel like you're in heat." /datum/chemical_reaction/jell_wyrm name = "Jell Wyrm" @@ -1030,6 +1108,7 @@ results = list(/datum/reagent/consumable/ethanol/species_drink/jell_wyrm = 2) required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/toxin/carpotoxin = 1, /datum/reagent/carbondioxide = 5) required_temp = 333 // (59.85'C) + mix_message = "The smell of toxins scrunches your nose as your limbs grow limp and feel like jelly." /datum/chemical_reaction/laval_spit name = "Laval Spit" @@ -1037,3 +1116,5 @@ results = list(/datum/reagent/consumable/ethanol/species_drink/laval_spit = 20) //Limited use required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/ethanol/mauna_loa = 10, /datum/reagent/sulfur = 5) required_temp = 900 // (626.85'C) + mix_message = "The room grows warm as burning rock rockets over the edge of the drink before settling." + mix_sound = 'sound/effects/wounds/sizzle2.ogg' diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm index 5161ff349e..e0eaf35353 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -3,6 +3,15 @@ ////////////////////////////////////////////////BREAD//////////////////////////////////////////////// +/datum/crafting_recipe/food/bread + name = "Bread" + reqs = list( + /obj/item/reagent_containers/food/snacks/breadslice/plain = 5, + ) + tools = list(/obj/item/kitchen/efink) + result = /obj/item/reagent_containers/food/snacks/store/bread/plain + subcategory = CAT_BREAD + /datum/crafting_recipe/food/banananutbread name = "Banana nut bread" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index 17ea36a160..2409032760 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -66,6 +66,16 @@ ////////////////////////////////////////////////MISC RECIPE's//////////////////////////////////////////////// +/datum/crafting_recipe/food/meatslab + name = "Meat Slab" + reqs = list( + /obj/item/reagent_containers/food/snacks/meat/rawcutlet = 3, + ) + tools = list(/obj/item/kitchen/efink) + result = /obj/item/reagent_containers/food/snacks/meat/slab + subcategory = CAT_MEAT + + /datum/crafting_recipe/food/ribs name = "BBQ Ribs" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 93102e1ad0..eaebfbb44e 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -47,6 +47,24 @@ /////////////////////////////////MISC///////////////////////////////////// +/datum/crafting_recipe/food/dough + name = "Dough" + reqs = list( + /obj/item/reagent_containers/food/snacks/doughslice = 3, + ) + tools = list(/obj/item/kitchen/efink) + result = /obj/item/reagent_containers/food/snacks/flatdough + subcategory = CAT_MISCFOOD + +/datum/crafting_recipe/food/Pineapple + name = "Pineapple" + reqs = list( + /obj/item/reagent_containers/food/snacks/pineappleslice = 3, + ) + tools = list(/obj/item/kitchen/efink) + result = /obj/item/reagent_containers/food/snacks/grown/pineapple + subcategory = CAT_MISCFOOD + /datum/crafting_recipe/food/beans name = "Beans" time = 40 diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 5343595f89..80f168fe2f 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -194,6 +194,15 @@ ////////////////////////////////////////////OTHER//////////////////////////////////////////// +/datum/crafting_recipe/food/piedough + name = "Pie Dough" + reqs = list( + /obj/item/reagent_containers/food/snacks/rawpastrybase = 3, + ) + tools = list(/obj/item/kitchen/efink) + result = /obj/item/reagent_containers/food/snacks/piedough + subcategory = CAT_PASTRY + /datum/crafting_recipe/food/chococornet name = "Choco cornet" reqs = list( diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index d44b94aaf3..f468022918 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -206,6 +206,9 @@ /mob/living/simple_animal/hostile/retaliate/clown/insane/ex_act() return +/mob/living/simple_animal/hostile/retaliate/clown/insane/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /mob/living/simple_animal/hostile/retaliate/clown/insane/Life() timer-- if(target) diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm index f17040a938..0d312c485a 100644 --- a/code/modules/library/soapstone.dm +++ b/code/modules/library/soapstone.dm @@ -152,7 +152,7 @@ var/newcolor = copytext_char(hash, 1, 7) add_atom_colour("#[newcolor]", FIXED_COLOUR_PRIORITY) light_color = "#[newcolor]" - set_light(1) + set_light(0.3) /obj/structure/chisel_message/proc/pack() var/list/data = list() diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index ffa2d86e15..6551b1e336 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -10,6 +10,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT layer = LIGHTING_LAYER invisibility = INVISIBILITY_LIGHTING + vis_flags = VIS_HIDE var/needs_update = FALSE var/turf/myturf diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index ae05aee150..b949ac67e6 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -13,13 +13,15 @@ var/offset while((offset = SSmapping.level_trait(other_z, ZTRAIT_DOWN))) other_z += offset + if(other_z in .) + break // no infinite loops . += other_z other_z = center_z while((offset = SSmapping.level_trait(other_z, ZTRAIT_UP))) other_z += offset + if(other_z in .) + break // no infinite loops . += other_z - return . - /proc/get_dir_multiz(turf/us, turf/them) us = get_turf(us) @@ -46,4 +48,4 @@ /turf/proc/below() return get_step_multiz(src, DOWN) - + diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 777f1bfc3b..80dec5bc29 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -8,6 +8,10 @@ area_flags = BLOBS_ALLOWED | UNIQUE_AREA flags_1 = CAN_BE_DIRTY_1 +/area/survivalpod/nonpowered + name = "\proper Emergency Shelter" + requires_power = TRUE + //Survival Capsule /obj/item/survivalcapsule name = "bluespace shelter capsule" @@ -81,6 +85,10 @@ desc = "A luxury bar in a capsule. Bartender required and not included." template_id = "shelter_charlie" +/obj/item/survivalcapsule/luxury/empty + name = "large empty capsule" + desc = "An extremly large capsule which requires power. Useful for projects all over." + template_id = "shelter_delta" //Pod objects //Window diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 48e8a4c338..acceb331ab 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -994,7 +994,6 @@ H.dna.features["wings"] = "None" H.dna.features["frills"] = "None" H.dna.features["spines"] = "Long" - H.dna.features["body_markings"] = "Dark Tiger Body" H.dna.features["legs"] = "Digitigrade" H.dna.features["taur_body"] = "None" H.left_eye_color = "fee5a3" diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index ec6a430c0c..8a7c3a81bd 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -56,6 +56,7 @@ new /datum/data/mining_equipment("Ice hiking boots", /obj/item/clothing/shoes/winterboots/ice_boots, 2500), new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxury/elitebar, 10000), + new /datum/data/mining_equipment("Empty Capsule", /obj/item/survivalcapsule/luxury/empty, 5000), new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800), new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400), new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400), diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm index 2481634e5f..6bd04ffd6d 100644 --- a/code/modules/mining/shelters.dm +++ b/code/modules/mining/shelters.dm @@ -73,3 +73,15 @@ . = ..() whitelisted_turfs = typecacheof(/turf/closed/mineral) banned_objects = typecacheof(/obj/structure/stone_tile) + +/datum/map_template/shelter/delta + name = "Shelter Delta" + shelter_id = "shelter_delta" + description = "A massive but barebones survival capsule useful\ + for projects that require great deals of space." + mappath = "_maps/templates/shelter_4.dmm" + +/datum/map_template/shelter/delta/New() + . = ..() + whitelisted_turfs = typecacheof(/turf/closed/mineral) + banned_objects = typecacheof(/obj/structure/stone_tile) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index d198140c5f..a9233938ab 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -54,6 +54,8 @@ mannequin.job = previewJob.title previewJob.equip(mannequin, TRUE, preference_source = parent) + mannequin.regenerate_icons() + COMPILE_OVERLAYS(mannequin) parent.show_character_previews(new /mutable_appearance(mannequin)) unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm b/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm index f58788d9af..016b12d8ec 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm @@ -12,6 +12,7 @@ name = "DataShark" icon_state = "datashark" ckeys_allowed = list("rubyflamewing") + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) //Sabresune /datum/sprite_accessory/ears/mam_ears/sabresune @@ -39,6 +40,7 @@ name = "Sabresune" icon_state = "sabresune" ckeys_allowed = list("poojawa") + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) //Lunasune /datum/sprite_accessory/ears/mam_ears/lunasune diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index bc6c4899dd..148af35247 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -1,39 +1,3 @@ -/****************************************** -************* Lizard Markings ************* -*******************************************/ - -/datum/sprite_accessory/body_markings - icon = 'icons/mob/mutant_bodyparts.dmi' - relevant_layers = list(BODY_ADJ_LAYER) - mutant_part_string = "body_markings" - -/datum/sprite_accessory/body_markings/none - name = "None" - icon_state = "none" - relevant_layers = null - -/datum/sprite_accessory/body_markings/dtiger - name = "Dark Tiger Body" - icon_state = "dtiger" - gender_specific = 1 - -/datum/sprite_accessory/body_markings/guilmon - name = "Guilmon" - icon_state = "guilmon" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' - matrixed_sections = MATRIX_ALL - -/datum/sprite_accessory/body_markings/ltiger - name = "Light Tiger Body" - icon_state = "ltiger" - gender_specific = 1 - -/datum/sprite_accessory/body_markings/lbelly - name = "Light Belly" - icon_state = "lbelly" - gender_specific = 1 - /****************************************** ************ Furry Markings *************** *******************************************/ @@ -49,7 +13,8 @@ gender_specific = 0 icon = 'modular_citadel/icons/mob/mam_markings.dmi' recommended_species = list("mammal", "xeno", "slimeperson", "podweak") - matrixed_sections = MATRIX_ALL + matrixed_sections = MATRIX_ALL // this value is used if there is no value in covered_limbs, don't rely on it, it's a backup value + var/list/covered_limbs = list("Head", "Chest", "Left Leg", "Right Leg", "Left Arm", "Right Arm") /datum/sprite_accessory/mam_body_markings/none name = "None" @@ -62,87 +27,107 @@ /datum/sprite_accessory/mam_body_markings/redpanda name = "Redpanda" icon_state = "redpanda" + covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/bat name = "Bat" icon_state = "bat" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/bee name = "Bee" icon_state = "bee" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/belly name = "Belly" icon_state = "belly" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/bellyslim name = "Bellyslim" icon_state = "bellyslim" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/cow name = "Bovine" icon_state = "bovine" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/corgi name = "Corgi" icon_state = "corgi" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/corvid name = "Corvid" icon_state = "corvid" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/dalmation name = "Dalmation" icon_state = "dalmation" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/deer name = "Deer" icon_state = "deer" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_GREEN_BLUE, "Right Leg" = MATRIX_GREEN_BLUE, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/dog name = "Dog" icon_state = "dog" + covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_GREEN_BLUE, "Right Leg" = MATRIX_GREEN_BLUE, "Left Arm" = MATRIX_ALL, "Right Arm" = MATRIX_ALL) /datum/sprite_accessory/mam_body_markings/eevee name = "Eevee" icon_state = "eevee" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/fennec name = "Fennec" icon_state = "Fennec" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/fox name = "Fox" icon_state = "fox" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE) /datum/sprite_accessory/mam_body_markings/frog name = "Frog" icon_state = "frog" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/goat name = "Goat" icon_state = "goat" + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE) /datum/sprite_accessory/mam_body_markings/handsfeet name = "Handsfeet" icon_state = "handsfeet" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/hawk name = "Hawk" icon_state = "hawk" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/husky name = "Husky" icon_state = "husky" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/hyena name = "Hyena" icon_state = "hyena" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/insect name = "Insect" @@ -152,78 +137,118 @@ /datum/sprite_accessory/mam_body_markings/lab name = "Lab" icon_state = "lab" + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/orca name = "Orca" icon_state = "orca" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/otie name = "Otie" icon_state = "otie" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_ALL, "Right Arm" = MATRIX_ALL) /datum/sprite_accessory/mam_body_markings/otter name = "Otter" icon_state = "otter" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/panther name = "Panther" icon_state = "panther" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/plain name = "Plain" icon_state = "plain" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/possum name = "Possum" icon_state = "possum" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE) /datum/sprite_accessory/mam_body_markings/raccoon name = "Raccoon" icon_state = "raccoon" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/sergal name = "Sergal" icon_state = "sergal" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/pede name = "Scolipede" icon_state = "scolipede" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_GREEN, "Chest" = MATRIX_GREEN_BLUE, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/shark name = "Shark" icon_state = "shark" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/shepherd name = "Shepherd" icon_state = "shepherd" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/skunk name = "Skunk" icon_state = "skunk" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/tajaran name = "Tajaran" icon_state = "tajaran" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/tiger name = "Tiger" icon_state = "tiger" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE) /datum/sprite_accessory/mam_body_markings/turian name = "Turian" icon_state = "turian" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/wolf name = "Wolf" icon_state = "wolf" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE) /datum/sprite_accessory/mam_body_markings/xeno name = "Xeno" icon_state = "xeno" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_BLUE, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) + +// sticking old lizard markings here for now +/datum/sprite_accessory/mam_body_markings/dtiger + name = "Dark Tiger Body" + icon_state = "dtiger" + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) + +/datum/sprite_accessory/mam_body_markings/guilmon + name = "Guilmon" + icon_state = "guilmon" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_GREEN_BLUE, "Left Leg" = MATRIX_BLUE, "Right Leg" = MATRIX_BLUE, "Left Arm" = MATRIX_GREEN_BLUE, "Right Arm" = MATRIX_GREEN_BLUE) + +/datum/sprite_accessory/mam_body_markings/ltiger + name = "Light Tiger Body" + icon_state = "ltiger" + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) + +/datum/sprite_accessory/mam_body_markings/lbelly + name = "Light Belly" + icon_state = "lbelly" + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /****************************************** ************* Insect Markings ************* diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index e09a0386ee..628a5e53ac 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -67,6 +67,13 @@ matrixed_sections = MATRIX_RED_GREEN icon = 'modular_citadel/icons/mob/mam_ears.dmi' +/datum/sprite_accessory/ears/bunnyalt + name = "Bunny (Vegas)" + icon_state = "bunnyalt" + color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN + icon = 'modular_citadel/icons/mob/mam_ears.dmi' + /datum/sprite_accessory/ears/cat name = "Cat" icon_state = "cat" @@ -94,6 +101,13 @@ matrixed_sections = MATRIX_RED icon = 'modular_citadel/icons/mob/mam_ears.dmi' +/datum/sprite_accessory/ears/lablight + name = "Dog, Floppy (Light)" + icon_state = "lablight" + color_src = MATRIXED + matrixed_sections = MATRIX_RED + icon = 'modular_citadel/icons/mob/mam_ears.dmi' + /datum/sprite_accessory/ears/human/eevee name = "Eevee" icon_state = "eevee" @@ -155,12 +169,19 @@ icon = 'modular_citadel/icons/mob/mam_ears.dmi' /datum/sprite_accessory/ears/human/rabbit - name = "Rabbit" + name = "Rabbit (Lop-eared)" icon_state = "rabbit" color_src = MATRIXED matrixed_sections = MATRIX_RED_GREEN icon = 'modular_citadel/icons/mob/mam_ears.dmi' +/datum/sprite_accessory/ears/human/rabbitalt + name = "Rabbit (Straight-eared)" + icon_state = "rabbitalt" + color_src = MATRIXED + matrixed_sections = MATRIX_ALL + icon = 'modular_citadel/icons/mob/mam_ears.dmi' + /datum/sprite_accessory/ears/human/pede name = "Scolipede" icon_state = "pede" @@ -258,6 +279,11 @@ icon_state = "bunny" matrixed_sections = MATRIX_RED_GREEN +/datum/sprite_accessory/ears/mam_ears/bunnyalt + name = "Bunny (Vegas)" + icon_state = "bunnyalt" + matrixed_sections = MATRIX_RED_GREEN + /datum/sprite_accessory/ears/mam_ears/cat name = "Cat" icon_state = "cat" @@ -284,7 +310,7 @@ /datum/sprite_accessory/ears/mam_ears/deer name = "Deer" icon_state = "deer" - color_src = MUTCOLORS3 + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/eevee name = "Eevee" @@ -332,10 +358,15 @@ matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/lab - name = "Dog, Long" + name = "Dog, Floppy" icon_state = "lab" matrixed_sections = MATRIX_RED +/datum/sprite_accessory/ears/mam_ears/lablight + name = "Dog, Floppy (Light)" + icon_state = "lablight" + matrixed_sections = MATRIX_RED + /datum/sprite_accessory/ears/mam_ears/murid name = "Murid" icon_state = "murid" @@ -347,10 +378,15 @@ matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/rabbit - name = "Rabbit" + name = "Rabbit (Lop-eared)" icon_state = "rabbit" matrixed_sections = MATRIX_RED_GREEN +/datum/sprite_accessory/ears/mam_ears/rabbitalt + name = "Rabbit (Straight-eared)" + icon_state = "rabbitalt" + matrixed_sections = MATRIX_ALL + /datum/sprite_accessory/ears/mam_ears/pede name = "Scolipede" icon_state = "pede" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm index a4bd0afdcb..88dda923a0 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm @@ -17,6 +17,10 @@ name = "Adhara" icon_state = "hair_adhara" +/datum/sprite_accessory/hair/africanpigtails + name = "African Pig Tails" + icon_state = "hair_africanpigtails" + /datum/sprite_accessory/hair/afro name = "Afro" icon_state = "hair_afro" @@ -25,10 +29,26 @@ name = "Afro 2" icon_state = "hair_afro2" +/datum/sprite_accessory/hair/afro2alt + name = "Afro 2 (Alt)" + icon_state = "hair_afro2alt" + /datum/sprite_accessory/hair/afro_large name = "Afro (Large)" icon_state = "hair_bigafro" +/datum/sprite_accessory/hair/afropuffdouble + name = "Afropuff (Double)" + icon_state = "hair_afropuffdouble" + +/datum/sprite_accessory/hair/afropuffleft + name = "Afropuff (Left)" + icon_state = "hair_afropuffleft" + +/datum/sprite_accessory/hair/afropuffright + name = "Afropuff (Right)" + icon_state = "hair_afropuffright" + /datum/sprite_accessory/hair/antenna name = "Ahoge" icon_state = "hair_antenna" @@ -41,10 +61,18 @@ name = "Anita" icon_state = "hair_anita" +/datum/sprite_accessory/hair/astolfo + name = "Astolfo" + icon_state = "hair_astolfo" + /datum/sprite_accessory/hair/balding name = "Balding Hair" icon_state = "hair_e" +/datum/sprite_accessory/hair/baum + name = "Baum" + icon_state = "hair_baum" + /datum/sprite_accessory/hair/bedhead name = "Bedhead" icon_state = "hair_bedhead" @@ -85,6 +113,14 @@ name = "Belle" icon_state = "hair_belle" +/datum/sprite_accessory/hair/bluntbangs + name = "Bluntbangs" + icon_state = "hair_bluntbangs" + +/datum/sprite_accessory/hair/bluntbangsalt + name = "Bluntbangs (Alt)" + icon_state = "hair_bluntbangsalt" + /datum/sprite_accessory/hair/bob name = "Bob Hair" icon_state = "hair_bob" @@ -109,6 +145,10 @@ name = "Bobcut (Alt)" icon_state = "hair_bobcutalt" +/datum/sprite_accessory/hair/bobcutalt2 + name = "Bobcut (Alt) 2" + icon_state = "hair_bobcutalt2" + /datum/sprite_accessory/hair/boddicker name = "Boddicker" icon_state = "hair_boddicker" @@ -205,6 +245,14 @@ name = "CIA" icon_state = "hair_cia" +/datum/sprite_accessory/hair/combedback + name = "Combed Back" + icon_state = "hair_combedback" + +/datum/sprite_accessory/hair/combedbob + name = "Combed Bob" + icon_state = "hair_combedbob" + /datum/sprite_accessory/hair/combover name = "Combover" icon_state = "hair_combover" @@ -233,6 +281,14 @@ name = "Cornrow Tail" icon_state = "hair_cornrowtail" +/datum/sprite_accessory/hair/cotton + name = "Cotton" + icon_state = "hair_cotton" + +/datum/sprite_accessory/hair/cottonalt + name = "Cotton (Alt)" + icon_state = "hair_cottonalt" + /datum/sprite_accessory/hair/country name = "Country" icon_state = "hair_country" @@ -261,6 +317,10 @@ name = "Devil Lock" icon_state = "hair_devillock" +/datum/sprite_accessory/hair/diagonalbangs + name = "Diagonal Bangs" + icon_state = "hair_diagonalbangs" + /datum/sprite_accessory/hair/dreadlocks name = "Dreadlocks" icon_state = "hair_dreads" @@ -337,10 +397,22 @@ name = "Fluffy" icon_state = "hair_fluffy" +/datum/sprite_accessory/hair/fortuneteller + name = "Fortune Teller" + icon_state = "hair_fortuneteller" + /datum/sprite_accessory/hair/fringetail name = "Fringe Tail" icon_state = "hair_fringetail" +/datum/sprite_accessory/hair/froofy + name = "Froofy" + icon_state = "hair_froofy" + +/datum/sprite_accessory/hair/geisha + name = "Geisha" + icon_state = "hair_geisha" + /datum/sprite_accessory/hair/gelled name = "Gelled Back" icon_state = "hair_gelled" @@ -349,6 +421,26 @@ name = "Gentle" icon_state = "hair_gentle" +/datum/sprite_accessory/hair/glammetal + name = "Glam Metal" + icon_state = "hair_glammetal" + +/datum/sprite_accessory/hair/gloomy + name = "Gloomy" + icon_state = "hair_gloomy" + +/datum/sprite_accessory/hair/gloomylong + name = "Gloomy (Long)" + icon_state = "hair_gloomylong" + +/datum/sprite_accessory/hair/hajime + name = "Hajime" + icon_state = "hair_hajime" + +/datum/sprite_accessory/hair/hajimealt + name = "Hajime (Alt)" + icon_state = "hair_hajimealt" + /datum/sprite_accessory/hair/halfbang name = "Half-banged Hair" icon_state = "hair_halfbang" @@ -365,6 +457,10 @@ name = "Half-shaved Hair" icon_state = "hair_halfshaved" +/datum/sprite_accessory/hair/harold + name = "Harold" + icon_state = "hair_harold" + /datum/sprite_accessory/hair/hedgehog name = "Hedgehog Hair" icon_state = "hair_hedgehog" @@ -393,6 +489,10 @@ name = "Hitop" icon_state = "hair_hitop" +/datum/sprite_accessory/hair/inari + name = "Inari" + icon_state = "hair_inari" + /datum/sprite_accessory/hair/inkling name = "Inkling" icon_state = "hair_inkling" @@ -421,14 +521,18 @@ name = "Keanu" icon_state = "hair_keanu" -/datum/sprite_accessory/hair/kusangi - name = "Kusanagi" - icon_state = "hair_kusanagi" +/datum/sprite_accessory/hair/kisaragi + name = "Kisaragi" + icon_state = "hair_kisaragi" /datum/sprite_accessory/hair/kleeia name = "Kleeia" icon_state = "hair_kleeia" +/datum/sprite_accessory/hair/kusangi + name = "Kusanagi" + icon_state = "hair_kusanagi" + /datum/sprite_accessory/hair/long name = "Long Hair 1" icon_state = "hair_long" @@ -449,6 +553,10 @@ name = "Long Over Eye" icon_state = "hair_longovereye" +/datum/sprite_accessory/hair/long_over_eyealt + name = "Long Over Eye (Alt)" + icon_state = "hair_longovereyealt" + /datum/sprite_accessory/hair/longbangs name = "Long Bangs" icon_state = "hair_lbangs" @@ -489,10 +597,6 @@ name = "Mohawk" icon_state = "hair_d" -/datum/sprite_accessory/hair/newyou - name = "New You" - icon_state = "hair_newyou" - /datum/sprite_accessory/hair/reversemohawk name = "Mohawk (Reverse)" icon_state = "hair_reversemohawk" @@ -509,6 +613,10 @@ name = "Mulder" icon_state = "hair_mulder" +/datum/sprite_accessory/hair/newyou + name = "New You" + icon_state = "hair_newyou" + /datum/sprite_accessory/hair/nia name = "Nia" icon_state = "hair_nia" @@ -579,10 +687,18 @@ name = "Pompadour (Big)" icon_state = "hair_bigpompadour" +/datum/sprite_accessory/hair/bigpompadouralt + name = "Pompadour (Big) (Alt)" + icon_state = "hair_bigpompadouralt" + /datum/sprite_accessory/hair/ponytail1 name = "Ponytail" icon_state = "hair_ponytail" +/datum/sprite_accessory/hair/ponytail1alt + name = "Ponytail (Alt)" + icon_state = "hair_ponytailalt" + /datum/sprite_accessory/hair/ponytail2 name = "Ponytail 2" icon_state = "hair_ponytail2" @@ -591,14 +707,26 @@ name = "Ponytail 3" icon_state = "hair_ponytail3" +/datum/sprite_accessory/hair/ponytail3alt + name = "Ponytail 3 (Alt)" + icon_state = "hair_ponytail3alt" + /datum/sprite_accessory/hair/ponytail4 name = "Ponytail 4" icon_state = "hair_ponytail4" +/datum/sprite_accessory/hair/ponytail4alt + name = "Ponytail 4 (Alt)" + icon_state = "hair_ponytail4alt" + /datum/sprite_accessory/hair/ponytail5 name = "Ponytail 5" icon_state = "hair_ponytail5" +/datum/sprite_accessory/hair/ponytail6 + name = "Ponytail 6" + icon_state = "hair_ponytail6" + /datum/sprite_accessory/hair/highponytail name = "Ponytail (High)" icon_state = "hair_highponytail" @@ -623,6 +751,10 @@ name = "Ponytail (Side) 4" icon_state = "hair_sidetail4" +/datum/sprite_accessory/hair/sidetail5 + name = "Ponytail (Side) 5" + icon_state = "hair_sidetail5" + /datum/sprite_accessory/hair/sharptail name = "Ponytail (Sharp)" icon_state = "hair_sharptail" @@ -639,10 +771,18 @@ name = "Poofy 2" icon_state = "hair_poofy2" +/datum/sprite_accessory/hair/quadcurls + name = "Quad Curls" + icon_state = "hair_quadcurls" + /datum/sprite_accessory/hair/quiff name = "Quiff" icon_state = "hair_quiff" +/datum/sprite_accessory/hair/rockstar + name = "Rockstar" + icon_state = "hair_rockstar" + /datum/sprite_accessory/hair/ronin name = "Ronin" icon_state = "hair_ronin" @@ -759,6 +899,10 @@ name = "Slightly Long Hair" icon_state = "hair_protagonist" +/datum/sprite_accessory/hair/slightlymessy + name = "Slightly Messy Hair" + icon_state = "hair_slightlymessy" + /datum/sprite_accessory/hair/spiky name = "Spiky" icon_state = "hair_spikey" @@ -771,6 +915,26 @@ name = "Spiky 3" icon_state = "hair_spiky2" +/datum/sprite_accessory/hair/slimedroplet + name = "Slime Droplet" + icon_state = "hair_slimedroplet" + +/datum/sprite_accessory/hair/slimedropletalt + name = "Slime Droplet (Alt)" + icon_state = "hair_slimedropletalt" + +/datum/sprite_accessory/hair/slimespikes + name = "Slime Spikes" + icon_state = "hair_slimespikes" + +/datum/sprite_accessory/hair/slimetendrils + name = "Slime Tendrils" + icon_state = "hair_slimetendrils" + +/datum/sprite_accessory/hair/slimetendrilsalt + name = "Slime Tendrils (Alt)" + icon_state = "hair_slimetendrilsalt" + /datum/sprite_accessory/hair/supernova name = "Supernova" icon_state = "hair_supernova" @@ -851,6 +1015,10 @@ name = "Very Long Hair 2" icon_state = "hair_longest" +/datum/sprite_accessory/hair/longestalt + name = "Very Long Hair 2 (Alt)" + icon_state = "hair_longestalt" + /datum/sprite_accessory/hair/longest2 name = "Very Long Over Eye" icon_state = "hair_longest2" @@ -886,3 +1054,7 @@ /datum/sprite_accessory/hair/ziegler name = "Ziegler" icon_state = "hair_ziegler" + +/datum/sprite_accessory/hair/zone + name = "Zone" + icon_state = "hair_zone" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm index bc4d4dd00d..c7cd699ec9 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm @@ -32,20 +32,20 @@ icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Pecs" icon_state = "synthlizpecs" - matrixed_sections = MATRIX_GREEN + covered_limbs = list("Chest" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecslight icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Pecs Light" icon_state = "synthlizpecslight" - matrixed_sections = MATRIX_GREEN_BLUE + covered_limbs = list("Chest" = MATRIX_GREEN_BLUE) /datum/sprite_accessory/mam_body_markings/synthliz recommended_species = list("synthliz") icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Plates" icon_state = "synthlizscutes" - matrixed_sections = MATRIX_GREEN + covered_limbs = list("Chest" = MATRIX_GREEN) //Synth tails /datum/sprite_accessory/tails/mam_tails/synthliz diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 24d456bf8f..b66158db8a 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -13,6 +13,10 @@ /obj/effect/dummy/phased_mob/slaughter/ex_act() return + +/obj/effect/dummy/phased_mob/slaughter/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /obj/effect/dummy/phased_mob/slaughter/bullet_act() return BULLET_ACT_FORCE_PIERCE diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index be03827695..8ffcce248b 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -46,6 +46,9 @@ /mob/living/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up. return +/mob/living/brain/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /mob/living/brain/blob_act(obj/structure/blob/B) return diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 31ab636ceb..aa14fe6013 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -41,10 +41,10 @@ . += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]." //head - if(head && !(head.item_flags & EXAMINE_SKIP)) + if(head && !(head.obj_flags & EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head." //suit/armor - if(wear_suit && !(wear_suit.item_flags & EXAMINE_SKIP)) + if(wear_suit && !(wear_suit.obj_flags & EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]." //suit/armor storage if(s_store && !(SLOT_S_STORE in obscured)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a288392c38..c5abcd91df 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1083,6 +1083,17 @@ . = ..() set_species(race) +/mob/living/carbon/human/get_tooltip_data() + var/t_He = p_they(TRUE) + var/t_is = p_are() + . = list() + var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) + if(skipface || get_visible_name() == "Unknown") + . += "You can't make out what species they are." + else + . += "[t_He] [t_is] a [dna.custom_species ? dna.custom_species : dna.species.name]" + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .) + /mob/living/carbon/human/species/abductor race = /datum/species/abductor diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index d0af9782bd..6f1fe57df3 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -77,6 +77,8 @@ var/last_fire_update var/hardcore_survival_score = 0 + tooltips = TRUE + /// Unarmed parry data for human /datum/block_parry_data/unarmed/human parry_respect_clickdelay = TRUE diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e4ce4beb9f..ccbdf1fc7b 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -149,6 +149,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /// var/sound/attack_sound = 'sound/weapons/punch1.ogg' var/sound/miss_sound = 'sound/weapons/punchmiss.ogg' + var/attack_sound_override = null var/list/mob/living/ignored_by = list() // list of mobs that will ignore this species //Breathing! @@ -569,12 +570,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/remove_blacklisted_quirks(mob/living/carbon/C) var/mob/living/L = C.mind?.current if(istype(L)) - var/list/my_quirks = L.client?.prefs.all_quirks.Copy() - SSquirks.filter_quirks(my_quirks, blacklisted_quirks) for(var/q in L.roundstart_quirks) var/datum/quirk/Q = q - if(!(SSquirks.quirk_name_by_path(Q.type) in my_quirks)) - L.remove_quirk(Q.type) + if(Q.type in blacklisted_quirks) + qdel(Q) removed_quirks += Q.type // restore any quirks that we removed @@ -1611,7 +1610,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/armor_block = target.run_armor_check(affecting, "melee") - playsound(target.loc, user.dna.species.attack_sound, 25, 1, -1) + playsound(target.loc, user.dna.species.attack_sound_override || attack_sound, 25, 1, -1) target.visible_message("[user] [atk_verb]ed [target]!", \ "[user] [atk_verb]ed you!", null, COMBAT_MESSAGE_RANGE, null, \ user, "You [atk_verb]ed [target]!") diff --git a/code/modules/mob/living/carbon/human/species_types/anthromorph.dm b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm similarity index 91% rename from code/modules/mob/living/carbon/human/species_types/anthromorph.dm rename to code/modules/mob/living/carbon/human/species_types/anthropomorph.dm index d718db818c..95cb9cca59 100644 --- a/code/modules/mob/living/carbon/human/species_types/anthromorph.dm +++ b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm @@ -1,11 +1,11 @@ /datum/species/mammal - name = "Anthromorph" + name = "Anthropomorph" id = SPECIES_MAMMAL default_color = "4B4B4B" species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None", - "mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian") + "mam_body_markings" = list(), "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian") attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' @@ -20,7 +20,7 @@ allowed_limb_ids = list("mammal","aquatic","avian") /datum/species/mammal/synthetic - name = "Synthetic Anthromorph" + name = "Synthetic Anthropomorph" id = SPECIES_MAMMAL_SYNTHETIC species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,ROBOTIC_LIMBS,HAS_FLESH,HAS_BONE,WINGCOLOR,HORNCOLOR) diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index 773651d464..c649339fe3 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -1,5 +1,5 @@ /datum/species/insect - name = "Anthromorphic Insect" + name = "Anthropomorphic Insect" id = SPECIES_INSECT say_mod = "chitters" default_color = "00FF00" diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index c3e406244b..5a185cbeb8 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -1,5 +1,5 @@ /datum/species/fly - name = "Anthromorphic Fly" + name = "Anthropomorphic Fly" id = SPECIES_FLY say_mod = "buzzes" species_traits = list(NOEYES,HAS_FLESH,HAS_BONE) diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index e8e0ff1a78..d0f6c64550 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -4,7 +4,7 @@ default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR,HAS_FLESH,HAS_BONE) - mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None") + mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None", "legs" = "Plantigrade") use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM skinned_type = /obj/item/stack/sheet/animalhide/human disliked_food = GROSS | RAW diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 40645b13d4..07fa78a88a 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -1,6 +1,6 @@ /datum/species/lizard // Reptilian humanoids with scaled skin and tails. - name = "Anthromorphic Lizard" + name = "Anthropomorphic Lizard" id = SPECIES_LIZARD say_mod = "hisses" default_color = "00FF00" @@ -11,7 +11,7 @@ coldmod = 1.5 heatmod = 0.67 mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round", - "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", + "horns" = "None", "frills" = "None", "spines" = "None", "mam_body_markings" = list(), "legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index dcbdf91485..0655b28197 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -1,5 +1,5 @@ /datum/species/mush //mush mush codecuck - name = "Anthromorphic Mushroom" + name = "Anthropomorphic Mushroom" id = SPECIES_MUSHROOM mutant_bodyparts = list("caps" = "Round") 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 697c3db35e..ed0fa9ae87 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -1,6 +1,6 @@ /datum/species/pod // A mutation caused by a human being ressurected in a revival pod. These regain health in light, and begin to wither in darkness. - name = "Anthromorphic Plant" + name = "Anthropomorphic Plant" id = SPECIES_POD default_color = "59CE00" species_traits = list(MUTCOLORS,EYECOLOR,CAN_SCAR,HAS_FLESH,HAS_BONE) @@ -71,10 +71,10 @@ H.emote("spin") /datum/species/pod/pseudo_weak - name = "Anthromorphic Plant" + name = "Anthropomorphic Plant" id = SPECIES_POD_WEAK species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS,CAN_SCAR,HAS_FLESH,HAS_BONE) - mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs") + mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = list(), "taur" = "None", "legs" = "Normal Legs") limbs_id = SPECIES_POD light_nutrition_gain_factor = 3 light_bruteheal = -0.2 diff --git a/code/modules/mob/living/carbon/human/species_types/xeno.dm b/code/modules/mob/living/carbon/human/species_types/xeno.dm index 9d5a700417..e9d9aa2d5b 100644 --- a/code/modules/mob/living/carbon/human/species_types/xeno.dm +++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm @@ -5,7 +5,7 @@ say_mod = "hisses" default_color = "00FF00" species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR,HAS_FLESH,HAS_BONE) - mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade","deco_wings"= "None") + mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = list(),"mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade","deco_wings"= "None") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 5f77d25eae..f18d768df3 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -729,11 +729,8 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if . += "-[BP.digitigrade_type]" if(BP.dmg_overlay_type) . += "-[BP.dmg_overlay_type]" - if(BP.body_markings) - . += "-[BP.body_markings]" - if(length(BP.markings_color) && length(BP.markings_color[1])) - for(var/color in BP.markings_color[1]) - . += "-[color]" + if(BP.body_markings_list) + . += "-[safe_json_encode(BP.body_markings_list)]" if(BP.icon) . += "-[BP.icon]" else diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6aaa2cca87..ae716efc71 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -542,8 +542,48 @@ update_stat() med_hud_set_health() med_hud_set_status() + update_health_hud() -//proc used to ressuscitate a mob +/mob/living/update_health_hud() + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + if(hud_used?.healthdoll) //to really put you in the boots of a simplemob + var/obj/screen/healthdoll/living/livingdoll = hud_used.healthdoll + switch(healthpercent) + if(100 to INFINITY) + livingdoll.icon_state = "living0" + if(80 to 100) + livingdoll.icon_state = "living1" + severity = 1 + if(60 to 80) + livingdoll.icon_state = "living2" + severity = 2 + if(40 to 60) + livingdoll.icon_state = "living3" + severity = 3 + if(20 to 40) + livingdoll.icon_state = "living4" + severity = 4 + if(1 to 20) + livingdoll.icon_state = "living5" + severity = 5 + else + livingdoll.icon_state = "living6" + severity = 6 + if(!livingdoll.filtered) + livingdoll.filtered = TRUE + var/icon/mob_mask = icon(icon, icon_state) + if(mob_mask.Height() > world.icon_size || mob_mask.Width() > world.icon_size) + var/health_doll_icon_state = health_doll_icon ? health_doll_icon : "megasprite" + mob_mask = icon('icons/mob/screen_gen.dmi', health_doll_icon_state) //swap to something generic if they have no special doll + UNLINT(livingdoll.filters += filter(type="alpha", icon = mob_mask)) + livingdoll.filters += filter(type="drop_shadow", size = -1) + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") + +//Proc used to resuscitate a mob, for full_heal see fully_heal() /mob/living/proc/revive(full_heal = FALSE, admin_revive = FALSE) SEND_SIGNAL(src, COMSIG_LIVING_REVIVE, full_heal, admin_revive) if(full_heal) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 5f3f530437..4c6ede3904 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -438,6 +438,12 @@ return ..() +/mob/living/wave_ex_act(power, datum/wave_explosion/explosion, dir) + if(power > EXPLOSION_POWER_NORMAL_MOB_GIB) + gib() + adjustBruteLoss(EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, explosion.mob_damage_mod)) + return power + //Looking for irradiate()? It's been moved to radiation.dm under the rad_act() for mobs. /mob/living/acid_act(acidpwr, acid_volume) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 94f4ff60a3..3b53eec64f 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -98,6 +98,7 @@ var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob. var/bubble_icon = "default" //what icon the mob uses for speechbubbles + var/health_doll_icon //if this exists AND the normal sprite is bigger than 32x32, this is the replacement icon state (because health doll size limitations). the icon will always be screen_gen.dmi var/last_bumped = 0 var/unique_name = 0 //if a mob's name should be appended with an id when created e.g. Mob (666) diff --git a/code/modules/mob/living/silicon/examine.dm b/code/modules/mob/living/silicon/examine.dm index 7de281de5f..0840ea1191 100644 --- a/code/modules/mob/living/silicon/examine.dm +++ b/code/modules/mob/living/silicon/examine.dm @@ -1,5 +1,4 @@ /mob/living/silicon/examine(mob/user) //Displays a silicon's laws to ghosts - . = ..() if(laws && isobserver(user)) . += "[src] has the following laws:" for(var/law in laws.get_law_list(include_zeroth = TRUE)) diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 6ac1d410eb..45a3d15635 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -48,6 +48,9 @@ . += "It doesn't seem to be responding." if(DEAD) . += "It looks like its system is corrupted and requires a reset." + + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .) + . += "*---------*
" . += ..() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 38f93f9ffc..47f9a794cf 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1326,3 +1326,18 @@ var/datum/computer_file/program/robotact/program = modularInterface.get_robotact() if(program) program.force_full_update() + +/mob/living/silicon/robot/get_tooltip_data() + var/t_He = p_they(TRUE) + var/t_is = p_are() + . = list() + var/borg_type = module ? module : "Default" +//This isn't even used normally, but if that ever changes, just uncomment this +/* var/obj/item/borg_chameleon/chameleon = locate() in src + if(!chameleon) + chameleon = locate() in src.module + if(chameleon?.active) + borg_type = "Engineering" +*/ + . += "[t_He] [t_is] a [borg_type] unit" + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .) diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index f44552f1ab..fe22ec1236 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -125,3 +125,5 @@ var/sleeper_g var/sleeper_r var/sleeper_nv + + tooltips = TRUE diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b2b27c7d70..8af55370bb 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -59,8 +59,8 @@ /mob/living/silicon/ComponentInitialize() . = ..() - AddElement(/datum/element/flavor_text, _name = "Silicon Flavor Text", _save_key = "silicon_flavor_text") - AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!") + AddElement(/datum/element/flavor_text, _name = "Silicon Flavor Text", _always_show = TRUE, _save_key = "silicon_flavor_text") + AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!", _always_show = TRUE) AddElement(/datum/element/flavor_text, _name = "OOC Notes", _addendum = "Put information on ERP/vore/lewd-related preferences here. THIS SHOULD NOT CONTAIN REGULAR FLAVORTEXT!!", _always_show = TRUE, _save_key = "ooc_notes", _examine_no_preview = TRUE) /mob/living/silicon/med_hud_set_health() diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 012515d0e9..7c7ff3779c 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -280,6 +280,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(3) adjustBruteLoss(30) +/mob/living/simple_animal/hostile/guardian/wave_ex_act(power, datum/wave_explosion/explosion, dir) + adjustBruteLoss(EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, explosion.mob_damage_mod * 0.33)) + /mob/living/simple_animal/hostile/guardian/gib() if(summoner) to_chat(summoner, "Your [src] was blown up!") diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index c0a4822b6d..57ddbe6290 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -149,6 +149,7 @@ icon_state = "alienq" icon_living = "alienq" icon_dead = "alienq_dead" + health_doll_icon = "alienq" bubble_icon = "alienroyal" move_to_delay = 4 maxHealth = 400 diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 51a646f668..8388d6501a 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -73,6 +73,7 @@ icon_living = "megacarp" icon_dead = "megacarp_dead" icon_gib = "megacarp_gib" + health_doll_icon = "megacarp" regen_amount = 6 maxHealth = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index ec0b7acd07..67cecd3832 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -9,6 +9,7 @@ icon_state = "crawling" icon_living = "crawling" icon_dead = "dead" + health_doll_icon = "crawling" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 80 maxHealth = 220 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 61f1fe0c9d..a60c5504e6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -28,6 +28,7 @@ Difficulty: Medium icon_state = "miner" icon_living = "miner" icon = 'icons/mob/broadMobs.dmi' + health_doll_icon = "miner" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID light_color = "#E4C7C5" movement_type = GROUND diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 4d54487244..b80e6cc72f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -33,6 +33,7 @@ Difficulty: Hard icon_state = "bubblegum" icon_living = "bubblegum" icon_dead = "" + health_doll_icon = "bubblegum" friendly_verb_continuous = "stares down" friendly_verb_simple = "stare down" icon = 'icons/mob/lavaland/96x96megafauna.dmi' @@ -134,7 +135,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/grant_achievement(medaltype,scoretype) . = ..() if(.) - SSshuttle.shuttle_purchase_requirements_met |= "bubblegum" + SSshuttle.shuttle_purchase_requirements_met["bubblegum"] = TRUE /mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) if(!charging) @@ -443,7 +444,7 @@ Difficulty: Hard charge(chargeat, delay, chargepast) /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination - name = "bubblegum's hallucination" + name = "Bubblegum's hallucination" desc = "Is that really just a hallucination?" health = 1 maxHealth = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 787c15a5b4..5751512b19 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -32,6 +32,7 @@ Difficulty: Very Hard icon_state = "eva" icon_living = "eva" icon_dead = "dragon_dead" + health_doll_icon = "eva" friendly_verb_continuous = "stares down" friendly_verb_simple = "stare down" icon = 'icons/mob/lavaland/96x96megafauna.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 6c1e9eef6e..a3d51744b9 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -48,6 +48,7 @@ Difficulty: Medium icon_state = "dragon" icon_living = "dragon" icon_dead = "dragon_dead" + health_doll_icon = "dragon" friendly_verb_continuous = "stares down" friendly_verb_simple = "stare down" speak_emote = list("roars") diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 32300dea18..14b71b3bac 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -44,6 +44,7 @@ Difficulty: Normal attack_sound = 'sound/weapons/sonic_jackhammer.ogg' icon_state = "hierophant" icon_living = "hierophant" + health_doll_icon = "hierophant" friendly_verb_continuous = "stares down" friendly_verb_simple = "stare down" icon = 'icons/mob/lavaland/hierophant_new.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 07c1957da2..15bfe2b7f7 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -26,6 +26,7 @@ SHITCODE AHEAD. BE ADVISED. Also comment extravaganza spacewalk = TRUE icon_state = "mega_legion" icon_living = "mega_legion" + health_doll_icon = "mega_legion" desc = "One of many." icon = 'icons/mob/lavaland/96x96megafauna.dmi' attack_verb_continuous = "chomps" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index e2d6602a88..3940388625 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -149,6 +149,9 @@ if(EXPLODE_LIGHT) adjustBruteLoss(50) +/mob/living/simple_animal/hostile/megafauna/wave_ex_act(power, datum/wave_explosion/explosion, dir) + adjustBruteLoss(EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, explosion.mob_damage_mod) / 2) + /// Sets the next time the megafauna can use a melee or ranged attack, in deciseconds /mob/living/simple_animal/hostile/megafauna/proc/SetRecoveryTime(buffer_time, ranged_buffer_time) recovery_time = world.time + buffer_time diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index cee7e2979d..f2ece50af2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -59,6 +59,13 @@ if(3) adjustBruteLoss(110) +/mob/living/simple_animal/hostile/asteroid/basilisk/wave_ex_act(power, datum/wave_explosion/explosion, dir) + . = ..() + if(power > EXPLOSION_POWER_NORMAL_MOB_GIB) + gib() + else + adjustBruteLoss(EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, explosion.mob_damage_mod)) + //Watcher /mob/living/simple_animal/hostile/asteroid/basilisk/watcher name = "watcher" @@ -68,6 +75,7 @@ icon_living = "watcher" icon_aggro = "watcher" icon_dead = "watcher_dead" + health_doll_icon = "watcher" pixel_x = -10 throw_message = "bounces harmlessly off of" melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index ef51dc572f..5ee249c767 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -25,6 +25,7 @@ icon_aggro = "broodmother" icon_dead = "egg_sac" icon_gib = "syndicate_gib" + health_doll_icon = "broodmother" maxHealth = 800 health = 800 melee_damage_lower = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 032bc2d60d..4425bce532 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -24,6 +24,7 @@ icon_aggro = "herald" icon_dead = "herald_dying" icon_gib = "syndicate_gib" + health_doll_icon = "herald" maxHealth = 800 health = 800 melee_damage_lower = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index 6c13bb903e..dca508cfeb 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -24,6 +24,7 @@ icon_aggro = "legionnaire" icon_dead = "legionnaire_dead" icon_gib = "syndicate_gib" + health_doll_icon = "legionnaire" maxHealth = 800 health = 800 melee_damage_lower = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index e3a5d5f762..50b15933a9 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -24,6 +24,7 @@ icon_aggro = "pandora" icon_dead = "pandora_dead" icon_gib = "syndicate_gib" + health_doll_icon = "pandora" maxHealth = 800 health = 800 melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 446fe80c7d..7db91b50ad 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -253,6 +253,7 @@ icon_state = "legion" icon_living = "legion" icon_dead = "legion" + health_doll_icon = "legion" health = 450 maxHealth = 450 melee_damage_lower = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index 96418686d3..5750d1ecb9 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -6,6 +6,7 @@ icon_living = "clown" icon_dead = "clown_dead" icon_gib = "clown_gib" + health_doll_icon = "clown" //if >32x32, it will use this generic. for all the huge clown mobs that subtype from this mob_biotypes = MOB_ORGANIC|MOB_HUMANOID turns_per_move = 5 response_disarm_continuous = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 103868e1d3..df73516337 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -130,11 +130,11 @@ QDEL_NULL(sord) return ..() -/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/item/projectile/Proj) - if(prob(25)) - return ..() - visible_message("[src] blocks [Proj] with its shield!") - return BULLET_ACT_BLOCK +/mob/living/simple_animal/hostile/syndicate/melee/sword/bullet_act(obj/item/projectile/Proj) + if(prob(50)) + visible_message("[src] blocks [Proj] with its shield!") + return BULLET_ACT_BLOCK + return ..() /mob/living/simple_animal/hostile/syndicate/melee/sword/space icon_state = "syndicate_space_sword" diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 46a5a8ec68..0e106caf46 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -6,6 +6,7 @@ icon_living = "pine_1" icon_dead = "pine_1" icon_gib = "pine_1" + health_doll_icon = "pine_1" gender = NEUTER speak_chance = 0 turns_per_move = 5 @@ -72,5 +73,6 @@ icon_living = "festivus_pole" icon_dead = "festivus_pole" icon_gib = "festivus_pole" + health_doll_icon = "festivus_pole" loot = list(/obj/item/stack/rods) speak_emote = list("polls") diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index bce1a01c8a..f10b184a45 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -8,6 +8,7 @@ icon_aggro = "Fugu0" icon_dead = "Fugu_dead" icon_gib = "syndicate_gib" + health_doll_icon = "Fugu0" mob_biotypes = MOB_ORGANIC|MOB_BEAST mouse_opacity = MOUSE_OPACITY_ICON move_to_delay = 5 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 5fa6a0c22d..e46c57f245 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -7,6 +7,7 @@ ///How much blud it has for bloodsucking blood_volume = 550 rad_flags = RAD_NO_CONTAMINATE + hud_type = /datum/hud/living/simple_animal status_flags = CANPUSH diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index b925c67940..49821e55e0 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -158,12 +158,12 @@ return FALSE size_x = clamp(size_x, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT) size_y = clamp(size_y, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT) - var/list/desc = list("This is a photo of an area of [size_x+1] meters by [size_y+1] meters.") + var/list/desc = list("This is a photo of an area of [size_x*2 + 1] meters by [size_y*2 + 1] meters.") var/ai_user = isAI(user) var/list/seen - var/list/viewlist = (user && user.client)? getviewsize(user.client.view) : getviewsize(world.view) + var/list/viewlist = user?.client? getviewsize(user.client.view) : getviewsize(world.view) var/viewr = max(viewlist[1], viewlist[2]) + max(size_x, size_y) - var/viewc = user.client? user.client.eye : target + var/viewc = user?.client? user.client.eye : target seen = get_hear(viewr, viewc) var/list/turfs = list() var/list/mobs = list() @@ -184,7 +184,7 @@ var/psize_y = (size_y * 2 + 1) * world.icon_size var/get_icon = camera_get_icon(turfs, target_turf, psize_x, psize_y, clone_area, size_x, size_y, (size_x * 2 + 1), (size_y * 2 + 1)) qdel(clone_area) - var/icon/temp = icon('icons/effects/96x96.dmi',"") + var/icon/temp = icon('icons/effects/camera_image_base.dmi',"") temp.Blend("#000", ICON_OVERLAY) temp.Scale(psize_x, psize_y) temp.Blend(get_icon, ICON_OVERLAY) diff --git a/code/modules/photography/camera/camera_image_capturing.dm b/code/modules/photography/camera/camera_image_capturing.dm index 5bd9c108d1..a5a1cbeedc 100644 --- a/code/modules/photography/camera/camera_image_capturing.dm +++ b/code/modules/photography/camera/camera_image_capturing.dm @@ -47,7 +47,7 @@ atoms += A CHECK_TICK - var/icon/res = icon('icons/effects/96x96.dmi', "") + var/icon/res = icon('icons/effects/camera_image_base.dmi', "") res.Scale(psize_x, psize_y) var/list/sorted = list() @@ -64,7 +64,6 @@ var/xcomp = FLOOR(psize_x / 2, 1) - 15 var/ycomp = FLOOR(psize_y / 2, 1) - 15 - for(var/atom/A in sorted) var/xo = (A.x - center.x) * world.icon_size + A.pixel_x + xcomp var/yo = (A.y - center.y) * world.icon_size + A.pixel_y + ycomp diff --git a/code/modules/pool/pool_controller.dm b/code/modules/pool/pool_controller.dm index 9f670de282..142690566b 100644 --- a/code/modules/pool/pool_controller.dm +++ b/code/modules/pool/pool_controller.dm @@ -235,10 +235,10 @@ if(POOL_SCALDING) //Scalding M.adjust_bodytemperature(50,0,500) if(POOL_WARM) //Warm - M.adjust_bodytemperature(20,0,360) //Heats up mobs till the termometer shows up + M.adjust_bodytemperature(20,0,360) //Heats up mobs till the thermometer shows up //Normal temp does nothing, because it's just room temperature water. if(POOL_COOL) - M.adjust_bodytemperature(-20,250) //Cools mobs till the termometer shows up + M.adjust_bodytemperature(-20,250) //Cools mobs till the thermometer shows up if(POOL_FRIGID) //Freezing M.adjust_bodytemperature(-60) //cool mob at -35k per cycle, less would not affect the mob enough. if(M.bodytemperature <= 50 && !M.stat) @@ -290,10 +290,10 @@ /obj/machinery/pool/controller/proc/update_temp() if(mist_state) - if(temperature < POOL_SCALDING) + if(temperature < POOL_WARM) mist_off() else - if(temperature == POOL_SCALDING) + if(temperature >= POOL_WARM) mist_on() update_icon() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 92aa95bfb7..9cc289b06d 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -152,7 +152,7 @@ else //dot product of sun and panel -- Lambert's Cosine Law cur_pow = cos(azimuth_current - sun_azimuth) * sun.power_mod - cur_pow = clamp(round(cur_pow, 0.01), 0, 1) + cur_pow = clamp(round(cur_pow, 0.01), 0, sun.power_mod) total_flux += cur_pow /obj/machinery/power/solar/process() diff --git a/code/modules/projectiles/ammunition/special/syringe.dm b/code/modules/projectiles/ammunition/special/syringe.dm index 10e4402856..caf5da3562 100644 --- a/code/modules/projectiles/ammunition/special/syringe.dm +++ b/code/modules/projectiles/ammunition/special/syringe.dm @@ -25,7 +25,7 @@ /obj/item/ammo_casing/chemgun name = "dart synthesiser" desc = "A high-power spring, linked to an energy-based dart synthesiser." - projectile_type = /obj/item/projectile/bullet/dart + projectile_type = /obj/item/projectile/bullet/dart/piercing firing_effect_type = null /obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") @@ -35,7 +35,7 @@ var/obj/item/gun/chem/CG = loc if(CG.syringes_left <= 0) return - CG.reagents.trans_to(BB, 15) + CG.reagents.trans_to(BB, 10) BB.name = "chemical dart" CG.syringes_left-- ..() diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 70058801f8..1f1cc10459 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -60,6 +60,13 @@ desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with." ammo_type = /obj/item/ammo_casing/c38/match +/obj/item/ammo_box/g4570 + name = "ammo box (.45-70 GOVT)" + desc = "Brought to you at great expense,this box contains 10 more .45-70 GOVT bullets." + ammo_type = /obj/item/ammo_casing/g4570 + icon_state = "45box" + max_ammo = 10 + /obj/item/ammo_box/c9mm name = "ammo box (9mm)" icon_state = "9mmbox" diff --git a/code/modules/projectiles/boxes_magazines/internal/derringer.dm b/code/modules/projectiles/boxes_magazines/internal/derringer.dm index cc86549793..dad8386178 100644 --- a/code/modules/projectiles/boxes_magazines/internal/derringer.dm +++ b/code/modules/projectiles/boxes_magazines/internal/derringer.dm @@ -3,28 +3,17 @@ ammo_type = /obj/item/ammo_casing/c38 caliber = "38" max_ammo = 2 - multiload = FALSE - -/obj/item/ammo_box/magazine/internal/derringer/ammo_count(countempties = 1) - if (!countempties) - var/boolets = 0 - for(var/obj/item/ammo_casing/bullet in stored_ammo) - if(bullet.BB) - boolets++ - return boolets - else - return ..() /obj/item/ammo_box/magazine/internal/derringer/a357 name = "\improper derringer muzzle" ammo_type = /obj/item/ammo_casing/a357 caliber = "357" max_ammo = 2 - multiload = FALSE + multiload = 0 /obj/item/ammo_box/magazine/internal/derringer/g4570 name = "\improper derringer muzzle" ammo_type = /obj/item/ammo_casing/g4570 caliber = "45-70g" max_ammo = 2 - multiload = FALSE + multiload = 0 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 63d019f97f..06bf298454 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -568,12 +568,18 @@ /datum/action/item_action/toggle_scope_zoom/IsAvailable(silent = FALSE) . = ..() if(!.) + var/obj/item/gun/G = target + G.zoom(owner, owner.dir, FALSE) + +/datum/action/item_action/toggle_scope_zoom/Trigger() + . = ..() + if(.) var/obj/item/gun/G = target G.zoom(owner, owner.dir) /datum/action/item_action/toggle_scope_zoom/Remove(mob/living/L) var/obj/item/gun/G = target - G.zoom(L, L.dir) + G.zoom(L, L.dir, FALSE) return ..() /obj/item/gun/proc/rotate(atom/thing, old_dir, new_dir) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index e8d53ddeb8..a3985c8f42 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -407,11 +407,11 @@ fire_sound = 'sound/weapons/rifleshot.ogg' weapon_weight = WEAPON_HEAVY mag_type = /obj/item/ammo_box/magazine/m10mm/rifle - fire_delay = 30 + fire_delay = 10 burst_size = 1 can_unsuppress = TRUE can_suppress = TRUE - w_class = WEIGHT_CLASS_HUGE + w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK automatic_burst_overlay = FALSE actions_types = list() diff --git a/code/modules/projectiles/guns/ballistic/derringer.dm b/code/modules/projectiles/guns/ballistic/derringer.dm index a88a11b416..47213f17df 100644 --- a/code/modules/projectiles/guns/ballistic/derringer.dm +++ b/code/modules/projectiles/guns/ballistic/derringer.dm @@ -3,16 +3,14 @@ desc = "A easily concealable derringer. Uses .38 ammo" icon = 'icons/obj/guns/projectile.dmi' icon_state = "derringer" + flags_1 = CONDUCT_1 mag_type = /obj/item/ammo_box/magazine/internal/derringer + fire_delay = 5 obj_flags = UNIQUE_RENAME fire_sound = 'sound/weapons/revolvershot.ogg' casing_ejector = FALSE w_class = WEIGHT_CLASS_TINY -/obj/item/gun/ballistic/derringer/Initialize() - ..() - transform *= 0.8 //Spriter too lazy to make icons smaller than default revolvers, local coder hacks in solution. - /obj/item/gun/ballistic/derringer/get_ammo(countchambered = FALSE, countempties = TRUE) var/boolets = 0 //legacy var name maturity if (chambered && countchambered) @@ -27,7 +25,7 @@ return var/num_loaded = magazine.attackby(A, user, params, 1) if(num_loaded) - to_chat(user, "You load [num_loaded] shell\s into \the [src].") + to_chat(user, "You load [num_loaded] bullet\s into \the [src].") playsound(user, 'sound/weapons/bulletinsert.ogg', 60, 1) A.update_icon() update_icon() diff --git a/code/modules/projectiles/guns/misc/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm index dcabc13989..779ab64bc2 100644 --- a/code/modules/projectiles/guns/misc/chem_gun.dm +++ b/code/modules/projectiles/guns/misc/chem_gun.dm @@ -13,9 +13,9 @@ custom_materials = list(/datum/material/iron=2000) clumsy_check = FALSE fire_sound = 'sound/items/syringeproj.ogg' - var/time_per_syringe = 250 - var/syringes_left = 4 - var/max_syringes = 4 + var/time_per_syringe = 300 + var/syringes_left = 5 + var/max_syringes = 5 var/last_synth = 0 /obj/item/gun/chem/Initialize() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index d92f969b0a..d4d8ae47fe 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -210,7 +210,7 @@ to_chat(usr, "ERROR: Cannot replicate virus strain.") return A = A.Copy() - var/list/data = list("viruses" = list(A)) + var/list/data = list("donor"=null,"viruses"=list(A),"blood_DNA"="REPLICATED", "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) var/obj/item/reagent_containers/glass/bottle/B = new(drop_location()) B.name = "[A.name] culture bottle" B.desc = "A small bottle. Contains [A.agent] culture in synthblood medium." diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index aae21464b1..2882a85b5e 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -360,6 +360,18 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." pH = 3.5 +/datum/reagent/consumable/ethanol/amaretto + name = "Amaretto" + description = "A gentle drink that carries a sweet aroma." + color = "#E17600" + boozepwr = 25 + taste_description = "fruity and nutty sweetness" + glass_icon_state = "amarettoglass" + shot_glass_icon_state = "shotglassgold" + glass_name = "glass of amaretto" + glass_desc = "A sweet and syrupy-looking drink." + pH = 3.5 + /datum/reagent/consumable/ethanol/cognac name = "Cognac" description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication." @@ -1490,6 +1502,25 @@ All effects don't start immediately, but rather get worse over time; the rate is M.stuttering = min(M.stuttering + 3, 3) ..() +/datum/reagent/consumable/ethanol/pinotmort + name = "Pinot Mort" + description = "If you just can't get enough of lavaland." + color = rgb(167, 36, 36) + boozepwr = 20 + quality = DRINK_FANTASTIC + taste_description = "death, ash and lizards" + glass_icon_state = "pinotmort" + glass_name = "Pinot Mort" + glass_desc = "The taste of Lavaland served in a legion skull. You feel like you might regret drinking this." + value = REAGENT_VALUE_UNCOMMON + +/datum/reagent/consumable/ethanol/pinotmort/on_mob_life(mob/living/carbon/M) + if((islizard(M) && M.mind.assigned_role == "Ash Walker") || ispodperson(M) && M.mind.assigned_role == "Lifebringer" || isgolem(M)) + M.heal_bodypart_damage(1, 1) + M.adjustBruteLoss(-2,0) + . = 1 + return ..() + /datum/reagent/consumable/ethanol/triple_sec name = "Triple Sec" description = "A sweet and vibrant orange liqueur." @@ -1771,6 +1802,50 @@ All effects don't start immediately, but rather get worse over time; the rate is to_chat(L,"You notice [mighty_shield] looks worn again. Weird.") ..() +/datum/reagent/consumable/ethanol/amaretto_alexander + name = "Amaretto Alexander" + description = "A weaker version of the Alexander, what it lacks in strength it makes up for in flavor." + color = "#DBD5AE" + boozepwr = 35 + quality = DRINK_VERYGOOD + taste_description = "sweet, creamy cacao" + glass_icon_state = "alexanderam" + glass_name = "Amaretto Alexander" + glass_desc = "A creamy, indulgent delight that is in fact as gentle as it seems." + +/datum/reagent/consumable/ethanol/ginger_amaretto + name = "Ginger Amaretto" + description = "A delightfully simple cocktail that pleases the senses." + boozepwr = 30 + color = "#EFB42A" + quality = DRINK_GOOD + taste_description = "sweetness followed by a soft sourness and warmth" + glass_icon_state = "gingeramaretto" + glass_name = "Ginger Amaretto" + glass_desc = "The sprig of rosemary adds a nice aroma to the drink, and isn't just to be pretentious afterall!" + +/datum/reagent/consumable/ethanol/godfather + name = "Godfather" + description = "A rough cocktail with illegal connections." + boozepwr = 50 + color = "#E68F00" + quality = DRINK_GOOD + taste_description = "a delightful softened punch" + glass_icon_state = "godfather" + glass_name = "Godfather" + glass_desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth." + +/datum/reagent/consumable/ethanol/godmother + name = "Godmother" + description = "A twist on a classic, liked more by mature women." + boozepwr = 50 + color = "#E68F00" + quality = DRINK_GOOD + taste_description = "sweetness and a zesty twist" + glass_icon_state = "godmother" + glass_name = "Godmother" + glass_desc = "A lovely fresh-smelling cocktail, a true Sicilian delight." + /datum/reagent/consumable/ethanol/sidecar name = "Sidecar" description = "The one ride you'll gladly give up the wheel for." diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index be631513bd..9b8ff7b262 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -26,7 +26,7 @@ create_reagents(volume, reagent_flags, reagent_value) if(spawned_disease) var/datum/disease/F = new spawned_disease() - var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY","viruses"= list(F)) + var/list/data = list("donor"=null,"viruses"=list(F),"blood_DNA"="REPLICATED", "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) reagents.add_reagent(/datum/reagent/blood, disease_amount, data) add_initial_reagents() diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 5d68d00200..be8c7fac36 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -44,6 +44,26 @@ desc = "A small bottle. Contains epinephrine - used to stabilize patients." list_reagents = list(/datum/reagent/medicine/epinephrine = 30) +/obj/item/reagent_containers/glass/bottle/bicaridine + name = "bicaridine bottle" + desc = "A small bottle. Contains bicaridine - used to treat brute damage." + list_reagents = list(/datum/reagent/medicine/bicaridine = 30) + +/obj/item/reagent_containers/glass/bottle/kelotane + name = "kelotane bottle" + desc = "A small bottle. Contains kelotane - used to treat burn damage." + list_reagents = list(/datum/reagent/medicine/kelotane = 30) + +/obj/item/reagent_containers/glass/bottle/antitoxin + name = "anti-toxin bottle" + desc = "A small bottle. Contains anti-toxin - used to treat minor poisoning." + list_reagents = list(/datum/reagent/medicine/antitoxin = 30) + +/obj/item/reagent_containers/glass/bottle/dexalin + name = "dexalin bottle" + desc = "A small bottle. Contains dexalin - used to treat minor suffocation." + list_reagents = list(/datum/reagent/medicine/dexalin = 30) + /obj/item/reagent_containers/glass/bottle/toxin name = "toxin bottle" desc = "A small bottle of toxins. Do not drink, it is poisonous." diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm index 574c7c9282..76b016e3de 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm @@ -13,6 +13,14 @@ build_path = /obj/item/kitchen/knife category = list("initial","Dinnerware") +/datum/design/efink + name = "E-Fink" + id = "efink" + build_type = AUTOLATHE | NO_PUBLIC_LATHE + materials = list(/datum/material/iron = 12000) + build_path = /obj/item/kitchen/efink + category = list("initial","Dinnerware") + /datum/design/fork name = "Fork" id = "fork" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index e45434cec4..bb5989e5c6 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -644,66 +644,109 @@ //Cybernetic organs /datum/design/cybernetic_liver - name = "Cybernetic Liver" - desc = "A cybernetic liver" + name = "Basic Cybernetic Liver" + desc = "A basic cybernetic liver." id = "cybernetic_liver" build_type = PROTOLATHE | MECHFAB + construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/organ/liver/cybernetic - category = list("Misc","Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/cybernetic_heart - name = "Cybernetic Heart" - desc = "A cybernetic heart" - id = "cybernetic_heart" - build_type = PROTOLATHE | MECHFAB - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/organ/heart/cybernetic - category = list("Misc","Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/cybernetic_heart_u - name = "Upgraded Cybernetic Heart" - desc = "An upgraded cybernetic heart" - id = "cybernetic_heart_u" - build_type = PROTOLATHE | MECHFAB - construction_time = 50 - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500) - build_path = /obj/item/organ/heart/cybernetic/upgraded category = list("Misc", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL -/datum/design/cybernetic_liver_u - name = "Upgraded Cybernetic Liver" - desc = "An upgraded cybernetic liver" - id = "cybernetic_liver_u" - build_type = PROTOLATHE | MECHFAB +/datum/design/cybernetic_liver/tier2 + name = "Cybernetic Liver" + desc = "A cybernetic liver." + id = "cybernetic_liver_tier2" materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/organ/liver/cybernetic/upgraded - category = list("Misc","Medical Designs") + build_path = /obj/item/organ/liver/cybernetic/tier2 + +/datum/design/cybernetic_liver/tier3 + name = "Upgraded Cybernetic Liver" + desc = "An upgraded cybernetic liver." + id = "cybernetic_liver_tier3" + construction_time = 50 + materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/diamond = 2000) + build_path = /obj/item/organ/liver/cybernetic/tier3 + +/datum/design/cybernetic_heart + name = "Basic Cybernetic Heart" + desc = "A basic cybernetic heart." + id = "cybernetic_heart" + build_type = PROTOLATHE | MECHFAB + construction_time = 40 + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/organ/heart/cybernetic + category = list("Misc", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/cybernetic_heart/tier2 + name = "Cybernetic Heart" + desc = "A cybernetic heart." + id = "cybernetic_heart_tier2" + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/organ/heart/cybernetic/tier2 + +/datum/design/cybernetic_heart/tier3 + name = "Upgraded Cybernetic Heart" + desc = "An upgraded cybernetic heart." + id = "cybernetic_heart_tier3" + construction_time = 50 + materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/diamond = 2000) + build_path = /obj/item/organ/heart/cybernetic/tier3 + /datum/design/cybernetic_lungs - name = "Cybernetic Lungs" - desc = "A pair of cybernetic lungs." + name = "Basic Cybernetic Lungs" + desc = "A basic pair of cybernetic lungs." id = "cybernetic_lungs" build_type = PROTOLATHE | MECHFAB + construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/organ/lungs/cybernetic - category = list("Misc","Medical Designs") + category = list("Misc", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL -/datum/design/cybernetic_lungs_u +/datum/design/cybernetic_lungs/tier2 + name = "Cybernetic Lungs" + desc = "A pair of cybernetic lungs." + id = "cybernetic_lungs_tier2" + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/organ/lungs/cybernetic/tier2 + +/datum/design/cybernetic_lungs/tier3 name = "Upgraded Cybernetic Lungs" desc = "A pair of upgraded cybernetic lungs." - id = "cybernetic_lungs_u" + id = "cybernetic_lungs_tier3" + construction_time = 50 + materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/diamond = 2000) + build_path = /obj/item/organ/lungs/cybernetic/tier3 + +/datum/design/cybernetic_stomach + name = "Basic Cybernetic Stomach" + desc = "A basic cybernetic stomach." + id = "cybernetic_stomach" build_type = PROTOLATHE | MECHFAB - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500) - build_path = /obj/item/organ/lungs/cybernetic/upgraded - category = list("Misc","Medical Designs") + construction_time = 40 + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/organ/stomach/cybernetic + category = list("Misc", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/cybernetic_stomach/tier2 + name = "Cybernetic Stomach" + desc = "A cybernetic stomach." + id = "cybernetic_stomach_tier2" + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/organ/stomach/cybernetic/tier2 + +/datum/design/cybernetic_stomach/tier3 + name = "Upgraded Cybernetic Stomach" + desc = "An upgraded cybernetic stomach." + id = "cybernetic_stomach_tier3" + construction_time = 50 + materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/diamond = 2000) + build_path = /obj/item/organ/stomach/cybernetic/tier3 + /datum/design/cybernetic_tongue name = "Cybernetic tongue" desc = "A fancy cybernetic tongue." @@ -711,7 +754,7 @@ build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/organ/tongue/cybernetic - category = list("Misc","Medical Designs") + category = list("Misc", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_ears diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index d3cf755de2..946dec3f49 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -254,14 +254,14 @@ software_error() /datum/nanite_program/proc/on_shock(shock_damage) - if(!program_flags & NANITE_SHOCK_IMMUNE) + if(!(program_flags & NANITE_SHOCK_IMMUNE)) if(prob(10)) software_error() else if(prob(33)) self_destruct() /datum/nanite_program/proc/on_minor_shock() - if(!program_flags & NANITE_SHOCK_IMMUNE) + if(!(program_flags & NANITE_SHOCK_IMMUNE)) if(prob(10)) software_error() diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm index 0eca3ea877..1d7d579dad 100644 --- a/code/modules/research/techweb/nodes/medical_nodes.dm +++ b/code/modules/research/techweb/nodes/medical_nodes.dm @@ -67,20 +67,27 @@ design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) +/datum/techweb_node/basic_cyber_organs + id = "basic_cyber_organs" + starting_node = TRUE + display_name = "Basic Cybernetic Organs" + description = "We have the techinology to force him to live a disgusting halflife." + design_ids = list("cybernetic_liver", "cybernetic_heart", "cybernetic_lungs", "cybernetic_stomach") + /datum/techweb_node/cyber_organs id = "cyber_organs" display_name = "Cybernetic Organs" description = "We have the technology to rebuild him." - prereq_ids = list("adv_biotech") - design_ids = list("cybernetic_ears", "cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", "cybernetic_tongue") + prereq_ids = list("biotech") + design_ids = list("cybernetic_ears", "cybernetic_heart_tier2", "cybernetic_liver_tier2", "cybernetic_lungs_tier2", "cybernetic_stomach_tier2") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) /datum/techweb_node/cyber_organs_upgraded id = "cyber_organs_upgraded" display_name = "Upgraded Cybernetic Organs" description = "We have the technology to upgrade him." - prereq_ids = list("cyber_organs") - design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u", "ipc_stomach") + prereq_ids = list("adv_biotech", "cyber_organs") + design_ids = list("cybernetic_ears_u", "cybernetic_heart_tier3", "cybernetic_liver_tier3", "cybernetic_lungs_tier3", "cybernetic_stomach_tier3") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) /datum/techweb_node/cyber_implants diff --git a/code/modules/research/techweb/nodes/syndicate_nodes.dm b/code/modules/research/techweb/nodes/syndicate_nodes.dm index e659e49ac7..5a3c0f541f 100644 --- a/code/modules/research/techweb/nodes/syndicate_nodes.dm +++ b/code/modules/research/techweb/nodes/syndicate_nodes.dm @@ -21,7 +21,7 @@ id = "advanced_illegal_ballistics" display_name = "Advanced Non-Standard Ballistics" description = "Ballistic ammunition for non-standard firearms. Usually the ones you don't have nor want to be involved with." - design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","sl357ap","pistolm9mm","m45","bolt_clip") + design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","sl357ap","pistolm9mm","m45","bolt_clip","m10apbox","m10firebox","m10hpbox") prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns from traitors, space, or anything in between. diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index 9d91b6534d..7a05583071 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -108,5 +108,8 @@ /obj/effect/dummy/phased_mob/spell_jaunt/ex_act(blah) return +/obj/effect/dummy/phased_mob/spell_jaunt/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /obj/effect/dummy/phased_mob/spell_jaunt/bullet_act(blah) return BULLET_ACT_FORCE_PIERCE diff --git a/code/modules/spells/spell_types/shadow_walk.dm b/code/modules/spells/spell_types/shadow_walk.dm index 1dd949caa0..821bf73425 100644 --- a/code/modules/spells/spell_types/shadow_walk.dm +++ b/code/modules/spells/spell_types/shadow_walk.dm @@ -56,9 +56,9 @@ /obj/effect/dummy/phased_mob/shadow/proc/check_light_level() var/turf/T = get_turf(src) var/light_amount = T.get_lumcount() - if(light_amount > 0.2) // jaunt ends + if(light_amount > 0.4) // jaunt ends end_jaunt(TRUE) - else if (light_amount < 0.2 && (!QDELETED(jaunter))) //heal in the dark + else if (light_amount < 0.4 && (!QDELETED(jaunter))) //heal in the dark jaunter.heal_overall_damage(1,1) /obj/effect/dummy/phased_mob/shadow/proc/end_jaunt(forced = FALSE) @@ -90,6 +90,9 @@ /obj/effect/dummy/phased_mob/shadow/ex_act() return +/obj/effect/dummy/phased_mob/shadow/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /obj/effect/dummy/phased_mob/shadow/bullet_act() return BULLET_ACT_FORCE_PIERCE diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 6d489ab180..ae6b73d3f7 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -49,10 +49,11 @@ var/species_color = "" var/mutation_color = "" var/no_update = 0 - var/body_markings = "" //for bodypart markings - var/body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi' + var/body_markings = "" //for bodypart markings, deprecated + var/list/body_markings_list // stores body markings as lists, with the first value being the name of the bodypart, the second value being the name of the marking, and the third being the colour + var/marking_value // combination of old aux_marking and body_marking variables as they were always set together to the same value + var/static/default_body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi' var/list/markings_color = list() - var/aux_marking var/digitigrade_type var/animal_origin = null //for nonhuman bodypart (e.g. monkey) @@ -623,6 +624,7 @@ //we inform the bodypart of the changes that happened to the owner, or give it the informations from a source mob. /obj/item/bodypart/proc/update_limb(dropping_limb, mob/living/carbon/source) + body_markings_list = list() var/mob/living/carbon/C if(source) C = source @@ -641,8 +643,7 @@ color_src = FALSE base_bp_icon = DEFAULT_BODYPART_ICON no_update = TRUE - body_markings = "husk" // reeee - aux_marking = "husk" + marking_value = "husk" if(no_update) return @@ -658,11 +659,7 @@ //body marking memes var/list/colorlist = list() - //var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) colorlist.Cut() - //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor"]]00") - //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") - //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_tertiary"]]00") : ReadRGB("[H.dna.features["mcolor3"]]00") colorlist += ReadRGB("[H.dna.features["mcolor"]]00") colorlist += ReadRGB("[H.dna.features["mcolor2"]]00") colorlist += ReadRGB("[H.dna.features["mcolor3"]]00") @@ -697,21 +694,31 @@ else digitigrade_type = null - if(S.mutant_bodyparts["mam_body_markings"]) - var/datum/sprite_accessory/Smark - Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]] - if(Smark) - body_markings_icon = Smark.icon - if(H.dna.features["mam_body_markings"] != "None") - body_markings = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"]) - aux_marking = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"]) - else - body_markings = "plain" - aux_marking = "plain" + if(S.mutant_bodyparts["mam_body_markings"]) // checks if the species can actually have body markings + // get all markings for this bodypart type + for(var/list/marking in H.dna.features["mam_body_markings"]) + // marking is a list containing bodypart type, bodymarking name, and then the colour (colour won't be used in v1) + if(marking[1] == body_part) + var/datum/sprite_accessory/Smark + Smark = GLOB.mam_body_markings_list[marking[2]] + var/body_markings_icon = default_body_markings_icon + if(Smark) + body_markings_icon = Smark.icon + var/marking_value = "" // combination of body and aux markings from old system + if(H.dna.features["mam_body_markings"] != "None") + marking_value = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"]) + else + marking_value = "plain" + var/list/color_values + if(length(marking) == 3) + color_values = marking[3] + else + color_values = list("#FFFFFF", "#FFFFFF", "#FFFFFF") + body_markings_list += list(list(body_markings_icon, marking_value, color_values)) + markings_color = list(colorlist) else - body_markings = null - aux_marking = null + marking_value = null if(S.override_bp_icon) base_bp_icon = S.override_bp_icon @@ -737,8 +744,7 @@ if(is_robotic_limb()) dmg_overlay_type = "robotic" if(is_robotic_limb(FALSE)) - body_markings = null - aux_marking = null + marking_value = null if(dropping_limb) no_update = TRUE //when attached, the limb won't be affected by the appearance changes of its mob owner. @@ -774,17 +780,18 @@ . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir) if(!isnull(body_markings) && is_organic_limb(FALSE)) - if(!use_digitigrade) - if(body_zone == BODY_ZONE_CHEST) - . += image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) + for(var/list/marking_list in body_markings_list) + // marking stores icon and value for the specific bodypart + if(!use_digitigrade) + if(body_zone == BODY_ZONE_CHEST) + . += image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) + else + . += image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir) else - . += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) - else - . += image(body_markings_icon, "[body_markings]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) + . += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir) var/list/aux = list() - var/image/marking var/list/auxmarking = list() . += limb @@ -804,6 +811,7 @@ if((body_zone != BODY_ZONE_HEAD && body_zone != BODY_ZONE_CHEST)) should_draw_gender = FALSE + var/list/markings_list = list() if(is_organic_limb()) limb.icon = base_bp_icon || 'icons/mob/human_parts.dmi' if(should_draw_gender) @@ -817,21 +825,26 @@ limb.icon_state = "[species_id]_[body_zone]" // Body markings - if(!isnull(body_markings)) + if(length(body_markings_list)) if(species_id == "husk") - marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) + . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) else if(species_id == "husk" && use_digitigrade) - marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) - - else if(!use_digitigrade) - if(body_zone == BODY_ZONE_CHEST) - marking = image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) - else - marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) + . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) else - marking = image(body_markings_icon, "[body_markings]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) + for(var/list/marking_list in body_markings_list) + // marking stores icon and value for the specific bodypart + if(!use_digitigrade) + if(body_zone == BODY_ZONE_CHEST) + markings_list.Add(image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)) + else + markings_list.Add(image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir)) + else + markings_list.Add(image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)) - . += marking + if(color_src && length(marking_list) == 3) + var/image/I = markings_list[length(markings_list)] + I.color = marking_list[3] + . += markings_list // Citadel End @@ -839,11 +852,14 @@ for(var/I in aux_icons) var/aux_layer = aux_icons[I] aux += image(limb.icon, "[species_id]_[I]", -aux_layer, image_dir) - if(!isnull(aux_marking)) - if(species_id == "husk") - auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir) - else - auxmarking += image(body_markings_icon, "[body_markings]_[I]", -aux_layer, image_dir) + if(species_id == "husk") + auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir) + else + for(var/marking_list in body_markings_list) + var/image/aux_marking_image = image(marking_list[1], "[marking_list[2]]_[I]", -aux_layer, image_dir) + if(length(marking_list) == 3) + aux_marking_image.color = marking_list[3] + auxmarking += aux_marking_image . += aux . += auxmarking @@ -858,31 +874,35 @@ for(var/I in aux_icons) var/aux_layer = aux_icons[I] aux += image(limb.icon, "[I]", -aux_layer, image_dir) - if(!isnull(aux_marking)) - if(species_id == "husk") - auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir) - else - auxmarking += image(body_markings_icon, "[body_markings]_[I]", -aux_layer, image_dir) + if(species_id == "husk") + auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir) + else + for(var/marking_list in body_markings_list) + var/image/aux_marking_image = image(marking_list[1], "[marking_list[2]]_[I]", -aux_layer, image_dir) + if(length(marking_list) == 3) + aux_marking_image.color = marking_list[3] + auxmarking += aux_marking_image . += auxmarking . += aux - if(!isnull(body_markings)) + if(length(body_markings)) if(species_id == "husk") - marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) + . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) else if(species_id == "husk" && use_digitigrade) - marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) - - else if(!use_digitigrade) - if(body_zone == BODY_ZONE_CHEST) - marking = image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) - else - marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) + . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) else - marking = image(body_markings_icon, "[body_markings]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) - . += marking + for(var/list/marking_list in body_markings_list) + // marking stores icon and value for the specific bodypart + if(!use_digitigrade) + if(body_zone == BODY_ZONE_CHEST) + . += image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) + else + . += image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir) + else + . += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) return - if(color_src) //TODO - add color matrix support for base species limbs + if(color_src) //TODO - add color matrix support for base species limbs (or dont because color matrixes suck) var/draw_color = mutation_color || species_color var/grayscale = FALSE if(!draw_color) @@ -900,20 +920,15 @@ if(grayscale) I.icon_state += "_g" I.color = draw_color - if(!isnull(aux_marking)) - for(var/a in auxmarking) - var/image/I = a - if(species_id == "husk") - I.color = "#141414" - else - I.color = list(markings_color) + for(var/a in auxmarking) + var/image/I = a + if(species_id == "husk") + I.color = "#141414" if(!isnull(body_markings)) if(species_id == "husk") - marking.color = "#141414" - else - marking.color = list(markings_color) - + for(var/image/marking in markings_list) + marking.color = "#141414" /obj/item/bodypart/deconstruct(disassembled = TRUE) drop_organs() diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 4dba68ada3..6263284584 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -197,45 +197,67 @@ colour = "red" /obj/item/organ/heart/cybernetic - name = "cybernetic heart" - desc = "An electronic device designed to mimic the functions of an organic human heart. Offers no benefit over an organic heart other than being easy to make." + name = "basic cybernetic heart" + desc = "A basic electronic device designed to mimic the functions of an organic human heart." icon_state = "heart-c" organ_flags = ORGAN_SYNTHETIC + maxHealth = STANDARD_ORGAN_THRESHOLD*0.75 //This also hits defib timer, so a bit higher than its less important counterparts + + var/dose_available = FALSE + var/rid = /datum/reagent/medicine/epinephrine + var/ramount = 10 + var/emp_vulnerability = 1 //The value the severity of emps are divided by to determine the likelihood of permanent damage. + +/obj/item/organ/heart/cybernetic/tier2 + name = "cybernetic heart" + desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma." + icon_state = "heart-c-u" + maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD + dose_available = TRUE + emp_vulnerability = 2 + +/obj/item/organ/heart/cybernetic/tier3 + name = "upgraded cybernetic heart" + desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma. This upgraded model can regenerate its dose after use." + icon_state = "heart-c-u2" + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + dose_available = TRUE + rid = /datum/reagent/medicine/atropine + ramount = 5 + emp_vulnerability = 3 /obj/item/organ/heart/cybernetic/emp_act(severity) . = ..() + + // If the owner doesn't need a heart, we don't need to do anything with it. + if(!owner.needs_heart()) + return + if(. & EMP_PROTECT_SELF) return - Stop() - addtimer(CALLBACK(src, .proc/Restart), 0.2*severity SECONDS) - damage += severity + if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. + owner.Dizzy(10) + owner.losebreath += 10 + COOLDOWN_START(src, severe_cooldown, 20 SECONDS) + if(prob(severity/emp_vulnerability)) //Chance of permanent effects + organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. + Stop() + owner.visible_message("[owner] clutches at [owner.p_their()] chest as if [owner.p_their()] heart is stopping!", \ + "You feel a terrible pain in your chest, as if your heart has stopped!") + addtimer(CALLBACK(src, .proc/Restart), 10 SECONDS) -/obj/item/organ/heart/cybernetic/upgraded - name = "upgraded cybernetic heart" - desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma. This upgraded model can regenerate its dose after use." - icon_state = "heart-c-u" - maxHealth = 2 * STANDARD_ORGAN_THRESHOLD - - //I put it on upgraded for now. - var/dose_available = TRUE - var/rid = /datum/reagent/medicine/epinephrine - var/ramount = 10 - -/obj/item/organ/heart/cybernetic/upgraded/on_life() +/obj/item/organ/heart/cybernetic/on_life(delta_time, times_fired) . = ..() - if(!.) - return if(dose_available && owner.health <= owner.crit_threshold && !owner.reagents.has_reagent(rid)) - owner.reagents.add_reagent(rid, ramount) used_dose() - if(ramount < 10) //eats your nutrition to regen epinephrine - var/regen_amount = owner.nutrition/2000 - owner.adjust_nutrition(-regen_amount) - ramount += regen_amount -/obj/item/organ/heart/cybernetic/upgraded/proc/used_dose() +/obj/item/organ/heart/cybernetic/proc/used_dose() + owner.reagents.add_reagent(rid, ramount) + dose_available = FALSE + +/obj/item/organ/heart/cybernetic/tier3/used_dose() + . = ..() addtimer(VARSET_CALLBACK(src, dose_available, TRUE), 5 MINUTES) - ramount = 0 /obj/item/organ/heart/ipc name = "IPC heart" diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 749f5a8c38..2037547d36 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -98,23 +98,41 @@ icon_state = "liver-c" /obj/item/organ/liver/cybernetic - name = "cybernetic liver" + name = "basic cybernetic liver" icon_state = "liver-c" - desc = "An electronic device designed to mimic the functions of a human liver. It has no benefits over an organic liver, but is easy to produce." + desc = "A very basic device designed to mimic the functions of a human liver. Handles toxins slightly worse than an organic liver." organ_flags = ORGAN_SYNTHETIC - maxHealth = 1.1 * STANDARD_ORGAN_THRESHOLD + toxTolerance = 0.3 * LIVER_DEFAULT_TOX_TOLERANCE //little less than 1u of toxin purging + toxLethality = 1.1 * LIVER_DEFAULT_TOX_LETHALITY + maxHealth = STANDARD_ORGAN_THRESHOLD*0.5 -/obj/item/organ/liver/cybernetic/upgraded - name = "upgraded cybernetic liver" + var/emp_vulnerability = 1 //The value the severity of emps are divided by to determine the likelihood of permanent damage. + +/obj/item/organ/liver/cybernetic/tier2 + name = "cybernetic liver" icon_state = "liver-c-u" - desc = "An upgraded version of the cybernetic liver, designed to improve upon organic livers. It is resistant to alcohol poisoning and is very robust at filtering toxins." + desc = "An electronic device designed to mimic the functions of a human liver. Handles toxins slightly better than an organic liver." + maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD + toxTolerance = 2 * LIVER_DEFAULT_TOX_TOLERANCE //6 units of toxin purging + toxLethality = 0.8 * LIVER_DEFAULT_TOX_LETHALITY //20% less damage than a normal liver + emp_vulnerability = 2 + +/obj/item/organ/liver/cybernetic/tier3 + name = "upgraded cybernetic liver" + icon_state = "liver-c-u2" + desc = "An upgraded version of the cybernetic liver, designed to improve further upon organic livers. It is resistant to alcohol poisoning and is very robust at filtering toxins." alcohol_tolerance = 0.001 maxHealth = 2 * STANDARD_ORGAN_THRESHOLD - toxTolerance = 15 //can shrug off up to 15u of toxins - toxLethality = 0.008 //20% less damage than a normal liver + toxTolerance = 5 * LIVER_DEFAULT_TOX_TOLERANCE //15 units of toxin purging + toxLethality = 0.4 * LIVER_DEFAULT_TOX_LETHALITY //60% less damage than a normal liver + emp_vulnerability = 3 /obj/item/organ/liver/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return - damage += severity + if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. + owner.adjustToxLoss(10) + COOLDOWN_START(src, severe_cooldown, 10 SECONDS) + if(prob(severity/emp_vulnerability)) //Chance of permanent effects + organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 083c71fda2..c94fb16add 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -547,33 +547,52 @@ maxHealth = INFINITY//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm /obj/item/organ/lungs/cybernetic - name = "cybernetic lungs" - desc = "A cybernetic version of the lungs found in traditional humanoid entities. It functions the same as an organic lung and is merely meant as a replacement." + name = "basic cybernetic lungs" + desc = "A basic cybernetic version of the lungs found in traditional humanoid entities." icon_state = "lungs-c" organ_flags = ORGAN_SYNTHETIC - maxHealth = 400 - safe_oxygen_min = 13 + maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5 -/obj/item/organ/lungs/cybernetic/emp_act() - . = ..() - if(. & EMP_PROTECT_SELF) - return - owner.losebreath = 20 - owner.adjustOrganLoss(ORGAN_SLOT_LUNGS, 25) + var/emp_vulnerability = 1 //The value the severity of emps are divided by to determine the likelihood of permanent damage. -/obj/item/organ/lungs/cybernetic/upgraded - name = "upgraded cybernetic lungs" - desc = "A more advanced version of the stock cybernetic lungs. They are capable of filtering out lower levels of toxins and carbon dioxide." +/obj/item/organ/lungs/cybernetic/tier2 + name = "cybernetic lungs" + desc = "A cybernetic version of the lungs found in traditional humanoid entities. Allows for greater intakes of oxygen than organic lungs, requiring slightly less pressure." icon_state = "lungs-c-u" - safe_toxins_max = 20 - safe_co2_max = 20 - safe_oxygen_max = 250 + maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD + safe_oxygen_min = 13 + safe_oxygen_max = 100 + emp_vulnerability = 2 + +/obj/item/organ/lungs/cybernetic/tier3 + name = "upgraded cybernetic lungs" + desc = "A more advanced version of the stock cybernetic lungs. Features the ability to filter out various airbourne toxins and carbon dioxide even at heavy levels." + icon_state = "lungs-c-u2" + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + safe_oxygen_min = 4 //You could literally be breathing the thinnest amount of oxygen and be fine + safe_oxygen_max = 250 //Or be in an enriched oxygen room for that matter + safe_toxins_max = 30 + safe_co2_max = 30 + SA_para_min = 30 + SA_sleep_min = 50 + BZ_trip_balls_min = 30 + emp_vulnerability = 3 cold_level_1_threshold = 200 cold_level_2_threshold = 140 cold_level_3_threshold = 100 maxHealth = 550 +/obj/item/organ/lungs/cybernetic/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. + owner.losebreath += 20 + COOLDOWN_START(src, severe_cooldown, 30 SECONDS) + if(prob(severity/emp_vulnerability)) //Chance of permanent effects + organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. + /obj/item/organ/lungs/ashwalker name = "ash lungs" desc = "blackened lungs identical from specimens recovered from lavaland, unsuited to higher air pressures." diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index cb4de69fbd..6cdeadcbb3 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -16,6 +16,7 @@ var/decay_factor = 0 //same as above but when without a living owner, set to 0 for generic organs var/high_threshold = STANDARD_ORGAN_THRESHOLD * 0.45 //when severe organ damage occurs var/low_threshold = STANDARD_ORGAN_THRESHOLD * 0.1 //when minor organ damage occurs + var/severe_cooldown //cooldown for severe effects, used for synthetic organ emp effects. ///Organ variables for determining what we alert the owner with when they pass/clear the damage thresholds var/prev_damage = 0 @@ -153,6 +154,9 @@ /obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing or synthetic if(organ_flags & ORGAN_FAILING || !owner) return FALSE + if(organ_flags & ORGAN_SYNTHETIC_EMP) //Synthetic organ has been emped, is now failing. + applyOrganDamage(maxHealth * decay_factor) + return if(!is_cold() && damage) ///Damage decrements by a percent of its maxhealth var/healing_amount = -(maxHealth * healing_factor) diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index ba7b950602..defb062f1a 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -93,6 +93,40 @@ icon_state = "stomach-p" desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen." +/obj/item/organ/stomach/cybernetic + name = "basic cybernetic stomach" + icon_state = "stomach-c" + desc = "A basic device designed to mimic the functions of a human stomach" + organ_flags = ORGAN_SYNTHETIC + maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5 + var/emp_vulnerability = 1 //The value the severity of emps are divided by to determine the likelihood of permanent damage. + +/obj/item/organ/stomach/cybernetic/tier2 + name = "cybernetic stomach" + icon_state = "stomach-c-u" + desc = "An electronic device designed to mimic the functions of a human stomach. Handles disgusting food a bit better." + maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD + disgust_metabolism = 2 + emp_vulnerability = 2 + +/obj/item/organ/stomach/cybernetic/tier3 + name = "upgraded cybernetic stomach" + icon_state = "stomach-c-u2" + desc = "An upgraded version of the cybernetic stomach, designed to improve further upon organic stomachs. Handles disgusting food very well." + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + disgust_metabolism = 3 + emp_vulnerability = 3 + +/obj/item/organ/stomach/cybernetic/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. + owner.vomit(stun = FALSE) + COOLDOWN_START(src, severe_cooldown, 10 SECONDS) + if(prob(severity/emp_vulnerability)) //Chance of permanent effects + organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. + /obj/item/organ/stomach/ipc name = "ipc cell" icon_state = "stomach-ipc" diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 0e6456e8b0..12e282200c 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -751,7 +751,6 @@ //phase 2 var/static/regex/awoo_words = regex("howl|awoo|bark") var/static/regex/nya_words = regex("nya|meow|mewl") - var/static/regex/sleep_words = regex("sleep|slumber|rest") var/static/regex/strip_words = regex("strip|derobe|nude|at ease|suit off") var/static/regex/walk_words = regex("slow down|walk") var/static/regex/run_words = regex("run|speed up") @@ -1096,17 +1095,6 @@ H.emote("me", EMOTE_VISIBLE, "lets out a nya!") E.cooldown += 1 - //SLEEP - else if((findtext(message, sleep_words))) - for(var/mob/living/carbon/C in listeners) - var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - switch(E.phase) - if(2 to INFINITY) - C.Sleeping(45 * power_multiplier) - E.cooldown += 10 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "Drowsiness suddenly overwhelms you as you fall asleep!"), 5) - to_chat(user, "You send [C] to sleep.") - //STRIP else if((findtext(message, strip_words))) for(var/V in listeners) diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index ab7dc91739..fd45ea37d9 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -51,7 +51,7 @@ Notes: /datum/tooltip/proc/show(atom/movable/thing, params = null, title = null, content = null, theme = "default", special = "none") if (!thing || !params || (!title && !content) || !owner || !isnum(world.icon_size)) - return 0 + return FALSE if (!init) //Initialize some vars init = 1 @@ -83,7 +83,7 @@ Notes: if (queueHide) hide() - return 1 + return TRUE /datum/tooltip/proc/hide() @@ -122,4 +122,33 @@ Notes: if(user.client && user.client.tooltips) user.client.tooltips.hide() +/** + * # `get_tooltip_data()` + * + * If set, will return a list for the tooltip (that will also be put together in a `Join()`) + * However, if returning `null`, falls back to default behavior, which is `examine(src)`, and it will definitely include + * images since it is the default behavior + * + * Though no tooltips will be created for atoms that have `tooltips = FALSE` +*/ +/atom/movable/proc/get_tooltip_data() + return +/atom/movable/MouseEntered(location, control, params) + . = ..() + if(tooltips) + if(!QDELETED(src)) + var/list/examine_list = examine(src) + var/get_tooltip_data = get_tooltip_data() + if(length(get_tooltip_data)) + examine_list = get_tooltip_data + var/examine_data = examine_list.Join("
") + openToolTip(usr, src, params, title = name, content = examine_data) + +/atom/movable/MouseExited(location, control, params) + . = ..() + closeToolTip(usr) + +/client/MouseDown(object, location, control, params) + closeToolTip(usr) + . = ..() diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html index 60bd358031..2743bc03d5 100644 --- a/code/modules/tooltip/tooltip.html +++ b/code/modules/tooltip/tooltip.html @@ -65,12 +65,12 @@ .hisgrace .wrap {border-color: #7C1414;} .hisgrace .content {color: #15D512; border-color: #9D1414; background-color: #861414;} - + /* TG: Themes */ /* ScreenUI */ .midnight .wrap {border-color: #2B2B33;} .midnight .content {color: #6087A0; border-color: #2B2B33; background-color: #36363C;} - + .plasmafire .wrap {border-color: #21213D;} .plasmafire .content {color: #FFA800 ; border-color: #21213D; background-color:#1D1D36;} @@ -85,7 +85,7 @@ .clockwork .wrap {border-color: #170800;} .clockwork .content {color: #B18B25; border-color: #000000; background-color: #5F380E;} - + diff --git a/code/modules/uplink/uplink_items/uplink_ammo.dm b/code/modules/uplink/uplink_items/uplink_ammo.dm index 853f6111b2..2ab6c6f490 100644 --- a/code/modules/uplink/uplink_items/uplink_ammo.dm +++ b/code/modules/uplink/uplink_items/uplink_ammo.dm @@ -7,6 +7,13 @@ // Ammunition +/datum/uplink_item/ammo/derringer + name = "Ammo Box - .45-70 GOVT" + desc = "Contains 10 additional .45-70 GOVT rounds. Caliber is exceedingly rare, and thus, comes at a premium." + item = /obj/item/ammo_box/g4570 + cost = 5 + include_modes = list(/datum/game_mode/nuclear) + /datum/uplink_item/ammo/pistol name = "10mm Handgun Magazine" desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. These rounds \ diff --git a/code/modules/uplink/uplink_items/uplink_bundles.dm b/code/modules/uplink/uplink_items/uplink_bundles.dm index 465f980804..cf33c893ad 100644 --- a/code/modules/uplink/uplink_items/uplink_bundles.dm +++ b/code/modules/uplink/uplink_items/uplink_bundles.dm @@ -38,7 +38,7 @@ specialised contractor baton, and three randomly selected low cost items. Can include otherwise unobtainable items." item = /obj/item/storage/box/syndie_kit/contract_kit cost = 20 - player_minimum = 30 + player_minimum = 25 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) restricted = TRUE @@ -135,7 +135,7 @@ but you never know. Contents are sorted to always be worth 50 TC." item = /obj/structure/closet/crate cost = 20 - player_minimum = 25 + player_minimum = 20 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs) cant_discount = TRUE var/starting_crate_value = 50 @@ -145,7 +145,7 @@ desc = "A dusty SUPER-SIZED from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \ but you never know. Contents are sorted to always be worth 125 TC." cost = 40 - player_minimum = 40 + player_minimum = 30 starting_crate_value = 125 /datum/uplink_item/bundles_TC/surplus/purchase(mob/user, datum/component/uplink/U) diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm index a8ca068ad2..948d17d168 100644 --- a/code/modules/uplink/uplink_items/uplink_dangerous.dm +++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm @@ -228,6 +228,15 @@ surplus = 50 include_modes = list(/datum/game_mode/nuclear) +/datum/uplink_item/dangerous/maulergauntlets + name = "Mauler Gauntlets" + desc = "Mauler gauntlets are a pair of high-tech plastitanium gauntlets fused with illegal nanite auto-injectors designed \ + to grant the wearer sextuple the strength of an average human being. Wearing these, you will punch harder, inflict more injuries \ + with your fists, and be able to slam people through tables with immense force. \ + Unfortunately, due to the size of the gloves you will be unable to wield firearms with them equipped." + item = /obj/item/clothing/gloves/fingerless/pugilist/mauler + cost = 8 + /datum/uplink_item/dangerous/powerfist name = "Power Fist" desc = "The power-fist is a metal gauntlet with a built-in piston-ram powered by an external gas supply.\ diff --git a/code/modules/uplink/uplink_items/uplink_roles.dm b/code/modules/uplink/uplink_items/uplink_roles.dm index 4edbe2f2c7..774c2d9794 100644 --- a/code/modules/uplink/uplink_items/uplink_roles.dm +++ b/code/modules/uplink/uplink_items/uplink_roles.dm @@ -208,9 +208,10 @@ /datum/uplink_item/role_restricted/chemical_gun name = "Reagent Dartgun" - desc = "A heavily modified syringe gun which is capable of synthesizing its own chemical darts using input reagents. Can hold 100u of reagents." + desc = "A heavily modified syringe gun which is capable of synthesizing its own chemical darts using input reagents. \ + Synthesizes one piercing 10 unit dart every 30 seconds up to a maximum of five. Can hold 100u of reagents." item = /obj/item/gun/chem - cost = 12 + cost = 10 restricted_roles = list("Chemist", "Chief Medical Officer") /datum/uplink_item/role_restricted/reverse_bear_trap @@ -257,4 +258,4 @@ item = /obj/item/storage/toolbox/emergency/turret cost = 11 restricted_roles = list("Station Engineer") - + diff --git a/code/modules/uplink/uplink_items/uplink_stealth.dm b/code/modules/uplink/uplink_items/uplink_stealth.dm index 673f2ab6ee..f401514542 100644 --- a/code/modules/uplink/uplink_items/uplink_stealth.dm +++ b/code/modules/uplink/uplink_items/uplink_stealth.dm @@ -9,7 +9,7 @@ /datum/uplink_item/stealthy_weapons/telescopicbat name = "Telescopic Baseball Bat" - desc = "A robust telescopic baseball bat that hits like a truck and can be consealed when collapsed." + desc = "A robust telescopic baseball bat that hits like a truck and can be concealed when collapsed." item = /obj/item/melee/baseball_bat/telescopic cost = 2 @@ -49,7 +49,7 @@ name = "Compact Derringer" desc = "An easily concealable handgun capable of firing .357 rounds. Comes in an inconspicuious packet of cigarettes with additional munitions." item = /obj/item/storage/fancy/cigarettes/derringer - cost = 8 + cost = 6 surplus = 30 /datum/uplink_item/stealthy_weapons/derringerpack/purchase(mob/user, datum/component/uplink/U) @@ -57,7 +57,7 @@ item = /obj/item/storage/fancy/cigarettes/derringer/gold ..() -/datum/uplink_item/stalthy_weapons/derringerpack_nukie +/datum/uplink_item/stealthy_weapons/derringerpack_nukie name = "Antique Derringer" desc = "An easy to conceal, yet extremely deadly handgun, capable of firing .45-70 Govt rounds. Comes in a unique pack of cigarettes with additional munitions." item = /obj/item/storage/fancy/cigarettes/derringer/midworld diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 5f39158413..b86ab6023a 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -55,7 +55,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) circuit = /obj/item/circuitboard/machine/vendor payment_department = ACCOUNT_SRV - light_power = 0.5 + light_power = 0.3 light_range = MINIMUM_USEFUL_LIGHT_RANGE /// Is the machine active (No sales pitches if off)! var/active = TRUE diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 97efbecb77..5ec0987111 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -18,6 +18,7 @@ /obj/item/reagent_containers/food/drinks/bottle/absinthe = 5, /obj/item/reagent_containers/food/drinks/bottle/grappa = 5, /obj/item/reagent_containers/food/drinks/bottle/sake = 5, + /obj/item/reagent_containers/food/drinks/bottle/amaretto = 5, /obj/item/reagent_containers/food/drinks/ale = 6, /obj/item/reagent_containers/food/drinks/bottle/orangejuice = 4, /obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 4, diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index fedaeff98c..da3c740a1b 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -212,6 +212,8 @@ /obj/item/clothing/suit/jacket/leather/overcoat = 4, /obj/item/clothing/under/pants/mustangjeans = 3, /obj/item/clothing/neck/necklace/dope = 5, + /obj/item/clothing/under/costume/swagoutfit = 5, + /obj/item/clothing/shoes/swagshoes = 5, /obj/item/clothing/suit/jacket/letterman_nanotrasen = 5, /obj/item/clothing/under/misc/corporateuniform = 5, /obj/item/clothing/suit/hooded/wintercoat/polychromic = 5, diff --git a/code/modules/vending/dinnerware.dm b/code/modules/vending/dinnerware.dm index b78af9c46b..95fd8e04d8 100644 --- a/code/modules/vending/dinnerware.dm +++ b/code/modules/vending/dinnerware.dm @@ -7,7 +7,9 @@ /obj/item/storage/bag/tray = 8, /obj/item/kitchen/fork = 6, /obj/item/kitchen/knife = 6, + /obj/item/kitchen/efink = 2, /obj/item/kitchen/rollingpin = 4, + /obj/item/kitchen/unrollingpin = 4, /obj/item/reagent_containers/food/drinks/drinkingglass = 8, /obj/item/clothing/suit/apron/chef = 2, /obj/item/storage/box/cups = 2, diff --git a/html/changelog.html b/html/changelog.html index 13ef3c5443..e277c9fbe1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,322 @@ -->
+

06 June 2021

+

bunny232 updated:

+
    +
  • Pools are capable of mist at lower temperatures
  • +
+ +

05 June 2021

+

Arturlang updated:

+
    +
  • float sanity now makes it not actually run if it's actively being thrown
  • +
+

coderbus13 updated:

+
    +
  • Pubby's toxins injector now starts at 200L, like it does on other maps
  • +
+

zeroisthebiggay updated:

+
    +
  • light floppy dog ears
  • +
+ +

04 June 2021

+

MrJWhit updated:

+
    +
  • Adds a missing pipe
  • +
+

Putnam3145 updated:

+
    +
  • sniper rifle doesn't ruin your round instantly now
  • +
+ +

03 June 2021

+

MrJWhit updated:

+
    +
  • Removed some debug tiles on the xenoruin.
  • +
+

TripleShades updated:

+
    +
  • Added a camera to both solar entryways
  • +
  • Added an intercom to toxin's launch for the doppler
  • +
  • The fake nuke auth disk in the library
  • +
+ +

29 May 2021

+

Kraseo updated:

+
    +
  • No more slamming into people while bloodcrawled.
  • +
+

Linzolle updated:

+
    +
  • brand intelligence event works again
  • +
+

keronshb updated:

+
    +
  • swag outfit available in clothesmate
  • +
  • swag shoes availble in clothesmate resprite: changed swag shoes icon to the one twaticus made.
  • +
  • Adds the clown mob spawner for admins
  • +
+

zeroisthebiggay updated:

+
    +
  • puglism damage can no longer stack with scarp
  • +
+ +

26 May 2021

+

bunny232 updated:

+
    +
  • Removed two random 'captain's office' tiles from space on meta station
  • +
+ +

24 May 2021

+

zeroisthebiggay updated:

+
    +
  • New traitor item: the Mauler Gauntlets! Punch hard, punch good! Eight telecrystals, buy today!
  • +
  • hairs from Airborne Snitch
  • +
+ +

23 May 2021

+

Putnam3145 updated:

+
    +
  • Antag and species no longer remove all traits if one has a blacklisted trait
  • +
+

WanderingFox95 updated:

+
    +
  • Replaced the antlers showing up when you select deer ears with actual deer ears. Literally why was that even a thing before?
  • +
  • Straight rabbit ears are now a thing.
  • +
+

keronshb updated:

+
    +
  • 30 > 25 pop req for contractor kit
  • +
  • adds a special hud for simple mobs.
  • +
  • a lot of >32x32 mobs now have icons for their health dolls
  • +
+ +

21 May 2021

+

Putnam3145 updated:

+
    +
  • Fixed activity being attached to minds instead of mobs on antag attach.
  • +
+ +

20 May 2021

+

qweq12yt updated:

+
    +
  • Fixed void cloak voiding itself into oblivion.
  • +
  • You can now order emag shuttles again.
  • +
+

timothyteakettle updated:

+
    +
  • ports rp's marking system
  • +
+ +

19 May 2021

+

WanderingFox95 updated:

+
    +
  • The E-Fink, a mending tool for food.
  • +
  • A backwards bladeslice. (Yes, for the E-fink)
  • +
  • And Icons for the E-fink, of course.
  • +
+

shellspeed1 updated:

+
    +
  • Survival pods can now be designated as requiring power. Survival pods with this feature should include an APC when created and will run out of power rather quickly if no source is added. Perfect for true emergencies.
  • +
  • An empty survival pod has been added to the mining vendor. This is an extremely barebones pod featuring only a gps, table, apc, and the standard fridge for some donk pockets.
  • +
+

zeroisthebiggay updated:

+
    +
  • New Alcohol Amaretto and various cocktails
  • +
  • more drink mixture flavortext
  • +
  • you're going to Baystation
  • +
+ +

15 May 2021

+

bunny232 updated:

+
    +
  • Corrects the bot pathing by engineering on meta station
  • +
+

timothyteakettle updated:

+
    +
  • borg spraycans have a five second delay before being able to knock someone down again
  • +
+ +

14 May 2021

+

keronshb updated:

+
    +
  • Removes VOG sleep command since it was an undocumented readd.
  • +
+

zeroisthebiggay updated:

+
    +
  • consealed
  • +
+ +

13 May 2021

+

Linzolle updated:

+
    +
  • anthromorphic -> anthropomorphic
  • +
+

WanderingFox95 updated:

+
    +
  • Pinot Mort (Necropolis Wine), a new, (totally healthy) mixed drink!
  • +
+

qweq12yt updated:

+
    +
  • Fixed sleeping disky spam (it still sleeps soundly, but every minute instead of every two seconds)
  • +
  • Fixed Hulks not breaking cuffs, zipties, restraints.
  • +
+

silicons updated:

+
    +
  • A deterministic wave explosion system has been added. Use it with wave_explosion().
  • +
+

zeroisthebiggay updated:

+
    +
  • vegas style bunny ears
  • +
+ +

12 May 2021

+

DeltaFire15 updated:

+
    +
  • find_safe_turf no longer always fails on safe oxygen levels(??)
  • +
  • Heretic bladeshatters now actually take the heretic's z into account as intended, instead of always being station z tweak: Message for failing the bladeshatter despite succeeding the do_after tweak: Improves bladeshatter a bit by making it safer codewise
  • +
+ +

11 May 2021

+

LetterN updated:

+
    +
  • fixes emagging console shuttle purchases
  • +
  • syndie melee simplemobs has no more bullshit shield
  • +
+

bunny232 updated:

+
    +
  • Delta station xenobiology department has received enhanced scrubbing and ventilation capabilities similar to box and meta
  • +
+ +

09 May 2021

+

Putnam3145 updated:

+
    +
  • Priority announcement admeme verb
  • +
+

SandPoot updated:

+
    +
  • Fixed Cyborg examines adding an extra weird line.
  • +
  • Everything can be set to have tooltips, and even coded to have neat tooltips.
  • +
  • Makes it so humans and borgs already have tooltips.
  • +
+

TheObserver-sys updated:

+
    +
  • Fixes most of the weird handling bugs and improves cigarette case handling in general.
  • +
  • The Gorlex Marauders have seen fit to allow you to purchase the .45-70 GOVT rare ammo, at a premium cost. Don't waste it.
  • +
+

WanderingFox95 updated:

+
    +
  • added the unrolling pin, an innovative solution to dough-based mishaps.
  • +
  • added visuals for the unrolling pin
  • +
+

dzahlus updated:

+
    +
  • added new malf AI spawn and doomsday sound
  • +
  • removed old malf AI spawn and doomsday sound
  • +
+

zeroisthebiggay updated:

+
    +
  • pirates now have a medbay and several other things qualifying as a buff
  • +
  • pirates lost their toilet
  • +
+ +

08 May 2021

+

Arturlang updated:

+
    +
  • Synthblood bottles now have the proper color and probably won't poison you anymore
  • +
+

timothyteakettle updated:

+
    +
  • lets humans have digi legs (and avian legs)
  • +
+ +

05 May 2021

+

The0bserver, with a great amount of advice from TripleZeta/TetraZeta updated:

+
    +
  • Adds a new crate type, for use with any manner of cheeky breeki shenanigans, as well as with existing Russian contraband.
  • +
+

bunny232 updated:

+
    +
  • There's some new vents and scrubbers in the meta station xenobiology department. Welders and wrenches not included*
  • +
+

keronshb updated:

+
    +
  • Nightmare Shadow Jaunt threshold up to 0.4
  • +
  • Vendor and Engraved message light down to 0.3
  • +
+ +

03 May 2021

+

TripleShades updated:

+
    +
  • Added two air alarms to Pubby Security, one in the evidence locker room and one in the main equipment back room
  • +
  • pAI Card back to outside Research in Meta Station
  • +
  • Pubby Disposals now shunts to space
  • +
  • Maintinence Areas being not applied to certain airlocks as well as stealing minor walls
  • +
  • Box Surgery Storage camera is now renamed to be on the network
  • +
  • Box Paramedic Station camera is now renamed to be on the network, and no longer steals the Morgue's cam tweak: Box Surgery Storage is now it's own proper room
  • +
+ +

01 May 2021

+

qweq12yt updated:

+
    +
  • Restores the sprite for the Riot Suit.
  • +
+ +

30 April 2021

+

DrPainis updated:

+
    +
  • Bubblegum's hallucinations are capitalized.
  • +
+

Melbert, SandPoot updated:

+
    +
  • TGUI Limbgrower
  • +
  • Refactored the limbgrower to modernize the code and allow for more types of designs.
  • +
  • The limbgrower now supports plumbing ducts.
  • +
  • Fixes genitals not actually getting data from disks.
  • +
  • Adds two special helpers.
  • +
+

SandPoot updated:

+
    +
  • The decal painter now has visible previews for your tile painting funs.
  • +
  • Fixes decal painter painting in the opposite direction.
  • +
+

TheObserver-sys updated:

+
    +
  • Restores the access lock on crates that should have them, given the goods inside.
  • +
  • Makes the 10MM Surplus Rifle a less awful thing to use.
  • +
  • replaces unarmored things with their armored versions.
  • +
  • Illegal Tech Ammo actually is fucking reasonable, now.
  • +
  • Expensive Illegal Tech Ammo Boxes are now constructible, with actually justifiable prices.
  • +
+

WanderingFox95 updated:

+
    +
  • There's finally a reason for the reagent dart gun to exist and be used!
  • +
+

akada updated:

+
    +
  • Changes the space adaptation sprite to something less intrusive and more subtle.
  • +
+

necromanceranne updated:

+
    +
  • Basic cybernetic organs: they're worse than organic! Basic stomachs, hearts, lungs and livers! For when you hate someone enough to not bother harvesting organs from a monkeyhuman!
  • +
  • Cybernetic organs have been adjusted into three tiers: 1 (basic), 2 (standard, better than organic) and 3 (absolutely better than organic but expensive to print)
  • +
  • Cybernetic organs that are emp'd instead suffer different effects based on the severity of the emp. The bigger the emp, the worse the effect is.
  • +
  • Rather than outright bricking, severely emp'd cyberorgans degrade over time very quickly, requiring replacement in the near future.
  • +
  • Fake blindfolds in the loadout. They don't obscure vision, for better or worse.
  • +
+ +

29 April 2021

+

Putnam3145 updated:

+
    +
  • Fixed a couple runtimes in activity (threat) tracking
  • +
+

keronshb updated:

+
    +
  • Removes the Reinforcement Chromosome from Genetics.
  • +
+

26 April 2021

Trigg, stylemistake and SandPoot updated:

    @@ -282,542 +598,6 @@
  • Lockers/Crates can now be deconstructed the right way respecting the cutting_tool (even if it's not one of the default interactions).
  • Dragging the laptop into itself shouldn't do anything anymore (kind of pointless and hard to do).
- -

04 April 2021

-

Hatterhat updated:

-
    -
  • After a sudden crash in the tower-cap log slash wooden plank economy, NanoTrasen has decided to stop selling tower-cap logs to Cargo.
  • -
- -

03 April 2021

-

BlueWildrose updated:

-
    -
  • The hydroponics pet bee, Bumbles no longer has a number besides their name.
  • -
-

Putnam3145 updated:

-
    -
  • "Destroy all nanotrasen cloning machines" objective is gone
  • -
  • Removed all the commented-out sabotage objectives (we can just get them from history)
  • -
  • Observe verb logging
  • -
- -

02 April 2021

-

LetterN updated:

-
    -
  • piratepayment
  • -
- -

29 March 2021

-

BlueWildrose updated:

-
    -
  • Fixed being unable to fix suit sensors if damaged at all unless destroyed completely
  • -
-

YakumoChen updated:

-
    -
  • A less-than-new Syndicate bundle that reminds you of the good old days when we didn't need all those newfangled traitor items the young-uns get. We had 6 items in the uplink and we had Monkey in rotation and by god we made do.
  • -
-

qweq12yt updated:

-
    -
  • Added Earmuffs
  • -
  • Added Random Drink
  • -
  • Added Clear PDA
  • -
  • Added Internals Box
  • -
  • Added Meson Goggles
  • -
  • Added Smoke Grenade
  • -
-

silicons updated:

-
    -
  • automated hydroponics system design now works properly
  • -
- -

28 March 2021

-

CuteMoff updated:

-
    -
  • Changed Strength Modifier from the default (1.0) too .7
  • -
-

Hatterhat updated:

-
    -
  • As a heretic, shattering your blade no longer interferes with bluespace.
  • -
-

Putnam3145 updated:

-
    -
  • Threat tracking is now universal, rather than dynamic-only
  • -
  • Slaughter demon event now increases weight based on how much blood there is.
  • -
-

R3dtail updated:

-
    -
  • Removed ichor creates
  • -
  • Removed ichor crates and adjusted crate rolling appropriately
  • -
  • Removed the bonespear from the blackmarket uplink, and made EMP grenades harder to get from the same item.
  • -
  • Added a description to the black market uplink
  • -
-

Shadow-Quill updated:

-
    -
  • Added small versions of the walk icon for all hud styles, except Retro.
  • -
-

dzahlus updated:

-
    -
  • Added radial menu to joy mask for alt reskins
  • -
  • added pensive, angry and flushed sprites to joy mask
  • -
-

keronshb updated:

-
    -
  • Radioactive microlasers can no longer knock out creatures who are immune to the effects of radiation.
  • -
  • The radioactive microlaser now calculates the strength of its delay effect using the intensity setting it had when you initially used it on your victim, not the intensity setting it currently has. This prevents people from "cheating out" its intensity 20 effect with only a 2 second delay and a 1 second cooldown.
  • -
  • Radioactive microlasers no longer contain twice as much metal as normal health analyzers do.
  • -
-

necromanceranne updated:

-
    -
  • Replaces the useless bullet and laser shields with new Kinetic and Ablative shields, which do as they advertise.
  • -
  • Replaces the shield implants shield with a hardlight shield that can take large amounts of brute damage, but disintegrates when shot with disablers.
  • -
  • Fixes Fake Roman Shields being able to be used as normal riot shields.
  • -
  • Fixes nonlethal/non-physical damage types destroying shields. (stamina, toxins, oxygen, clone, brain)
  • -
  • Fixes tower shields not doing anything, while also giving them intergrity to match their advertised durability.
  • -
  • Uses additional flags to determine what kind effects work well and what works poorly against various shields.
  • -
-

timothyteakettle updated:

-
    -
  • ghost cafe residents can now disguise themselves as any mob or object
  • -
  • fixes character preview not updating when selecting the loadout tab
  • -
-

zeroisthebiggay updated:

-
    -
  • triple kitsune tail
  • -
- -

26 March 2021

-

BlueWildrose updated:

-
    -
  • Clothing no longer drops when shredded. It just becomes useless.
  • -
  • Suit sensors are guaranteed to short out when the clothes become shredded, not damaged now.
  • -
  • Uniform limb integrity increased from 30 to 120.
  • -
  • Suit sensor damage has been added. The more damaged your suit sensors get, the less features that will be available from these suit sensors. It takes two e-sword hits to ruin your tracking beacon for instance. tweak: Examine text on uniforms is now more clear about needing cable coil to repair your suit sensors.
  • -
  • Fixed prisoner uniform sprite paths
  • -
-

CuteMoff updated:

-
    -
  • Diamond's forcemod was changed from 1.1x to 1.2x
  • -
-

Hatterhat updated:

-
    -
  • Lever-action rifles, chambered in .38, are now sitting in the code. They might be buyable from Cargo or the Black Market soon. Watch this space.
  • -
  • Sawed-off shotguns now look like shotguns, but short, when inhand, instead of "generic gun".
  • -
-

timothyteakettle updated:

-
    -
  • slimes can be delimbed
  • -
  • the loadout now colours pet collars correctly
  • -
- -

25 March 2021

-

zeroisthebiggay updated:

-
    -
  • strained muscles isn't free
  • -
- -

24 March 2021

-

BlueWildrose updated:

-
    -
  • The nightmare's light eater can now destroy messes that emit light, like glowing goo or ectoplasmic puddles.
  • -
-

Hatterhat updated:

-
    -
  • The NOGUNS trait now takes precedence over the triggerguard checks.
  • -
  • Medicated sutures and advanced regenerative mesh are now easier to make. Reagent-quantity wise, anyway.
  • -
-

ItzGabby updated:

-
    -
  • Fluff Items with polychromic support
  • -
  • A new vendor called Bark box
  • -
  • A new form of snack with it's own box
  • -
  • Two harness, one of them being lewd
  • -
  • One new collar, with a ribbon. Classy.
  • -
  • More locked forms of collars
  • -
  • Purged old balls
  • -
  • Removed the funny buffs each colored tennis ball had, down with the powergame!
  • -
  • Added polychromic fluff icons, vendor icons, suit icons, snack icons, fancy box icons, and a polychromic version of Izzy's ball.
  • -
  • Deleted old balls, Izzy's Ball, except the rainbow one since it's special and as I did not go out of my way to get permission to touch.
  • -
  • Walked into vending.dm and glared for a moment at hydroponics' grammar.
  • -
-

LetterN updated:

-
    -
  • fixed laptops pickability
  • -
  • fixed closets being unweldable
  • -
-

YakumoChen updated:

-
    -
  • Genetics - Thermal vision is a recipe instead of a natural gene now. Nearsighted+Stimmed. Other minor nerfs, Thermal is 40 instability.
  • -
  • Research - X-ray eyes are now an illegal tech.
  • -
-

qweq12yt updated:

-
    -
  • added the black market uplink
  • -
  • added blackmarket.dmi
  • -
  • increased the black market interface's width, now the delivery options will show properly when the LTSRBT is built
  • -
-

zeroisthebiggay updated:

-
    -
  • biodegrade works on legcuffs
  • -
- -

23 March 2021

-

LetterN updated:

-
    -
  • NIRM departamental purchases now work. Have fun spending the entire R&D Budget!
  • -
- -

21 March 2021

-

Arturlang updated:

-
    -
  • Vampire statpanel no longer shows spans unnecesary
  • -
-

GrayRachnid updated:

-
    -
  • fixed the holopad autocall bug
  • -
  • properly incorporated the secure holopad that was commented out in the code.
  • -
  • the in_character_filter.txt is now usable
  • -
  • headmins should edit the in_character_filter.txt
  • -
  • someone with box access should delete racism with the in_character_filter.txt
  • -
  • buffed particle defender disabler shots from 13->15 stamina (15*6=90)
  • -
  • buffed particle defender laser ammo to 4 shots
  • -
-

Hatterhat updated:

-
    -
  • removes pacifism from ghost cafe. have fun beating up your coworkers
  • -
-

LetterN updated:

-
    -
  • Art gallery (meta)
  • -
  • Laptop vendor (meta, delta, box)
  • -
-

Putnam3145 updated:

-
    -
  • Buffed supermatter surge massively.
  • -
-

The-Sun-In-Splendour updated:

-
    -
  • You cannot revive yourself (as a changeling) if you've been absorbed anymore
  • -
-

dzahlus updated:

-
    -
  • rebalanced hierophant STAFF to do 15 damage on all attacks
  • -
-

timothyteakettle updated:

-
    -
  • using the puddle ability when stunned wont break it
  • -
- -

20 March 2021

-

Hatterhat updated:

-
    -
  • Bluespace beaker filling icons for that narrow band between 90 and 80% full now actually exist.
  • -
- -

19 March 2021

-

DeltaFire15 updated:

-
    -
  • Bluespace jars can no longer be printed / acquired from lathes / techwebs. tweak: The travelling animal trader now gives you your reward in a one-use bluespace jar.
  • -
-

Putnam3145 updated:

-
    -
  • "Antag" role that can be toggled to disable all antags
  • -
-

SandPoot updated:

-
    -
  • Tactitool Skirtleneck.
  • -
  • Adds the tactitool skirtleneck to the loadout.
  • -
-

kiwedespars updated:

-
    -
  • New heretic path - Path of Void- it specializes in being extremely stealthy. tweak : Removed curse of blindness replaced with mask of madness. hey it even rhymes.
  • -
  • fixes heretic mass deletion during transmutation bug.
  • -
  • Fixes heretic brews being permanent.
  • -
  • Fixes void storm breaking after resurrecting. tweak: Heretic has received a minor textual facelift. tweak: Heretics who finish the Void Path and become an Aristocrat of the Void can now survive in the Void (space).
  • -
  • Heretics who research Aristocrats Way on the Void Path will no longer suffocate in their own storm when they ascend (no longer breathes).
  • -
  • Mark of Void and Seeking Blade are once again exclusive only to Void.
  • -
  • Carving knife now deals more damage on throw and can embed in your enemies. tweak: Grasp of Rust only rusts floors and machines on harm intent. tweak: when u choose a sac target as heretic it ll also tell the job of the sac
  • -
  • 2 new void spells, one a placeholder.
  • -
  • flesh mansus grasp buffed, now gives you 5u eldritch fluid when hitting someone.
  • -
-

zeroisthebiggay updated:

-
    -
  • fixes spriteless heretic book
  • -
- -

18 March 2021

-

Arturlang updated:

-
    -
  • Combat mode right click and right click verb give's are now actualyl targeted
  • -
-

Hatterhat updated:

-
    -
  • Hypospray vials are now printable from the medical techshift start.
  • -
  • Empty hypospray kits are now printable behind biological technology. tweak: Quantum electromag (T4 lasers) are now behind Advanced Bluespace like the rest of T4.
  • -
- -

17 March 2021

-

KeRSedChaplain updated:

-
    -
  • Added three new rites, and makes soul vessels obtainable
  • -
  • fixes clockwork guardians inheriting marauders blocking
  • -
  • added sounds for the ratvar end sequence, voiced by @dzahlus
  • -
-

timothyteakettle updated:

-
    -
  • speech panel added to main menu customization
  • -
- -

16 March 2021

-

GrayRachnid updated:

-
    -
  • removed red toolbox, agent id, and guerilla gloves from unlocking illegal tech.
  • -
-

HeroWithYay updated:

-
    -
  • fixed spelling error
  • -
-

LetterN updated:

-
    -
  • Borg light icons not turning off
  • -
  • Double ai icon select + Fixes ai core not having icons
  • -
  • Missing air tank icon
  • -
  • Computer boards being dumb and nullspacing/qdeling itself
  • -
-

Putnam3145 updated:

-
    -
  • Supernova now much lower chance to be inconsequential
  • -
  • Made hyper-nob's point values way lower (25/20 for science/cargo instead of 1000/1000)
  • -
  • Made nitryl's cargo sell value less (10 instead of 30)
  • -
-

SandPoot updated:

-
    -
  • Fixed interacting with telecomms.
  • -
- -

14 March 2021

-

Adelphon updated:

-
    -
  • messy2
  • -
  • papermask
  • -
-

Hatterhat updated:

-
    -
  • Robotic limb repair surgery now has tiers.
  • -
  • Pubby and Delta now have roundstart limb-growers relatively close to, if not in, the operating theaters. tweak: Box QM's console now can announce things.
  • -
-

Putnam3145 updated:

-
    -
  • chaos loads now
  • -
-

kiwedespars updated:

-
    -
  • adds a cute new plushie
  • -
-

necromanceranne updated:

-
    -
  • Fixes cosmetic augments missing their foot sprites.
  • -
- -

12 March 2021

-

R3dtail updated:

-
    -
  • Adds Periods and moves some words around.
  • -
- -

10 March 2021

-

Hatterhat updated:

-
    -
  • The femur breaker now actually breaks legs by applying a compound fracture.
  • -
-

Putnam3145 updated:

-
    -
  • uncapped TEG power, buffing high-temp TEGs
  • -
- -

09 March 2021

-

LetterN updated:

-
    -
  • tg hardsync, mostly contains tgui
  • -
- -

07 March 2021

-

Hatterhat updated:

-
    -
  • You can now reskin your improvised shotguns.
  • -
  • The spontaneous brain trauma event now announces to ghosts whoever got funnied upon.
  • -
  • Ports EikoBiko's cat tail sprite.
  • -
-

Putnam3145 updated:

-
    -
  • nitryl now consumes oxygen/nitrogen instead of generating them
  • -
  • Hyper-nob and nitryl are easier to make.
  • -
-

dzahlus updated:

-
    -
  • Added taser microbattery for MWS-01
  • -
  • tweaked MWS-01 beacondrop to have more batteries
  • -
  • rebalanced MWS-01 disabler battery to fire 10 shots
  • -
  • added unique sound to the MWS-01
  • -
  • fixed Modula Weapons System to "Modular Weapon System"
  • -
-

timothyteakettle updated:

-
    -
  • exiting a bluespace jar through any means, hardstuns you for 5 seconds
  • -
- -

05 March 2021

-

Putnam3145 updated:

-
    -
  • Lowered ash storm volume
  • -
  • Minesweeper can no longer be made to lag the server on purpose
  • -
-

keronshb updated:

-
    -
  • Prevents heat from going through reinforced plasma glass.
  • -
- -

04 March 2021

-

LetterN updated:

-
    -
  • removes bsql
  • -
- -

03 March 2021

-

MarinaGryphon updated:

-
    -
  • The AOOC mute pref is now properly respected.
  • -
  • Muting adminhelp sounds no longer mutes AOOC.
  • -
-

Putnam3145 updated:

-
    -
  • pAIs now have a policy config
  • -
  • "Supermatter surge" event, which might cause problems if the supermatter is not sufficiently cooled (i.e. the setup is messed up in some way)
  • -
  • Fusion can no longer be done in open air.
  • -
  • Valentine's day event no longer gives everyone a valentine's antag.
  • -
-

SandPoot updated:

-
    -
  • Legions should now pass their type to the person they infect (if valid).
  • -
-

dzahlus updated:

-
    -
  • Added new subtype to lesser ash drake balanced around player control
  • -
  • rebalanced dragon transformation to a 1 minute cooldown as well as using the new subtype of megafauna
  • -
-

qweq12yt updated:

-
    -
  • fixed infectious zombies not being able to attack if host was pacifist
  • -
  • adds a way for species to have blacklisted quirks, the removal, and restoration of said quirks upon species changes
  • -
  • Now pacifists won't be able to use flamethrowers
  • -
  • Kinetic Accelerator now properly reloads a charge to it's chamber instead of nulling the variable forever
  • -
  • Now pacifists won't be able to use Kinetic Accelerators if a non-pacifist shoots it first
  • -
- -

02 March 2021

-

LetterN updated:

-
    -
  • colorpainter: let's not dispense null
  • -
-

SandPoot updated:

-
    -
  • Changelings will actually become the person they want to be when using "human form" ability(after having used last resort).
  • -
- -

01 March 2021

-

SmArtKar updated:

-
    -
  • Fixes decks breaking your screen
  • -
  • Fixes binders not saving cards
  • -
  • Fixes binders not saving multiple cards of the same type
  • -
-

Vynzill updated:

-
    -
  • cursed rice hat right in front of the jungle gateway's entrance is now removed from this dimensional plane
  • -
- -

28 February 2021

-

Putnam3145 updated:

-
    -
  • Polychromic windbreaker's alt-click message is now coherent
  • -
  • Toggleable suits now have an on_toggle proc to be overridden.
  • -
-

R3dtail updated:

-
    -
  • doubled max belly name length and quadrupled belly description length
  • -
-

SandPoot updated:

-
    -
  • Body rejuvenation surgery will loop until the patient is completely healed.
  • -
-

dzahlus updated:

-
    -
  • fixes toxinlovers dying from heretic stuff that should heal them instead
  • -
- -

27 February 2021

-

Hatterhat updated:

-
    -
  • Lingfists (trait_mauler) now deal no stam damage and lost their 15(!!!) armor penetration.
  • -
-

Putnam3145 updated:

-
    -
  • Tablets now protect their contents from rads.
  • -
-

TheObserver-sys updated:

-
    -
  • Chems that should have been usable are now usable, try some cryoxadone on a plant today!!!
  • -
-

kappa-sama updated:

-
    -
  • cards and card binders are now small-class items
  • -
-

keronshb updated:

-
    -
  • 16 > 10 unlock cost for stronger abilities
  • -
  • Made nearly all other abilities for free.
  • -
-

kiwedespars updated:

-
    -
  • reverted the pr that absolutely gutted pugilism and made it worse than base unarmed, also gives it a second long stagger
  • -
  • removed the ability to parry while horizontal, because that's dumb and makes it easy to just time the parries right.
  • -
-

silicons updated:

-
    -
  • chaplain arrythmic knives can no longer be abused for infinite speed.
  • -
- -

26 February 2021

-

DeltaFire15 updated:

-
    -
  • All machine-frame based tool-use actions now have state-checking callbacks.
  • -
- -

25 February 2021

-

DeltaFire15 updated:

-
    -
  • Traitor / Ling objective amount should now be correct again.
  • -
- -

24 February 2021

-

SandPoot updated:

-
    -
  • Regular crowbars no longer open powered airlocks.
  • -
-

silicons updated:

-
    -
  • xeno cube makes hostile xenos now, and drops a sentinel instead of a drone.
  • -
- -

23 February 2021

-

keronshb updated:

-
    -
  • Hyperblade to uplink with poplock
  • -
  • Removes combination of two Dragon Tooth Swords while keeping it for regular eutactics.
  • -
-

timothyteakettle updated:

-
    -
  • banning panel prioritises mobs with clients now when trying to find them if they're in the game
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d1d5cc31d6..f5a9c7dba8 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -29172,3 +29172,217 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - admin: 'Admins just got a new TGUI Select Equipment menu tweak: Prevents the window from creating sprites for any animated version there might be. (this guarantees consistant sprite size/amount)' +2021-04-29: + Putnam3145: + - bugfix: Fixed a couple runtimes in activity (threat) tracking + keronshb: + - balance: Removes the Reinforcement Chromosome from Genetics. +2021-04-30: + DrPainis: + - spellcheck: Bubblegum's hallucinations are capitalized. + Melbert, SandPoot: + - refactor: TGUI Limbgrower + - refactor: Refactored the limbgrower to modernize the code and allow for more types + of designs. + - rscadd: The limbgrower now supports plumbing ducts. + - bugfix: Fixes genitals not actually getting data from disks. + - code_imp: Adds two special helpers. + SandPoot: + - rscadd: The decal painter now has visible previews for your tile painting funs. + - bugfix: Fixes decal painter painting in the opposite direction. + TheObserver-sys: + - bugfix: Restores the access lock on crates that should have them, given the goods + inside. + - bugfix: Makes the 10MM Surplus Rifle a less awful thing to use. + - bugfix: replaces unarmored things with their armored versions. + - balance: Illegal Tech Ammo actually is fucking reasonable, now. + - balance: Expensive Illegal Tech Ammo Boxes are now constructible, with actually + justifiable prices. + WanderingFox95: + - balance: There's finally a reason for the reagent dart gun to exist and be used! + akada: + - imageadd: Changes the space adaptation sprite to something less intrusive and + more subtle. + necromanceranne: + - rscadd: 'Basic cybernetic organs: they''re worse than organic! Basic stomachs, + hearts, lungs and livers! For when you hate someone enough to not bother harvesting + organs from a monkeyhuman!' + - rscadd: 'Cybernetic organs have been adjusted into three tiers: 1 (basic), 2 (standard, + better than organic) and 3 (absolutely better than organic but expensive to + print)' + - rscadd: Cybernetic organs that are emp'd instead suffer different effects based + on the severity of the emp. The bigger the emp, the worse the effect is. + - rscadd: Rather than outright bricking, severely emp'd cyberorgans degrade over + time very quickly, requiring replacement in the near future. + - rscadd: Fake blindfolds in the loadout. They don't obscure vision, for better + or worse. +2021-05-01: + qweq12yt: + - bugfix: Restores the sprite for the Riot Suit. +2021-05-03: + TripleShades: + - rscadd: Added two air alarms to Pubby Security, one in the evidence locker room + and one in the main equipment back room + - rscadd: pAI Card back to outside Research in Meta Station + - bugfix: Pubby Disposals now shunts to space + - bugfix: Maintinence Areas being not applied to certain airlocks as well as stealing + minor walls + - bugfix: Box Surgery Storage camera is now renamed to be on the network + - bugfix: 'Box Paramedic Station camera is now renamed to be on the network, and + no longer steals the Morgue''s cam tweak: Box Surgery Storage is now it''s own + proper room' +2021-05-05: + The0bserver, with a great amount of advice from TripleZeta/TetraZeta: + - rscadd: Adds a new crate type, for use with any manner of cheeky breeki shenanigans, + as well as with existing Russian contraband. + bunny232: + - rscadd: There's some new vents and scrubbers in the meta station xenobiology department. + Welders and wrenches not included* + keronshb: + - balance: Nightmare Shadow Jaunt threshold up to 0.4 + - balance: Vendor and Engraved message light down to 0.3 +2021-05-08: + Arturlang: + - bugfix: Synthblood bottles now have the proper color and probably won't poison + you anymore + timothyteakettle: + - rscadd: lets humans have digi legs (and avian legs) +2021-05-09: + Putnam3145: + - rscadd: Priority announcement admeme verb + SandPoot: + - bugfix: Fixed Cyborg examines adding an extra weird line. + - code_imp: Everything can be set to have tooltips, and even coded to have neat + tooltips. + - rscadd: Makes it so humans and borgs already have tooltips. + TheObserver-sys: + - bugfix: Fixes most of the weird handling bugs and improves cigarette case handling + in general. + - rscadd: The Gorlex Marauders have seen fit to allow you to purchase the .45-70 + GOVT rare ammo, at a premium cost. Don't waste it. + WanderingFox95: + - rscadd: added the unrolling pin, an innovative solution to dough-based mishaps. + - imageadd: added visuals for the unrolling pin + dzahlus: + - soundadd: added new malf AI spawn and doomsday sound + - sounddel: removed old malf AI spawn and doomsday sound + zeroisthebiggay: + - balance: pirates now have a medbay and several other things qualifying as a buff + - balance: pirates lost their toilet +2021-05-11: + LetterN: + - bugfix: fixes emagging console shuttle purchases + - balance: syndie melee simplemobs has no more bullshit shield + bunny232: + - rscadd: Delta station xenobiology department has received enhanced scrubbing and + ventilation capabilities similar to box and meta +2021-05-12: + DeltaFire15: + - bugfix: find_safe_turf no longer always fails on safe oxygen levels(??) + - bugfix: 'Heretic bladeshatters now actually take the heretic''s z into account + as intended, instead of always being station z tweak: Message for failing the + bladeshatter despite succeeding the do_after tweak: Improves bladeshatter a + bit by making it safer codewise' +2021-05-13: + Linzolle: + - spellcheck: anthromorphic -> anthropomorphic + WanderingFox95: + - rscadd: Pinot Mort (Necropolis Wine), a new, (totally healthy) mixed drink! + qweq12yt: + - bugfix: Fixed sleeping disky spam (it still sleeps soundly, but every minute instead + of every two seconds) + - bugfix: Fixed Hulks not breaking cuffs, zipties, restraints. + silicons: + - code_imp: A deterministic wave explosion system has been added. Use it with wave_explosion(). + zeroisthebiggay: + - rscadd: vegas style bunny ears +2021-05-14: + keronshb: + - balance: Removes VOG sleep command since it was an undocumented readd. + zeroisthebiggay: + - spellcheck: consealed +2021-05-15: + bunny232: + - bugfix: Corrects the bot pathing by engineering on meta station + timothyteakettle: + - balance: borg spraycans have a five second delay before being able to knock someone + down again +2021-05-19: + WanderingFox95: + - rscadd: The E-Fink, a mending tool for food. + - soundadd: A backwards bladeslice. (Yes, for the E-fink) + - imageadd: And Icons for the E-fink, of course. + shellspeed1: + - rscadd: Survival pods can now be designated as requiring power. Survival pods + with this feature should include an APC when created and will run out of power + rather quickly if no source is added. Perfect for true emergencies. + - rscadd: An empty survival pod has been added to the mining vendor. This is an + extremely barebones pod featuring only a gps, table, apc, and the standard fridge + for some donk pockets. + zeroisthebiggay: + - rscadd: New Alcohol Amaretto and various cocktails + - rscadd: more drink mixture flavortext + - soundadd: you're going to Baystation +2021-05-20: + qweq12yt: + - bugfix: Fixed void cloak voiding itself into oblivion. + - bugfix: You can now order emag shuttles again. + timothyteakettle: + - rscadd: ports rp's marking system +2021-05-21: + Putnam3145: + - bugfix: Fixed activity being attached to minds instead of mobs on antag attach. +2021-05-23: + Putnam3145: + - bugfix: Antag and species no longer remove all traits if one has a blacklisted + trait + WanderingFox95: + - imageadd: Replaced the antlers showing up when you select deer ears with actual + deer ears. Literally why was that even a thing before? + - imageadd: Straight rabbit ears are now a thing. + keronshb: + - balance: 30 > 25 pop req for contractor kit + - code_imp: adds a special hud for simple mobs. + - imageadd: a lot of >32x32 mobs now have icons for their health dolls +2021-05-24: + zeroisthebiggay: + - rscadd: 'New traitor item: the Mauler Gauntlets! Punch hard, punch good! Eight + telecrystals, buy today!' + - rscadd: hairs from Airborne Snitch +2021-05-26: + bunny232: + - bugfix: Removed two random 'captain's office' tiles from space on meta station +2021-05-29: + Kraseo: + - bugfix: No more slamming into people while bloodcrawled. + Linzolle: + - bugfix: brand intelligence event works again + keronshb: + - rscadd: swag outfit available in clothesmate + - rscadd: 'swag shoes availble in clothesmate resprite: changed swag shoes icon + to the one twaticus made.' + - rscadd: Adds the clown mob spawner for admins + zeroisthebiggay: + - balance: puglism damage can no longer stack with scarp +2021-06-03: + MrJWhit: + - balance: Removed some debug tiles on the xenoruin. + TripleShades: + - rscadd: Added a camera to both solar entryways + - rscadd: Added an intercom to toxin's launch for the doppler + - rscdel: The fake nuke auth disk in the library +2021-06-04: + MrJWhit: + - rscadd: Adds a missing pipe + Putnam3145: + - bugfix: sniper rifle doesn't ruin your round instantly now +2021-06-05: + Arturlang: + - code_imp: float sanity now makes it not actually run if it's actively being thrown + coderbus13: + - bugfix: Pubby's toxins injector now starts at 200L, like it does on other maps + zeroisthebiggay: + - rscadd: light floppy dog ears +2021-06-06: + bunny232: + - rscadd: Pools are capable of mist at lower temperatures diff --git a/icons/effects/camera_image_base.dmi b/icons/effects/camera_image_base.dmi new file mode 100644 index 0000000000..4f5867e07e Binary files /dev/null and b/icons/effects/camera_image_base.dmi differ diff --git a/icons/effects/genetics.dmi b/icons/effects/genetics.dmi index 373a9de623..16ceb1f18c 100644 Binary files a/icons/effects/genetics.dmi and b/icons/effects/genetics.dmi differ diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi index d93543805b..de50a0d9dc 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi index 43244e99b9..1cc1e801c7 100644 Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index 406b0fe62a..5155f06134 100644 Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi index f2611b3ab7..6c29fdfa75 100644 Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ diff --git a/icons/mob/clothing/uniform_digi.dmi b/icons/mob/clothing/uniform_digi.dmi index 98ec436b86..a957b60a9b 100644 Binary files a/icons/mob/clothing/uniform_digi.dmi and b/icons/mob/clothing/uniform_digi.dmi differ diff --git a/icons/mob/hair.dmi b/icons/mob/hair.dmi index 7322b2cfaf..55c79b9740 100644 Binary files a/icons/mob/hair.dmi and b/icons/mob/hair.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 3b115a1cb0..c404fbcacb 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi index 93cd988cff..af16e06a39 100644 Binary files a/icons/mob/inhands/equipment/kitchen_lefthand.dmi and b/icons/mob/inhands/equipment/kitchen_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/kitchen_righthand.dmi b/icons/mob/inhands/equipment/kitchen_righthand.dmi index 075b4c2033..539ef42a19 100644 Binary files a/icons/mob/inhands/equipment/kitchen_righthand.dmi and b/icons/mob/inhands/equipment/kitchen_righthand.dmi differ diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index ca047a93bd..7b93a3ff73 100644 Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 95aaf330ce..4377a0d7c6 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 629b989520..25cde38df9 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index aee67da199..cb2391b5ba 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 6171e032dd..22464b3def 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi index 9b42188f5e..1fda3933bd 100644 Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index 7dac61a663..892f974afd 100644 Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 1b28b910c1..b7f21a1fe4 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 31312ac9a1..7ada41dbcf 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/machines/gateway.dmi b/icons/obj/machines/gateway.dmi index fc45145ae8..5ba943bb89 100644 Binary files a/icons/obj/machines/gateway.dmi and b/icons/obj/machines/gateway.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 0460934eee..52172bbe29 100755 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi index 2b2b62a99c..4ed8c8db9a 100644 Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 0c59c3e711..39ed9d6ec8 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -550,7 +550,7 @@ ckeywhitelist = list("sneka") /datum/gear/donator/smaiden - name = "Shrine Maiden" - slot = SLOT_WEAR_SUIT - path = /obj/item/clothing/suit/smaiden + name = "shrine maiden outfit" + slot = SLOT_W_UNIFORM + path = /obj/item/clothing/under/smaiden ckeywhitelist = list("ultimarifox") diff --git a/modular_citadel/code/modules/client/loadout/glasses.dm b/modular_citadel/code/modules/client/loadout/glasses.dm index b0eecbbf28..f3b07657f4 100644 --- a/modular_citadel/code/modules/client/loadout/glasses.dm +++ b/modular_citadel/code/modules/client/loadout/glasses.dm @@ -6,6 +6,10 @@ name = "Blindfold" path = /obj/item/clothing/glasses/sunglasses/blindfold +/datum/gear/glasses/fakeblindfold + name = "Fake Blindfold" + path = /obj/item/clothing/glasses/fakeblindfold + /datum/gear/glasses/cold name = "Cold goggles" path = /obj/item/clothing/glasses/cold diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index bbd71d22e3..102ae41921 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -23,7 +23,7 @@ WRITE_FILE(S["feature_genitals_use_skintone"], features["genitals_use_skintone"]) WRITE_FILE(S["feature_mcolor2"], features["mcolor2"]) WRITE_FILE(S["feature_mcolor3"], features["mcolor3"]) - WRITE_FILE(S["feature_mam_body_markings"], features["mam_body_markings"]) + WRITE_FILE(S["feature_mam_body_markings"], safe_json_encode(features["mam_body_markings"])) WRITE_FILE(S["feature_mam_tail"], features["mam_tail"]) WRITE_FILE(S["feature_mam_ears"], features["mam_ears"]) WRITE_FILE(S["feature_mam_tail_animated"], features["mam_tail_animated"]) diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index 89734106cf..b7d04e0780 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -602,8 +602,8 @@ mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "mmask" -/obj/item/clothing/suit/smaiden - name = "shrine maiden" +/obj/item/clothing/under/smaiden + name = "shrine maiden outfit" desc = "Seems questionably tight for religious purposes." icon_state = "smaiden" item_state = "smaiden" diff --git a/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm b/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm index c39c66578b..858fe8fd5f 100644 --- a/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -3,10 +3,9 @@ desc = "A gun magazine. Loaded with rounds which ignite the target.." id = "10mminc" build_type = PROTOLATHE - materials = list(/datum/material/plasma = 50000, /datum/material/iron = 18000) - reagents_list = list(/datum/reagent/toxin/plasma = 120, /datum/reagent/napalm = 240) + materials = list(/datum/material/plasma = 5000, /datum/material/iron = 7500) build_path = /obj/item/ammo_box/magazine/m10mm/fire - category = list("Weapons") + category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/m10mm @@ -14,7 +13,7 @@ desc = "A gun magazine." id = "10mm" build_type = PROTOLATHE - materials = list(/datum/material/iron = 55000) + materials = list(/datum/material/iron = 6000) build_path = /obj/item/ammo_box/magazine/m10mm category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -24,8 +23,7 @@ desc = "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing." id = "10mmhp" build_type = PROTOLATHE - materials = list(/datum/material/iron = 40000, /datum/material/glass = 50000) - reagents_list = list(/datum/reagent/sonic_powder = 280) + materials = list(/datum/material/iron = 7500, /datum/material/glass = 5000) build_path = /obj/item/ammo_box/magazine/m10mm/hp category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -35,7 +33,7 @@ desc = "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets." id = "10mmap" build_type = PROTOLATHE - materials = list(/datum/material/iron = 40000, /datum/material/titanium = 60000) + materials = list(/datum/material/iron = 7500, /datum/material/titanium = 6500) build_path = /obj/item/ammo_box/magazine/m10mm/ap category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -54,7 +52,7 @@ name = "handgun magazine (.45)" id = "m45" build_type = PROTOLATHE - materials = list(/datum/material/iron = 80000) + materials = list(/datum/material/iron = 8000) build_path = /obj/item/ammo_box/magazine/m45 category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -64,7 +62,7 @@ desc = "A gun magazine." id = "pistolm9mm" build_type = PROTOLATHE - materials = list(/datum/material/iron = 80000) + materials = list(/datum/material/iron = 7500) build_path = /obj/item/ammo_box/magazine/pistolm9mm category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -84,7 +82,37 @@ desc = "A revolver speedloader. Cuts through like a hot knife through butter." id = "sl357ap" build_type = PROTOLATHE - materials = list(/datum/material/iron = 30000, /datum/material/titanium = 45000) + materials = list(/datum/material/iron = 30000, /datum/material/titanium = 5000) build_path = /obj/item/ammo_box/a357/ap category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/m10apbox + name = "ammo box (10mm Armour Piercing)" + desc = "A box of ammo containing 20 rounds designed to penetrate armor, at the cost of raw damage." + id = "m10apbox" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 30000, /datum/material/titanium = 6000) + build_path = /obj/item/ammo_box/c10mm/ap + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/m10firebox + name = "ammo box (10mm Incendiary)" + desc = "A box of ammo containing 20 rounds designed to set people ablaze, at the cost of raw damage." + id = "m10firebox" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 30000, /datum/material/plasma = 6000) + build_path = /obj/item/ammo_box/c10mm/fire + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/m10hpbox + name = "ammo box (10mm Hollowpoint)" + desc = "A box of ammo containing 20 rounds designed to tear through unarmored opponents, while being completely ineffective against armor." + id = "m10hpbox" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 30000, /datum/material/glass = 6000) + build_path = /obj/item/ammo_box/c10mm/hp + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index de27723508..2cdaef9c91 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -217,6 +217,6 @@ /datum/reagent/fermi/zeolites/reaction_obj(obj/O, reac_volume) var/datum/component/radioactive/contamination = O.GetComponent(/datum/component/radioactive) - if(contamination && reac_volume >= 5 && purity >= 0.7) //you need at least 0.7 purity to instantly purge all contam on an object. + if(contamination && purity >= 0.7) //you need at least 0.7 purity to instantly purge all contam on an object. qdel(contamination) - return + ..() diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi index a3f09819f2..51541619d4 100644 Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi index 3fe7f0060e..05cc1731fd 100644 Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ diff --git a/sound/ambience/antag/Malf.ogg b/sound/ambience/antag/Malf.ogg index feea5fbf19..c84ec5ecff 100644 Binary files a/sound/ambience/antag/Malf.ogg and b/sound/ambience/antag/Malf.ogg differ diff --git a/sound/announcer/classic/aimalf.ogg b/sound/announcer/classic/aimalf.ogg index b7996916b4..cd74872c66 100644 Binary files a/sound/announcer/classic/aimalf.ogg and b/sound/announcer/classic/aimalf.ogg differ diff --git a/sound/roundend/approachingbaystation.ogg b/sound/roundend/approachingbaystation.ogg new file mode 100644 index 0000000000..83f5f6aae7 Binary files /dev/null and b/sound/roundend/approachingbaystation.ogg differ diff --git a/sound/weapons/bladesliceb.ogg b/sound/weapons/bladesliceb.ogg new file mode 100644 index 0000000000..b916363acd Binary files /dev/null and b/sound/weapons/bladesliceb.ogg differ diff --git a/sound/weapons/mauler_punch.ogg b/sound/weapons/mauler_punch.ogg new file mode 100644 index 0000000000..3e610ea238 Binary files /dev/null and b/sound/weapons/mauler_punch.ogg differ diff --git a/tgstation.dme b/tgstation.dme index f7069d4783..fcd7821a87 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -51,6 +51,7 @@ #include "code\__DEFINES\economy.dm" #include "code\__DEFINES\events.dm" #include "code\__DEFINES\exosuit_fabs.dm" +#include "code\__DEFINES\explosion.dm" #include "code\__DEFINES\exports.dm" #include "code\__DEFINES\fantasy_affixes.dm" #include "code\__DEFINES\food.dm" @@ -272,6 +273,7 @@ #include "code\_onclick\hud\revenanthud.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\simple_animal.dm" #include "code\_onclick\hud\swarmer.dm" #include "code\_onclick\hud\screen_objects\clickdelay.dm" #include "code\_onclick\hud\screen_objects\sprint.dm" @@ -321,6 +323,7 @@ #include "code\controllers\subsystem\disease.dm" #include "code\controllers\subsystem\economy.dm" #include "code\controllers\subsystem\events.dm" +#include "code\controllers\subsystem\explosions.dm" #include "code\controllers\subsystem\fail2topic.dm" #include "code\controllers\subsystem\fire_burning.dm" #include "code\controllers\subsystem\fluid.dm" @@ -411,6 +414,7 @@ #include "code\datums\emotes.dm" #include "code\datums\ert.dm" #include "code\datums\explosion.dm" +#include "code\datums\explosion2.dm" #include "code\datums\forced_movement.dm" #include "code\datums\holocall.dm" #include "code\datums\http.dm" @@ -2626,7 +2630,7 @@ #include "code\modules\mob\living\carbon\human\species_types\abductor.dm" #include "code\modules\mob\living\carbon\human\species_types\android.dm" #include "code\modules\mob\living\carbon\human\species_types\angel.dm" -#include "code\modules\mob\living\carbon\human\species_types\anthromorph.dm" +#include "code\modules\mob\living\carbon\human\species_types\anthropomorph.dm" #include "code\modules\mob\living\carbon\human\species_types\arachnid.dm" #include "code\modules\mob\living\carbon\human\species_types\bugmen.dm" #include "code\modules\mob\living\carbon\human\species_types\corporate.dm" diff --git a/tgui/packages/tgui/interfaces/DecalPainter.js b/tgui/packages/tgui/interfaces/DecalPainter.js index 90ab589208..c28ba8b4f1 100644 --- a/tgui/packages/tgui/interfaces/DecalPainter.js +++ b/tgui/packages/tgui/interfaces/DecalPainter.js @@ -1,6 +1,7 @@ import { useBackend } from '../backend'; -import { Button, Section } from '../components'; +import { Box, Button, Section } from '../components'; import { Window } from '../layouts'; +import { classes } from 'common/react'; export const DecalPainter = (props, context) => { const { act, data } = useBackend(context); @@ -16,11 +17,25 @@ export const DecalPainter = (props, context) => { {decal_list.map(decal => ( ))}
@@ -28,7 +43,12 @@ export const DecalPainter = (props, context) => { return ( ); })}
@@ -45,7 +74,12 @@ export const DecalPainter = (props, context) => { return ( ); })} diff --git a/tgui/packages/tgui/interfaces/Limbgrower.js b/tgui/packages/tgui/interfaces/Limbgrower.js new file mode 100644 index 0000000000..b91c7e4b45 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Limbgrower.js @@ -0,0 +1,109 @@ +import { useBackend, useSharedState } from '../backend'; +import { Box, Button, Dimmer, Icon, LabeledList, Section, Tabs } from '../components'; +import { Window } from '../layouts'; + +export const Limbgrower = (props, context) => { + const { act, data } = useBackend(context); + const { + reagents = [], + total_reagents, + max_reagents, + categories = [], + busy, + disk = [], + } = data; + const [tab, setTab] = useSharedState( + context, 'category', categories[0]?.name); + const designList = categories + .find(category => category.name === tab) + ?.designs; + + return ( + + {!!busy && ( + + + {' Building...'} + + )} + +
act('eject_disk')} + disabled={!disk['disk']} + /> + }> + {disk['name'] ? ( +
+ Containing data for {disk['name']},
+ Attempting to create genitalia will use the disk's data. +
+ ) : disk['disk'] ? "No data." : "No disk."} +
+
+ + {total_reagents} / {max_reagents} reagent capacity used. + + + {reagents.map(reagent => ( + act('empty_reagent', { + reagent_type: reagent.reagent_type, + })} /> + )}> + {reagent.reagent_amount}u + + ))} + +
+
+ + {categories.map(category => ( + setTab(category.name)}> + {category.name} + + ))} + + + {designList.map(design => ( + act('make_limb', { + design_id: design.id, + active_tab: design.parent_category, + })} /> + )}> + {design.needed_reagents.map(reagent => ( + + {reagent.name}: {reagent.amount}u + + ))} + + ))} + +
+
+
+ ); +};