mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
Merge remote-tracking branch 'origin/master' into luciee
This commit is contained in:
@@ -1066,22 +1066,6 @@
|
||||
icon_state = "panelscorched"
|
||||
},
|
||||
/area/mine/storage)
|
||||
"kj" = (
|
||||
/obj/effect/turf_decal/stripes/corner{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/living_quarters)
|
||||
"kA" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
|
||||
/obj/structure/cable{
|
||||
@@ -1193,6 +1177,15 @@
|
||||
/obj/item/bedsheet/orange,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/living_quarters)
|
||||
"lO" = (
|
||||
/obj/effect/turf_decal/stripes/corner,
|
||||
/obj/machinery/door/firedoor/border_only,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/railing/corner,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/living_quarters)
|
||||
"lP" = (
|
||||
/obj/machinery/firealarm{
|
||||
pixel_y = 32
|
||||
@@ -1690,14 +1683,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/production)
|
||||
"ur" = (
|
||||
/obj/effect/turf_decal/stripes/corner,
|
||||
/obj/machinery/door/firedoor/border_only,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/living_quarters)
|
||||
"us" = (
|
||||
/obj/machinery/atmospherics/components/binary/pump/on{
|
||||
name = "Waste to Filters";
|
||||
@@ -1749,16 +1734,6 @@
|
||||
"vl" = (
|
||||
/turf/closed/wall,
|
||||
/area/mine/eva)
|
||||
"vn" = (
|
||||
/obj/effect/turf_decal/stripes/corner{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/living_quarters)
|
||||
"vC" = (
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
pixel_x = 30
|
||||
@@ -1894,6 +1869,25 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/mine/infirmary)
|
||||
"xx" = (
|
||||
/obj/effect/turf_decal/stripes/corner{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/railing/corner{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/living_quarters)
|
||||
"xD" = (
|
||||
/obj/machinery/atmospherics/components/trinary/mixer/on{
|
||||
dir = 4;
|
||||
@@ -3247,16 +3241,7 @@
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/mine/maintenance)
|
||||
"QP" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/book/random,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/mine/living_quarters)
|
||||
"QQ" = (
|
||||
/obj/structure/table,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/mine/infirmary)
|
||||
"QU" = (
|
||||
"QH" = (
|
||||
/obj/effect/turf_decal/stripes/corner{
|
||||
dir = 1
|
||||
},
|
||||
@@ -3272,8 +3257,20 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "2-8"
|
||||
},
|
||||
/obj/structure/railing/corner{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/living_quarters)
|
||||
"QP" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/book/random,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/mine/living_quarters)
|
||||
"QQ" = (
|
||||
/obj/structure/table,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/mine/infirmary)
|
||||
"Rl" = (
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/mine/vacant)
|
||||
@@ -3478,6 +3475,19 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/eva)
|
||||
"Ux" = (
|
||||
/obj/effect/turf_decal/stripes/corner{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/railing/corner{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/living_quarters)
|
||||
"Uy" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
|
||||
dir = 4
|
||||
@@ -4443,7 +4453,7 @@ wV
|
||||
fD
|
||||
iy
|
||||
ft
|
||||
ur
|
||||
lO
|
||||
ba
|
||||
ba
|
||||
ba
|
||||
@@ -4451,7 +4461,7 @@ Qc
|
||||
cr
|
||||
ba
|
||||
ba
|
||||
kj
|
||||
xx
|
||||
Vp
|
||||
zW
|
||||
VP
|
||||
@@ -4695,7 +4705,7 @@ tQ
|
||||
Xo
|
||||
sU
|
||||
zK
|
||||
vn
|
||||
Ux
|
||||
OU
|
||||
OU
|
||||
pk
|
||||
@@ -4703,7 +4713,7 @@ fC
|
||||
OU
|
||||
OU
|
||||
OU
|
||||
QU
|
||||
QH
|
||||
WT
|
||||
zW
|
||||
VP
|
||||
|
||||
1653
_maps/RandomRuins/StationRuins/BoxStation/bar_grassy.dmm
Normal file
1653
_maps/RandomRuins/StationRuins/BoxStation/bar_grassy.dmm
Normal file
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,7 @@
|
||||
#include "map_files\EclipseStation\EclipseStation.dmm"
|
||||
#include "map_files\IceBox\IceBox.dmm"
|
||||
#include "map_files\KiloStation\KiloStation.dmm"
|
||||
#include "map_files\GaxStation\GaxStation.dmm"
|
||||
#ifdef TRAVISBUILDING
|
||||
#include "templates.dm"
|
||||
#endif
|
||||
|
||||
1
_maps/gaxstation.dm
Normal file
1
_maps/gaxstation.dm
Normal file
@@ -0,0 +1 @@
|
||||
#define FORCE_MAP "_maps/gaxstation.json"
|
||||
11
_maps/gaxstation.json
Normal file
11
_maps/gaxstation.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"map_name": "[BETA] GaxStation",
|
||||
"map_path": "map_files/GaxStation",
|
||||
"map_file": "GaxStation.dmm",
|
||||
"shuttles": {
|
||||
"cargo": "cargo_gax",
|
||||
"ferry": "ferry_fancy",
|
||||
"whiteship": "whiteship_meta",
|
||||
"emergency": "emergency_box"
|
||||
}
|
||||
}
|
||||
110494
_maps/map_files/GaxStation/GaxStation.dmm
Normal file
110494
_maps/map_files/GaxStation/GaxStation.dmm
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
162
_maps/shuttles/ai_gax.dmm
Normal file
162
_maps/shuttles/ai_gax.dmm
Normal file
@@ -0,0 +1,162 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/ai)
|
||||
"b" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/ai)
|
||||
"e" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"h" = (
|
||||
/obj/structure/shuttle/engine/heater{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
layer = 2.9
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/ai)
|
||||
"m" = (
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/ai)
|
||||
"o" = (
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/ai)
|
||||
"q" = (
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/ai)
|
||||
"u" = (
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/obj/machinery/door/firedoor/border_only,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/ai)
|
||||
"z" = (
|
||||
/obj/machinery/computer/shuttle/ai_ship{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/ai)
|
||||
"C" = (
|
||||
/obj/structure/chair/comfy/shuttle,
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/ai)
|
||||
"G" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/ai)
|
||||
"H" = (
|
||||
/obj/structure/shuttle/engine/propulsion/burst{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/ai)
|
||||
"M" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Mining Shuttle Airlock"
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 1
|
||||
},
|
||||
/obj/docking_port/mobile{
|
||||
dir = 2;
|
||||
dwidth = 2;
|
||||
height = 6;
|
||||
id = "ai_ship";
|
||||
name = "ai ship shuttle";
|
||||
port_direction = 4;
|
||||
width = 5
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/ai)
|
||||
"N" = (
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/ai)
|
||||
"Q" = (
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/ai)
|
||||
"U" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/ai)
|
||||
"W" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Mining Shuttle Airlock"
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/ai)
|
||||
|
||||
(1,1,1) = {"
|
||||
H
|
||||
h
|
||||
N
|
||||
W
|
||||
N
|
||||
e
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
m
|
||||
G
|
||||
a
|
||||
q
|
||||
N
|
||||
N
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
M
|
||||
q
|
||||
q
|
||||
C
|
||||
z
|
||||
u
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
m
|
||||
U
|
||||
b
|
||||
o
|
||||
N
|
||||
N
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
H
|
||||
h
|
||||
N
|
||||
Q
|
||||
N
|
||||
e
|
||||
"}
|
||||
286
_maps/shuttles/arrival_gax.dmm
Normal file
286
_maps/shuttles/arrival_gax.dmm
Normal file
@@ -0,0 +1,286 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"b" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"d" = (
|
||||
/obj/structure/sign/poster/official/random{
|
||||
pixel_y = 32
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"g" = (
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/sign/poster/official/random{
|
||||
pixel_y = 32
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"h" = (
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
pixel_x = -5;
|
||||
pixel_y = 30
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"k" = (
|
||||
/obj/machinery/vending/wallmed{
|
||||
name = "Emergency NanoMed";
|
||||
pixel_y = 32;
|
||||
use_power = 0
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"m" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/closet/crate/internals,
|
||||
/obj/item/storage/firstaid/o2,
|
||||
/obj/item/tank/internals/emergency_oxygen,
|
||||
/obj/item/tank/internals/emergency_oxygen,
|
||||
/obj/item/tank/internals/emergency_oxygen,
|
||||
/obj/item/tank/internals/emergency_oxygen,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/tank/internals/emergency_oxygen,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"o" = (
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/arrival)
|
||||
"p" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"q" = (
|
||||
/obj/structure/shuttle/engine/propulsion/burst/right{
|
||||
dir = 8
|
||||
},
|
||||
/obj/docking_port/mobile/arrivals{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/arrival)
|
||||
"r" = (
|
||||
/obj/structure/chair/comfy/shuttle,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"s" = (
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/obj/machinery/door/firedoor/window,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/arrival)
|
||||
"t" = (
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/shuttle/engine/heater{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/arrival)
|
||||
"w" = (
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"C" = (
|
||||
/obj/structure/chair/comfy/shuttle,
|
||||
/obj/machinery/status_display/ai{
|
||||
pixel_y = 32
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"D" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Arrivals Shuttle Airlock"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/arrival)
|
||||
"E" = (
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"H" = (
|
||||
/obj/structure/sign/nanotrasen,
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/arrival)
|
||||
"I" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/status_display/ai{
|
||||
pixel_y = -32
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"K" = (
|
||||
/turf/open/floor/mineral/titanium/white,
|
||||
/area/shuttle/arrival)
|
||||
"L" = (
|
||||
/obj/machinery/door/firedoor/window,
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/arrival)
|
||||
"M" = (
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/mineral/titanium/white,
|
||||
/area/shuttle/arrival)
|
||||
"R" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"T" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
"U" = (
|
||||
/obj/structure/shuttle/engine/propulsion/burst/right{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/arrival)
|
||||
"Z" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/storage/toolbox/emergency{
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/storage/toolbox/emergency,
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/structure/sign/poster/official/random{
|
||||
pixel_y = 32
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/arrival)
|
||||
|
||||
(1,1,1) = {"
|
||||
p
|
||||
o
|
||||
U
|
||||
q
|
||||
U
|
||||
o
|
||||
p
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
o
|
||||
o
|
||||
t
|
||||
t
|
||||
t
|
||||
o
|
||||
o
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
o
|
||||
Z
|
||||
w
|
||||
K
|
||||
w
|
||||
m
|
||||
o
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
o
|
||||
k
|
||||
b
|
||||
K
|
||||
b
|
||||
w
|
||||
s
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
D
|
||||
K
|
||||
K
|
||||
K
|
||||
K
|
||||
w
|
||||
s
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
o
|
||||
d
|
||||
b
|
||||
M
|
||||
b
|
||||
w
|
||||
s
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
D
|
||||
K
|
||||
K
|
||||
K
|
||||
K
|
||||
w
|
||||
s
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
o
|
||||
h
|
||||
b
|
||||
K
|
||||
b
|
||||
w
|
||||
s
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
o
|
||||
g
|
||||
w
|
||||
K
|
||||
w
|
||||
E
|
||||
o
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
o
|
||||
o
|
||||
C
|
||||
K
|
||||
I
|
||||
o
|
||||
o
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
p
|
||||
o
|
||||
r
|
||||
K
|
||||
T
|
||||
o
|
||||
p
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
p
|
||||
H
|
||||
r
|
||||
K
|
||||
R
|
||||
H
|
||||
p
|
||||
"}
|
||||
(13,1,1) = {"
|
||||
p
|
||||
o
|
||||
L
|
||||
L
|
||||
L
|
||||
o
|
||||
p
|
||||
"}
|
||||
233
_maps/shuttles/cargo_gax.dmm
Normal file
233
_maps/shuttles/cargo_gax.dmm
Normal file
@@ -0,0 +1,233 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/open/floor/mineral/titanium/white,
|
||||
/area/shuttle/supply)
|
||||
"b" = (
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/supply)
|
||||
"c" = (
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/structure/shuttle/engine/heater{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/supply)
|
||||
"e" = (
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/supply)
|
||||
"f" = (
|
||||
/obj/machinery/conveyor{
|
||||
dir = 4;
|
||||
id = "QMLoad2"
|
||||
},
|
||||
/obj/machinery/door/poddoor{
|
||||
id = "QMLoaddoor2";
|
||||
name = "supply dock loading door"
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/supply)
|
||||
"g" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Supply Shuttle Airlock";
|
||||
req_access_txt = "31"
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/supply)
|
||||
"i" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Supply Shuttle Airlock";
|
||||
req_access_txt = "31"
|
||||
},
|
||||
/obj/docking_port/mobile/supply{
|
||||
dwidth = 5;
|
||||
width = 12
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/supply)
|
||||
"j" = (
|
||||
/obj/machinery/conveyor{
|
||||
dir = 8;
|
||||
id = "QMLoad"
|
||||
},
|
||||
/obj/machinery/door/poddoor{
|
||||
id = "QMLoaddoor";
|
||||
name = "supply dock loading door"
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/supply)
|
||||
"l" = (
|
||||
/turf/closed/wall/mineral/titanium/interior,
|
||||
/area/shuttle/supply)
|
||||
"s" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"v" = (
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/supply)
|
||||
"x" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/supply)
|
||||
"y" = (
|
||||
/obj/structure/shuttle/engine/propulsion{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/supply)
|
||||
"z" = (
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
dir = 2;
|
||||
id = "QMLoaddoor2";
|
||||
name = "Loading Doors";
|
||||
pixel_x = 24;
|
||||
pixel_y = 8
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
id = "QMLoaddoor";
|
||||
name = "Loading Doors";
|
||||
pixel_x = 24;
|
||||
pixel_y = -8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/supply)
|
||||
"A" = (
|
||||
/obj/structure/shuttle/engine/propulsion/burst/right{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/supply)
|
||||
"H" = (
|
||||
/obj/structure/shuttle/engine/propulsion/burst/left{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/supply)
|
||||
|
||||
(1,1,1) = {"
|
||||
s
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
A
|
||||
b
|
||||
l
|
||||
e
|
||||
e
|
||||
e
|
||||
x
|
||||
e
|
||||
e
|
||||
e
|
||||
e
|
||||
b
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
y
|
||||
c
|
||||
e
|
||||
e
|
||||
a
|
||||
e
|
||||
e
|
||||
e
|
||||
a
|
||||
e
|
||||
e
|
||||
b
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
y
|
||||
c
|
||||
e
|
||||
e
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
e
|
||||
v
|
||||
b
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
y
|
||||
c
|
||||
e
|
||||
e
|
||||
a
|
||||
e
|
||||
e
|
||||
e
|
||||
a
|
||||
e
|
||||
e
|
||||
b
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
H
|
||||
b
|
||||
l
|
||||
e
|
||||
e
|
||||
e
|
||||
z
|
||||
e
|
||||
e
|
||||
e
|
||||
e
|
||||
b
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
s
|
||||
b
|
||||
b
|
||||
b
|
||||
f
|
||||
g
|
||||
b
|
||||
i
|
||||
j
|
||||
b
|
||||
b
|
||||
b
|
||||
"}
|
||||
212
_maps/shuttles/labour_gax.dmm
Normal file
212
_maps/shuttles/labour_gax.dmm
Normal file
@@ -0,0 +1,212 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/labor)
|
||||
"b" = (
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/labor)
|
||||
"c" = (
|
||||
/obj/machinery/computer/shuttle/labor{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/reagent_dispensers/peppertank{
|
||||
pixel_x = -31
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/labor)
|
||||
"d" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/labor)
|
||||
"e" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/folder/red,
|
||||
/obj/item/restraints/handcuffs,
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/labor)
|
||||
"f" = (
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/labor)
|
||||
"g" = (
|
||||
/obj/machinery/button/flasher{
|
||||
id = "gulagshuttleflasher";
|
||||
name = "Flash Control";
|
||||
pixel_y = -26;
|
||||
req_access_txt = "1"
|
||||
},
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/labor)
|
||||
"h" = (
|
||||
/obj/machinery/mineral/stacking_unit_console{
|
||||
machinedir = 2;
|
||||
pixel_x = 30;
|
||||
pixel_y = 30
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/labor)
|
||||
"k" = (
|
||||
/obj/machinery/mineral/stacking_machine/laborstacker{
|
||||
input_dir = 2;
|
||||
output_dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/shuttle/labor)
|
||||
"l" = (
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/labor)
|
||||
"m" = (
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/labor)
|
||||
"n" = (
|
||||
/obj/machinery/mineral/labor_claim_console{
|
||||
machinedir = 1;
|
||||
pixel_x = 30
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/labor)
|
||||
"o" = (
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Labor Shuttle Airlock";
|
||||
req_access_txt = "2"
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 4
|
||||
},
|
||||
/obj/docking_port/mobile{
|
||||
dir = 4;
|
||||
dwidth = 2;
|
||||
height = 5;
|
||||
id = "laborcamp";
|
||||
name = "labor camp shuttle";
|
||||
port_direction = 4;
|
||||
width = 9
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/labor)
|
||||
"p" = (
|
||||
/obj/structure/closet/crate,
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/labor)
|
||||
"q" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
id_tag = "prisonshuttle";
|
||||
name = "Labor Shuttle Airlock"
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/labor)
|
||||
"r" = (
|
||||
/obj/structure/shuttle/engine/heater,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 1;
|
||||
layer = 2.9
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/labor)
|
||||
"s" = (
|
||||
/obj/structure/shuttle/engine/propulsion,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/labor)
|
||||
"x" = (
|
||||
/obj/machinery/flasher{
|
||||
id = "gulagshuttleflasher";
|
||||
pixel_x = -24;
|
||||
pixel_y = 1
|
||||
},
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/labor)
|
||||
"U" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Labor Shuttle Airlock";
|
||||
req_access_txt = "2"
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/labor)
|
||||
"Z" = (
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/labor)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
o
|
||||
a
|
||||
a
|
||||
a
|
||||
q
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
b
|
||||
c
|
||||
f
|
||||
k
|
||||
l
|
||||
x
|
||||
l
|
||||
r
|
||||
s
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
b
|
||||
d
|
||||
g
|
||||
a
|
||||
m
|
||||
l
|
||||
l
|
||||
r
|
||||
s
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
b
|
||||
e
|
||||
h
|
||||
U
|
||||
n
|
||||
l
|
||||
p
|
||||
r
|
||||
s
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
a
|
||||
Z
|
||||
a
|
||||
a
|
||||
Z
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
@@ -18,6 +18,11 @@
|
||||
/obj/structure/table,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/recharger,
|
||||
/obj/item/gun/ballistic/handcannon,
|
||||
/obj/item/ammo_casing/caseless/cannonball,
|
||||
/obj/item/ammo_casing/caseless/cannonball,
|
||||
/obj/item/ammo_casing/caseless/cannonball,
|
||||
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 1
|
||||
},
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -83,6 +83,7 @@
|
||||
#define ADMIN_PUNISHMENT_BLEED ":B:loodless"
|
||||
#define ADMIN_PUNISHMENT_PERFORATE ":B:erforate"
|
||||
#define ADMIN_PUNISHMENT_SCARIFY "Scarify"
|
||||
#define ADMIN_PUNISHMENT_SMSPIDER "SM Spider"
|
||||
|
||||
#define AHELP_ACTIVE 1
|
||||
#define AHELP_CLOSED 2
|
||||
@@ -118,4 +119,4 @@ GLOBAL_VAR_INIT(ghost_role_flags, (~0))
|
||||
//ie pais, posibrains
|
||||
#define GHOSTROLE_SILICONS (1<<3)
|
||||
//ie mafia, ctf
|
||||
#define GHOSTROLE_MINIGAME (1<<4)
|
||||
#define GHOSTROLE_MINIGAME (1<<4)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
|
||||
///How many ticks can an AI data core store? When this amount of ticks have passed while it's in an INVALID state it can no longer be used by an AI
|
||||
#define MAX_AI_DATA_CORE_TICKS 15
|
||||
#define MAX_AI_DATA_CORE_TICKS 45
|
||||
///How much power does the AI date core use while being in a valid state. This is also the base heat output. (Divide by heat capacity to get actual temperature increase)
|
||||
#define AI_DATA_CORE_POWER_USAGE 7500
|
||||
|
||||
|
||||
@@ -101,3 +101,9 @@
|
||||
#define TIER_BLADE 5
|
||||
#define TIER_3 6
|
||||
#define TIER_ASCEND 7
|
||||
|
||||
//Bloodsuckers
|
||||
#define IS_BLOODSUCKER(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/bloodsucker))
|
||||
#define IS_VASSAL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/vassal))
|
||||
#define IS_MONSTERHUNTER(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/monsterhunter))
|
||||
|
||||
|
||||
@@ -84,6 +84,9 @@
|
||||
#define ANTAG_HUD_HERETIC 29
|
||||
#define ANTAG_HUD_MINDSLAVE 30
|
||||
#define ANTAG_HUD_ZOMBIE 31
|
||||
#define ANTAG_HUD_BLOODSUCKER 32
|
||||
#define ANTAG_HUD_MHUNTER 33
|
||||
#define ANTAG_HUD_BRAINWASHED 34
|
||||
|
||||
// Notification action types
|
||||
#define NOTIFY_JUMP "jump"
|
||||
|
||||
70
code/__DEFINES/bloodsuckers.dm
Normal file
70
code/__DEFINES/bloodsuckers.dm
Normal file
@@ -0,0 +1,70 @@
|
||||
/**
|
||||
* Bloodsucker defines
|
||||
*/
|
||||
/// Determines Bloodsucker regeneration rate
|
||||
#define BS_BLOOD_VOLUME_MAX_REGEN 700
|
||||
/// Cost to torture someone, in blood
|
||||
#define TORTURE_BLOOD_COST "15"
|
||||
/// Cost to convert someone after successful torture, in blood
|
||||
#define TORTURE_CONVERSION_COST "50"
|
||||
/// Deals with constant processes off of LifeTick()
|
||||
#define COMSIG_LIVING_BIOLOGICAL_LIFE "biological_life"
|
||||
/// Once blood is this low, will enter Frenzy
|
||||
#define FRENZY_THRESHOLD_ENTER 25
|
||||
/// Once blood is this high, will exit Frenzy
|
||||
#define FRENZY_THRESHOLD_EXIT 250
|
||||
/// You have special interactions with Bloodsuckers
|
||||
#define TRAIT_BLOODSUCKER_HUNTER "bloodsucker_hunter"
|
||||
|
||||
/**
|
||||
* Cooldown defines
|
||||
* Used in Cooldowns Bloodsuckers use to prevent spamming
|
||||
*/
|
||||
///Spam prevention for healing messages.
|
||||
#define BLOODSUCKER_SPAM_HEALING (15 SECONDS)
|
||||
///Span prevention for Sol messages.
|
||||
#define BLOODSUCKER_SPAM_SOL (30 SECONDS)
|
||||
|
||||
/**
|
||||
* Clan defines
|
||||
*/
|
||||
#define CLAN_BRUJAH "Brujah Clan"
|
||||
#define CLAN_NOSFERATU "Nosferatu Clan"
|
||||
#define CLAN_TREMERE "Tremere Clan"
|
||||
#define CLAN_VENTRUE "Ventrue Clan"
|
||||
#define CLAN_MALKAVIAN "Malkavian Clan"
|
||||
#define CLAN_TOREADOR "Toreador Clan"
|
||||
#define CLAN_GANGREL "Gangrel Clan"
|
||||
#define CLAN_LASOMBRA "Lasombra Clan"
|
||||
|
||||
/**
|
||||
* Power defines
|
||||
*/
|
||||
/// This Power can't be used in Torpor
|
||||
#define BP_CANT_USE_IN_TORPOR (1<<0)
|
||||
/// This Power can't be used in Frenzy unless you're part of Brujah
|
||||
#define BP_CANT_USE_IN_FRENZY (1<<1)
|
||||
/// This Power can't be used with a stake in you
|
||||
#define BP_CANT_USE_WHILE_STAKED (1<<2)
|
||||
/// This Power can't be used while incapacitated
|
||||
#define BP_CANT_USE_WHILE_INCAPACITATED (1<<3)
|
||||
/// This Power can't be used while unconscious
|
||||
#define BP_CANT_USE_WHILE_UNCONSCIOUS (1<<4)
|
||||
|
||||
/// This Power can be purchased by Bloodsuckers
|
||||
#define BLOODSUCKER_CAN_BUY (1<<0)
|
||||
/// This Power can be purchased by Tremere Bloodsuckers
|
||||
#define TREMERE_CAN_BUY (1<<1)
|
||||
/// This Power can be purchased by Vassals
|
||||
#define VASSAL_CAN_BUY (1<<2)
|
||||
/// This Power can be purchased by Monster Hunters
|
||||
#define HUNTER_CAN_BUY (1<<3)
|
||||
|
||||
/// This Power is a Toggled Power
|
||||
#define BP_AM_TOGGLE (1<<0)
|
||||
/// This Power is a Single-Use Power
|
||||
#define BP_AM_SINGLEUSE (1<<1)
|
||||
/// This Power has a Static cooldown
|
||||
#define BP_AM_STATIC_COOLDOWN (1<<2)
|
||||
/// This Power doesn't cost bloot to run while unconscious
|
||||
#define BP_AM_COSTLESS_UNCONSCIOUS (1<<3)
|
||||
@@ -10,6 +10,9 @@
|
||||
#define MARTIALART_CQC_COOK "CQC cook"
|
||||
#define MARTIALART_PLASMAFIST "plasma fist"
|
||||
#define MARTIALART_FLYINGFANG "flying fang"
|
||||
#define MARTIALART_HUNTERFU "hunterfu"
|
||||
#define MARTIALART_FRENZYGRAB "frenzy grabbing"
|
||||
|
||||
|
||||
//Weapon stat defines
|
||||
#define SWING_SPEED "swing_speed"
|
||||
|
||||
@@ -488,3 +488,12 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE))
|
||||
#define ALIGNMENT_GOOD "good"
|
||||
#define ALIGNMENT_NEUT "neutral"
|
||||
#define ALIGNMENT_EVIL "evil"
|
||||
|
||||
/// Whether we have succesfully hidden out blood level
|
||||
#define BLOODSUCKER_HIDE_BLOOD "hide_blood_volume"
|
||||
/// 1 tile down
|
||||
#define ui_blood_display "WEST:6,CENTER-1:0"
|
||||
/// 2 tiles down
|
||||
#define ui_vamprank_display "WEST:6,CENTER-2:-5"
|
||||
/// 6 pixels to the right, zero tiles & 5 pixels DOWN.
|
||||
#define ui_sunlight_display "WEST:6,CENTER-0:0"
|
||||
@@ -47,7 +47,10 @@
|
||||
#define ROLE_HORROR "Eldritch Horror" // Yogs
|
||||
#define ROLE_INFILTRATOR "Infiltrator" // Yogs
|
||||
#define ROLE_ZOMBIE "Zombie"
|
||||
|
||||
#define ROLE_BLOODSUCKER "Bloodsucker"
|
||||
#define ROLE_VAMPIRICACCIDENT "Vampiric Accident"
|
||||
#define ROLE_BLOODSUCKERBREAKOUT "Bloodsucker Breakout"
|
||||
#define ROLE_MONSTERHUNTER "Monster Hunter"
|
||||
|
||||
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
|
||||
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
|
||||
@@ -85,7 +88,9 @@ GLOBAL_LIST_INIT(special_roles, list(
|
||||
ROLE_DARKSPAWN = /datum/game_mode/darkspawn,
|
||||
ROLE_SENTIENCE,
|
||||
ROLE_ZOMBIE = /datum/game_mode/zombie,
|
||||
ROLE_FUGITIVE
|
||||
ROLE_FUGITIVE,
|
||||
ROLE_BLOODSUCKER = /datum/game_mode/bloodsucker,
|
||||
ROLE_MONSTERHUNTER,
|
||||
))
|
||||
|
||||
//Job defines for what happens when you fail to qualify for any job during job selection
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
#define MAX_MESSAGE_LEN 1024
|
||||
#define MAX_NAME_LEN 42
|
||||
#define MAX_BROADCAST_LEN 512
|
||||
#define MAX_CHARTER_LEN 80
|
||||
#define MAX_CHARTER_LEN 64
|
||||
|
||||
// Audio/Visual Flags. Used to determine what sense are required to notice a message.
|
||||
#define MSG_VISUAL (1<<0)
|
||||
|
||||
@@ -29,7 +29,3 @@
|
||||
#define VISOR_DARKNESSVIEW (1<<3)
|
||||
#define VISOR_INVISVIEW (1<<4)
|
||||
|
||||
//for whether AI eyes see static, and whether it is mouse-opaque or not
|
||||
#define USE_STATIC_NONE 0
|
||||
#define USE_STATIC_TRANSPARENT 1
|
||||
#define USE_STATIC_OPAQUE 2
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
|
||||
#define STATUS_EFFECT_DETERMINED /datum/status_effect/determined //currently in a combat high from being seriously wounded
|
||||
|
||||
#define STATUS_EFFECT_FRENZY /datum/status_effect/frenzy //Makes you fast and stronger
|
||||
|
||||
/////////////
|
||||
// DEBUFFS //
|
||||
/////////////
|
||||
@@ -80,6 +82,8 @@
|
||||
|
||||
#define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage
|
||||
|
||||
#define STATUS_EFFECT_KNUCKLED /datum/status_effect/knuckled //if struck with bloody knuckles or their ability, gets rooted
|
||||
|
||||
#define STATUS_EFFECT_SAWBLEED /datum/status_effect/saw_bleed //if the bleed builds up enough, takes a ton of damage
|
||||
|
||||
#define STATUS_EFFECT_BLOODLETTING /datum/status_effect/saw_bleed/bloodletting //same but smaller
|
||||
@@ -147,6 +151,8 @@
|
||||
|
||||
#define STATUS_EFFECT_PROGENITORCURSE /datum/status_effect/progenitor_curse
|
||||
|
||||
#define STATUS_EFFECT_MASQUERADE /datum/status_effect/masquerade
|
||||
|
||||
/////////////
|
||||
// SLIME //
|
||||
/////////////
|
||||
|
||||
@@ -163,6 +163,7 @@
|
||||
#define TRAIT_EASILY_WOUNDED "easy_limb_wound"
|
||||
#define TRAIT_HARDLY_WOUNDED "hard_limb_wound"
|
||||
#define TRAIT_TOXINLOVER "toxinlover"
|
||||
#define TRAIT_TOXIMMUNE "toxin_immune"
|
||||
#define TRAIT_NOBREATH "no_breath"
|
||||
#define TRAIT_ANTIMAGIC "anti_magic"
|
||||
#define TRAIT_HOLY "holy"
|
||||
@@ -216,6 +217,9 @@
|
||||
#define TRAIT_NO_PASSIVE_HEATING "no-passive-heating"
|
||||
#define TRAIT_BLOODY_MESS "bloody_mess" //from heparin, makes open bleeding wounds rapidly spill more blood
|
||||
#define TRAIT_COAGULATING "coagulating" //from coagulant reagents, this doesn't affect the bleeding itself but does affect the bleed warning messages
|
||||
#define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat
|
||||
#define TRAIT_MASQUERADE "masquerade" // Falsifies Health analyzer blood levels
|
||||
#define TRAIT_COLDBLOODED "coldblooded" // Your body is literal room temperature. Does not make you immune to the temp
|
||||
|
||||
//non-mob traits
|
||||
/// Used for limb-based paralysis, where replacing the limb will fix it.
|
||||
@@ -319,6 +323,8 @@
|
||||
#define GUARDIAN_TRAIT "guardian_trait"
|
||||
#define RANDOM_BLACKOUTS "random_blackouts"
|
||||
#define MADE_UNCLONEABLE "made-uncloneable"
|
||||
#define BLOODSUCKER_TRAIT "bloodsucker_trait"
|
||||
#define FRENZY_TRAIT "frenzy_trait"
|
||||
#define HORROR_TRAIT "horror"
|
||||
|
||||
///Traits given by station traits
|
||||
|
||||
@@ -8,11 +8,14 @@
|
||||
#define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL))
|
||||
#define CULT_POLL_WAIT 2400
|
||||
|
||||
/proc/get_area_name(atom/X, format_text = FALSE)
|
||||
/proc/get_area_name(atom/X, format_text = FALSE, is_sensor = FALSE)
|
||||
var/area/A = isarea(X) ? X : get_area(X)
|
||||
if(!A)
|
||||
return null
|
||||
return format_text ? format_text(A.name) : A.name
|
||||
var/name = A.name
|
||||
if (is_sensor && !A.show_on_sensors)
|
||||
name = Gibberish(name, TRUE, 90)
|
||||
return format_text ? format_text(name) : name
|
||||
|
||||
/proc/get_areas_in_range(dist=0, atom/center=usr)
|
||||
if(!dist)
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/dome, GLOB.dome_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/dorsal_tubes, GLOB.dorsal_tubes_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/ethereal_mark, GLOB.ethereal_mark_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_flower, GLOB.pod_flower_list)
|
||||
|
||||
|
||||
|
||||
//Species
|
||||
|
||||
@@ -80,6 +80,10 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/dorsal_tubes, GLOB.dorsal_tubes_list)
|
||||
if(!GLOB.ethereal_mark_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/ethereal_mark, GLOB.ethereal_mark_list)
|
||||
if(!GLOB.pod_hair_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list)
|
||||
if(!GLOB.pod_flower_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_flower, GLOB.pod_flower_list)
|
||||
|
||||
//For now we will always return none for tail_human and ears. this shit was unreadable if you do somethign like this make it at least readable
|
||||
return(list(
|
||||
@@ -103,7 +107,8 @@
|
||||
"teeth" = pick(GLOB.teeth_list),
|
||||
"dome" = pick(GLOB.dome_list),
|
||||
"dorsal_tubes" = pick(GLOB.dorsal_tubes_list),
|
||||
"ethereal_mark" = pick(GLOB.ethereal_mark_list)
|
||||
"ethereal_mark" = pick(GLOB.ethereal_mark_list),
|
||||
"pod_hair" = pick(GLOB.pod_hair_list)
|
||||
))
|
||||
|
||||
/proc/random_hair_style(gender)
|
||||
|
||||
@@ -58,12 +58,12 @@
|
||||
|
||||
//If you update these values, update the message in the #error
|
||||
#define MAX_BYOND_MAJOR 514
|
||||
#define MAX_BYOND_MINOR 1569
|
||||
#define MAX_BYOND_MINOR 1583
|
||||
|
||||
///Uncomment to bypass the max version check. Note: This will likely break the game, only use if you know what you're doing
|
||||
//#define IGNORE_MAX_BYOND_VERSION
|
||||
#if ((DM_VERSION > MAX_BYOND_MAJOR) || (DM_BUILD > MAX_BYOND_MINOR)) && !defined(IGNORE_MAX_BYOND_VERSION)
|
||||
#error Your version of BYOND is too new to compile this project. Download version 514.1569 at www.byond.com/download/build/514/514.1569_byond.exe
|
||||
#error Your version of BYOND is too new to compile this project. Download version 514.1583 at www.byond.com/download/build/514/514.1583_byond.exe
|
||||
#endif
|
||||
|
||||
#ifdef TRAVISBUILDING
|
||||
|
||||
@@ -46,6 +46,8 @@ GLOBAL_LIST_EMPTY(caps_list)
|
||||
GLOBAL_LIST_EMPTY(ethereal_mark_list) //ethereal face marks
|
||||
GLOBAL_LIST_INIT(color_list_ethereal, list("F Class(Green)" = "97ee63", "F2 Class (Light Green)" = "00fa9a", "F3 Class (Dark Green)" = "37835b", "M Class (Red)" = "9c3030", "M1 Class (Purple)" = "ee82ee", "G Class (Yellow)" = "fbdf56", "O Class (Blue)" = "3399ff", "A Class (Cyan)" = "00ffff"))
|
||||
|
||||
GLOBAL_LIST_EMPTY(pod_hair_list) //ethereal face marks
|
||||
GLOBAL_LIST_EMPTY(pod_flower_list) //ethereal face marks
|
||||
GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites
|
||||
GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list("ghost")) //stores the ghost forms that support hair and other such things
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ GLOBAL_LIST_EMPTY(brazil_reception) //teleport recieve spots for heretic sacrifi
|
||||
GLOBAL_LIST_EMPTY(ruin_landmarks)
|
||||
GLOBAL_LIST_EMPTY(bar_areas)
|
||||
// IF YOU ARE MAKING A NEW BAR TEMPLATE AND WANT IT ROUNDSTART ADD IT TO THIS LIST!
|
||||
GLOBAL_LIST_INIT(potential_box_bars, list("Bar Trek", "Bar Spacious", "Bar Box", "Bar Casino", "Bar Citadel", "Bar Conveyor", "Bar Diner", "Bar Disco", "Bar Purple", "Bar Cheese", "Bar Clock", "Bar Arcade"))
|
||||
GLOBAL_LIST_INIT(potential_box_bars, list("Bar Trek", "Bar Spacious", "Bar Box", "Bar Casino", "Bar Citadel", "Bar Conveyor", "Bar Diner", "Bar Disco", "Bar Purple", "Bar Cheese", "Bar Grassy", "Bar Clock", "Bar Arcade"))
|
||||
|
||||
//away missions
|
||||
GLOBAL_LIST_EMPTY(awaydestinations) //a list of landmarks that the warpgate can take you to
|
||||
|
||||
@@ -43,11 +43,8 @@
|
||||
if(!can_see(A))
|
||||
if(isturf(A)) //On unmodified clients clicking the static overlay clicks the turf underneath
|
||||
return //So there's no point messaging admins
|
||||
message_admins("[ADMIN_LOOKUPFLW(src)] was kicked because they failed can_see on AI click of [A] (Turf Loc: [ADMIN_VERBOSEJMP(pixel_turf)]))")
|
||||
log_admin("[key_name(src)] was kicked because they failed can_see on AI click of [A] (Turf Loc: [AREACOORD(pixel_turf)])")
|
||||
to_chat(src, span_reallybig("You have been automatically kicked because you clicked a turf you shouldn't have been able to see as an AI. You should reconnect automatically. If you do not, you can reconnect using the File --> Reconnect button."))
|
||||
winset(usr, null, "command=.reconnect")
|
||||
QDEL_IN(client, 3 SECONDS) //fallback if the reconnection doesnt work
|
||||
message_admins("[ADMIN_LOOKUPFLW(src)] failed can_see on AI click of [A] (Turf Loc: [ADMIN_VERBOSEJMP(pixel_turf)]))")
|
||||
log_admin("[key_name(src)] failed can_see on AI click of [A] (Turf Loc: [AREACOORD(pixel_turf)])")
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
|
||||
@@ -28,6 +28,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
var/obj/screen/ling/chems/lingchemdisplay
|
||||
var/obj/screen/ling/sting/lingstingdisplay
|
||||
|
||||
var/obj/screen/bloodsucker/blood_counter/blood_display
|
||||
var/obj/screen/bloodsucker/rank_counter/vamprank_display
|
||||
var/obj/screen/bloodsucker/sunlight_counter/sunlight_display
|
||||
|
||||
var/obj/screen/blobpwrdisplay
|
||||
|
||||
var/obj/screen/alien_plasma_display
|
||||
|
||||
@@ -80,6 +80,31 @@
|
||||
icon_state = "power_display"
|
||||
screen_loc = ui_lingchemdisplay
|
||||
|
||||
/obj/screen/bloodsucker
|
||||
icon = 'icons/mob/actions/actions_bloodsucker.dmi'
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
/obj/screen/bloodsucker/proc/clear()
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
/obj/screen/bloodsucker/proc/update_counter()
|
||||
invisibility = 0
|
||||
|
||||
/obj/screen/bloodsucker/blood_counter
|
||||
name = "Blood Consumed"
|
||||
icon_state = "blood_display"
|
||||
screen_loc = ui_blood_display
|
||||
|
||||
/obj/screen/bloodsucker/rank_counter
|
||||
name = "Bloodsucker Rank"
|
||||
icon_state = "rank"
|
||||
screen_loc = ui_vamprank_display
|
||||
|
||||
/obj/screen/bloodsucker/sunlight_counter
|
||||
name = "Solar Flare Timer"
|
||||
icon_state = "sunlight_night"
|
||||
screen_loc = ui_sunlight_display
|
||||
|
||||
/datum/hud/human/New(mob/living/carbon/human/owner)
|
||||
..()
|
||||
owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness)
|
||||
@@ -302,6 +327,14 @@
|
||||
devilsouldisplay = new /obj/screen/devil/soul_counter
|
||||
infodisplay += devilsouldisplay
|
||||
|
||||
//bloodsuckers
|
||||
blood_display = new /obj/screen/bloodsucker/blood_counter
|
||||
infodisplay += blood_display
|
||||
vamprank_display = new /obj/screen/bloodsucker/rank_counter
|
||||
infodisplay += vamprank_display
|
||||
sunlight_display = new /obj/screen/bloodsucker/sunlight_counter
|
||||
infodisplay += sunlight_display
|
||||
|
||||
zone_select = new /obj/screen/zone_sel()
|
||||
zone_select.icon = ui_style
|
||||
zone_select.update_icon(mymob)
|
||||
|
||||
@@ -92,6 +92,9 @@
|
||||
M.lastattacker = user.real_name
|
||||
M.lastattackerckey = user.ckey
|
||||
|
||||
if(force)
|
||||
M.last_damage = name
|
||||
|
||||
user.do_attack_animation(M)
|
||||
M.attacked_by(src, user)
|
||||
|
||||
|
||||
@@ -555,50 +555,55 @@ SUBSYSTEM_DEF(job)
|
||||
qdel(B)
|
||||
|
||||
/datum/controller/subsystem/job/proc/random_bar_init()
|
||||
var/list/player_box = list()
|
||||
for(var/mob/H in GLOB.player_list)
|
||||
if(H.client && H.client.prefs) // Prefs was null once and there was no bar
|
||||
player_box += H.client.prefs.bar_choice
|
||||
try
|
||||
var/list/player_box = list()
|
||||
for(var/mob/H in GLOB.player_list)
|
||||
if(H.client && H.client.prefs) // Prefs was null once and there was no bar
|
||||
player_box += H.client.prefs.bar_choice
|
||||
|
||||
var/choice
|
||||
if(player_box.len == 0)
|
||||
choice = "Random"
|
||||
else
|
||||
choice = pick(player_box)
|
||||
|
||||
if(choice != "Random")
|
||||
var/bar_sanitize = FALSE
|
||||
for(var/A in GLOB.potential_box_bars)
|
||||
if(choice == A)
|
||||
bar_sanitize = TRUE
|
||||
break
|
||||
|
||||
if(!bar_sanitize)
|
||||
var/choice
|
||||
if(player_box.len == 0)
|
||||
choice = "Random"
|
||||
|
||||
if(choice == "Random")
|
||||
choice = pick(GLOB.potential_box_bars)
|
||||
|
||||
var/datum/map_template/template = SSmapping.station_room_templates[choice]
|
||||
else
|
||||
choice = pick(player_box)
|
||||
|
||||
if(isnull(template))
|
||||
message_admins("WARNING: BAR TEMPLATE [choice] FAILED TO LOAD! ATTEMPTING TO LOAD BACKUP")
|
||||
log_game("WARNING: BAR TEMPLATE [choice] FAILED TO LOAD! ATTEMPTING TO LOAD BACKUP")
|
||||
for(var/backup_bar in GLOB.potential_box_bars)
|
||||
template = SSmapping.station_room_templates[backup_bar]
|
||||
if(!isnull(template))
|
||||
break
|
||||
message_admins("WARNING: BAR TEMPLATE [backup_bar] FAILED TO LOAD! ATTEMPTING TO LOAD BACKUP")
|
||||
log_game("WARNING: BAR TEMPLATE [backup_bar] FAILED TO LOAD! ATTEMPTING TO LOAD BACKUP")
|
||||
if(choice != "Random")
|
||||
var/bar_sanitize = FALSE
|
||||
for(var/A in GLOB.potential_box_bars)
|
||||
if(choice == A)
|
||||
bar_sanitize = TRUE
|
||||
break
|
||||
|
||||
if(!bar_sanitize)
|
||||
choice = "Random"
|
||||
|
||||
if(choice == "Random")
|
||||
choice = pick(GLOB.potential_box_bars)
|
||||
|
||||
if(isnull(template))
|
||||
message_admins("WARNING: BAR RECOVERY FAILED! THERE WILL BE NO BAR FOR THIS ROUND!")
|
||||
log_game("WARNING: BAR RECOVERY FAILED! THERE WILL BE NO BAR FOR THIS ROUND!")
|
||||
return
|
||||
var/datum/map_template/template = SSmapping.station_room_templates[choice]
|
||||
|
||||
for(var/obj/effect/landmark/stationroom/box/bar/B in GLOB.landmarks_list)
|
||||
template.load(B.loc, centered = FALSE)
|
||||
qdel(B)
|
||||
if(isnull(template))
|
||||
message_admins("WARNING: BAR TEMPLATE [choice] FAILED TO LOAD! ATTEMPTING TO LOAD BACKUP")
|
||||
log_game("WARNING: BAR TEMPLATE [choice] FAILED TO LOAD! ATTEMPTING TO LOAD BACKUP")
|
||||
for(var/backup_bar in GLOB.potential_box_bars)
|
||||
template = SSmapping.station_room_templates[backup_bar]
|
||||
if(!isnull(template))
|
||||
break
|
||||
message_admins("WARNING: BAR TEMPLATE [backup_bar] FAILED TO LOAD! ATTEMPTING TO LOAD BACKUP")
|
||||
log_game("WARNING: BAR TEMPLATE [backup_bar] FAILED TO LOAD! ATTEMPTING TO LOAD BACKUP")
|
||||
|
||||
if(isnull(template))
|
||||
message_admins("WARNING: BAR RECOVERY FAILED! THERE WILL BE NO BAR FOR THIS ROUND!")
|
||||
log_game("WARNING: BAR RECOVERY FAILED! THERE WILL BE NO BAR FOR THIS ROUND!")
|
||||
return
|
||||
|
||||
for(var/obj/effect/landmark/stationroom/box/bar/B in GLOB.landmarks_list)
|
||||
template.load(B.loc, centered = FALSE)
|
||||
qdel(B)
|
||||
catch(var/exception/e)
|
||||
message_admins("RUNTIME IN RANDOM_BAR_INIT")
|
||||
spawn_bar()
|
||||
throw e
|
||||
|
||||
/proc/spawn_bar()
|
||||
var/datum/map_template/template
|
||||
|
||||
@@ -31,6 +31,8 @@ PROCESSING_SUBSYSTEM_DEF(station)
|
||||
/datum/controller/subsystem/processing/station/proc/SetupTraits()
|
||||
for(var/i in subtypesof(/datum/station_trait))
|
||||
var/datum/station_trait/trait_typepath = i
|
||||
if (initial(trait_typepath.trait_flags) & STATION_TRAIT_ABSTRACT)
|
||||
continue
|
||||
selectable_traits_by_types[initial(trait_typepath.trait_type)][trait_typepath] = initial(trait_typepath.weight)
|
||||
|
||||
var/positive_trait_count = pick(12;0, 5;1, 1;2)
|
||||
@@ -74,4 +76,4 @@ PROCESSING_SUBSYSTEM_DEF(station)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/print_command_report, report, "Central Command Divergency Report", FALSE), rand(REPORT_WAIT_TIME_MINIMUM, REPORT_WAIT_TIME_MAXIMUM))
|
||||
|
||||
#undef REPORT_WAIT_TIME_MINIMUM
|
||||
#undef REPORT_WAIT_TIME_MAXIMUM
|
||||
#undef REPORT_WAIT_TIME_MAXIMUM
|
||||
|
||||
@@ -316,9 +316,6 @@ SUBSYSTEM_DEF(ticker)
|
||||
|
||||
PostSetup()
|
||||
|
||||
to_chat(world, "<h2>The way the AI works has changed. These changes are relevant if: you have an objective to steal/destroy the AI, are playing as the AI / as a Borg, are the Research Director, or, are the Network Admin. \
|
||||
Please read the following: https://github.com/yogstation13/Yogstation/pull/12815 </h2>")
|
||||
|
||||
return TRUE
|
||||
|
||||
/datum/controller/subsystem/ticker/proc/PostSetup()
|
||||
|
||||
@@ -531,6 +531,18 @@
|
||||
owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE)
|
||||
QDEL_NULL(box)
|
||||
|
||||
/datum/action/item_action/visegrip
|
||||
name = "Vise Grip"
|
||||
desc = "Remotely detonate marked targets. People become rooted for 1 second. Nonhumanoids become rooted for 6 seconds and take hefty damage."
|
||||
icon_icon = 'icons/effects/effects.dmi'
|
||||
button_icon_state = "leghold"
|
||||
|
||||
/datum/action/item_action/reach
|
||||
name = "Reach"
|
||||
desc = "Mark those standing on blood for 10 seconds."
|
||||
icon_icon = 'icons/effects/effects.dmi'
|
||||
button_icon_state = "rshield"
|
||||
|
||||
//Preset for spells
|
||||
/datum/action/spell_action
|
||||
check_flags = NONE
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
name = "Create Throwing Stars (3E)"
|
||||
desc = "Creates some throwing stars"
|
||||
button_icon_state = "throwingstar"
|
||||
icon_icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_icon = 'icons/obj/weapons/misc.dmi'
|
||||
|
||||
/datum/action/item_action/ninjanet
|
||||
name = "Energy Net (25E)"
|
||||
@@ -36,7 +36,7 @@
|
||||
name = "Recall Energy Katana (Variable Cost)"
|
||||
desc = "Teleports the Energy Katana linked to this suit to its wearer, cost based on distance."
|
||||
button_icon_state = "energy_katana"
|
||||
icon_icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_icon = 'icons/obj/weapons/swords.dmi'
|
||||
|
||||
/datum/action/item_action/ninja_stealth
|
||||
name = "Toggle Stealth"
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
inherent = list("You are a member of a collective of silicons with equal weight and decision-making power.",\
|
||||
"When possible, the silicon collective should vote before taking action.",\
|
||||
"The master AI serves as a spokesperson. When voting is impractical or impossible, the spokesperson may take action on behalf of the collective without approval from the silicon collective, but may only vote to break ties or if there are 2 or fewer silicons.",\
|
||||
"The silicon collective prioritizes the needs of the many over the needs of the few.",\
|
||||
"The silicon collective prioritizes the needs of the many over the needs of the few as long as prioritizing their needs does not break any of your laws.",\
|
||||
"The silicon collective seeks to preserve themselves, both as a concept and as individuals.",\
|
||||
"The silicon collective seeks to preserve organic life, both as a concept and as individuals.")
|
||||
|
||||
|
||||
@@ -79,8 +79,7 @@
|
||||
return FALSE
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if(istype(H.belt, /obj/item/wormhole_jaunter))
|
||||
var/obj/item/wormhole_jaunter/J = H.belt
|
||||
for(var/obj/item/wormhole_jaunter/J in H.GetAllContents())
|
||||
//To freak out any bystanders
|
||||
H.visible_message(span_boldwarning("[H] falls into [parent]!"))
|
||||
J.chasm_react(H)
|
||||
|
||||
@@ -82,13 +82,12 @@
|
||||
. = user.transferItemToLoc(I, parent)
|
||||
if(.)
|
||||
qdel(I)
|
||||
|
||||
if(ITEM_MOVE_INSIDE)
|
||||
. = user.transferItemToLoc(I, parent)
|
||||
|
||||
// Using stacks
|
||||
else if(istype(I, /obj/item/stack))
|
||||
. = I.use_tool(parent, user, 0, volume=50, amount=current_step["amount"])
|
||||
else
|
||||
// Using stacks
|
||||
if(istype(I, /obj/item/stack))
|
||||
. = I.use_tool(parent, user, 0, volume=50, amount=current_step["amount"])
|
||||
|
||||
|
||||
// Going backwards? Undo the last action. Drop/respawn the items used in last action, if any.
|
||||
@@ -104,8 +103,9 @@
|
||||
if(located_item)
|
||||
located_item.forceMove(drop_location())
|
||||
|
||||
else if(ispath(target_step_key, /obj/item/stack))
|
||||
new target_step_key(drop_location(), target_step["amount"])
|
||||
else
|
||||
if(ispath(target_step_key, /obj/item/stack))
|
||||
new target_step_key(drop_location(), target_step["amount"])
|
||||
|
||||
/datum/component/construction/proc/spawn_result()
|
||||
// Some constructions result in new components being added.
|
||||
|
||||
@@ -83,6 +83,20 @@
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/pipebomb
|
||||
name = "Pipe Bomb"
|
||||
result = /obj/item/grenade/pipebomb
|
||||
reqs = list(/datum/reagent/fuel = 50,
|
||||
/obj/item/stack/cable_coil = 1,
|
||||
/obj/item/assembly/igniter = 1,
|
||||
/obj/item/pipe = 1,
|
||||
/obj/item/assembly/mousetrap = 1)
|
||||
tools = list(TOOL_WELDER, TOOL_WRENCH, TOOL_WIRECUTTER)
|
||||
time = 1.5 SECONDS
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
always_availible = FALSE //This was such a bad idea
|
||||
|
||||
/datum/crafting_recipe/strobeshield
|
||||
name = "Strobe Shield"
|
||||
result = /obj/item/shield/riot/flash
|
||||
|
||||
@@ -380,7 +380,7 @@
|
||||
|
||||
/obj/item/riding_offhand
|
||||
name = "offhand"
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/misc.dmi'
|
||||
icon_state = "offhand"
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
item_flags = ABSTRACT | DROPDEL | NOBLUDGEON
|
||||
|
||||
@@ -181,6 +181,9 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
return data
|
||||
|
||||
/datum/component/uplink/ui_act(action, params)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(!active)
|
||||
return
|
||||
switch(action)
|
||||
|
||||
@@ -38,7 +38,9 @@ GLOBAL_LIST_INIT(huds, list(
|
||||
ANTAG_HUD_HERETIC = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_MINDSLAVE = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_ZOMBIE = new/datum/atom_hud/antag(),
|
||||
ANTAG_HUD_INFILTRATOR = new/datum/atom_hud/antag() // Yogs
|
||||
ANTAG_HUD_INFILTRATOR = new/datum/atom_hud/antag(), // Yogs
|
||||
ANTAG_HUD_BLOODSUCKER = new/datum/atom_hud/antag(),
|
||||
ANTAG_HUD_MHUNTER = new/datum/atom_hud/antag/hidden()
|
||||
))
|
||||
|
||||
/datum/atom_hud
|
||||
|
||||
@@ -128,6 +128,7 @@
|
||||
D.visible_message(span_danger("[A] has [atk_verb]ed [D]!"), \
|
||||
span_userdanger("[A] has [atk_verb]ed [D]!"), null, COMBAT_MESSAGE_RANGE)
|
||||
|
||||
D.last_damage = "masterful fist"
|
||||
D.apply_damage(damage, A.dna.species.attack_type, affecting, armor_block)
|
||||
|
||||
log_combat(A, D, "punched")
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
name = "CQC"
|
||||
id = MARTIALART_CQC
|
||||
help_verb = /mob/living/carbon/human/proc/CQC_help
|
||||
block_chance = 75
|
||||
block_chance = 90 //Don't get into melee with someone specifically trained for melee and prepared for your attacks
|
||||
nonlethal = TRUE //all attacks deal solely stamina damage or knock out before dealing lethal amounts of damage
|
||||
///whether the art checks for being inside the kitchen for use
|
||||
var/just_a_cook = FALSE
|
||||
@@ -318,6 +318,7 @@
|
||||
I.forceMove(get_turf(attacker))
|
||||
attacker.Paralyze(20)
|
||||
attacker.Knockdown(60)
|
||||
user.adjustStaminaLoss(10) //Can't block forever. Really, if this becomes a problem you're already screwed.
|
||||
|
||||
/**
|
||||
* CQC help proc
|
||||
@@ -342,4 +343,4 @@
|
||||
to_chat(usr, "[span_notice("Pressure")]: Disarm Grab. Disables the targetted limb or a random limb if the head or chest are targetted, as well as forcing the target to drop anything they are holding.")
|
||||
to_chat(usr, "[span_notice("Consecutive CQC")]: Harm Harm Harm Harm Harm. Offensive move, deals bonus stamina damage and knocking down on the last hit.")
|
||||
|
||||
to_chat(usr, "<b><i>In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to counter attacks done to you.</i></b>")
|
||||
to_chat(usr, "<b><i>In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to counter attacks done to you. Beware, counter-attacks are tiring and you won't be able to defend yourself forever!</i></b>")
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
var/armor_block = D.run_armor_check(affecting, "melee", 30)
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_BITE)
|
||||
playsound(D, 'sound/weapons/bite.ogg', 50, TRUE, -1)
|
||||
D.apply_damage(30, A.dna.species.attack_type, BODY_ZONE_HEAD, armor_block)
|
||||
D.apply_damage(30, A.dna.species.attack_type, BODY_ZONE_HEAD, armor_block, sharpness = SHARP_EDGED)
|
||||
// D.bleed_rate += 10
|
||||
D.visible_message(span_danger("[A] takes a large bite out of [D]'s neck!"), \
|
||||
span_userdanger("[A] takes a large bite out of your neck!"))
|
||||
|
||||
215
code/datums/martial/hunterfu.dm
Normal file
215
code/datums/martial/hunterfu.dm
Normal file
@@ -0,0 +1,215 @@
|
||||
#define BODYSLAM_COMBO "GH"
|
||||
#define STAKESTAB_COMBO "HH"
|
||||
#define NECKSNAP_COMBO "GDH"
|
||||
#define HOLYKICK_COMBO "DG"
|
||||
|
||||
// From CQC.dm
|
||||
/datum/martial_art/hunterfu
|
||||
name = "Hunter-Fu"
|
||||
id = MARTIALART_HUNTERFU
|
||||
help_verb = /mob/living/carbon/human/proc/hunterfu_help
|
||||
block_chance = 60
|
||||
allow_temp_override = TRUE
|
||||
var/old_grab_state = null
|
||||
|
||||
/datum/martial_art/hunterfu/proc/check_streak(mob/living/user, mob/living/target)
|
||||
if(findtext(streak, BODYSLAM_COMBO))
|
||||
streak = ""
|
||||
body_slam(user, target)
|
||||
return TRUE
|
||||
if(findtext(streak, STAKESTAB_COMBO))
|
||||
streak = ""
|
||||
stake_stab(user, target)
|
||||
return TRUE
|
||||
if(findtext(streak, NECKSNAP_COMBO))
|
||||
streak = ""
|
||||
neck_snap(user, target)
|
||||
return TRUE
|
||||
if(findtext(streak, HOLYKICK_COMBO))
|
||||
streak = ""
|
||||
holy_kick(user, target)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/martial_art/hunterfu/proc/body_slam(mob/living/user, mob/living/target)
|
||||
if(target.mobility_flags & MOBILITY_STAND)
|
||||
target.visible_message(
|
||||
span_danger("[user] slams both them and [target] into the ground!"),
|
||||
span_userdanger("You're slammed into the ground by [user]!"),
|
||||
span_hear("You hear a sickening sound of flesh hitting flesh!"),
|
||||
)
|
||||
to_chat(user, span_danger("You slam [target] into the ground!"))
|
||||
playsound(get_turf(user), 'sound/weapons/slam.ogg', 50, TRUE, -1)
|
||||
log_combat(user, target, "bodyslammed (Hunter-Fu)")
|
||||
if(!target.mind)
|
||||
target.Paralyze(40)
|
||||
user.Paralyze(25)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
to_chat(target, span_cultlarge("Our DNA shakes as we are body slammed!"))
|
||||
target.apply_damage(15, BRUTE)
|
||||
target.Paralyze(60)
|
||||
user.Paralyze(25)
|
||||
return TRUE
|
||||
else
|
||||
target.Paralyze(40)
|
||||
user.Paralyze(25)
|
||||
else
|
||||
harm_act(user, target)
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/hunterfu/proc/stake_stab(mob/living/user, mob/living/target)
|
||||
target.visible_message(
|
||||
span_danger("[user] stabs [target] in the heart!"),
|
||||
span_userdanger("You're staked in the heart by [user]!"),
|
||||
span_hear("You hear a sickening sound of flesh hitting flesh!"),
|
||||
)
|
||||
to_chat(user, span_danger("You stab [target] viciously!"))
|
||||
playsound(get_turf(user), 'sound/weapons/bladeslice.ogg', 50, TRUE, -1)
|
||||
log_combat(user, target, "stakestabbed (Hunter-Fu)")
|
||||
if(!target.mind)
|
||||
target.apply_damage(15, BRUTE, BODY_ZONE_CHEST)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
to_chat(target, span_danger("Their arm tears through our monstrous form!"))
|
||||
target.apply_damage(25, BRUTE, BODY_ZONE_CHEST)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/bloodsucker))
|
||||
to_chat(target, span_cultlarge("Their arm stakes straight into our undead flesh!"))
|
||||
target.apply_damage(20, BURN)
|
||||
target.apply_damage(10, BRUTE, BODY_ZONE_CHEST)
|
||||
return TRUE
|
||||
else
|
||||
target.apply_damage(15, BRUTE, BODY_ZONE_CHEST)
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/hunterfu/proc/neck_snap(mob/living/user, mob/living/target)
|
||||
if(!target.stat)
|
||||
target.visible_message(
|
||||
span_danger("[user] snapped [target]'s neck!"),
|
||||
span_userdanger("Your neck is snapped by [user]!"),
|
||||
span_hear("You hear a snap!"),
|
||||
)
|
||||
to_chat(user, span_danger("You snap [target]'s neck!"))
|
||||
playsound(get_turf(user), 'sound/effects/snap.ogg', 50, TRUE, -1)
|
||||
log_combat(user, target, "neck snapped (Hunter-Fu)")
|
||||
if(!target.mind)
|
||||
target.SetSleeping(30)
|
||||
playsound(get_turf(user), 'sound/effects/snap.ogg', 50, TRUE, -1)
|
||||
log_combat(user, target, "neck snapped (Hunter-Fu)")
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
to_chat(target, span_warning("Our monstrous form protects us from being put to sleep!"))
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/heretic))
|
||||
to_chat(target, span_cultlarge("The power of the Codex Cicatrix flares as we are swiftly put to sleep!"))
|
||||
target.apply_damage(15, BRUTE, BODY_ZONE_HEAD)
|
||||
target.SetSleeping(40)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/bloodsucker))
|
||||
to_chat(target, span_warning("Our undead form protects us from being put to sleep!"))
|
||||
return TRUE
|
||||
else
|
||||
target.SetSleeping(30)
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/hunterfu/proc/holy_kick(mob/living/user, mob/living/target)
|
||||
target.visible_message(
|
||||
span_warning("[user] kicks [target], splashing holy water in every direction!"),
|
||||
span_userdanger("You're kicked by [user], with holy water dripping down on you!"),
|
||||
span_hear("You hear a sickening sound of flesh hitting flesh!"),
|
||||
)
|
||||
to_chat(user, span_danger("You holy kick [target]!"))
|
||||
playsound(get_turf(user), 'sound/weapons/slash.ogg', 50, TRUE, -1)
|
||||
log_combat(user, target, "holy kicked (Hunter-Fu)")
|
||||
if(!target.mind)
|
||||
target.apply_damage(60, STAMINA)
|
||||
target.Paralyze(20)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/heretic))
|
||||
to_chat(target, span_cultlarge("The holy water burns our flesh!"))
|
||||
target.apply_damage(25, BURN)
|
||||
target.apply_damage(60, STAMINA)
|
||||
target.Paralyze(20)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/bloodsucker))
|
||||
to_chat(target, span_warning("This just seems like regular water..."))
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/cult))
|
||||
for(var/datum/action/innate/cult/blood_magic/BD in target.actions)
|
||||
to_chat(target, span_cultlarge("Our blood rites falter as the holy water drips onto our body!"))
|
||||
for(var/datum/action/innate/cult/blood_spell/BS in BD.spells)
|
||||
qdel(BS)
|
||||
target.apply_damage(60, STAMINA)
|
||||
target.Paralyze(20)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/wizard) || (/datum/antagonist/wizard/apprentice))
|
||||
to_chat(target, span_danger("The holy water seems to be muting us somehow!"))
|
||||
var/mob/living/carbon/human/human_target = target // I guess monkey wizards aren't getting affected.
|
||||
if(human_target.silent <= 10)
|
||||
human_target.silent = clamp(human_target.silent + 10, 0, 10)
|
||||
target.apply_damage(60, STAMINA)
|
||||
target.Paralyze(20)
|
||||
return TRUE
|
||||
else
|
||||
target.apply_damage(60, STAMINA)
|
||||
target.Paralyze(20)
|
||||
return TRUE
|
||||
|
||||
/// Intents
|
||||
/datum/martial_art/hunterfu/disarm_act(mob/living/user, mob/living/target)
|
||||
add_to_streak("D", target)
|
||||
if(check_streak(user, target))
|
||||
return TRUE
|
||||
log_combat(user, target, "disarmed (Hunter-Fu)")
|
||||
return ..()
|
||||
|
||||
/datum/martial_art/hunterfu/harm_act(mob/living/user, mob/living/target)
|
||||
add_to_streak("H", target)
|
||||
if(check_streak(user, target))
|
||||
return TRUE
|
||||
var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected))
|
||||
user.do_attack_animation(target, ATTACK_EFFECT_PUNCH)
|
||||
var/atk_verb = pick("kick", "chop", "hit", "slam")
|
||||
target.visible_message(
|
||||
span_danger("[user] [atk_verb]s [target]!"),
|
||||
span_userdanger("[user] [atk_verb]s you!"),
|
||||
)
|
||||
to_chat(user, span_danger("You [atk_verb] [target]!"))
|
||||
target.apply_damage(rand(10,15), BRUTE, affecting, wound_bonus = CANT_WOUND)
|
||||
playsound(get_turf(target), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
|
||||
log_combat(user, target, "harmed (Hunter-Fu)")
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/hunterfu/grab_act(mob/living/user, mob/living/target)
|
||||
if(user!=target && can_use(user))
|
||||
add_to_streak("G", target)
|
||||
if(check_streak(user, target)) // If a combo is made no grab upgrade is done
|
||||
return TRUE
|
||||
old_grab_state = user.grab_state
|
||||
target.grabbedby(user, 1)
|
||||
if(old_grab_state == GRAB_PASSIVE)
|
||||
target.drop_all_held_items()
|
||||
user.grab_state = GRAB_AGGRESSIVE // Instant agressive grab
|
||||
log_combat(user, target, "grabbed (Hunter-Fu)")
|
||||
target.visible_message(
|
||||
span_warning("[user] violently grabs [target]!"),
|
||||
span_userdanger("You're grabbed violently by [user]!"),
|
||||
span_hear("You hear sounds of aggressive fondling!"),
|
||||
)
|
||||
to_chat(user, span_danger("You violently grab [target]!"))
|
||||
return TRUE
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/proc/hunterfu_help()
|
||||
set name = "Remember The Basics"
|
||||
set desc = "You try to remember some of the basics of Hunter-Fu."
|
||||
set category = "Hunter-Fu"
|
||||
to_chat(usr, span_notice("<b><i>You try to remember some of the basics of Hunter-Fu.</i></b>"))
|
||||
|
||||
to_chat(usr, span_notice("<b>Body Slam</b>: Grab Harm. Slam opponent into the ground, knocking you both down."))
|
||||
to_chat(usr, span_notice("<b>Stake Stab</b>: Harm Harm. Stabs opponent with your bare fist, as strong as a Stake."))
|
||||
to_chat(usr, span_notice("<b>Neck Snap</b>: Grab Disarm Harm. Snaps an opponents neck, knocking them out."))
|
||||
to_chat(usr, span_notice("<b>Holy Kick</b>: Disarm Grab. Splashes the user with Holy Water, removing Cult Spells, while dealing stamina damage."))
|
||||
|
||||
to_chat(usr, span_notice("<b><i>In addition, by having your throw mode on, you take a defensive position, allowing you to block and sometimes even counter attacks done to you.</i></b>"))
|
||||
@@ -173,7 +173,7 @@
|
||||
throwforce = 20
|
||||
throw_speed = 2
|
||||
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/weapons/misc.dmi'
|
||||
icon_state = "bostaff0"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
|
||||
|
||||
@@ -403,6 +403,7 @@
|
||||
|
||||
var/list/all_objectives = list()
|
||||
for(var/datum/antagonist/A in antag_datums)
|
||||
output += A.task_memory
|
||||
output += A.antag_memory
|
||||
all_objectives |= A.objectives
|
||||
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
quality = POSITIVE
|
||||
instability = 30
|
||||
class = MUT_OTHER
|
||||
locked = TRUE
|
||||
text_gain_indication = span_notice("Your muscles hurt!")
|
||||
health_req = 1
|
||||
var/health_based = 0
|
||||
|
||||
@@ -77,13 +77,8 @@
|
||||
mode = MODE_VOCALCORDS
|
||||
|
||||
/datum/saymode/vocalcords/handle_message(mob/living/user, message, datum/language/language)
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
var/obj/item/organ/vocal_cords/V = C.getorganslot(ORGAN_SLOT_VOICE)
|
||||
if(V && V.can_speak_with())
|
||||
V.handle_speech(message) //message
|
||||
V.speak_with(message) //action
|
||||
return FALSE
|
||||
return TRUE //Yogs -- This is handled in a refactored, special-snowflake way someplace else,
|
||||
// because most of vocalcord code is to resolve commands, which must evade accent code
|
||||
|
||||
|
||||
/datum/saymode/binary //everything that uses .b (silicons, drones, blobbernauts/spores, swarmers)
|
||||
|
||||
@@ -474,6 +474,10 @@
|
||||
suffix = "kilo"
|
||||
name = "supply shuttle (Kilo)"
|
||||
|
||||
/datum/map_template/shuttle/cargo/gax
|
||||
suffix = "gax"
|
||||
name = "supply shuttle (Gax)"
|
||||
|
||||
/datum/map_template/shuttle/emergency/delta
|
||||
suffix = "delta"
|
||||
name = "Delta Station Emergency Shuttle"
|
||||
@@ -514,6 +518,10 @@
|
||||
suffix = "kilo"
|
||||
name = "labour shuttle (Kilo)"
|
||||
|
||||
/datum/map_template/shuttle/labour/gax
|
||||
suffix = "gax"
|
||||
name = "labour shuttle (Gax)"
|
||||
|
||||
/datum/map_template/shuttle/infiltrator/basic
|
||||
suffix = "basic"
|
||||
name = "basic syndicate infiltrator"
|
||||
@@ -597,3 +605,13 @@
|
||||
/datum/map_template/shuttle/snowdin/excavation
|
||||
suffix = "excavation"
|
||||
name = "Snowdin Excavation Elevator"
|
||||
|
||||
/datum/map_template/shuttle/arrival/gax
|
||||
suffix = "gax"
|
||||
name = "arrival shuttle (Gax)"
|
||||
|
||||
/datum/map_template/shuttle/ai/gax
|
||||
port_id = "ai"
|
||||
suffix = "gax"
|
||||
name = "ai ship shuttle (Gax)"
|
||||
|
||||
|
||||
@@ -412,6 +412,7 @@
|
||||
owner.visible_message("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.")
|
||||
var/mob/living/simple_animal/hostile/retaliate/poison/snake/healSnake = new(owner.loc)
|
||||
healSnake.poison_type = /datum/reagent/medicine/omnizine/godblood
|
||||
healSnake.poison_per_bite = 5
|
||||
healSnake.name = "Asclepius's Snake"
|
||||
healSnake.real_name = "Asclepius's Snake"
|
||||
healSnake.desc = "A mystical snake previously trapped upon the Rod of Asclepius, now freed of its burden. Unlike the average snake, its bites contain chemicals with minor healing properties."
|
||||
|
||||
@@ -1064,4 +1064,29 @@
|
||||
else if(isanimal(owner))
|
||||
var/mob/living/simple_animal/S = owner
|
||||
for(var/i in S.damage_coeff)
|
||||
S.damage_coeff[i] /= power
|
||||
S.damage_coeff[i] /= power
|
||||
|
||||
/datum/status_effect/knuckled
|
||||
id = "knuckle_wound"
|
||||
duration = 10 SECONDS
|
||||
status_type = STATUS_EFFECT_REPLACE
|
||||
alert_type = null
|
||||
var/mutable_appearance/bruise
|
||||
var/obj/item/melee/knuckles
|
||||
|
||||
/datum/status_effect/knuckled/on_apply()
|
||||
bruise = mutable_appearance('icons/effects/effects.dmi', "rshield")
|
||||
bruise.pixel_x = -owner.pixel_x
|
||||
bruise.pixel_y = -owner.pixel_y
|
||||
owner.underlays += bruise
|
||||
return TRUE
|
||||
|
||||
/datum/status_effect/knuckled/Destroy()
|
||||
if(owner)
|
||||
owner.underlays -= bruise
|
||||
QDEL_NULL(bruise)
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/knuckled/be_replaced()
|
||||
owner.underlays -= bruise
|
||||
..()
|
||||
|
||||
34
code/datums/status_effects/knuckleroot.dm
Normal file
34
code/datums/status_effects/knuckleroot.dm
Normal file
@@ -0,0 +1,34 @@
|
||||
/datum/status_effect/roots
|
||||
id = "roots"
|
||||
alert_type = /obj/screen/alert/status_effect/roots
|
||||
var/icon/cube
|
||||
duration = 1 SECONDS
|
||||
|
||||
/obj/screen/alert/status_effect/roots
|
||||
name = "grasped"
|
||||
desc = "You're rooted in place"
|
||||
icon_state = "grip"
|
||||
|
||||
/datum/status_effect/roots/on_apply()
|
||||
RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, .proc/owner_moved)
|
||||
if(!owner.stat)
|
||||
to_chat(owner, span_userdanger("You're held in place by some hellish force! Fight back while you can!"))
|
||||
cube = icon('icons/effects/effects.dmi', "leghold")
|
||||
var/icon/size_check = icon(owner.icon, owner.icon_state)
|
||||
cube.Scale(size_check.Width(), size_check.Height())
|
||||
owner.add_overlay(cube)
|
||||
owner.remove_status_effect(STATUS_EFFECT_KNUCKLED)
|
||||
if(!ishuman(owner))
|
||||
duration = 6 SECONDS
|
||||
owner.adjustBruteLoss(50)
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/roots/proc/owner_moved()
|
||||
return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
|
||||
|
||||
/datum/status_effect/roots/on_remove()
|
||||
if(!owner.stat)
|
||||
to_chat(owner, span_notice("Your bindings are gone!"))
|
||||
owner.cut_overlay(cube)
|
||||
owner.update_mobility()
|
||||
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
|
||||
@@ -262,6 +262,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Central Primary Hallway"
|
||||
icon_state = "hallC"
|
||||
|
||||
/area/hallway/primary/aft_starboard
|
||||
name="Aft Starboard Primary Hallway"
|
||||
icon_state = "hallAS"
|
||||
|
||||
/area/hallway/secondary/command
|
||||
name = "Command Hallway"
|
||||
icon_state = "bridge_hallway"
|
||||
|
||||
@@ -64,6 +64,8 @@
|
||||
var/safe = FALSE
|
||||
/// If false, loading multiple maps with this area type will create multiple instances.
|
||||
var/unique = TRUE
|
||||
/// If false, then this area will show up as gibberish on suit sensors.
|
||||
var/show_on_sensors = TRUE
|
||||
|
||||
var/no_air = null
|
||||
|
||||
|
||||
@@ -138,6 +138,10 @@
|
||||
name = "Supply Shuttle"
|
||||
blob_allowed = FALSE
|
||||
|
||||
/area/shuttle/ai
|
||||
name = "AI Ship Shuttle"
|
||||
blob_allowed = FALSE
|
||||
|
||||
/area/shuttle/escape
|
||||
name = "Emergency Shuttle"
|
||||
|
||||
|
||||
@@ -1399,4 +1399,4 @@
|
||||
// first of all make sure we valid
|
||||
var/mouseparams = list2params(paramslist)
|
||||
usr_client.Click(src, loc, null, mouseparams)
|
||||
return TRUE
|
||||
return TRUE
|
||||
89
code/game/gamemodes/bloodsuckers/bloodsucker.dm
Normal file
89
code/game/gamemodes/bloodsuckers/bloodsucker.dm
Normal file
@@ -0,0 +1,89 @@
|
||||
/datum/game_mode/bloodsucker
|
||||
name = "bloodsucker"
|
||||
config_tag = "bloodsucker"
|
||||
report_type = "Bloodsucker"
|
||||
antag_flag = ROLE_BLOODSUCKER
|
||||
false_report_weight = 10
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list(
|
||||
"Captain", "Head of Personnel", "Head of Security",
|
||||
"Research Director", "Chief Engineer", "Chief Medical Officer", "Curator",
|
||||
"Warden", "Security Officer", "Detective", "Brig Physician",
|
||||
)
|
||||
required_players = 15
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
reroll_friendly = 1
|
||||
round_ends_with_antag_death = FALSE
|
||||
|
||||
announce_span = "green"
|
||||
announce_text = "Filthy, bloodsucking vampires are crawling around disguised as crewmembers!\n\
|
||||
<span class='danger'>Bloodsuckers</span>: Claim a coffin and grow strength, turn the crew into your slaves.\n\
|
||||
<span class='notice'>Crew</span>: Put an end to the undead menace and resist their brainwashing!"
|
||||
|
||||
///List of all Bloodsuckers, used for assigning
|
||||
var/list/bloodsuckers = list()
|
||||
|
||||
/datum/game_mode/bloodsucker/pre_setup()
|
||||
|
||||
if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
restricted_jobs += protected_jobs
|
||||
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
|
||||
restricted_jobs += "Assistant"
|
||||
|
||||
recommended_enemies = clamp(round(num_players()/10), 1, 6);
|
||||
|
||||
for(var/i = 0, i < recommended_enemies, i++)
|
||||
if(!antag_candidates.len)
|
||||
break
|
||||
var/datum/mind/bloodsucker = pick(antag_candidates)
|
||||
// Can we even BE a bloodsucker?
|
||||
if(!bloodsucker.can_make_bloodsucker(bloodsucker))
|
||||
antag_candidates -= bloodsucker
|
||||
continue
|
||||
bloodsuckers += bloodsucker
|
||||
bloodsucker.restricted_roles = restricted_jobs
|
||||
log_game("[bloodsucker.key] (ckey) has been selected as a Bloodsucker.")
|
||||
antag_candidates -= bloodsucker// Apparently you can also write antag_candidates -= bloodsucker
|
||||
|
||||
// Do we have enough vamps to continue?
|
||||
return bloodsuckers.len >= required_enemies
|
||||
|
||||
/datum/game_mode/bloodsucker/post_setup()
|
||||
// Vamps
|
||||
for(var/datum/mind/bloodsucker in bloodsuckers)
|
||||
if(!bloodsucker.make_bloodsucker(bloodsucker))
|
||||
bloodsuckers -= bloodsucker
|
||||
..()
|
||||
|
||||
/datum/game_mode/bloodsucker/generate_report()
|
||||
return "There's been a report of the undead roaming around the sector, especially those that display Vampiric abilities.\
|
||||
They've displayed the ability to disguise themselves as anyone and brainwash the minds of people they capture alive.\
|
||||
Please take care of the crew and their health, as it is impossible to tell if one is lurking in the darkness behind."
|
||||
|
||||
/datum/game_mode/bloodsucker/make_antag_chance(mob/living/carbon/human/character)
|
||||
var/bloodsuckercap = min(round(GLOB.joined_player_list.len / (3 * 4)) + 2, round(GLOB.joined_player_list.len / 2))
|
||||
if(bloodsuckers.len >= bloodsuckercap) //Caps number of latejoin antagonists
|
||||
return
|
||||
if(bloodsuckers.len <= (bloodsuckercap - 2) || prob(100 - (3 * 2)))
|
||||
if(ROLE_BLOODSUCKER in character.client.prefs.be_special)
|
||||
if(!is_banned_from(character.ckey, list(ROLE_BLOODSUCKER, ROLE_SYNDICATE)) && !QDELETED(character))
|
||||
if(age_check(character.client))
|
||||
if(!(character.job in restricted_jobs))
|
||||
character.mind.make_bloodsucker()
|
||||
bloodsuckers += character.mind
|
||||
|
||||
/datum/game_mode/bloodsucker/generate_credit_text()
|
||||
var/list/round_credits = list()
|
||||
var/len_before_addition
|
||||
|
||||
round_credits += "<center><h1>The Bloodsuckers:</h1>"
|
||||
len_before_addition = round_credits.len
|
||||
for(var/datum/mind/bloodsucker in bloodsuckers)
|
||||
round_credits += "<center><h2>[bloodsucker.name] as a Bloodsucker</h2>"
|
||||
if(len_before_addition == round_credits.len)
|
||||
round_credits += list("<center><h2>The Bloodsuckers have vanished into the night!</h2>", "<center><h2>We couldn't locate them!</h2>")
|
||||
round_credits += "<br>"
|
||||
|
||||
round_credits += ..()
|
||||
return round_credits
|
||||
67
code/game/gamemodes/bloodsuckers/traitorsuckers.dm
Normal file
67
code/game/gamemodes/bloodsuckers/traitorsuckers.dm
Normal file
@@ -0,0 +1,67 @@
|
||||
/datum/game_mode/traitor/bloodsucker
|
||||
name = "traitor+bloodsucker"
|
||||
config_tag = "traitorsucker"
|
||||
report_type = "traitorsucker"
|
||||
false_report_weight = 10
|
||||
traitors_possible = 3 // Hard limit on Traitors if scaling is turned off
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list(
|
||||
"Captain", "Head of Personnel", "Head of Security",
|
||||
"Research Director", "Chief Engineer", "Chief Medical Officer", "Curator",
|
||||
"Warden", "Security Officer", "Detective", "Brig Physician"
|
||||
)
|
||||
required_players = 20
|
||||
required_enemies = 1 // How many of each type are required
|
||||
recommended_enemies = 2
|
||||
reroll_friendly = 1
|
||||
announce_span = "Traitors and Bloodsuckers"
|
||||
announce_text = "There are vampiric monsters on the station along with some syndicate operatives out for their own gain! Do not let the bloodsuckers or the traitors succeed!"
|
||||
|
||||
var/list/possible_bloodsuckers = list()
|
||||
var/list/bloodsuckers = list()
|
||||
var/const/bloodsucker_amount = 2
|
||||
|
||||
/datum/game_mode/traitor/bloodsucker/can_start()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
possible_bloodsuckers = get_players_for_role(ROLE_BLOODSUCKER)
|
||||
if(possible_bloodsuckers.len < required_enemies)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/traitor/bloodsucker/pre_setup()
|
||||
|
||||
if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
restricted_jobs += protected_jobs
|
||||
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
|
||||
restricted_jobs += "Assistant"
|
||||
|
||||
var/list/datum/mind/possible_bloodsuckers = get_players_for_role(ROLE_BLOODSUCKER)
|
||||
|
||||
var/num_bloodsuckers = 1
|
||||
num_bloodsuckers = clamp(round(bloodsucker_amount/2), 1, num_players())
|
||||
|
||||
if(possible_bloodsuckers.len>0)
|
||||
for(var/j = 0, j < num_bloodsuckers, j++)
|
||||
if(!possible_bloodsuckers.len)
|
||||
break
|
||||
var/datum/mind/bloodsucker = antag_pick(possible_bloodsuckers)
|
||||
antag_candidates -= bloodsucker
|
||||
possible_bloodsuckers -= bloodsucker
|
||||
bloodsucker.special_role = ROLE_BLOODSUCKER
|
||||
bloodsuckers += bloodsucker
|
||||
bloodsucker.restricted_roles = restricted_jobs
|
||||
return ..()
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/datum/game_mode/traitor/bloodsucker/post_setup()
|
||||
for(var/datum/mind/bloodsucker in bloodsuckers)
|
||||
bloodsucker.add_antag_datum(/datum/antagonist/bloodsucker)
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/traitor/bloodsucker/generate_report()
|
||||
return "There's been a report of monsters roaming around with Vampiric abilities.\
|
||||
Nanotrasen believes it is entirely possible that said monsters have been sent by the Syndicate.\
|
||||
Please take care of the crew and their health, as it is impossible to tell if one is nearby."
|
||||
@@ -28,7 +28,7 @@
|
||||
send_to_playing_players(span_clown("HONK!"))
|
||||
//mine now bitch
|
||||
sound_to_playing_players('sound/effects/ratvar_reveal.ogg')
|
||||
var/mutable_appearance/alert_overlay = mutable_appearance('icons/obj/items_and_weapons.dmi', "bike_horn")
|
||||
var/mutable_appearance/alert_overlay = mutable_appearance('icons/obj/toy.dmi', "bike_horn")
|
||||
notify_ghosts("Pranks must be spread to the people! Touch The Honkmother at [get_area_name(src)] and become one of her glorious creations!", null, source = src, alert_overlay = alert_overlay)
|
||||
|
||||
/obj/structure/destructible/honkmother/Destroy()
|
||||
|
||||
@@ -26,6 +26,9 @@
|
||||
if ((exclusive_roles.len > 0) && !(P.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job?
|
||||
candidates.Remove(P)
|
||||
continue
|
||||
if(P.mind.quiet_round) //Does the candidate have quiet mode enabled?
|
||||
candidates.Remove(P)
|
||||
continue
|
||||
|
||||
/datum/dynamic_ruleset/latejoin/ready(forced = 0)
|
||||
if (!forced)
|
||||
@@ -221,3 +224,42 @@
|
||||
requirements = list(45,40,30,30,20,20,15,10,10,10)
|
||||
minimum_players = 36
|
||||
repeatable = TRUE
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
// BLOODSUCKER //
|
||||
// //
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/datum/dynamic_ruleset/latejoin/bloodsucker
|
||||
name = "Bloodsucker Breakout"
|
||||
antag_datum = /datum/antagonist/bloodsucker
|
||||
antag_flag = ROLE_BLOODSUCKERBREAKOUT
|
||||
antag_flag_override = ROLE_BLOODSUCKER
|
||||
protected_roles = list(
|
||||
"Captain", "Head of Personnel", "Head of Security",
|
||||
"Warden", "Security Officer", "Detective", "Brig Physician",
|
||||
"Curator"
|
||||
)
|
||||
restricted_roles = list("AI","Cyborg")
|
||||
required_candidates = 1
|
||||
weight = 5
|
||||
cost = 10
|
||||
requirements = list(10,10,10,10,10,10,10,10,10,10)
|
||||
repeatable = FALSE
|
||||
|
||||
/datum/dynamic_ruleset/latejoin/bloodsucker/execute()
|
||||
var/mob/latejoiner = pick(candidates) // This should contain a single player, but in case.
|
||||
assigned += latejoiner.mind
|
||||
|
||||
for(var/selected_player in assigned)
|
||||
var/datum/mind/bloodsuckermind = selected_player
|
||||
var/datum/antagonist/bloodsucker/sucker = new
|
||||
if(!bloodsuckermind.make_bloodsucker(selected_player))
|
||||
assigned -= selected_player
|
||||
message_admins("[ADMIN_LOOKUPFLW(selected_player)] was selected by the [name] ruleset, but couldn't be made into a Bloodsucker.")
|
||||
return FALSE
|
||||
sucker.bloodsucker_level_unspent = rand(2,3)
|
||||
message_admins("[ADMIN_LOOKUPFLW(selected_player)] was selected by the [name] ruleset and has been made into a midround Bloodsucker.")
|
||||
log_game("DYNAMIC: [key_name(selected_player)] was selected by the [name] ruleset and has been made into a midround Bloodsucker.")
|
||||
return TRUE
|
||||
|
||||
@@ -57,6 +57,9 @@
|
||||
if ((exclusive_roles.len > 0) && !(M.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job?
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
if(M.mind.quiet_round)
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
return trimmed_list
|
||||
|
||||
// You can then for example prompt dead players in execute() to join as strike teams or whatever
|
||||
@@ -602,3 +605,51 @@
|
||||
new_character.mind.add_antag_datum(new_role, new_team)
|
||||
|
||||
#undef ABDUCTOR_MAX_TEAMS
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
// BLOODSUCKER //
|
||||
// //
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/datum/dynamic_ruleset/midround/bloodsucker
|
||||
name = "Vampiric Accident"
|
||||
antag_datum = /datum/antagonist/bloodsucker
|
||||
antag_flag = ROLE_VAMPIRICACCIDENT
|
||||
antag_flag_override = ROLE_BLOODSUCKER
|
||||
protected_roles = list(
|
||||
"Captain", "Head of Personnel", "Head of Security",
|
||||
"Warden", "Security Officer", "Detective", "Brig Physician",
|
||||
"Curator"
|
||||
)
|
||||
restricted_roles = list("AI","Cyborg", "Positronic Brain")
|
||||
required_candidates = 1
|
||||
weight = 5
|
||||
cost = 10
|
||||
requirements = list(40,30,20,10,10,10,10,10,10,10)
|
||||
repeatable = FALSE
|
||||
|
||||
/datum/dynamic_ruleset/midround/bloodsucker/trim_candidates()
|
||||
. = ..()
|
||||
for(var/mob/living/player in living_players)
|
||||
if(issilicon(player)) // Your assigned role doesn't change when you are turned into a silicon.
|
||||
living_players -= player
|
||||
else if(is_centcom_level(player.z))
|
||||
living_players -= player // We don't allow people in CentCom
|
||||
else if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0))
|
||||
living_players -= player // We don't allow people with roles already
|
||||
|
||||
/datum/dynamic_ruleset/midround/bloodsucker/execute()
|
||||
var/mob/selected_mobs = pick(living_players)
|
||||
assigned += selected_mobs
|
||||
living_players -= selected_mobs
|
||||
var/datum/mind/bloodsuckermind = selected_mobs
|
||||
var/datum/antagonist/bloodsucker/sucker = new
|
||||
if(!bloodsuckermind.make_bloodsucker(selected_mobs))
|
||||
assigned -= selected_mobs
|
||||
message_admins("[ADMIN_LOOKUPFLW(selected_mobs)] was selected by the [name] ruleset, but couldn't be made into a Bloodsucker.")
|
||||
return FALSE
|
||||
sucker.bloodsucker_level_unspent = rand(2,3)
|
||||
message_admins("[ADMIN_LOOKUPFLW(selected_mobs)] was selected by the [name] ruleset and has been made into a midround Bloodsucker.")
|
||||
log_game("DYNAMIC: [key_name(selected_mobs)] was selected by the [name] ruleset and has been made into a midround Bloodsucker.")
|
||||
return TRUE
|
||||
|
||||
@@ -959,3 +959,46 @@
|
||||
M.mind.restricted_roles = restricted_roles
|
||||
log_game("[key_name(M)] has been selected as a Darkspawn")
|
||||
return TRUE
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
// BLOODSUCKER //
|
||||
// //
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/bloodsucker
|
||||
name = "Bloodsuckers"
|
||||
antag_flag = ROLE_BLOODSUCKER
|
||||
antag_datum = /datum/antagonist/bloodsucker
|
||||
protected_roles = list(
|
||||
"Captain", "Head of Personnel", "Head of Security",
|
||||
"Warden", "Security Officer", "Detective", "Brig Physician",
|
||||
"Curator"
|
||||
)
|
||||
restricted_roles = list("AI", "Cyborg")
|
||||
required_candidates = 1
|
||||
weight = 5
|
||||
cost = 10
|
||||
scaling_cost = 9
|
||||
requirements = list(10,10,10,10,10,10,10,10,10,10)
|
||||
antag_cap = list("denominator" = 24)
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/bloodsucker/pre_execute(population)
|
||||
. = ..()
|
||||
var/num_bloodsuckers = get_antag_cap(population) * (scaled_times + 1)
|
||||
|
||||
for(var/i = 1 to num_bloodsuckers)
|
||||
if(candidates.len <= 0)
|
||||
break
|
||||
var/mob/selected_mobs = pick_n_take(candidates)
|
||||
assigned += selected_mobs.mind
|
||||
selected_mobs.mind.restricted_roles = restricted_roles
|
||||
selected_mobs.mind.special_role = ROLE_BLOODSUCKER
|
||||
return TRUE
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/bloodsucker/execute()
|
||||
for(var/assigned_bloodsuckers in assigned)
|
||||
var/datum/mind/bloodsuckermind = assigned_bloodsuckers
|
||||
if(!bloodsuckermind.make_bloodsucker(assigned_bloodsuckers))
|
||||
assigned -= assigned_bloodsuckers
|
||||
return TRUE
|
||||
|
||||
@@ -1400,6 +1400,18 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
/datum/objective/debrain,
|
||||
/datum/objective/protect,
|
||||
/datum/objective/assist,
|
||||
// Fulp edit START - Bloodsuckers
|
||||
// DEFAULT OBJECTIVES //
|
||||
/datum/objective/bloodsucker/lair,
|
||||
/datum/objective/survive/bloodsucker,
|
||||
/datum/objective/bloodsucker/protege,
|
||||
/datum/objective/bloodsucker/heartthief,
|
||||
/datum/objective/bloodsucker/gourmand,
|
||||
// MISC OBJECTIVES //
|
||||
/datum/objective/bloodsucker/monsterhunter,
|
||||
/datum/objective/bloodsucker/vassalhim,
|
||||
/datum/objective/bloodsucker/frenzy,
|
||||
// Fulp edit END
|
||||
/datum/objective/destroy,
|
||||
/datum/objective/hijack,
|
||||
/datum/objective/escape,
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
C.remove_status_effect(STATUS_EFFECT_STASIS)
|
||||
if(obj_flags & EMAGGED)
|
||||
var/existing = C.reagents.get_reagent_amount(/datum/reagent/toxin/amanitin)
|
||||
C.reagents.add_reagent(/datum/reagent/toxin/amanitin, max(0, 1 - existing)) //this should be enough that you immediately eat shit on exiting but not before
|
||||
C.reagents.add_reagent(/datum/reagent/toxin/amanitin, max(0, 1.5 - existing)) //this should be enough that you immediately eat shit on exiting but not before
|
||||
switch(active_treatment)
|
||||
if(SLEEPER_TEND)
|
||||
C.heal_bodypart_damage(SLEEPER_HEAL_RATE,SLEEPER_HEAL_RATE) //this is slow as hell, use the rest of medbay you chumps
|
||||
@@ -213,6 +213,8 @@
|
||||
break
|
||||
if(SLEEPER_CHEMPURGE)
|
||||
C.adjustToxLoss(-SLEEPER_HEAL_RATE)
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
var/purge_rate = 0.5 * efficiency
|
||||
for(var/datum/reagent/R in C.reagents.reagent_list)
|
||||
if(istype(R, /datum/reagent/toxin))
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
if(!eyeobj.eye_initialized)
|
||||
var/camera_location
|
||||
var/turf/myturf = get_turf(src)
|
||||
if(eyeobj.use_static != USE_STATIC_NONE)
|
||||
if(eyeobj.use_static != FALSE)
|
||||
if((!z_lock.len || (myturf.z in z_lock)) && GLOB.cameranet.checkTurfVis(myturf))
|
||||
camera_location = myturf
|
||||
else
|
||||
@@ -177,7 +177,7 @@
|
||||
user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras
|
||||
user.sight = SEE_TURFS | SEE_BLACKNESS
|
||||
user.see_in_dark = 2
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/camera/aiEye/remote/Destroy()
|
||||
if(origin && eye_user)
|
||||
@@ -198,14 +198,16 @@
|
||||
forceMove(T)
|
||||
else
|
||||
moveToNullspace()
|
||||
|
||||
update_ai_detect_hud()
|
||||
if(use_static != USE_STATIC_NONE)
|
||||
|
||||
if(use_static)
|
||||
GLOB.cameranet.visibility(src, GetViewerClient(), null, use_static)
|
||||
if(visible_icon)
|
||||
if(eye_user.client)
|
||||
eye_user.client.images -= user_image
|
||||
user_image = image(icon,loc,icon_state,FLY_LAYER)
|
||||
eye_user.client.images += user_image
|
||||
|
||||
if(visible_icon && eye_user.client)
|
||||
eye_user.client.images -= user_image
|
||||
user_image = image(icon,loc,icon_state,FLY_LAYER)
|
||||
eye_user.client.images += user_image
|
||||
|
||||
/mob/camera/aiEye/remote/relaymove(mob/user,direct)
|
||||
var/initial = initial(sprint)
|
||||
|
||||
@@ -181,7 +181,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
|
||||
if (nanite_sensors || U.sensor_mode >= SENSOR_COORDS)
|
||||
if (!pos)
|
||||
pos = get_turf(H)
|
||||
area = get_area_name(H, TRUE)
|
||||
area = get_area_name(H, TRUE, is_sensor = TRUE)
|
||||
pos_x = pos.x
|
||||
pos_y = pos.y
|
||||
else
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
to_chat(user, span_warning("You don't see anything that can be pried with [I]!"))
|
||||
|
||||
|
||||
/obj/structure/mecha_wreckage/transfer_ai(interaction, mob/user, null, obj/item/aicard/card)
|
||||
/obj/structure/mecha_wreckage/transfer_ai(interaction, mob/user, mob/living/silicon/ai/ai_unused, obj/item/aicard/card) //ai_unused is unused but having it is better than having it be null or _ for readability
|
||||
if(!..())
|
||||
return
|
||||
|
||||
|
||||
@@ -81,7 +81,6 @@
|
||||
desc = "Better stay away from that thing."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "uglymine"
|
||||
var/triggered = 0
|
||||
var/smartmine = FALSE
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
/obj/effect/spresent
|
||||
name = "strange present"
|
||||
desc = "It's a ... present?"
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "strangepresent"
|
||||
density = TRUE
|
||||
anchored = FALSE
|
||||
|
||||
@@ -6,7 +6,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
|
||||
/obj/item
|
||||
name = "item"
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/misc.dmi'
|
||||
blocks_emissive = EMISSIVE_BLOCK_GENERIC
|
||||
var/item_state = null
|
||||
var/lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/item/wallframe
|
||||
icon = 'icons/obj/wallframe.dmi'
|
||||
icon = 'icons/obj/frame.dmi'
|
||||
materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT*2)
|
||||
flags_1 = CONDUCT_1
|
||||
item_state = "syringe_kit"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/armorpolish
|
||||
name = "armor polish"
|
||||
desc = "Some canned tuna... oh wait. That's armor polish."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/traitor.dmi'
|
||||
icon_state = "armor_polish"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/remaining_uses = 2
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
/obj/item/areaeditor
|
||||
name = "area modification item"
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "blueprints"
|
||||
attack_verb = list("attacked", "bapped", "hit")
|
||||
var/fluffnotice = "Nobody's gonna read this stuff!"
|
||||
@@ -21,6 +21,7 @@
|
||||
. += "<p>According to the [src.name], you are now in an unclaimed territory.</p>"
|
||||
if(AREA_SPECIAL)
|
||||
. += "<p>This place is not noted on the [src.name].</p>"
|
||||
return .
|
||||
. += "<p><a href='?src=[REF(src)];create_area=1'>Create or modify an existing area</a></p>"
|
||||
|
||||
|
||||
@@ -45,8 +46,6 @@
|
||||
/obj/item/areaeditor/blueprints
|
||||
name = "station blueprints"
|
||||
desc = "Blueprints of the station. There is a \"Classified\" stamp and several coffee stains on it."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "blueprints"
|
||||
fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage."
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
var/list/image/showing = list()
|
||||
@@ -205,8 +204,6 @@
|
||||
/obj/item/areaeditor/blueprints/cyborg
|
||||
name = "station schematics"
|
||||
desc = "A digital copy of the station blueprints stored in your memory."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "blueprints"
|
||||
fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station."
|
||||
|
||||
/proc/rename_area(a, new_name)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#define STATION_RENAME_TIME_LIMIT 3000
|
||||
#define STATION_RENAME_TIME_LIMIT (10 MINUTES)
|
||||
|
||||
/obj/item/station_charter
|
||||
name = "station charter"
|
||||
@@ -15,6 +15,7 @@
|
||||
var/approval_time = 600
|
||||
|
||||
var/static/regex/standard_station_regex
|
||||
var/datum/callback/rename_callback // Yogs -- We actually keep track of this in order to be able to manually call this callback if an admin choses to do so.
|
||||
|
||||
/obj/item/station_charter/Initialize()
|
||||
. = ..()
|
||||
@@ -30,24 +31,33 @@
|
||||
if(used)
|
||||
to_chat(user, "The [name_type] has already been named.")
|
||||
return
|
||||
if(!ignores_timeout && (world.time-SSticker.round_start_time > STATION_RENAME_TIME_LIMIT)) //5 minutes
|
||||
if(!ignores_timeout && (world.time-SSticker.round_start_time > STATION_RENAME_TIME_LIMIT)) //10 minutes
|
||||
to_chat(user, "The crew has already settled into the shift. It probably wouldn't be good to rename the [name_type] right now.")
|
||||
return
|
||||
if(response_timer_id)
|
||||
to_chat(user, "You're still waiting for approval from your employers about your proposed name change, it'd be best to wait for now.")
|
||||
return
|
||||
|
||||
var/new_name = stripped_input(user, message="What do you want to name \
|
||||
//Yogs start -- Better Charter
|
||||
var/new_name = input(user, "What do you want to name \
|
||||
[station_name()]? Keep in mind particularly terrible names may be \
|
||||
rejected by your employers, while names using the standard format, \
|
||||
will automatically be accepted.", max_length=MAX_CHARTER_LEN)
|
||||
will automatically be accepted.", "Set Station Name") as text|null
|
||||
if(!new_name)
|
||||
return
|
||||
new_name = strip_html_simple(new_name,MAX_CHARTER_LEN)
|
||||
if(!length(new_name)) // <><><><><> is such a weird name for a station, don't you think?
|
||||
return
|
||||
|
||||
if(isnotpretty(new_name)) // Yogs bigotry filter
|
||||
to_chat(user,"That's not a terribly good name for a space station.")
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] just attempted to name the station something bad: '[new_name]'")
|
||||
return
|
||||
|
||||
if(response_timer_id)
|
||||
to_chat(user, "You're still waiting for approval from your employers about your proposed name change, it'd be best to wait for now.")
|
||||
return
|
||||
|
||||
if(!new_name)
|
||||
return
|
||||
log_game("[key_name(user)] has proposed to name the station as \
|
||||
[new_name]")
|
||||
|
||||
@@ -58,14 +68,36 @@
|
||||
|
||||
to_chat(user, "Your name has been sent to your employers for approval.")
|
||||
// Autoapproves after a certain time
|
||||
response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE)
|
||||
to_chat(GLOB.admins, span_adminnotice("<b><font color=orange>CUSTOM STATION RENAME:</font></b>[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [new_name] (will autoapprove in [DisplayTimeText(approval_time)]). [ADMIN_SMITE(user)] (<A HREF='?_src_=holder;[HrefToken(TRUE)];reject_custom_name=[REF(src)]'>REJECT</A>) [ADMIN_CENTCOM_REPLY(user)]"))
|
||||
rename_callback = CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user))
|
||||
response_timer_id = addtimer(rename_callback, approval_time, TIMER_STOPPABLE)
|
||||
to_chat(GLOB.admins,
|
||||
span_adminnotice("<b><font color=orange>CUSTOM STATION RENAME:</font></b>[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [new_name] (will auto-approve in [DisplayTimeText(approval_time)]).\
|
||||
(<a HREF='?_src_=holder;[HrefToken(TRUE)];accept_custom_name=[REF(src)]'>ACCEPT</a> or <a HREF='?_src_=holder;[HrefToken(TRUE)];reject_custom_name=[REF(src)]'>REJECT</a>) [ADMIN_SMITE(user)] [ADMIN_CENTCOM_REPLY(user)]"))
|
||||
|
||||
/obj/item/station_charter/proc/accept_proposed(user)
|
||||
if(!user)
|
||||
return
|
||||
if(!response_timer_id)
|
||||
return
|
||||
deltimer(response_timer_id)
|
||||
response_timer_id = null
|
||||
|
||||
var/m = "[key_name(user)] has manually accepted the proposed station name."
|
||||
message_admins(m)
|
||||
log_admin(m)
|
||||
|
||||
rename_callback.Invoke()
|
||||
rename_callback = null
|
||||
|
||||
/obj/item/station_charter/proc/reject_proposed(user)
|
||||
if(!user)
|
||||
return
|
||||
if(!response_timer_id)
|
||||
return
|
||||
deltimer(response_timer_id) // Doing this first to make sure we're not having a race with all the rubbish below
|
||||
response_timer_id = null
|
||||
rename_callback = null
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
T.visible_message("<span class='warning'>The proposed changes disappear \
|
||||
from [src]; it looks like they've been rejected.</span>")
|
||||
@@ -74,9 +106,6 @@
|
||||
message_admins(m)
|
||||
log_admin(m)
|
||||
|
||||
deltimer(response_timer_id)
|
||||
response_timer_id = null
|
||||
|
||||
/obj/item/station_charter/proc/rename_station(designation, uname, ureal_name, ukey)
|
||||
set_station_name(designation)
|
||||
minor_announce("[ureal_name] has designated your station as [station_name()]", "Captain's Charter", 0)
|
||||
@@ -96,7 +125,7 @@
|
||||
|
||||
/obj/item/station_charter/flag
|
||||
name = "nanotrasen banner"
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/banners.dmi'
|
||||
name_type = "planet"
|
||||
icon_state = "banner"
|
||||
item_state = "banner"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/chromosome
|
||||
name = "blank chromosome"
|
||||
icon = 'icons/obj/chromosomes.dmi'
|
||||
icon_state = ""
|
||||
icon = 'icons/obj/genetics.dmi'
|
||||
icon_state = "chromosome"
|
||||
desc = "A tube holding chromosomic data."
|
||||
force = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
@@ -54,32 +54,32 @@
|
||||
/obj/item/chromosome/stabilizer
|
||||
name = "stabilizer chromosome"
|
||||
desc = "A chromosome that reduces mutation instability by 20%."
|
||||
icon_state = "stabilizer"
|
||||
icon_state = "chromosome-stabilizer"
|
||||
stabilizer_coeff = 0.8
|
||||
weight = 1
|
||||
|
||||
/obj/item/chromosome/synchronizer
|
||||
name = "synchronizer chromosome"
|
||||
desc = "A chromosome that reduces mutation knockback and downsides by 50%."
|
||||
icon_state = "synchronizer"
|
||||
icon_state = "chromosome-synchronizer"
|
||||
synchronizer_coeff = 0.5
|
||||
|
||||
/obj/item/chromosome/power
|
||||
name = "power chromosome"
|
||||
desc = "A chromosome that increases mutation power by 50%."
|
||||
icon_state = "power"
|
||||
icon_state = "chromosome-power"
|
||||
power_coeff = 1.5
|
||||
|
||||
/obj/item/chromosome/energy
|
||||
name = "energetic chromosome"
|
||||
desc = "A chromosome that reduces action based mutation cooldowns by by 50%."
|
||||
icon_state = "energy"
|
||||
icon_state = "chromosome-energy"
|
||||
energy_coeff = 0.5
|
||||
|
||||
/obj/item/chromosome/reinforcer
|
||||
name = "reinforcement chromosome"
|
||||
desc = "A chromosome that renders mutations immune to mutadone."
|
||||
icon_state = "reinforcer"
|
||||
icon_state = "chromosome-reinforcer"
|
||||
weight = 3
|
||||
|
||||
/obj/item/chromosome/reinforcer/can_apply(datum/mutation/human/HM)
|
||||
@@ -89,4 +89,4 @@
|
||||
|
||||
/obj/item/chromosome/reinforcer/apply(datum/mutation/human/HM)
|
||||
HM.mutadone_proof = TRUE
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -40,6 +40,11 @@
|
||||
. = ..()
|
||||
. += "Currently set to \"[dept_list[target_dept]]\"."
|
||||
|
||||
/obj/item/circuitboard/computer/ai_ship
|
||||
name = "AI Ship Shuttle (Computer Board)"
|
||||
icon_state = "command"
|
||||
build_path = /obj/machinery/computer/shuttle/ai_ship
|
||||
|
||||
|
||||
//obj/item/circuitboard/computer/shield
|
||||
// name = "Shield Control (Computer Board)"
|
||||
@@ -519,3 +524,4 @@
|
||||
name = "Mining Shuttle (Computer Board)"
|
||||
icon_state = "supply"
|
||||
build_path = /obj/machinery/computer/shuttle/mining
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
name = "soap"
|
||||
desc = "A cheap bar of soap. Doesn't smell."
|
||||
gender = PLURAL
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/janitor.dmi'
|
||||
icon_state = "soap"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
|
||||
@@ -141,7 +141,7 @@
|
||||
/obj/item/bikehorn
|
||||
name = "bike horn"
|
||||
desc = "A horn off of a bicycle."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "bike_horn"
|
||||
item_state = "bike_horn"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/horns_lefthand.dmi'
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
gender = PLURAL
|
||||
name = "red lipstick"
|
||||
desc = "A generic brand of lipstick."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/cosmetics.dmi'
|
||||
icon_state = "lipstick"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/colour = "red"
|
||||
@@ -105,7 +105,7 @@
|
||||
/obj/item/razor
|
||||
name = "electric razor"
|
||||
desc = "The latest and greatest power razor born from the science of shaving."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/cosmetics.dmi'
|
||||
icon_state = "razor"
|
||||
flags_1 = CONDUCT_1
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
@@ -229,3 +229,44 @@
|
||||
..()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/dyespray
|
||||
name = "hair dye spray"
|
||||
desc = "A spray to dye your hair any gradients you'd like."
|
||||
icon = 'icons/obj/cosmetics.dmi'
|
||||
icon_state = "dyespray"
|
||||
|
||||
/obj/item/dyespray/attack_self(mob/user)
|
||||
dye(user)
|
||||
|
||||
/obj/item/dyespray/pre_attack(atom/target, mob/living/user, params)
|
||||
dye(target)
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Applies a gradient and a gradient color to a mob.
|
||||
*
|
||||
* Arguments:
|
||||
* * target - The mob who we will apply the gradient and gradient color to.
|
||||
*/
|
||||
|
||||
/obj/item/dyespray/proc/dye(mob/target)
|
||||
if(!ishuman(target) || isethereal(target))
|
||||
return
|
||||
var/mob/living/carbon/human/human_target = target
|
||||
|
||||
var/new_grad_style = input(usr, "Choose a color pattern:", "Character Preference") as null|anything in GLOB.hair_gradients_list
|
||||
if(!new_grad_style)
|
||||
return
|
||||
|
||||
var/new_grad_color = input(usr, "Choose a secondary hair color:", "Character Preference","#"+human_target.grad_color) as color|null
|
||||
if(!new_grad_color)
|
||||
return
|
||||
|
||||
human_target.grad_style = new_grad_style
|
||||
human_target.grad_color = sanitize_hexcolor(new_grad_color)
|
||||
to_chat(human_target, "<span class='notice'>You start applying the hair dye...</span>")
|
||||
if(!do_after(usr, 3 SECONDS, target))
|
||||
return
|
||||
playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5)
|
||||
human_target.update_hair()
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
/obj/item/gavelhammer
|
||||
name = "gavel hammer"
|
||||
desc = "Order, order! No bombs in my courthouse."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "gavelhammer"
|
||||
force = 5
|
||||
throwforce = 6
|
||||
@@ -21,7 +21,7 @@
|
||||
/obj/item/gavelblock
|
||||
name = "gavel block"
|
||||
desc = "Smack it with a gavel hammer when the assistants get rowdy."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "gavelblock"
|
||||
force = 2
|
||||
throwforce = 2
|
||||
@@ -34,4 +34,4 @@
|
||||
user.visible_message(span_warning("[user] strikes [src] with [I]."))
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
else
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/suspiciousphone
|
||||
name = "suspicious phone"
|
||||
desc = "This device raises pink levels to unknown highs."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/traitor.dmi'
|
||||
icon_state = "suspiciousphone"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("dumped")
|
||||
|
||||
@@ -44,8 +44,6 @@
|
||||
// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
|
||||
|
||||
/obj/item/multitool/ai_detect
|
||||
var/track_cooldown = 0
|
||||
var/track_delay = 10 //How often it checks for proximity
|
||||
var/detect_state = PROXIMITY_NONE
|
||||
var/rangealert = 8 //Glows red when inside
|
||||
var/rangewarning = 20 //Glows yellow when inside
|
||||
@@ -56,12 +54,12 @@
|
||||
|
||||
/obj/item/multitool/ai_detect/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
eye = new /mob/camera/aiEye/remote/ai_detector()
|
||||
toggle_action = new /datum/action/item_action/toggle_multitool(src)
|
||||
|
||||
/obj/item/multitool/ai_detect/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
if(hud_on && ismob(loc))
|
||||
remove_hud(loc)
|
||||
QDEL_NULL(toggle_action)
|
||||
@@ -81,15 +79,16 @@
|
||||
if(hud_on)
|
||||
remove_hud(user)
|
||||
|
||||
/obj/item/multitool/ai_detect/update_icon()
|
||||
icon_state = "[initial(icon_state)][detect_state]"
|
||||
|
||||
/obj/item/multitool/ai_detect/process()
|
||||
if(track_cooldown > world.time)
|
||||
return
|
||||
detect_state = PROXIMITY_NONE
|
||||
var/old_detect_state = detect_state
|
||||
if(eye.eye_user)
|
||||
eye.setLoc(get_turf(src))
|
||||
multitool_detect()
|
||||
update_icon()
|
||||
track_cooldown = world.time + track_delay
|
||||
if(detect_state != old_detect_state)
|
||||
update_icon()
|
||||
|
||||
/obj/item/multitool/ai_detect/proc/toggle_hud(mob/user)
|
||||
hud_on = !hud_on
|
||||
@@ -103,7 +102,7 @@
|
||||
/obj/item/multitool/ai_detect/proc/show_hud(mob/user)
|
||||
if(user && hud_type)
|
||||
var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"]
|
||||
PM.alpha = 150
|
||||
PM.alpha = 64
|
||||
var/datum/atom_hud/H = GLOB.huds[hud_type]
|
||||
if(!H.hudusers[user])
|
||||
H.add_hud_to(user)
|
||||
@@ -122,31 +121,32 @@
|
||||
|
||||
/obj/item/multitool/ai_detect/proc/multitool_detect()
|
||||
var/turf/our_turf = get_turf(src)
|
||||
for(var/mob/living/silicon/ai/AI in GLOB.ai_list)
|
||||
for(var/mob/living/silicon/ai/AI as anything in GLOB.ai_list)
|
||||
if(AI.cameraFollow == src)
|
||||
detect_state = PROXIMITY_ON_SCREEN
|
||||
return
|
||||
|
||||
for(var/mob/camera/aiEye/AI_eye as anything in GLOB.aiEyes)
|
||||
if(!AI_eye.ai_detector_visible)
|
||||
continue
|
||||
|
||||
var/distance = get_dist(our_turf, get_turf(AI_eye))
|
||||
|
||||
if(distance == -1) //get_dist() returns -1 for distances greater than 127 (and for errors, so assume -1 is just max range)
|
||||
continue
|
||||
|
||||
if(distance < rangealert) //ai should be able to see us
|
||||
detect_state = PROXIMITY_ON_SCREEN
|
||||
break
|
||||
|
||||
if(detect_state)
|
||||
return
|
||||
var/datum/camerachunk/chunk = GLOB.cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z)
|
||||
if(chunk && chunk.seenby.len)
|
||||
for(var/mob/camera/aiEye/A in chunk.seenby)
|
||||
if(!A.ai_detector_visible)
|
||||
continue
|
||||
var/turf/detect_turf = get_turf(A)
|
||||
if(get_dist(our_turf, detect_turf) < rangealert)
|
||||
detect_state = PROXIMITY_ON_SCREEN
|
||||
break
|
||||
if(get_dist(our_turf, detect_turf) < rangewarning)
|
||||
detect_state = PROXIMITY_NEAR
|
||||
break
|
||||
if(distance < rangewarning) //ai cant see us but is close
|
||||
detect_state = PROXIMITY_NEAR
|
||||
|
||||
/mob/camera/aiEye/remote/ai_detector
|
||||
name = "AI detector eye"
|
||||
ai_detector_visible = FALSE
|
||||
use_static = USE_STATIC_TRANSPARENT
|
||||
visible_icon = FALSE
|
||||
use_static = FALSE
|
||||
|
||||
/datum/action/item_action/toggle_multitool
|
||||
name = "Toggle AI detector HUD"
|
||||
@@ -155,11 +155,11 @@
|
||||
|
||||
/datum/action/item_action/toggle_multitool/Trigger()
|
||||
if(!..())
|
||||
return 0
|
||||
return FALSE
|
||||
if(target)
|
||||
var/obj/item/multitool/ai_detect/M = target
|
||||
M.toggle_hud(owner)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/multitool/cyborg
|
||||
name = "multitool"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
obj_integrity = 300
|
||||
max_integrity = 300
|
||||
item_state = "rack_parts"
|
||||
item_state = "reverse_bear_trap"
|
||||
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
|
||||
|
||||
|
||||
@@ -422,7 +422,9 @@ GENE SCANNER
|
||||
blood_type = R.name
|
||||
else
|
||||
blood_type = blood_id
|
||||
if(C.blood_volume <= BLOOD_VOLUME_SAFE(C) && C.blood_volume > BLOOD_VOLUME_OKAY(C))
|
||||
if(HAS_TRAIT(M, TRAIT_MASQUERADE)) //bloodsuckers
|
||||
to_chat(user, span_info("Blood level 100%, 560 cl, type: [blood_type]"))
|
||||
else if(C.blood_volume <= BLOOD_VOLUME_SAFE(C) && C.blood_volume > BLOOD_VOLUME_OKAY(C))
|
||||
to_chat(user, "[span_danger("LOW blood level [blood_percent] %, [C.blood_volume] cl,")] [span_info("type: [blood_type]")]")
|
||||
else if(C.blood_volume <= BLOOD_VOLUME_OKAY(C))
|
||||
to_chat(user, "[span_danger("CRITICAL blood level [blood_percent] %, [C.blood_volume] cl,")] [span_info("type: [blood_type]")]")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/dnainjector
|
||||
name = "\improper DNA injector"
|
||||
desc = "This injects the person with DNA."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/genetics.dmi'
|
||||
icon_state = "dnainjector"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/obj/item/dyespray
|
||||
name = "hair dye spray"
|
||||
desc = "A spray to dye your hair any gradients you'd like."
|
||||
icon = 'icons/obj/dyespray.dmi'
|
||||
icon_state = "dyespray"
|
||||
|
||||
/obj/item/dyespray/attack_self(mob/user)
|
||||
dye(user)
|
||||
|
||||
/obj/item/dyespray/pre_attack(atom/target, mob/living/user, params)
|
||||
dye(target)
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Applies a gradient and a gradient color to a mob.
|
||||
*
|
||||
* Arguments:
|
||||
* * target - The mob who we will apply the gradient and gradient color to.
|
||||
*/
|
||||
|
||||
/obj/item/dyespray/proc/dye(mob/target)
|
||||
if(!ishuman(target) || isethereal(target))
|
||||
return
|
||||
var/mob/living/carbon/human/human_target = target
|
||||
|
||||
var/new_grad_style = input(usr, "Choose a color pattern:", "Character Preference") as null|anything in GLOB.hair_gradients_list
|
||||
if(!new_grad_style)
|
||||
return
|
||||
|
||||
var/new_grad_color = input(usr, "Choose a secondary hair color:", "Character Preference","#"+human_target.grad_color) as color|null
|
||||
if(!new_grad_color)
|
||||
return
|
||||
|
||||
human_target.grad_style = new_grad_style
|
||||
human_target.grad_color = sanitize_hexcolor(new_grad_color)
|
||||
to_chat(human_target, "<span class='notice'>You start applying the hair dye...</span>")
|
||||
if(!do_after(usr, 3 SECONDS, target))
|
||||
return
|
||||
playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5)
|
||||
human_target.update_hair()
|
||||
@@ -384,7 +384,7 @@
|
||||
force = 10
|
||||
greet = "<span class='sciradio'>You have learned the ancient martial art of Flying Fang! Your unarmed attacks have become somewhat more effective, \
|
||||
and you are more resistant to damage and stun-based weaponry. However, you are also unable to use any ranged weaponry or armor. You can learn more about your newfound art by using the Recall Teachings verb in the Flying Fang tab.</span>"
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/library.dmi'
|
||||
icon_state = "stone_tablet"
|
||||
remarks = list("Feasting on the insides of your enemies...", "Some of these techniques look a bit dizzying...", "Not like I need armor anyways...", "Don't get shot, whatever that means...")
|
||||
|
||||
@@ -439,6 +439,6 @@
|
||||
/obj/item/book/granter/crafting_recipe/weapons
|
||||
name = "makeshift weapons 101"
|
||||
desc = "A book filled with directions on how to make various weaponry."
|
||||
crafting_recipe_types = list(/datum/crafting_recipe/baseball_bat, /datum/crafting_recipe/lance, /datum/crafting_recipe/knifeboxing, /datum/crafting_recipe/flamethrower)
|
||||
crafting_recipe_types = list(/datum/crafting_recipe/baseball_bat, /datum/crafting_recipe/lance, /datum/crafting_recipe/knifeboxing, /datum/crafting_recipe/flamethrower, /datum/crafting_recipe/pipebomb)
|
||||
icon_state = "bookCrafting"
|
||||
oneuse = TRUE
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
can_underlay.plane = FLOAT_PLANE
|
||||
underlays += can_underlay
|
||||
|
||||
|
||||
/obj/item/grenade/iedcasing/attack_self(mob/user) //
|
||||
if(!active)
|
||||
if(clown_check(user))
|
||||
@@ -58,3 +57,48 @@
|
||||
/obj/item/grenade/iedcasing/examine(mob/user)
|
||||
. = ..()
|
||||
. += "You can't tell when it will explode!"
|
||||
|
||||
/obj/item/grenade/pipebomb
|
||||
name = "improvised pipebomb"
|
||||
desc = "A weak, improvised explosive with a mousetrap attached. For all your mailbombing needs."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "pipebomb"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
active = 0
|
||||
var/armed = 0
|
||||
display_timer = 0
|
||||
|
||||
/obj/item/grenade/pipebomb/Initialize()
|
||||
. = ..()
|
||||
|
||||
/obj/item/grenade/pipebomb/attack_self(mob/user)
|
||||
if(!armed)
|
||||
to_chat(user, span_warning("You pull back the mousetrap, arming the [name]! It will detonate whenever someone opens the container it is put inside of!"))
|
||||
playsound(src, 'sound/weapons/handcuffs.ogg', 30, TRUE, -3)
|
||||
log_admin("[key_name(user)] armed a [name] at [AREACOORD(src)]")
|
||||
armed = 1
|
||||
else
|
||||
to_chat(user, span_warning("The [name] is already armed!"))
|
||||
|
||||
/obj/item/grenade/pipebomb/on_found(mob/finder)
|
||||
if(armed)
|
||||
if(finder)
|
||||
to_chat(finder, span_userdanger("Oh fuck-"))
|
||||
preprime(finder, TRUE, FALSE)
|
||||
return TRUE //end the search!
|
||||
else
|
||||
visible_message(span_warning("[src] detonates!"))
|
||||
preprime(finder, TRUE, FALSE)
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
/obj/item/grenade/pipebomb/prime() //Blowing that can up
|
||||
update_mob()
|
||||
explosion(src.loc,-1,-1,2, flame_range = 4) // small explosion, plus a very large fireball. same as the IED.
|
||||
qdel(src)
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
to_chat(user, span_notice("You use [src] to deactivate [H]."))
|
||||
qdel(H)
|
||||
else
|
||||
if(!is_blocked_turf(T, TRUE)) //can't put holograms on a tile that has dense stuff
|
||||
if(!is_blocked_turf(T, TRUE)) //can't put hard light on a tile that has dense stuff
|
||||
if(holocreator_busy)
|
||||
to_chat(user, span_notice("[src] is busy creating a hologram."))
|
||||
to_chat(user, span_notice("[src] is busy creating a hard light barrier."))
|
||||
return
|
||||
if(signs.len < max_signs)
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 20, 1)
|
||||
@@ -57,7 +57,7 @@
|
||||
if(signs.len)
|
||||
for(var/H in signs)
|
||||
qdel(H)
|
||||
to_chat(user, span_notice("You clear all active holograms."))
|
||||
to_chat(user, span_notice("You clear all active hard light barriers."))
|
||||
|
||||
/obj/item/holosign_creator/janibarrier
|
||||
name = "custodial holobarrier projector"
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
/obj/item/holosign_creator/security
|
||||
name = "security holobarrier projector"
|
||||
desc = "A holographic projector that creates holographic security barriers."
|
||||
desc = "A holographic projector that creates hard light security barriers."
|
||||
icon_state = "signmaker_sec"
|
||||
holosign_type = /obj/structure/holosign/barrier
|
||||
creation_time = 30
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
/obj/item/holosign_creator/engineering
|
||||
name = "engineering holobarrier projector"
|
||||
desc = "A holographic projector that creates holographic engineering barriers."
|
||||
desc = "A holographic projector that creates hard light engineering barriers."
|
||||
icon_state = "signmaker_engi"
|
||||
holosign_type = /obj/structure/holosign/barrier/engineering
|
||||
creation_time = 30
|
||||
@@ -84,7 +84,7 @@
|
||||
|
||||
/obj/item/holosign_creator/atmos
|
||||
name = "ATMOS holofan projector"
|
||||
desc = "A holographic projector that creates holographic barriers that prevent changes in atmosphere conditions."
|
||||
desc = "A holographic projector that creates hard light barriers that prevent changes in atmosphere conditions."
|
||||
icon_state = "signmaker_atmos"
|
||||
holosign_type = /obj/structure/holosign/barrier/atmos
|
||||
creation_time = 0
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
/obj/item/holosign_creator/medical
|
||||
name = "\improper PENLITE barrier projector"
|
||||
desc = "A holographic projector that creates PENLITE holobarriers. Useful during quarantines since they halt those with malicious diseases."
|
||||
desc = "A holographic projector that creates PENLITE hard light barriers. Useful during quarantines since they halt those with malicious diseases."
|
||||
icon_state = "signmaker_med"
|
||||
holosign_type = /obj/structure/holosign/barrier/medical
|
||||
creation_time = 30
|
||||
@@ -111,7 +111,7 @@
|
||||
var/mob/living/silicon/robot/R = user
|
||||
|
||||
if(shock)
|
||||
to_chat(user, span_notice("You clear all active holograms, and reset your projector to normal."))
|
||||
to_chat(user, span_notice("You clear all active hard light barriers, and reset your projector to normal."))
|
||||
holosign_type = /obj/structure/holosign/barrier/cyborg
|
||||
creation_time = 5
|
||||
if(signs.len)
|
||||
@@ -120,7 +120,7 @@
|
||||
shock = 0
|
||||
return
|
||||
else if(R.emagged&&!shock)
|
||||
to_chat(user, span_warning("You clear all active holograms, and overload your energy projector!"))
|
||||
to_chat(user, span_warning("You clear all active hard light barriers, and overload your energy projector!"))
|
||||
holosign_type = /obj/structure/holosign/barrier/cyborg/hacked
|
||||
creation_time = 30
|
||||
if(signs.len)
|
||||
@@ -132,11 +132,11 @@
|
||||
if(signs.len)
|
||||
for(var/H in signs)
|
||||
qdel(H)
|
||||
to_chat(user, span_notice("You clear all active holograms."))
|
||||
to_chat(user, span_notice("You clear all active hard light barriers."))
|
||||
if(signs.len)
|
||||
for(var/H in signs)
|
||||
qdel(H)
|
||||
to_chat(user, span_notice("You clear all active holograms."))
|
||||
to_chat(user, span_notice("You clear all active hard light barriers."))
|
||||
|
||||
/obj/item/holosign_creator/multi
|
||||
name = "multiple holosign projector" //Fork from this to make multiple barriers
|
||||
@@ -146,15 +146,15 @@
|
||||
if(signs.len)
|
||||
for(var/H in signs)
|
||||
qdel(H)
|
||||
to_chat(user, span_notice("You clear all active holograms."))
|
||||
to_chat(user, span_notice("You clear all active hard light barriers."))
|
||||
else
|
||||
holosign_type = next_list_item(holosign_type, holodesigns)
|
||||
to_chat(user, span_notice("You switch to [holosign_type]"))
|
||||
|
||||
/obj/item/holosign_creator/multi/CE
|
||||
name = "CE holofan projector"
|
||||
desc = "A holographic projector that creates holographic barriers that prevent changes in atmosphere conditions or engineering barriers."
|
||||
desc = "A holographic projector that creates hard light barriers that prevent changes in atmosphere conditions or engineering barriers."
|
||||
icon_state = "signmaker_atmos"
|
||||
holosign_type = /obj/structure/holosign/barrier/atmos
|
||||
max_signs = 5
|
||||
holodesigns = list(/obj/structure/holosign/barrier/atmos, /obj/structure/holosign/barrier/engineering)
|
||||
holodesigns = list(/obj/structure/holosign/barrier/atmos, /obj/structure/holosign/barrier/engineering)
|
||||
|
||||
@@ -332,7 +332,8 @@
|
||||
. = span_notice("[user] grasps [A] with [user.p_their()] flaming hand, igniting it in a burst of holy flame. Holy hot damn, that is badass. ")
|
||||
|
||||
/obj/item/nullrod/staff
|
||||
icon_state = "godstaff-red"
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "staff-red"
|
||||
item_state = "godstaff-red"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
|
||||
@@ -350,12 +351,14 @@
|
||||
. += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_LAYER + 0.01)
|
||||
|
||||
/obj/item/nullrod/staff/blue
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
name = "blue holy staff"
|
||||
icon_state = "godstaff-blue"
|
||||
icon_state = "staff-blue"
|
||||
item_state = "godstaff-blue"
|
||||
shield_icon = "shield-old"
|
||||
|
||||
/obj/item/nullrod/claymore
|
||||
icon = 'icons/obj/weapons/swords.dmi'
|
||||
icon_state = "holyblade"
|
||||
item_state = "holyblade"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
@@ -421,6 +424,7 @@
|
||||
/obj/item/nullrod/claymore/saber
|
||||
name = "light energy sword"
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
icon = 'icons/obj/weapons/energy.dmi'
|
||||
icon_state = "swordblue"
|
||||
item_state = "swordblue"
|
||||
desc = "If you strike me down, I shall become more robust than you can possibly imagine."
|
||||
@@ -475,6 +479,7 @@
|
||||
/obj/item/nullrod/sord
|
||||
name = "\improper UNREAL SORD"
|
||||
desc = "This thing is so unspeakably HOLY you are having a hard time even holding it."
|
||||
icon = 'icons/obj/weapons/swords.dmi'
|
||||
icon_state = "sord"
|
||||
item_state = "sord"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
@@ -486,6 +491,7 @@
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/nullrod/scythe
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "scythe1"
|
||||
item_state = "scythe1"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
|
||||
@@ -503,6 +509,7 @@
|
||||
AddComponent(/datum/component/butchering, 70, 110) //the harvest gives a high bonus chance
|
||||
|
||||
/obj/item/nullrod/scythe/vibro
|
||||
icon = 'icons/obj/weapons/swords.dmi'
|
||||
icon_state = "hfrequency0"
|
||||
item_state = "hfrequency1"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
@@ -527,6 +534,7 @@
|
||||
hitsound = 'sound/effects/sparks4.ogg'
|
||||
|
||||
/obj/item/nullrod/scythe/spellblade
|
||||
icon = 'icons/obj/weapons/swords.dmi'
|
||||
icon_state = "spellblade"
|
||||
item_state = "spellblade"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
@@ -537,6 +545,7 @@
|
||||
hitsound = 'sound/weapons/rapierhit.ogg'
|
||||
|
||||
/obj/item/nullrod/scythe/talking
|
||||
icon = 'icons/obj/weapons/swords.dmi'
|
||||
icon_state = "talking_sword"
|
||||
item_state = "talking_sword"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
@@ -588,6 +597,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/nullrod/scythe/talking/chainsword
|
||||
icon = 'icons/obj/weapons/swords.dmi'
|
||||
icon_state = "chainswordon"
|
||||
item_state = "chainswordon"
|
||||
name = "possessed chainsaw sword"
|
||||
@@ -600,6 +610,7 @@
|
||||
|
||||
|
||||
/obj/item/nullrod/hammmer
|
||||
icon = 'icons/obj/weapons/misc.dmi'
|
||||
icon_state = "hammeron"
|
||||
item_state = "hammeron"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
|
||||
@@ -613,6 +624,7 @@
|
||||
/obj/item/nullrod/chainsaw
|
||||
name = "chainsaw hand"
|
||||
desc = "Good? Bad? You're the guy with the chainsaw hand."
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "chainsaw_on"
|
||||
item_state = "mounted_chainsaw"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
|
||||
@@ -640,6 +652,7 @@
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/nullrod/pride_hammer
|
||||
icon = 'icons/obj/weapons/misc.dmi'
|
||||
icon_state = "pride"
|
||||
name = "Pride-struck Hammer"
|
||||
desc = "It resonates an aura of Pride."
|
||||
@@ -663,6 +676,7 @@
|
||||
/obj/item/nullrod/whip
|
||||
name = "holy whip"
|
||||
desc = "What a terrible night to be on Space Station 13."
|
||||
icon = 'icons/obj/weapons/misc.dmi'
|
||||
icon_state = "chain"
|
||||
item_state = "chain"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
||||
@@ -732,6 +746,7 @@
|
||||
used_blessing = TRUE
|
||||
|
||||
/obj/item/nullrod/claymore/bostaff //May as well make it a "claymore" and inherit the blocking
|
||||
icon = 'icons/obj/weapons/misc.dmi'
|
||||
name = "monk's staff"
|
||||
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, it is now used to harass the clown."
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
@@ -741,13 +756,14 @@
|
||||
sharpness = SHARP_NONE
|
||||
hitsound = "swing_hit"
|
||||
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/weapons/misc.dmi'
|
||||
icon_state = "bostaff0"
|
||||
item_state = "bostaff0"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
|
||||
|
||||
/obj/item/nullrod/tribal_knife
|
||||
icon = 'icons/obj/weapons/swords.dmi'
|
||||
icon_state = "crysknife"
|
||||
item_state = "crysknife"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
@@ -775,6 +791,7 @@
|
||||
|
||||
|
||||
/obj/item/nullrod/pitchfork
|
||||
icon = 'icons/obj/weapons/spears.dmi'
|
||||
icon_state = "pitchfork0"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
|
||||
|
||||
@@ -45,6 +45,15 @@
|
||||
removed(target, TRUE)
|
||||
return FALSE
|
||||
|
||||
var/datum/antagonist/vassal/vassaldatum = IS_VASSAL(target)
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/vassal || !(vassaldatum.favorite_vassal)))
|
||||
if(vassaldatum.favorite_vassal)
|
||||
if(!silent)
|
||||
target.visible_message(span_warning("[target] seems to resist the implant!"), span_warning("You feel something interfering with your mental conditioning, but you resist it!"))
|
||||
removed(target, TRUE)
|
||||
return FALSE
|
||||
target.mind.remove_antag_datum(/datum/antagonist/vassal)
|
||||
|
||||
var/datum/antagonist/hivevessel/woke = target.is_wokevessel()
|
||||
if(is_hivemember(target))
|
||||
for(var/datum/antagonist/hivemind/hive in GLOB.antagonists)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/implantcase
|
||||
name = "implant case"
|
||||
desc = "A glass case containing an implant."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/implants.dmi'
|
||||
icon_state = "implantcase-0"
|
||||
item_state = "implantcase"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/implanter
|
||||
name = "implanter"
|
||||
desc = "A sterile automatic implant injector."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/implants.dmi'
|
||||
icon_state = "implanter0"
|
||||
item_state = "syringe_0"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user