Merge remote-tracking branch 'citadel/master' into backend_sync
This commit is contained in:
@@ -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
|
||||
|
||||
+2269
-1130
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
+1
-13
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
@@ -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
-1
@@ -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>"
|
||||
|
||||
@@ -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?
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -165,6 +165,25 @@
|
||||
new /obj/effect/reality_smash(chosen_location)
|
||||
ReworkNetwork()
|
||||
|
||||
/**
|
||||
*CIT CHANGE
|
||||
*
|
||||
*Creates a singular reality smash
|
||||
*Credit to slimelust
|
||||
*/
|
||||
|
||||
/datum/reality_smash_tracker/proc/RandomSpawnSmash(var/deferred = FALSE)
|
||||
var/turf/chosen_location = get_safe_random_station_turf()
|
||||
//we also dont want them close to each other, at least 1 tile of separation
|
||||
var/obj/effect/reality_smash/what_if_i_have_one = locate() in range(1, chosen_location)
|
||||
var/obj/effect/broken_illusion/what_if_i_had_one_but_got_used = locate() in range(1, chosen_location)
|
||||
var/tries = 10
|
||||
while((what_if_i_have_one || what_if_i_had_one_but_got_used) && tries-- > 0)
|
||||
chosen_location = get_safe_random_station_turf()
|
||||
new /obj/effect/reality_smash(chosen_location)
|
||||
if(!deferred)
|
||||
ReworkNetwork()
|
||||
|
||||
/**
|
||||
* Adds a mind to the list of people that can see the reality smashes
|
||||
*
|
||||
@@ -200,15 +219,23 @@
|
||||
/obj/effect/broken_illusion/Initialize()
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src,.proc/show_presence),15 SECONDS)
|
||||
addtimer(CALLBACK(src,.proc/remove_presence),195 SECONDS)
|
||||
|
||||
var/image/I = image('icons/effects/eldritch.dmi',src,null,OBJ_LAYER)
|
||||
I.override = TRUE
|
||||
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "pierced_reality", I)
|
||||
|
||||
/obj/effect/broken_illusion/Destroy()
|
||||
GLOB.reality_smash_track.RandomSpawnSmash()
|
||||
return ..()
|
||||
|
||||
///Makes this obj appear out of nothing
|
||||
/obj/effect/broken_illusion/proc/show_presence()
|
||||
animate(src,alpha = 255,time = 15 SECONDS)
|
||||
|
||||
/obj/effect/broken_illusion/proc/remove_presence()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/broken_illusion/attack_hand(mob/living/user, list/modifiers)
|
||||
if(!ishuman(user))
|
||||
return ..()
|
||||
|
||||
@@ -44,35 +44,6 @@
|
||||
if(target.stat == DEAD)
|
||||
to_chat(user,"<span class='warning'>[target.real_name] is dead. Bring them onto a transmutation rune!</span>")
|
||||
|
||||
/datum/action/innate/heretic_shatter
|
||||
name = "Shattering Offer"
|
||||
desc = "After a brief delay, you will be granted salvation from a dire situation at the cost of your blade. (Teleports you to a random safe turf on your current z level after a windup, but destroys your blade.)"
|
||||
background_icon_state = "bg_ecult"
|
||||
button_icon_state = "shatter"
|
||||
icon_icon = 'icons/mob/actions/actions_ecult.dmi'
|
||||
check_flags = MOBILITY_HOLD|MOBILITY_MOVE|MOBILITY_USE
|
||||
var/mob/living/carbon/human/holder
|
||||
var/obj/item/melee/sickly_blade/sword
|
||||
|
||||
/datum/action/innate/heretic_shatter/Grant(mob/user, obj/object)
|
||||
sword = object
|
||||
holder = user
|
||||
//i know what im doing
|
||||
return ..()
|
||||
|
||||
/datum/action/innate/heretic_shatter/IsAvailable()
|
||||
if(IS_HERETIC(holder) || IS_HERETIC_MONSTER(holder))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/datum/action/innate/heretic_shatter/Activate()
|
||||
if(do_after(holder,10, target = holder))
|
||||
var/turf/safe_turf = find_safe_turf(zlevels = sword.z, extended_safety_checks = TRUE)
|
||||
do_teleport(holder,safe_turf,forceMove = TRUE,channel=TELEPORT_CHANNEL_MAGIC)
|
||||
to_chat(holder,"<span class='warning'>You feel a gust of energy flow through your body... the Rusted Hills heard your call...</span>")
|
||||
qdel(sword)
|
||||
|
||||
/obj/item/melee/sickly_blade
|
||||
name = "sickly blade"
|
||||
desc = "A sickly green crescent blade, decorated with an ornamental eye. You feel like you're being watched..."
|
||||
@@ -90,11 +61,6 @@
|
||||
throwforce = 10
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "rended")
|
||||
var/datum/action/innate/heretic_shatter/linked_action
|
||||
|
||||
/obj/item/melee/sickly_blade/Initialize()
|
||||
. = ..()
|
||||
linked_action = new(src)
|
||||
|
||||
/obj/item/melee/sickly_blade/attack(mob/living/target, mob/living/user)
|
||||
if(!(IS_HERETIC(user) || IS_HERETIC_MONSTER(user)))
|
||||
@@ -109,13 +75,17 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/sickly_blade/pickup(mob/user)
|
||||
. = ..()
|
||||
linked_action.Grant(user, src)
|
||||
|
||||
/obj/item/melee/sickly_blade/dropped(mob/user, silent)
|
||||
. = ..()
|
||||
linked_action.Remove(user, src)
|
||||
/obj/item/melee/sickly_blade/attack_self(mob/user)
|
||||
var/turf/safe_turf = find_safe_turf(zlevels = z, extended_safety_checks = TRUE)
|
||||
if(IS_HERETIC(user) || IS_HERETIC_MONSTER(user))
|
||||
if(do_teleport(user, safe_turf, forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC))
|
||||
to_chat(user,"<span class='warning'>As you shatter [src], you feel a gust of energy flow through your body. The Rusted Hills heard your call...</span>")
|
||||
else
|
||||
to_chat(user,"<span class='warning'>You shatter [src], but your plea goes unanswered.</span>")
|
||||
else
|
||||
to_chat(user,"<span class='warning'>You shatter [src].</span>")
|
||||
playsound(src, "shatter", 70, TRUE) //copied from the code for smashing a glass sheet onto the ground to turn it into a shard
|
||||
qdel(src)
|
||||
|
||||
/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
. = ..()
|
||||
@@ -130,6 +100,11 @@
|
||||
else
|
||||
eldritch_knowledge_datum.on_ranged_attack_eldritch_blade(target,user,click_parameters)
|
||||
|
||||
/obj/item/melee/sickly_blade/examine(mob/user)
|
||||
. = ..()
|
||||
if(IS_HERETIC(user) || IS_HERETIC_MONSTER(user))
|
||||
. += "<span class='notice'><B>A heretic (or a servant of one) can shatter this blade to teleport to a random, mostly safe location by activating it in-hand.</B></span>"
|
||||
|
||||
/obj/item/melee/sickly_blade/rust
|
||||
name = "rusted blade"
|
||||
desc = "This crescent blade is decrepit, wasting to rust. Yet still it bites, ripping flesh and bone with jagged, rotten teeth."
|
||||
@@ -218,8 +193,8 @@
|
||||
flags_inv = NONE
|
||||
flags_cover = NONE
|
||||
desc = "Black like tar, doesn't reflect any light. Runic symbols line the outside, with each flash you lose comprehension of what you are seeing."
|
||||
item_flags = EXAMINE_SKIP
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
obj_flags = NONE | EXAMINE_SKIP
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/void
|
||||
name = "void cloak"
|
||||
@@ -232,6 +207,7 @@
|
||||
// slightly worse than normal cult robes
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/void_cloak
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/void/ToggleHood()
|
||||
if(!iscarbon(loc))
|
||||
@@ -242,9 +218,10 @@
|
||||
//We need to account for the hood shenanigans, and that way we can make sure items always fit, even if one of the slots is used by the fucking hood.
|
||||
if(suittoggled)
|
||||
to_chat(carbon_user,"<span class='notice'>The light shifts around you making the cloak invisible!</span>")
|
||||
else
|
||||
obj_flags |= EXAMINE_SKIP
|
||||
else if(obj_flags & EXAMINE_SKIP) // ensures that it won't toggle visibility if raising the hood failed
|
||||
to_chat(carbon_user,"<span class='notice'>The kaleidoscope of colours collapses around you, as the cloak shifts to visibility!</span>")
|
||||
item_flags = suittoggled ? EXAMINE_SKIP : ~EXAMINE_SKIP
|
||||
obj_flags ^= EXAMINE_SKIP
|
||||
else
|
||||
to_chat(carbon_user,"<span class='danger'>You can't force the hood onto your head!</span>")
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
var/gain_text = ""
|
||||
///Cost of knowledge in souls
|
||||
var/cost = 0
|
||||
///Required sacrifices to unlock
|
||||
var/sacs_needed = 0
|
||||
///Next knowledge in the research tree
|
||||
var/list/next_knowledge = list()
|
||||
///What knowledge is incompatible with this. This will simply make it impossible to research knowledges that are in banned_knowledge once this gets researched.
|
||||
@@ -230,7 +232,6 @@
|
||||
atoms -= H
|
||||
H.gib()
|
||||
|
||||
|
||||
///////////////
|
||||
///Base lore///
|
||||
///////////////
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
/obj/item/melee/touch_attack/mansus_fist/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
|
||||
if(!proximity_flag | target == user)
|
||||
if(!proximity_flag || (target == user))
|
||||
return
|
||||
playsound(user, 'sound/items/welder.ogg', 75, TRUE)
|
||||
if(ishuman(target))
|
||||
|
||||
@@ -109,10 +109,15 @@
|
||||
gain_text = "When the Glory of the Lantern scorches and sears their skin, nothing will protect them from the ashes."
|
||||
desc = "Fire off five streams of fire from your hand, each setting ablaze targets hit and scorching them upon contact."
|
||||
cost = 2
|
||||
sacs_needed = 3
|
||||
spell_to_add = /obj/effect/proc_holder/spell/pointed/nightwatchers_rite
|
||||
next_knowledge = list(/datum/eldritch_knowledge/final/ash_final)
|
||||
route = PATH_ASH
|
||||
|
||||
/datum/eldritch_knowledge/spell/nightwatchers_rite/on_gain(mob/user)
|
||||
. = ..()
|
||||
priority_announce("Large heat signatures discovered! A swelling fiery horror is coming..", sound = 'sound/misc/notice1.ogg')
|
||||
|
||||
/datum/eldritch_knowledge/ash_blade_upgrade
|
||||
name = "Fiery Blade"
|
||||
gain_text = "Blade in hand, he swung and swung as the ash fell from the skies. His city, his people... all burnt to cinders, and yet life still remained in his charred body."
|
||||
@@ -181,6 +186,7 @@
|
||||
desc = "Bring 3 corpses onto a transmutation rune, you will become immune to fire, the vacuum of space, cold and other enviromental hazards and become overall sturdier to all other damages. You will gain a spell that passively creates ring of fire around you as well ,as you will gain a powerful ability that lets you create a wave of flames all around you."
|
||||
required_atoms = list(/mob/living/carbon/human)
|
||||
cost = 5
|
||||
sacs_needed = 8
|
||||
route = PATH_ASH
|
||||
var/list/trait_list = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE)
|
||||
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
gain_text = "The Uncanny Man, who walks alone in the valley between the worlds... I was able to summon his aid."
|
||||
desc = "You can now summon a Raw Prophet by transmutating a pair of eyes, a left arm and a pool of blood. Raw prophets have increased seeing range, as well as X-Ray vision, but they are very fragile."
|
||||
cost = 1
|
||||
required_atoms = list(/obj/item/organ/eyes,/obj/item/bodypart/l_arm,/obj/item/bodypart/r_arm,/obj/effect/decal/cleanable/blood)
|
||||
required_atoms = list(/obj/item/organ/eyes,/obj/item/bodypart/l_arm,/obj/effect/decal/cleanable/blood)
|
||||
mob_to_summon = /mob/living/simple_animal/hostile/eldritch/raw_prophet
|
||||
next_knowledge = list(/datum/eldritch_knowledge/flesh_blade_upgrade,/datum/eldritch_knowledge/rune_carver,/datum/eldritch_knowledge/curse/paralysis)
|
||||
route = PATH_FLESH
|
||||
@@ -217,6 +217,7 @@
|
||||
desc = "Bring 3 bodies onto a transmutation rune to shed your human form and ascend to untold power."
|
||||
required_atoms = list(/mob/living/carbon/human)
|
||||
cost = 5
|
||||
sacs_needed = 8
|
||||
route = PATH_FLESH
|
||||
|
||||
/datum/eldritch_knowledge/final/flesh_final/on_finished_recipe(mob/living/user, list/atoms, loc)
|
||||
@@ -257,6 +258,11 @@
|
||||
gain_text = "The ignorant mind that inhabits their feeble bodies will crumble when they acknowledge - willingly or not, the truth."
|
||||
desc = "By forcing the knowledge of the Mansus upon my foes, I can show them things that would drive any normal man insane."
|
||||
cost = 2
|
||||
sacs_needed = 3
|
||||
spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/mad_touch
|
||||
next_knowledge = list(/datum/eldritch_knowledge/final/flesh_final)
|
||||
route = PATH_FLESH
|
||||
|
||||
/datum/eldritch_knowledge/spell/touch_of_madness/on_gain(mob/user)
|
||||
. = ..()
|
||||
priority_announce("The stench of rotting flesh fills the air... An approaching abomination has been detected!", sound = 'sound/misc/notice1.ogg')
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/check = FALSE
|
||||
if(ismob(target))
|
||||
var/mob/living/mobster = target
|
||||
if(!mobster.mob_biotypes & MOB_ROBOTIC)
|
||||
if(!(mobster.mob_biotypes & MOB_ROBOTIC))
|
||||
return FALSE
|
||||
else
|
||||
check = TRUE
|
||||
@@ -159,15 +159,21 @@
|
||||
desc = "Applying your knowledge of rust to the human body, a knowledge that could decay your foes from the inside out, resulting in organ failure, vomiting, or eventual death through the peeling of rotting flesh."
|
||||
gain_text = "Rust, decay, it's all the same. All that remains is application."
|
||||
cost = 2
|
||||
sacs_needed = 3
|
||||
spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/grasp_of_decay
|
||||
next_knowledge = list(/datum/eldritch_knowledge/final/rust_final)
|
||||
route = PATH_RUST
|
||||
|
||||
/datum/eldritch_knowledge/spell/grasp_of_decay/on_gain(mob/user)
|
||||
. = ..()
|
||||
priority_announce("A foul wind is blowing... The floor creaks with rust as something sinister approaches!", sound = 'sound/misc/notice1.ogg')
|
||||
|
||||
/datum/eldritch_knowledge/final/rust_final
|
||||
name = "Rustbringer's Oath"
|
||||
desc = "Bring three corpses onto a transmutation rune. After you finish the ritual, rust will now automatically spread from the rune. Your healing on rust is also tripled, while you become more resilient overall."
|
||||
gain_text = "Champion of rust. Corruptor of steel. Fear the dark for the Rustbringer has come! Rusted Hills, CALL MY NAME!"
|
||||
cost = 5
|
||||
sacs_needed = 8
|
||||
required_atoms = list(/mob/living/carbon/human)
|
||||
route = PATH_RUST
|
||||
|
||||
|
||||
@@ -160,15 +160,21 @@
|
||||
gain_text = "This world will be my stage, and nothing will be out of my reach."
|
||||
desc = "Gain the ability to mark a 7x7 area as your domain after a short delay. Creatures in your domain are slowed and branded with a void mark, allowing you to quickly teleport to them and slash them, further inhibiting their ability to move."
|
||||
cost = 2
|
||||
sacs_needed = 3
|
||||
spell_to_add = /obj/effect/proc_holder/spell/aoe_turf/domain_expansion
|
||||
next_knowledge = list(/datum/eldritch_knowledge/final/void_final)
|
||||
route = PATH_VOID
|
||||
|
||||
/datum/eldritch_knowledge/spell/domain_expansion/on_gain(mob/user)
|
||||
. = ..()
|
||||
priority_announce("Echos of the lost in space are heard... An ominous presence is being detected! ", sound = 'sound/misc/notice1.ogg')
|
||||
|
||||
/datum/eldritch_knowledge/final/void_final
|
||||
name = "Waltz at the End of Time"
|
||||
desc = "Bring 3 corpses onto the transmutation rune. After you finish the ritual you will automatically silence people around you and will summon a snow storm around you."
|
||||
gain_text = "The world falls into darkness. I stand in an empty plane, small flakes of ice fall from the sky. The Aristocrat stands before me, he motions to me. We will play a waltz to the whispers of dying reality, as the world is destroyed before our eyes."
|
||||
cost = 5
|
||||
sacs_needed = 8
|
||||
required_atoms = list(/mob/living/carbon/human)
|
||||
route = PATH_VOID
|
||||
///soundloop for the void theme
|
||||
|
||||
@@ -633,7 +633,7 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
AddComponent(/datum/component/stationloving, !fake)
|
||||
|
||||
/obj/item/disk/nuclear/process()
|
||||
++process_tick
|
||||
process_tick++
|
||||
if(fake)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck")
|
||||
@@ -650,7 +650,7 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
disk_comfort_level++
|
||||
|
||||
if(disk_comfort_level >= 2) //Sleep tight, disky.
|
||||
if(process_tick % 30)
|
||||
if(!(process_tick % 30))
|
||||
visible_message("<span class='notice'>[src] sleeps soundly. Sleep tight, disky.</span>")
|
||||
if(last_disk_move < world.time - 5000 && prob((world.time - 5000 - last_disk_move)*0.0001))
|
||||
var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control
|
||||
|
||||
@@ -177,6 +177,9 @@
|
||||
/mob/living/simple_animal/revenant/ex_act(severity, target)
|
||||
return 1 //Immune to the effects of explosions.
|
||||
|
||||
/mob/living/simple_animal/revenant/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
return power
|
||||
|
||||
/mob/living/simple_animal/revenant/blob_act(obj/structure/blob/B)
|
||||
return //blah blah blobs aren't in tune with the spirit world, or something.
|
||||
|
||||
@@ -489,7 +492,7 @@
|
||||
var/targetAmount = 100
|
||||
|
||||
/datum/objective/revenant/New()
|
||||
targetAmount = rand(350,600)
|
||||
targetAmount = rand(150,300)
|
||||
explanation_text = "Absorb [targetAmount] points of essence from humans."
|
||||
..()
|
||||
|
||||
|
||||
@@ -84,6 +84,9 @@
|
||||
if(slam_cooldown + slam_cooldown_time > world.time)
|
||||
to_chat(src, "<span class='warning'>Your slam ability is still on cooldown!</span>")
|
||||
return
|
||||
if(!isopenturf(loc))
|
||||
to_chat(src, "<span class='warning'>You need to be on open flooring to do that!")
|
||||
return
|
||||
|
||||
face_atom(A)
|
||||
var/mob/living/victim = A
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user