Merge pull request #79 from Citadel-Station-13/master

6/9
This commit is contained in:
EmeraldSundisk
2021-06-09 21:19:25 -07:00
committed by GitHub
338 changed files with 8832 additions and 3052 deletions
+12
View File
@@ -0,0 +1,12 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "byond",
"request": "launch",
"name": "Launch DreamSeeker",
"preLaunchTask": "Build All",
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
}
]
}
+15 -3
View File
@@ -6,8 +6,11 @@
"typescript.tsdk": "./tgui/.yarn/sdks/typescript/lib", "typescript.tsdk": "./tgui/.yarn/sdks/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true, "typescript.enablePromptUseWorkspaceTsdk": true,
"search.exclude": { "search.exclude": {
"tgui/.yarn": true, "**/.yarn": true,
"tgui/.pnp.*": true "**/.pnp.*": true
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}, },
"workbench.editorAssociations": [ "workbench.editorAssociations": [
{ {
@@ -17,5 +20,14 @@
], ],
"files.eol": "\n", "files.eol": "\n",
"gitlens.advanced.blame.customArguments": ["-w"], "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]
}
} }
+55
View File
@@ -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"
}
]
}
@@ -499,10 +499,6 @@
/mob/living/simple_animal/hostile/alien, /mob/living/simple_animal/hostile/alien,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface, /turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest) /area/ruin/unpowered/xenonest)
"bD" = (
/obj/structure/alien/weeds,
/turf/template_noop,
/area/ruin/unpowered/xenonest)
"dE" = ( "dE" = (
/obj/structure/alien/weeds, /obj/structure/alien/weeds,
/obj/structure/bed/nest, /obj/structure/bed/nest,
@@ -1573,8 +1569,8 @@ aa
aa aa
aa aa
ac ac
bD ag
bD ag
aa aa
"} "}
(20,1,1) = {" (20,1,1) = {"
@@ -1625,7 +1621,7 @@ aa
aa aa
aa aa
ac ac
bD ag
aa aa
"} "}
(21,1,1) = {" (21,1,1) = {"
@@ -1676,8 +1672,8 @@ ac
aa aa
aa aa
ac ac
bD ag
bD ag
"} "}
(22,1,1) = {" (22,1,1) = {"
ab ab
@@ -1727,8 +1723,8 @@ ac
ac ac
ac ac
aW aW
bD ag
bD ag
"} "}
(23,1,1) = {" (23,1,1) = {"
ab ab
@@ -1778,8 +1774,8 @@ ag
aw aw
ar ar
ag ag
bD ag
bD ag
"} "}
(24,1,1) = {" (24,1,1) = {"
ab ab
@@ -1829,8 +1825,8 @@ ag
aw aw
ar ar
ag ag
bD ag
bD ag
"} "}
(25,1,1) = {" (25,1,1) = {"
ab ab
@@ -1880,8 +1876,8 @@ ac
ac ac
ac ac
ac ac
bD ag
bD ag
"} "}
(26,1,1) = {" (26,1,1) = {"
ab ab
+120 -80
View File
@@ -23919,11 +23919,11 @@
dir = 4 dir = 4
}, },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/port) /area/maintenance/port)
"bfe" = ( "bfe" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/port) /area/maintenance/port)
"bff" = ( "bff" = (
@@ -25957,7 +25957,7 @@
/area/medical/paramedic) /area/medical/paramedic)
"bkd" = ( "bkd" = (
/obj/machinery/camera{ /obj/machinery/camera{
c_tag = "Medbay Morgue"; c_tag = "Paramedic Disbatch";
dir = 8; dir = 8;
network = list("ss13","medbay") network = list("ss13","medbay")
}, },
@@ -26360,7 +26360,7 @@
req_access_txt = "6" req_access_txt = "6"
}, },
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/medical/morgue) /area/maintenance/department/medical/morgue)
"blb" = ( "blb" = (
/obj/machinery/door/airlock/command{ /obj/machinery/door/airlock/command{
name = "Captain's Quarters"; name = "Captain's Quarters";
@@ -27606,13 +27606,13 @@
/obj/structure/sign/warning/radiation/rad_area{ /obj/structure/sign/warning/radiation/rad_area{
pixel_x = 32 pixel_x = 32
}, },
/obj/structure/cable{
icon_state = "0-2"
},
/obj/structure/cable{ /obj/structure/cable{
icon_state = "0-8" icon_state = "0-8"
}, },
/obj/effect/spawner/structure/window/reinforced, /obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
icon_state = "1-8"
},
/turf/open/floor/plating, /turf/open/floor/plating,
/area/engineering/gravity_generator) /area/engineering/gravity_generator)
"bnX" = ( "bnX" = (
@@ -33974,12 +33974,12 @@
}, },
/obj/machinery/bloodbankgen, /obj/machinery/bloodbankgen,
/obj/machinery/camera{ /obj/machinery/camera{
c_tag = "Medbay Recovery Room"; c_tag = "Medbay Surgery Storage";
dir = 6; dir = 6;
network = list("ss13","medbay") network = list("ss13","medbay")
}, },
/turf/open/floor/plasteel/white, /turf/open/floor/plasteel/white,
/area/medical/medbay/central) /area/medical/storage)
"bCD" = ( "bCD" = (
/obj/machinery/computer/operating, /obj/machinery/computer/operating,
/turf/open/floor/plasteel/white/side, /turf/open/floor/plasteel/white/side,
@@ -34354,11 +34354,14 @@
/area/engineering/storage/tech) /area/engineering/storage/tech)
"bDA" = ( "bDA" = (
/obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/structure/cable{
dir = 4 icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
}, },
/turf/open/floor/plasteel/white, /turf/open/floor/plasteel/white,
/area/medical/medbay/central) /area/medical/storage)
"bDB" = ( "bDB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4 dir = 4
@@ -34366,6 +34369,9 @@
/obj/structure/cable{ /obj/structure/cable{
icon_state = "1-4" icon_state = "1-4"
}, },
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plasteel/white/side{ /turf/open/floor/plasteel/white/side{
dir = 4 dir = 4
}, },
@@ -35118,7 +35124,7 @@
dir = 4 dir = 4
}, },
/turf/closed/wall, /turf/closed/wall,
/area/medical/medbay/central) /area/medical/storage)
"bFn" = ( "bFn" = (
/obj/structure/disposalpipe/segment{ /obj/structure/disposalpipe/segment{
dir = 5 dir = 5
@@ -35130,12 +35136,12 @@
/obj/structure/disposalpipe/segment{ /obj/structure/disposalpipe/segment{
dir = 10 dir = 10
}, },
/obj/machinery/light/small{
dir = 1
},
/obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/blood/old,
/obj/machinery/airalarm{
pixel_y = 23
},
/turf/open/floor/plasteel/white, /turf/open/floor/plasteel/white,
/area/medical/medbay/central) /area/medical/storage)
"bFp" = ( "bFp" = (
/obj/structure/closet/crate/freezer, /obj/structure/closet/crate/freezer,
/obj/item/reagent_containers/blood/random, /obj/item/reagent_containers/blood/random,
@@ -35162,8 +35168,11 @@
dir = 8; dir = 8;
sortType = 6 sortType = 6
}, },
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/plasteel/white, /turf/open/floor/plasteel/white,
/area/medical/medbay/central) /area/medical/storage)
"bFq" = ( "bFq" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow,
@@ -35187,8 +35196,11 @@
/obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment,
/obj/structure/closet/crate/freezer/surplus_limbs, /obj/structure/closet/crate/freezer/surplus_limbs,
/obj/item/reagent_containers/glass/beaker/synthflesh, /obj/item/reagent_containers/glass/beaker/synthflesh,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
/turf/open/floor/plasteel/white, /turf/open/floor/plasteel/white,
/area/medical/medbay/central) /area/medical/storage)
"bFu" = ( "bFu" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4 dir = 4
@@ -35222,8 +35234,9 @@
"bFx" = ( "bFx" = (
/obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment,
/obj/machinery/limbgrower, /obj/machinery/limbgrower,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel/white, /turf/open/floor/plasteel/white,
/area/medical/medbay/central) /area/medical/storage)
"bFy" = ( "bFy" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{ /obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1 dir = 1
@@ -35809,7 +35822,7 @@
dir = 4 dir = 4
}, },
/turf/closed/wall, /turf/closed/wall,
/area/medical/medbay/central) /area/medical/storage)
"bGR" = ( "bGR" = (
/obj/structure/table, /obj/structure/table,
/obj/item/storage/belt/medical{ /obj/item/storage/belt/medical{
@@ -35860,11 +35873,9 @@
/area/medical/medbay/central) /area/medical/medbay/central)
"bGW" = ( "bGW" = (
/obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ /obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
dir = 1
},
/turf/closed/wall, /turf/closed/wall,
/area/medical/medbay/central) /area/medical/storage)
"bGX" = ( "bGX" = (
/obj/machinery/light{ /obj/machinery/light{
dir = 8 dir = 8
@@ -37012,7 +37023,7 @@
dir = 9 dir = 9
}, },
/turf/closed/wall, /turf/closed/wall,
/area/medical/medbay/central) /area/medical/storage)
"bJB" = ( "bJB" = (
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, /obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
@@ -40879,8 +40890,8 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
"bTT" = ( "bTT" = (
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ /obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 8 dir = 1
}, },
/obj/machinery/meter, /obj/machinery/meter,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
@@ -52309,7 +52320,7 @@
dir = 4 dir = 4
}, },
/turf/open/floor/plating, /turf/open/floor/plating,
/area/science/robotics/mechbay) /area/maintenance/department/medical/morgue)
"cHF" = ( "cHF" = (
/obj/machinery/button/door{ /obj/machinery/button/door{
id = "Skynet_launch"; id = "Skynet_launch";
@@ -54428,7 +54439,7 @@
"fvk" = ( "fvk" = (
/obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment,
/turf/closed/wall, /turf/closed/wall,
/area/medical/medbay/central) /area/medical/storage)
"fvY" = ( "fvY" = (
/obj/machinery/computer/cryopod{ /obj/machinery/computer/cryopod{
pixel_y = 26 pixel_y = 26
@@ -55768,6 +55779,9 @@
req_access_txt = "45" req_access_txt = "45"
}, },
/obj/machinery/door/firedoor, /obj/machinery/door/firedoor,
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/medical/surgery) /area/medical/surgery)
"iVJ" = ( "iVJ" = (
@@ -56031,7 +56045,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4 dir = 4
}, },
/obj/structure/reagent_dispensers/fueltank, /obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/port) /area/maintenance/port)
"jyO" = ( "jyO" = (
@@ -56248,6 +56262,7 @@
/obj/structure/cable{ /obj/structure/cable{
icon_state = "1-2" icon_state = "1-2"
}, },
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/engine_smes) /area/engineering/engine_smes)
"jLv" = ( "jLv" = (
@@ -56560,7 +56575,7 @@
dir = 6 dir = 6
}, },
/obj/structure/cable{ /obj/structure/cable{
icon_state = "0-8" icon_state = "0-2"
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/gravity_generator) /area/engineering/gravity_generator)
@@ -57358,6 +57373,7 @@
/area/service/bar) /area/service/bar)
"moS" = ( "moS" = (
/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible, /obj/machinery/atmospherics/pipe/manifold4w/yellow/visible,
/obj/machinery/meter,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
"mps" = ( "mps" = (
@@ -57521,6 +57537,19 @@
/obj/structure/falsewall, /obj/structure/falsewall,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/security/prison) /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" = ( "mJo" = (
/obj/structure/door_assembly/door_assembly_mai, /obj/structure/door_assembly/door_assembly_mai,
/obj/item/electronics/airlock, /obj/item/electronics/airlock,
@@ -57562,9 +57591,6 @@
name = "Gravity Generator"; name = "Gravity Generator";
req_access_txt = "11" req_access_txt = "11"
}, },
/obj/structure/cable{
icon_state = "1-8"
},
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/engineering/gravity_generator) /area/engineering/gravity_generator)
"mOG" = ( "mOG" = (
@@ -58231,9 +58257,6 @@
/obj/effect/turf_decal/stripes/line{ /obj/effect/turf_decal/stripes/line{
dir = 4 dir = 4
}, },
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/light{ /obj/machinery/light{
dir = 4; dir = 4;
light_color = "#c1caff" light_color = "#c1caff"
@@ -60411,6 +60434,9 @@
/obj/effect/spawner/structure/window/reinforced, /obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/engineering/atmos) /area/engineering/atmos)
"tBV" = (
/turf/closed/wall,
/area/medical/storage)
"tCa" = ( "tCa" = (
/obj/structure/table/wood, /obj/structure/table/wood,
/obj/item/instrument/guitar{ /obj/item/instrument/guitar{
@@ -60524,6 +60550,9 @@
/obj/structure/cable{ /obj/structure/cable{
icon_state = "1-2" icon_state = "1-2"
}, },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/gravity_generator) /area/engineering/gravity_generator)
"tJS" = ( "tJS" = (
@@ -60754,10 +60783,10 @@
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/port/fore) /area/maintenance/port/fore)
"ugu" = ( "ugu" = (
/obj/structure/cable{
icon_state = "1-4"
},
/obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line,
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/gravity_generator) /area/engineering/gravity_generator)
"uhm" = ( "uhm" = (
@@ -61009,8 +61038,17 @@
dir = 4 dir = 4
}, },
/obj/structure/disposalpipe/segment, /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, /turf/open/floor/plasteel/white,
/area/medical/medbay/central) /area/medical/storage)
"uFZ" = ( "uFZ" = (
/obj/structure/closet/emcloset, /obj/structure/closet/emcloset,
/obj/effect/turf_decal/stripes/line{ /obj/effect/turf_decal/stripes/line{
@@ -61117,10 +61155,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5 dir = 5
}, },
/obj/structure/cable{
icon_state = "0-8"
},
/obj/machinery/power/terminal,
/turf/closed/wall/r_wall, /turf/closed/wall/r_wall,
/area/engineering/gravity_generator) /area/engineering/gravity_generator)
"uRn" = ( "uRn" = (
@@ -61327,15 +61361,24 @@
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/port) /area/maintenance/port)
"vob" = ( "vob" = (
/obj/structure/cable{ /obj/machinery/atmospherics/pipe/simple/yellow/visible,
icon_state = "1-4" /obj/machinery/meter,
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/gravity_generator) /area/engineering/atmos)
"voW" = ( "voW" = (
/obj/structure/pool/Lboard, /obj/structure/pool/Lboard,
/turf/open/pool, /turf/open/pool,
/area/commons/fitness/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" = ( "vpY" = (
/obj/structure/closet/lasertag/blue, /obj/structure/closet/lasertag/blue,
/obj/item/clothing/under/misc/pj/blue, /obj/item/clothing/under/misc/pj/blue,
@@ -61527,10 +61570,13 @@
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/starboard/fore) /area/maintenance/starboard/fore)
"vFr" = ( "vFr" = (
/obj/structure/cable{
icon_state = "4-8"
},
/obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line,
/obj/machinery/power/terminal{
dir = 4
},
/obj/structure/cable{
icon_state = "0-8"
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/gravity_generator) /area/engineering/gravity_generator)
"vGn" = ( "vGn" = (
@@ -62156,9 +62202,6 @@
/turf/open/floor/carpet/royalblue, /turf/open/floor/carpet/royalblue,
/area/maintenance/starboard/aft) /area/maintenance/starboard/aft)
"xgC" = ( "xgC" = (
/obj/structure/cable{
icon_state = "0-4"
},
/obj/machinery/power/apc{ /obj/machinery/power/apc{
areastring = "/area/engineering/gravity_generator"; areastring = "/area/engineering/gravity_generator";
dir = 8; dir = 8;
@@ -62172,13 +62215,13 @@
/obj/effect/turf_decal/stripes/line{ /obj/effect/turf_decal/stripes/line{
dir = 8 dir = 8
}, },
/obj/structure/cable{
icon_state = "0-2"
},
/obj/machinery/light{ /obj/machinery/light{
dir = 8; dir = 8;
light_color = "#e8eaff" light_color = "#e8eaff"
}, },
/obj/structure/cable{
icon_state = "0-2"
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/gravity_generator) /area/engineering/gravity_generator)
"xgF" = ( "xgF" = (
@@ -62188,13 +62231,10 @@
}, },
/area/maintenance/bar) /area/maintenance/bar)
"xhS" = ( "xhS" = (
/obj/structure/cable{
icon_state = "2-4"
},
/obj/structure/cable{
icon_state = "4-8"
},
/obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line,
/obj/structure/cable{
icon_state = "1-4"
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/gravity_generator) /area/engineering/gravity_generator)
"xhV" = ( "xhV" = (
@@ -81844,7 +81884,7 @@ aQN
aQN aQN
aZA aZA
aPA aPA
aWv jxF
aYb aYb
aZE aZE
aZE aZE
@@ -82615,7 +82655,7 @@ aQW
aQW aQW
xDM xDM
aPA aPA
jxF aWv
aYb aYb
aZE aZE
bjp bjp
@@ -84992,7 +85032,7 @@ btG
rXl rXl
xgC xgC
ugu ugu
bnV mJf
bph bph
bih bih
big big
@@ -85247,7 +85287,7 @@ xTy
xTy xTy
tJK tJK
xTy xTy
vob xTy
xhS xhS
mOB mOB
bph bph
@@ -86153,7 +86193,7 @@ aaa
aaa aaa
gXs gXs
gXs gXs
aaH gXs
abc abc
abu abu
abu abu
@@ -87036,11 +87076,11 @@ bCq
bSs bSs
ceY ceY
ccw ccw
ccw cjJ
cnR cnR
cgT cgT
cjJ cjJ
ccw cjJ
ccw ccw
ccw ccw
ccw ccw
@@ -95226,10 +95266,10 @@ aJq
bHt bHt
bBz bBz
bzs bzs
bof tBV
bFm bFm
bGI bGI
bof tBV
cBD cBD
bKD bKD
bLO bLO
@@ -95483,7 +95523,7 @@ bwu
kPj kPj
bBB bBB
eBX eBX
bof tBV
bFp bFp
uFV uFV
fvk fvk
@@ -95740,7 +95780,7 @@ aJq
bAj bAj
aJq aJq
aKG aKG
bof tBV
bFo bFo
bDA bDA
bFt bFt
@@ -95997,9 +96037,9 @@ byX
aXh aXh
bmE bmE
bCA bCA
bof tBV
bCC bCC
bDA voZ
bFx bFx
bGW bGW
bKI bKI
@@ -96267,7 +96307,7 @@ bPc
bQs bQs
cez cez
ceA ceA
daq bTT
bUN bUN
bOd bOd
bOd bOd
@@ -97299,9 +97339,9 @@ moS
kGv kGv
bUS bUS
cCE cCE
bTT bXU
bUS
bUS bUS
vob
bUS bUS
bXU bXU
bUS bUS
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+140 -76
View File
@@ -705,7 +705,7 @@
icon_state = "4-8" icon_state = "4-8"
}, },
/turf/open/floor/plating, /turf/open/floor/plating,
/area/commons/fitness/pool) /area/maintenance/department/crew_quarters/dorms)
"abG" = ( "abG" = (
/obj/structure/cable{ /obj/structure/cable{
icon_state = "1-2" icon_state = "1-2"
@@ -3392,6 +3392,10 @@
/obj/vehicle/ridden/secway, /obj/vehicle/ridden/secway,
/obj/item/key/security, /obj/item/key/security,
/obj/effect/turf_decal/bot, /obj/effect/turf_decal/bot,
/obj/machinery/airalarm{
dir = 1;
pixel_y = -22
},
/turf/open/floor/plasteel/showroomfloor, /turf/open/floor/plasteel/showroomfloor,
/area/security/office) /area/security/office)
"ais" = ( "ais" = (
@@ -4891,6 +4895,10 @@
/obj/effect/turf_decal/tile/red{ /obj/effect/turf_decal/tile/red{
dir = 8 dir = 8
}, },
/obj/machinery/airalarm{
dir = 4;
pixel_x = -23
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/security/brig) /area/security/brig)
"alz" = ( "alz" = (
@@ -10747,6 +10755,11 @@
name = "Port Solar APC"; name = "Port Solar APC";
pixel_y = 23 pixel_y = 23
}, },
/obj/machinery/camera{
c_tag = "Port Bow Solar";
dir = 9;
name = "solar camera"
},
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/solars/port) /area/maintenance/solars/port)
"ayD" = ( "ayD" = (
@@ -24639,6 +24652,12 @@
}, },
/turf/open/space, /turf/open/space,
/area/solars/starboard) /area/solars/starboard)
"beW" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 5
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
"beY" = ( "beY" = (
/obj/machinery/camera{ /obj/machinery/camera{
c_tag = "Arrivals Central"; c_tag = "Arrivals Central";
@@ -37279,7 +37298,7 @@
dir = 4 dir = 4
}, },
/turf/open/floor/plating, /turf/open/floor/plating,
/area/science/mixing) /area/maintenance/department/science)
"bGB" = ( "bGB" = (
/obj/machinery/light/small, /obj/machinery/light/small,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -37809,6 +37828,10 @@
/obj/effect/turf_decal/tile/purple{ /obj/effect/turf_decal/tile/purple{
dir = 8 dir = 8
}, },
/obj/item/radio/intercom{
pixel_x = 30;
pixel_y = -2
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/science/mixing) /area/science/mixing)
"bHI" = ( "bHI" = (
@@ -40347,15 +40370,9 @@
/obj/structure/cable{ /obj/structure/cable{
icon_state = "1-2" icon_state = "1-2"
}, },
/obj/machinery/atmospherics/components/binary/pump{ /obj/machinery/atmospherics/components/binary/pump/on{
dir = 8; dir = 8;
name = "Mix to Ports" name = "Unfiltered to Mix"
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bNk" = (
/obj/machinery/atmospherics/pipe/manifold/green/visible{
dir = 1
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
@@ -40364,8 +40381,9 @@
/obj/effect/turf_decal/tile/yellow{ /obj/effect/turf_decal/tile/yellow{
dir = 4 dir = 4
}, },
/obj/machinery/atmospherics/pipe/manifold/green/visible{ /obj/machinery/atmospherics/components/binary/pump/on{
dir = 1 dir = 4;
name = "Unfiltered & Air to Mix"
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
@@ -40801,23 +40819,19 @@
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
"bOo" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible,
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bOp" = ( "bOp" = (
/obj/structure/cable{ /obj/structure/cable{
icon_state = "1-2" icon_state = "1-2"
}, },
/obj/machinery/atmospherics/pipe/simple/general/visible{ /obj/machinery/atmospherics/components/binary/pump{
dir = 10 dir = 8;
name = "Pure to Mix"
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
"bOq" = ( "bOq" = (
/obj/machinery/atmospherics/components/binary/pump{ /obj/machinery/atmospherics/pipe/manifold/green/visible{
dir = 1; dir = 1
name = "Pure to Mix"
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
@@ -40836,7 +40850,7 @@
/turf/open/floor/engine/vacuum, /turf/open/floor/engine/vacuum,
/area/science/mixing) /area/science/mixing)
"bOu" = ( "bOu" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on{ /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input{
dir = 4 dir = 4
}, },
/turf/open/floor/plating/airless, /turf/open/floor/plating/airless,
@@ -41081,13 +41095,6 @@
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /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" = ( "bPd" = (
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ /obj/machinery/atmospherics/pipe/manifold/yellow/visible{
dir = 8 dir = 8
@@ -41399,7 +41406,6 @@
/obj/structure/cable{ /obj/structure/cable{
icon_state = "1-2" icon_state = "1-2"
}, },
/obj/machinery/atmospherics/pipe/simple/general/visible,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
"bPW" = ( "bPW" = (
@@ -41777,14 +41783,16 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
"bQK" = ( "bQK" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/obj/machinery/atmospherics/pipe/simple/general/visible{ /obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 4 dir = 4
}, },
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
"bQL" = ( "bQL" = (
/obj/machinery/atmospherics/pipe/manifold4w/general/visible, /obj/machinery/atmospherics/pipe/manifold/green/visible{
dir = 8
},
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
"bQM" = ( "bQM" = (
@@ -41792,9 +41800,8 @@
/obj/effect/turf_decal/tile/yellow{ /obj/effect/turf_decal/tile/yellow{
dir = 4 dir = 4
}, },
/obj/machinery/atmospherics/components/binary/pump/on{ /obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 1; dir = 10
name = "Unfiltered to Mix"
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
@@ -42101,8 +42108,7 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
"bRw" = ( "bRw" = (
/obj/machinery/atmospherics/pipe/manifold4w/general/visible, /obj/machinery/atmospherics/pipe/simple/general/visible,
/obj/machinery/meter,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/engineering/atmos) /area/engineering/atmos)
"bRx" = ( "bRx" = (
@@ -45936,14 +45942,8 @@
/turf/open/floor/engine, /turf/open/floor/engine,
/area/maintenance/disposal/incinerator) /area/maintenance/disposal/incinerator)
"bZV" = ( "bZV" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{ /turf/closed/wall,
dir = 8 /area/hallway/primary/fore)
},
/obj/machinery/door/airlock/external{
req_access_txt = "13"
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
"bZY" = ( "bZY" = (
/turf/closed/wall, /turf/closed/wall,
/area/service/chapel/office) /area/service/chapel/office)
@@ -52330,7 +52330,6 @@
/area/service/library) /area/service/library)
"czp" = ( "czp" = (
/obj/structure/table/wood, /obj/structure/table/wood,
/obj/item/disk/nuclear/fake,
/obj/item/barcodescanner, /obj/item/barcodescanner,
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/service/library) /area/service/library)
@@ -53827,6 +53826,12 @@
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/construction/mining/aux_base) /area/construction/mining/aux_base)
"eEd" = (
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 6
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
"eEp" = ( "eEp" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4 dir = 4
@@ -55196,6 +55201,15 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/construction/mining/aux_base) /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" = ( "hEX" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6 dir = 6
@@ -56737,6 +56751,12 @@
/obj/effect/turf_decal/delivery, /obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/engineering/main) /area/engineering/main)
"kWG" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 4
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
"kWQ" = ( "kWQ" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/machinery/atmospherics/pipe/simple/orange/visible,
/obj/structure/cable/yellow{ /obj/structure/cable/yellow{
@@ -57367,6 +57387,11 @@
name = "Starboard Solar APC"; name = "Starboard Solar APC";
pixel_x = -25 pixel_x = -25
}, },
/obj/machinery/camera{
c_tag = "Starboard Solar";
dir = 10;
name = "solar camera"
},
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/solars/starboard) /area/maintenance/solars/starboard)
"mwg" = ( "mwg" = (
@@ -57441,6 +57466,15 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall, /turf/closed/wall,
/area/maintenance/department/engine) /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" = ( "mCe" = (
/obj/effect/spawner/structure/window/reinforced, /obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{ /obj/machinery/door/poddoor/preopen{
@@ -58847,6 +58881,10 @@
}, },
/turf/open/floor/wood, /turf/open/floor/wood,
/area/service/lawoffice) /area/service/lawoffice)
"pEM" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible,
/turf/open/floor/plasteel,
/area/engineering/atmos)
"pFe" = ( "pFe" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/red{ /obj/effect/turf_decal/tile/red{
@@ -59368,6 +59406,13 @@
}, },
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/maintenance/department/crew_quarters/dorms) /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" = ( "qRl" = (
/obj/item/radio/intercom{ /obj/item/radio/intercom{
name = "Station Intercom (General)"; name = "Station Intercom (General)";
@@ -60108,6 +60153,13 @@
}, },
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/department/security/brig) /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" = ( "sIK" = (
/obj/effect/turf_decal/stripes/line{ /obj/effect/turf_decal/stripes/line{
dir = 8 dir = 8
@@ -61029,6 +61081,12 @@
}, },
/turf/open/floor/engine, /turf/open/floor/engine,
/area/engineering/main) /area/engineering/main)
"uST" = (
/obj/machinery/atmospherics/components/binary/pump{
name = "Mix to Ports"
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
"uUQ" = ( "uUQ" = (
/obj/machinery/door/airlock/maintenance{ /obj/machinery/door/airlock/maintenance{
name = "Engineering Maintenance"; name = "Engineering Maintenance";
@@ -61261,8 +61319,14 @@
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/department/science) /area/maintenance/department/science)
"vtT" = ( "vtT" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
/obj/machinery/door/airlock/external{
req_access_txt = "13"
},
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/solars/port) /area/maintenance/department/cargo)
"vuP" = ( "vuP" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4 dir = 4
@@ -62179,7 +62243,7 @@
"xuv" = ( "xuv" = (
/obj/item/broken_bottle, /obj/item/broken_bottle,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/solars/port) /area/maintenance/department/security/brig)
"xvO" = ( "xvO" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -79788,11 +79852,11 @@ atp
aus aus
aiu aiu
wxb wxb
axC aiu
xuv xuv
azN aoe
vtT ajD
vtT ajD
aiu aiu
apB apB
aiu aiu
@@ -82360,8 +82424,8 @@ apE
avq avq
apE apE
ajM ajM
aiu bZV
aiu bZV
gSH gSH
xJy xJy
sJr sJr
@@ -99640,7 +99704,7 @@ bJN
bKS bKS
bMe bMe
bNh bNh
bOo pEM
bOX bOX
bMf bMf
bMf bMf
@@ -100154,9 +100218,9 @@ bHw
bKU bKU
bOr bOr
bPU bPU
kWG
bRw bRw
bPa beW
bMf
bMf bMf
bMf bMf
bMf bMf
@@ -100410,13 +100474,13 @@ bIF
bHw bHw
bKV bKV
bOX bOX
bUv eEd
bQL bQL
bPa uST
bMf pEM
bMf
bMf
bMf bMf
qQu
qQu
bSU bSU
bTT bTT
bUv bUv
@@ -100670,10 +100734,10 @@ bMg
bNj bNj
bOp bOp
bPV bPV
bPV hEi
bPV sGJ
bPV bUw
bPV bUw
bUw bUw
bUw bUw
bUw bUw
@@ -100924,8 +100988,8 @@ bIH
bHw bHw
cqG cqG
bOX bOX
bNk
bOq bOq
mAR
bPd bPd
bPW bPW
bPW bPW
@@ -106255,7 +106319,7 @@ aaF
aaF aaF
aaF aaF
abF abF
aaF aiS
aiS aiS
atn atn
awC awC
@@ -107807,8 +107871,8 @@ aaa
aaa aaa
aaa aaa
aaa aaa
aEl aEj
aFi vtT
aEj aEj
aaa aaa
aEj aEj
@@ -108064,9 +108128,9 @@ aaa
aaa aaa
aaa aaa
aaa aaa
aEj cdm
bZV cdm
aEj cdm
aaa aaa
aaa aaa
aaa aaa
@@ -108321,9 +108385,9 @@ aaa
aaa aaa
aaa aaa
aaa aaa
ahi bBW
ahi bBW
ahi bBW
aaa aaa
aaa aaa
aaa aaa
File diff suppressed because it is too large Load Diff
+191
View File
@@ -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
"}
+1
View File
@@ -53,6 +53,7 @@
#define GELADIKINESIS /datum/mutation/human/geladikinesis #define GELADIKINESIS /datum/mutation/human/geladikinesis
#define CRYOKINESIS /datum/mutation/human/cryokinesis #define CRYOKINESIS /datum/mutation/human/cryokinesis
#define SPIDER_WEB /datum/mutation/human/webbing #define SPIDER_WEB /datum/mutation/human/webbing
#define CLUWNEMUT /datum/mutation/human/cluwne
#define UI_CHANGED "ui changed" #define UI_CHANGED "ui changed"
#define UE_CHANGED "ue changed" #define UE_CHANGED "ue changed"
+2 -2
View File
@@ -56,8 +56,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define UNUSED_RESERVATION_TURF_1 (1<<1) #define UNUSED_RESERVATION_TURF_1 (1<<1)
/// If a turf can be made dirty at roundstart. This is also used in areas. /// If a turf can be made dirty at roundstart. This is also used in areas.
#define CAN_BE_DIRTY_1 (1<<2) #define CAN_BE_DIRTY_1 (1<<2)
/// If blood cultists can draw runes or build structures on this turf
#define CULT_PERMITTED_1 (1<<3)
/// Blocks lava rivers being generated on the turf /// Blocks lava rivers being generated on the turf
#define NO_LAVA_GEN_1 (1<<6) #define NO_LAVA_GEN_1 (1<<6)
/// Blocks ruins spawning on the turf /// Blocks ruins spawning on the turf
@@ -92,6 +90,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define ABDUCTOR_PROOF (1<<11) #define ABDUCTOR_PROOF (1<<11)
/// If an area should be hidden from power consoles, power/atmosphere alerts, etc. /// If an area should be hidden from power consoles, power/atmosphere alerts, etc.
#define NO_ALERTS (1<<12) #define NO_ALERTS (1<<12)
/// If blood cultists can draw runes or build structures on this AREA.
#define CULT_PERMITTED (1<<13)
/* /*
These defines are used specifically with the atom/pass_flags bitmask These defines are used specifically with the atom/pass_flags bitmask
+1
View File
@@ -51,3 +51,4 @@
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances #define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
#define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment. #define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment.
#define ORGAN_EDIBLE (1<<7) //is a snack? :D #define ORGAN_EDIBLE (1<<7) //is a snack? :D
#define ORGAN_SYNTHETIC_EMP (1<<6) //Synthetic organ affected by an EMP. Deteriorates over time.
+1
View File
@@ -82,6 +82,7 @@
#define ADMIN_PUNISHMENT_PICKLE "Pickle-ify" #define ADMIN_PUNISHMENT_PICKLE "Pickle-ify"
#define ADMIN_PUNISHMENT_FRY "Fry" #define ADMIN_PUNISHMENT_FRY "Fry"
#define ADMIN_PUNISHMENT_PERFORATE ":B:erforate" #define ADMIN_PUNISHMENT_PERFORATE ":B:erforate"
#define ADMIN_PUNISHMENT_CLUWNE "Cluwne"
#define AHELP_ACTIVE 1 #define AHELP_ACTIVE 1
#define AHELP_CLOSED 2 #define AHELP_CLOSED 2
+1 -1
View File
@@ -160,7 +160,7 @@
#define ATMOS_TANK_PLASMA "plasma=70000;TEMP=293.15" #define ATMOS_TANK_PLASMA "plasma=70000;TEMP=293.15"
#define ATMOS_TANK_O2 "o2=100000;TEMP=293.15" #define ATMOS_TANK_O2 "o2=100000;TEMP=293.15"
#define ATMOS_TANK_N2 "n2=100000;TEMP=293.15" #define ATMOS_TANK_N2 "n2=100000;TEMP=293.15"
#define ATMOS_TANK_AIRMIX "o2=2644;n2=10580;TEMP=293.15" #define ATMOS_TANK_AIRMIX "o2=2811;n2=10583;TEMP=293.15"
//LAVALAND //LAVALAND
#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
+1 -1
View File
@@ -158,7 +158,7 @@
/// how long they're staggered for /// how long they're staggered for
#define SHOVE_STAGGER_DURATION 35 #define SHOVE_STAGGER_DURATION 35
/// how long they're off balance for /// how long they're off balance for
#define SHOVE_OFFBALANCE_DURATION 30 #define SHOVE_OFFBALANCE_DURATION 3 SECONDS
//Embedded objects //Embedded objects
+8
View File
@@ -23,6 +23,14 @@
#define WINDOW_IN_FRAME 1 #define WINDOW_IN_FRAME 1
#define WINDOW_SCREWED_TO_FRAME 2 #define WINDOW_SCREWED_TO_FRAME 2
//reinforced plasma window construction states
#define PRWINDOW_FRAME_BOLTED 3
#define PRWINDOW_BARS_CUT 4
#define PRWINDOW_POPPED 5
#define PRWINDOW_BOLTS_OUT 6
#define PRWINDOW_BOLTS_HEATED 7
#define PRWINDOW_SECURE 8
//airlock assembly construction states //airlock assembly construction states
#define AIRLOCK_ASSEMBLY_NEEDS_WIRES 0 #define AIRLOCK_ASSEMBLY_NEEDS_WIRES 0
#define AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS 1 #define AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS 1
+2
View File
@@ -83,6 +83,8 @@
#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) #define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
#define COMPONENT_ATOM_BLOCK_EXIT 1 #define COMPONENT_ATOM_BLOCK_EXIT 1
#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc) #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) ///from base of atom/ex_act(): (severity, target)
#define COMSIG_ATOM_EX_ACT "atom_ex_act" #define COMSIG_ATOM_EX_ACT "atom_ex_act"
///from base of atom/emp_act(): (severity) ///from base of atom/emp_act(): (severity)
+86
View File
@@ -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
+1
View File
@@ -77,6 +77,7 @@
#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible #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 TABLE_LAYER 2.8
#define TRAY_LAYER 2.85 #define TRAY_LAYER 2.85
#define GATEWAY_UNDERLAY_LAYER 2.85
#define BELOW_OBJ_LAYER 2.9 #define BELOW_OBJ_LAYER 2.9
#define LOW_ITEM_LAYER 2.95 #define LOW_ITEM_LAYER 2.95
//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
+1 -1
View File
@@ -180,6 +180,7 @@
#define FIRE_PRIORITY_PROJECTILES 200 #define FIRE_PRIORITY_PROJECTILES 200
#define FIRE_PRIORITY_TICKER 200 #define FIRE_PRIORITY_TICKER 200
#define FIRE_PRIORITY_ATMOS_ADJACENCY 300 #define FIRE_PRIORITY_ATMOS_ADJACENCY 300
#define FIRE_PRIORITY_EXPLOSIONS 350
#define FIRE_PRIORITY_STATPANEL 390 #define FIRE_PRIORITY_STATPANEL 390
#define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_CHAT 400
#define FIRE_PRIORITY_RUNECHAT 410 #define FIRE_PRIORITY_RUNECHAT 410
@@ -219,7 +220,6 @@
A.flags_1 &= ~OVERLAY_QUEUED_1;\ A.flags_1 &= ~OVERLAY_QUEUED_1;\
} while(FALSE) } while(FALSE)
/** /**
Create a new timer and add it to the queue. Create a new timer and add it to the queue.
* Arguments: * Arguments:
+1
View File
@@ -165,6 +165,7 @@
#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events" #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_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_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_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_MAULER "mauler" // this guy punches the shit out of people to hurt them, not to drain their stamina
#define TRAIT_PASSTABLE "passtable" #define TRAIT_PASSTABLE "passtable"
+1 -1
View File
@@ -14,7 +14,6 @@
//socks //socks
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list)
//bodypart accessories (blizzard intensifies) //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/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_animated/lizard, GLOB.animated_tails_list_lizard)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human)
@@ -68,6 +67,7 @@
for(var/spath in subtypesof(/datum/species)) for(var/spath in subtypesof(/datum/species))
var/datum/species/S = new spath() var/datum/species/S = new spath()
GLOB.species_list[S.id] = spath GLOB.species_list[S.id] = spath
GLOB.species_datums[S.id] = S
//Surgeries //Surgeries
for(var/path in subtypesof(/datum/surgery)) for(var/path in subtypesof(/datum/surgery))
+3 -13
View File
@@ -64,8 +64,6 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list)
if(!GLOB.legs_list.len) if(!GLOB.legs_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list) 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) if(!GLOB.wings_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list)
if(!GLOB.deco_wings_list.len) if(!GLOB.deco_wings_list.len)
@@ -115,15 +113,6 @@
continue continue
if(!S.ckeys_allowed) if(!S.ckeys_allowed)
snowflake_mam_tails_list[S.name] = mtpath 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() var/list/snowflake_ears_list = list()
for(var/mepath in GLOB.mam_ears_list) for(var/mepath in GLOB.mam_ears_list)
var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[mepath] var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[mepath]
@@ -177,7 +166,6 @@
"ears" = "None", "ears" = "None",
"frills" = pick(GLOB.frills_list), "frills" = pick(GLOB.frills_list),
"spines" = pick(GLOB.spines_list), "spines" = pick(GLOB.spines_list),
"body_markings" = pick(GLOB.body_markings_list),
"legs" = pick("Plantigrade","Digitigrade"), "legs" = pick("Plantigrade","Digitigrade"),
"caps" = pick(GLOB.caps_list), "caps" = pick(GLOB.caps_list),
"insect_wings" = pick(GLOB.insect_wings_list), "insect_wings" = pick(GLOB.insect_wings_list),
@@ -187,7 +175,7 @@
"arachnid_spinneret" = pick(GLOB.arachnid_spinneret_list), "arachnid_spinneret" = pick(GLOB.arachnid_spinneret_list),
"arachnid_mandibles" = pick(GLOB.arachnid_mandibles_list), "arachnid_mandibles" = pick(GLOB.arachnid_mandibles_list),
"taur" = "None", "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_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None",
"mam_snouts" = snowflake_mam_snouts_list ? pick(snowflake_mam_snouts_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", "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_list)
GLOBAL_LIST_EMPTY(species_datums)
/proc/age2agedescription(age) /proc/age2agedescription(age)
switch(age) switch(age)
if(0 to 1) if(0 to 1)
+6
View File
@@ -95,3 +95,9 @@
if("I'm feeling lucky") if("I'm feeling lucky")
chosen_id = pick(subtypesof(/datum/reagent)) chosen_id = pick(subtypesof(/datum/reagent))
return chosen_id 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
+1 -2
View File
@@ -551,8 +551,7 @@
///How many players joined the round. ///How many players joined the round.
var/total_players = GLOB.joined_player_list.len var/total_players = GLOB.joined_player_list.len
var/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote)) var/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote))
for(var/i in SSeconomy.generated_accounts) for(var/datum/bank_account/current_acc in SSeconomy.generated_accounts)
var/datum/bank_account/current_acc = SSeconomy.generated_accounts[i]
if(typecache_bank[current_acc.type]) if(typecache_bank[current_acc.type])
continue continue
station_vault += current_acc.account_balance station_vault += current_acc.account_balance
+1 -1
View File
@@ -15,7 +15,7 @@ GLOBAL_LIST_INIT(bitfields, list(
"ABDUCTOR_PROOF" = ABDUCTOR_PROOF, "ABDUCTOR_PROOF" = ABDUCTOR_PROOF,
"BLOBS_ALLOWED" = BLOBS_ALLOWED, "BLOBS_ALLOWED" = BLOBS_ALLOWED,
"BLOCK_SUICIDE" = BLOCK_SUICIDE, "BLOCK_SUICIDE" = BLOCK_SUICIDE,
// "CULT_PERMITTED" = CULT_PERMITTED, "CULT_PERMITTED" = CULT_PERMITTED,
"FLORA_ALLOWED" = FLORA_ALLOWED, "FLORA_ALLOWED" = FLORA_ALLOWED,
"HIDDEN_AREA" = HIDDEN_AREA, "HIDDEN_AREA" = HIDDEN_AREA,
"MEGAFAUNA_SPAWN_ALLOWED" = MEGAFAUNA_SPAWN_ALLOWED, "MEGAFAUNA_SPAWN_ALLOWED" = MEGAFAUNA_SPAWN_ALLOWED,
+6 -3
View File
@@ -17,7 +17,6 @@ GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name
//Socks //Socks
GLOBAL_LIST_EMPTY_TYPED(socks_list, /datum/sprite_accessory/underwear/socks) //stores socks indexed by name GLOBAL_LIST_EMPTY_TYPED(socks_list, /datum/sprite_accessory/underwear/socks) //stores socks indexed by name
//Lizard Bits (all datum lists 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(tails_list_lizard)
GLOBAL_LIST_EMPTY(animated_tails_list_lizard) GLOBAL_LIST_EMPTY(animated_tails_list_lizard)
GLOBAL_LIST_EMPTY(snouts_list) GLOBAL_LIST_EMPTY(snouts_list)
@@ -55,7 +54,6 @@ GLOBAL_LIST_INIT(mutant_reference_list, list(
"frills" = GLOB.frills_list, "frills" = GLOB.frills_list,
"horns" = GLOB.horns_list, "horns" = GLOB.horns_list,
"ears" = GLOB.ears_list, "ears" = GLOB.ears_list,
"body_markings" = GLOB.body_markings_list,
"wings" = GLOB.wings_list, "wings" = GLOB.wings_list,
"wingsopen" = GLOB.wings_open_list, "wingsopen" = GLOB.wings_open_list,
"deco_wings" = GLOB.deco_wings_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 //locked parts are those that your picked species requires to have
//unlocked parts are those that anyone can choose on customisation regardless //unlocked parts are those that anyone can choose on customisation regardless
//parts not in unlocked, but in all, are thus locked //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")) 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 //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 //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")) 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)))
+1
View File
@@ -89,6 +89,7 @@
//Generic living //Generic living
#define ui_living_pull "EAST-1:28,CENTER-2:15" #define ui_living_pull "EAST-1:28,CENTER-2:15"
#define ui_living_health "EAST-1:28,CENTER:15" #define ui_living_health "EAST-1:28,CENTER:15"
#define ui_living_healthdoll "EAST-1:28,CENTER-1:15"
//Monkeys //Monkeys
#define ui_monkey_head "CENTER-5:13,SOUTH:5" #define ui_monkey_head "CENTER-5:13,SOUTH:5"
-1
View File
@@ -13,7 +13,6 @@ GLOBAL_LIST_EMPTY(radial_menus)
icon_state = "radial_slice" icon_state = "radial_slice"
var/choice var/choice
var/next_page = FALSE var/next_page = FALSE
var/tooltips = FALSE
/obj/screen/radial/slice/MouseEntered(location, control, params) /obj/screen/radial/slice/MouseEntered(location, control, params)
. = ..() . = ..()
+5
View File
@@ -637,6 +637,11 @@
name = "health doll" name = "health doll"
screen_loc = ui_healthdoll 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 /obj/screen/mood
name = "mood" name = "mood"
icon_state = "mood5" icon_state = "mood5"
+15
View File
@@ -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
+2 -2
View File
@@ -61,14 +61,14 @@ SUBSYSTEM_DEF(activity)
for(var/threat in threat_history) for(var/threat in threat_history)
. = max(threat_history[threat], .) . = 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)) if(!("explosions" in deferred_threats))
deferred_threats["explosions"] = 0 deferred_threats["explosions"] = 0
var/area/A = get_area(epicenter) var/area/A = get_area(epicenter)
if(is_station_level(epicenter.z) && (A.area_flags & BLOBS_ALLOWED) && !istype(A, /area/asteroid)) 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 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)) if(!("crew_deaths" in deferred_threats))
deferred_threats["crew_deaths"] = 0 deferred_threats["crew_deaths"] = 0
if(M?.mind && SSjob.GetJob(M.mind.assigned_role)) if(M?.mind && SSjob.GetJob(M.mind.assigned_role))
+23
View File
@@ -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
+2 -1
View File
@@ -713,7 +713,8 @@ SUBSYSTEM_DEF(ticker)
'sound/roundend/disappointed.ogg', 'sound/roundend/disappointed.ogg',
'sound/roundend/gondolabridge.ogg', 'sound/roundend/gondolabridge.ogg',
'sound/roundend/haveabeautifultime.ogg', 'sound/roundend/haveabeautifultime.ogg',
'sound/roundend/CitadelStationHasSeenBetterDays.ogg'\ 'sound/roundend/CitadelStationHasSeenBetterDays.ogg',
'sound/roundend/approachingbaystation.ogg'\
) )
SEND_SOUND(world, sound(round_end_sound)) SEND_SOUND(world, sound(round_end_sound))
+5
View File
@@ -176,6 +176,11 @@
scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE) scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE)
enter_subsystem() enter_subsystem()
var/mob/living/silicon/robot/R = target
if(iscyborg(R))
if(R.module.dogborg == TRUE || R.dogborg == TRUE) //I hate whoever that thought that putting two types of dogborg that don't even sync up properly was good
message.pixel_x = 16
/** /**
* Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion * Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion
* Arguments: * Arguments:
+8 -1
View File
@@ -52,8 +52,15 @@
return return
strength -= strength / hl3_release_date strength -= strength / hl3_release_date
if(strength <= RAD_BACKGROUND_RADIATION) 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) /datum/component/radioactive/proc/glow_loop(atom/movable/master)
var/filter = master.get_filter("rad_glow") var/filter = master.get_filter("rad_glow")
@@ -57,7 +57,7 @@
/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper,
/obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, /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/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() /datum/component/storage/concrete/pockets/shoes/clown/Initialize()
+378
View File
@@ -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
+2 -1
View File
@@ -142,7 +142,8 @@
// Can most things breathe? // Can most things breathe?
if(trace_gases) if(trace_gases)
continue 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 continue
if(A.get_moles(/datum/gas/plasma)) if(A.get_moles(/datum/gas/plasma))
continue continue
+2
View File
@@ -165,6 +165,7 @@
ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT) ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT)
ADD_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT) ADD_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
ADD_TRAIT(H, TRAIT_TASED_RESISTANCE, 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.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.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 H.physiology.stamina_mod *= 0.4 //You take less stamina damage overall, but you do not reduce the damage from stun batons as much
@@ -181,6 +182,7 @@
REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT) REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT)
REMOVE_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT) REMOVE_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
REMOVE_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT) REMOVE_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT)
REMOVE_TRAIT(H, TRAIT_NOPUGILIST, SLEEPING_CARP_TRAIT)
H.physiology.brute_mod = initial(H.physiology.brute_mod) H.physiology.brute_mod = initial(H.physiology.brute_mod)
H.physiology.burn_mod = initial(H.physiology.burn_mod) H.physiology.burn_mod = initial(H.physiology.burn_mod)
H.physiology.stamina_mod = initial(H.physiology.stamina_mod) H.physiology.stamina_mod = initial(H.physiology.stamina_mod)
+57
View File
@@ -0,0 +1,57 @@
/datum/mutation/human/cluwne
name = "Cluwne"
quality = NEGATIVE
locked = TRUE
text_gain_indication = "<span class='danger'>You feel like your brain is tearing itself apart.</span>"
/datum/mutation/human/cluwne/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
owner.dna.add_mutation(CLOWNMUT)
owner.dna.add_mutation(EPILEPSY)
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 199, 199)
var/mob/living/carbon/human/H = owner
if(!istype(H.wear_mask, /obj/item/clothing/mask/gas/cluwne))
if(!H.dropItemToGround(H.wear_mask))
qdel(H.wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/cluwne(H), SLOT_WEAR_MASK)
if(!istype(H.w_uniform, /obj/item/clothing/under/cluwne))
if(!H.dropItemToGround(H.w_uniform))
qdel(H.w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/under/cluwne(H), SLOT_W_UNIFORM)
if(!istype(H.shoes, /obj/item/clothing/shoes/clown_shoes/cluwne))
if(!H.dropItemToGround(H.shoes))
qdel(H.shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes/cluwne(H), SLOT_SHOES)
owner.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(owner), SLOT_GLOVES) // this is purely for cosmetic purposes incase they aren't wearing anything in that slot
owner.equip_to_slot_or_del(new /obj/item/storage/backpack/clown(owner), SLOT_BACK) // ditto
/datum/mutation/human/cluwne/on_life(mob/living/carbon/human/owner)
if((prob(15) && owner.IsUnconscious()))
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 199, 199) // there I changed it to setBrainLoss
switch(rand(1, 6))
if(1)
owner.say("HONK")
if(2 to 5)
owner.emote("scream")
if(6)
owner.Stun(1)
owner.Knockdown(20)
owner.Jitter(500)
/datum/mutation/human/cluwne/on_losing(mob/living/carbon/human/owner)
owner.adjust_fire_stacks(1)
owner.IgniteMob()
owner.dna.add_mutation(CLUWNEMUT)
/mob/living/carbon/human/proc/cluwneify()
dna.add_mutation(CLUWNEMUT)
emote("scream")
regenerate_icons()
visible_message("<span class='danger'>[src]'s body glows green, the glow dissipating only to leave behind a cluwne formerly known as [src]!</span>", \
"<span class='danger'>Your brain feels like it's being torn apart, there is only the honkmother now.</span>")
flash_act()
+1 -1
View File
@@ -11,7 +11,7 @@
/datum/mutation/human/space_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) /datum/mutation/human/space_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..() ..()
if(!(type in visual_indicators)) 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() /datum/mutation/human/space_adaptation/get_visual_indicator()
return visual_indicators[type][1] return visual_indicators[type][1]
+10 -13
View File
@@ -209,7 +209,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Generic Maintenance" name = "Generic Maintenance"
// ambience_index = AMBIENCE_MAINT // ambience_index = AMBIENCE_MAINT
ambientsounds = MAINTENANCE ambientsounds = MAINTENANCE
area_flags = BLOBS_ALLOWED | UNIQUE_AREA area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
// airlock_wires = /datum/wires/airlock/maint // airlock_wires = /datum/wires/airlock/maint
sound_environment = SOUND_AREA_TUNNEL_ENCLOSED sound_environment = SOUND_AREA_TUNNEL_ENCLOSED
@@ -294,7 +294,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/maintenance/department/science/xenobiology /area/maintenance/department/science/xenobiology
name = "Xenobiology Maintenance" name = "Xenobiology Maintenance"
icon_state = "xenomaint" icon_state = "xenomaint"
area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | XENOBIOLOGY_COMPATIBLE area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | XENOBIOLOGY_COMPATIBLE | CULT_PERMITTED
//Maintenance - Generic //Maintenance - Generic
@@ -598,11 +598,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/commons /area/commons
name = "Crew Quarters" name = "Crew Quarters"
sound_environment = SOUND_AREA_STANDARD_STATION sound_environment = SOUND_AREA_STANDARD_STATION
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
/area/commons/dorms /area/commons/dorms
name = "Dormitories" name = "Dormitories"
icon_state = "dorms" icon_state = "dorms"
area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA
/area/commons/dorms/barracks /area/commons/dorms/barracks
name = "Sleep Barracks" name = "Sleep Barracks"
@@ -899,7 +899,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
// mood_bonus = 5 // mood_bonus = 5
// mood_message = "<span class='nicegreen'>I love being in the library!</span>\n" // mood_message = "<span class='nicegreen'>I love being in the library!</span>\n"
// mood_trait = TRAIT_INTROVERT // mood_trait = TRAIT_INTROVERT
flags_1 = CULT_PERMITTED_1 area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
sound_environment = SOUND_AREA_LARGE_SOFTFLOOR sound_environment = SOUND_AREA_LARGE_SOFTFLOOR
/area/service/library/lounge /area/service/library/lounge
@@ -926,7 +926,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/service/library/abandoned /area/service/library/abandoned
name = "Abandoned Library" name = "Abandoned Library"
icon_state = "abandoned_library" icon_state = "abandoned_library"
flags_1 = CULT_PERMITTED_1
nightshift_public_area = NIGHTSHIFT_AREA_NONE nightshift_public_area = NIGHTSHIFT_AREA_NONE
/area/service/chapel /area/service/chapel
@@ -973,8 +972,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/service/janitor /area/service/janitor
name = "Custodial Closet" name = "Custodial Closet"
icon_state = "janitor" icon_state = "janitor"
flags_1 = CULT_PERMITTED_1
sound_environment = SOUND_AREA_SMALL_ENCLOSED sound_environment = SOUND_AREA_SMALL_ENCLOSED
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
/area/service/janitor/aux /area/service/janitor/aux
name = "Auxiliary Custodial Closet" name = "Auxiliary Custodial Closet"
@@ -1027,7 +1026,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/engineering/atmos /area/engineering/atmos
name = "Atmospherics" name = "Atmospherics"
icon_state = "atmos" icon_state = "atmos"
flags_1 = CULT_PERMITTED_1
/area/engineering/atmos/upper /area/engineering/atmos/upper
name = "Upper Atmospherics" name = "Upper Atmospherics"
@@ -1035,7 +1033,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/engineering/atmospherics_engine /area/engineering/atmospherics_engine
name = "Atmospherics Engine" name = "Atmospherics Engine"
icon_state = "atmos_engine" icon_state = "atmos_engine"
area_flags = BLOBS_ALLOWED | UNIQUE_AREA area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
/area/engineering/lobby /area/engineering/lobby
name = "Engineering Lobby" name = "Engineering Lobby"
@@ -1044,7 +1042,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/engineering/supermatter /area/engineering/supermatter
name = "Supermatter Engine" name = "Supermatter Engine"
icon_state = "engine_sm" icon_state = "engine_sm"
area_flags = BLOBS_ALLOWED | UNIQUE_AREA area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
sound_environment = SOUND_AREA_SMALL_ENCLOSED sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/engineering/break_room /area/engineering/break_room
@@ -1084,7 +1082,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/engineering/storage/tcomms /area/engineering/storage/tcomms
name = "Telecomms Storage" name = "Telecomms Storage"
icon_state = "tcom" icon_state = "tcom"
area_flags = BLOBS_ALLOWED | UNIQUE_AREA area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
clockwork_warp_allowed = FALSE clockwork_warp_allowed = FALSE
//Engineering - Construction //Engineering - Construction
@@ -1314,7 +1312,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/medical/virology /area/medical/virology
name = "Virology" name = "Virology"
icon_state = "virology" icon_state = "virology"
flags_1 = CULT_PERMITTED_1
/area/medical/morgue /area/medical/morgue
name = "Morgue" name = "Morgue"
@@ -1608,7 +1605,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/science/test_area /area/science/test_area
name = "Toxins Test Area" name = "Toxins Test Area"
icon_state = "tox_test" icon_state = "tox_test"
area_flags = BLOBS_ALLOWED | UNIQUE_AREA area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
/area/science/mixing /area/science/mixing
name = "Toxins Mixing Lab" name = "Toxins Mixing Lab"
@@ -1617,7 +1614,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/science/mixing/chamber /area/science/mixing/chamber
name = "Toxins Mixing Chamber" name = "Toxins Mixing Chamber"
icon_state = "tox_mix_chamber" icon_state = "tox_mix_chamber"
area_flags = BLOBS_ALLOWED | UNIQUE_AREA area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
/area/science/misc_lab /area/science/misc_lab
name = "Testing Lab" name = "Testing Lab"
+1 -1
View File
@@ -13,7 +13,7 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT mouse_opacity = MOUSE_OPACITY_TRANSPARENT
invisibility = INVISIBILITY_LIGHTING invisibility = INVISIBILITY_LIGHTING
var/area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA var/area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
var/fire = null var/fire = null
///Whether there is an atmos alarm in this area ///Whether there is an atmos alarm in this area
+1 -1
View File
@@ -11,7 +11,7 @@
dynamic_lighting = DYNAMIC_LIGHTING_FORCED dynamic_lighting = DYNAMIC_LIGHTING_FORCED
requires_power = FALSE requires_power = FALSE
has_gravity = STANDARD_GRAVITY has_gravity = STANDARD_GRAVITY
area_flags = VALID_TERRITORY | UNIQUE_AREA | NOTELEPORT area_flags = UNIQUE_AREA | NOTELEPORT
flags_1 = NONE flags_1 = NONE
/area/centcom/control /area/centcom/control
+4 -4
View File
@@ -3,7 +3,6 @@
icon_state = "Holodeck" icon_state = "Holodeck"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
flags_1 = NONE flags_1 = NONE
area_flags = VALID_TERRITORY | UNIQUE_AREA
sound_environment = SOUND_ENVIRONMENT_PADDED_CELL sound_environment = SOUND_ENVIRONMENT_PADDED_CELL
var/obj/machinery/computer/holodeck/linked var/obj/machinery/computer/holodeck/linked
@@ -87,9 +86,6 @@
/area/holodeck/rec_center/lounge /area/holodeck/rec_center/lounge
name = "Holodeck - Lounge" name = "Holodeck - Lounge"
/area/holodeck/rec_center/medical
name = "Holodeck - Emergency Medical"
/area/holodeck/rec_center/pet_lounge /area/holodeck/rec_center/pet_lounge
name = "Holodeck - Pet Park" name = "Holodeck - Pet Park"
@@ -128,6 +124,10 @@
name = "Holodeck - Holdout Bunker" name = "Holodeck - Holdout Bunker"
restricted = 1 restricted = 1
/area/holodeck/rec_center/medical
name = "Holodeck - Emergency Medical"
restricted = 1
/area/holodeck/rec_center/anthophila /area/holodeck/rec_center/anthophila
name = "Holodeck - Anthophila" name = "Holodeck - Anthophila"
restricted = 1 restricted = 1
+2 -2
View File
@@ -157,10 +157,10 @@
/area/shuttle/escape /area/shuttle/escape
name = "Emergency Shuttle" name = "Emergency Shuttle"
area_flags = BLOBS_ALLOWED area_flags = BLOBS_ALLOWED | CULT_PERMITTED
// area_limited_icon_smoothing = /area/shuttle/escape // area_limited_icon_smoothing = /area/shuttle/escape
canSmoothWithAreas = /area/shuttle/escape canSmoothWithAreas = /area/shuttle/escape
flags_1 = CAN_BE_DIRTY_1 // | CULT_PERMITTED_1 flags_1 = CAN_BE_DIRTY_1
/area/shuttle/escape/backup /area/shuttle/escape/backup
name = "Backup Emergency Shuttle" name = "Backup Emergency Shuttle"
+36 -1
View File
@@ -36,6 +36,14 @@
///Value used to increment ex_act() if reactionary_explosions is on ///Value used to increment ex_act() if reactionary_explosions is on
var/explosion_block = 0 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 * used to store the different colors on an atom
* *
@@ -43,7 +51,6 @@
*/ */
var/list/atom_colours var/list/atom_colours
/// a very temporary list of overlays to remove /// a very temporary list of overlays to remove
var/list/remove_overlays var/list/remove_overlays
/// a very temporary list of overlays to add /// a very temporary list of overlays to add
@@ -556,6 +563,34 @@
contents_explosion(severity, target) contents_explosion(severity, target)
SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, 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) /atom/proc/blob_act(obj/structure/blob/B)
SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B)
return return
+4 -1
View File
@@ -55,6 +55,9 @@
///Internal holder for emissive blocker object, do not use directly use blocks_emissive ///Internal holder for emissive blocker object, do not use directly use blocks_emissive
var/atom/movable/emissive_blocker/em_block 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) /atom/movable/Initialize(mapload)
. = ..() . = ..()
@@ -576,7 +579,7 @@
//TODO: Better floating //TODO: Better floating
/atom/movable/proc/float(on, throw_override) /atom/movable/proc/float(on, throw_override)
if(throwing || !throw_override) if(throwing && !throw_override)
return return
if(on && !(movement_type & FLOATING)) if(on && !(movement_type & FLOATING))
animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
+13
View File
@@ -18,6 +18,8 @@ GLOBAL_LIST_INIT(meteorsB, list(/obj/effect/meteor/meaty=5, /obj/effect/meteor/m
GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
GLOBAL_LIST_INIT(meteorsCat, list(/obj/effect/meteor/cat)) //for cat meteors
/////////////////////////////// ///////////////////////////////
//Meteor spawning global procs //Meteor spawning global procs
@@ -346,6 +348,17 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
if(prob(20)) if(prob(20))
explosion(src.loc,2,4,6,8) explosion(src.loc,2,4,6,8)
/obj/effect/meteor/cat
name = "space cat"
icon_state = "catmeteor"
desc = "Meow."
hits = 1
heavy = FALSE
meteorsound = 'sound/effects/meow1.ogg'
meteordrop = list(/mob/living/simple_animal/pet/cat/space)
threat = 0
dropamt = 1
////////////////////////// //////////////////////////
//Spookoween meteors //Spookoween meteors
///////////////////////// /////////////////////////
+4
View File
@@ -96,6 +96,10 @@ Class Procs:
flags_ricochet = RICOCHET_HARD flags_ricochet = RICOCHET_HARD
ricochet_chance_mod = 0.3 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 anchored = TRUE
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT
@@ -79,10 +79,12 @@
if (obj_flags & EMAGGED) if (obj_flags & EMAGGED)
return return
obj_flags |= EMAGGED obj_flags |= EMAGGED
SSshuttle.shuttle_purchase_requirements_met |= "emagged"
if (authenticated) if (authenticated)
authorize_access = get_all_accesses() authorize_access = get_all_accesses()
to_chat(user, "<span class='danger'>You scramble the communication routing circuits!</span>") to_chat(user, "<span class='danger'>You scramble the communication routing circuits!</span>")
playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE)
SSshuttle.shuttle_purchase_requirements_met["emagged"] = TRUE
return return
/obj/machinery/computer/communications/ui_act(action, list/params) /obj/machinery/computer/communications/ui_act(action, list/params)
+3 -1
View File
@@ -54,6 +54,8 @@
assemblytype = /obj/structure/door_assembly assemblytype = /obj/structure/door_assembly
normalspeed = 1 normalspeed = 1
explosion_block = 1 explosion_block = 1
wave_explosion_block = EXPLOSION_BLOCK_WALL
wave_explosion_multiply = EXPLOSION_DAMPEN_WALL
hud_possible = list(DIAG_AIRLOCK_HUD) 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 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 else
. += "It looks very robust." . += "It looks very robust."
if(hasSiliconAccessInArea(user) && (!stat & BROKEN)) if(hasSiliconAccessInArea(user) && !(stat & BROKEN))
. += "<span class='notice'>Shift-click [src] to [ density ? "open" : "close"] it.</span>" . += "<span class='notice'>Shift-click [src] to [ density ? "open" : "close"] it.</span>"
. += "<span class='notice'>Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts.</span>" . += "<span class='notice'>Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts.</span>"
. += "<span class='notice'>Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.</span>" . += "<span class='notice'>Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.</span>"
+10
View File
@@ -16,6 +16,11 @@
interaction_flags_atom = INTERACT_ATOM_UI_INTERACT 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/secondsElectrified = 0
var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close
var/shockedby var/shockedby
@@ -412,3 +417,8 @@
/obj/machinery/door/GetExplosionBlock() /obj/machinery/door/GetExplosionBlock()
return density ? real_explosion_block : 0 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
@@ -71,3 +71,6 @@
/obj/machinery/door/password/ex_act(severity, target) /obj/machinery/door/password/ex_act(severity, target)
return return
/obj/machinery/door/password/wave_ex_act(power, datum/wave_explosion/explosion, dir)
return 0 //no.
+2
View File
@@ -8,6 +8,8 @@
closingLayer = CLOSED_BLASTDOOR_LAYER closingLayer = CLOSED_BLASTDOOR_LAYER
sub_door = TRUE sub_door = TRUE
explosion_block = 3 explosion_block = 3
wave_explosion_block = EXPLOSION_BLOCK_BLAST_PROOF
wave_explosion_multiply = EXPLOSION_DAMPEN_BLAST_PROOF
heat_proof = TRUE heat_proof = TRUE
safe = FALSE safe = FALSE
max_integrity = 600 max_integrity = 600
+2
View File
@@ -360,6 +360,8 @@
max_integrity = 300 //Stronger doors for prison (regular window door health is 200) max_integrity = 300 //Stronger doors for prison (regular window door health is 200)
reinf = 1 reinf = 1
explosion_block = 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 /obj/machinery/door/window/brigdoor/security/cell
name = "cell door" name = "cell door"
+38
View File
@@ -114,6 +114,44 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
LAZYADD(message_log, messages.Join(" ")) LAZYADD(message_log, messages.Join(" "))
return TRUE 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) /obj/machinery/doppler_array/examine(mob/user)
. = ..() . = ..()
. += "<span class='notice'>Its dish is facing to the [dir2text(dir)].</span>" . += "<span class='notice'>Its dish is facing to the [dir2text(dir)].</span>"
+234 -195
View File
@@ -1,9 +1,5 @@
#define LIMBGROWER_MAIN_MENU 1 /// The limbgrower. Makes organd and limbs with synthflesh and chems.
#define LIMBGROWER_CATEGORY_MENU 2 /// See [limbgrower_designs.dm] for everything we can make.
#define LIMBGROWER_CHEMICAL_MENU 3
//use these for the menu system
/obj/machinery/limbgrower /obj/machinery/limbgrower
name = "limb grower" name = "limb grower"
desc = "It grows new limbs using Synthflesh." desc = "It grows new limbs using Synthflesh."
@@ -15,161 +11,235 @@
active_power_usage = 100 active_power_usage = 100
circuit = /obj/item/circuitboard/machine/limbgrower circuit = /obj/item/circuitboard/machine/limbgrower
var/operating = FALSE /// The category of limbs we're browing in our UI.
var/disabled = FALSE var/selected_category = "human"
/// If we're currently printing something.
var/busy = FALSE 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 var/datum/design/being_built
/// Our internal techweb for limbgrower designs.
var/datum/techweb/stored_research var/datum/techweb/stored_research
var/selected_category /// All the categories of organs we can print.
var/screen = 1
var/list/categories = list( var/list/categories = list(
"human" = /datum/species/human, "human",
"lizard" = /datum/species/lizard, "lizard",
"mammal" = /datum/species/mammal, "mammal",
"insect" = /datum/species/insect, "insect",
"fly" = /datum/species/fly, "fly",
"plasmaman" = /datum/species/plasmaman, "plasmaman",
"xeno" = /datum/species/xeno, "xeno",
"other" = /datum/species, "other",
) )
var/list/stored_species = list()
var/obj/item/disk/data/dna_disk var/obj/item/disk/data/dna_disk
/obj/machinery/limbgrower/Initialize() /obj/machinery/limbgrower/Initialize()
create_reagents(100, OPENCONTAINER) create_reagents(100, OPENCONTAINER)
stored_research = new /datum/techweb/specialized/autounlocking/limbgrower 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()) ui = SStgui.try_update_ui(user, src, ui)
return 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) for(var/datum/reagent/reagent_id in reagents.reagent_list)
if(LIMBGROWER_MAIN_MENU) var/list/reagent_data = list(
dat = main_win(user) reagent_name = reagent_id.name,
if(LIMBGROWER_CATEGORY_MENU) reagent_amount = reagent_id.volume,
dat = category_win(user,selected_category) reagent_type = reagent_id.type
if(LIMBGROWER_CHEMICAL_MENU) )
dat = chemical_win(user) data["reagents"] += list(reagent_data)
var/datum/browser/popup = new(user, "Limb Grower", name, 400, 500) data["total_reagents"] = reagents.total_volume
popup.set_content(dat) data["max_reagents"] = reagents.maximum_volume
popup.open() 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() /obj/machinery/limbgrower/on_deconstruction()
for(var/obj/item/reagent_containers/glass/G in component_parts) for(var/obj/item/reagent_containers/glass/our_beaker in component_parts)
reagents.trans_to(G, G.reagents.maximum_volume) reagents.trans_to(our_beaker, our_beaker.reagents.maximum_volume)
..() ..()
/obj/machinery/limbgrower/attackby(obj/item/O, mob/user, params) /obj/machinery/limbgrower/attackby(obj/item/user_item, mob/living/user, params)
if(busy) if (busy)
to_chat(user, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>") to_chat(user, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>")
return return
if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", O)) if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", user_item))
updateUsrDialog() ui_close(user)
return return
if(panel_open && default_deconstruction_crowbar(O)) if(user_item.tool_behaviour == TOOL_WRENCH && panel_open)
return
if(user.a_intent == INTENT_HARM) //so we can hit the machine
return ..() 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) if(dna_disk)
to_chat(user, "<span class='warning'>\The [src] already has a dna disk, take it out first!</span>") to_chat(user, "<span class='warning'>\The [src] already has a dna disk, take it out first!</span>")
return return
else else
O.forceMove(src) user_item.forceMove(src)
dna_disk = O dna_disk = user_item
to_chat(user, "<span class='notice'>You insert \the [O] into \the [src].</span>") to_chat(user, "<span class='notice'>You insert \the [user_item] into \the [src].</span>")
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
return return
/obj/machinery/limbgrower/Topic(href, href_list) if(user.a_intent != INTENT_HELP)
if(..()) 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 return
if (!busy)
if(href_list["menu"])
screen = text2num(href_list["menu"])
if(href_list["category"]) if (busy)
selected_category = href_list["category"] to_chat(usr, "<span class='danger'>\The [src] is busy. Please wait for completion of previous operation.</span>")
return
if(href_list["disposeI"]) //Get rid of a reagent incase you add the wrong one by mistake switch(action)
reagents.del_reagent(text2path(href_list["disposeI"]))
if(href_list["make"]) if("empty_reagent")
reagents.del_reagent(text2path(params["reagent_type"]))
. = TRUE
///////////////// if("eject_disk")
//href protection eject_disk(usr)
being_built = stored_research.isDesignResearchedID(href_list["make"]) //check if it's a valid design
if("make_limb")
being_built = stored_research.isDesignResearchedID(params["design_id"])
if(!being_built) 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 for(var/reagent_id in consumed_reagents_list)
var/power = max(2000, synth_cost/5) consumed_reagents_list[reagent_id] *= production_coefficient
if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id]))
audible_message("<span class='notice'>\The [src] buzzes.</span>")
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)) power = max(2000, (power + consumed_reagents_list[reagent_id]))
busy = TRUE
use_power(power)
flick("limbgrower_fill",src)
icon_state = "limbgrower_idleon"
addtimer(CALLBACK(src, .proc/build_item),32*prod_coeff)
if(href_list["dna_disk"]) busy = TRUE
var/mob/living/carbon/user = usr use_power(power)
if(istype(user)) flick("limbgrower_fill",src)
if(!dna_disk) icon_state = "limbgrower_idleon"
var/obj/item/disk/diskette = user.get_active_held_item() selected_category = params["active_tab"]
if(istype(diskette)) addtimer(CALLBACK(src, .proc/build_item, consumed_reagents_list), production_speed * production_coefficient)
diskette.forceMove(src) . = TRUE
dna_disk = diskette
to_chat(user, "<span class='notice'>You insert \the [diskette] into \the [src].</span>")
else
dna_disk.forceMove(src.loc)
user.put_in_active_hand(dna_disk)
to_chat(user, "<span class='notice'>You remove \the [dna_disk] from \the [src].</span>")
dna_disk = null
else
to_chat(user, "<span class='warning'>You are unable to grasp \the [dna_disk] disk from \the [src].</span>")
else
to_chat(usr, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>")
updateUsrDialog()
return 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 * The process of beginning to build a limb or organ.
reagents.remove_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff) * Goes through and sanity checks that we actually have enough reagent to build our item.
var/buildpath = being_built.build_path * Then, remove those reagents from our reagents datum.
if(ispath(buildpath, /obj/item/bodypart)) //This feels like spaghetti code, but i need to initiliaze a limb somehow *
build_limb(buildpath) * After the reagents are handled, we can proceede with making the limb or organ. (Limbs are handled in a separate proc)
else if(ispath(buildpath, /obj/item/organ/genital)) //genitals are uhh... customizable *
build_genital(buildpath) * modified_consumed_reagents_list - the list of reagents we will consume on build, modified by the production coefficient.
else */
//Just build whatever it is /obj/machinery/limbgrower/proc/build_item(list/modified_consumed_reagents_list)
new buildpath(loc) for(var/reagent_id in modified_consumed_reagents_list)
else if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]))
src.visible_message("<span class=\"error\"> Something went very wrong and there isnt enough synthflesh anymore!</span>") audible_message("<span class='notice'>\The [src] buzzes.</span>")
busy = FALSE playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE)
flick("limbgrower_unfill",src) break
icon_state = "limbgrower_idleoff"
updateUsrDialog()
/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) //i need to create a body part manually using a set icon (otherwise it doesnt appear)
var/obj/item/bodypart/limb var/obj/item/bodypart/limb
var/datum/species/selected = stored_species[selected_category] var/datum/species/selected = GLOB.species_datums[selected_category]
limb = new buildpath(loc) limb = new built_typepath(loc)
limb.base_bp_icon = selected.icon_limbs || DEFAULT_BODYPART_ICON_ORGANIC limb.base_bp_icon = selected.icon_limbs || DEFAULT_BODYPART_ICON_ORGANIC
limb.species_id = selected.limbs_id limb.species_id = selected.limbs_id
limb.color_src = (MUTCOLORS in selected.species_traits ? MUTCOLORS : (selected.use_skintones ? SKINTONE : FALSE)) 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.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)]." 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 //i needed to create a way to customize gene tools using dna
var/list/features = dna_disk?.fields["features"] var/list/features = dna_disk?.fields["features"]
if(length(features)) if(length(features))
switch(buildpath) switch(built_typepath)
if(/obj/item/organ/genital/penis) if(/obj/item/organ/genital/penis)
var/obj/item/organ/genital/penis/penis = new(loc) var/obj/item/organ/genital/penis/penis = new(loc)
if(features["has_cock"]) if(features["has_cock"])
penis.shape = features["cock_shape"] penis.shape = features["cock_shape"]
penis.length = features["cock_shape"] penis.length = features["cock_shape"]
penis.diameter_ratio = features["cock_diameter_ratio"] penis.diameter_ratio = features["cock_diameter_ratio"]
penis.color = sanitize_hexcolor(features["cock_color"], 6) penis.color = sanitize_hexcolor(features["cock_color"], 6, TRUE)
penis.update_icon() penis.update()
if(/obj/item/organ/genital/testicles) if(/obj/item/organ/genital/testicles)
var/obj/item/organ/genital/testicles/balls = new(loc) var/obj/item/organ/genital/testicles/balls = new(loc)
if(features["has_balls"]) 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.shape = features["balls_shape"]
balls.size = features["balls_size"] balls.size = features["balls_size"]
balls.fluid_rate = features["balls_cum_rate"] balls.fluid_rate = features["balls_cum_rate"]
balls.fluid_mult = features["balls_cum_mult"] balls.fluid_mult = features["balls_cum_mult"]
balls.fluid_efficiency = features["balls_efficiency"] balls.fluid_efficiency = features["balls_efficiency"]
balls.update()
if(/obj/item/organ/genital/vagina) if(/obj/item/organ/genital/vagina)
var/obj/item/organ/genital/vagina/vegana = new(loc) var/obj/item/organ/genital/vagina/vegana = new(loc)
if(features["has_vagina"]) if(features["has_vag"])
vegana.color = sanitize_hexcolor(features["vag_color"], 6) vegana.color = sanitize_hexcolor(features["vag_color"], 6, TRUE)
vegana.shape = features["vag_shape"] vegana.shape = features["vag_shape"]
vegana.update()
if(/obj/item/organ/genital/breasts) if(/obj/item/organ/genital/breasts)
var/obj/item/organ/genital/breasts/boobs = new(loc) var/obj/item/organ/genital/breasts/boobs = new(loc)
if(features["has_breasts"]) 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.size = features["breasts_size"]
boobs.shape = features["breasts_shape"] boobs.shape = features["breasts_shape"]
if(!features["breasts_producing"]) if(!features["breasts_producing"])
boobs.genital_flags &= ~(GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH) boobs.genital_flags &= ~(GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH)
boobs.update()
else else
new buildpath(loc) new built_typepath(loc)
else else
new buildpath(loc) new built_typepath(loc)
/obj/machinery/limbgrower/RefreshParts() /obj/machinery/limbgrower/RefreshParts()
reagents.maximum_volume = 0 reagents.maximum_volume = 0
for(var/obj/item/reagent_containers/glass/G in component_parts) for(var/obj/item/reagent_containers/glass/our_beaker in component_parts)
reagents.maximum_volume += G.volume reagents.maximum_volume += our_beaker.volume
G.reagents.trans_to(src, G.reagents.total_volume) our_beaker.reagents.trans_to(src, our_beaker.reagents.total_volume)
var/T=1.2 production_coefficient = 1.2
for(var/obj/item/stock_parts/manipulator/M in component_parts) for(var/obj/item/stock_parts/manipulator/our_manipulator in component_parts)
T -= M.rating*0.2 production_coefficient -= our_manipulator.rating * 0.2
prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 production_coefficient = clamp(production_coefficient, 0, 1) // coefficient goes from 1 -> 0.8 -> 0.6 -> 0.4
/obj/machinery/limbgrower/examine(mob/user) /obj/machinery/limbgrower/examine(mob/user)
. = ..() . = ..()
if(!panel_open)
. += "<span class='notice'>It looks like as if the panel were open you could rotate it with a <b>wrench</b>.</span>"
else
. += "<span class='notice'>The panel is open.</span>"
if(in_range(user, src) || isobserver(user)) if(in_range(user, src) || isobserver(user))
. += "<span class='notice'>The status display reads: Storing up to <b>[reagents.maximum_volume]u</b> of synthflesh.<br>Synthflesh consumption at <b>[prod_coeff*100]%</b>.<span>" . += "<span class='notice'>The status display reads: Storing up to <b>[reagents.maximum_volume]u</b> of reagents.<br>Reagent consumption rate at <b>[production_coefficient * 100]%</b>.</span>"
/obj/machinery/limbgrower/proc/main_win(mob/user) /*
var/dat = "<div class='statusDisplay'><h3>[src] Menu:</h3><br>" * Checks our reagent list to see if a design can be built.
dat += "<A href='?src=[REF(src)];dna_disk=1'>[dna_disk ? "Remove" : "Insert"] cloning data disk</A>" *
dat += "<hr>" * limb_design - the design we're checking for buildability.
dat += "<A href='?src=[REF(src)];menu=[LIMBGROWER_CHEMICAL_MENU]'>Chemical Storage</A>" *
dat += materials_printout() * returns TRUE if we have enough reagent to build it. Returns FALSE if we do not.
dat += "<table style='width:100%' align='center'><tr>" */
/obj/machinery/limbgrower/proc/can_build(datum/design/limb_design)
for(var/C in categories) for(var/datum/reagent/reagent_id in limb_design.reagents_list)
dat += "<td><A href='?src=[REF(src)];category=[C];menu=[LIMBGROWER_CATEGORY_MENU]'>[C]</A></td>" if(!reagents.has_reagent(reagent_id, limb_design.reagents_list[reagent_id] * production_coefficient))
dat += "</tr><tr>" return FALSE
//one category per line return TRUE
dat += "</tr></table></div>"
return dat
/obj/machinery/limbgrower/proc/category_win(mob/user,selected_category)
var/dat = "<A href='?src=[REF(src)];menu=[LIMBGROWER_MAIN_MENU]'>Return to main menu</A>"
dat += "<div class='statusDisplay'><h3>Browsing [selected_category]:</h3><br>"
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 += "<span class='linkOff'>[D.name]</span>"
else
dat += "<a href='?src=[REF(src)];make=[D.id];multiplier=1'>[D.name]</a>"
dat += "[get_design_cost(D)]<br>"
dat += "</div>"
return dat
/obj/machinery/limbgrower/proc/chemical_win(mob/user)
var/dat = "<A href='?src=[REF(src)];menu=[LIMBGROWER_MAIN_MENU]'>Return to main menu</A>"
dat += "<div class='statusDisplay'><h3>Browsing Chemical Storage:</h3><br>"
dat += materials_printout()
for(var/datum/reagent/R in reagents.reagent_list)
dat += "[R.name]: [R.volume]"
dat += "<A href='?src=[REF(src)];disposeI=[R]'>Purge</A><BR>"
dat += "</div>"
return dat
/obj/machinery/limbgrower/proc/materials_printout()
var/dat = "<b>Total amount:></b> [reagents.total_volume] / [reagents.maximum_volume] cm<sup>3</sup><br>"
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
/// Emagging a limbgrower allows you to build synthetic armblades.
/obj/machinery/limbgrower/emag_act(mob/user) /obj/machinery/limbgrower/emag_act(mob/user)
. = ..() . = ..()
if(obj_flags & EMAGGED) if(obj_flags & EMAGGED)
return return
for(var/id in SSresearch.techweb_designs) for(var/design_id in SSresearch.techweb_designs)
var/datum/design/D = SSresearch.techweb_design_by_id(id) var/datum/design/found_design = SSresearch.techweb_design_by_id(design_id)
if((D.build_type & LIMBGROWER) && ("emagged" in D.category)) if((found_design.build_type & LIMBGROWER) && ("emagged" in found_design.category))
stored_research.add_design(D) stored_research.add_design(found_design)
to_chat(user, "<span class='warning'>A warning flashes onto the screen, stating that safety overrides have been deactivated!</span>") to_chat(user, "<span class='warning'>A warning flashes onto the screen, stating that safety overrides have been deactivated!</span>")
obj_flags |= EMAGGED obj_flags |= EMAGGED
return TRUE update_static_data(user)
/obj/machinery/limbgrower/AltClick(mob/living/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(istype(user) && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
if(busy) if(busy)
to_chat(user, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>") to_chat(user, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>")
@@ -326,6 +364,7 @@
dna_disk.forceMove(src.loc) dna_disk.forceMove(src.loc)
user.put_in_active_hand(dna_disk) user.put_in_active_hand(dna_disk)
to_chat(user, "<span class='notice'>You remove \the [dna_disk] from \the [src].</span>") to_chat(user, "<span class='notice'>You remove \the [dna_disk] from \the [src].</span>")
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
dna_disk = null dna_disk = null
else else
to_chat(user, "<span class='warning'>\The [src] has doesn't have a disk on it!") to_chat(user, "<span class='warning'>\The [src] has doesn't have a disk on it!")
@@ -50,6 +50,10 @@
/obj/effect/decal/cleanable/glass/ex_act() /obj/effect/decal/cleanable/glass/ex_act()
qdel(src) 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 /obj/effect/decal/cleanable/glass/plasma
icon_state = "plasmatiny" icon_state = "plasmatiny"
@@ -131,6 +135,9 @@
/obj/effect/decal/cleanable/greenglow/ex_act() /obj/effect/decal/cleanable/greenglow/ex_act()
return return
/obj/effect/decal/cleanable/greenglow/wave_ex_act(power, datum/wave_explosion/explosion, dir)
return power
/obj/effect/decal/cleanable/cobweb /obj/effect/decal/cleanable/cobweb
name = "cobweb" name = "cobweb"
desc = "Somebody should remove that." desc = "Somebody should remove that."
@@ -253,6 +260,11 @@
if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion. if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion.
qdel(src) 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() /obj/effect/decal/cleanable/shreds/Initialize()
pixel_x = rand(-10, 10) pixel_x = rand(-10, 10)
pixel_y = rand(-10, 10) pixel_y = rand(-10, 10)
@@ -309,6 +309,10 @@
/obj/structure/foamedmetal/resin/Initialize() /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)) if(isopenturf(loc))
var/turf/open/O = loc var/turf/open/O = loc
O.ClearWet() O.ClearWet()
@@ -337,6 +341,9 @@
return TRUE return TRUE
. = ..() . = ..()
/obj/structure/foamedmetal/resin/BlockSuperconductivity()
return TRUE
#undef ALUMINUM_FOAM #undef ALUMINUM_FOAM
#undef IRON_FOAM #undef IRON_FOAM
#undef RESIN_FOAM #undef RESIN_FOAM
@@ -378,6 +378,12 @@
icon_state = "shieldsparkles" icon_state = "shieldsparkles"
duration = 6 duration = 6
/obj/effect/temp_visual/impact_effect/judgement_cut
name = "judgement cut impact"
icon = 'icons/effects/effects.dmi'
icon_state = "impact_judgement"
duration = 6
/obj/effect/temp_visual/heart /obj/effect/temp_visual/heart
name = "heart" name = "heart"
icon = 'icons/mob/animal.dmi' icon = 'icons/mob/animal.dmi'
@@ -535,3 +541,7 @@
/obj/effect/temp_visual/slime_puddle/reverse /obj/effect/temp_visual/slime_puddle/reverse
icon_state = "from_puddle" icon_state = "from_puddle"
duration = 7 duration = 7
/obj/effect/temp_visual/gib_animation
icon = 'icons/mob/mob.dmi'
duration = 15
+8
View File
@@ -248,6 +248,14 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
loc = null loc = null
loc = T 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? /obj/item/examine(mob/user) //This might be spammy. Remove?
. = ..() . = ..()
+7 -1
View File
@@ -157,7 +157,7 @@
to_chat(user, "<span class='notice'>You need to get closer!</span>") to_chat(user, "<span class='notice'>You need to get closer!</span>")
return return
if(use_paint(user) && isturf(F)) 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) /obj/item/airlock_painter/decal/attack_self(mob/user)
if((ink) && (ink.charges >= 1)) if((ink) && (ink.charges >= 1))
@@ -180,6 +180,11 @@
stored_decal_total = "[stored_decal][yellow_fix][stored_color]" stored_decal_total = "[stored_decal][yellow_fix][stored_color]"
return 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) /obj/item/airlock_painter/decal/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui) ui = SStgui.try_update_ui(user, src, ui)
if(!ui) if(!ui)
@@ -189,6 +194,7 @@
/obj/item/airlock_painter/decal/ui_data(mob/user) /obj/item/airlock_painter/decal/ui_data(mob/user)
var/list/data = list() var/list/data = list()
data["decal_direction"] = stored_dir data["decal_direction"] = stored_dir
data["decal_dir_text"] = dir2text(stored_dir)
data["decal_color"] = stored_color data["decal_color"] = stored_color
data["decal_style"] = stored_decal data["decal_style"] = stored_decal
data["decal_list"] = list() data["decal_list"] = list()
+3
View File
@@ -553,6 +553,9 @@
/obj/item/card/id/syndicate/locked_banking /obj/item/card/id/syndicate/locked_banking
bank_support = ID_LOCKED_BANK_ACCOUNT bank_support = ID_LOCKED_BANK_ACCOUNT
/obj/item/card/id/pirate
access = list(ACCESS_SYNDICATE)
/obj/item/card/id/captains_spare /obj/item/card/id/captains_spare
name = "captain's spare ID" name = "captain's spare ID"
desc = "The spare ID of the High Lord himself." desc = "The spare ID of the High Lord himself."
-15
View File
@@ -75,18 +75,3 @@
desc = "A chromosome that reduces action based mutation cooldowns by by 50%." desc = "A chromosome that reduces action based mutation cooldowns by by 50%."
icon_state = "energy" icon_state = "energy"
energy_coeff = 0.5 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
..()
+6 -1
View File
@@ -649,6 +649,9 @@
pre_noise = TRUE pre_noise = TRUE
post_noise = FALSE 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) /obj/item/toy/crayon/spraycan/isValidSurface(surface)
return (istype(surface, /turf/open/floor) || istype(surface, /turf/closed/wall)) return (istype(surface, /turf/open/floor) || istype(surface, /turf/closed/wall))
@@ -716,7 +719,8 @@
if(C.client) if(C.client)
C.blur_eyes(3) C.blur_eyes(3)
C.blind_eyes(1) 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.confused = max(C.confused, 3)
C.DefaultCombatKnockdown(60) C.DefaultCombatKnockdown(60)
if(ishuman(C) && actually_paints) if(ishuman(C) && actually_paints)
@@ -771,6 +775,7 @@
name = "cyborg spraycan" name = "cyborg spraycan"
desc = "A metallic container containing shiny synthesised paint." desc = "A metallic container containing shiny synthesised paint."
charges = -1 charges = -1
stun_delay = 5 SECONDS
/obj/item/toy/crayon/spraycan/borg/draw_on(atom/target,mob/user,proximity, params) /obj/item/toy/crayon/spraycan/borg/draw_on(atom/target,mob/user,proximity, params)
var/diff = ..() var/diff = ..()
@@ -77,8 +77,11 @@
return return
if(!iscarbon(target)) if(!iscarbon(target))
return return
if(!(target?.client?.prefs?.cit_toggles & MEDIHOUND_SLEEPER))
to_chat(user, "<span class='warning'>The user has opted out of the use of your [src].")
return
var/voracious = TRUE var/voracious = TRUE
if(!target.client || !(target.client.prefs.cit_toggles & MEDIHOUND_SLEEPER) || !hound.client || !(hound.client.prefs.cit_toggles & MEDIHOUND_SLEEPER)) if(!hound.client || !(hound.client.prefs.cit_toggles & MEDIHOUND_SLEEPER))
voracious = FALSE voracious = FALSE
if(target.buckled) if(target.buckled)
to_chat(user, "<span class='warning'>The user is buckled and can not be put into your [src].</span>") to_chat(user, "<span class='warning'>The user is buckled and can not be put into your [src].</span>")
+2 -2
View File
@@ -381,8 +381,8 @@ GENETICS SCANNER
else if (S.mutantstomach != initial(S.mutantstomach)) else if (S.mutantstomach != initial(S.mutantstomach))
mutant = TRUE mutant = TRUE
msg += "\t<span class='info'>Reported Species: [H.dna.custom_species ? H.dna.custom_species : S.name]</span>\n" msg += "\t<span class='info'>Reported Species: [H.spec_trait_examine_font()][H.dna.custom_species ? H.dna.custom_species : S.name]</font></span>\n"
msg += "\t<span class='info'>Base Species: [S.name]</span>\n" msg += "\t<span class='info'>Base Species: [H.spec_trait_examine_font()][S.name]</font></span>\n"
if(mutant) if(mutant)
msg += "\t<span class='info'>Subject has mutations present.</span>\n" msg += "\t<span class='info'>Subject has mutations present.</span>\n"
msg += "\t<span class='info'>Body temperature: [round(M.bodytemperature-T0C,0.1)] &deg;C ([round(M.bodytemperature*1.8-459.67,0.1)] &deg;F)</span>\n" msg += "\t<span class='info'>Body temperature: [round(M.bodytemperature-T0C,0.1)] &deg;C ([round(M.bodytemperature*1.8-459.67,0.1)] &deg;F)</span>\n"
+54
View File
@@ -100,6 +100,42 @@
"<span class='suicide'>[user] is slitting [user.p_their()] stomach open with the [src.name]! It looks like [user.p_theyre()] trying to commit seppuku.</span>")) "<span class='suicide'>[user] is slitting [user.p_their()] stomach open with the [src.name]! It looks like [user.p_theyre()] trying to commit seppuku.</span>"))
return (BRUTELOSS) 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("<span class='suicide'>[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>", \
"<span class='suicide'>[user] is slitting [user.p_their()] throat with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>", \
"<span class='suicide'>[user] is slitting [user.p_their()] stomach open with the [src.name]! It looks like [user.p_theyre()] trying to commit seppuku.</span>"))
return (BRUTELOSS)
/obj/item/kitchen/knife/ritual /obj/item/kitchen/knife/ritual
name = "ritual knife" name = "ritual knife"
desc = "The unearthly energies that once powered this blade are now dormant." 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) /obj/item/kitchen/rollingpin/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins flattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] begins flattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return BRUTELOSS 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("<span class='suicide'>[user] begins unflattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return BRUTELOSS
/* Trays moved to /obj/item/storage/bag */ /* Trays moved to /obj/item/storage/bag */
/obj/item/kitchen/knife/scimitar /obj/item/kitchen/knife/scimitar
+2 -2
View File
@@ -135,8 +135,8 @@
/obj/item/organ/cyberimp/arm/toolset, /obj/item/organ/cyberimp/arm/toolset,
/obj/item/organ/cyberimp/arm/surgery, /obj/item/organ/cyberimp/arm/surgery,
/obj/item/organ/cyberimp/chest/thrusters, /obj/item/organ/cyberimp/chest/thrusters,
/obj/item/organ/lungs/cybernetic, /obj/item/organ/lungs/cybernetic/tier3,
/obj/item/organ/liver/cybernetic) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof /obj/item/organ/liver/cybernetic/tier3) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
for(var/V in templist) for(var/V in templist)
var/atom/A = V var/atom/A = V
augment_list[initial(A.name)] = A augment_list[initial(A.name)] = A
+1 -1
View File
@@ -383,7 +383,7 @@
. = ..() . = ..()
/obj/item/stack/medical/mesh/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) /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, "<span class='warning'>You need to open [src] first.</span>") to_chat(user, "<span class='warning'>You need to open [src] first.</span>")
return return
. = ..() . = ..()
@@ -248,6 +248,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
null, \ null, \
new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \ 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("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("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("painting frame", /obj/item/wallframe/painting, 1, time = 10),\
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
@@ -592,7 +593,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
return return
var/turf/T = get_turf(user) //we may have moved. adjust as needed... var/turf/T = get_turf(user) //we may have moved. adjust as needed...
var/area/A = get_area(user) var/area/A = get_area(user)
if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !(A.flags_1 & CULT_PERMITTED_1))) if((!is_station_level(T.z) && !is_mining_level(T.z)) || !(A?.area_flags & CULT_PERMITTED))
to_chat(user, "<span class='warning'>The veil is not weak enough here.</span>") to_chat(user, "<span class='warning'>The veil is not weak enough here.</span>")
return FALSE return FALSE
return ..() return ..()
+4 -1
View File
@@ -367,7 +367,7 @@
/obj/item/storage/fancy/cigarettes/derringer/AltClick(mob/living/carbon/user) /obj/item/storage/fancy/cigarettes/derringer/AltClick(mob/living/carbon/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return 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) if(W && contents.len > 0)
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user) SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user)
user.put_in_hands(W) 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/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) new /obj/item/clothing/mask/cigarette/syndicate(src)
//For traitors with luck/class //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/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) 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. //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/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) new /obj/item/clothing/mask/cigarette/shadyjims (src)
///////////// /////////////
//CIGAR BOX// //CIGAR BOX//
+13
View File
@@ -71,6 +71,19 @@
if(3) if(3)
take_damage(rand(10, 90), BRUTE, "bomb", 0) 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) /obj/bullet_act(obj/item/projectile/P)
. = ..() . = ..()
playsound(src, P.hitsound, 50, 1) playsound(src, P.hitsound, 50, 1)
@@ -56,6 +56,11 @@
name = "gear crate" name = "gear crate"
icon_state = "secgearcrate" 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 /obj/structure/closet/crate/secure/hydroponics
desc = "A crate with a lock on it, painted in the scheme of the station's botanists." desc = "A crate with a lock on it, painted in the scheme of the station's botanists."
name = "secure hydroponics crate" name = "secure hydroponics crate"
+12
View File
@@ -73,3 +73,15 @@
name = "wumborian fugu den" name = "wumborian fugu den"
desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?" 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) 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")
+1 -1
View File
@@ -127,7 +127,7 @@
to_chat(user, "<span class='danger'>Throwing [pushed_mob] onto the table might hurt them!</span>") to_chat(user, "<span class='danger'>Throwing [pushed_mob] onto the table might hurt them!</span>")
return return
var/added_passtable = FALSE var/added_passtable = FALSE
if(!pushed_mob.pass_flags & PASSTABLE) if(!(pushed_mob.pass_flags & PASSTABLE))
added_passtable = TRUE added_passtable = TRUE
pushed_mob.pass_flags |= PASSTABLE pushed_mob.pass_flags |= PASSTABLE
pushed_mob.Move(src.loc) pushed_mob.Move(src.loc)
+112 -17
View File
@@ -21,6 +21,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
var/ini_dir = null var/ini_dir = null
var/state = WINDOW_OUT_OF_FRAME var/state = WINDOW_OUT_OF_FRAME
var/reinf = FALSE var/reinf = FALSE
var/extra_reinforced = FALSE
var/heat_resistance = 800 var/heat_resistance = 800
var/decon_speed = 30 var/decon_speed = 30
var/wtype = "glass" var/wtype = "glass"
@@ -43,6 +44,10 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
attack_hand_speed = CLICK_CD_MELEE attack_hand_speed = CLICK_CD_MELEE
attack_hand_is_action = TRUE 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 /// Electrochromatic status
var/electrochromatic_status = NOT_ELECTROCHROMATIC var/electrochromatic_status = NOT_ELECTROCHROMATIC
/// Electrochromatic ID. Set the first character to ! to replace with a SSmapping generated pseudorandom obfuscated ID for mapping purposes. /// Electrochromatic ID. Set the first character to ! to replace with a SSmapping generated pseudorandom obfuscated ID for mapping purposes.
@@ -61,6 +66,20 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
. += "<span class='notice'>The window is out of the frame, but could be <i>pried</i> in. It is <b>screwed</b> to the floor.</span>" . += "<span class='notice'>The window is out of the frame, but could be <i>pried</i> in. It is <b>screwed</b> to the floor.</span>"
else if(!anchored) else if(!anchored)
. += "<span class='notice'>The window is <i>unscrewed</i> from the floor, and could be deconstructed by <b>wrenching</b>.</span>" . += "<span class='notice'>The window is <i>unscrewed</i> from the floor, and could be deconstructed by <b>wrenching</b>.</span>"
switch(state)
if(PRWINDOW_SECURE)
if(extra_reinforced)
. += "It's been screwed in with one way screws, you'd need to <b>heat their solder cover</b> to have any chance of backing them out."
else
. += "It's been screwed in with solid screws, you'd need to <b>screw them</b> out to unsecure the window."
if(PRWINDOW_BOLTS_HEATED)
. += "The solder cover melts away, and you'll likely be able to <b>unscrew them</b> now."
if(PRWINDOW_BOLTS_OUT)
. += "The screws have been removed, revealing a small gap you could fit a <b>prying tool</b> in."
if(PRWINDOW_POPPED)
. += "The main plate of the window has popped out of the frame, exposing some bars that look like they can be <b>cut</b>."
if(PRWINDOW_BARS_CUT)
. += "The main pane can be easily moved out of the way to reveal some <b>bolts</b> holding the frame in."
else else
if(anchored) if(anchored)
. += "<span class='notice'>The window is <b>screwed</b> to the floor.</span>" . += "<span class='notice'>The window is <b>screwed</b> to the floor.</span>"
@@ -71,9 +90,14 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
. = ..() . = ..()
if(direct) if(direct)
setDir(direct) setDir(direct)
if(reinf && anchored)
if(extra_reinforced && anchored)
state = PRWINDOW_SECURE
else if(reinf && anchored)
state = WINDOW_SCREWED_TO_FRAME state = WINDOW_SCREWED_TO_FRAME
if(mapload && electrochromatic_id && electrochromatic_id[1] == "!") if(mapload && electrochromatic_id && electrochromatic_id[1] == "!")
electrochromatic_id = SSmapping.get_obfuscated_id(electrochromatic_id) electrochromatic_id = SSmapping.get_obfuscated_id(electrochromatic_id)
@@ -111,6 +135,9 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
return TRUE return TRUE
return FALSE 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() /obj/structure/window/narsie_act()
add_atom_colour(NARSIE_WINDOW_COLOUR, FIXED_COLOUR_PRIORITY) add_atom_colour(NARSIE_WINDOW_COLOUR, FIXED_COLOUR_PRIORITY)
@@ -223,29 +250,26 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
make_electrochromatic(K.id) make_electrochromatic(K.id)
qdel(K) qdel(K)
if(!(flags_1&NODECONSTRUCT_1)) if(!(flags_1 & NODECONSTRUCT_1) && !(state >= PRWINDOW_FRAME_BOLTED))
if(I.tool_behaviour == TOOL_SCREWDRIVER) if(I.tool_behaviour == TOOL_SCREWDRIVER)
I.play_tool_sound(src, 75) I.play_tool_sound(src, 75)
if(reinf) if(state == WINDOW_SCREWED_TO_FRAME || state == WINDOW_IN_FRAME && anchored)
if(state == WINDOW_SCREWED_TO_FRAME || state == WINDOW_IN_FRAME) to_chat(user, "<span class='notice'>You begin to [state == WINDOW_SCREWED_TO_FRAME ? "unscrew the window from":"screw the window to"] the frame...</span>")
to_chat(user, "<span class='notice'>You begin to [state == WINDOW_SCREWED_TO_FRAME ? "unscrew the window from":"screw the window to"] the frame...</span>") if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) if(extra_reinforced && state == WINDOW_IN_FRAME)
state = PRWINDOW_SECURE
else
state = (state == WINDOW_IN_FRAME ? WINDOW_SCREWED_TO_FRAME : WINDOW_IN_FRAME) state = (state == WINDOW_IN_FRAME ? WINDOW_SCREWED_TO_FRAME : WINDOW_IN_FRAME)
to_chat(user, "<span class='notice'>You [state == WINDOW_IN_FRAME ? "unfasten the window from":"fasten the window to"] the frame.</span>") to_chat(user, "<span class='notice'>You [state == WINDOW_IN_FRAME ? "unfasten the window from":"fasten the window to"] the frame.</span>")
else if(state == WINDOW_OUT_OF_FRAME) else if(state == WINDOW_OUT_OF_FRAME)
to_chat(user, "<span class='notice'>You begin to [anchored ? "unscrew the frame from":"screw the frame to"] the floor...</span>") to_chat(user, "<span class='notice'>You begin to [anchored ? "unscrew the frame from":"screw the frame to"] the floor...</span>")
if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
setAnchored(!anchored)
to_chat(user, "<span class='notice'>You [anchored ? "fasten the frame to":"unfasten the frame from"] the floor.</span>")
else //if we're not reinforced, we don't need to check or update state
to_chat(user, "<span class='notice'>You begin to [anchored ? "unscrew the window from":"screw the window to"] the floor...</span>")
if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_anchored, anchored)))
setAnchored(!anchored) setAnchored(!anchored)
to_chat(user, "<span class='notice'>You [anchored ? "fasten the window to":"unfasten the window from"] the floor.</span>") to_chat(user, "<span class='notice'>You [anchored ? "fasten the frame to":"unfasten the frame from"] the floor.</span>")
return return
else if(I.tool_behaviour == TOOL_CROWBAR && reinf && (state == WINDOW_OUT_OF_FRAME || state == WINDOW_IN_FRAME)) else if(I.tool_behaviour == TOOL_CROWBAR && reinf && (state == WINDOW_OUT_OF_FRAME || state == WINDOW_IN_FRAME) && anchored)
to_chat(user, "<span class='notice'>You begin to lever the window [state == WINDOW_OUT_OF_FRAME ? "into":"out of"] the frame...</span>") to_chat(user, "<span class='notice'>You begin to lever the window [state == WINDOW_OUT_OF_FRAME ? "into":"out of"] the frame...</span>")
I.play_tool_sound(src, 75) I.play_tool_sound(src, 75)
if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
@@ -263,8 +287,67 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
to_chat(user, "<span class='notice'>You successfully disassemble [src].</span>") to_chat(user, "<span class='notice'>You successfully disassemble [src].</span>")
qdel(src) qdel(src)
return return
if(!reinf || !anchored)
return ..()
switch(state)
if(PRWINDOW_SECURE)
if(extra_reinforced)
if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HARM)
user.visible_message("<span class='notice'>[user] holds \the [I] to the security screws on \the [src]...</span>",
"<span class='notice'>You begin heating the security screws on \the [src]...</span>")
if(I.use_tool(src, user, 180, volume = 100))
to_chat(user, "<span class='notice'>The security bolts are glowing white hot and look ready to be removed.</span>")
state = PRWINDOW_BOLTS_HEATED
addtimer(CALLBACK(src, .proc/cool_bolts), 300)
return
else
if(I.tool_behaviour == TOOL_SCREWDRIVER)
user.visible_message("<span class='notice'>[user] digs into the screws and starts removing them...</span>",
"<span class='notice'>You dig into the screws hard and they start turning...</span>")
if(I.use_tool(src, user, 80, volume = 50))
state = PRWINDOW_BOLTS_OUT
to_chat(user, "<span class='notice'>The screws come out, and a gap forms around the edge of the pane.</span>")
return
if(PRWINDOW_BOLTS_HEATED)
if(I.tool_behaviour == TOOL_SCREWDRIVER)
user.visible_message("<span class='notice'>[user] digs into the security screws and starts removing them...</span>",
"<span class='notice'>You dig into the screws hard and they start turning...</span>")
if(I.use_tool(src, user, 80, volume = 50))
state = PRWINDOW_BOLTS_OUT
to_chat(user, "<span class='notice'>The screws come out, and a gap forms around the edge of the pane.</span>")
return
if(PRWINDOW_BOLTS_OUT)
if(I.tool_behaviour == TOOL_CROWBAR)
user.visible_message("<span class='notice'>[user] wedges \the [I] into the gap in the frame and starts prying...</span>",
"<span class='notice'>You wedge \the [I] into the gap in the frame and start prying...</span>")
if(I.use_tool(src, user, 50, volume = 50))
state = PRWINDOW_POPPED
to_chat(user, "<span class='notice'>The panel pops out of the frame, exposing some thin metal bars that looks like they can be cut.</span>")
return
if(PRWINDOW_POPPED)
if(I.tool_behaviour == TOOL_WIRECUTTER)
user.visible_message("<span class='notice'>[user] starts cutting the exposed bars on \the [src]...</span>",
"<span class='notice'>You start cutting the exposed bars on \the [src]</span>")
if(I.use_tool(src, user, 30, volume = 50))
state = PRWINDOW_BARS_CUT
to_chat(user, "<span class='notice'>The panels falls out of the way exposing the frame bolts.</span>")
return
if(PRWINDOW_BARS_CUT)
if(I.tool_behaviour == TOOL_WRENCH)
user.visible_message("<span class='notice'>[user] starts unfastening \the [src] from the frame...</span>",
"<span class='notice'>You start unfastening the bolts from the frame...</span>")
if(I.use_tool(src, user, 50, volume = 50))
to_chat(user, "<span class='notice'>You unscrew the bolts from the frame and the window pops loose.</span>")
state = WINDOW_OUT_OF_FRAME
setAnchored(FALSE)
return
return ..() return ..()
/obj/structure/window/proc/cool_bolts()
if(state == PRWINDOW_BOLTS_HEATED)
state = PRWINDOW_SECURE
visible_message("<span class='notice'>The bolts on \the [src] look like they've cooled off...</span>")
/obj/structure/window/setAnchored(anchorvalue) /obj/structure/window/setAnchored(anchorvalue)
..() ..()
air_update_turf(TRUE) air_update_turf(TRUE)
@@ -520,6 +603,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) armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100)
max_integrity = 50 max_integrity = 50
explosion_block = 1 explosion_block = 1
wave_explosion_block = EXPLOSION_BLOCK_REINFORCED_WINDOW
wave_explosion_multiply = EXPLOSION_DAMPEN_REINFORCED_WINDOW
glass_type = /obj/item/stack/sheet/rglass glass_type = /obj/item/stack/sheet/rglass
rad_insulation = RAD_HEAVY_INSULATION rad_insulation = RAD_HEAVY_INSULATION
ricochet_chance_mod = 0.8 ricochet_chance_mod = 0.8
@@ -545,6 +630,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) armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100)
max_integrity = 150 max_integrity = 150
explosion_block = 1 explosion_block = 1
wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW
wave_explosion_multiply = EXPLOSION_DAMPEN_BOROSILICATE_WINDOW
glass_type = /obj/item/stack/sheet/plasmaglass glass_type = /obj/item/stack/sheet/plasmaglass
cleanable_type = /obj/effect/decal/cleanable/glass/plasma cleanable_type = /obj/effect/decal/cleanable/glass/plasma
rad_insulation = RAD_NO_INSULATION rad_insulation = RAD_NO_INSULATION
@@ -566,10 +653,13 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
desc = "A window made out of a plasma-silicate alloy and a rod matrix. It looks hopelessly tough to break and is most likely nigh fireproof." desc = "A window made out of a plasma-silicate alloy and a rod matrix. It looks hopelessly tough to break and is most likely nigh fireproof."
icon_state = "plasmarwindow" icon_state = "plasmarwindow"
reinf = TRUE reinf = TRUE
extra_reinforced = TRUE
heat_resistance = 50000 heat_resistance = 50000
armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100) armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100)
max_integrity = 500 max_integrity = 500
explosion_block = 2 explosion_block = 2
wave_explosion_block = EXPLOSION_BLOCK_EXTREME
wave_explosion_multiply = EXPLOSION_BLOCK_EXTREME
glass_type = /obj/item/stack/sheet/plasmarglass glass_type = /obj/item/stack/sheet/plasmarglass
/obj/structure/window/plasma/reinforced/spawner/east /obj/structure/window/plasma/reinforced/spawner/east
@@ -629,6 +719,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
icon = 'icons/obj/smooth_structures/rplasma_window.dmi' icon = 'icons/obj/smooth_structures/rplasma_window.dmi'
icon_state = "rplasmawindow" icon_state = "rplasmawindow"
dir = FULLTILE_WINDOW_DIR dir = FULLTILE_WINDOW_DIR
state = PRWINDOW_SECURE
max_integrity = 1000 max_integrity = 1000
fulltile = TRUE fulltile = TRUE
flags_1 = PREVENT_CLICK_UNDER_1 flags_1 = PREVENT_CLICK_UNDER_1
@@ -713,6 +804,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
fulltile = TRUE fulltile = TRUE
flags_1 = PREVENT_CLICK_UNDER_1 flags_1 = PREVENT_CLICK_UNDER_1
reinf = TRUE reinf = TRUE
extra_reinforced = TRUE
heat_resistance = 1600 heat_resistance = 1600
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100)
smooth = SMOOTH_TRUE smooth = SMOOTH_TRUE
@@ -742,7 +834,10 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
max_integrity = 80 max_integrity = 80
armor = list("melee" = 60, "bullet" = 25, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) 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. 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 decon_speed = 40
extra_reinforced = TRUE
glass_type = /obj/item/stack/tile/brass glass_type = /obj/item/stack/tile/brass
glass_amount = 1 glass_amount = 1
reinf = FALSE reinf = FALSE
+3
View File
@@ -6,6 +6,8 @@
blocks_air = 1 blocks_air = 1
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
rad_insulation = RAD_MEDIUM_INSULATION rad_insulation = RAD_MEDIUM_INSULATION
wave_explosion_block = 10
wave_explosion_multiply = 0.75
/turf/closed/Initialize() /turf/closed/Initialize()
. = ..() . = ..()
@@ -28,6 +30,7 @@
name = "wall" name = "wall"
icon = 'icons/turf/walls.dmi' icon = 'icons/turf/walls.dmi'
explosion_block = 50 explosion_block = 50
wave_explosion_block = INFINITY
/turf/closed/indestructible/rust_heretic_act() /turf/closed/indestructible/rust_heretic_act()
return return
+55
View File
@@ -12,6 +12,19 @@
clawfootstep = FOOTSTEP_HARD_CLAW clawfootstep = FOOTSTEP_HARD_CLAW
heavyfootstep = FOOTSTEP_GENERIC_HEAVY 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_regular_floor = "floor" //used to remember what icon the tile should have by default
var/icon_plating = "plating" var/icon_plating = "plating"
thermal_conductivity = 0.004 thermal_conductivity = 0.004
@@ -98,6 +111,48 @@
src.break_tile() src.break_tile()
src.hotspot_expose(1000,CELL_VOLUME) 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() /turf/open/floor/is_shielded()
for(var/obj/structure/A in contents) for(var/obj/structure/A in contents)
if(A.level == 3) if(A.level == 3)
@@ -12,6 +12,11 @@
sheet_amount = 1 sheet_amount = 1
girder_type = /obj/structure/girder/reinforced girder_type = /obj/structure/girder/reinforced
explosion_block = 2 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 rad_insulation = RAD_HEAVY_INSULATION
/turf/closed/wall/r_wall/deconstruction_hints(mob/user) /turf/closed/wall/r_wall/deconstruction_hints(mob/user)
+17
View File
@@ -6,6 +6,8 @@
icon = 'icons/turf/walls/wall.dmi' icon = 'icons/turf/walls/wall.dmi'
icon_state = "wall" icon_state = "wall"
explosion_block = 1 explosion_block = 1
wave_explosion_block = EXPLOSION_BLOCK_WALL
wave_explosion_multiply = EXPLOSION_DAMPEN_WALL
flags_1 = DEFAULT_RICOCHET_1 flags_1 = DEFAULT_RICOCHET_1
flags_ricochet = RICOCHET_HARD flags_ricochet = RICOCHET_HARD
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
@@ -15,6 +17,14 @@
baseturfs = /turf/open/floor/plating 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/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/slicing_duration = 100 //default time taken to slice the wall
var/sheet_type = /obj/item/stack/sheet/metal var/sheet_type = /obj/item/stack/sheet/metal
@@ -91,6 +101,13 @@
if(!density) 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) /turf/closed/wall/blob_act(obj/structure/blob/B)
if(prob(50)) if(prob(50))
+2
View File
@@ -8,6 +8,8 @@
temperature = TCMB temperature = TCMB
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
heat_capacity = 700000 heat_capacity = 700000
wave_explosion_multiply = EXPLOSION_DAMPEN_SPACE
wave_explosion_block = EXPLOSION_BLOCK_SPACE
var/destination_z var/destination_z
var/destination_x var/destination_x
+18
View File
@@ -462,6 +462,24 @@ GLOBAL_LIST_EMPTY(station_turfs)
A.ex_act(severity, target) A.ex_act(severity, target)
CHECK_TICK 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) /turf/narsie_act(force, ignore_mobs, probability = 20)
. = (prob(probability) || force) . = (prob(probability) || force)
for(var/I in src) for(var/I in src)
+47
View File
@@ -96,6 +96,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/cmd_select_equipment, /client/proc/cmd_select_equipment,
/client/proc/cmd_admin_gib_self, /client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb, /client/proc/drop_bomb,
/client/proc/drop_wave_explosion,
/client/proc/set_dynex_scale, /client/proc/set_dynex_scale,
/client/proc/drop_dynex_bomb, /client/proc/drop_dynex_bomb,
/client/proc/cinematic, /client/proc/cinematic,
@@ -115,6 +116,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/show_tip, /client/proc/show_tip,
/client/proc/smite, /client/proc/smite,
/client/proc/admin_away, /client/proc/admin_away,
/client/proc/spawn_floor_cluwne,
/client/proc/cmd_admin_toggle_fov, //CIT CHANGE - FOV /client/proc/cmd_admin_toggle_fov, //CIT CHANGE - FOV
/client/proc/roll_dices //CIT CHANGE - Adds dice verb /client/proc/roll_dices //CIT CHANGE - Adds dice verb
)) ))
@@ -550,6 +552,51 @@ GLOBAL_PROTECT(admin_verbs_hideable)
log_admin("[key_name(usr)] created an admin explosion at [epicenter.loc].") 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! 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, "<span class='danger'>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, "<span class='danger'>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, "<span class='danger'>Cannot proceed. Not on turf.</span>")
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() /client/proc/drop_dynex_bomb()
set category = "Admin.Fun" set category = "Admin.Fun"
set name = "Drop DynEx Bomb" set name = "Drop DynEx Bomb"
+1 -1
View File
@@ -104,7 +104,7 @@ GLOBAL_VAR(antag_prototypes)
var/datum/component/activity/activity = current.GetComponent(/datum/component/activity) var/datum/component/activity/activity = current.GetComponent(/datum/component/activity)
if(activity) if(activity)
out += "Activity level: [activity.activity_level]<br>" out += "Activity level: [activity.activity_level]<br>"
out += "Hasn't changed areas in approximately [activity.not_moved_counter] seconds" out += "Hasn't changed areas in approximately [activity.not_moved_counter] seconds<br>"
var/special_statuses = get_special_statuses() var/special_statuses = get_special_statuses()
if(length(special_statuses)) if(length(special_statuses))
-1
View File
@@ -41,7 +41,6 @@
H.dna.features["horns"] = pick(GLOB.horns_list) H.dna.features["horns"] = pick(GLOB.horns_list)
H.dna.features["frills"] = pick(GLOB.frills_list) H.dna.features["frills"] = pick(GLOB.frills_list)
H.dna.features["spines"] = pick(GLOB.spines_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["insect_wings"] = pick(GLOB.insect_wings_list)
H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list) H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list)
H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list) H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list)
@@ -238,3 +238,9 @@
/proc/__nan() /proc/__nan()
var/list/L = json_decode("{\"value\":NaN}") var/list/L = json_decode("{\"value\":NaN}")
return L["value"] 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()
+49 -3
View File
@@ -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") 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! 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() /client/proc/cmd_change_command_name()
set category = "Admin.Events" set category = "Admin.Events"
set name = "Change Command Name" set name = "Change Command Name"
@@ -1313,9 +1333,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
ADMIN_PUNISHMENT_SHOES, ADMIN_PUNISHMENT_SHOES,
ADMIN_PUNISHMENT_PICKLE, ADMIN_PUNISHMENT_PICKLE,
ADMIN_PUNISHMENT_FRY, ADMIN_PUNISHMENT_FRY,
ADMIN_PUNISHMENT_CRACK, ADMIN_PUNISHMENT_CRACK,
ADMIN_PUNISHMENT_BLEED, ADMIN_PUNISHMENT_BLEED,
ADMIN_PUNISHMENT_SCARIFY) ADMIN_PUNISHMENT_SCARIFY,
ADMIN_PUNISHMENT_CLUWNE)
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
@@ -1481,6 +1502,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
to_chat(usr,"<span class='warning'>[C] does not have knottable shoes!</span>") to_chat(usr,"<span class='warning'>[C] does not have knottable shoes!</span>")
return return
sick_kicks.adjust_laces(SHOES_KNOTTED) sick_kicks.adjust_laces(SHOES_KNOTTED)
if(ADMIN_PUNISHMENT_CLUWNE)
if(!iscarbon(target))
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>")
return
target.cluwneify()
punish_log(target, punishment) punish_log(target, punishment)
@@ -1671,3 +1697,23 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!source) if(!source)
return return
REMOVE_TRAIT(D,chosen_trait,source) REMOVE_TRAIT(D,chosen_trait,source)
/client/proc/spawn_floor_cluwne()
set category = "Admin.Fun"
set name = "Unleash Floor Cluwne"
set desc = "Pick a specific target or just let it select randomly and spawn the floor cluwne mob on the station. Be warned: spawning more than one may cause issues!"
var/target
if(!check_rights(R_FUN))
return
var/turf/T = get_turf(usr)
target = input("Any specific target in mind? Please note only live, non cluwned, human targets are valid.", "Target", target) as null|anything in GLOB.player_list
if(target && ishuman(target))
var/mob/living/carbon/human/H = target
var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(T)
FC.Acquire_Victim(H)
else
new /mob/living/simple_animal/hostile/floor_cluwne(T)
log_admin("[key_name(usr)] spawned floor cluwne.")
message_admins("[key_name(usr)] spawned floor cluwne.")
@@ -111,7 +111,7 @@ GLOBAL_LIST_EMPTY(antagonists)
var/datum/skill_modifier/job/M = GLOB.skill_modifiers[GET_SKILL_MOD_ID(A, type)] var/datum/skill_modifier/job/M = GLOB.skill_modifiers[GET_SKILL_MOD_ID(A, type)]
if(istype(M)) if(istype(M))
M.name = "[name] Training" 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) SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src)
/datum/antagonist/proc/is_banned(mob/M) /datum/antagonist/proc/is_banned(mob/M)
@@ -164,14 +164,12 @@ GLOBAL_LIST_EMPTY(antagonists)
/datum/antagonist/proc/remove_blacklisted_quirks() /datum/antagonist/proc/remove_blacklisted_quirks()
var/mob/living/L = owner.current var/mob/living/L = owner.current
if(istype(L)) 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) for(var/q in L.roundstart_quirks)
var/datum/quirk/Q = q 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)) if(initial(Q.antag_removal_text))
to_chat(L, "<span class='boldannounce'>[initial(Q.antag_removal_text)]</span>") to_chat(L, "<span class='boldannounce'>[initial(Q.antag_removal_text)]</span>")
L.remove_quirk(Q.type) qdel(Q)
//Returns the team antagonist belongs to if any. //Returns the team antagonist belongs to if any.
/datum/antagonist/proc/get_team() /datum/antagonist/proc/get_team()
@@ -680,6 +680,11 @@
glove_type = /obj/item/clothing/gloves/fingerless/pugilist/cling // just punch his head off dude glove_type = /obj/item/clothing/gloves/fingerless/pugilist/cling // just punch his head off dude
glove_name_simple = "bone gauntlets" 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, "<span class='warning'>We would gain nothing by forming our fists into brute-force weapons when we are trained in precision martial arts!</span>")
return
/obj/item/clothing/gloves/fingerless/pugilist/cling // switches between lesser GotNS and Big Punchy Rib Breaky Hands /obj/item/clothing/gloves/fingerless/pugilist/cling // switches between lesser GotNS and Big Punchy Rib Breaky Hands
name = "hewn bone gauntlets" name = "hewn bone gauntlets"
icon_state = "ling_gauntlets" icon_state = "ling_gauntlets"
@@ -25,7 +25,7 @@
/datum/clockwork_scripture/create_object/stargazer/check_special_requirements() /datum/clockwork_scripture/create_object/stargazer/check_special_requirements()
var/area/A = get_area(invoker) var/area/A = get_area(invoker)
var/turf/T = get_turf(invoker) var/turf/T = get_turf(invoker)
if(!is_station_level(invoker.z) || isspaceturf(T) || !(A.area_flags & VALID_TERRITORY)) if(!is_station_level(invoker.z) || isspaceturf(T) || !(A?.area_flags & CULT_PERMITTED))
to_chat(invoker, "<span class='danger'>Stargazers can't be built off-station.</span>") to_chat(invoker, "<span class='danger'>Stargazers can't be built off-station.</span>")
return return
return ..() return ..()
@@ -34,7 +34,7 @@
return FALSE return FALSE
var/area/A = get_area(invoker) var/area/A = get_area(invoker)
var/turf/T = get_turf(invoker) var/turf/T = get_turf(invoker)
if(!is_station_level(T.z) || isspaceturf(T) || !(A.area_flags & VALID_TERRITORY) || isshuttleturf(T)) if(!is_station_level(T.z) || isspaceturf(T) || !(A?.area_flags & CULT_PERMITTED) || isshuttleturf(T))
to_chat(invoker, "<span class='warning'>You must be on the station to activate the Ark!</span>") to_chat(invoker, "<span class='warning'>You must be on the station to activate the Ark!</span>")
return FALSE return FALSE
if(GLOB.clockwork_gateway_activated) if(GLOB.clockwork_gateway_activated)
@@ -52,7 +52,7 @@
break break
if(has_starlight && anchored) if(has_starlight && anchored)
var/area/A = get_area(src) var/area/A = get_area(src)
if(A.outdoors || A.map_name == "Space" || !(A.area_flags & VALID_TERRITORY)) if(A.outdoors || A.map_name == "Space" || !(A?.area_flags & CULT_PERMITTED))
has_starlight = FALSE has_starlight = FALSE
if(old_status != has_starlight) if(old_status != has_starlight)
if(has_starlight) if(has_starlight)
@@ -115,7 +115,7 @@
skewee.visible_message("<span class='warning'>[skewee] painfully slides back down [src].</span>") skewee.visible_message("<span class='warning'>[skewee] painfully slides back down [src].</span>")
if(skewee.stat >= UNCONSCIOUS) if(skewee.stat >= UNCONSCIOUS)
return //by ratvar, no more spamming my deadchat, holy fuck return //by ratvar, no more spamming my deadchat, holy fuck
skewee.say("Oof, ouch owwie!!", forced = "fail brass skewer removal") skewee.emote("pain")
return return
skewee.visible_message("<span class='danger'>[skewee] comes free of [src] with a squelching pop!</span>", \ skewee.visible_message("<span class='danger'>[skewee] comes free of [src] with a squelching pop!</span>", \
"<span class='boldannounce'>You come free of [src]!</span>") "<span class='boldannounce'>You come free of [src]!</span>")
+1 -1
View File
@@ -419,7 +419,7 @@
var/sanity = 0 var/sanity = 0
while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100) while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100)
var/area/summon = pick(GLOB.sortedAreas - summon_spots) var/area/summon = pick(GLOB.sortedAreas - summon_spots)
if(summon && is_station_level(summon.z) && !(summon.area_flags & VALID_TERRITORY)) if(summon && is_station_level(summon.z) && (summon.area_flags & VALID_TERRITORY))
summon_spots += summon summon_spots += summon
sanity++ sanity++
update_explanation_text() update_explanation_text()
+1 -1
View File
@@ -148,7 +148,7 @@ This file contains the cult dagger and rune list code
to_chat(user, "<span class='cult'>There is already a rune here.</span>") to_chat(user, "<span class='cult'>There is already a rune here.</span>")
return FALSE return FALSE
var/area/A = get_area(T) var/area/A = get_area(T)
if((!is_station_level(T.z) && !is_mining_level(T.z)) || !(A?.area_flags & VALID_TERRITORY)) if((!is_station_level(T.z) && !is_mining_level(T.z)) || !(A?.area_flags & CULT_PERMITTED))
to_chat(user, "<span class='warning'>The veil is not weak enough here.</span>") to_chat(user, "<span class='warning'>The veil is not weak enough here.</span>")
return FALSE return FALSE
return TRUE return TRUE
@@ -89,6 +89,7 @@
var/list/lore = list() var/list/lore = list()
data["charges"] = charge data["charges"] = charge
data["total_sacs"] = cultie.total_sacrifices
for(var/X in to_know) for(var/X in to_know)
lore = list() lore = list()
@@ -96,7 +97,11 @@
lore["type"] = EK.type lore["type"] = EK.type
lore["name"] = EK.name lore["name"] = EK.name
lore["cost"] = EK.cost lore["cost"] = EK.cost
lore["disabled"] = EK.cost <= charge ? FALSE : TRUE lore["sacs"] = EK.sacs_needed
if(EK.cost <= charge && cultie.total_sacrifices >= EK.sacs_needed)
lore["disabled"] = FALSE
else
lore["disabled"] = TRUE
lore["path"] = EK.route lore["path"] = EK.route
lore["state"] = "Research" lore["state"] = "Research"
lore["flavour"] = EK.gain_text lore["flavour"] = EK.gain_text
@@ -108,6 +113,7 @@
var/datum/eldritch_knowledge/EK = known[X] var/datum/eldritch_knowledge/EK = known[X]
lore["name"] = EK.name lore["name"] = EK.name
lore["cost"] = EK.cost lore["cost"] = EK.cost
lore["sacs"] = EK.sacs_needed
lore["disabled"] = TRUE lore["disabled"] = TRUE
lore["path"] = EK.route lore["path"] = EK.route
lore["state"] = "Researched" lore["state"] = "Researched"

Some files were not shown because too many files have changed in this diff Show More