Merge remote-tracking branch 'origin/master' into luciee

This commit is contained in:
Katherine Kiefer
2022-04-15 07:59:07 +10:00
455 changed files with 178966 additions and 51093 deletions

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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
View File

@@ -0,0 +1 @@
#define FORCE_MAP "_maps/gaxstation.json"

11
_maps/gaxstation.json Normal file
View 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"
}
}

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
View 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
"}

View 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
"}

View 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
"}

View 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
"}

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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))

View File

@@ -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"

View 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)

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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 //
/////////////

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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"

View File

@@ -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.")

View File

@@ -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)

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -181,6 +181,9 @@ GLOBAL_LIST_EMPTY(uplinks)
return data
/datum/component/uplink/ui_act(action, params)
. = ..()
if(.)
return
if(!active)
return
switch(action)

View File

@@ -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

View File

@@ -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")

View File

@@ -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>")

View File

@@ -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!"))

View 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>"))

View File

@@ -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'

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)"

View File

@@ -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."

View File

@@ -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
..()

View 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)

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View 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

View 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."

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View File

@@ -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))

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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'

View File

@@ -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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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"

View File

@@ -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
..()
..()

View File

@@ -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

View File

@@ -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'

View File

@@ -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()

View File

@@ -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 ..()

View File

@@ -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")

View File

@@ -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"

View File

@@ -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'

View File

@@ -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]")]")

View File

@@ -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'

View File

@@ -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()

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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'

View File

@@ -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)

View File

@@ -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'

View File

@@ -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