12
.vscode/launch.json
vendored
Normal file
12
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "byond",
|
||||
"request": "launch",
|
||||
"name": "Launch DreamSeeker",
|
||||
"preLaunchTask": "Build All",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
|
||||
}
|
||||
]
|
||||
}
|
||||
18
.vscode/settings.json
vendored
18
.vscode/settings.json
vendored
@@ -6,8 +6,11 @@
|
||||
"typescript.tsdk": "./tgui/.yarn/sdks/typescript/lib",
|
||||
"typescript.enablePromptUseWorkspaceTsdk": true,
|
||||
"search.exclude": {
|
||||
"tgui/.yarn": true,
|
||||
"tgui/.pnp.*": true
|
||||
"**/.yarn": true,
|
||||
"**/.pnp.*": true
|
||||
},
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.eslint": true
|
||||
},
|
||||
"workbench.editorAssociations": [
|
||||
{
|
||||
@@ -17,5 +20,14 @@
|
||||
],
|
||||
"files.eol": "\n",
|
||||
"gitlens.advanced.blame.customArguments": ["-w"],
|
||||
"tgstationTestExplorer.project.resultsType": "json"
|
||||
"tgstationTestExplorer.project.resultsType": "json",
|
||||
"[javascript]": {
|
||||
"editor.rulers": [80]
|
||||
},
|
||||
"[typescript]": {
|
||||
"editor.rulers": [80]
|
||||
},
|
||||
"[scss]": {
|
||||
"editor.rulers": [80]
|
||||
}
|
||||
}
|
||||
|
||||
55
.vscode/tasks.json
vendored
Normal file
55
.vscode/tasks.json
vendored
Normal 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,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/ruin/unpowered/xenonest)
|
||||
"bD" = (
|
||||
/obj/structure/alien/weeds,
|
||||
/turf/template_noop,
|
||||
/area/ruin/unpowered/xenonest)
|
||||
"dE" = (
|
||||
/obj/structure/alien/weeds,
|
||||
/obj/structure/bed/nest,
|
||||
@@ -1573,8 +1569,8 @@ aa
|
||||
aa
|
||||
aa
|
||||
ac
|
||||
bD
|
||||
bD
|
||||
ag
|
||||
ag
|
||||
aa
|
||||
"}
|
||||
(20,1,1) = {"
|
||||
@@ -1625,7 +1621,7 @@ aa
|
||||
aa
|
||||
aa
|
||||
ac
|
||||
bD
|
||||
ag
|
||||
aa
|
||||
"}
|
||||
(21,1,1) = {"
|
||||
@@ -1676,8 +1672,8 @@ ac
|
||||
aa
|
||||
aa
|
||||
ac
|
||||
bD
|
||||
bD
|
||||
ag
|
||||
ag
|
||||
"}
|
||||
(22,1,1) = {"
|
||||
ab
|
||||
@@ -1727,8 +1723,8 @@ ac
|
||||
ac
|
||||
ac
|
||||
aW
|
||||
bD
|
||||
bD
|
||||
ag
|
||||
ag
|
||||
"}
|
||||
(23,1,1) = {"
|
||||
ab
|
||||
@@ -1778,8 +1774,8 @@ ag
|
||||
aw
|
||||
ar
|
||||
ag
|
||||
bD
|
||||
bD
|
||||
ag
|
||||
ag
|
||||
"}
|
||||
(24,1,1) = {"
|
||||
ab
|
||||
@@ -1829,8 +1825,8 @@ ag
|
||||
aw
|
||||
ar
|
||||
ag
|
||||
bD
|
||||
bD
|
||||
ag
|
||||
ag
|
||||
"}
|
||||
(25,1,1) = {"
|
||||
ab
|
||||
@@ -1880,8 +1876,8 @@ ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
bD
|
||||
bD
|
||||
ag
|
||||
ag
|
||||
"}
|
||||
(26,1,1) = {"
|
||||
ab
|
||||
|
||||
@@ -23919,11 +23919,11 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/port)
|
||||
"bfe" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
|
||||
/obj/structure/reagent_dispensers/watertank,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/port)
|
||||
"bff" = (
|
||||
@@ -25957,7 +25957,7 @@
|
||||
/area/medical/paramedic)
|
||||
"bkd" = (
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Medbay Morgue";
|
||||
c_tag = "Paramedic Disbatch";
|
||||
dir = 8;
|
||||
network = list("ss13","medbay")
|
||||
},
|
||||
@@ -26360,7 +26360,7 @@
|
||||
req_access_txt = "6"
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"blb" = (
|
||||
/obj/machinery/door/airlock/command{
|
||||
name = "Captain's Quarters";
|
||||
@@ -27606,13 +27606,13 @@
|
||||
/obj/structure/sign/warning/radiation/rad_area{
|
||||
pixel_x = 32
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-2"
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/engineering/gravity_generator)
|
||||
"bnX" = (
|
||||
@@ -33974,12 +33974,12 @@
|
||||
},
|
||||
/obj/machinery/bloodbankgen,
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Medbay Recovery Room";
|
||||
c_tag = "Medbay Surgery Storage";
|
||||
dir = 6;
|
||||
network = list("ss13","medbay")
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"bCD" = (
|
||||
/obj/machinery/computer/operating,
|
||||
/turf/open/floor/plasteel/white/side,
|
||||
@@ -34354,11 +34354,14 @@
|
||||
/area/engineering/storage/tech)
|
||||
"bDA" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"bDB" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
@@ -34366,6 +34369,9 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-4"
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/open/floor/plasteel/white/side{
|
||||
dir = 4
|
||||
},
|
||||
@@ -35118,7 +35124,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/closed/wall,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"bFn" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 5
|
||||
@@ -35130,12 +35136,12 @@
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 10
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/decal/cleanable/blood/old,
|
||||
/obj/machinery/airalarm{
|
||||
pixel_y = 23
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"bFp" = (
|
||||
/obj/structure/closet/crate/freezer,
|
||||
/obj/item/reagent_containers/blood/random,
|
||||
@@ -35162,8 +35168,11 @@
|
||||
dir = 8;
|
||||
sortType = 6
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"bFq" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/effect/turf_decal/tile/yellow,
|
||||
@@ -35187,8 +35196,11 @@
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/closet/crate/freezer/surplus_limbs,
|
||||
/obj/item/reagent_containers/glass/beaker/synthflesh,
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"bFu" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
@@ -35222,8 +35234,9 @@
|
||||
"bFx" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/limbgrower,
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"bFy" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||
dir = 1
|
||||
@@ -35809,7 +35822,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/closed/wall,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"bGR" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/storage/belt/medical{
|
||||
@@ -35860,11 +35873,9 @@
|
||||
/area/medical/medbay/central)
|
||||
"bGW" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
|
||||
/turf/closed/wall,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"bGX" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
@@ -37012,7 +37023,7 @@
|
||||
dir = 9
|
||||
},
|
||||
/turf/closed/wall,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"bJB" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -40879,8 +40890,8 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bTT" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
|
||||
dir = 8
|
||||
/obj/machinery/atmospherics/pipe/manifold/general/visible{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/meter,
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -52309,7 +52320,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/science/robotics/mechbay)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cHF" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "Skynet_launch";
|
||||
@@ -54428,7 +54439,7 @@
|
||||
"fvk" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/turf/closed/wall,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"fvY" = (
|
||||
/obj/machinery/computer/cryopod{
|
||||
pixel_y = 26
|
||||
@@ -55768,6 +55779,9 @@
|
||||
req_access_txt = "45"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/medical/surgery)
|
||||
"iVJ" = (
|
||||
@@ -56031,7 +56045,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/structure/reagent_dispensers/watertank,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/port)
|
||||
"jyO" = (
|
||||
@@ -56248,6 +56262,7 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/engine_smes)
|
||||
"jLv" = (
|
||||
@@ -56560,7 +56575,7 @@
|
||||
dir = 6
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-8"
|
||||
icon_state = "0-2"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/gravity_generator)
|
||||
@@ -57358,6 +57373,7 @@
|
||||
/area/service/bar)
|
||||
"moS" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible,
|
||||
/obj/machinery/meter,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"mps" = (
|
||||
@@ -57521,6 +57537,19 @@
|
||||
/obj/structure/falsewall,
|
||||
/turf/open/floor/plating,
|
||||
/area/security/prison)
|
||||
"mJf" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-4"
|
||||
},
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-4"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/engineering/gravity_generator)
|
||||
"mJo" = (
|
||||
/obj/structure/door_assembly/door_assembly_mai,
|
||||
/obj/item/electronics/airlock,
|
||||
@@ -57562,9 +57591,6 @@
|
||||
name = "Gravity Generator";
|
||||
req_access_txt = "11"
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/engineering/gravity_generator)
|
||||
"mOG" = (
|
||||
@@ -58231,9 +58257,6 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/light{
|
||||
dir = 4;
|
||||
light_color = "#c1caff"
|
||||
@@ -60411,6 +60434,9 @@
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/turf/open/floor/plating,
|
||||
/area/engineering/atmos)
|
||||
"tBV" = (
|
||||
/turf/closed/wall,
|
||||
/area/medical/storage)
|
||||
"tCa" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/instrument/guitar{
|
||||
@@ -60524,6 +60550,9 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/gravity_generator)
|
||||
"tJS" = (
|
||||
@@ -60754,10 +60783,10 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/port/fore)
|
||||
"ugu" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-4"
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/gravity_generator)
|
||||
"uhm" = (
|
||||
@@ -61009,8 +61038,17 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/power/apc{
|
||||
areastring = "/area/medical/storage";
|
||||
name = "Medbay Surgery Storage";
|
||||
pixel_x = 1;
|
||||
pixel_y = -24
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-4"
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/central)
|
||||
/area/medical/storage)
|
||||
"uFZ" = (
|
||||
/obj/structure/closet/emcloset,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -61117,10 +61155,6 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 5
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/obj/machinery/power/terminal,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/engineering/gravity_generator)
|
||||
"uRn" = (
|
||||
@@ -61327,15 +61361,24 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/port)
|
||||
"vob" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-4"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/yellow/visible,
|
||||
/obj/machinery/meter,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/gravity_generator)
|
||||
/area/engineering/atmos)
|
||||
"voW" = (
|
||||
/obj/structure/pool/Lboard,
|
||||
/turf/open/pool,
|
||||
/area/commons/fitness/pool)
|
||||
"voZ" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/storage)
|
||||
"vpY" = (
|
||||
/obj/structure/closet/lasertag/blue,
|
||||
/obj/item/clothing/under/misc/pj/blue,
|
||||
@@ -61527,10 +61570,13 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/starboard/fore)
|
||||
"vFr" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/obj/machinery/power/terminal{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/gravity_generator)
|
||||
"vGn" = (
|
||||
@@ -62156,9 +62202,6 @@
|
||||
/turf/open/floor/carpet/royalblue,
|
||||
/area/maintenance/starboard/aft)
|
||||
"xgC" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-4"
|
||||
},
|
||||
/obj/machinery/power/apc{
|
||||
areastring = "/area/engineering/gravity_generator";
|
||||
dir = 8;
|
||||
@@ -62172,13 +62215,13 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-2"
|
||||
},
|
||||
/obj/machinery/light{
|
||||
dir = 8;
|
||||
light_color = "#e8eaff"
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-2"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/gravity_generator)
|
||||
"xgF" = (
|
||||
@@ -62188,13 +62231,10 @@
|
||||
},
|
||||
/area/maintenance/bar)
|
||||
"xhS" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-4"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/gravity_generator)
|
||||
"xhV" = (
|
||||
@@ -81844,7 +81884,7 @@ aQN
|
||||
aQN
|
||||
aZA
|
||||
aPA
|
||||
aWv
|
||||
jxF
|
||||
aYb
|
||||
aZE
|
||||
aZE
|
||||
@@ -82615,7 +82655,7 @@ aQW
|
||||
aQW
|
||||
xDM
|
||||
aPA
|
||||
jxF
|
||||
aWv
|
||||
aYb
|
||||
aZE
|
||||
bjp
|
||||
@@ -84992,7 +85032,7 @@ btG
|
||||
rXl
|
||||
xgC
|
||||
ugu
|
||||
bnV
|
||||
mJf
|
||||
bph
|
||||
bih
|
||||
big
|
||||
@@ -85247,7 +85287,7 @@ xTy
|
||||
xTy
|
||||
tJK
|
||||
xTy
|
||||
vob
|
||||
xTy
|
||||
xhS
|
||||
mOB
|
||||
bph
|
||||
@@ -86153,7 +86193,7 @@ aaa
|
||||
aaa
|
||||
gXs
|
||||
gXs
|
||||
aaH
|
||||
gXs
|
||||
abc
|
||||
abu
|
||||
abu
|
||||
@@ -87036,11 +87076,11 @@ bCq
|
||||
bSs
|
||||
ceY
|
||||
ccw
|
||||
ccw
|
||||
cjJ
|
||||
cnR
|
||||
cgT
|
||||
cjJ
|
||||
ccw
|
||||
cjJ
|
||||
ccw
|
||||
ccw
|
||||
ccw
|
||||
@@ -95226,10 +95266,10 @@ aJq
|
||||
bHt
|
||||
bBz
|
||||
bzs
|
||||
bof
|
||||
tBV
|
||||
bFm
|
||||
bGI
|
||||
bof
|
||||
tBV
|
||||
cBD
|
||||
bKD
|
||||
bLO
|
||||
@@ -95483,7 +95523,7 @@ bwu
|
||||
kPj
|
||||
bBB
|
||||
eBX
|
||||
bof
|
||||
tBV
|
||||
bFp
|
||||
uFV
|
||||
fvk
|
||||
@@ -95740,7 +95780,7 @@ aJq
|
||||
bAj
|
||||
aJq
|
||||
aKG
|
||||
bof
|
||||
tBV
|
||||
bFo
|
||||
bDA
|
||||
bFt
|
||||
@@ -95997,9 +96037,9 @@ byX
|
||||
aXh
|
||||
bmE
|
||||
bCA
|
||||
bof
|
||||
tBV
|
||||
bCC
|
||||
bDA
|
||||
voZ
|
||||
bFx
|
||||
bGW
|
||||
bKI
|
||||
@@ -96267,7 +96307,7 @@ bPc
|
||||
bQs
|
||||
cez
|
||||
ceA
|
||||
daq
|
||||
bTT
|
||||
bUN
|
||||
bOd
|
||||
bOd
|
||||
@@ -97299,9 +97339,9 @@ moS
|
||||
kGv
|
||||
bUS
|
||||
cCE
|
||||
bTT
|
||||
bUS
|
||||
bXU
|
||||
bUS
|
||||
vob
|
||||
bUS
|
||||
bXU
|
||||
bUS
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -705,7 +705,7 @@
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/commons/fitness/pool)
|
||||
/area/maintenance/department/crew_quarters/dorms)
|
||||
"abG" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
@@ -3392,6 +3392,10 @@
|
||||
/obj/vehicle/ridden/secway,
|
||||
/obj/item/key/security,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/machinery/airalarm{
|
||||
dir = 1;
|
||||
pixel_y = -22
|
||||
},
|
||||
/turf/open/floor/plasteel/showroomfloor,
|
||||
/area/security/office)
|
||||
"ais" = (
|
||||
@@ -4891,6 +4895,10 @@
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/airalarm{
|
||||
dir = 4;
|
||||
pixel_x = -23
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/security/brig)
|
||||
"alz" = (
|
||||
@@ -10747,6 +10755,11 @@
|
||||
name = "Port Solar APC";
|
||||
pixel_y = 23
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Port Bow Solar";
|
||||
dir = 9;
|
||||
name = "solar camera"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/solars/port)
|
||||
"ayD" = (
|
||||
@@ -24639,6 +24652,12 @@
|
||||
},
|
||||
/turf/open/space,
|
||||
/area/solars/starboard)
|
||||
"beW" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible{
|
||||
dir = 5
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"beY" = (
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Arrivals Central";
|
||||
@@ -37279,7 +37298,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/science/mixing)
|
||||
/area/maintenance/department/science)
|
||||
"bGB" = (
|
||||
/obj/machinery/light/small,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
@@ -37809,6 +37828,10 @@
|
||||
/obj/effect/turf_decal/tile/purple{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/radio/intercom{
|
||||
pixel_x = 30;
|
||||
pixel_y = -2
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/mixing)
|
||||
"bHI" = (
|
||||
@@ -40347,15 +40370,9 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/components/binary/pump{
|
||||
/obj/machinery/atmospherics/components/binary/pump/on{
|
||||
dir = 8;
|
||||
name = "Mix to Ports"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bNk" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/green/visible{
|
||||
dir = 1
|
||||
name = "Unfiltered to Mix"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -40364,8 +40381,9 @@
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold/green/visible{
|
||||
dir = 1
|
||||
/obj/machinery/atmospherics/components/binary/pump/on{
|
||||
dir = 4;
|
||||
name = "Unfiltered & Air to Mix"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -40801,23 +40819,19 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bOo" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/general/visible,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bOp" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible{
|
||||
dir = 10
|
||||
/obj/machinery/atmospherics/components/binary/pump{
|
||||
dir = 8;
|
||||
name = "Pure to Mix"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bOq" = (
|
||||
/obj/machinery/atmospherics/components/binary/pump{
|
||||
dir = 1;
|
||||
name = "Pure to Mix"
|
||||
/obj/machinery/atmospherics/pipe/manifold/green/visible{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -40836,7 +40850,7 @@
|
||||
/turf/open/floor/engine/vacuum,
|
||||
/area/science/mixing)
|
||||
"bOu" = (
|
||||
/obj/machinery/atmospherics/components/unary/outlet_injector/on{
|
||||
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
@@ -41081,13 +41095,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bPa" = (
|
||||
/obj/machinery/portable_atmospherics/canister,
|
||||
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bPd" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
|
||||
dir = 8
|
||||
@@ -41399,7 +41406,6 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bPW" = (
|
||||
@@ -41777,14 +41783,16 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bQK" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bQL" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
|
||||
/obj/machinery/atmospherics/pipe/manifold/green/visible{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bQM" = (
|
||||
@@ -41792,9 +41800,8 @@
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/components/binary/pump/on{
|
||||
dir = 1;
|
||||
name = "Unfiltered to Mix"
|
||||
/obj/machinery/atmospherics/pipe/simple/green/visible{
|
||||
dir = 10
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -42101,8 +42108,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bRw" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
|
||||
/obj/machinery/meter,
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"bRx" = (
|
||||
@@ -45936,14 +45942,8 @@
|
||||
/turf/open/floor/engine,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"bZV" = (
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/door/airlock/external{
|
||||
req_access_txt = "13"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/cargo)
|
||||
/turf/closed/wall,
|
||||
/area/hallway/primary/fore)
|
||||
"bZY" = (
|
||||
/turf/closed/wall,
|
||||
/area/service/chapel/office)
|
||||
@@ -52330,7 +52330,6 @@
|
||||
/area/service/library)
|
||||
"czp" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/disk/nuclear/fake,
|
||||
/obj/item/barcodescanner,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/service/library)
|
||||
@@ -53827,6 +53826,12 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/construction/mining/aux_base)
|
||||
"eEd" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/green/visible{
|
||||
dir = 6
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"eEp" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
|
||||
dir = 4
|
||||
@@ -55196,6 +55201,15 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/construction/mining/aux_base)
|
||||
"hEi" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible{
|
||||
dir = 10
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"hEX" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 6
|
||||
@@ -56737,6 +56751,12 @@
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/engineering/main)
|
||||
"kWG" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/general/visible{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"kWQ" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/orange/visible,
|
||||
/obj/structure/cable/yellow{
|
||||
@@ -57367,6 +57387,11 @@
|
||||
name = "Starboard Solar APC";
|
||||
pixel_x = -25
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Starboard Solar";
|
||||
dir = 10;
|
||||
name = "solar camera"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/solars/starboard)
|
||||
"mwg" = (
|
||||
@@ -57441,6 +57466,15 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/closed/wall,
|
||||
/area/maintenance/department/engine)
|
||||
"mAR" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/green/visible{
|
||||
dir = 5
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
|
||||
dir = 10
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"mCe" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
@@ -58847,6 +58881,10 @@
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/service/lawoffice)
|
||||
"pEM" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/general/visible,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"pFe" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -59368,6 +59406,13 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/maintenance/department/crew_quarters/dorms)
|
||||
"qQu" = (
|
||||
/obj/machinery/portable_atmospherics/canister,
|
||||
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"qRl" = (
|
||||
/obj/item/radio/intercom{
|
||||
name = "Station Intercom (General)";
|
||||
@@ -60108,6 +60153,13 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/security/brig)
|
||||
"sGJ" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"sIK" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
@@ -61029,6 +61081,12 @@
|
||||
},
|
||||
/turf/open/floor/engine,
|
||||
/area/engineering/main)
|
||||
"uST" = (
|
||||
/obj/machinery/atmospherics/components/binary/pump{
|
||||
name = "Mix to Ports"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"uUQ" = (
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
name = "Engineering Maintenance";
|
||||
@@ -61261,8 +61319,14 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/science)
|
||||
"vtT" = (
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/door/airlock/external{
|
||||
req_access_txt = "13"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/solars/port)
|
||||
/area/maintenance/department/cargo)
|
||||
"vuP" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
|
||||
dir = 4
|
||||
@@ -62179,7 +62243,7 @@
|
||||
"xuv" = (
|
||||
/obj/item/broken_bottle,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/solars/port)
|
||||
/area/maintenance/department/security/brig)
|
||||
"xvO" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
@@ -79788,11 +79852,11 @@ atp
|
||||
aus
|
||||
aiu
|
||||
wxb
|
||||
axC
|
||||
aiu
|
||||
xuv
|
||||
azN
|
||||
vtT
|
||||
vtT
|
||||
aoe
|
||||
ajD
|
||||
ajD
|
||||
aiu
|
||||
apB
|
||||
aiu
|
||||
@@ -82360,8 +82424,8 @@ apE
|
||||
avq
|
||||
apE
|
||||
ajM
|
||||
aiu
|
||||
aiu
|
||||
bZV
|
||||
bZV
|
||||
gSH
|
||||
xJy
|
||||
sJr
|
||||
@@ -99640,7 +99704,7 @@ bJN
|
||||
bKS
|
||||
bMe
|
||||
bNh
|
||||
bOo
|
||||
pEM
|
||||
bOX
|
||||
bMf
|
||||
bMf
|
||||
@@ -100154,9 +100218,9 @@ bHw
|
||||
bKU
|
||||
bOr
|
||||
bPU
|
||||
kWG
|
||||
bRw
|
||||
bPa
|
||||
bMf
|
||||
beW
|
||||
bMf
|
||||
bMf
|
||||
bMf
|
||||
@@ -100410,13 +100474,13 @@ bIF
|
||||
bHw
|
||||
bKV
|
||||
bOX
|
||||
bUv
|
||||
eEd
|
||||
bQL
|
||||
bPa
|
||||
bMf
|
||||
bMf
|
||||
bMf
|
||||
uST
|
||||
pEM
|
||||
bMf
|
||||
qQu
|
||||
qQu
|
||||
bSU
|
||||
bTT
|
||||
bUv
|
||||
@@ -100670,10 +100734,10 @@ bMg
|
||||
bNj
|
||||
bOp
|
||||
bPV
|
||||
bPV
|
||||
bPV
|
||||
bPV
|
||||
bPV
|
||||
hEi
|
||||
sGJ
|
||||
bUw
|
||||
bUw
|
||||
bUw
|
||||
bUw
|
||||
bUw
|
||||
@@ -100924,8 +100988,8 @@ bIH
|
||||
bHw
|
||||
cqG
|
||||
bOX
|
||||
bNk
|
||||
bOq
|
||||
mAR
|
||||
bPd
|
||||
bPW
|
||||
bPW
|
||||
@@ -106255,7 +106319,7 @@ aaF
|
||||
aaF
|
||||
aaF
|
||||
abF
|
||||
aaF
|
||||
aiS
|
||||
aiS
|
||||
atn
|
||||
awC
|
||||
@@ -107807,8 +107871,8 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aEl
|
||||
aFi
|
||||
aEj
|
||||
vtT
|
||||
aEj
|
||||
aaa
|
||||
aEj
|
||||
@@ -108064,9 +108128,9 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aEj
|
||||
bZV
|
||||
aEj
|
||||
cdm
|
||||
cdm
|
||||
cdm
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -108321,9 +108385,9 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
ahi
|
||||
ahi
|
||||
ahi
|
||||
bBW
|
||||
bBW
|
||||
bBW
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
191
_maps/templates/shelter_4.dmm
Normal file
191
_maps/templates/shelter_4.dmm
Normal 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
|
||||
"}
|
||||
@@ -53,6 +53,7 @@
|
||||
#define GELADIKINESIS /datum/mutation/human/geladikinesis
|
||||
#define CRYOKINESIS /datum/mutation/human/cryokinesis
|
||||
#define SPIDER_WEB /datum/mutation/human/webbing
|
||||
#define CLUWNEMUT /datum/mutation/human/cluwne
|
||||
|
||||
#define UI_CHANGED "ui changed"
|
||||
#define UE_CHANGED "ue changed"
|
||||
|
||||
@@ -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)
|
||||
/// If a turf can be made dirty at roundstart. This is also used in areas.
|
||||
#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
|
||||
#define NO_LAVA_GEN_1 (1<<6)
|
||||
/// 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)
|
||||
/// If an area should be hidden from power consoles, power/atmosphere alerts, etc.
|
||||
#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
|
||||
|
||||
@@ -51,3 +51,4 @@
|
||||
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
|
||||
#define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment.
|
||||
#define ORGAN_EDIBLE (1<<7) //is a snack? :D
|
||||
#define ORGAN_SYNTHETIC_EMP (1<<6) //Synthetic organ affected by an EMP. Deteriorates over time.
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
#define ADMIN_PUNISHMENT_PICKLE "Pickle-ify"
|
||||
#define ADMIN_PUNISHMENT_FRY "Fry"
|
||||
#define ADMIN_PUNISHMENT_PERFORATE ":B:erforate"
|
||||
#define ADMIN_PUNISHMENT_CLUWNE "Cluwne"
|
||||
|
||||
#define AHELP_ACTIVE 1
|
||||
#define AHELP_CLOSED 2
|
||||
|
||||
@@ -160,7 +160,7 @@
|
||||
#define ATMOS_TANK_PLASMA "plasma=70000;TEMP=293.15"
|
||||
#define ATMOS_TANK_O2 "o2=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
|
||||
#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
/// how long they're staggered for
|
||||
#define SHOVE_STAGGER_DURATION 35
|
||||
/// how long they're off balance for
|
||||
#define SHOVE_OFFBALANCE_DURATION 30
|
||||
#define SHOVE_OFFBALANCE_DURATION 3 SECONDS
|
||||
|
||||
|
||||
//Embedded objects
|
||||
|
||||
@@ -23,6 +23,14 @@
|
||||
#define WINDOW_IN_FRAME 1
|
||||
#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
|
||||
#define AIRLOCK_ASSEMBLY_NEEDS_WIRES 0
|
||||
#define AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS 1
|
||||
|
||||
@@ -83,6 +83,8 @@
|
||||
#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
|
||||
#define COMPONENT_ATOM_BLOCK_EXIT 1
|
||||
#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc)
|
||||
/// From base of atom/wave_ex_act(): (datum/wave_explosion/explosion, args)
|
||||
#define COMSIG_ATOM_WAVE_EX_ACT "atom_wave_ex_act"
|
||||
///from base of atom/ex_act(): (severity, target)
|
||||
#define COMSIG_ATOM_EX_ACT "atom_ex_act"
|
||||
///from base of atom/emp_act(): (severity)
|
||||
|
||||
86
code/__DEFINES/explosion.dm
Normal file
86
code/__DEFINES/explosion.dm
Normal 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
|
||||
@@ -77,6 +77,7 @@
|
||||
#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible
|
||||
#define TABLE_LAYER 2.8
|
||||
#define TRAY_LAYER 2.85
|
||||
#define GATEWAY_UNDERLAY_LAYER 2.85
|
||||
#define BELOW_OBJ_LAYER 2.9
|
||||
#define LOW_ITEM_LAYER 2.95
|
||||
//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
|
||||
|
||||
@@ -180,6 +180,7 @@
|
||||
#define FIRE_PRIORITY_PROJECTILES 200
|
||||
#define FIRE_PRIORITY_TICKER 200
|
||||
#define FIRE_PRIORITY_ATMOS_ADJACENCY 300
|
||||
#define FIRE_PRIORITY_EXPLOSIONS 350
|
||||
#define FIRE_PRIORITY_STATPANEL 390
|
||||
#define FIRE_PRIORITY_CHAT 400
|
||||
#define FIRE_PRIORITY_RUNECHAT 410
|
||||
@@ -219,7 +220,6 @@
|
||||
A.flags_1 &= ~OVERLAY_QUEUED_1;\
|
||||
} while(FALSE)
|
||||
|
||||
|
||||
/**
|
||||
Create a new timer and add it to the queue.
|
||||
* Arguments:
|
||||
|
||||
@@ -165,6 +165,7 @@
|
||||
#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events"
|
||||
#define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events
|
||||
#define TRAIT_PUGILIST "pugilist" //This guy punches people for a living
|
||||
#define TRAIT_NOPUGILIST "nopugilist" // for preventing ((((((((((extreme)))))))))) punch stacking
|
||||
#define TRAIT_KI_VAMPIRE "ki-vampire" //when someone with this trait rolls maximum damage on a punch and stuns the target, they regain some stamina and do clone damage
|
||||
#define TRAIT_MAULER "mauler" // this guy punches the shit out of people to hurt them, not to drain their stamina
|
||||
#define TRAIT_PASSTABLE "passtable"
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
//socks
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list)
|
||||
//bodypart accessories (blizzard intensifies)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/lizard, GLOB.animated_tails_list_lizard)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human)
|
||||
@@ -68,6 +67,7 @@
|
||||
for(var/spath in subtypesof(/datum/species))
|
||||
var/datum/species/S = new spath()
|
||||
GLOB.species_list[S.id] = spath
|
||||
GLOB.species_datums[S.id] = S
|
||||
|
||||
//Surgeries
|
||||
for(var/path in subtypesof(/datum/surgery))
|
||||
|
||||
@@ -64,8 +64,6 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list)
|
||||
if(!GLOB.legs_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list)
|
||||
if(!GLOB.body_markings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
|
||||
if(!GLOB.wings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list)
|
||||
if(!GLOB.deco_wings_list.len)
|
||||
@@ -115,15 +113,6 @@
|
||||
continue
|
||||
if(!S.ckeys_allowed)
|
||||
snowflake_mam_tails_list[S.name] = mtpath
|
||||
var/list/snowflake_markings_list = list()
|
||||
for(var/mmpath in GLOB.mam_body_markings_list)
|
||||
var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[mmpath]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
||||
continue
|
||||
if(!S.ckeys_allowed)
|
||||
snowflake_markings_list[S.name] = mmpath
|
||||
var/list/snowflake_ears_list = list()
|
||||
for(var/mepath in GLOB.mam_ears_list)
|
||||
var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[mepath]
|
||||
@@ -177,7 +166,6 @@
|
||||
"ears" = "None",
|
||||
"frills" = pick(GLOB.frills_list),
|
||||
"spines" = pick(GLOB.spines_list),
|
||||
"body_markings" = pick(GLOB.body_markings_list),
|
||||
"legs" = pick("Plantigrade","Digitigrade"),
|
||||
"caps" = pick(GLOB.caps_list),
|
||||
"insect_wings" = pick(GLOB.insect_wings_list),
|
||||
@@ -187,7 +175,7 @@
|
||||
"arachnid_spinneret" = pick(GLOB.arachnid_spinneret_list),
|
||||
"arachnid_mandibles" = pick(GLOB.arachnid_mandibles_list),
|
||||
"taur" = "None",
|
||||
"mam_body_markings" = snowflake_markings_list.len ? pick(snowflake_markings_list) : "None",
|
||||
"mam_body_markings" = list(),
|
||||
"mam_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None",
|
||||
"mam_snouts" = snowflake_mam_snouts_list ? pick(snowflake_mam_snouts_list) : "None",
|
||||
"mam_tail" = snowflake_mam_tails_list ? pick(snowflake_mam_tails_list) : "None",
|
||||
@@ -320,6 +308,8 @@ GLOBAL_LIST_INIT(nonstandard_skin_tones, list("orange"))
|
||||
|
||||
GLOBAL_LIST_EMPTY(species_list)
|
||||
|
||||
GLOBAL_LIST_EMPTY(species_datums)
|
||||
|
||||
/proc/age2agedescription(age)
|
||||
switch(age)
|
||||
if(0 to 1)
|
||||
|
||||
@@ -95,3 +95,9 @@
|
||||
if("I'm feeling lucky")
|
||||
chosen_id = pick(subtypesof(/datum/reagent))
|
||||
return chosen_id
|
||||
|
||||
/proc/find_reagent_object_from_type(input)
|
||||
if(GLOB.chemical_reagents_list[input]) //prefer IDs!
|
||||
return GLOB.chemical_reagents_list[input]
|
||||
else
|
||||
return null
|
||||
|
||||
@@ -551,8 +551,7 @@
|
||||
///How many players joined the round.
|
||||
var/total_players = GLOB.joined_player_list.len
|
||||
var/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote))
|
||||
for(var/i in SSeconomy.generated_accounts)
|
||||
var/datum/bank_account/current_acc = SSeconomy.generated_accounts[i]
|
||||
for(var/datum/bank_account/current_acc in SSeconomy.generated_accounts)
|
||||
if(typecache_bank[current_acc.type])
|
||||
continue
|
||||
station_vault += current_acc.account_balance
|
||||
|
||||
@@ -15,7 +15,7 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"ABDUCTOR_PROOF" = ABDUCTOR_PROOF,
|
||||
"BLOBS_ALLOWED" = BLOBS_ALLOWED,
|
||||
"BLOCK_SUICIDE" = BLOCK_SUICIDE,
|
||||
// "CULT_PERMITTED" = CULT_PERMITTED,
|
||||
"CULT_PERMITTED" = CULT_PERMITTED,
|
||||
"FLORA_ALLOWED" = FLORA_ALLOWED,
|
||||
"HIDDEN_AREA" = HIDDEN_AREA,
|
||||
"MEGAFAUNA_SPAWN_ALLOWED" = MEGAFAUNA_SPAWN_ALLOWED,
|
||||
|
||||
@@ -17,7 +17,6 @@ GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name
|
||||
//Socks
|
||||
GLOBAL_LIST_EMPTY_TYPED(socks_list, /datum/sprite_accessory/underwear/socks) //stores socks indexed by name
|
||||
//Lizard Bits (all datum lists indexed by name)
|
||||
GLOBAL_LIST_EMPTY(body_markings_list)
|
||||
GLOBAL_LIST_EMPTY(tails_list_lizard)
|
||||
GLOBAL_LIST_EMPTY(animated_tails_list_lizard)
|
||||
GLOBAL_LIST_EMPTY(snouts_list)
|
||||
@@ -55,7 +54,6 @@ GLOBAL_LIST_INIT(mutant_reference_list, list(
|
||||
"frills" = GLOB.frills_list,
|
||||
"horns" = GLOB.horns_list,
|
||||
"ears" = GLOB.ears_list,
|
||||
"body_markings" = GLOB.body_markings_list,
|
||||
"wings" = GLOB.wings_list,
|
||||
"wingsopen" = GLOB.wings_open_list,
|
||||
"deco_wings" = GLOB.deco_wings_list,
|
||||
@@ -299,7 +297,7 @@ GLOBAL_LIST_INIT(roundstart_languages, get_roundstart_languages())
|
||||
//locked parts are those that your picked species requires to have
|
||||
//unlocked parts are those that anyone can choose on customisation regardless
|
||||
//parts not in unlocked, but in all, are thus locked
|
||||
GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns"))
|
||||
GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns"))
|
||||
GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
|
||||
|
||||
//parts in either of the above two lists that require a second option that allows them to be coloured
|
||||
@@ -350,3 +348,8 @@ GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow"
|
||||
|
||||
//list of eye types, corresponding to a respective left and right icon state for the set of eyes
|
||||
GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "cyclops"))
|
||||
|
||||
//list linking bodypart bitflags to their actual names
|
||||
GLOBAL_LIST_INIT(bodypart_names, list(num2text(HEAD) = "Head", num2text(CHEST) = "Chest", num2text(LEG_LEFT) = "Left Leg", num2text(LEG_RIGHT) = "Right Leg", num2text(ARM_LEFT) = "Left Arm", num2text(ARM_RIGHT) = "Right Arm"))
|
||||
// list linking bodypart names back to the bitflags
|
||||
GLOBAL_LIST_INIT(bodypart_values, list("Head" = num2text(HEAD), "Chest" = num2text(CHEST), "Left Leg" = num2text(LEG_LEFT), "Right Leg" = num2text(LEG_RIGHT), "Left Arm" = num2text(ARM_LEFT), "Right Arm" = num2text(ARM_RIGHT)))
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
//Generic living
|
||||
#define ui_living_pull "EAST-1:28,CENTER-2:15"
|
||||
#define ui_living_health "EAST-1:28,CENTER:15"
|
||||
#define ui_living_healthdoll "EAST-1:28,CENTER-1:15"
|
||||
|
||||
//Monkeys
|
||||
#define ui_monkey_head "CENTER-5:13,SOUTH:5"
|
||||
|
||||
@@ -13,7 +13,6 @@ GLOBAL_LIST_EMPTY(radial_menus)
|
||||
icon_state = "radial_slice"
|
||||
var/choice
|
||||
var/next_page = FALSE
|
||||
var/tooltips = FALSE
|
||||
|
||||
/obj/screen/radial/slice/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
|
||||
@@ -637,6 +637,11 @@
|
||||
name = "health doll"
|
||||
screen_loc = ui_healthdoll
|
||||
|
||||
/obj/screen/healthdoll/living
|
||||
icon_state = "fullhealth0"
|
||||
screen_loc = ui_living_healthdoll
|
||||
var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update
|
||||
|
||||
/obj/screen/mood
|
||||
name = "mood"
|
||||
icon_state = "mood5"
|
||||
|
||||
15
code/_onclick/hud/simple_animal.dm
Normal file
15
code/_onclick/hud/simple_animal.dm
Normal 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
|
||||
@@ -61,14 +61,14 @@ SUBSYSTEM_DEF(activity)
|
||||
for(var/threat in threat_history)
|
||||
. = max(threat_history[threat], .)
|
||||
|
||||
/datum/controller/subsystem/activity/proc/on_explosion(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
|
||||
/datum/controller/subsystem/activity/proc/on_explosion(datum/source, atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
|
||||
if(!("explosions" in deferred_threats))
|
||||
deferred_threats["explosions"] = 0
|
||||
var/area/A = get_area(epicenter)
|
||||
if(is_station_level(epicenter.z) && (A.area_flags & BLOBS_ALLOWED) && !istype(A, /area/asteroid))
|
||||
deferred_threats["explosions"] += devastation_range**2 + heavy_impact_range**2 / 4 + light_impact_range**2 / 8 // 75 for a maxcap
|
||||
|
||||
/datum/controller/subsystem/activity/proc/on_death(mob/M, gibbed)
|
||||
/datum/controller/subsystem/activity/proc/on_death(datum/source, mob/M, gibbed)
|
||||
if(!("crew_deaths" in deferred_threats))
|
||||
deferred_threats["crew_deaths"] = 0
|
||||
if(M?.mind && SSjob.GetJob(M.mind.assigned_role))
|
||||
|
||||
23
code/controllers/subsystem/explosions.dm
Normal file
23
code/controllers/subsystem/explosions.dm
Normal 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
|
||||
@@ -713,7 +713,8 @@ SUBSYSTEM_DEF(ticker)
|
||||
'sound/roundend/disappointed.ogg',
|
||||
'sound/roundend/gondolabridge.ogg',
|
||||
'sound/roundend/haveabeautifultime.ogg',
|
||||
'sound/roundend/CitadelStationHasSeenBetterDays.ogg'\
|
||||
'sound/roundend/CitadelStationHasSeenBetterDays.ogg',
|
||||
'sound/roundend/approachingbaystation.ogg'\
|
||||
)
|
||||
|
||||
SEND_SOUND(world, sound(round_end_sound))
|
||||
|
||||
@@ -176,6 +176,11 @@
|
||||
scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE)
|
||||
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
|
||||
* Arguments:
|
||||
|
||||
@@ -52,8 +52,15 @@
|
||||
return
|
||||
strength -= strength / hl3_release_date
|
||||
if(strength <= RAD_BACKGROUND_RADIATION)
|
||||
qdel(src)
|
||||
addtimer(CALLBACK(src, .proc/check_dissipate), 5 SECONDS)
|
||||
return PROCESS_KILL
|
||||
|
||||
/datum/component/radioactive/proc/check_dissipate()
|
||||
if(strength <= RAD_BACKGROUND_RADIATION)
|
||||
qdel(src)
|
||||
return
|
||||
if(!(datum_flags & DF_ISPROCESSING)) // keep going
|
||||
START_PROCESSING(SSradiation, src)
|
||||
|
||||
/datum/component/radioactive/proc/glow_loop(atom/movable/master)
|
||||
var/filter = master.get_filter("rad_glow")
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper,
|
||||
/obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini,
|
||||
/obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/automatic/magrifle/pistol,
|
||||
/obj/item/toy/plush/snakeplushie, /obj/item/gun/energy/e_gun/mini
|
||||
/obj/item/toy/plush/snakeplushie, /obj/item/gun/energy/e_gun/mini, /obj/item/gun/ballistic/derringer
|
||||
))
|
||||
|
||||
/datum/component/storage/concrete/pockets/shoes/clown/Initialize()
|
||||
|
||||
378
code/datums/explosion2.dm
Normal file
378
code/datums/explosion2.dm
Normal 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
|
||||
@@ -142,7 +142,8 @@
|
||||
// Can most things breathe?
|
||||
if(trace_gases)
|
||||
continue
|
||||
if(A.get_moles(/datum/gas/oxygen) >= 16)
|
||||
var/oxy_moles = A.get_moles(/datum/gas/oxygen)
|
||||
if(oxy_moles < 16 || oxy_moles > 50)
|
||||
continue
|
||||
if(A.get_moles(/datum/gas/plasma))
|
||||
continue
|
||||
|
||||
@@ -165,6 +165,7 @@
|
||||
ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT)
|
||||
ADD_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
|
||||
ADD_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT)
|
||||
ADD_TRAIT(H, TRAIT_NOPUGILIST, SLEEPING_CARP_TRAIT) // cqc doesn't get this as it's intended to be able to stack with northstar gloves
|
||||
H.physiology.brute_mod *= 0.4 //brute is really not gonna cut it
|
||||
H.physiology.burn_mod *= 0.7 //burn is distinctly more useful against them than brute but they're still resistant
|
||||
H.physiology.stamina_mod *= 0.4 //You take less stamina damage overall, but you do not reduce the damage from stun batons as much
|
||||
@@ -181,6 +182,7 @@
|
||||
REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT)
|
||||
REMOVE_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
|
||||
REMOVE_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT)
|
||||
REMOVE_TRAIT(H, TRAIT_NOPUGILIST, SLEEPING_CARP_TRAIT)
|
||||
H.physiology.brute_mod = initial(H.physiology.brute_mod)
|
||||
H.physiology.burn_mod = initial(H.physiology.burn_mod)
|
||||
H.physiology.stamina_mod = initial(H.physiology.stamina_mod)
|
||||
|
||||
57
code/datums/mutations/cluwne.dm
Normal file
57
code/datums/mutations/cluwne.dm
Normal 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()
|
||||
@@ -11,7 +11,7 @@
|
||||
/datum/mutation/human/space_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
|
||||
..()
|
||||
if(!(type in visual_indicators))
|
||||
visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER))
|
||||
visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "space_adapt", -MUTATIONS_LAYER))
|
||||
|
||||
/datum/mutation/human/space_adaptation/get_visual_indicator()
|
||||
return visual_indicators[type][1]
|
||||
|
||||
@@ -209,7 +209,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Generic Maintenance"
|
||||
// ambience_index = AMBIENCE_MAINT
|
||||
ambientsounds = MAINTENANCE
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
|
||||
// airlock_wires = /datum/wires/airlock/maint
|
||||
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
|
||||
name = "Xenobiology Maintenance"
|
||||
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
|
||||
|
||||
@@ -598,11 +598,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/commons
|
||||
name = "Crew Quarters"
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
|
||||
|
||||
/area/commons/dorms
|
||||
name = "Dormitories"
|
||||
icon_state = "dorms"
|
||||
area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA
|
||||
|
||||
/area/commons/dorms/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_message = "<span class='nicegreen'>I love being in the library!</span>\n"
|
||||
// mood_trait = TRAIT_INTROVERT
|
||||
flags_1 = CULT_PERMITTED_1
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
|
||||
sound_environment = SOUND_AREA_LARGE_SOFTFLOOR
|
||||
|
||||
/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
|
||||
name = "Abandoned Library"
|
||||
icon_state = "abandoned_library"
|
||||
flags_1 = CULT_PERMITTED_1
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_NONE
|
||||
|
||||
/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
|
||||
name = "Custodial Closet"
|
||||
icon_state = "janitor"
|
||||
flags_1 = CULT_PERMITTED_1
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
|
||||
|
||||
/area/service/janitor/aux
|
||||
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
|
||||
name = "Atmospherics"
|
||||
icon_state = "atmos"
|
||||
flags_1 = CULT_PERMITTED_1
|
||||
|
||||
/area/engineering/atmos/upper
|
||||
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
|
||||
name = "Atmospherics Engine"
|
||||
icon_state = "atmos_engine"
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
|
||||
|
||||
/area/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
|
||||
name = "Supermatter Engine"
|
||||
icon_state = "engine_sm"
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/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
|
||||
name = "Telecomms Storage"
|
||||
icon_state = "tcom"
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
|
||||
clockwork_warp_allowed = FALSE
|
||||
|
||||
//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
|
||||
name = "Virology"
|
||||
icon_state = "virology"
|
||||
flags_1 = CULT_PERMITTED_1
|
||||
|
||||
/area/medical/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
|
||||
name = "Toxins Test Area"
|
||||
icon_state = "tox_test"
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
|
||||
|
||||
/area/science/mixing
|
||||
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
|
||||
name = "Toxins Mixing Chamber"
|
||||
icon_state = "tox_mix_chamber"
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
|
||||
|
||||
/area/science/misc_lab
|
||||
name = "Testing Lab"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
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
|
||||
///Whether there is an atmos alarm in this area
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
requires_power = FALSE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
area_flags = VALID_TERRITORY | UNIQUE_AREA | NOTELEPORT
|
||||
area_flags = UNIQUE_AREA | NOTELEPORT
|
||||
flags_1 = NONE
|
||||
|
||||
/area/centcom/control
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
icon_state = "Holodeck"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
flags_1 = NONE
|
||||
area_flags = VALID_TERRITORY | UNIQUE_AREA
|
||||
sound_environment = SOUND_ENVIRONMENT_PADDED_CELL
|
||||
|
||||
var/obj/machinery/computer/holodeck/linked
|
||||
@@ -87,9 +86,6 @@
|
||||
/area/holodeck/rec_center/lounge
|
||||
name = "Holodeck - Lounge"
|
||||
|
||||
/area/holodeck/rec_center/medical
|
||||
name = "Holodeck - Emergency Medical"
|
||||
|
||||
/area/holodeck/rec_center/pet_lounge
|
||||
name = "Holodeck - Pet Park"
|
||||
|
||||
@@ -128,6 +124,10 @@
|
||||
name = "Holodeck - Holdout Bunker"
|
||||
restricted = 1
|
||||
|
||||
/area/holodeck/rec_center/medical
|
||||
name = "Holodeck - Emergency Medical"
|
||||
restricted = 1
|
||||
|
||||
/area/holodeck/rec_center/anthophila
|
||||
name = "Holodeck - Anthophila"
|
||||
restricted = 1
|
||||
|
||||
@@ -157,10 +157,10 @@
|
||||
|
||||
/area/shuttle/escape
|
||||
name = "Emergency Shuttle"
|
||||
area_flags = BLOBS_ALLOWED
|
||||
area_flags = BLOBS_ALLOWED | CULT_PERMITTED
|
||||
// area_limited_icon_smoothing = /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
|
||||
name = "Backup Emergency Shuttle"
|
||||
|
||||
@@ -36,6 +36,14 @@
|
||||
///Value used to increment ex_act() if reactionary_explosions is on
|
||||
var/explosion_block = 0
|
||||
|
||||
/// Flags for explosions
|
||||
var/explosion_flags = NONE
|
||||
/// Amount to decrease wave explosions by
|
||||
var/wave_explosion_block = 0
|
||||
/// Amount to multiply wave explosions by
|
||||
var/wave_explosion_multiply = 1
|
||||
|
||||
//its inherent color, the colored paint applied on it, special color effect etc...
|
||||
/**
|
||||
* used to store the different colors on an atom
|
||||
*
|
||||
@@ -43,7 +51,6 @@
|
||||
*/
|
||||
var/list/atom_colours
|
||||
|
||||
|
||||
/// a very temporary list of overlays to remove
|
||||
var/list/remove_overlays
|
||||
/// a very temporary list of overlays to add
|
||||
@@ -556,6 +563,34 @@
|
||||
contents_explosion(severity, target)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target)
|
||||
|
||||
/**
|
||||
* Called when a wave explosion hits this atom. Do not override this.
|
||||
*
|
||||
* Returns explosion power to "allow through".
|
||||
*/
|
||||
/atom/proc/wave_explode(power, datum/wave_explosion/explosion, dir)
|
||||
set waitfor = FALSE
|
||||
// SHOULD_NOT_SLEEP(TRUE)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_WAVE_EX_ACT, args)
|
||||
. = wave_ex_act(power, explosion, dir) // this must happen first for stuff like destruction/damage to tick.
|
||||
if(isnull(.))
|
||||
stack_trace("wave_ex_act on [type] failed to return a number. defaulting to no blocking.")
|
||||
return power
|
||||
if((explosion_flags & EXPLOSION_FLAG_DENSITY_DEPENDENT) && !density)
|
||||
return power // no block
|
||||
else if((explosion_flags & EXPLOSION_FLAG_HARD_OBSTACLE) && !QDELETED(src))
|
||||
return 0 // fully blocked
|
||||
|
||||
/**
|
||||
* Called when a wave explosion hits this atom.
|
||||
*
|
||||
* Returns explosion power to "allow through". Standard handling and flag overrides in [wave_explode()].
|
||||
*/
|
||||
/atom/proc/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
// SHOULD_NOT_SLEEP(TRUE)
|
||||
return power * wave_explosion_multiply - wave_explosion_block
|
||||
|
||||
/atom/proc/blob_act(obj/structure/blob/B)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B)
|
||||
return
|
||||
|
||||
@@ -55,6 +55,9 @@
|
||||
///Internal holder for emissive blocker object, do not use directly use blocks_emissive
|
||||
var/atom/movable/emissive_blocker/em_block
|
||||
|
||||
/// Should we use tooltips, if the thing does not have the code implemented `get_tooltip_data()`, it will default to examine(src)
|
||||
var/tooltips = FALSE
|
||||
|
||||
|
||||
/atom/movable/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -576,7 +579,7 @@
|
||||
|
||||
//TODO: Better floating
|
||||
/atom/movable/proc/float(on, throw_override)
|
||||
if(throwing || !throw_override)
|
||||
if(throwing && !throw_override)
|
||||
return
|
||||
if(on && !(movement_type & FLOATING))
|
||||
animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
|
||||
|
||||
@@ -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(meteorsCat, list(/obj/effect/meteor/cat)) //for cat meteors
|
||||
|
||||
|
||||
///////////////////////////////
|
||||
//Meteor spawning global procs
|
||||
@@ -345,6 +347,17 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
..()
|
||||
if(prob(20))
|
||||
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
|
||||
|
||||
@@ -96,6 +96,10 @@ Class Procs:
|
||||
flags_ricochet = RICOCHET_HARD
|
||||
ricochet_chance_mod = 0.3
|
||||
|
||||
explosion_flags = EXPLOSION_FLAG_DENSITY_DEPENDENT
|
||||
wave_explosion_block = EXPLOSION_BLOCK_MACHINE
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_MACHINE
|
||||
|
||||
anchored = TRUE
|
||||
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT
|
||||
|
||||
|
||||
@@ -79,10 +79,12 @@
|
||||
if (obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
SSshuttle.shuttle_purchase_requirements_met |= "emagged"
|
||||
if (authenticated)
|
||||
authorize_access = get_all_accesses()
|
||||
to_chat(user, "<span class='danger'>You scramble the communication routing circuits!</span>")
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE)
|
||||
SSshuttle.shuttle_purchase_requirements_met["emagged"] = TRUE
|
||||
return
|
||||
|
||||
/obj/machinery/computer/communications/ui_act(action, list/params)
|
||||
|
||||
@@ -54,6 +54,8 @@
|
||||
assemblytype = /obj/structure/door_assembly
|
||||
normalspeed = 1
|
||||
explosion_block = 1
|
||||
wave_explosion_block = EXPLOSION_BLOCK_WALL
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_WALL
|
||||
hud_possible = list(DIAG_AIRLOCK_HUD)
|
||||
|
||||
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN
|
||||
@@ -686,7 +688,7 @@
|
||||
else
|
||||
. += "It looks very robust."
|
||||
|
||||
if(hasSiliconAccessInArea(user) && (!stat & BROKEN))
|
||||
if(hasSiliconAccessInArea(user) && !(stat & BROKEN))
|
||||
. += "<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'>Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.</span>"
|
||||
|
||||
@@ -16,6 +16,11 @@
|
||||
|
||||
interaction_flags_atom = INTERACT_ATOM_UI_INTERACT
|
||||
|
||||
wave_explosion_block = EXPLOSION_BLOCK_DENSE_FILLER
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_DENSE_FILLER
|
||||
|
||||
explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE | EXPLOSION_FLAG_DENSITY_DEPENDENT
|
||||
|
||||
var/secondsElectrified = 0
|
||||
var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close
|
||||
var/shockedby
|
||||
@@ -412,3 +417,8 @@
|
||||
|
||||
/obj/machinery/door/GetExplosionBlock()
|
||||
return density ? real_explosion_block : 0
|
||||
|
||||
/obj/machinery/door/wave_explosion_damage(power, datum/wave_explosion/explosion)
|
||||
. = ..()
|
||||
if(!density)
|
||||
return . * EXPLOSION_DAMAGE_OPEN_DOOR_FACTOR
|
||||
|
||||
@@ -71,3 +71,6 @@
|
||||
|
||||
/obj/machinery/door/password/ex_act(severity, target)
|
||||
return
|
||||
|
||||
/obj/machinery/door/password/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
return 0 //no.
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
closingLayer = CLOSED_BLASTDOOR_LAYER
|
||||
sub_door = TRUE
|
||||
explosion_block = 3
|
||||
wave_explosion_block = EXPLOSION_BLOCK_BLAST_PROOF
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_BLAST_PROOF
|
||||
heat_proof = TRUE
|
||||
safe = FALSE
|
||||
max_integrity = 600
|
||||
|
||||
@@ -360,6 +360,8 @@
|
||||
max_integrity = 300 //Stronger doors for prison (regular window door health is 200)
|
||||
reinf = 1
|
||||
explosion_block = 1
|
||||
wave_explosion_block = EXPLOSION_BLOCK_REINFORCED_WINDOW
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_REINFORCED_WINDOW
|
||||
|
||||
/obj/machinery/door/window/brigdoor/security/cell
|
||||
name = "cell door"
|
||||
|
||||
@@ -114,6 +114,44 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
|
||||
LAZYADD(message_log, messages.Join(" "))
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/doppler_array/proc/sense_wave_explosion(turf/epicenter, power, speed)
|
||||
if(stat & NOPOWER)
|
||||
return FALSE
|
||||
var/turf/zone = get_turf(src)
|
||||
if(zone.z != epicenter.z)
|
||||
return FALSE
|
||||
|
||||
if(next_announce > world.time)
|
||||
return FALSE
|
||||
next_announce = world.time + cooldown
|
||||
|
||||
var/distance = get_dist(epicenter, zone)
|
||||
var/direct = get_dir(zone, epicenter)
|
||||
|
||||
if(distance > max_dist)
|
||||
return FALSE
|
||||
if(!(direct & dir) && !integrated)
|
||||
return FALSE
|
||||
|
||||
|
||||
var/list/messages = list("Explosive shockwave detected.", \
|
||||
"Epicenter at: grid ([epicenter.x],[epicenter.y]). Shockwave expanding at a theoretical speed of [speed] m/s.", \
|
||||
"Wave energy: [power]MJ.")
|
||||
|
||||
if(integrated)
|
||||
var/obj/item/clothing/head/helmet/space/hardsuit/helm = loc
|
||||
if(!helm || !istype(helm, /obj/item/clothing/head/helmet/space/hardsuit))
|
||||
return FALSE
|
||||
helm.display_visor_message("Waveform explosion detected! Wave energy: [power]MJ.")
|
||||
else
|
||||
for(var/message in messages)
|
||||
say(message)
|
||||
if(LAZYLEN(message_log) > list_limit)
|
||||
say("Storage buffer is full! Clearing buffers...")
|
||||
LAZYCLEARLIST(message_log)
|
||||
LAZYADD(message_log, messages.Join(" "))
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/doppler_array/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Its dish is facing to the [dir2text(dir)].</span>"
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
#define LIMBGROWER_MAIN_MENU 1
|
||||
#define LIMBGROWER_CATEGORY_MENU 2
|
||||
#define LIMBGROWER_CHEMICAL_MENU 3
|
||||
//use these for the menu system
|
||||
|
||||
|
||||
/// The limbgrower. Makes organd and limbs with synthflesh and chems.
|
||||
/// See [limbgrower_designs.dm] for everything we can make.
|
||||
/obj/machinery/limbgrower
|
||||
name = "limb grower"
|
||||
desc = "It grows new limbs using Synthflesh."
|
||||
@@ -15,161 +11,235 @@
|
||||
active_power_usage = 100
|
||||
circuit = /obj/item/circuitboard/machine/limbgrower
|
||||
|
||||
var/operating = FALSE
|
||||
var/disabled = FALSE
|
||||
/// The category of limbs we're browing in our UI.
|
||||
var/selected_category = "human"
|
||||
/// If we're currently printing something.
|
||||
var/busy = FALSE
|
||||
var/prod_coeff = 1
|
||||
/// How efficient our machine is. Better parts = less chemicals used and less power used. Range of 1 to 0.25.
|
||||
var/production_coefficient = 1
|
||||
/// How long it takes for us to print a limb. Affected by production_coefficient.
|
||||
var/production_speed = 3 SECONDS
|
||||
/// The design we're printing currently.
|
||||
var/datum/design/being_built
|
||||
/// Our internal techweb for limbgrower designs.
|
||||
var/datum/techweb/stored_research
|
||||
var/selected_category
|
||||
var/screen = 1
|
||||
/// All the categories of organs we can print.
|
||||
var/list/categories = list(
|
||||
"human" = /datum/species/human,
|
||||
"lizard" = /datum/species/lizard,
|
||||
"mammal" = /datum/species/mammal,
|
||||
"insect" = /datum/species/insect,
|
||||
"fly" = /datum/species/fly,
|
||||
"plasmaman" = /datum/species/plasmaman,
|
||||
"xeno" = /datum/species/xeno,
|
||||
"other" = /datum/species,
|
||||
)
|
||||
var/list/stored_species = list()
|
||||
"human",
|
||||
"lizard",
|
||||
"mammal",
|
||||
"insect",
|
||||
"fly",
|
||||
"plasmaman",
|
||||
"xeno",
|
||||
"other",
|
||||
)
|
||||
var/obj/item/disk/data/dna_disk
|
||||
|
||||
/obj/machinery/limbgrower/Initialize()
|
||||
create_reagents(100, OPENCONTAINER)
|
||||
stored_research = new /datum/techweb/specialized/autounlocking/limbgrower
|
||||
for(var/i in categories)
|
||||
var/species = categories[i]
|
||||
stored_species[i] = new species()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/simple_demand)
|
||||
AddComponent(/datum/component/simple_rotation, ROTATION_WRENCH | ROTATION_CLOCKWISE, null, CALLBACK(src, .proc/can_be_rotated))
|
||||
|
||||
/obj/machinery/limbgrower/ui_interact(mob/user)
|
||||
/obj/machinery/limbgrower/ui_interact(mob/user, datum/tgui/ui)
|
||||
. = ..()
|
||||
if(!is_operational())
|
||||
return
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "Limbgrower", src)
|
||||
ui.open()
|
||||
|
||||
var/dat = main_win(user)
|
||||
/obj/machinery/limbgrower/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
switch(screen)
|
||||
if(LIMBGROWER_MAIN_MENU)
|
||||
dat = main_win(user)
|
||||
if(LIMBGROWER_CATEGORY_MENU)
|
||||
dat = category_win(user,selected_category)
|
||||
if(LIMBGROWER_CHEMICAL_MENU)
|
||||
dat = chemical_win(user)
|
||||
for(var/datum/reagent/reagent_id in reagents.reagent_list)
|
||||
var/list/reagent_data = list(
|
||||
reagent_name = reagent_id.name,
|
||||
reagent_amount = reagent_id.volume,
|
||||
reagent_type = reagent_id.type
|
||||
)
|
||||
data["reagents"] += list(reagent_data)
|
||||
|
||||
var/datum/browser/popup = new(user, "Limb Grower", name, 400, 500)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
data["total_reagents"] = reagents.total_volume
|
||||
data["max_reagents"] = reagents.maximum_volume
|
||||
data["busy"] = busy
|
||||
var/list/disk_data = list()
|
||||
disk_data["disk"] = dna_disk //Do i, the machine, have a disk?
|
||||
disk_data["name"] = dna_disk?.fields["name"] //Name for the human saved if there is one
|
||||
data["disk"] = disk_data
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/limbgrower/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["categories"] = list()
|
||||
|
||||
var/species_categories = categories.Copy()
|
||||
for(var/species in species_categories)
|
||||
species_categories[species] = list()
|
||||
for(var/design_id in stored_research.researched_designs)
|
||||
var/datum/design/limb_design = SSresearch.techweb_design_by_id(design_id)
|
||||
for(var/found_category in species_categories)
|
||||
if(found_category in limb_design.category)
|
||||
species_categories[found_category] += limb_design
|
||||
|
||||
for(var/category in species_categories)
|
||||
var/list/category_data = list(
|
||||
name = category,
|
||||
designs = list(),
|
||||
)
|
||||
for(var/datum/design/found_design in species_categories[category])
|
||||
var/list/all_reagents = list()
|
||||
for(var/reagent_typepath in found_design.reagents_list)
|
||||
var/datum/reagent/reagent_id = find_reagent_object_from_type(reagent_typepath)
|
||||
var/list/reagent_data = list(
|
||||
name = reagent_id.name,
|
||||
amount = (found_design.reagents_list[reagent_typepath] * production_coefficient),
|
||||
)
|
||||
all_reagents += list(reagent_data)
|
||||
|
||||
category_data["designs"] += list(list(
|
||||
parent_category = category,
|
||||
name = found_design.name,
|
||||
id = found_design.id,
|
||||
needed_reagents = all_reagents,
|
||||
))
|
||||
|
||||
data["categories"] += list(category_data)
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/limbgrower/on_deconstruction()
|
||||
for(var/obj/item/reagent_containers/glass/G in component_parts)
|
||||
reagents.trans_to(G, G.reagents.maximum_volume)
|
||||
for(var/obj/item/reagent_containers/glass/our_beaker in component_parts)
|
||||
reagents.trans_to(our_beaker, our_beaker.reagents.maximum_volume)
|
||||
..()
|
||||
|
||||
/obj/machinery/limbgrower/attackby(obj/item/O, mob/user, params)
|
||||
if(busy)
|
||||
/obj/machinery/limbgrower/attackby(obj/item/user_item, mob/living/user, params)
|
||||
if (busy)
|
||||
to_chat(user, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>")
|
||||
return
|
||||
|
||||
if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", O))
|
||||
updateUsrDialog()
|
||||
if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", user_item))
|
||||
ui_close(user)
|
||||
return
|
||||
|
||||
if(panel_open && default_deconstruction_crowbar(O))
|
||||
return
|
||||
|
||||
if(user.a_intent == INTENT_HARM) //so we can hit the machine
|
||||
if(user_item.tool_behaviour == TOOL_WRENCH && panel_open)
|
||||
return ..()
|
||||
|
||||
if(istype(O, /obj/item/disk))
|
||||
if(panel_open && default_deconstruction_crowbar(user_item))
|
||||
return
|
||||
|
||||
if(istype(user_item, /obj/item/disk))
|
||||
if(dna_disk)
|
||||
to_chat(user, "<span class='warning'>\The [src] already has a dna disk, take it out first!</span>")
|
||||
return
|
||||
else
|
||||
O.forceMove(src)
|
||||
dna_disk = O
|
||||
to_chat(user, "<span class='notice'>You insert \the [O] into \the [src].</span>")
|
||||
user_item.forceMove(src)
|
||||
dna_disk = user_item
|
||||
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
|
||||
|
||||
/obj/machinery/limbgrower/Topic(href, href_list)
|
||||
if(..())
|
||||
if(user.a_intent != INTENT_HELP)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/limbgrower/proc/can_be_rotated()
|
||||
if(panel_open)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/limbgrower/ui_act(action, list/params)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if (!busy)
|
||||
if(href_list["menu"])
|
||||
screen = text2num(href_list["menu"])
|
||||
|
||||
if(href_list["category"])
|
||||
selected_category = href_list["category"]
|
||||
if (busy)
|
||||
to_chat(usr, "<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
|
||||
reagents.del_reagent(text2path(href_list["disposeI"]))
|
||||
switch(action)
|
||||
|
||||
if(href_list["make"])
|
||||
if("empty_reagent")
|
||||
reagents.del_reagent(text2path(params["reagent_type"]))
|
||||
. = TRUE
|
||||
|
||||
/////////////////
|
||||
//href protection
|
||||
being_built = stored_research.isDesignResearchedID(href_list["make"]) //check if it's a valid design
|
||||
if("eject_disk")
|
||||
eject_disk(usr)
|
||||
|
||||
if("make_limb")
|
||||
being_built = stored_research.isDesignResearchedID(params["design_id"])
|
||||
if(!being_built)
|
||||
return
|
||||
CRASH("[src] was passed an invalid design id!")
|
||||
|
||||
/// All the reagents we're using to make our organ.
|
||||
var/list/consumed_reagents_list = being_built.reagents_list.Copy()
|
||||
/// The amount of power we're going to use, based on how much reagent we use.
|
||||
var/power = 0
|
||||
|
||||
var/synth_cost = being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff
|
||||
var/power = max(2000, synth_cost/5)
|
||||
for(var/reagent_id in consumed_reagents_list)
|
||||
consumed_reagents_list[reagent_id] *= production_coefficient
|
||||
if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id]))
|
||||
audible_message("<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))
|
||||
busy = TRUE
|
||||
use_power(power)
|
||||
flick("limbgrower_fill",src)
|
||||
icon_state = "limbgrower_idleon"
|
||||
addtimer(CALLBACK(src, .proc/build_item),32*prod_coeff)
|
||||
power = max(2000, (power + consumed_reagents_list[reagent_id]))
|
||||
|
||||
if(href_list["dna_disk"])
|
||||
var/mob/living/carbon/user = usr
|
||||
if(istype(user))
|
||||
if(!dna_disk)
|
||||
var/obj/item/disk/diskette = user.get_active_held_item()
|
||||
if(istype(diskette))
|
||||
diskette.forceMove(src)
|
||||
dna_disk = diskette
|
||||
to_chat(user, "<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>")
|
||||
busy = TRUE
|
||||
use_power(power)
|
||||
flick("limbgrower_fill",src)
|
||||
icon_state = "limbgrower_idleon"
|
||||
selected_category = params["active_tab"]
|
||||
addtimer(CALLBACK(src, .proc/build_item, consumed_reagents_list), production_speed * production_coefficient)
|
||||
. = TRUE
|
||||
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/limbgrower/proc/build_item()
|
||||
if(reagents.has_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff)) //sanity check, if this happens we are in big trouble
|
||||
reagents.remove_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff)
|
||||
var/buildpath = being_built.build_path
|
||||
if(ispath(buildpath, /obj/item/bodypart)) //This feels like spaghetti code, but i need to initiliaze a limb somehow
|
||||
build_limb(buildpath)
|
||||
else if(ispath(buildpath, /obj/item/organ/genital)) //genitals are uhh... customizable
|
||||
build_genital(buildpath)
|
||||
else
|
||||
//Just build whatever it is
|
||||
new buildpath(loc)
|
||||
else
|
||||
src.visible_message("<span class=\"error\"> Something went very wrong and there isnt enough synthflesh anymore!</span>")
|
||||
busy = FALSE
|
||||
flick("limbgrower_unfill",src)
|
||||
icon_state = "limbgrower_idleoff"
|
||||
updateUsrDialog()
|
||||
/*
|
||||
* The process of beginning to build a limb or organ.
|
||||
* Goes through and sanity checks that we actually have enough reagent to build our item.
|
||||
* Then, remove those reagents from our reagents datum.
|
||||
*
|
||||
* After the reagents are handled, we can proceede with making the limb or organ. (Limbs are handled in a separate proc)
|
||||
*
|
||||
* modified_consumed_reagents_list - the list of reagents we will consume on build, modified by the production coefficient.
|
||||
*/
|
||||
/obj/machinery/limbgrower/proc/build_item(list/modified_consumed_reagents_list)
|
||||
for(var/reagent_id in modified_consumed_reagents_list)
|
||||
if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]))
|
||||
audible_message("<span class='notice'>\The [src] buzzes.</span>")
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE)
|
||||
break
|
||||
|
||||
/obj/machinery/limbgrower/proc/build_limb(buildpath)
|
||||
reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])
|
||||
|
||||
var/built_typepath = being_built.build_path
|
||||
// If we have a bodypart, we need to initialize the limb on its own. Otherwise we can build it here.
|
||||
if(ispath(built_typepath, /obj/item/bodypart))
|
||||
build_limb(built_typepath)
|
||||
else if(ispath(built_typepath, /obj/item/organ/genital)) //genitals are uhh... customizable
|
||||
build_genital(built_typepath)
|
||||
else
|
||||
new built_typepath(loc)
|
||||
|
||||
busy = FALSE
|
||||
flick("limbgrower_unfill", src)
|
||||
icon_state = "limbgrower_idleoff"
|
||||
|
||||
/*
|
||||
* The process of putting together a limb.
|
||||
* This is called from after we remove the reagents, so this proc is just initializing the limb type.
|
||||
*
|
||||
* This proc handles skin / mutant color, greyscaling, names and descriptions, and various other limb creation steps.
|
||||
*
|
||||
* built_typepath - the path of the bodypart we're building.
|
||||
*/
|
||||
/obj/machinery/limbgrower/proc/build_limb(built_typepath)
|
||||
//i need to create a body part manually using a set icon (otherwise it doesnt appear)
|
||||
var/obj/item/bodypart/limb
|
||||
var/datum/species/selected = stored_species[selected_category]
|
||||
limb = new buildpath(loc)
|
||||
var/datum/species/selected = GLOB.species_datums[selected_category]
|
||||
limb = new built_typepath(loc)
|
||||
limb.base_bp_icon = selected.icon_limbs || DEFAULT_BODYPART_ICON_ORGANIC
|
||||
limb.species_id = selected.limbs_id
|
||||
limb.color_src = (MUTCOLORS in selected.species_traits ? MUTCOLORS : (selected.use_skintones ? SKINTONE : FALSE))
|
||||
@@ -189,135 +259,103 @@
|
||||
BP.name = "\improper synthetic [lowertext(selected.name)] [limb.name]"
|
||||
BP.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]."
|
||||
|
||||
/obj/machinery/limbgrower/proc/build_genital(buildpath)
|
||||
/*
|
||||
* Builds genitals, modifies to be the same
|
||||
* as the person's cloning data on the data disk
|
||||
*/
|
||||
/obj/machinery/limbgrower/proc/build_genital(built_typepath)
|
||||
//i needed to create a way to customize gene tools using dna
|
||||
var/list/features = dna_disk?.fields["features"]
|
||||
if(length(features))
|
||||
switch(buildpath)
|
||||
switch(built_typepath)
|
||||
if(/obj/item/organ/genital/penis)
|
||||
var/obj/item/organ/genital/penis/penis = new(loc)
|
||||
if(features["has_cock"])
|
||||
penis.shape = features["cock_shape"]
|
||||
penis.length = features["cock_shape"]
|
||||
penis.diameter_ratio = features["cock_diameter_ratio"]
|
||||
penis.color = sanitize_hexcolor(features["cock_color"], 6)
|
||||
penis.update_icon()
|
||||
penis.color = sanitize_hexcolor(features["cock_color"], 6, TRUE)
|
||||
penis.update()
|
||||
if(/obj/item/organ/genital/testicles)
|
||||
var/obj/item/organ/genital/testicles/balls = new(loc)
|
||||
if(features["has_balls"])
|
||||
balls.color = sanitize_hexcolor(features["balls_color"], 6)
|
||||
balls.color = sanitize_hexcolor(features["balls_color"], 6, TRUE)
|
||||
balls.shape = features["balls_shape"]
|
||||
balls.size = features["balls_size"]
|
||||
balls.fluid_rate = features["balls_cum_rate"]
|
||||
balls.fluid_mult = features["balls_cum_mult"]
|
||||
balls.fluid_efficiency = features["balls_efficiency"]
|
||||
balls.update()
|
||||
if(/obj/item/organ/genital/vagina)
|
||||
var/obj/item/organ/genital/vagina/vegana = new(loc)
|
||||
if(features["has_vagina"])
|
||||
vegana.color = sanitize_hexcolor(features["vag_color"], 6)
|
||||
if(features["has_vag"])
|
||||
vegana.color = sanitize_hexcolor(features["vag_color"], 6, TRUE)
|
||||
vegana.shape = features["vag_shape"]
|
||||
vegana.update()
|
||||
if(/obj/item/organ/genital/breasts)
|
||||
var/obj/item/organ/genital/breasts/boobs = new(loc)
|
||||
if(features["has_breasts"])
|
||||
boobs.color = sanitize_hexcolor(features["breasts_color"], 6)
|
||||
boobs.color = sanitize_hexcolor(features["breasts_color"], 6, TRUE)
|
||||
boobs.size = features["breasts_size"]
|
||||
boobs.shape = features["breasts_shape"]
|
||||
if(!features["breasts_producing"])
|
||||
boobs.genital_flags &= ~(GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH)
|
||||
boobs.update()
|
||||
else
|
||||
new buildpath(loc)
|
||||
new built_typepath(loc)
|
||||
else
|
||||
new buildpath(loc)
|
||||
new built_typepath(loc)
|
||||
|
||||
/obj/machinery/limbgrower/RefreshParts()
|
||||
reagents.maximum_volume = 0
|
||||
for(var/obj/item/reagent_containers/glass/G in component_parts)
|
||||
reagents.maximum_volume += G.volume
|
||||
G.reagents.trans_to(src, G.reagents.total_volume)
|
||||
var/T=1.2
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
T -= M.rating*0.2
|
||||
prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4
|
||||
for(var/obj/item/reagent_containers/glass/our_beaker in component_parts)
|
||||
reagents.maximum_volume += our_beaker.volume
|
||||
our_beaker.reagents.trans_to(src, our_beaker.reagents.total_volume)
|
||||
production_coefficient = 1.2
|
||||
for(var/obj/item/stock_parts/manipulator/our_manipulator in component_parts)
|
||||
production_coefficient -= our_manipulator.rating * 0.2
|
||||
production_coefficient = clamp(production_coefficient, 0, 1) // coefficient goes from 1 -> 0.8 -> 0.6 -> 0.4
|
||||
|
||||
/obj/machinery/limbgrower/examine(mob/user)
|
||||
. = ..()
|
||||
if(!panel_open)
|
||||
. += "<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))
|
||||
. += "<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>"
|
||||
dat += "<A href='?src=[REF(src)];dna_disk=1'>[dna_disk ? "Remove" : "Insert"] cloning data disk</A>"
|
||||
dat += "<hr>"
|
||||
dat += "<A href='?src=[REF(src)];menu=[LIMBGROWER_CHEMICAL_MENU]'>Chemical Storage</A>"
|
||||
dat += materials_printout()
|
||||
dat += "<table style='width:100%' align='center'><tr>"
|
||||
|
||||
for(var/C in categories)
|
||||
dat += "<td><A href='?src=[REF(src)];category=[C];menu=[LIMBGROWER_CATEGORY_MENU]'>[C]</A></td>"
|
||||
dat += "</tr><tr>"
|
||||
//one category per line
|
||||
|
||||
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
|
||||
/*
|
||||
* Checks our reagent list to see if a design can be built.
|
||||
*
|
||||
* limb_design - the design we're checking for buildability.
|
||||
*
|
||||
* returns TRUE if we have enough reagent to build it. Returns FALSE if we do not.
|
||||
*/
|
||||
/obj/machinery/limbgrower/proc/can_build(datum/design/limb_design)
|
||||
for(var/datum/reagent/reagent_id in limb_design.reagents_list)
|
||||
if(!reagents.has_reagent(reagent_id, limb_design.reagents_list[reagent_id] * production_coefficient))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/// Emagging a limbgrower allows you to build synthetic armblades.
|
||||
/obj/machinery/limbgrower/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
for(var/id in SSresearch.techweb_designs)
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(id)
|
||||
if((D.build_type & LIMBGROWER) && ("emagged" in D.category))
|
||||
stored_research.add_design(D)
|
||||
for(var/design_id in SSresearch.techweb_designs)
|
||||
var/datum/design/found_design = SSresearch.techweb_design_by_id(design_id)
|
||||
if((found_design.build_type & LIMBGROWER) && ("emagged" in found_design.category))
|
||||
stored_research.add_design(found_design)
|
||||
to_chat(user, "<span class='warning'>A warning flashes onto the screen, stating that safety overrides have been deactivated!</span>")
|
||||
obj_flags |= EMAGGED
|
||||
return TRUE
|
||||
update_static_data(user)
|
||||
|
||||
/obj/machinery/limbgrower/AltClick(mob/living/user)
|
||||
. = ..()
|
||||
eject_disk(user)
|
||||
|
||||
/obj/machinery/limbgrower/proc/eject_disk(mob/user)
|
||||
if(istype(user) && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
if(busy)
|
||||
to_chat(user, "<span class=\"alert\">\The [src] is busy. Please wait for completion of previous operation.</span>")
|
||||
@@ -326,6 +364,7 @@
|
||||
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>")
|
||||
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
|
||||
dna_disk = null
|
||||
else
|
||||
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()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/cleanable/glass/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
qdel(src)
|
||||
return power
|
||||
|
||||
/obj/effect/decal/cleanable/glass/plasma
|
||||
icon_state = "plasmatiny"
|
||||
|
||||
@@ -131,6 +135,9 @@
|
||||
/obj/effect/decal/cleanable/greenglow/ex_act()
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
return power
|
||||
|
||||
/obj/effect/decal/cleanable/cobweb
|
||||
name = "cobweb"
|
||||
desc = "Somebody should remove that."
|
||||
@@ -253,6 +260,11 @@
|
||||
if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion.
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/cleanable/shreds/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
if(power > EXPLOSION_POWER_ERASE_SHREDS)
|
||||
qdel(src)
|
||||
return power // no block
|
||||
|
||||
/obj/effect/decal/cleanable/shreds/Initialize()
|
||||
pixel_x = rand(-10, 10)
|
||||
pixel_y = rand(-10, 10)
|
||||
|
||||
@@ -309,6 +309,10 @@
|
||||
|
||||
/obj/structure/foamedmetal/resin/Initialize()
|
||||
. = ..()
|
||||
neutralize_air()
|
||||
addtimer(CALLBACK(src, .proc/neutralize_air), 5) // yeah this sucks, maybe when auxmos is out
|
||||
|
||||
/obj/structure/foamedmetal/resin/proc/neutralize_air()
|
||||
if(isopenturf(loc))
|
||||
var/turf/open/O = loc
|
||||
O.ClearWet()
|
||||
@@ -337,6 +341,9 @@
|
||||
return TRUE
|
||||
. = ..()
|
||||
|
||||
/obj/structure/foamedmetal/resin/BlockSuperconductivity()
|
||||
return TRUE
|
||||
|
||||
#undef ALUMINUM_FOAM
|
||||
#undef IRON_FOAM
|
||||
#undef RESIN_FOAM
|
||||
|
||||
@@ -378,6 +378,12 @@
|
||||
icon_state = "shieldsparkles"
|
||||
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
|
||||
name = "heart"
|
||||
icon = 'icons/mob/animal.dmi'
|
||||
@@ -535,3 +541,7 @@
|
||||
/obj/effect/temp_visual/slime_puddle/reverse
|
||||
icon_state = "from_puddle"
|
||||
duration = 7
|
||||
|
||||
/obj/effect/temp_visual/gib_animation
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
duration = 15
|
||||
|
||||
@@ -248,6 +248,14 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
loc = null
|
||||
loc = T
|
||||
|
||||
/obj/item/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
. = ..()
|
||||
if(!anchored)
|
||||
var/throw_dist = round(rand(3, max(3, 2.5 * sqrt(power))), 1)
|
||||
throw_speed = EXPLOSION_THROW_SPEED
|
||||
var/turf/target = get_ranged_target_turf(src, dir, throw_dist)
|
||||
throw_at(target, throw_dist, EXPLOSION_THROW_SPEED)
|
||||
|
||||
/obj/item/examine(mob/user) //This might be spammy. Remove?
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
to_chat(user, "<span class='notice'>You need to get closer!</span>")
|
||||
return
|
||||
if(use_paint(user) && isturf(F))
|
||||
F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, turn(stored_dir, -dir2angle(F.dir)), CLEAN_STRONG, color, null, null, alpha)
|
||||
F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_STRONG, color, null, null, alpha)
|
||||
|
||||
/obj/item/airlock_painter/decal/attack_self(mob/user)
|
||||
if((ink) && (ink.charges >= 1))
|
||||
@@ -180,6 +180,11 @@
|
||||
stored_decal_total = "[stored_decal][yellow_fix][stored_color]"
|
||||
return
|
||||
|
||||
/obj/item/airlock_painter/decal/ui_assets(mob/user)
|
||||
return list(
|
||||
get_asset_datum(/datum/asset/spritesheet/decals)
|
||||
)
|
||||
|
||||
/obj/item/airlock_painter/decal/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
@@ -189,6 +194,7 @@
|
||||
/obj/item/airlock_painter/decal/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["decal_direction"] = stored_dir
|
||||
data["decal_dir_text"] = dir2text(stored_dir)
|
||||
data["decal_color"] = stored_color
|
||||
data["decal_style"] = stored_decal
|
||||
data["decal_list"] = list()
|
||||
|
||||
@@ -553,6 +553,9 @@
|
||||
/obj/item/card/id/syndicate/locked_banking
|
||||
bank_support = ID_LOCKED_BANK_ACCOUNT
|
||||
|
||||
/obj/item/card/id/pirate
|
||||
access = list(ACCESS_SYNDICATE)
|
||||
|
||||
/obj/item/card/id/captains_spare
|
||||
name = "captain's spare ID"
|
||||
desc = "The spare ID of the High Lord himself."
|
||||
|
||||
@@ -75,18 +75,3 @@
|
||||
desc = "A chromosome that reduces action based mutation cooldowns by by 50%."
|
||||
icon_state = "energy"
|
||||
energy_coeff = 0.5
|
||||
|
||||
/obj/item/chromosome/reinforcer
|
||||
name = "reinforcement chromosome"
|
||||
desc = "A chromosome that renders mutations immune to mutadone."
|
||||
icon_state = "reinforcer"
|
||||
weight = 3
|
||||
|
||||
/obj/item/chromosome/reinforcer/can_apply(datum/mutation/human/HM)
|
||||
if(!HM || !(HM.can_chromosome == CHROMOSOME_NONE))
|
||||
return FALSE
|
||||
return !HM.mutadone_proof
|
||||
|
||||
/obj/item/chromosome/reinforcer/apply(datum/mutation/human/HM)
|
||||
HM.mutadone_proof = TRUE
|
||||
..()
|
||||
|
||||
@@ -649,6 +649,9 @@
|
||||
pre_noise = TRUE
|
||||
post_noise = FALSE
|
||||
|
||||
var/stun_delay = 0 // how long it takes for you to be able to stun someone with the spraycan again
|
||||
var/last_stun_time = 0
|
||||
|
||||
/obj/item/toy/crayon/spraycan/isValidSurface(surface)
|
||||
return (istype(surface, /turf/open/floor) || istype(surface, /turf/closed/wall))
|
||||
|
||||
@@ -716,7 +719,8 @@
|
||||
if(C.client)
|
||||
C.blur_eyes(3)
|
||||
C.blind_eyes(1)
|
||||
if(C.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS.
|
||||
if(C.get_eye_protection() <= 0 && (last_stun_time + stun_delay) <= world.time) // no eye protection? ARGH IT BURNS.
|
||||
last_stun_time = world.time
|
||||
C.confused = max(C.confused, 3)
|
||||
C.DefaultCombatKnockdown(60)
|
||||
if(ishuman(C) && actually_paints)
|
||||
@@ -771,6 +775,7 @@
|
||||
name = "cyborg spraycan"
|
||||
desc = "A metallic container containing shiny synthesised paint."
|
||||
charges = -1
|
||||
stun_delay = 5 SECONDS
|
||||
|
||||
/obj/item/toy/crayon/spraycan/borg/draw_on(atom/target,mob/user,proximity, params)
|
||||
var/diff = ..()
|
||||
|
||||
@@ -77,8 +77,11 @@
|
||||
return
|
||||
if(!iscarbon(target))
|
||||
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
|
||||
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
|
||||
if(target.buckled)
|
||||
to_chat(user, "<span class='warning'>The user is buckled and can not be put into your [src].</span>")
|
||||
|
||||
@@ -381,8 +381,8 @@ GENETICS SCANNER
|
||||
else if (S.mutantstomach != initial(S.mutantstomach))
|
||||
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'>Base 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: [H.spec_trait_examine_font()][S.name]</font></span>\n"
|
||||
if(mutant)
|
||||
msg += "\t<span class='info'>Subject has mutations present.</span>\n"
|
||||
msg += "\t<span class='info'>Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)</span>\n"
|
||||
|
||||
@@ -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>"))
|
||||
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
|
||||
name = "ritual knife"
|
||||
desc = "The unearthly energies that once powered this blade are now dormant."
|
||||
@@ -248,6 +284,24 @@
|
||||
/obj/item/kitchen/rollingpin/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<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
|
||||
|
||||
/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 */
|
||||
|
||||
/obj/item/kitchen/knife/scimitar
|
||||
|
||||
@@ -135,8 +135,8 @@
|
||||
/obj/item/organ/cyberimp/arm/toolset,
|
||||
/obj/item/organ/cyberimp/arm/surgery,
|
||||
/obj/item/organ/cyberimp/chest/thrusters,
|
||||
/obj/item/organ/lungs/cybernetic,
|
||||
/obj/item/organ/liver/cybernetic) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
|
||||
/obj/item/organ/lungs/cybernetic/tier3,
|
||||
/obj/item/organ/liver/cybernetic/tier3) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
|
||||
for(var/V in templist)
|
||||
var/atom/A = V
|
||||
augment_list[initial(A.name)] = A
|
||||
|
||||
@@ -383,7 +383,7 @@
|
||||
. = ..()
|
||||
|
||||
/obj/item/stack/medical/mesh/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
if(!is_open & user.get_inactive_held_item() == src)
|
||||
if(!is_open && (user.get_inactive_held_item() == src))
|
||||
to_chat(user, "<span class='warning'>You need to open [src] first.</span>")
|
||||
return
|
||||
. = ..()
|
||||
|
||||
@@ -248,6 +248,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
|
||||
null, \
|
||||
new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \
|
||||
new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
|
||||
new/datum/stack_recipe("unrolling pin", /obj/item/kitchen/unrollingpin, 2, time = 30), \
|
||||
new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \
|
||||
new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\
|
||||
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
|
||||
@@ -592,7 +593,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
|
||||
return
|
||||
var/turf/T = get_turf(user) //we may have moved. adjust as needed...
|
||||
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>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -367,7 +367,7 @@
|
||||
/obj/item/storage/fancy/cigarettes/derringer/AltClick(mob/living/carbon/user)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
return
|
||||
var/obj/item/W = (locate(/obj/item/ammo_casing/a357) in contents) || (locate(/obj/item/clothing/mask/cigarette) in contents) || locate(/obj/item/ammo_casing/g4570) //Easy access smokes and bullets
|
||||
var/obj/item/W = (locate(/obj/item/ammo_casing/a357) in contents) || (locate(/obj/item/clothing/mask/cigarette) in contents) ||(locate(/obj/item/gun/ballistic/derringer) in contents) || (locate(/obj/item/ammo_casing/c38) in contents) || locate(/obj/item/ammo_casing/g4570) in contents//Easy access smokes and bullets
|
||||
if(W && contents.len > 0)
|
||||
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user)
|
||||
user.put_in_hands(W)
|
||||
@@ -382,6 +382,7 @@
|
||||
new /obj/item/ammo_casing/a357(src)
|
||||
new /obj/item/ammo_casing/a357(src)
|
||||
new /obj/item/ammo_casing/a357(src)
|
||||
new /obj/item/ammo_casing/a357(src)
|
||||
new /obj/item/clothing/mask/cigarette/syndicate(src)
|
||||
|
||||
//For traitors with luck/class
|
||||
@@ -404,6 +405,7 @@
|
||||
new /obj/item/ammo_casing/g4570(src)
|
||||
new /obj/item/ammo_casing/g4570(src)
|
||||
new /obj/item/ammo_casing/g4570(src)
|
||||
new /obj/item/ammo_casing/g4570(src)
|
||||
new /obj/item/clothing/mask/cigarette/xeno(src)
|
||||
|
||||
//For Cargomen, looking for a good deal on arms, with no quarrels as to where they're from.
|
||||
@@ -419,6 +421,7 @@
|
||||
new /obj/item/ammo_casing/c38/lethal(src)
|
||||
new /obj/item/ammo_casing/c38/lethal(src)
|
||||
new /obj/item/ammo_casing/c38/lethal(src)
|
||||
new /obj/item/ammo_casing/c38/lethal(src)
|
||||
new /obj/item/clothing/mask/cigarette/shadyjims (src)
|
||||
/////////////
|
||||
//CIGAR BOX//
|
||||
|
||||
@@ -71,6 +71,19 @@
|
||||
if(3)
|
||||
take_damage(rand(10, 90), BRUTE, "bomb", 0)
|
||||
|
||||
/obj/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
if(resistance_flags & INDESTRUCTIBLE)
|
||||
return power
|
||||
. = ..()
|
||||
if(explosion.source == src)
|
||||
obj_integrity = 0
|
||||
qdel(src)
|
||||
return
|
||||
take_damage(wave_explosion_damage(power, explosion), BRUTE, "bomb", 0)
|
||||
|
||||
/obj/proc/wave_explosion_damage(power, datum/wave_explosion/explosion)
|
||||
return (explosion_flags & EXPLOSION_FLAG_HARD_OBSTACLE)? EXPLOSION_POWER_STANDARD_SCALE_HARD_OBSTACLE_DAMAGE(power, explosion.hard_obstacle_mod) : EXPLOSION_POWER_STANDARD_SCALE_OBJECT_DAMAGE(power, explosion.object_damage_mod)
|
||||
|
||||
/obj/bullet_act(obj/item/projectile/P)
|
||||
. = ..()
|
||||
playsound(src, P.hitsound, 50, 1)
|
||||
|
||||
@@ -56,6 +56,11 @@
|
||||
name = "gear crate"
|
||||
icon_state = "secgearcrate"
|
||||
|
||||
/obj/structure/closet/crate/secure/soviet
|
||||
desc = "A crate, purportedly from Space Russia."
|
||||
name = "soviet crate"
|
||||
icon_state = "sovietcrate"
|
||||
|
||||
/obj/structure/closet/crate/secure/hydroponics
|
||||
desc = "A crate with a lock on it, painted in the scheme of the station's botanists."
|
||||
name = "secure hydroponics crate"
|
||||
|
||||
@@ -73,3 +73,15 @@
|
||||
name = "wumborian fugu den"
|
||||
desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?"
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu)
|
||||
|
||||
/obj/structure/spawner/clown
|
||||
name = "Laughing Larry"
|
||||
desc = "A laughing, jovial figure. Something seems stuck in his throat."
|
||||
icon_state = "clownbeacon"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
max_integrity = 200
|
||||
max_mobs = 15
|
||||
spawn_time = 150
|
||||
mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob)
|
||||
spawn_text = "climbs out of"
|
||||
faction = list("clown")
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
to_chat(user, "<span class='danger'>Throwing [pushed_mob] onto the table might hurt them!</span>")
|
||||
return
|
||||
var/added_passtable = FALSE
|
||||
if(!pushed_mob.pass_flags & PASSTABLE)
|
||||
if(!(pushed_mob.pass_flags & PASSTABLE))
|
||||
added_passtable = TRUE
|
||||
pushed_mob.pass_flags |= PASSTABLE
|
||||
pushed_mob.Move(src.loc)
|
||||
|
||||
@@ -21,6 +21,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
var/ini_dir = null
|
||||
var/state = WINDOW_OUT_OF_FRAME
|
||||
var/reinf = FALSE
|
||||
var/extra_reinforced = FALSE
|
||||
var/heat_resistance = 800
|
||||
var/decon_speed = 30
|
||||
var/wtype = "glass"
|
||||
@@ -43,6 +44,10 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
attack_hand_speed = CLICK_CD_MELEE
|
||||
attack_hand_is_action = TRUE
|
||||
|
||||
explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE
|
||||
wave_explosion_block = EXPLOSION_BLOCK_WINDOW
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_WINDOW
|
||||
|
||||
/// Electrochromatic status
|
||||
var/electrochromatic_status = NOT_ELECTROCHROMATIC
|
||||
/// Electrochromatic ID. Set the first character to ! to replace with a SSmapping generated pseudorandom obfuscated ID for mapping purposes.
|
||||
@@ -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>"
|
||||
else if(!anchored)
|
||||
. += "<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
|
||||
if(anchored)
|
||||
. += "<span class='notice'>The window is <b>screwed</b> to the floor.</span>"
|
||||
@@ -71,8 +90,13 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
. = ..()
|
||||
if(direct)
|
||||
setDir(direct)
|
||||
if(reinf && anchored)
|
||||
|
||||
if(extra_reinforced && anchored)
|
||||
state = PRWINDOW_SECURE
|
||||
|
||||
else if(reinf && anchored)
|
||||
state = WINDOW_SCREWED_TO_FRAME
|
||||
|
||||
|
||||
if(mapload && electrochromatic_id && electrochromatic_id[1] == "!")
|
||||
electrochromatic_id = SSmapping.get_obfuscated_id(electrochromatic_id)
|
||||
@@ -111,6 +135,9 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/window/wave_explosion_damage(power, datum/wave_explosion/explosion)
|
||||
return EXPLOSION_POWER_STANDARD_SCALE_WINDOW_DAMAGE(power, explosion.window_shatter_mod)
|
||||
|
||||
/obj/structure/window/narsie_act()
|
||||
add_atom_colour(NARSIE_WINDOW_COLOUR, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
@@ -223,29 +250,26 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
make_electrochromatic(K.id)
|
||||
qdel(K)
|
||||
|
||||
if(!(flags_1&NODECONSTRUCT_1))
|
||||
if(!(flags_1 & NODECONSTRUCT_1) && !(state >= PRWINDOW_FRAME_BOLTED))
|
||||
if(I.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
I.play_tool_sound(src, 75)
|
||||
if(reinf)
|
||||
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>")
|
||||
if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
|
||||
if(state == WINDOW_SCREWED_TO_FRAME || state == WINDOW_IN_FRAME && anchored)
|
||||
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(extra_reinforced && state == WINDOW_IN_FRAME)
|
||||
state = PRWINDOW_SECURE
|
||||
else
|
||||
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>")
|
||||
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>")
|
||||
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)))
|
||||
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)
|
||||
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)))
|
||||
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
|
||||
|
||||
|
||||
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>")
|
||||
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)))
|
||||
@@ -263,8 +287,67 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
to_chat(user, "<span class='notice'>You successfully disassemble [src].</span>")
|
||||
qdel(src)
|
||||
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 ..()
|
||||
|
||||
/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)
|
||||
..()
|
||||
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)
|
||||
max_integrity = 50
|
||||
explosion_block = 1
|
||||
wave_explosion_block = EXPLOSION_BLOCK_REINFORCED_WINDOW
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_REINFORCED_WINDOW
|
||||
glass_type = /obj/item/stack/sheet/rglass
|
||||
rad_insulation = RAD_HEAVY_INSULATION
|
||||
ricochet_chance_mod = 0.8
|
||||
@@ -545,6 +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)
|
||||
max_integrity = 150
|
||||
explosion_block = 1
|
||||
wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_BOROSILICATE_WINDOW
|
||||
glass_type = /obj/item/stack/sheet/plasmaglass
|
||||
cleanable_type = /obj/effect/decal/cleanable/glass/plasma
|
||||
rad_insulation = RAD_NO_INSULATION
|
||||
@@ -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."
|
||||
icon_state = "plasmarwindow"
|
||||
reinf = TRUE
|
||||
extra_reinforced = TRUE
|
||||
heat_resistance = 50000
|
||||
armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100)
|
||||
max_integrity = 500
|
||||
explosion_block = 2
|
||||
wave_explosion_block = EXPLOSION_BLOCK_EXTREME
|
||||
wave_explosion_multiply = EXPLOSION_BLOCK_EXTREME
|
||||
glass_type = /obj/item/stack/sheet/plasmarglass
|
||||
|
||||
/obj/structure/window/plasma/reinforced/spawner/east
|
||||
@@ -629,6 +719,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
icon = 'icons/obj/smooth_structures/rplasma_window.dmi'
|
||||
icon_state = "rplasmawindow"
|
||||
dir = FULLTILE_WINDOW_DIR
|
||||
state = PRWINDOW_SECURE
|
||||
max_integrity = 1000
|
||||
fulltile = TRUE
|
||||
flags_1 = PREVENT_CLICK_UNDER_1
|
||||
@@ -713,6 +804,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
fulltile = TRUE
|
||||
flags_1 = PREVENT_CLICK_UNDER_1
|
||||
reinf = TRUE
|
||||
extra_reinforced = TRUE
|
||||
heat_resistance = 1600
|
||||
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100)
|
||||
smooth = SMOOTH_TRUE
|
||||
@@ -742,7 +834,10 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
max_integrity = 80
|
||||
armor = list("melee" = 60, "bullet" = 25, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100)
|
||||
explosion_block = 2 //fancy AND hard to destroy. the most useful combination.
|
||||
wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_BOROSILICATE_WINDOW
|
||||
decon_speed = 40
|
||||
extra_reinforced = TRUE
|
||||
glass_type = /obj/item/stack/tile/brass
|
||||
glass_amount = 1
|
||||
reinf = FALSE
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
blocks_air = 1
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
rad_insulation = RAD_MEDIUM_INSULATION
|
||||
wave_explosion_block = 10
|
||||
wave_explosion_multiply = 0.75
|
||||
|
||||
/turf/closed/Initialize()
|
||||
. = ..()
|
||||
@@ -28,6 +30,7 @@
|
||||
name = "wall"
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
explosion_block = 50
|
||||
wave_explosion_block = INFINITY
|
||||
|
||||
/turf/closed/indestructible/rust_heretic_act()
|
||||
return
|
||||
|
||||
@@ -12,6 +12,19 @@
|
||||
clawfootstep = FOOTSTEP_HARD_CLAW
|
||||
heavyfootstep = FOOTSTEP_GENERIC_HEAVY
|
||||
|
||||
/// Minimum explosion power to break tile
|
||||
var/explosion_power_break_tile = EXPLOSION_POWER_FLOOR_TILE_BREAK
|
||||
/// Minimum explosion power to break turf
|
||||
var/explosion_power_break_turf = EXPLOSION_POWER_FLOOR_TURF_BREAK
|
||||
//// Minimum explosion power to scrape away the floor
|
||||
var/explosion_power_turf_scrape = EXPLOSION_POWER_FLOOR_TURF_SCRAPE
|
||||
//// Shielded turfs are completely protected from anything under this
|
||||
var/explosion_power_protect_shielded = EXPLOSION_POWER_FLOOR_SHIELDED_IMMUNITY
|
||||
/// Starting from here, there's a chance for this to break
|
||||
var/explosion_power_minimum_chance_break = EXPLOSION_POWER_FLOOR_MINIMUM_TURF_BREAK
|
||||
/// Starting from here, +20% chance to break turf.
|
||||
var/explosion_power_break_turf_bonus = EXPLOSION_POWER_FLOOR_TURF_BREAK_BONUS
|
||||
|
||||
var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default
|
||||
var/icon_plating = "plating"
|
||||
thermal_conductivity = 0.004
|
||||
@@ -98,6 +111,48 @@
|
||||
src.break_tile()
|
||||
src.hotspot_expose(1000,CELL_VOLUME)
|
||||
|
||||
/turf/open/floor/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
var/shielded = is_shielded()
|
||||
. = ..()
|
||||
if(shielded)
|
||||
if(power < explosion_power_protect_shielded)
|
||||
return
|
||||
else
|
||||
power -= explosion_power_protect_shielded
|
||||
hotspot_expose(1000, CELL_VOLUME)
|
||||
if(power < explosion_power_break_tile)
|
||||
return
|
||||
if(power < explosion_power_minimum_chance_break)
|
||||
if(prob(33 + ((explosion_power_break_turf - power) / (explosion_power_break_turf - explosion_power_break_tile))))
|
||||
break_tile()
|
||||
return
|
||||
if((power < explosion_power_turf_scrape) && ((power >= explosion_power_break_turf) || prob((1 - ((explosion_power_break_turf - power) / (explosion_power_break_turf - explosion_power_minimum_chance_break))) * 100 + ((power > explosion_power_break_turf_bonus)? 20 : 0))))
|
||||
switch(pick(1, 2;75, 3))
|
||||
if(1)
|
||||
if(!length(baseturfs) || !ispath(baseturfs[baseturfs.len-1], /turf/open/floor))
|
||||
ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
ReplaceWithLattice()
|
||||
else
|
||||
ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR)
|
||||
if(prob(33))
|
||||
new /obj/item/stack/sheet/metal(src)
|
||||
return
|
||||
if(2)
|
||||
ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR)
|
||||
return
|
||||
if(3)
|
||||
if(prob(80))
|
||||
ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
return
|
||||
else
|
||||
break_tile()
|
||||
hotspot_expose(1000,CELL_VOLUME)
|
||||
if(prob(33))
|
||||
new /obj/item/stack/sheet/metal(src)
|
||||
if(power >= explosion_power_turf_scrape)
|
||||
ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR)
|
||||
return
|
||||
|
||||
/turf/open/floor/is_shielded()
|
||||
for(var/obj/structure/A in contents)
|
||||
if(A.level == 3)
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
sheet_amount = 1
|
||||
girder_type = /obj/structure/girder/reinforced
|
||||
explosion_block = 2
|
||||
wave_explosion_block = EXPLOSION_BLOCK_BLAST_PROOF
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_BLAST_PROOF
|
||||
explosion_power_to_scrape = EXPLOSION_POWER_RWALL_SCRAPE
|
||||
explosion_power_to_dismantle = EXPLOSION_POWER_RWALL_DISMANTLE
|
||||
explosion_power_minimum_chance_dismantle = EXPLOSION_POWER_RWALL_MINIMUM_DISMANTLE
|
||||
rad_insulation = RAD_HEAVY_INSULATION
|
||||
|
||||
/turf/closed/wall/r_wall/deconstruction_hints(mob/user)
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
icon = 'icons/turf/walls/wall.dmi'
|
||||
icon_state = "wall"
|
||||
explosion_block = 1
|
||||
wave_explosion_block = EXPLOSION_BLOCK_WALL
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_WALL
|
||||
flags_1 = DEFAULT_RICOCHET_1
|
||||
flags_ricochet = RICOCHET_HARD
|
||||
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
|
||||
@@ -15,6 +17,14 @@
|
||||
|
||||
baseturfs = /turf/open/floor/plating
|
||||
|
||||
explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE
|
||||
/// Explosion power to disintegrate the wall
|
||||
var/explosion_power_to_scrape = EXPLOSION_POWER_WALL_SCRAPE
|
||||
/// Explosion power to dismantle the wall
|
||||
var/explosion_power_to_dismantle = EXPLOSION_POWER_WALL_DISMANTLE
|
||||
/// Explosion power to potentially dismantle the wall
|
||||
var/explosion_power_minimum_chance_dismantle = EXPLOSION_POWER_WALL_MINIMUM_DISMANTLE
|
||||
|
||||
var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through.
|
||||
var/slicing_duration = 100 //default time taken to slice the wall
|
||||
var/sheet_type = /obj/item/stack/sheet/metal
|
||||
@@ -91,6 +101,13 @@
|
||||
if(!density)
|
||||
..()
|
||||
|
||||
/turf/closed/wall/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
. = ..()
|
||||
var/resultant_power = power * explosion.wall_destroy_mod
|
||||
if(resultant_power >= explosion_power_to_scrape)
|
||||
ScrapeAway()
|
||||
else if((resultant_power >= explosion_power_to_dismantle) || ((resultant_power >= explosion_power_minimum_chance_dismantle) && prob(((resultant_power - explosion_power_minimum_chance_dismantle) / (explosion_power_to_dismantle - explosion_power_minimum_chance_dismantle)) * 100)))
|
||||
dismantle_wall(prob((resultant_power - explosion_power_to_dismantle)/(explosion_power_to_scrape - explosion_power_to_dismantle)), TRUE)
|
||||
|
||||
/turf/closed/wall/blob_act(obj/structure/blob/B)
|
||||
if(prob(50))
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
temperature = TCMB
|
||||
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
|
||||
heat_capacity = 700000
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_SPACE
|
||||
wave_explosion_block = EXPLOSION_BLOCK_SPACE
|
||||
|
||||
var/destination_z
|
||||
var/destination_x
|
||||
|
||||
@@ -462,6 +462,24 @@ GLOBAL_LIST_EMPTY(station_turfs)
|
||||
A.ex_act(severity, target)
|
||||
CHECK_TICK
|
||||
|
||||
/turf/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
. = ..()
|
||||
var/affecting_level
|
||||
if(is_shielded())
|
||||
affecting_level = 3
|
||||
else if(intact)
|
||||
affecting_level = 2
|
||||
else
|
||||
affecting_level = 1
|
||||
var/atom/A
|
||||
for(var/i in contents)
|
||||
if(. <= 0)
|
||||
return 0
|
||||
A = i
|
||||
if(!QDELETED(A) && A.level >= affecting_level)
|
||||
. = A.wave_explode(., explosion, dir)
|
||||
maptext = "[.]"
|
||||
|
||||
/turf/narsie_act(force, ignore_mobs, probability = 20)
|
||||
. = (prob(probability) || force)
|
||||
for(var/I in src)
|
||||
|
||||
@@ -96,6 +96,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
|
||||
/client/proc/cmd_select_equipment,
|
||||
/client/proc/cmd_admin_gib_self,
|
||||
/client/proc/drop_bomb,
|
||||
/client/proc/drop_wave_explosion,
|
||||
/client/proc/set_dynex_scale,
|
||||
/client/proc/drop_dynex_bomb,
|
||||
/client/proc/cinematic,
|
||||
@@ -115,6 +116,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
|
||||
/client/proc/show_tip,
|
||||
/client/proc/smite,
|
||||
/client/proc/admin_away,
|
||||
/client/proc/spawn_floor_cluwne,
|
||||
/client/proc/cmd_admin_toggle_fov, //CIT CHANGE - FOV
|
||||
/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].")
|
||||
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()
|
||||
set category = "Admin.Fun"
|
||||
set name = "Drop DynEx Bomb"
|
||||
|
||||
@@ -104,7 +104,7 @@ GLOBAL_VAR(antag_prototypes)
|
||||
var/datum/component/activity/activity = current.GetComponent(/datum/component/activity)
|
||||
if(activity)
|
||||
out += "Activity level: [activity.activity_level]<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()
|
||||
if(length(special_statuses))
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
H.dna.features["horns"] = pick(GLOB.horns_list)
|
||||
H.dna.features["frills"] = pick(GLOB.frills_list)
|
||||
H.dna.features["spines"] = pick(GLOB.spines_list)
|
||||
H.dna.features["body_markings"] = pick(GLOB.body_markings_list)
|
||||
H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list)
|
||||
H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list)
|
||||
H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list)
|
||||
|
||||
@@ -238,3 +238,9 @@
|
||||
/proc/__nan()
|
||||
var/list/L = json_decode("{\"value\":NaN}")
|
||||
return L["value"]
|
||||
|
||||
/**
|
||||
* Wrapper to return a copy of contents, as SDQL2 can't tell an internal list from a normal list.
|
||||
*/
|
||||
/atom/proc/_contents()
|
||||
return contents.Copy()
|
||||
|
||||
@@ -571,6 +571,26 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
message_admins("[key_name_admin(src)] has created a command report")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_admin_make_priority_announcement()
|
||||
set category = "Admin.Events"
|
||||
set name = "Make Priority Announcement"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/input = input(usr, "Enter a priority announcement. Ensure it makes sense IC.", "What?", "") as message|null
|
||||
if(!input)
|
||||
return
|
||||
|
||||
var/title = input(src, "What should the title be?", "What?","") as text|null
|
||||
|
||||
var/special_name = input(src, "Who is making the announcement?", "Who?", "") as text|null
|
||||
priority_announce(input, title, sender_override = special_name)
|
||||
|
||||
log_admin("[key_name(src)] has sent a priority announcement: [input]")
|
||||
message_admins("[key_name_admin(src)] has made a priority announcement")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Priority Announcement") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_change_command_name()
|
||||
set category = "Admin.Events"
|
||||
set name = "Change Command Name"
|
||||
@@ -1313,9 +1333,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
ADMIN_PUNISHMENT_SHOES,
|
||||
ADMIN_PUNISHMENT_PICKLE,
|
||||
ADMIN_PUNISHMENT_FRY,
|
||||
ADMIN_PUNISHMENT_CRACK,
|
||||
ADMIN_PUNISHMENT_BLEED,
|
||||
ADMIN_PUNISHMENT_SCARIFY)
|
||||
ADMIN_PUNISHMENT_CRACK,
|
||||
ADMIN_PUNISHMENT_BLEED,
|
||||
ADMIN_PUNISHMENT_SCARIFY,
|
||||
ADMIN_PUNISHMENT_CLUWNE)
|
||||
|
||||
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>")
|
||||
return
|
||||
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)
|
||||
|
||||
@@ -1671,3 +1697,23 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(!source)
|
||||
return
|
||||
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)]
|
||||
if(istype(M))
|
||||
M.name = "[name] Training"
|
||||
owner.AddComponent(/datum/component/activity)
|
||||
owner.current.AddComponent(/datum/component/activity)
|
||||
SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src)
|
||||
|
||||
/datum/antagonist/proc/is_banned(mob/M)
|
||||
@@ -164,14 +164,12 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
/datum/antagonist/proc/remove_blacklisted_quirks()
|
||||
var/mob/living/L = owner.current
|
||||
if(istype(L))
|
||||
var/list/my_quirks = L.client?.prefs.all_quirks.Copy()
|
||||
SSquirks.filter_quirks(my_quirks,blacklisted_quirks)
|
||||
for(var/q in L.roundstart_quirks)
|
||||
var/datum/quirk/Q = q
|
||||
if(!(SSquirks.quirk_name_by_path(Q.type) in my_quirks))
|
||||
if(Q.type in blacklisted_quirks)
|
||||
if(initial(Q.antag_removal_text))
|
||||
to_chat(L, "<span class='boldannounce'>[initial(Q.antag_removal_text)]</span>")
|
||||
L.remove_quirk(Q.type)
|
||||
qdel(Q)
|
||||
|
||||
//Returns the team antagonist belongs to if any.
|
||||
/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_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
|
||||
name = "hewn bone gauntlets"
|
||||
icon_state = "ling_gauntlets"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
/datum/clockwork_scripture/create_object/stargazer/check_special_requirements()
|
||||
var/area/A = get_area(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>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
return FALSE
|
||||
var/area/A = get_area(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>")
|
||||
return FALSE
|
||||
if(GLOB.clockwork_gateway_activated)
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
break
|
||||
if(has_starlight && anchored)
|
||||
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
|
||||
if(old_status != has_starlight)
|
||||
if(has_starlight)
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
skewee.visible_message("<span class='warning'>[skewee] painfully slides back down [src].</span>")
|
||||
if(skewee.stat >= UNCONSCIOUS)
|
||||
return //by ratvar, no more spamming my deadchat, holy fuck
|
||||
skewee.say("Oof, ouch owwie!!", forced = "fail brass skewer removal")
|
||||
skewee.emote("pain")
|
||||
return
|
||||
skewee.visible_message("<span class='danger'>[skewee] comes free of [src] with a squelching pop!</span>", \
|
||||
"<span class='boldannounce'>You come free of [src]!</span>")
|
||||
|
||||
@@ -419,7 +419,7 @@
|
||||
var/sanity = 0
|
||||
while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100)
|
||||
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
|
||||
sanity++
|
||||
update_explanation_text()
|
||||
|
||||
@@ -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>")
|
||||
return FALSE
|
||||
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>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
var/list/lore = list()
|
||||
|
||||
data["charges"] = charge
|
||||
data["total_sacs"] = cultie.total_sacrifices
|
||||
|
||||
for(var/X in to_know)
|
||||
lore = list()
|
||||
@@ -96,7 +97,11 @@
|
||||
lore["type"] = EK.type
|
||||
lore["name"] = EK.name
|
||||
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["state"] = "Research"
|
||||
lore["flavour"] = EK.gain_text
|
||||
@@ -108,6 +113,7 @@
|
||||
var/datum/eldritch_knowledge/EK = known[X]
|
||||
lore["name"] = EK.name
|
||||
lore["cost"] = EK.cost
|
||||
lore["sacs"] = EK.sacs_needed
|
||||
lore["disabled"] = TRUE
|
||||
lore["path"] = EK.route
|
||||
lore["state"] = "Researched"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user