Merge remote-tracking branch 'upstream/master' into abductor-update
This commit is contained in:
@@ -167,7 +167,7 @@
|
||||
/area/ruin/unpowered/xenonest)
|
||||
"aM" = (
|
||||
/obj/structure/alien/weeds,
|
||||
/obj/effect/decal/cleanable/xenoblood,
|
||||
/obj/effect/decal/cleanable/blood/xeno,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/ruin/unpowered/xenonest)
|
||||
"aQ" = (
|
||||
@@ -260,7 +260,7 @@
|
||||
/obj/structure/stone_tile/cracked{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/decal/cleanable/xenoblood,
|
||||
/obj/effect/decal/cleanable/blood/xeno,
|
||||
/turf/open/indestructible/boss/air,
|
||||
/area/ruin/unpowered/xenonest)
|
||||
"be" = (
|
||||
@@ -381,7 +381,7 @@
|
||||
/obj/structure/stone_tile{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/decal/cleanable/xenoblood,
|
||||
/obj/effect/decal/cleanable/blood/xeno,
|
||||
/turf/open/indestructible/boss/air,
|
||||
/area/ruin/unpowered/xenonest)
|
||||
"bs" = (
|
||||
@@ -439,7 +439,7 @@
|
||||
/obj/structure/stone_tile{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/decal/cleanable/xenoblood,
|
||||
/obj/effect/decal/cleanable/blood/xeno,
|
||||
/turf/open/indestructible/boss/air,
|
||||
/area/ruin/unpowered/xenonest)
|
||||
"by" = (
|
||||
|
||||
@@ -475,6 +475,8 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/storage/bag/plants/portaseeder,
|
||||
/obj/item/seeds/cotton,
|
||||
/obj/item/seeds/cotton,
|
||||
/turf/open/indestructible/boss,
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"bk" = (
|
||||
|
||||
@@ -279,6 +279,7 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/powered/seedvault)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
|
||||
@@ -90,6 +90,9 @@
|
||||
/obj/structure/table,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/item/organ/cyberimp/chest/reviver,
|
||||
/obj/item/stack/sheet/mineral/gold{
|
||||
amount = 3
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/ruin/powered)
|
||||
"s" = (
|
||||
@@ -145,9 +148,6 @@
|
||||
"A" = (
|
||||
/obj/structure/table,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/item/mmi/posibrain{
|
||||
pixel_y = 9
|
||||
},
|
||||
/obj/item/mmi,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/ruin/powered)
|
||||
|
||||
@@ -1288,7 +1288,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/ruin/space/has_grav/derelictoutpost/cargobay)
|
||||
"cV" = (
|
||||
/obj/effect/decal/cleanable/xenoblood/xsplatter,
|
||||
/obj/effect/decal/cleanable/blood/splatter/xeno,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/ruin/space/has_grav/derelictoutpost/cargobay)
|
||||
"cW" = (
|
||||
@@ -1525,7 +1525,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/ruin/space/has_grav/derelictoutpost/cargobay)
|
||||
"dq" = (
|
||||
/obj/effect/decal/cleanable/xenoblood/xsplatter,
|
||||
/obj/effect/decal/cleanable/blood/splatter/xeno,
|
||||
/obj/structure/alien/weeds{
|
||||
color = "#4BAE56";
|
||||
desc = "A thick gelatinous surface covers the floor. Someone get the golashes.";
|
||||
|
||||
@@ -0,0 +1,970 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/open/space/basic,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/open/floor/plating/asteroid/airless,
|
||||
/area/ruin/unpowered/no_grav)
|
||||
"c" = (
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"d" = (
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"e" = (
|
||||
/obj/machinery/porta_turret/syndicate{
|
||||
desc = "A ballistic machine gun auto-turret that fires bluespace bullets.";
|
||||
lethal_projectile = /obj/item/projectile/magic/teleport;
|
||||
name = "displacement turret";
|
||||
stun_projectile = /obj/item/projectile/magic/teleport
|
||||
},
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"f" = (
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"g" = (
|
||||
/obj/structure/table/glass,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"h" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/stack/sheet/bluespace_crystal{
|
||||
amount = 37
|
||||
},
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"i" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/bodybag/bluespace,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"j" = (
|
||||
/turf/open/floor/plasteel/stairs/left,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"k" = (
|
||||
/turf/open/floor/plasteel/stairs/medium,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"l" = (
|
||||
/turf/open/floor/plasteel/stairs/right,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"m" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/reagent_containers/syringe/bluespace,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"n" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/stock_parts/matter_bin/bluespace,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"o" = (
|
||||
/turf/open/floor/plasteel/vaporwave,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"p" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/stack/cable_coil/blue,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"q" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/storage/backpack/holding,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"r" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/reagent_containers/glass/beaker/bluespace,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"s" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/stock_parts/subspace/crystal,
|
||||
/obj/item/stock_parts/subspace/transmitter,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"t" = (
|
||||
/obj/structure/displaycase{
|
||||
start_showpiece_type = /obj/item/hilbertshotel
|
||||
},
|
||||
/turf/open/floor/plasteel/vaporwave,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"u" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/analyzer,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"v" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/stock_parts/subspace/amplifier,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"w" = (
|
||||
/obj/item/paper/crumpled/docslogs,
|
||||
/obj/item/pen,
|
||||
/turf/open/floor/plasteel/vaporwave,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"x" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/assembly/signaler,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"y" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/slimecross/industrial/bluespace,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"z" = (
|
||||
/obj/machinery/door/airlock/vault{
|
||||
name = "secured door";
|
||||
req_access = 207
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/locked,
|
||||
/turf/open/floor/plasteel/grimy{
|
||||
icon_state = "engine"
|
||||
},
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"A" = (
|
||||
/obj/structure/filingcabinet,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"B" = (
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"C" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"D" = (
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"E" = (
|
||||
/obj/structure/chair/office,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"F" = (
|
||||
/obj/machinery/door/window/eastleft,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"G" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/pen,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"H" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/paper/crumpled/robertsworkjournal,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"I" = (
|
||||
/obj/machinery/door/airlock/highsecurity{
|
||||
req_access = 207
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/locked,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/ruin/space/has_grav/hilbertresearchfacility)
|
||||
"J" = (
|
||||
/turf/closed/mineral/random,
|
||||
/area/ruin/unpowered/no_grav)
|
||||
"K" = (
|
||||
/turf/open/floor/plasteel/stairs/right{
|
||||
initial_gas_mix = "TEMP=2.7"
|
||||
},
|
||||
/area/ruin/unpowered/no_grav)
|
||||
"U" = (
|
||||
/turf/open/floor/plasteel/stairs/medium{
|
||||
initial_gas_mix = "TEMP=2.7"
|
||||
},
|
||||
/area/ruin/unpowered/no_grav)
|
||||
"X" = (
|
||||
/turf/open/floor/plasteel/stairs/left{
|
||||
initial_gas_mix = "TEMP=2.7"
|
||||
},
|
||||
/area/ruin/unpowered/no_grav)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
J
|
||||
J
|
||||
J
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
J
|
||||
b
|
||||
J
|
||||
b
|
||||
b
|
||||
a
|
||||
b
|
||||
J
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
a
|
||||
b
|
||||
J
|
||||
J
|
||||
J
|
||||
b
|
||||
J
|
||||
b
|
||||
J
|
||||
b
|
||||
b
|
||||
J
|
||||
J
|
||||
J
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
a
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
d
|
||||
d
|
||||
c
|
||||
d
|
||||
d
|
||||
c
|
||||
d
|
||||
d
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
a
|
||||
a
|
||||
b
|
||||
d
|
||||
e
|
||||
f
|
||||
f
|
||||
m
|
||||
r
|
||||
g
|
||||
g
|
||||
f
|
||||
f
|
||||
f
|
||||
e
|
||||
c
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
a
|
||||
a
|
||||
b
|
||||
d
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
d
|
||||
J
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
a
|
||||
a
|
||||
J
|
||||
d
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
c
|
||||
J
|
||||
b
|
||||
b
|
||||
J
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
a
|
||||
a
|
||||
J
|
||||
c
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
c
|
||||
J
|
||||
b
|
||||
J
|
||||
b
|
||||
b
|
||||
J
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
a
|
||||
a
|
||||
J
|
||||
c
|
||||
g
|
||||
f
|
||||
f
|
||||
n
|
||||
s
|
||||
v
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
c
|
||||
J
|
||||
J
|
||||
J
|
||||
J
|
||||
J
|
||||
J
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
a
|
||||
a
|
||||
J
|
||||
c
|
||||
g
|
||||
f
|
||||
j
|
||||
o
|
||||
o
|
||||
o
|
||||
j
|
||||
f
|
||||
f
|
||||
f
|
||||
c
|
||||
d
|
||||
d
|
||||
c
|
||||
c
|
||||
d
|
||||
c
|
||||
J
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(13,1,1) = {"
|
||||
a
|
||||
a
|
||||
J
|
||||
c
|
||||
h
|
||||
f
|
||||
k
|
||||
o
|
||||
t
|
||||
o
|
||||
k
|
||||
f
|
||||
f
|
||||
f
|
||||
c
|
||||
A
|
||||
B
|
||||
C
|
||||
B
|
||||
D
|
||||
c
|
||||
J
|
||||
J
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(14,1,1) = {"
|
||||
a
|
||||
a
|
||||
J
|
||||
c
|
||||
g
|
||||
f
|
||||
l
|
||||
o
|
||||
o
|
||||
w
|
||||
l
|
||||
f
|
||||
f
|
||||
f
|
||||
d
|
||||
B
|
||||
B
|
||||
G
|
||||
B
|
||||
B
|
||||
c
|
||||
J
|
||||
b
|
||||
b
|
||||
a
|
||||
a
|
||||
"}
|
||||
(15,1,1) = {"
|
||||
a
|
||||
a
|
||||
J
|
||||
c
|
||||
i
|
||||
f
|
||||
f
|
||||
p
|
||||
u
|
||||
x
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
d
|
||||
B
|
||||
E
|
||||
H
|
||||
B
|
||||
B
|
||||
c
|
||||
J
|
||||
J
|
||||
J
|
||||
a
|
||||
a
|
||||
"}
|
||||
(16,1,1) = {"
|
||||
a
|
||||
b
|
||||
J
|
||||
c
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
c
|
||||
B
|
||||
B
|
||||
C
|
||||
B
|
||||
B
|
||||
c
|
||||
b
|
||||
J
|
||||
b
|
||||
a
|
||||
a
|
||||
"}
|
||||
(17,1,1) = {"
|
||||
a
|
||||
b
|
||||
J
|
||||
d
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
c
|
||||
C
|
||||
F
|
||||
C
|
||||
B
|
||||
B
|
||||
c
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
a
|
||||
"}
|
||||
(18,1,1) = {"
|
||||
a
|
||||
b
|
||||
J
|
||||
d
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
d
|
||||
B
|
||||
B
|
||||
B
|
||||
B
|
||||
B
|
||||
d
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(19,1,1) = {"
|
||||
a
|
||||
b
|
||||
J
|
||||
d
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
f
|
||||
z
|
||||
B
|
||||
B
|
||||
B
|
||||
B
|
||||
B
|
||||
d
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(20,1,1) = {"
|
||||
a
|
||||
a
|
||||
b
|
||||
c
|
||||
e
|
||||
f
|
||||
g
|
||||
q
|
||||
g
|
||||
y
|
||||
g
|
||||
f
|
||||
e
|
||||
f
|
||||
c
|
||||
B
|
||||
B
|
||||
B
|
||||
B
|
||||
B
|
||||
d
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(21,1,1) = {"
|
||||
a
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
d
|
||||
d
|
||||
c
|
||||
c
|
||||
c
|
||||
d
|
||||
B
|
||||
B
|
||||
B
|
||||
B
|
||||
B
|
||||
d
|
||||
X
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(22,1,1) = {"
|
||||
a
|
||||
a
|
||||
b
|
||||
b
|
||||
J
|
||||
J
|
||||
b
|
||||
b
|
||||
J
|
||||
J
|
||||
J
|
||||
J
|
||||
J
|
||||
J
|
||||
d
|
||||
D
|
||||
B
|
||||
B
|
||||
B
|
||||
B
|
||||
I
|
||||
U
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(23,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
b
|
||||
J
|
||||
J
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
J
|
||||
b
|
||||
J
|
||||
c
|
||||
d
|
||||
d
|
||||
c
|
||||
d
|
||||
c
|
||||
d
|
||||
K
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(24,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
b
|
||||
J
|
||||
J
|
||||
J
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
J
|
||||
b
|
||||
b
|
||||
J
|
||||
J
|
||||
J
|
||||
J
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(25,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
J
|
||||
J
|
||||
J
|
||||
J
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
J
|
||||
J
|
||||
J
|
||||
b
|
||||
J
|
||||
b
|
||||
a
|
||||
"}
|
||||
(26,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
J
|
||||
J
|
||||
J
|
||||
J
|
||||
J
|
||||
a
|
||||
"}
|
||||
(27,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
@@ -3830,7 +3830,7 @@
|
||||
/turf/open/floor/engine/cult,
|
||||
/area/awaymission/academy/academycellar)
|
||||
"kY" = (
|
||||
/obj/effect/decal/cleanable/xenoblood,
|
||||
/obj/effect/decal/cleanable/blood/xeno,
|
||||
/turf/open/floor/engine/cult,
|
||||
/area/awaymission/academy/academycellar)
|
||||
"kZ" = (
|
||||
|
||||
@@ -873,7 +873,7 @@
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/decal/cleanable/xenoblood,
|
||||
/obj/effect/decal/cleanable/blood/xeno,
|
||||
/turf/open/floor/plating{
|
||||
initial_gas_mix = "n2=23;o2=14"
|
||||
},
|
||||
@@ -945,7 +945,7 @@
|
||||
/area/awaymission/caves/research)
|
||||
"cN" = (
|
||||
/obj/machinery/door/window/eastleft,
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs,
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno,
|
||||
/turf/open/floor/plating{
|
||||
initial_gas_mix = "n2=23;o2=14"
|
||||
},
|
||||
@@ -1015,7 +1015,7 @@
|
||||
},
|
||||
/area/awaymission/caves/BMP_asteroid/level_two)
|
||||
"cV" = (
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs,
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno,
|
||||
/turf/open/floor/plating{
|
||||
initial_gas_mix = "n2=23;o2=14"
|
||||
},
|
||||
|
||||
@@ -5597,8 +5597,8 @@
|
||||
},
|
||||
/area/awaymission/moonoutpost19/arrivals)
|
||||
"kK" = (
|
||||
/obj/effect/decal/cleanable/xenoblood,
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs,
|
||||
/obj/effect/decal/cleanable/blood/xeno,
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno,
|
||||
/obj/effect/turf_decal/tile/bar,
|
||||
/obj/effect/turf_decal/tile/bar{
|
||||
dir = 1
|
||||
@@ -5608,7 +5608,7 @@
|
||||
},
|
||||
/area/awaymission/moonoutpost19/arrivals)
|
||||
"kL" = (
|
||||
/obj/effect/decal/cleanable/xenoblood,
|
||||
/obj/effect/decal/cleanable/blood/xeno,
|
||||
/obj/effect/decal/remains/xeno{
|
||||
desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated."
|
||||
},
|
||||
|
||||
@@ -34753,12 +34753,7 @@
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/sleeper)
|
||||
"bCO" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/storage/box/bodybags{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/storage/box/rxglasses,
|
||||
/obj/machinery/bloodbankgen,
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/sleeper)
|
||||
"bCP" = (
|
||||
@@ -36538,6 +36533,11 @@
|
||||
"bGR" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/hand_labeler,
|
||||
/obj/item/storage/box/rxglasses,
|
||||
/obj/item/storage/box/bodybags{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/gun/syringe,
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/sleeper)
|
||||
|
||||
@@ -89232,7 +89232,7 @@
|
||||
/area/maintenance/port)
|
||||
"cTz" = (
|
||||
/obj/effect/decal/remains/xeno,
|
||||
/obj/effect/decal/cleanable/xenoblood,
|
||||
/obj/effect/decal/cleanable/blood/xeno,
|
||||
/turf/open/floor/circuit/green,
|
||||
/area/science/xenobiology)
|
||||
"cTA" = (
|
||||
@@ -93013,10 +93013,10 @@
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/central)
|
||||
"cZK" = (
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/bloodbankgen,
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/central)
|
||||
"cZL" = (
|
||||
|
||||
@@ -56605,11 +56605,6 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/medical/sleeper)
|
||||
"cfK" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/paper_bin{
|
||||
pixel_x = -2;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
pixel_x = 11;
|
||||
pixel_y = 23
|
||||
@@ -56624,6 +56619,7 @@
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/bloodbankgen,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/medical/sleeper)
|
||||
"cfL" = (
|
||||
|
||||
@@ -30073,10 +30073,8 @@
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/zone3)
|
||||
"bbs" = (
|
||||
/obj/item/twohanded/required/kirbyplants{
|
||||
icon_state = "plant-21"
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue,
|
||||
/obj/machinery/bloodbankgen,
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/medbay/zone3)
|
||||
"bbt" = (
|
||||
@@ -43077,7 +43075,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"vsf" = (
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs,
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
|
||||
@@ -31871,14 +31871,11 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/twohanded/required/kirbyplants{
|
||||
icon_state = "plant-21";
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue,
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/bloodbankgen,
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/sleeper)
|
||||
"bwG" = (
|
||||
|
||||
@@ -284,9 +284,6 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/escape)
|
||||
"be" = (
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/chair/sofa/right,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/escape)
|
||||
@@ -363,6 +360,20 @@
|
||||
/obj/structure/shuttle/engine/propulsion,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/escape)
|
||||
"fV" = (
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/shuttle/escape)
|
||||
"IR" = (
|
||||
/obj/effect/spawner/structure/window/plasma/reinforced,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/escape)
|
||||
"Pi" = (
|
||||
/obj/structure/chair/sofa,
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/escape)
|
||||
|
||||
(1,1,1) = {"
|
||||
aa
|
||||
@@ -452,11 +463,11 @@ aP
|
||||
av
|
||||
av
|
||||
ax
|
||||
ab
|
||||
ad
|
||||
ab
|
||||
av
|
||||
fV
|
||||
fV
|
||||
bk
|
||||
ab
|
||||
fV
|
||||
bs
|
||||
bu
|
||||
"}
|
||||
@@ -476,8 +487,8 @@ aT
|
||||
aT
|
||||
aT
|
||||
aT
|
||||
ac
|
||||
ac
|
||||
aT
|
||||
IR
|
||||
be
|
||||
aN
|
||||
bl
|
||||
@@ -501,7 +512,7 @@ ab
|
||||
ad
|
||||
ab
|
||||
ad
|
||||
ad
|
||||
fV
|
||||
bf
|
||||
bl
|
||||
bq
|
||||
@@ -522,11 +533,11 @@ aM
|
||||
aP
|
||||
aU
|
||||
aC
|
||||
aC
|
||||
aX
|
||||
aD
|
||||
ad
|
||||
ad
|
||||
bg
|
||||
fV
|
||||
Pi
|
||||
bm
|
||||
bn
|
||||
bs
|
||||
@@ -546,10 +557,10 @@ ad
|
||||
ab
|
||||
ab
|
||||
aC
|
||||
aC
|
||||
aY
|
||||
aX
|
||||
ad
|
||||
ad
|
||||
fV
|
||||
bh
|
||||
aP
|
||||
bq
|
||||
@@ -570,10 +581,10 @@ aC
|
||||
aD
|
||||
aC
|
||||
ax
|
||||
aC
|
||||
aZ
|
||||
ax
|
||||
ac
|
||||
ac
|
||||
IR
|
||||
bg
|
||||
bl
|
||||
br
|
||||
@@ -594,14 +605,14 @@ aC
|
||||
aQ
|
||||
aV
|
||||
aC
|
||||
aC
|
||||
aX
|
||||
aD
|
||||
ad
|
||||
ab
|
||||
fV
|
||||
bi
|
||||
bn
|
||||
bl
|
||||
ab
|
||||
fV
|
||||
ab
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
@@ -621,10 +632,10 @@ ab
|
||||
ad
|
||||
ad
|
||||
ab
|
||||
ad
|
||||
ab
|
||||
ab
|
||||
ad
|
||||
ad
|
||||
fV
|
||||
fV
|
||||
fV
|
||||
fV
|
||||
fV
|
||||
aa
|
||||
"}
|
||||
|
||||
@@ -1329,6 +1329,14 @@
|
||||
"eP" = (
|
||||
/turf/closed/wall/mineral/plastitanium/nodiagonal,
|
||||
/area/shuttle/escape)
|
||||
"Mb" = (
|
||||
/obj/machinery/door/airlock/hatch{
|
||||
name = "Shuttle EVA";
|
||||
req_access_txt = "19"
|
||||
},
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/shuttle/escape)
|
||||
|
||||
(1,1,1) = {"
|
||||
aa
|
||||
@@ -1645,7 +1653,7 @@ cs
|
||||
ad
|
||||
cr
|
||||
cs
|
||||
aR
|
||||
Mb
|
||||
cs
|
||||
ar
|
||||
br
|
||||
|
||||
@@ -0,0 +1,545 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/open/space/bluespace,
|
||||
/area/hilbertshotel)
|
||||
"b" = (
|
||||
/turf/closed/indestructible/hotelwall,
|
||||
/area/hilbertshotel)
|
||||
"c" = (
|
||||
/obj/machinery/jukebox{
|
||||
req_access = null
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"d" = (
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"e" = (
|
||||
/obj/structure/table/wood,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"f" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/structure/showcase/machinery/tv,
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"g" = (
|
||||
/obj/structure/dresser,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"h" = (
|
||||
/obj/structure/table/wood/fancy,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"i" = (
|
||||
/obj/structure/table/wood/fancy,
|
||||
/obj/structure/mirror{
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"j" = (
|
||||
/obj/structure/table/wood/fancy,
|
||||
/obj/item/flashlight/lamp/green,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"k" = (
|
||||
/obj/structure/chair/comfy/brown{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"l" = (
|
||||
/obj/structure/table/wood/poker,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"m" = (
|
||||
/obj/structure/chair/comfy/brown{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"n" = (
|
||||
/obj/effect/landmark/xmastree,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"o" = (
|
||||
/obj/structure/chair/comfy/brown{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"p" = (
|
||||
/obj/structure/mineral_door/wood,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"q" = (
|
||||
/obj/structure/bed,
|
||||
/obj/item/bedsheet/random,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"r" = (
|
||||
/obj/structure/closet/cabinet{
|
||||
anchored = 1
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"s" = (
|
||||
/obj/structure/table/wood/fancy,
|
||||
/obj/item/reagent_containers/food/snacks/grown/poppy,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"t" = (
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"u" = (
|
||||
/obj/structure/mineral_door/paperframe,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"v" = (
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
pixel_x = 32
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"w" = (
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"x" = (
|
||||
/obj/structure/curtain,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"y" = (
|
||||
/obj/machinery/door/window/northleft,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"z" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"A" = (
|
||||
/obj/structure/mirror{
|
||||
pixel_x = -32
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 8;
|
||||
pixel_x = -12;
|
||||
pixel_y = 2
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"B" = (
|
||||
/obj/structure/chair/stool/bar,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"C" = (
|
||||
/obj/machinery/shower{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"D" = (
|
||||
/obj/machinery/light_switch{
|
||||
pixel_x = 32
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"E" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/soap/deluxe,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"F" = (
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"G" = (
|
||||
/obj/machinery/light_switch{
|
||||
pixel_x = -32
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"H" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/microwave,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"I" = (
|
||||
/turf/closed/indestructible/hoteldoor,
|
||||
/area/hilbertshotel)
|
||||
"J" = (
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"K" = (
|
||||
/obj/structure/closet/crate/bin,
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"L" = (
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"M" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"N" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/soap/deluxe,
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"O" = (
|
||||
/obj/item/bikehorn/rubberducky,
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"P" = (
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"Q" = (
|
||||
/obj/machinery/smartfridge/food,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"R" = (
|
||||
/obj/structure/toilet{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"S" = (
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"T" = (
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced/tinted,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"U" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/structure/sink/kitchen,
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"V" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/effect/spawner/lootdrop/three_course_meal,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
I
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
a
|
||||
b
|
||||
d
|
||||
d
|
||||
k
|
||||
d
|
||||
d
|
||||
t
|
||||
d
|
||||
y
|
||||
t
|
||||
H
|
||||
z
|
||||
b
|
||||
a
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
a
|
||||
b
|
||||
e
|
||||
d
|
||||
l
|
||||
o
|
||||
d
|
||||
d
|
||||
B
|
||||
z
|
||||
d
|
||||
d
|
||||
z
|
||||
b
|
||||
a
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
b
|
||||
f
|
||||
d
|
||||
l
|
||||
o
|
||||
d
|
||||
d
|
||||
B
|
||||
V
|
||||
d
|
||||
d
|
||||
U
|
||||
b
|
||||
a
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
a
|
||||
b
|
||||
e
|
||||
d
|
||||
l
|
||||
o
|
||||
d
|
||||
d
|
||||
B
|
||||
z
|
||||
d
|
||||
d
|
||||
z
|
||||
b
|
||||
a
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
d
|
||||
m
|
||||
d
|
||||
D
|
||||
K
|
||||
v
|
||||
z
|
||||
M
|
||||
Q
|
||||
z
|
||||
b
|
||||
a
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
p
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
a
|
||||
b
|
||||
g
|
||||
d
|
||||
t
|
||||
d
|
||||
G
|
||||
u
|
||||
w
|
||||
A
|
||||
N
|
||||
A
|
||||
E
|
||||
b
|
||||
a
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
a
|
||||
b
|
||||
h
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
b
|
||||
w
|
||||
w
|
||||
w
|
||||
w
|
||||
w
|
||||
b
|
||||
a
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
a
|
||||
b
|
||||
i
|
||||
d
|
||||
n
|
||||
d
|
||||
J
|
||||
b
|
||||
L
|
||||
w
|
||||
R
|
||||
w
|
||||
P
|
||||
b
|
||||
a
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
a
|
||||
b
|
||||
h
|
||||
d
|
||||
d
|
||||
d
|
||||
r
|
||||
b
|
||||
x
|
||||
F
|
||||
S
|
||||
T
|
||||
x
|
||||
b
|
||||
a
|
||||
"}
|
||||
(13,1,1) = {"
|
||||
a
|
||||
b
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
b
|
||||
w
|
||||
w
|
||||
w
|
||||
w
|
||||
w
|
||||
b
|
||||
a
|
||||
"}
|
||||
(14,1,1) = {"
|
||||
a
|
||||
b
|
||||
d
|
||||
j
|
||||
q
|
||||
q
|
||||
s
|
||||
b
|
||||
w
|
||||
C
|
||||
O
|
||||
C
|
||||
w
|
||||
b
|
||||
a
|
||||
"}
|
||||
(15,1,1) = {"
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(16,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
@@ -0,0 +1,289 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/open/space/bluespace,
|
||||
/area/hilbertshotel)
|
||||
"b" = (
|
||||
/turf/closed/indestructible/hotelwall,
|
||||
/area/hilbertshotel)
|
||||
"c" = (
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"d" = (
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"e" = (
|
||||
/turf/closed/indestructible/hoteldoor,
|
||||
/area/hilbertshotel)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
e
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
b
|
||||
a
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
b
|
||||
a
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
b
|
||||
a
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
b
|
||||
a
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
b
|
||||
a
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
c
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
b
|
||||
a
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
b
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
b
|
||||
a
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
b
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
b
|
||||
a
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
b
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
b
|
||||
a
|
||||
"}
|
||||
(13,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
b
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
b
|
||||
a
|
||||
"}
|
||||
(14,1,1) = {"
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
b
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
d
|
||||
b
|
||||
a
|
||||
"}
|
||||
(15,1,1) = {"
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(16,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
@@ -0,0 +1,639 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"aa" = (
|
||||
/turf/open/space/bluespace,
|
||||
/area/hilbertshotel)
|
||||
"ab" = (
|
||||
/turf/closed/indestructible/hotelwall,
|
||||
/area/hilbertshotel)
|
||||
"ac" = (
|
||||
/obj/structure/table/wood/fancy,
|
||||
/obj/structure/mirror{
|
||||
broken = 1;
|
||||
desc = "Oh no, seven years of bad luck!";
|
||||
icon_state = "mirror_broke";
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"ad" = (
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"ae" = (
|
||||
/obj/structure/table/wood,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"af" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/structure/showcase/machinery/tv,
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"ag" = (
|
||||
/obj/structure/dresser,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"ah" = (
|
||||
/obj/structure/table/wood/fancy,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"ai" = (
|
||||
/obj/structure/table/wood/poker,
|
||||
/obj/item/toy/cards/deck,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aj" = (
|
||||
/obj/structure/table/wood/fancy,
|
||||
/obj/item/flashlight/lamp/green,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"ak" = (
|
||||
/obj/structure/chair/comfy/brown{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"al" = (
|
||||
/obj/structure/table/wood/poker,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"am" = (
|
||||
/obj/structure/chair/comfy/brown{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"an" = (
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"ap" = (
|
||||
/obj/structure/bed,
|
||||
/obj/item/bedsheet/random,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aq" = (
|
||||
/obj/structure/chair/comfy/brown{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"ar" = (
|
||||
/obj/structure/mineral_door/wood,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"as" = (
|
||||
/turf/closed/indestructible/hoteldoor,
|
||||
/area/hilbertshotel)
|
||||
"at" = (
|
||||
/obj/effect/decal/cleanable/cobweb,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"au" = (
|
||||
/obj/machinery/light_switch{
|
||||
pixel_x = -32
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"av" = (
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aw" = (
|
||||
/obj/structure/closet/cabinet{
|
||||
anchored = 1
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"ax" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/decal/cleanable/cobweb/cobweb2,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"ay" = (
|
||||
/obj/structure/closet/crate/bin,
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"az" = (
|
||||
/obj/structure/mineral_door/paperframe,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aA" = (
|
||||
/obj/structure/chair/stool/bar,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aB" = (
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
pixel_x = 32
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aC" = (
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aD" = (
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aE" = (
|
||||
/obj/structure/curtain,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aF" = (
|
||||
/obj/machinery/door/window/northleft,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aG" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aH" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/pen,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aI" = (
|
||||
/obj/structure/mirror{
|
||||
pixel_x = -32
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 8;
|
||||
pixel_x = -12;
|
||||
pixel_y = 2
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aJ" = (
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aK" = (
|
||||
/obj/machinery/shower{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aL" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aM" = (
|
||||
/obj/structure/table/wood/poker,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aN" = (
|
||||
/obj/structure/toilet{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aO" = (
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aP" = (
|
||||
/obj/item/bikehorn/rubberducky,
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aQ" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/microwave,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aR" = (
|
||||
/obj/machinery/smartfridge/food,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aS" = (
|
||||
/obj/structure/window/reinforced/tinted{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced/tinted,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aT" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/structure/sink/kitchen,
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aU" = (
|
||||
/obj/structure/bed,
|
||||
/obj/item/bedsheet/random,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aV" = (
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"aW" = (
|
||||
/obj/machinery/jukebox{
|
||||
req_access = null
|
||||
},
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aX" = (
|
||||
/obj/machinery/light_switch{
|
||||
pixel_x = 32
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aY" = (
|
||||
/obj/structure/chair/stool/bar,
|
||||
/obj/effect/decal/cleanable/blood,
|
||||
/obj/effect/decal/cleanable/vomit,
|
||||
/obj/effect/mob_spawn/human/doctorhilbert,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"aZ" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"ba" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/decal/cleanable/cobweb/cobweb2,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"bb" = (
|
||||
/obj/structure/mirror{
|
||||
pixel_x = -32
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 8;
|
||||
pixel_x = -12;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"bc" = (
|
||||
/obj/effect/decal/cleanable/blood,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"bd" = (
|
||||
/obj/machinery/shower{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"be" = (
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"bf" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"bg" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"bh" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/soap/homemade{
|
||||
name = "used soap"
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"bi" = (
|
||||
/obj/effect/decal/cleanable/vomit,
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"bj" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/soap/homemade{
|
||||
name = "used soap"
|
||||
},
|
||||
/turf/open/indestructible/hoteltile,
|
||||
/area/hilbertshotel)
|
||||
"bk" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/analyzer/hilbertsanalyzer,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
"bl" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/paper/crumpled/bloody/docsdeathnote,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotel)
|
||||
|
||||
(1,1,1) = {"
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
as
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
at
|
||||
aL
|
||||
ak
|
||||
ad
|
||||
aL
|
||||
an
|
||||
ad
|
||||
aF
|
||||
be
|
||||
aQ
|
||||
aG
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ae
|
||||
ad
|
||||
al
|
||||
aq
|
||||
ad
|
||||
ad
|
||||
aA
|
||||
aH
|
||||
ad
|
||||
aL
|
||||
aG
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
af
|
||||
ad
|
||||
ai
|
||||
aq
|
||||
aL
|
||||
ad
|
||||
aY
|
||||
bl
|
||||
ad
|
||||
aL
|
||||
aT
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ae
|
||||
ad
|
||||
aM
|
||||
aq
|
||||
ad
|
||||
ad
|
||||
aA
|
||||
bk
|
||||
bf
|
||||
bf
|
||||
aG
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
aW
|
||||
aL
|
||||
am
|
||||
ad
|
||||
aX
|
||||
ay
|
||||
aB
|
||||
aG
|
||||
bg
|
||||
aR
|
||||
aG
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ar
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ag
|
||||
ad
|
||||
an
|
||||
ad
|
||||
au
|
||||
az
|
||||
aC
|
||||
bb
|
||||
bh
|
||||
aI
|
||||
bj
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ah
|
||||
ad
|
||||
aL
|
||||
aL
|
||||
ad
|
||||
ab
|
||||
aZ
|
||||
aZ
|
||||
aC
|
||||
aZ
|
||||
aZ
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ac
|
||||
ad
|
||||
ad
|
||||
aL
|
||||
av
|
||||
ab
|
||||
aD
|
||||
aC
|
||||
aN
|
||||
bi
|
||||
aV
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ah
|
||||
ad
|
||||
aL
|
||||
ad
|
||||
aw
|
||||
ab
|
||||
aE
|
||||
aJ
|
||||
aO
|
||||
aS
|
||||
aE
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(13,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ad
|
||||
ad
|
||||
aL
|
||||
ad
|
||||
ad
|
||||
ab
|
||||
aC
|
||||
bc
|
||||
aZ
|
||||
aZ
|
||||
aC
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(14,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ax
|
||||
aj
|
||||
ap
|
||||
aU
|
||||
ah
|
||||
ab
|
||||
ba
|
||||
bd
|
||||
aP
|
||||
aK
|
||||
aC
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(15,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(16,1,1) = {"
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
"}
|
||||
@@ -0,0 +1,23 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/closed/indestructible/hotelwall,
|
||||
/area/hilbertshotelstorage)
|
||||
"b" = (
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/hilbertshotelstorage)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
b
|
||||
a
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
@@ -0,0 +1,32 @@
|
||||
|
||||
#if DM_VERSION < 513
|
||||
|
||||
#define ismovableatom(A) (istype(A, /atom/movable))
|
||||
|
||||
#define islist(L) (istype(L, /list))
|
||||
|
||||
#define CLAMP01(x) (CLAMP(x, 0, 1))
|
||||
|
||||
#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
|
||||
|
||||
#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
|
||||
|
||||
#define TAN(x) (sin(x) / cos(x))
|
||||
|
||||
#define arctan(x) (arcsin(x/sqrt(1+x*x)))
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
#else
|
||||
|
||||
#define ismovableatom(A) ismovable(A)
|
||||
|
||||
#define CLAMP01(x) clamp(x, 0, 1)
|
||||
|
||||
#define CLAMP(CLVALUE, CLMIN, CLMAX) clamp(CLVALUE, CLMIN, CLMAX)
|
||||
|
||||
#define TAN(x) tan(x)
|
||||
|
||||
#define ATAN2(x, y) arctan(x, y)
|
||||
|
||||
#endif
|
||||
@@ -93,12 +93,6 @@
|
||||
#define isgenital(A) (istype(A, /obj/item/organ/genital))
|
||||
|
||||
#define isborer(A) (istype(A, /mob/living/simple_animal/borer))
|
||||
#define isipcperson(A) (is_species(A, /datum/species/ipc))
|
||||
#define ismammal(A) (is_species(A, /datum/species/mammal))
|
||||
#define isavian(A) (is_species(A, /datum/species/avian))
|
||||
#define isaquatic(A) (is_species(A, /datum/species/aquatic))
|
||||
#define isinsect(A) (is_species(A, /datum/species/insect))
|
||||
#define isxenoperson(A) (is_species(A, /datum/species/xeno))
|
||||
|
||||
#define CITADEL_MENTOR_OOC_COLOUR "#224724"
|
||||
|
||||
|
||||
@@ -5,8 +5,3 @@
|
||||
#define CLEAN_STRONG 4 // Industrial strength
|
||||
#define CLEAN_IMPRESSIVE 5 // Cleaning strong enough your granny would be proud
|
||||
#define CLEAN_GOD 6 // Cleans things spotless down to the atomic structure
|
||||
|
||||
//How strong things have to be to wipe forensic evidence...
|
||||
#define CLEAN_STRENGTH_FINGERPRINTS CLEAN_IMPRESSIVE
|
||||
#define CLEAN_STRENGTH_BLOOD CLEAN_WEAK
|
||||
#define CLEAN_STRENGTH_FIBERS CLEAN_IMPRESSIVE
|
||||
|
||||
@@ -104,8 +104,7 @@
|
||||
#define SHOVE_KNOCKDOWN_HUMAN 30
|
||||
#define SHOVE_KNOCKDOWN_TABLE 30
|
||||
#define SHOVE_KNOCKDOWN_COLLATERAL 10
|
||||
//Shove slowdown
|
||||
#define SHOVE_SLOWDOWN_ID "shove_slowdown"
|
||||
//for the shove slowdown, see __DEFINES/movespeed_modification.dm
|
||||
#define SHOVE_SLOWDOWN_LENGTH 30
|
||||
#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier
|
||||
//Shove disarming item list
|
||||
|
||||
@@ -2,11 +2,8 @@
|
||||
|
||||
#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) )
|
||||
|
||||
//shorthand
|
||||
#define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path)
|
||||
#define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src)
|
||||
|
||||
#define COMPONENT_INCOMPATIBLE 1
|
||||
#define COMPONENT_NOTRANSFER 2
|
||||
|
||||
// How multiple components of the exact same type are handled in the same datum
|
||||
|
||||
@@ -129,7 +126,7 @@
|
||||
#define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize() (can_reenter_corpse)
|
||||
#define COMPONENT_BLOCK_GHOSTING 1
|
||||
#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
|
||||
#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (magic, holy, protection_sources)
|
||||
#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources)
|
||||
#define COMPONENT_BLOCK_MAGIC 1
|
||||
#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): ()
|
||||
#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of
|
||||
@@ -225,14 +222,18 @@
|
||||
#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool.
|
||||
#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength)
|
||||
|
||||
//Blood color
|
||||
#define COMSIG_BLOOD_COLOR "blood_DNA_to_color" //RGB blood stuff
|
||||
//Food
|
||||
#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
|
||||
|
||||
//Gibs
|
||||
#define COMSIG_GIBS_STREAK "gibs_streak" // from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases)
|
||||
|
||||
//Mood
|
||||
#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code.
|
||||
#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code.
|
||||
#define COMSIG_INCREASE_SANITY "decrease_sanity" //Called when you want to increase sanity from anywhere in the code.
|
||||
#define COMSIG_DECREASE_SANITY "increase_sanity" //Same as above but to decrease sanity instead.
|
||||
#define COMSIG_MODIFY_SANITY "modify_sanity" //Called when you want to increase or decrease sanity from anywhere in the code.
|
||||
|
||||
//NTnet
|
||||
#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
|
||||
|
||||
@@ -58,6 +58,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
|
||||
#define GROUND (1<<0)
|
||||
#define FLYING (1<<1)
|
||||
#define VENTCRAWLING (1<<2)
|
||||
#define FLOATING (1<<3)
|
||||
|
||||
//Fire and Acid stuff, for resistance_flags
|
||||
#define LAVA_PROOF (1<<0)
|
||||
|
||||
@@ -15,6 +15,15 @@
|
||||
//misc footstep sounds
|
||||
#define FOOTSTEP_GENERIC_HEAVY "heavy"
|
||||
|
||||
#define FOOTPRINT_SHOE "shoe"
|
||||
#define FOOTPRINT_FOOT "foot"
|
||||
#define FOOTPRINT_PAW "paw"
|
||||
#define FOOTPRINT_CLAW "claw"
|
||||
#define FOOTPRINT_WHEEL "wheels"
|
||||
#define FOOTPRINT_TRAIL "trails_"
|
||||
#define FOOTPRINT_SNAKE "snake"
|
||||
#define FOOTPRINT_DRAG "drag"
|
||||
|
||||
/*
|
||||
|
||||
id = list(
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
#define IF_HAS_BLOOD_DNA(__thing) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA))
|
||||
#define IF_HAS_BLOOD_DNA_AND(__thing, __conditions...) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA) && (##__conditions))
|
||||
@@ -28,7 +28,9 @@
|
||||
#define ITEM_SLOT_POCKET (1<<11) // this is to allow items with a w_class of WEIGHT_CLASS_NORMAL or WEIGHT_CLASS_BULKY to fit in pockets.
|
||||
#define ITEM_SLOT_DENYPOCKET (1<<12) // this is to deny items with a w_class of WEIGHT_CLASS_SMALL or WEIGHT_CLASS_TINY to fit in pockets.
|
||||
#define ITEM_SLOT_NECK (1<<13)
|
||||
#define ITEM_SLOT_SUITSTORE (1<<14)
|
||||
#define ITEM_SLOT_HANDS (1<<14)
|
||||
#define ITEM_SLOT_BACKPACK (1<<15)
|
||||
#define ITEM_SLOT_SUITSTORE (1<<16)
|
||||
|
||||
//SLOTS
|
||||
#define SLOT_BACK 1
|
||||
@@ -86,6 +88,10 @@
|
||||
. = ITEM_SLOT_ICLOTHING
|
||||
if(SLOT_L_STORE, SLOT_R_STORE)
|
||||
. = ITEM_SLOT_POCKET
|
||||
if(SLOT_HANDS)
|
||||
. = ITEM_SLOT_HANDS
|
||||
if(SLOT_IN_BACKPACK)
|
||||
. = ITEM_SLOT_BACKPACK
|
||||
if(SLOT_S_STORE)
|
||||
. = ITEM_SLOT_SUITSTORE
|
||||
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
// simple is_type and similar inline helpers
|
||||
|
||||
#define islist(L) (istype(L, /list))
|
||||
|
||||
#define in_range(source, user) (get_dist(source, user) <= 1 && (get_step(source, 0)?:z) == (get_step(user, 0)?:z))
|
||||
|
||||
#define ismovableatom(A) (istype(A, /atom/movable))
|
||||
|
||||
#define isatom(A) (isloc(A))
|
||||
|
||||
#define isweakref(D) (istype(D, /datum/weakref))
|
||||
@@ -61,6 +57,15 @@
|
||||
#define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) )
|
||||
#define isdwarf(A) (is_species(A, /datum/species/dwarf))
|
||||
|
||||
// Citadel specific species
|
||||
#define isipcperson(A) (is_species(A, /datum/species/ipc))
|
||||
#define ismammal(A) (is_species(A, /datum/species/mammal))
|
||||
#define isavian(A) (is_species(A, /datum/species/avian))
|
||||
#define isaquatic(A) (is_species(A, /datum/species/aquatic))
|
||||
#define isinsect(A) (is_species(A, /datum/species/insect))
|
||||
#define isxenoperson(A) (is_species(A, /datum/species/xeno))
|
||||
#define isstartjelly(A) (is_species(A, /datum/species/jelly/roundstartslime))
|
||||
|
||||
//more carbon mobs
|
||||
#define ismonkey(A) (istype(A, /mob/living/carbon/monkey))
|
||||
|
||||
@@ -178,6 +183,8 @@ GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list(
|
||||
|
||||
#define iscameramob(A) (istype(A, /mob/camera))
|
||||
|
||||
#define isaicamera(A) (istype(A, /mob/camera/aiEye))
|
||||
|
||||
#define iseminence(A) (istype(A, /mob/camera/eminence))
|
||||
|
||||
//Footstep helpers
|
||||
@@ -237,4 +244,4 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list(
|
||||
|
||||
#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob))
|
||||
|
||||
#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs))
|
||||
#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs))
|
||||
@@ -92,3 +92,7 @@ require only minor tweaks.
|
||||
#define PLACE_SAME_Z "same"
|
||||
#define PLACE_SPACE_RUIN "space"
|
||||
#define PLACE_LAVA_RUIN "lavaland"
|
||||
|
||||
|
||||
//Map type stuff.
|
||||
#define MAP_TYPE_STATION "station"
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(TICK_USAGE_REAL - starting_tickusage))
|
||||
|
||||
#define PERCENT(val) (round((val)*100, 0.1))
|
||||
#define CLAMP01(x) (CLAMP(x, 0, 1))
|
||||
|
||||
//time of day but automatically adjusts to the server going into the next day within the same round.
|
||||
//for when you need a reliable time number that doesn't depend on byond time.
|
||||
@@ -30,17 +29,12 @@
|
||||
// round() acts like floor(x, 1) by default but can't handle other values
|
||||
#define FLOOR(x, y) ( round((x) / (y)) * (y) )
|
||||
|
||||
#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
|
||||
|
||||
// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive
|
||||
#define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) )
|
||||
|
||||
// Real modulus that handles decimals
|
||||
#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) )
|
||||
|
||||
// Tangent
|
||||
#define TAN(x) (sin(x) / cos(x))
|
||||
|
||||
// Cotangent
|
||||
#define COT(x) (1 / TAN(x))
|
||||
|
||||
@@ -50,8 +44,6 @@
|
||||
// Cosecant
|
||||
#define CSC(x) (1 / sin(x))
|
||||
|
||||
#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
|
||||
|
||||
// Greatest Common Divisor - Euclid's algorithm
|
||||
/proc/Gcd(a, b)
|
||||
return b ? Gcd(b, (a) % (b)) : a
|
||||
@@ -207,4 +199,4 @@
|
||||
#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 )
|
||||
|
||||
#define RULE_OF_THREE(a, b, x) ((a*x)/b)
|
||||
// )
|
||||
// )
|
||||
+12
-2
@@ -171,12 +171,22 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
|
||||
#define BLOOD_LOSS_IN_SPREAD 20
|
||||
|
||||
//Bloody shoe blood states
|
||||
#define BLOOD_STATE_HUMAN "blood"
|
||||
#define BLOOD_STATE_XENO "xeno"
|
||||
#define BLOOD_STATE_BLOOD "blood"
|
||||
#define BLOOD_STATE_OIL "oil"
|
||||
#define BLOOD_STATE_NOT_BLOODY "no blood whatsoever"
|
||||
#define BLOOD_AMOUNT_PER_DECAL 20
|
||||
|
||||
//Blood Decal Colors
|
||||
#define BLOOD_COLOR_HUMAN "#dc0000"
|
||||
#define BLOOD_COLOR_XENO "#94a83c"
|
||||
#define BLOOD_COLOR_OIL "#301d02"
|
||||
#define BLOOD_COLOR_SYNTHETIC "#3f48aa"
|
||||
#define BLOOD_COLOR_SLIME "#00ff90"
|
||||
#define BLOOD_COLOR_LIZARD "#db004D"
|
||||
#define BLOOD_COLOR_UNIVERSAL "#db3300"
|
||||
#define BLOOD_COLOR_BUG "#a37c0f"
|
||||
|
||||
|
||||
//suit sensors: sensor_mode defines
|
||||
|
||||
#define SENSOR_OFF 0
|
||||
|
||||
@@ -1,12 +1,19 @@
|
||||
#define MOVESPEED_DATA_INDEX_PRIORITY 1
|
||||
#define MOVESPEED_DATA_INDEX_FLAGS 2
|
||||
#define MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN 3
|
||||
#define MOVESPEED_DATA_INDEX_MOVETYPE 4
|
||||
#define MOVESPEED_DATA_INDEX_BL_MOVETYPE 5
|
||||
#define MOVESPEED_DATA_INDEX_CONFLICT 6
|
||||
|
||||
#define MOVESPEED_DATA_INDEX_MAX 3
|
||||
#define MOVESPEED_DATA_INDEX_MAX 6
|
||||
|
||||
//flags
|
||||
#define IGNORE_NOSLOW (1 << 0)
|
||||
|
||||
//conflict types
|
||||
|
||||
#define MOVE_CONFLICT_JETPACK "JETPACK"
|
||||
|
||||
//ids
|
||||
|
||||
#define MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED "MOB_WALK_RUN"
|
||||
@@ -16,15 +23,29 @@
|
||||
#define MOVESPEED_ID_SLIME_HEALTHMOD "SLIME_HEALTH_MODIFIER"
|
||||
#define MOVESPEED_ID_SLIME_TEMPMOD "SLIME_TEMPERATURE_MODIFIER"
|
||||
|
||||
#define MOVESPEED_ID_SLIME_STATUS "SLIME_STATUS"
|
||||
|
||||
#define MOVESPEED_ID_TARANTULA_WEB "TARANTULA_WEB"
|
||||
|
||||
#define MOVESPEED_ID_LIVING_TURF_SPEEDMOD "LIVING_TURF_SPEEDMOD"
|
||||
|
||||
#define MOVESPEED_ID_CARBON_SOFTCRIT "CARBON_SOFTCRIT"
|
||||
#define MOVESPEED_ID_CARBON_OLDSPEED "CARBON_DEPRECATED_SPEED"
|
||||
|
||||
#define MOVESPEED_ID_DNA_VAULT "DNA_VAULT"
|
||||
|
||||
#define MOVESPEED_ID_YELLOW_ORB "YELLOW_ORB"
|
||||
|
||||
#define MOVESPEED_ID_TARFOOT "TARFOOT"
|
||||
|
||||
#define MOVESPEED_ID_SEPIA "SEPIA"
|
||||
|
||||
#define MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD "MONKEY_REAGENT_SPEEDMOD"
|
||||
#define MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD "MONKEY_TEMPERATURE_SPEEDMOD"
|
||||
#define MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD "MONKEY_HEALTH_SPEEDMOD"
|
||||
|
||||
#define MOVESPEED_ID_CHANGELING_MUSCLES "CHANGELING_MUSCLES"
|
||||
|
||||
#define MOVESPEED_ID_SIMPLEMOB_VARSPEED "SIMPLEMOB_VARSPEED_MODIFIER"
|
||||
#define MOVESPEED_ID_ADMIN_VAREDIT "ADMIN_VAREDIT_MODIFIER"
|
||||
|
||||
@@ -32,8 +53,19 @@
|
||||
|
||||
#define MOVESPEED_ID_SANITY "MOOD_SANITY"
|
||||
|
||||
#define MOVESPEED_ID_SPECIES "SPECIES_SPEED_MOD"
|
||||
|
||||
#define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG"
|
||||
#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
|
||||
#define MOVESPEED_ID_SHRINK_RAY "SHRUNKEN_SPEED_MODIFIER"
|
||||
|
||||
#define MOVESPEED_ID_TASED_STATUS "TASED"
|
||||
#define MOVESPEED_ID_TASED_STATUS "TASED"
|
||||
|
||||
#define MOVESPEED_ID_SLAUGHTER "SLAUGHTER"
|
||||
|
||||
#define MOVESPEED_ID_CYBER_THRUSTER "CYBER_IMPLANT_THRUSTER"
|
||||
#define MOVESPEED_ID_JETPACK "JETPACK"
|
||||
|
||||
#define MOVESPEED_ID_SHOVE "SHOVE"
|
||||
|
||||
#define MOVESPEED_ID_MKULTRA "MKULTRA"
|
||||
+26
-24
@@ -2,43 +2,45 @@
|
||||
|
||||
|
||||
#define EMAGGED (1<<0)
|
||||
#define IN_USE (1<<1) // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING!
|
||||
#define CAN_BE_HIT (1<<2) //can this be bludgeoned by items?
|
||||
#define BEING_SHOCKED (1<<3) // Whether this thing is currently (already) being shocked by a tesla
|
||||
#define DANGEROUS_POSSESSION (1<<4) //Admin possession yes/no
|
||||
#define ON_BLUEPRINTS (1<<5) //Are we visible on the station blueprints at roundstart?
|
||||
#define UNIQUE_RENAME (1<<6) // can you customize the description/name of the thing?
|
||||
#define IN_USE (1<<1) //If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING!
|
||||
#define CAN_BE_HIT (1<<2) //can this be bludgeoned by items?
|
||||
#define BEING_SHOCKED (1<<3) //Whether this thing is currently (already) being shocked by a tesla
|
||||
#define DANGEROUS_POSSESSION (1<<4) //Admin possession yes/no
|
||||
#define ON_BLUEPRINTS (1<<5) //Are we visible on the station blueprints at roundstart?
|
||||
#define UNIQUE_RENAME (1<<6) //can you customize the description/name of the thing?
|
||||
#define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI.
|
||||
#define FROZEN (1<<8)
|
||||
#define SHOVABLE_ONTO (1<<9) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check.
|
||||
#define SHOVABLE_ONTO (1<<9) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check.
|
||||
|
||||
// If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support
|
||||
|
||||
// Flags for the item_flags var on /obj/item
|
||||
|
||||
#define BEING_REMOVED (1<<0)
|
||||
#define IN_INVENTORY (1<<1) //is this item equipped into an inventory slot or hand of a mob? used for tooltips
|
||||
#define FORCE_STRING_OVERRIDE (1<<2) // used for tooltips
|
||||
#define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use.
|
||||
#define IN_INVENTORY (1<<1) //is this item equipped into an inventory slot or hand of a mob? used for tooltips
|
||||
#define FORCE_STRING_OVERRIDE (1<<2) //used for tooltips
|
||||
#define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use.
|
||||
#define SLOWS_WHILE_IN_HAND (1<<4)
|
||||
#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
|
||||
#define DROPDEL (1<<6) // When dropped, it calls qdel on itself
|
||||
#define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
|
||||
#define ABSTRACT (1<<8) // for all things that are technically items but used for various different stuff
|
||||
#define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect)
|
||||
#define NO_MAT_REDEMPTION (1<<5) //Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
|
||||
#define DROPDEL (1<<6) //When dropped, it calls qdel on itself
|
||||
#define NOBLUDGEON (1<<7) //when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
|
||||
#define ABSTRACT (1<<8) //for all things that are technically items but used for various different stuff
|
||||
#define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect)
|
||||
#define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes)
|
||||
#define NO_UNIFORM_REQUIRED (1<<11) // Can be worn on certain slots (currently belt and id) that would otherwise require an uniform.
|
||||
#define NO_UNIFORM_REQUIRED (1<<11) //Can be worn on certain slots (currently belt and id) that would otherwise require an uniform.
|
||||
|
||||
// Flags for the clothing_flags var on /obj/item/clothing
|
||||
|
||||
#define LAVAPROTECT (1<<0)
|
||||
#define LAVAPROTECT (1<<0)
|
||||
#define STOPSPRESSUREDAMAGE (1<<1) //SUIT and HEAD items which stop pressure damage. To stop you taking all pressure damage you must have both a suit and head item with this flag.
|
||||
#define BLOCK_GAS_SMOKE_EFFECT (1<<2) // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
|
||||
#define ALLOWINTERNALS (1<<3) // mask allows internals
|
||||
#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc
|
||||
#define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
|
||||
#define VOICEBOX_TOGGLABLE (1<<6) // The voicebox in this clothing can be toggled.
|
||||
#define VOICEBOX_DISABLED (1<<7) // The voicebox is currently turned off.
|
||||
#define BLOCK_GAS_SMOKE_EFFECT (1<<2) //blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
|
||||
#define ALLOWINTERNALS (1<<3) //mask allows internals
|
||||
#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc
|
||||
#define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
|
||||
#define VOICEBOX_TOGGLABLE (1<<6) //The voicebox in this clothing can be toggled.
|
||||
#define VOICEBOX_DISABLED (1<<7) //The voicebox is currently turned off.
|
||||
#define SNUG_FIT (1<<8) //Prevents knock-off from things like hat-throwing.
|
||||
#define ANTI_TINFOIL_MANEUVER (1<<9) //Hats with negative effects when worn (i.e the tinfoil hat).
|
||||
|
||||
// Flags for the organ_flags var on /obj/item/organ
|
||||
|
||||
@@ -47,4 +49,4 @@
|
||||
#define ORGAN_FAILING (1<<2) //Failing organs perform damaging effects until replaced or fixed
|
||||
#define ORGAN_EXTERNAL (1<<3) //Was this organ implanted/inserted/etc, if true will not be removed during species change.
|
||||
#define ORGAN_VITAL (1<<4) //Currently only the brain
|
||||
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
|
||||
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
|
||||
@@ -23,6 +23,8 @@
|
||||
#define MODE_WHISPER "whisper"
|
||||
#define MODE_WHISPER_CRIT "whispercrit"
|
||||
|
||||
#define MODE_CUSTOM_SAY "custom_say"
|
||||
|
||||
#define MODE_DEPARTMENT "department"
|
||||
#define MODE_KEY_DEPARTMENT "h"
|
||||
#define MODE_TOKEN_DEPARTMENT ":h"
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
#define CHANNEL_ADMIN 1023
|
||||
#define CHANNEL_VOX 1022
|
||||
#define CHANNEL_JUKEBOX 1021
|
||||
#define CHANNEL_JUKEBOX_START 1020
|
||||
#define CHANNEL_JUSTICAR_ARK 1019
|
||||
#define CHANNEL_HEARTBEAT 1018 //sound channel for heartbeats
|
||||
#define CHANNEL_AMBIENCE 1017
|
||||
#define CHANNEL_BUZZ 1016
|
||||
#define CHANNEL_BICYCLE 1015
|
||||
#define CHANNEL_JUKEBOX_START 1016 //The gap between this and CHANNEL_JUKEBOX determines the amount of free jukebox channels. This currently allows 6 jukebox channels to exist.
|
||||
#define CHANNEL_JUSTICAR_ARK 1015
|
||||
#define CHANNEL_HEARTBEAT 1014 //sound channel for heartbeats
|
||||
#define CHANNEL_AMBIENCE 1013
|
||||
#define CHANNEL_BUZZ 1012
|
||||
#define CHANNEL_BICYCLE 1011
|
||||
|
||||
//CIT CHANNELS - TRY NOT TO REGRESS
|
||||
#define CHANNEL_PRED 1010
|
||||
|
||||
@@ -99,7 +99,6 @@
|
||||
#define FIRE_PRIORITY_GARBAGE 15
|
||||
#define FIRE_PRIORITY_WET_FLOORS 20
|
||||
#define FIRE_PRIORITY_AIR 20
|
||||
#define FIRE_PRIORITY_NPC 20
|
||||
#define FIRE_PRIORITY_PROCESS 25
|
||||
#define FIRE_PRIORITY_THROWING 25
|
||||
#define FIRE_PRIORITY_SPACEDRIFT 30
|
||||
@@ -112,6 +111,7 @@
|
||||
#define FIRE_PRIORITY_AIR_TURFS 40
|
||||
#define FIRE_PRIORITY_DEFAULT 50
|
||||
#define FIRE_PRIORITY_PARALLAX 65
|
||||
#define FIRE_PRIORITY_NPC 80
|
||||
#define FIRE_PRIORITY_FLIGHTPACKS 80
|
||||
#define FIRE_PRIORITY_MOBS 100
|
||||
#define FIRE_PRIORITY_TGUI 110
|
||||
|
||||
@@ -70,8 +70,6 @@
|
||||
#define TRAIT_MONKEYLIKE "monkeylike" //sets IsAdvancedToolUser to FALSE
|
||||
#define TRAIT_PACIFISM "pacifism"
|
||||
#define TRAIT_IGNORESLOWDOWN "ignoreslow"
|
||||
#define TRAIT_GOTTAGOFAST "fast"
|
||||
#define TRAIT_GOTTAGOREALLYFAST "2fast"
|
||||
#define TRAIT_DEATHCOMA "deathcoma" //Causes death-like unconsciousness
|
||||
#define TRAIT_FAKEDEATH "fakedeath" //Makes the owner appear as dead to most forms of medical examination
|
||||
#define TRAIT_DISFIGURED "disfigured"
|
||||
|
||||
@@ -379,6 +379,12 @@
|
||||
i++
|
||||
return i
|
||||
|
||||
/proc/count_occurences_of_value(list/L, val, limit) //special thanks to salmonsnake
|
||||
. = 0
|
||||
for (var/i in 1 to limit)
|
||||
if (L[i] == val)
|
||||
.++
|
||||
|
||||
/proc/find_record(field, value, list/L)
|
||||
for(var/datum/data/record/R in L)
|
||||
if(R.fields[field] == value)
|
||||
@@ -514,7 +520,7 @@
|
||||
used_key_list[input_key] = 1
|
||||
return input_key
|
||||
|
||||
#if DM_VERSION > 512
|
||||
#if DM_VERSION > 513
|
||||
#error Remie said that lummox was adding a way to get a lists
|
||||
#error contents via list.values, if that is true remove this
|
||||
#error otherwise, update the version and bug lummox
|
||||
@@ -564,4 +570,4 @@
|
||||
if(key in L1)
|
||||
L1[key] += other_value
|
||||
else
|
||||
L1[key] = other_value
|
||||
L1[key] = other_value
|
||||
@@ -1,4 +1,4 @@
|
||||
/proc/priority_announce(text, title = "", sound = 'sound/ai/attention.ogg', type , sender_override)
|
||||
/proc/priority_announce(text, title = "", sound = "attention", type , sender_override)
|
||||
if(!text)
|
||||
return
|
||||
|
||||
@@ -29,19 +29,110 @@
|
||||
announcement += "<br><span class='alert'>[html_encode(text)]</span><br>"
|
||||
announcement += "<br>"
|
||||
|
||||
var/s = sound(sound)
|
||||
var/s = sound(get_announcer_sound(sound))
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(!isnewplayer(M) && M.can_hear())
|
||||
to_chat(M, announcement)
|
||||
if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)
|
||||
SEND_SOUND(M, s)
|
||||
|
||||
/proc/get_announcer_sound(soundid)
|
||||
if(isfile(soundid))
|
||||
return soundid
|
||||
else if(!istext(soundid))
|
||||
CRASH("Invalid type passed to get_announcer_sound()")
|
||||
switch(GLOB.announcertype) //These are all individually hardcoded to allow the announcer sounds to be included in the rsc, reducing lag from sending resources midgame.
|
||||
if("classic")
|
||||
switch(soundid)
|
||||
if("aimalf")
|
||||
. = 'sound/announcer/classic/aimalf.ogg'
|
||||
if("aliens")
|
||||
. = 'sound/announcer/classic/aliens.ogg'
|
||||
if("animes")
|
||||
. = 'sound/announcer/classic/animes.ogg'
|
||||
if("attention")
|
||||
. = 'sound/announcer/classic/attention.ogg'
|
||||
if("commandreport")
|
||||
. = 'sound/announcer/classic/commandreport.ogg'
|
||||
if("granomalies")
|
||||
. = 'sound/announcer/classic/granomalies.ogg'
|
||||
if("intercept")
|
||||
. = 'sound/announcer/classic/intercept.ogg'
|
||||
if("ionstorm")
|
||||
. = 'sound/announcer/classic/ionstorm.ogg'
|
||||
if("meteors")
|
||||
. = 'sound/announcer/classic/meteors.ogg'
|
||||
if("newAI")
|
||||
. = 'sound/announcer/classic/newAI.ogg'
|
||||
if("outbreak5")
|
||||
. = 'sound/announcer/classic/outbreak5.ogg'
|
||||
if("outbreak7")
|
||||
. = 'sound/announcer/classic/outbreak7.ogg'
|
||||
if("poweroff")
|
||||
. = 'sound/announcer/classic/poweroff.ogg'
|
||||
if("poweron")
|
||||
. = 'sound/announcer/classic/poweron.ogg'
|
||||
if("radiation")
|
||||
. = 'sound/announcer/classic/radiation.ogg'
|
||||
if("shuttlecalled")
|
||||
. = 'sound/announcer/classic/shuttlecalled.ogg'
|
||||
if("shuttledock")
|
||||
. = 'sound/announcer/classic/shuttledock.ogg'
|
||||
if("shuttlerecalled")
|
||||
. = 'sound/announcer/classic/shuttlerecalled.ogg'
|
||||
if("spanomalies")
|
||||
. = 'sound/announcer/classic/spanomalies.ogg'
|
||||
if("welcome")
|
||||
. = 'sound/announcer/classic/welcome.ogg'
|
||||
if("medibot")
|
||||
switch(soundid)
|
||||
if("aimalf")
|
||||
. = 'sound/announcer/classic/aimalf.ogg'
|
||||
if("aliens")
|
||||
. = 'sound/announcer/medibot/aliens.ogg'
|
||||
if("animes")
|
||||
. = 'sound/announcer/medibot/animes.ogg'
|
||||
if("attention")
|
||||
. = 'sound/announcer/medibot/attention.ogg'
|
||||
if("commandreport")
|
||||
. = 'sound/announcer/medibot/commandreport.ogg'
|
||||
if("granomalies")
|
||||
. = 'sound/announcer/medibot/granomalies.ogg'
|
||||
if("intercept")
|
||||
. = 'sound/announcer/medibot/intercept.ogg'
|
||||
if("ionstorm")
|
||||
. = 'sound/announcer/medibot/ionstorm.ogg'
|
||||
if("meteors")
|
||||
. = 'sound/announcer/medibot/meteors.ogg'
|
||||
if("newAI")
|
||||
. = 'sound/announcer/medibot/newAI.ogg'
|
||||
if("outbreak5")
|
||||
. = 'sound/announcer/medibot/outbreak5.ogg'
|
||||
if("outbreak7")
|
||||
. = 'sound/announcer/medibot/outbreak7.ogg'
|
||||
if("poweroff")
|
||||
. = 'sound/announcer/medibot/poweroff.ogg'
|
||||
if("poweron")
|
||||
. = 'sound/announcer/medibot/poweron.ogg'
|
||||
if("radiation")
|
||||
. = 'sound/announcer/medibot/radiation.ogg'
|
||||
if("shuttlecalled")
|
||||
. = 'sound/announcer/medibot/shuttlecalled.ogg'
|
||||
if("shuttledock")
|
||||
. = 'sound/announcer/medibot/shuttledocked.ogg'
|
||||
if("shuttlerecalled")
|
||||
. = 'sound/announcer/medibot/shuttlerecalled.ogg'
|
||||
if("spanomalies")
|
||||
. = 'sound/announcer/medibot/spanomalies.ogg'
|
||||
if("welcome")
|
||||
. = 'sound/announcer/medibot/welcome.ogg'
|
||||
|
||||
/proc/print_command_report(text = "", title = null, announce=TRUE)
|
||||
if(!title)
|
||||
title = "Classified [command_name()] Update"
|
||||
|
||||
if(announce)
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg')
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport")
|
||||
|
||||
var/datum/comm_message/M = new
|
||||
M.title = title
|
||||
|
||||
@@ -451,10 +451,6 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
var/y = min(world.maxy, max(1, A.y + dy))
|
||||
return locate(x,y,A.z)
|
||||
|
||||
/proc/arctan(x)
|
||||
var/y=arcsin(x/sqrt(1+x*x))
|
||||
return y
|
||||
|
||||
/*
|
||||
Gets all contents of contents and returns them all in a list.
|
||||
*/
|
||||
@@ -756,7 +752,6 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
loc = loc.loc
|
||||
return null
|
||||
|
||||
|
||||
//For objects that should embed, but make no sense being is_sharp or is_pointed()
|
||||
//e.g: rods
|
||||
GLOBAL_LIST_INIT(can_embed_types, typecacheof(list(
|
||||
@@ -1550,3 +1545,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
for(var/i in L)
|
||||
if(condition.Invoke(i))
|
||||
. |= i
|
||||
|
||||
/proc/CallAsync(datum/source, proctype, list/arguments)
|
||||
set waitfor = FALSE
|
||||
return call(source, proctype)(arglist(arguments))
|
||||
@@ -142,6 +142,8 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"THICKMATERIAL" = THICKMATERIAL,
|
||||
"VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE,
|
||||
"VOICEBOX_DISABLED" = VOICEBOX_DISABLED,
|
||||
"SNUG_FIT" = SNUG_FIT,
|
||||
"ANTI_TINFOIL_MANEUVER" = ANTI_TINFOIL_MANEUVER,
|
||||
),
|
||||
"tesla_flags" = list(
|
||||
"TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE,
|
||||
|
||||
@@ -58,3 +58,64 @@ GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traito
|
||||
for(var/i in GLOB.mob_list)
|
||||
var/mob/M = i
|
||||
M.update_config_movespeed()
|
||||
|
||||
GLOBAL_LIST_INIT(noodle_taurs, list(
|
||||
"Naga",
|
||||
"Tentacle"
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(paw_taurs, list(
|
||||
"Fox",
|
||||
"Wolf",
|
||||
"Otie",
|
||||
"Drake",
|
||||
"Lab",
|
||||
"Shepherd",
|
||||
"Husky",
|
||||
"Eevee",
|
||||
"Panther",
|
||||
"Horse",
|
||||
"Cow",
|
||||
"Tiger"
|
||||
))
|
||||
|
||||
//blood types
|
||||
GLOBAL_LIST_INIT(regular_bloods,list(
|
||||
"O-",
|
||||
"O+",
|
||||
"A-",
|
||||
"A+",
|
||||
"B-",
|
||||
"B+",
|
||||
"AB-",
|
||||
"AB+"
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(all_types_bloods,list(
|
||||
"O-",
|
||||
"O+",
|
||||
"A-",
|
||||
"A+",
|
||||
"B-",
|
||||
"B+",
|
||||
"AB-",
|
||||
"AB+",
|
||||
"SY",
|
||||
"X*",
|
||||
"HF",
|
||||
"L",
|
||||
"U",
|
||||
"GEL",
|
||||
"BUG"
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(blood_types, list(
|
||||
"blood",
|
||||
"jellyblood"
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(blood_id_types, list(
|
||||
"blood" = /datum/reagent/blood,
|
||||
"jellyblood" = /datum/reagent/blood/jellyblood
|
||||
))
|
||||
|
||||
|
||||
@@ -2,6 +2,12 @@ GLOBAL_VAR_INIT(admin_notice, "") // Admin notice that all clients see when join
|
||||
|
||||
GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the host computer) and 0 world.ticks.
|
||||
|
||||
GLOBAL_VAR_INIT(year, time2text(world.realtime,"YYYY"))
|
||||
GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013???
|
||||
|
||||
|
||||
GLOBAL_VAR_INIT(announcertype, "standard")
|
||||
|
||||
// For FTP requests. (i.e. downloading runtime logs.)
|
||||
// However it'd be ok to use for accessing attack logs and such too, which are even laggier.
|
||||
GLOBAL_VAR_INIT(fileaccess_timer, 0)
|
||||
@@ -24,4 +30,4 @@ GLOBAL_VAR(bible_name)
|
||||
GLOBAL_VAR(bible_icon_state)
|
||||
GLOBAL_VAR(bible_item_state)
|
||||
GLOBAL_VAR(holy_weapon_type)
|
||||
GLOBAL_VAR(holy_armor_type)
|
||||
GLOBAL_VAR(holy_armor_type)
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
if (!target.loc)
|
||||
continue
|
||||
|
||||
if(!(SEND_SIGNAL(target.loc, COMSIG_ATOM_CANREACH, next) & COMPONENT_BLOCK_REACH))
|
||||
if(!(SEND_SIGNAL(target.loc, COMSIG_ATOM_CANREACH, next) & COMPONENT_BLOCK_REACH) && target.loc.canReachInto(src, ultimate_target, next, view_only, tool))
|
||||
next += target.loc
|
||||
|
||||
checking = next
|
||||
@@ -215,6 +215,10 @@
|
||||
/mob/living/DirectAccess(atom/target)
|
||||
return ..() + GetAllContents()
|
||||
|
||||
//This is called reach into but it's called on the deepest things first so uh, make sure to account for that!
|
||||
/atom/proc/canReachInto(atom/user, atom/target, list/next, view_only, obj/item/tool)
|
||||
return TRUE
|
||||
|
||||
/atom/proc/AllowClick()
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -49,9 +49,9 @@
|
||||
#define ui_storage1 "CENTER+1:18,SOUTH:5"
|
||||
#define ui_storage2 "CENTER+2:20,SOUTH:5"
|
||||
|
||||
#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs
|
||||
#define ui_borg_lamp "CENTER-4:16, SOUTH:5" //borgs
|
||||
#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //borgs
|
||||
#define ui_borg_sensor "CENTER-3:15, SOUTH:5" //borgs
|
||||
#define ui_borg_lamp "CENTER-4:15, SOUTH:5" //borgs
|
||||
#define ui_borg_thrusters "CENTER-5:15, SOUTH:5" //borgs
|
||||
#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs
|
||||
#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs
|
||||
#define ui_inv3 "CENTER :16,SOUTH:5" //borgs
|
||||
@@ -59,7 +59,7 @@
|
||||
#define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs
|
||||
#define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs
|
||||
#define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs
|
||||
#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" //borgs
|
||||
#define ui_borg_language_menu "EAST-1:27,SOUTH+2:8" //borgs
|
||||
|
||||
#define ui_monkey_head "CENTER-5:13,SOUTH:5" //monkey
|
||||
#define ui_monkey_mask "CENTER-4:14,SOUTH:5" //monkey
|
||||
|
||||
@@ -88,6 +88,26 @@
|
||||
var/mob/living/silicon/robot/R = usr
|
||||
R.toggle_ionpulse()
|
||||
|
||||
/obj/screen/robot/sensors
|
||||
name = "Sensor Augmentation"
|
||||
icon_state = "cyborg_sensor"
|
||||
|
||||
/obj/screen/robot/sensors/Click()
|
||||
if(..())
|
||||
return
|
||||
var/mob/living/silicon/S = usr
|
||||
S.toggle_sensors()
|
||||
|
||||
/obj/screen/robot/language_menu
|
||||
name = "silicon language selection"
|
||||
icon_state = "talk_wheel"
|
||||
|
||||
/obj/screen/robot/language_menu/Click()
|
||||
if(..())
|
||||
return
|
||||
var/mob/living/silicon/S = usr
|
||||
S.open_language_menu(usr)
|
||||
|
||||
/datum/hud/robot
|
||||
ui_style = 'icons/mob/screen_cyborg.dmi'
|
||||
|
||||
@@ -96,7 +116,7 @@
|
||||
var/mob/living/silicon/robot/mymobR = mymob
|
||||
var/obj/screen/using
|
||||
|
||||
using = new/obj/screen/language_menu
|
||||
using = new/obj/screen/robot/language_menu
|
||||
using.screen_loc = ui_borg_language_menu
|
||||
static_inventory += using
|
||||
|
||||
@@ -133,7 +153,7 @@
|
||||
static_inventory += using
|
||||
|
||||
//Sec/Med HUDs
|
||||
using = new /obj/screen/ai/sensors()
|
||||
using = new /obj/screen/robot/sensors()
|
||||
using.screen_loc = ui_borg_sensor
|
||||
static_inventory += using
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
return TRUE
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
if(user.a_intent == INTENT_HARM && stat == DEAD && (butcher_results || guaranteed_butcher_results)) //can we butcher it?
|
||||
GET_COMPONENT_FROM(butchering, /datum/component/butchering, I)
|
||||
var/datum/component/butchering/butchering = I.GetComponent(/datum/component/butchering)
|
||||
if(butchering && butchering.butchering_enabled)
|
||||
to_chat(user, "<span class='notice'>You begin to butcher [src]...</span>")
|
||||
playsound(loc, butchering.butcher_sound, 50, TRUE, -1)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#define VALUE_MODE_NUM 0
|
||||
#define VALUE_MODE_TEXT 1
|
||||
#define VALUE_MODE_FLAG 2
|
||||
#define VALUE_MODE_NUM_LIST 3
|
||||
|
||||
#define KEY_MODE_TEXT 0
|
||||
#define KEY_MODE_TYPE 1
|
||||
@@ -191,6 +192,18 @@
|
||||
if(VALUE_MODE_TEXT)
|
||||
new_value = key_value
|
||||
continue_check_value = new_value
|
||||
if(VALUE_MODE_NUM_LIST)
|
||||
// this is all copy+pasted from number list up there, but it's super basic so I don't see it being changed soon
|
||||
var/list/new_list = list()
|
||||
var/list/values = splittext(key_value," ")
|
||||
for(var/I in values)
|
||||
var/temp = text2num(I)
|
||||
if(isnull(temp))
|
||||
log_admin("invalid number list entry in [key_name]: [I]")
|
||||
continue_check_value = FALSE
|
||||
new_list += temp
|
||||
new_value = new_list
|
||||
continue_check_value = new_list.len
|
||||
if(continue_check_value && continue_check_key && ValidateListEntry(new_key, new_value))
|
||||
config_entry_value[new_key] = new_value
|
||||
return TRUE
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
|
||||
/datum/config_entry/flag/disable_human_mood
|
||||
|
||||
/datum/config_entry/flag/disable_borg_flash_knockdown //Should borg flashes be capable of knocking humanoid entities down?
|
||||
|
||||
/datum/config_entry/flag/weaken_secborg //Brings secborgs and k9s back in-line with the other borg modules
|
||||
|
||||
/datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen.
|
||||
|
||||
/datum/config_entry/flag/disable_peaceborg
|
||||
@@ -367,3 +371,27 @@
|
||||
/datum/config_entry/number/auto_transfer_delay
|
||||
config_entry_value = 72000
|
||||
min_val = 0
|
||||
|
||||
/datum/config_entry/number/dynamic_high_pop_limit
|
||||
config_entry_value = 55
|
||||
min_val = 1
|
||||
|
||||
/datum/config_entry/number/dynamic_pop_per_requirement
|
||||
config_entry_value = 6
|
||||
min_val = 1
|
||||
|
||||
/datum/config_entry/keyed_list/dynamic_cost
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
/datum/config_entry/keyed_list/dynamic_weight
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
/datum/config_entry/keyed_list/dynamic_requirements
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM_LIST
|
||||
|
||||
/datum/config_entry/keyed_list/dynamic_high_population_requirement
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(jukeboxes)
|
||||
wait = 5
|
||||
var/list/songs = list()
|
||||
var/list/activejukeboxes = list()
|
||||
var/list/freejukeboxchannels = list()
|
||||
|
||||
/datum/track
|
||||
var/song_name = "generic"
|
||||
@@ -21,23 +22,39 @@ SUBSYSTEM_DEF(jukeboxes)
|
||||
/datum/controller/subsystem/jukeboxes/proc/addjukebox(obj/jukebox, datum/track/T, jukefalloff = 1)
|
||||
if(!istype(T))
|
||||
CRASH("[src] tried to play a song with a nonexistant track")
|
||||
var/channeltoreserve = CHANNEL_JUKEBOX_START + activejukeboxes.len - 1
|
||||
if(channeltoreserve > CHANNEL_JUKEBOX)
|
||||
var/channeltoreserve = pick(freejukeboxchannels)
|
||||
if(!channeltoreserve)
|
||||
return FALSE
|
||||
freejukeboxchannels -= channeltoreserve
|
||||
var/list/youvegotafreejukebox = list(T, channeltoreserve, jukebox, jukefalloff)
|
||||
activejukeboxes.len++
|
||||
activejukeboxes[activejukeboxes.len] = list(T, channeltoreserve, jukebox, jukefalloff)
|
||||
activejukeboxes[activejukeboxes.len] = youvegotafreejukebox
|
||||
|
||||
//Due to changes in later versions of 512, SOUND_UPDATE no longer properly plays audio when a file is defined in the sound datum. As such, we are now required to init the audio before we can actually do anything with it.
|
||||
//Downsides to this? This means that you can *only* hear the jukebox audio if you were present on the server when it started playing, and it means that it's now impossible to add loops to the jukebox track list.
|
||||
var/sound/song_to_init = sound(T.song_path)
|
||||
song_to_init.status = SOUND_MUTE
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(!M.client)
|
||||
continue
|
||||
if(!(M.client.prefs.toggles & SOUND_INSTRUMENTS))
|
||||
continue
|
||||
|
||||
M.playsound_local(M, null, 100, channel = youvegotafreejukebox[2], S = song_to_init)
|
||||
return activejukeboxes.len
|
||||
|
||||
/datum/controller/subsystem/jukeboxes/proc/removejukebox(IDtoremove)
|
||||
if(islist(activejukeboxes[IDtoremove]))
|
||||
var/jukechannel = activejukeboxes[IDtoremove][2]
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(!M.client)
|
||||
continue
|
||||
M.stop_sound_channel(activejukeboxes[IDtoremove][2])
|
||||
M.stop_sound_channel(jukechannel)
|
||||
freejukeboxchannels |= jukechannel
|
||||
activejukeboxes.Cut(IDtoremove, IDtoremove+1)
|
||||
return TRUE
|
||||
else
|
||||
to_chat(world, "<span class='warning'>If you see this, screenshot it and send it to a dev. Tried to remove jukebox with invalid ID</span>")
|
||||
CRASH("Tried to remove jukebox with invalid ID")
|
||||
|
||||
/datum/controller/subsystem/jukeboxes/proc/findjukeboxindex(obj/jukebox)
|
||||
if(activejukeboxes.len)
|
||||
@@ -57,6 +74,8 @@ SUBSYSTEM_DEF(jukeboxes)
|
||||
T.song_beat = text2num(L[3])
|
||||
T.song_associated_id = L[4]
|
||||
songs |= T
|
||||
for(var/i in CHANNEL_JUKEBOX_START to CHANNEL_JUKEBOX)
|
||||
freejukeboxchannels |= i
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/jukeboxes/fire()
|
||||
@@ -64,14 +83,15 @@ SUBSYSTEM_DEF(jukeboxes)
|
||||
return
|
||||
for(var/list/jukeinfo in activejukeboxes)
|
||||
if(!jukeinfo.len)
|
||||
to_chat(world, "<span class='warning'>If you see this, screenshot it and send it to a dev. Active jukebox without any associated metadata</span>")
|
||||
EXCEPTION("Active jukebox without any associated metadata.")
|
||||
continue
|
||||
var/datum/track/juketrack = jukeinfo[1]
|
||||
if(!istype(juketrack))
|
||||
to_chat(world, "<span class='warning'>If you see this, screenshot it and send it to a dev. After jukebox track grabbing</span>")
|
||||
EXCEPTION("Invalid jukebox track datum.")
|
||||
continue
|
||||
var/obj/jukebox = jukeinfo[3]
|
||||
if(!istype(jukebox))
|
||||
to_chat(world, "<span class='warning'>If you see this, screenshot it and send it to a dev. Nonexistant or invalid jukebox in active jukebox list")
|
||||
EXCEPTION("Nonexistant or invalid object associated with jukebox.")
|
||||
continue
|
||||
var/sound/song_played = sound(juketrack.song_path)
|
||||
var/area/currentarea = get_area(jukebox)
|
||||
|
||||
@@ -33,6 +33,7 @@ SUBSYSTEM_DEF(mapping)
|
||||
var/list/z_list
|
||||
var/datum/space_level/transit
|
||||
var/datum/space_level/empty_space
|
||||
var/num_of_res_levels = 1
|
||||
|
||||
//dlete dis once #39770 is resolved
|
||||
/datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig()
|
||||
@@ -53,6 +54,8 @@ SUBSYSTEM_DEF(mapping)
|
||||
if(!config || config.defaulted)
|
||||
to_chat(world, "<span class='boldannounce'>Unable to load next or default map config, defaulting to Box Station</span>")
|
||||
config = old_config
|
||||
GLOB.year_integer += config.year_offset
|
||||
GLOB.announcertype = (config.announcertype == "standard" ? (prob(1) ? "medibot" : "classic") : config.announcertype)
|
||||
loadWorld()
|
||||
repopulate_sorted_areas()
|
||||
process_teleport_locs() //Sets up the wizard teleport locations
|
||||
@@ -449,6 +452,11 @@ GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
for(var/i in levels_by_trait(ZTRAIT_RESERVED))
|
||||
if(reserve.Reserve(width, height, i))
|
||||
return reserve
|
||||
//If we didn't return at this point, theres a good chance we ran out of room on the exisiting reserved z levels, so lets try a new one
|
||||
num_of_res_levels += 1
|
||||
var/newReserved = add_new_zlevel("Transit/Reserved [num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE))
|
||||
if(reserve.Reserve(width, height, newReserved))
|
||||
return reserve
|
||||
else
|
||||
if(!level_trait(z, ZTRAIT_RESERVED))
|
||||
qdel(reserve)
|
||||
@@ -481,6 +489,7 @@ GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
LAZYINITLIST(unused_turfs["[T.z]"])
|
||||
unused_turfs["[T.z]"] |= T
|
||||
T.flags_1 |= UNUSED_RESERVATION_TURF_1
|
||||
GLOB.areas_by_type[world.area].contents += T
|
||||
CHECK_TICK
|
||||
|
||||
//DO NOT CALL THIS PROC DIRECTLY, CALL wipe_reservations().
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
SUBSYSTEM_DEF(npcpool)
|
||||
name = "NPC Pool"
|
||||
flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND
|
||||
flags = SS_KEEP_TIMING | SS_NO_INIT
|
||||
priority = FIRE_PRIORITY_NPC
|
||||
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#define FILE_ANTAG_REP "data/AntagReputation.json"
|
||||
#define MAX_RECENT_MAP_RECORD 10
|
||||
|
||||
SUBSYSTEM_DEF(persistence)
|
||||
name = "Persistence"
|
||||
@@ -11,6 +12,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
var/list/obj/structure/chisel_message/chisel_messages = list()
|
||||
var/list/saved_messages = list()
|
||||
var/list/saved_modes = list(1,2,3)
|
||||
var/list/saved_maps
|
||||
var/list/saved_trophies = list()
|
||||
var/list/spawned_objects = list()
|
||||
var/list/antag_rep = list()
|
||||
@@ -25,6 +27,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
LoadChiselMessages()
|
||||
LoadTrophies()
|
||||
LoadRecentModes()
|
||||
LoadRecentMaps()
|
||||
LoadPhotoPersistence()
|
||||
if(CONFIG_GET(flag/use_antag_rep))
|
||||
LoadAntagReputation()
|
||||
@@ -163,6 +166,15 @@ SUBSYSTEM_DEF(persistence)
|
||||
return
|
||||
saved_modes = json["data"]
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadRecentMaps()
|
||||
var/json_file = file("data/RecentMaps.json")
|
||||
if(!fexists(json_file))
|
||||
return
|
||||
var/list/json = json_decode(file2text(json_file))
|
||||
if(!json)
|
||||
return
|
||||
saved_maps = json["maps"]
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadAntagReputation()
|
||||
var/json = file2text(FILE_ANTAG_REP)
|
||||
if(!json)
|
||||
@@ -204,6 +216,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
CollectSecretSatchels()
|
||||
CollectTrophies()
|
||||
CollectRoundtype()
|
||||
RecordMaps()
|
||||
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
|
||||
if(CONFIG_GET(flag/use_antag_rep))
|
||||
CollectAntagReputation()
|
||||
@@ -359,6 +372,15 @@ SUBSYSTEM_DEF(persistence)
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/RecordMaps()
|
||||
saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]")
|
||||
var/json_file = file("data/RecentMaps.json")
|
||||
var/list/file_data = list()
|
||||
file_data["maps"] = saved_maps
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/CollectAntagReputation()
|
||||
var/ANTAG_REP_MAXIMUM = CONFIG_GET(number/antag_rep_maximum)
|
||||
|
||||
|
||||
@@ -373,7 +373,7 @@ SUBSYSTEM_DEF(shuttle)
|
||||
emergency.setTimer(emergencyDockTime)
|
||||
priority_announce("Hostile environment resolved. \
|
||||
You have 3 minutes to board the Emergency Shuttle.",
|
||||
null, 'sound/ai/shuttledock.ogg', "Priority")
|
||||
null, "shuttledock", "Priority")
|
||||
|
||||
//try to move/request to dockHome if possible, otherwise dockAway. Mainly used for admin buttons
|
||||
/datum/controller/subsystem/shuttle/proc/toggleShuttle(shuttleId, dockHome, dockAway, timed)
|
||||
|
||||
@@ -43,6 +43,7 @@ SUBSYSTEM_DEF(throwing)
|
||||
var/atom/movable/thrownthing
|
||||
var/atom/target
|
||||
var/turf/target_turf
|
||||
var/target_zone
|
||||
var/init_dir
|
||||
var/maxrange
|
||||
var/speed
|
||||
|
||||
@@ -303,7 +303,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
SSdbcore.SetRoundStart()
|
||||
|
||||
to_chat(world, "<span class='notice'><B>Welcome to [station_name()], enjoy your stay!</B></span>")
|
||||
SEND_SOUND(world, sound('sound/ai/welcome.ogg'))
|
||||
SEND_SOUND(world, sound(get_announcer_sound("welcome")))
|
||||
|
||||
current_state = GAME_STATE_PLAYING
|
||||
Master.SetRunLevel(RUNLEVEL_GAME)
|
||||
|
||||
@@ -6,11 +6,9 @@ SUBSYSTEM_DEF(vis_overlays)
|
||||
|
||||
var/list/vis_overlay_cache
|
||||
var/list/currentrun
|
||||
var/datum/callback/rotate_cb
|
||||
|
||||
/datum/controller/subsystem/vis_overlays/Initialize()
|
||||
vis_overlay_cache = list()
|
||||
rotate_cb = CALLBACK(src, .proc/rotate_vis_overlay)
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/vis_overlays/fire(resumed = FALSE)
|
||||
@@ -52,7 +50,7 @@ SUBSYSTEM_DEF(vis_overlays)
|
||||
|
||||
if(!thing.managed_vis_overlays)
|
||||
thing.managed_vis_overlays = list(overlay)
|
||||
RegisterSignal(thing, COMSIG_ATOM_DIR_CHANGE, rotate_cb)
|
||||
RegisterSignal(thing, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_vis_overlay)
|
||||
else
|
||||
thing.managed_vis_overlays += overlay
|
||||
|
||||
|
||||
@@ -208,9 +208,19 @@ SUBSYSTEM_DEF(vote)
|
||||
if("gamemode")
|
||||
choices.Add(config.votable_modes)
|
||||
if("map")
|
||||
choices.Add(config.maplist)
|
||||
for(var/i in choices)//this is necessary because otherwise we'll end up with a bunch of /datum/map_config's as the default vote value instead of 0 as intended
|
||||
choices[i] = 0
|
||||
var/players = GLOB.clients.len
|
||||
var/list/lastmaps = SSpersistence.saved_maps?.len ? list("[SSmapping.config.map_name]") | SSpersistence.saved_maps : list("[SSmapping.config.map_name]")
|
||||
for(var/M in config.maplist) //This is a typeless loop due to the finnicky nature of keyed lists in this kind of context
|
||||
var/datum/map_config/targetmap = config.maplist[M]
|
||||
if(!istype(targetmap))
|
||||
continue
|
||||
if(!targetmap.voteweight)
|
||||
continue
|
||||
if((targetmap.config_min_users && players < targetmap.config_min_users) || (targetmap.config_max_users && players > targetmap.config_max_users))
|
||||
continue
|
||||
if(targetmap.max_round_search_span && count_occurences_of_value(lastmaps, M, targetmap.max_round_search_span) >= targetmap.max_rounds_played)
|
||||
continue
|
||||
choices |= M
|
||||
if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote
|
||||
choices.Add("secret", "extended")
|
||||
if("custom")
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
var/dupe_mode = COMPONENT_DUPE_HIGHLANDER
|
||||
var/dupe_type
|
||||
var/datum/parent
|
||||
//only set to true if you are able to properly transfer this component
|
||||
//At a minimum RegisterWithParent and UnregisterFromParent should be used
|
||||
//Make sure you also implement PostTransfer for any post transfer handling
|
||||
var/can_transfer = FALSE
|
||||
|
||||
/datum/component/New(datum/P, ...)
|
||||
parent = P
|
||||
@@ -83,7 +87,7 @@
|
||||
/datum/component/proc/UnregisterFromParent()
|
||||
return
|
||||
|
||||
/datum/proc/RegisterSignal(datum/target, sig_type_or_types, proc_or_callback, override = FALSE)
|
||||
/datum/proc/RegisterSignal(datum/target, sig_type_or_types, proctype, override = FALSE)
|
||||
if(QDELETED(src) || QDELETED(target))
|
||||
return
|
||||
|
||||
@@ -96,15 +100,12 @@
|
||||
if(!lookup)
|
||||
target.comp_lookup = lookup = list()
|
||||
|
||||
if(!istype(proc_or_callback, /datum/callback)) //if it wasnt a callback before, it is now
|
||||
proc_or_callback = CALLBACK(src, proc_or_callback)
|
||||
|
||||
var/list/sig_types = islist(sig_type_or_types) ? sig_type_or_types : list(sig_type_or_types)
|
||||
for(var/sig_type in sig_types)
|
||||
if(!override && procs[target][sig_type])
|
||||
stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning")
|
||||
|
||||
procs[target][sig_type] = proc_or_callback
|
||||
procs[target][sig_type] = proctype
|
||||
|
||||
if(!lookup[sig_type]) // Nothing has registered here yet
|
||||
lookup[sig_type] = src
|
||||
@@ -154,7 +155,7 @@
|
||||
return
|
||||
|
||||
/datum/component/proc/PostTransfer()
|
||||
return
|
||||
return COMPONENT_INCOMPATIBLE //Do not support transfer by default as you must properly support it
|
||||
|
||||
/datum/component/proc/_GetInverseTypeList(our_type = type)
|
||||
//we can do this one simple trick
|
||||
@@ -171,17 +172,20 @@
|
||||
var/datum/C = target
|
||||
if(!C.signal_enabled)
|
||||
return NONE
|
||||
var/datum/callback/CB = C.signal_procs[src][sigtype]
|
||||
return CB.InvokeAsync(arglist(arguments))
|
||||
var/proctype = C.signal_procs[src][sigtype]
|
||||
return NONE | CallAsync(C, proctype, arguments)
|
||||
. = NONE
|
||||
for(var/I in target)
|
||||
var/datum/C = I
|
||||
if(!C.signal_enabled)
|
||||
continue
|
||||
var/datum/callback/CB = C.signal_procs[src][sigtype]
|
||||
. |= CB.InvokeAsync(arglist(arguments))
|
||||
var/proctype = C.signal_procs[src][sigtype]
|
||||
. |= CallAsync(C, proctype, arguments)
|
||||
|
||||
/datum/proc/GetComponent(c_type)
|
||||
// The type arg is casted so initial works, you shouldn't be passing a real instance into this
|
||||
/datum/proc/GetComponent(datum/component/c_type)
|
||||
if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED)
|
||||
stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]")
|
||||
var/list/dc = datum_components
|
||||
if(!dc)
|
||||
return null
|
||||
@@ -220,10 +224,6 @@
|
||||
if(ispath(nt))
|
||||
if(nt == /datum/component)
|
||||
CRASH("[nt] attempted instantiation!")
|
||||
if(!isnum(dm))
|
||||
CRASH("[nt]: Invalid dupe_mode ([dm])!")
|
||||
if(dt && !ispath(dt))
|
||||
CRASH("[nt]: Invalid dupe_type ([dt])!")
|
||||
else
|
||||
new_comp = nt
|
||||
nt = new_comp.type
|
||||
@@ -285,10 +285,13 @@
|
||||
if(target.parent)
|
||||
target.RemoveComponent()
|
||||
target.parent = src
|
||||
if(target.PostTransfer() == COMPONENT_INCOMPATIBLE)
|
||||
var/c_type = target.type
|
||||
qdel(target)
|
||||
CRASH("Incompatible [c_type] transfer attempt to a [type]!")
|
||||
var/result = target.PostTransfer()
|
||||
switch(result)
|
||||
if(COMPONENT_INCOMPATIBLE)
|
||||
var/c_type = target.type
|
||||
qdel(target)
|
||||
CRASH("Incompatible [c_type] transfer attempt to a [type]!")
|
||||
|
||||
if(target == AddComponent(target))
|
||||
target._JoinParent()
|
||||
|
||||
@@ -298,10 +301,13 @@
|
||||
return
|
||||
var/comps = dc[/datum/component]
|
||||
if(islist(comps))
|
||||
for(var/I in comps)
|
||||
target.TakeComponent(I)
|
||||
for(var/datum/component/I in comps)
|
||||
if(I.can_transfer)
|
||||
target.TakeComponent(I)
|
||||
else
|
||||
target.TakeComponent(comps)
|
||||
var/datum/component/C = comps
|
||||
if(C.can_transfer)
|
||||
target.TakeComponent(comps)
|
||||
|
||||
/datum/component/ui_host()
|
||||
return parent
|
||||
|
||||
@@ -1,26 +1,48 @@
|
||||
/datum/component/anti_magic
|
||||
var/magic = FALSE
|
||||
var/holy = FALSE
|
||||
var/psychic = FALSE
|
||||
var/allowed_slots = ~ITEM_SLOT_BACKPACK
|
||||
var/charges = INFINITY
|
||||
var/blocks_self = TRUE
|
||||
var/datum/callback/reaction
|
||||
var/datum/callback/expire
|
||||
|
||||
/datum/component/anti_magic/Initialize(_magic = FALSE, _holy = FALSE)
|
||||
/datum/component/anti_magic/Initialize(_magic = FALSE, _holy = FALSE, _psychic = FALSE, _allowed_slots, _charges, _blocks_self = TRUE, datum/callback/_reaction, datum/callback/_expire)
|
||||
if(isitem(parent))
|
||||
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip)
|
||||
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop)
|
||||
else if(ismob(parent))
|
||||
RegisterSignal(parent, COMSIG_MOB_RECEIVE_MAGIC, .proc/can_protect)
|
||||
RegisterSignal(parent, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect)
|
||||
else
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
magic = _magic
|
||||
holy = _holy
|
||||
psychic = _psychic
|
||||
if(_allowed_slots)
|
||||
allowed_slots = _allowed_slots
|
||||
if(!isnull(_charges))
|
||||
charges = _charges
|
||||
blocks_self = _blocks_self
|
||||
reaction = _reaction
|
||||
expire = _expire
|
||||
|
||||
/datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot)
|
||||
RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/can_protect, TRUE)
|
||||
if(!CHECK_BITFIELD(allowed_slots, slotdefine2slotbit(slot))) //Check that the slot is valid for antimagic
|
||||
UnregisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC)
|
||||
return
|
||||
RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect, TRUE)
|
||||
|
||||
/datum/component/anti_magic/proc/on_drop(datum/source, mob/user)
|
||||
UnregisterSignal(user, COMSIG_MOB_RECEIVE_MAGIC)
|
||||
|
||||
/datum/component/anti_magic/proc/can_protect(datum/source, _magic, _holy, list/protection_sources)
|
||||
if((_magic && magic) || (_holy && holy))
|
||||
/datum/component/anti_magic/proc/protect(datum/source, mob/user, _magic, _holy, _psychic, chargecost = 1, self, list/protection_sources)
|
||||
if(((_magic && magic) || (_holy && holy) || (_psychic && psychic)) && (!self || blocks_self))
|
||||
protection_sources += parent
|
||||
reaction?.Invoke(user, chargecost)
|
||||
charges -= chargecost
|
||||
if(charges <= 0)
|
||||
expire?.Invoke(user)
|
||||
qdel(src)
|
||||
return COMPONENT_BLOCK_MAGIC
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
return FALSE
|
||||
if(!isliving(AM) && !isobj(AM))
|
||||
return FALSE
|
||||
if(is_type_in_typecache(AM, forbidden_types) || AM.throwing || AM.floating)
|
||||
if(is_type_in_typecache(AM, forbidden_types) || AM.throwing || (AM.movement_type & FLOATING))
|
||||
return FALSE
|
||||
//Flies right over the chasm
|
||||
if(ismob(AM))
|
||||
|
||||
@@ -8,32 +8,39 @@
|
||||
|
||||
/datum/component/cleaning/proc/Clean()
|
||||
var/atom/movable/AM = parent
|
||||
var/turf/tile = AM.loc
|
||||
if(!isturf(tile))
|
||||
return
|
||||
|
||||
SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
for(var/A in tile)
|
||||
var/turf/T = AM.loc
|
||||
SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
for(var/A in T)
|
||||
if(is_cleanable(A))
|
||||
qdel(A)
|
||||
else if(istype(A, /obj/item))
|
||||
var/obj/item/I = A
|
||||
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
if(ismob(I.loc))
|
||||
var/mob/M = I.loc
|
||||
else if(isitem(A))
|
||||
var/obj/item/cleaned_item = A
|
||||
SEND_SIGNAL(cleaned_item, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
cleaned_item.clean_blood()
|
||||
if(ismob(cleaned_item.loc))
|
||||
var/mob/M = cleaned_item.loc
|
||||
M.regenerate_icons()
|
||||
else if(ishuman(A))
|
||||
var/mob/living/carbon/human/cleaned_human = A
|
||||
if(cleaned_human.lying)
|
||||
if(cleaned_human.head)
|
||||
SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
cleaned_human.head.clean_blood()
|
||||
cleaned_human.update_inv_head()
|
||||
if(cleaned_human.wear_suit)
|
||||
SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
cleaned_human.wear_suit.clean_blood()
|
||||
cleaned_human.update_inv_wear_suit()
|
||||
else if(cleaned_human.w_uniform)
|
||||
SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
cleaned_human.w_uniform.clean_blood()
|
||||
cleaned_human.update_inv_w_uniform()
|
||||
if(cleaned_human.shoes)
|
||||
SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
cleaned_human.shoes.clean_blood()
|
||||
cleaned_human.update_inv_shoes()
|
||||
SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
cleaned_human.clean_blood()
|
||||
cleaned_human.wash_cream()
|
||||
cleaned_human.regenerate_icons()
|
||||
to_chat(cleaned_human, "<span class='danger'>[AM] cleans your face!</span>")
|
||||
to_chat(cleaned_human, "<span class='danger'>[src] cleans your face!</span>")
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/component/decal
|
||||
dupe_mode = COMPONENT_DUPE_ALLOWED
|
||||
|
||||
can_transfer = TRUE
|
||||
var/cleanable
|
||||
var/description
|
||||
var/mutable_appearance/pic
|
||||
|
||||
@@ -1,39 +1,13 @@
|
||||
/datum/component/decal/blood
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE
|
||||
|
||||
/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER)
|
||||
if(!isitem(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
. = ..()
|
||||
RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name)
|
||||
|
||||
/datum/component/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color)
|
||||
var/obj/item/I = parent
|
||||
if(!_icon)
|
||||
_icon = 'icons/effects/blood.dmi'
|
||||
if(!_icon_state)
|
||||
_icon_state = "itemblood"
|
||||
var/icon = initial(I.icon)
|
||||
var/icon_state = initial(I.icon_state)
|
||||
if(!icon || !icon_state)
|
||||
// It's something which takes on the look of other items, probably
|
||||
icon = I.icon
|
||||
icon_state = I.icon_state
|
||||
var/static/list/blood_splatter_appearances = list()
|
||||
//try to find a pre-processed blood-splatter. otherwise, make a new one
|
||||
var/index = "[REF(icon)]-[icon_state]"
|
||||
pic = blood_splatter_appearances[index]
|
||||
|
||||
if(!pic)
|
||||
var/icon/blood_splatter_icon = icon(initial(I.icon), initial(I.icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object
|
||||
blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
|
||||
blood_splatter_icon.Blend(icon(_icon, _icon_state), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
|
||||
pic = mutable_appearance(blood_splatter_icon, initial(I.icon_state))
|
||||
blood_splatter_appearances[index] = pic
|
||||
return TRUE
|
||||
|
||||
/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override)
|
||||
var/atom/A = parent
|
||||
override[EXAMINE_POSITION_ARTICLE] = A.gender == PLURAL? "some" : "a"
|
||||
override[EXAMINE_POSITION_BEFORE] = " blood-stained "
|
||||
return COMPONENT_EXNAME_CHANGED
|
||||
/datum/component/decal/blood
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE
|
||||
|
||||
/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER)
|
||||
if(!isitem(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
. = ..()
|
||||
RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name)
|
||||
|
||||
/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override)
|
||||
var/atom/A = parent
|
||||
|
||||
return COMPONENT_EXNAME_CHANGED
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/datum/component/wearertargeting/earprotection
|
||||
signals = list(COMSIG_CARBON_SOUNDBANG)
|
||||
mobtype = /mob/living/carbon
|
||||
proctype = .proc/reducebang
|
||||
|
||||
/datum/component/wearertargeting/earprotection/Initialize(_valid_slots)
|
||||
. = ..()
|
||||
valid_slots = _valid_slots
|
||||
callback = CALLBACK(src, .proc/reducebang)
|
||||
|
||||
/datum/component/wearertargeting/earprotection/proc/reducebang(datum/source, list/reflist)
|
||||
reflist[1]--
|
||||
|
||||
@@ -1,159 +0,0 @@
|
||||
/datum/component/forensics
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE
|
||||
var/list/fingerprints //assoc print = print
|
||||
var/list/hiddenprints //assoc ckey = realname/gloves/ckey
|
||||
var/list/blood_DNA //assoc dna = bloodtype
|
||||
var/list/fibers //assoc print = print
|
||||
|
||||
/datum/component/forensics/InheritComponent(datum/component/forensics/F, original) //Use of | and |= being different here is INTENTIONAL.
|
||||
fingerprints = fingerprints | F.fingerprints
|
||||
hiddenprints = hiddenprints | F.hiddenprints
|
||||
blood_DNA = blood_DNA | F.blood_DNA
|
||||
fibers = fibers | F.fibers
|
||||
check_blood()
|
||||
return ..()
|
||||
|
||||
/datum/component/forensics/Initialize(new_fingerprints, new_hiddenprints, new_blood_DNA, new_fibers)
|
||||
if(!isatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
fingerprints = new_fingerprints
|
||||
hiddenprints = new_hiddenprints
|
||||
blood_DNA = new_blood_DNA
|
||||
fibers = new_fibers
|
||||
check_blood()
|
||||
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_act)
|
||||
|
||||
/datum/component/forensics/proc/wipe_fingerprints()
|
||||
fingerprints = null
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/wipe_hiddenprints()
|
||||
return //no.
|
||||
|
||||
/datum/component/forensics/proc/wipe_blood_DNA()
|
||||
blood_DNA = null
|
||||
if(isitem(parent))
|
||||
qdel(parent.GetComponent(/datum/component/decal/blood))
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/wipe_fibers()
|
||||
fibers = null
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/clean_act(datum/source, strength)
|
||||
if(strength >= CLEAN_STRENGTH_FINGERPRINTS)
|
||||
wipe_fingerprints()
|
||||
if(strength >= CLEAN_STRENGTH_BLOOD)
|
||||
wipe_blood_DNA()
|
||||
if(strength >= CLEAN_STRENGTH_FIBERS)
|
||||
wipe_fibers()
|
||||
|
||||
/datum/component/forensics/proc/add_fingerprint_list(list/_fingerprints) //list(text)
|
||||
if(!length(_fingerprints))
|
||||
return
|
||||
LAZYINITLIST(fingerprints)
|
||||
for(var/i in _fingerprints) //We use an associative list, make sure we don't just merge a non-associative list into ours.
|
||||
fingerprints[i] = i
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE)
|
||||
if(!M)
|
||||
return
|
||||
add_hiddenprint(M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
add_fibers(H)
|
||||
if(H.gloves) //Check if the gloves (if any) hide fingerprints
|
||||
var/obj/item/clothing/gloves/G = H.gloves
|
||||
if(G.transfer_prints)
|
||||
ignoregloves = TRUE
|
||||
if(!ignoregloves)
|
||||
H.gloves.add_fingerprint(H, TRUE) //ignoregloves = 1 to avoid infinite loop.
|
||||
return
|
||||
var/full_print = md5(H.dna.uni_identity)
|
||||
LAZYSET(fingerprints, full_print, full_print)
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/add_fiber_list(list/_fibertext) //list(text)
|
||||
if(!length(_fibertext))
|
||||
return
|
||||
LAZYINITLIST(fibers)
|
||||
for(var/i in _fibertext) //We use an associative list, make sure we don't just merge a non-associative list into ours.
|
||||
fibers[i] = i
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/add_fibers(mob/living/carbon/human/M)
|
||||
var/fibertext
|
||||
var/item_multiplier = isitem(src)?1.2:1
|
||||
if(M.wear_suit)
|
||||
fibertext = "Material from \a [M.wear_suit]."
|
||||
if(prob(10*item_multiplier) && !LAZYACCESS(fibers, fibertext))
|
||||
LAZYSET(fibers, fibertext, fibertext)
|
||||
if(!(M.wear_suit.body_parts_covered & CHEST))
|
||||
if(M.w_uniform)
|
||||
fibertext = "Fibers from \a [M.w_uniform]."
|
||||
if(prob(12*item_multiplier) && !LAZYACCESS(fibers, fibertext)) //Wearing a suit means less of the uniform exposed.
|
||||
LAZYSET(fibers, fibertext, fibertext)
|
||||
if(!(M.wear_suit.body_parts_covered & HANDS))
|
||||
if(M.gloves)
|
||||
fibertext = "Material from a pair of [M.gloves.name]."
|
||||
if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext))
|
||||
LAZYSET(fibers, fibertext, fibertext)
|
||||
else if(M.w_uniform)
|
||||
fibertext = "Fibers from \a [M.w_uniform]."
|
||||
if(prob(15*item_multiplier) && !LAZYACCESS(fibers, fibertext))
|
||||
// "Added fibertext: [fibertext]"
|
||||
LAZYSET(fibers, fibertext, fibertext)
|
||||
if(M.gloves)
|
||||
fibertext = "Material from a pair of [M.gloves.name]."
|
||||
if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext))
|
||||
LAZYSET(fibers, fibertext, fibertext)
|
||||
else if(M.gloves)
|
||||
fibertext = "Material from a pair of [M.gloves.name]."
|
||||
if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext))
|
||||
LAZYSET(fibers, fibertext, fibertext)
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/add_hiddenprint_list(list/_hiddenprints) //list(ckey = text)
|
||||
if(!length(_hiddenprints))
|
||||
return
|
||||
LAZYINITLIST(hiddenprints)
|
||||
for(var/i in _hiddenprints) //We use an associative list, make sure we don't just merge a non-associative list into ours.
|
||||
hiddenprints[i] = _hiddenprints[i]
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/add_hiddenprint(mob/living/M)
|
||||
if(!M || !M.key)
|
||||
return
|
||||
var/hasgloves = ""
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.gloves)
|
||||
hasgloves = "(gloves)"
|
||||
var/current_time = TIME_STAMP("hh:mm:ss", FALSE)
|
||||
if(!LAZYACCESS(hiddenprints, M.key))
|
||||
LAZYSET(hiddenprints, M.key, "First: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]")
|
||||
else
|
||||
var/laststamppos = findtext(LAZYACCESS(hiddenprints, M.key), " Last: ")
|
||||
if(laststamppos)
|
||||
LAZYSET(hiddenprints, M.key, copytext(hiddenprints[M.key], 1, laststamppos))
|
||||
hiddenprints[M.key] += " Last: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]" //made sure to be existing by if(!LAZYACCESS);else
|
||||
var/atom/A = parent
|
||||
A.fingerprintslast = M.ckey
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/add_blood_DNA(list/dna) //list(dna_enzymes = type)
|
||||
if(!length(dna))
|
||||
return
|
||||
LAZYINITLIST(blood_DNA)
|
||||
for(var/i in dna)
|
||||
blood_DNA[i] = dna[i]
|
||||
check_blood()
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/check_blood()
|
||||
if(!isitem(parent))
|
||||
return
|
||||
if(!length(blood_DNA))
|
||||
return
|
||||
parent.LoadComponent(/datum/component/decal/blood)
|
||||
@@ -6,21 +6,28 @@
|
||||
|
||||
/datum/component/infective/Initialize(list/datum/disease/_diseases, expire_in)
|
||||
if(islist(_diseases))
|
||||
diseases = diseases
|
||||
diseases = _diseases
|
||||
else
|
||||
diseases = list(_diseases)
|
||||
if(expire_in)
|
||||
expire_time = world.time + expire_in
|
||||
QDEL_IN(src, expire_in)
|
||||
|
||||
if(!ismovableatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean)
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/try_infect_buckle)
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_BUMP, .proc/try_infect_collide)
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/try_infect_crossed)
|
||||
RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, .proc/try_infect_attack_zone)
|
||||
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/try_infect_attack)
|
||||
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/try_infect_equipped)
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_IMPACT_ZONE, .proc/try_infect_impact_zone)
|
||||
RegisterSignal(parent, COMSIG_FOOD_EATEN, .proc/try_infect_eat)
|
||||
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean)
|
||||
if(isitem(parent))
|
||||
RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, .proc/try_infect_attack_zone)
|
||||
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/try_infect_attack)
|
||||
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/try_infect_equipped)
|
||||
if(istype(parent, /obj/item/reagent_containers/food/snacks))
|
||||
RegisterSignal(parent, COMSIG_FOOD_EATEN, .proc/try_infect_eat)
|
||||
else if(istype(parent, /obj/effect/decal/cleanable/blood/gibs))
|
||||
RegisterSignal(parent, COMSIG_GIBS_STREAK, .proc/try_infect_streak)
|
||||
|
||||
/datum/component/infective/proc/try_infect_eat(datum/source, mob/living/eater, mob/living/feeder)
|
||||
for(var/V in diseases)
|
||||
@@ -73,6 +80,9 @@
|
||||
if(isliving(M))
|
||||
try_infect(M, BODY_ZONE_PRECISE_L_FOOT)
|
||||
|
||||
/datum/component/infective/proc/try_infect_streak(datum/source, list/directions, list/output_diseases)
|
||||
output_diseases |= diseases
|
||||
|
||||
/datum/component/infective/proc/try_infect(mob/living/L, target_zone)
|
||||
for(var/V in diseases)
|
||||
L.ContactContractDisease(V, target_zone)
|
||||
|
||||
@@ -237,6 +237,3 @@
|
||||
LOCKON_RANGING_BREAK_CHECK
|
||||
cd++
|
||||
CHECK_TICK
|
||||
|
||||
/datum/component/lockon_aiming/PostTransfer(datum/new_parent)
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/datum/component/mirage_border
|
||||
can_transfer = TRUE
|
||||
var/obj/effect/abstract/mirage_holder/holder
|
||||
|
||||
/datum/component/mirage_border/Initialize(turf/target, direction, range=world.view)
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets
|
||||
var/datum/mood_event/list/mood_events = list()
|
||||
var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much?
|
||||
var/holdmyinsanityeffect = 0 //before we edit our sanity lets take a look
|
||||
var/obj/screen/mood/screen_obj
|
||||
|
||||
/datum/component/mood/Initialize()
|
||||
@@ -21,8 +20,7 @@
|
||||
|
||||
RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event)
|
||||
RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event)
|
||||
RegisterSignal(parent, COMSIG_INCREASE_SANITY, .proc/IncreaseSanity)
|
||||
RegisterSignal(parent, COMSIG_DECREASE_SANITY, .proc/DecreaseSanity)
|
||||
RegisterSignal(parent, COMSIG_MODIFY_SANITY, .proc/modify_sanity)
|
||||
|
||||
RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud)
|
||||
var/mob/living/owner = parent
|
||||
@@ -131,29 +129,23 @@
|
||||
|
||||
switch(mood_level)
|
||||
if(1)
|
||||
DecreaseSanity(src, 0.2)
|
||||
setSanity(sanity-0.2)
|
||||
if(2)
|
||||
DecreaseSanity(src, 0.125, SANITY_CRAZY)
|
||||
setSanity(sanity-0.125, minimum=SANITY_CRAZY)
|
||||
if(3)
|
||||
DecreaseSanity(src, 0.075, SANITY_UNSTABLE)
|
||||
setSanity(sanity-0.075, minimum=SANITY_UNSTABLE)
|
||||
if(4)
|
||||
DecreaseSanity(src, 0.025, SANITY_DISTURBED)
|
||||
setSanity(sanity-0.025, minimum=SANITY_DISTURBED)
|
||||
if(5)
|
||||
IncreaseSanity(src, 0.1)
|
||||
setSanity(sanity+0.1)
|
||||
if(6)
|
||||
IncreaseSanity(src, 0.15)
|
||||
setSanity(sanity+0.15)
|
||||
if(7)
|
||||
IncreaseSanity(src, 0.20)
|
||||
setSanity(sanity+0.20)
|
||||
if(8)
|
||||
IncreaseSanity(src, 0.25, SANITY_GREAT)
|
||||
setSanity(sanity+0.25, maximum=SANITY_GREAT)
|
||||
if(9)
|
||||
IncreaseSanity(src, 0.4, SANITY_GREAT)
|
||||
|
||||
if(insanity_effect != holdmyinsanityeffect)
|
||||
if(insanity_effect > holdmyinsanityeffect)
|
||||
owner.crit_threshold += (insanity_effect - holdmyinsanityeffect)
|
||||
else
|
||||
owner.crit_threshold -= (holdmyinsanityeffect - insanity_effect)
|
||||
setSanity(sanity+0.4, maximum=SANITY_GREAT)
|
||||
|
||||
if(HAS_TRAIT(owner, TRAIT_DEPRESSION))
|
||||
if(prob(0.05))
|
||||
@@ -164,8 +156,6 @@
|
||||
add_event(null, "jolly", /datum/mood_event/jolly)
|
||||
clear_event(null, "depression")
|
||||
|
||||
holdmyinsanityeffect = insanity_effect
|
||||
|
||||
HandleNutrition(owner)
|
||||
|
||||
/datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_NEUTRAL)//I'm sure bunging this in here will have no negative repercussions.
|
||||
@@ -187,7 +177,7 @@
|
||||
sanity = amount
|
||||
|
||||
switch(sanity)
|
||||
if(SANITY_INSANE to SANITY_CRAZY)
|
||||
if(-INFINITY to SANITY_CRAZY)
|
||||
setInsanityEffect(MAJOR_INSANITY_PEN)
|
||||
master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1.5) //Did we change something ? movetypes is runtiming, movetypes=(~FLYING))
|
||||
sanity_level = 6
|
||||
@@ -216,35 +206,12 @@
|
||||
/datum/component/mood/proc/setInsanityEffect(newval)//More code so that the previous proc works
|
||||
if(newval == insanity_effect)
|
||||
return
|
||||
var/mob/living/master = parent
|
||||
master.crit_threshold = (master.crit_threshold - insanity_effect) + newval
|
||||
//var/mob/living/master = parent
|
||||
//master.crit_threshold = (master.crit_threshold - insanity_effect) + newval
|
||||
insanity_effect = newval
|
||||
|
||||
/datum/component/mood/proc/DecreaseSanity(datum/source, amount, minimum = SANITY_INSANE)
|
||||
if(sanity < minimum) //This might make KevinZ stop fucking pinging me.
|
||||
IncreaseSanity(src, 0.5)
|
||||
else
|
||||
sanity = max(minimum, sanity - amount)
|
||||
if(sanity < SANITY_UNSTABLE)
|
||||
if(sanity < SANITY_CRAZY)
|
||||
insanity_effect = (MAJOR_INSANITY_PEN)
|
||||
else
|
||||
insanity_effect = (MINOR_INSANITY_PEN)
|
||||
|
||||
/datum/component/mood/proc/IncreaseSanity(datum/source, amount, maximum = SANITY_NEUTRAL)
|
||||
// Disturbed stops you from getting any more sane - I'm just gonna bung this in here
|
||||
var/mob/living/owner = parent
|
||||
if(HAS_TRAIT(owner, TRAIT_UNSTABLE))
|
||||
return
|
||||
if(sanity > maximum)
|
||||
DecreaseSanity(src, 0.5) //Removes some sanity to go back to our current limit.
|
||||
else
|
||||
sanity = min(maximum, sanity + amount)
|
||||
if(sanity > SANITY_CRAZY)
|
||||
if(sanity > SANITY_UNSTABLE)
|
||||
insanity_effect = 0
|
||||
else
|
||||
insanity_effect = MINOR_INSANITY_PEN
|
||||
/datum/component/mood/proc/modify_sanity(datum/source, amount, minimum = -INFINITY, maximum = INFINITY)
|
||||
setSanity(sanity + amount, minimum, maximum)
|
||||
|
||||
/datum/component/mood/proc/add_event(datum/source, category, type, param) //Category will override any events in the same category, should be unique unless the event is based on the same thing like hunger.
|
||||
var/datum/mood_event/the_event
|
||||
@@ -264,8 +231,6 @@
|
||||
if(the_event.timeout)
|
||||
addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE)
|
||||
|
||||
return the_event
|
||||
|
||||
/datum/component/mood/proc/clear_event(datum/source, category)
|
||||
var/datum/mood_event/event = mood_events[category]
|
||||
if(!event)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
return
|
||||
|
||||
/datum/proc/ntnet_send(datum/netdata/data, netid)
|
||||
GET_COMPONENT(NIC, /datum/component/ntnet_interface)
|
||||
var/datum/component/ntnet_interface/NIC = GetComponent(/datum/component/ntnet_interface)
|
||||
if(!NIC)
|
||||
return FALSE
|
||||
return NIC.__network_send(data, netid)
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
/datum/component/orbiter
|
||||
can_transfer = TRUE
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
var/list/orbiters
|
||||
var/datum/callback/orbiter_spy
|
||||
var/datum/callback/orbited_spy
|
||||
|
||||
//radius: range to orbit at, radius of the circle formed by orbiting (in pixels)
|
||||
//clockwise: whether you orbit clockwise or anti clockwise
|
||||
@@ -14,8 +13,6 @@
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
orbiters = list()
|
||||
orbiter_spy = CALLBACK(src, .proc/orbiter_move_react)
|
||||
orbited_spy = CALLBACK(src, .proc/move_react)
|
||||
|
||||
var/atom/master = parent
|
||||
master.orbiters = src
|
||||
@@ -25,7 +22,7 @@
|
||||
/datum/component/orbiter/RegisterWithParent()
|
||||
var/atom/target = parent
|
||||
while(ismovableatom(target))
|
||||
RegisterSignal(target, COMSIG_MOVABLE_MOVED, orbited_spy)
|
||||
RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react)
|
||||
target = target.loc
|
||||
|
||||
/datum/component/orbiter/UnregisterFromParent()
|
||||
@@ -40,8 +37,6 @@
|
||||
for(var/i in orbiters)
|
||||
end_orbit(i)
|
||||
orbiters = null
|
||||
QDEL_NULL(orbiter_spy)
|
||||
QDEL_NULL(orbited_spy)
|
||||
return ..()
|
||||
|
||||
/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, list/arguments)
|
||||
@@ -64,7 +59,7 @@
|
||||
orbiter.orbiting.end_orbit(orbiter)
|
||||
orbiters[orbiter] = TRUE
|
||||
orbiter.orbiting = src
|
||||
RegisterSignal(orbiter, COMSIG_MOVABLE_MOVED, orbiter_spy)
|
||||
RegisterSignal(orbiter, COMSIG_MOVABLE_MOVED, .proc/orbiter_move_react)
|
||||
var/matrix/initial_transform = matrix(orbiter.transform)
|
||||
|
||||
// Head first!
|
||||
@@ -120,7 +115,7 @@
|
||||
if(orbited?.loc && orbited.loc != newturf) // We want to know when anything holding us moves too
|
||||
var/atom/target = orbited.loc
|
||||
while(ismovableatom(target))
|
||||
RegisterSignal(target, COMSIG_MOVABLE_MOVED, orbited_spy, TRUE)
|
||||
RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react, TRUE)
|
||||
target = target.loc
|
||||
|
||||
var/atom/curloc = master.loc
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
//This component applies a customizable drop_shadow filter to its wearer when they toggle combat mode on or off. This can stack.
|
||||
|
||||
/datum/component/wearertargeting/phantomthief
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
signals = list(COMSIG_COMBAT_TOGGLED)
|
||||
proctype = .proc/handlefilterstuff
|
||||
var/filter_x
|
||||
var/filter_y
|
||||
var/filter_size
|
||||
var/filter_border
|
||||
var/filter_color
|
||||
|
||||
/datum/component/wearertargeting/phantomthief/Initialize(_x = -2, _y = 0, _size = 0, _border = 0, _color = "#E62111", list/_valid_slots = list(SLOT_GLASSES))
|
||||
. = ..()
|
||||
if(. == COMPONENT_INCOMPATIBLE)
|
||||
return
|
||||
filter_x = _x
|
||||
filter_y = _y
|
||||
filter_size = _size
|
||||
filter_border = _border
|
||||
filter_color = _color
|
||||
valid_slots = _valid_slots
|
||||
|
||||
/datum/component/wearertargeting/phantomthief/proc/handlefilterstuff(datum/source, mob/user, combatmodestate)
|
||||
if(istype(user))
|
||||
var/thefilter = filter(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, border = filter_border, color = filter_color)
|
||||
if(!combatmodestate)
|
||||
user.filters -= thefilter
|
||||
else
|
||||
user.filters += thefilter
|
||||
|
||||
/datum/component/wearertargeting/phantomthief/proc/stripdesiredfilter(mob/user)
|
||||
if(istype(user))
|
||||
var/thefilter = filter(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, border = filter_border, color = filter_color)
|
||||
user.filters -= thefilter
|
||||
|
||||
/datum/component/wearertargeting/phantomthief/on_drop(datum/source, mob/user)
|
||||
. = ..()
|
||||
stripdesiredfilter(user)
|
||||
@@ -44,19 +44,21 @@
|
||||
if(src.rotation_flags & ROTATION_CLOCKWISE)
|
||||
default_rotation_direction = ROTATION_CLOCKWISE
|
||||
|
||||
if(src.rotation_flags & ROTATION_ALTCLICK)
|
||||
/datum/component/simple_rotation/proc/add_signals()
|
||||
if(rotation_flags & ROTATION_ALTCLICK)
|
||||
RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/HandRot)
|
||||
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/ExamineMessage)
|
||||
if(src.rotation_flags & ROTATION_WRENCH)
|
||||
if(rotation_flags & ROTATION_WRENCH)
|
||||
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/WrenchRot)
|
||||
|
||||
if(src.rotation_flags & ROTATION_VERBS)
|
||||
/datum/component/simple_rotation/proc/add_verbs()
|
||||
if(rotation_flags & ROTATION_VERBS)
|
||||
var/atom/movable/AM = parent
|
||||
if(src.rotation_flags & ROTATION_FLIP)
|
||||
if(rotation_flags & ROTATION_FLIP)
|
||||
AM.verbs += /atom/movable/proc/simple_rotate_flip
|
||||
if(src.rotation_flags & ROTATION_CLOCKWISE)
|
||||
if(rotation_flags & ROTATION_CLOCKWISE)
|
||||
AM.verbs += /atom/movable/proc/simple_rotate_clockwise
|
||||
if(src.rotation_flags & ROTATION_COUNTERCLOCKWISE)
|
||||
if(rotation_flags & ROTATION_COUNTERCLOCKWISE)
|
||||
AM.verbs += /atom/movable/proc/simple_rotate_counterclockwise
|
||||
|
||||
/datum/component/simple_rotation/proc/remove_verbs()
|
||||
@@ -66,11 +68,30 @@
|
||||
AM.verbs -= /atom/movable/proc/simple_rotate_clockwise
|
||||
AM.verbs -= /atom/movable/proc/simple_rotate_counterclockwise
|
||||
|
||||
/datum/component/simple_rotation/Destroy()
|
||||
/datum/component/simple_rotation/proc/remove_signals()
|
||||
UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_PARENT_EXAMINE, COMSIG_PARENT_ATTACKBY))
|
||||
|
||||
/datum/component/simple_rotation/RegisterWithParent()
|
||||
add_verbs()
|
||||
add_signals()
|
||||
. = ..()
|
||||
|
||||
/datum/component/simple_rotation/PostTransfer()
|
||||
//Because of the callbacks which we don't track cleanly we can't transfer this
|
||||
//item cleanly, better to let the new of the new item create a new rotation datum
|
||||
//instead (there's no real state worth transferring)
|
||||
return COMPONENT_NOTRANSFER
|
||||
|
||||
/datum/component/simple_rotation/UnregisterFromParent()
|
||||
remove_verbs()
|
||||
remove_signals()
|
||||
. = ..()
|
||||
|
||||
/datum/component/simple_rotation/Destroy()
|
||||
QDEL_NULL(can_user_rotate)
|
||||
QDEL_NULL(can_be_rotated)
|
||||
QDEL_NULL(after_rotation)
|
||||
//Signals + verbs removed via UnRegister
|
||||
. = ..()
|
||||
|
||||
/datum/component/simple_rotation/RemoveComponent()
|
||||
@@ -122,22 +143,22 @@
|
||||
set name = "Rotate Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
GET_COMPONENT(rotcomp,/datum/component/simple_rotation)
|
||||
var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation)
|
||||
if(rotcomp)
|
||||
rotcomp.HandRot(usr,ROTATION_CLOCKWISE)
|
||||
rotcomp.HandRot(null,usr,ROTATION_CLOCKWISE)
|
||||
|
||||
/atom/movable/proc/simple_rotate_counterclockwise()
|
||||
set name = "Rotate Counter-Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
GET_COMPONENT(rotcomp,/datum/component/simple_rotation)
|
||||
var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation)
|
||||
if(rotcomp)
|
||||
rotcomp.HandRot(usr,ROTATION_COUNTERCLOCKWISE)
|
||||
rotcomp.HandRot(null,usr,ROTATION_COUNTERCLOCKWISE)
|
||||
|
||||
/atom/movable/proc/simple_rotate_flip()
|
||||
set name = "Flip"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
GET_COMPONENT(rotcomp,/datum/component/simple_rotation)
|
||||
var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation)
|
||||
if(rotcomp)
|
||||
rotcomp.HandRot(usr,ROTATION_FLIP)
|
||||
rotcomp.HandRot(null,usr,ROTATION_FLIP)
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
// This should only be used by non components trying to listen to a signal
|
||||
// If you use this inside a component I will replace your eyes with lemons ~ninjanomnom
|
||||
|
||||
/datum/component/redirect
|
||||
dupe_mode = COMPONENT_DUPE_ALLOWED
|
||||
var/list/signals
|
||||
var/datum/callback/turfchangeCB
|
||||
|
||||
/datum/component/redirect/Initialize(list/_signals, flags=NONE)
|
||||
//It's not our job to verify the right signals are registered here, just do it.
|
||||
if(!LAZYLEN(_signals))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
if(flags & REDIRECT_TRANSFER_WITH_TURF && isturf(parent))
|
||||
// If they also want to listen to the turf change then we need to set it up so both callbacks run
|
||||
if(_signals[COMSIG_TURF_CHANGE])
|
||||
turfchangeCB = _signals[COMSIG_TURF_CHANGE]
|
||||
if(!istype(turfchangeCB))
|
||||
. = COMPONENT_INCOMPATIBLE
|
||||
CRASH("Redirect components must be given instanced callbacks, not proc paths.")
|
||||
_signals[COMSIG_TURF_CHANGE] = CALLBACK(src, .proc/turf_change)
|
||||
|
||||
signals = _signals
|
||||
|
||||
/datum/component/redirect/RegisterWithParent()
|
||||
for(var/signal in signals)
|
||||
RegisterSignal(parent, signal, signals[signal])
|
||||
|
||||
/datum/component/redirect/UnregisterFromParent()
|
||||
UnregisterSignal(parent, signals)
|
||||
|
||||
/datum/component/redirect/proc/turf_change(datum/source, path, new_baseturfs, flags, list/transfers)
|
||||
transfers += src
|
||||
return turfchangeCB?.InvokeAsync(arglist(args))
|
||||
@@ -4,6 +4,7 @@
|
||||
// /mob/living/Move() in /modules/mob/living/living.dm - hiding storage boxes on mob movement
|
||||
|
||||
/datum/component/storage/concrete
|
||||
can_transfer = TRUE
|
||||
var/drop_all_on_deconstruct = TRUE
|
||||
var/drop_all_on_destroy = FALSE
|
||||
var/drop_all_on_break = FALSE
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
/obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector,
|
||||
/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper,
|
||||
/obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini,
|
||||
/obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol/mag
|
||||
/obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol
|
||||
))
|
||||
|
||||
/datum/component/storage/concrete/pockets/shoes/clown/Initialize()
|
||||
@@ -67,7 +67,7 @@
|
||||
/obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector,
|
||||
/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper,
|
||||
/obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini,
|
||||
/obj/item/firing_pin, /obj/item/bikehorn))
|
||||
/obj/item/firing_pin, /obj/item/bikehorn, /obj/item/gun/ballistic/automatic/pistol))
|
||||
|
||||
/datum/component/storage/concrete/pockets/pocketprotector
|
||||
max_items = 3
|
||||
|
||||
@@ -57,6 +57,10 @@
|
||||
var/screen_start_x = 4 //These two are where the storage starts being rendered, screen_loc wise.
|
||||
var/screen_start_y = 2
|
||||
//End
|
||||
|
||||
var/limited_random_access = FALSE //Quick if statement in accessible_items to determine if we care at all about what people can access at once.
|
||||
var/limited_random_access_stack_position = 0 //If >0, can only access top <x> items
|
||||
var/limited_random_access_stack_bottom_up = FALSE //If TRUE, above becomes bottom <x> items
|
||||
|
||||
/datum/component/storage/Initialize(datum/component/storage/concrete/master)
|
||||
if(!isatom(parent))
|
||||
@@ -96,6 +100,7 @@
|
||||
RegisterSignal(parent, COMSIG_ITEM_PICKUP, .proc/signal_on_pickup)
|
||||
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_POST_THROW, .proc/close_all)
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/check_views)
|
||||
|
||||
RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/on_alt_click)
|
||||
RegisterSignal(parent, COMSIG_MOUSEDROP_ONTO, .proc/mousedrop_onto)
|
||||
@@ -145,6 +150,19 @@
|
||||
var/datum/component/storage/concrete/master = master()
|
||||
return master? master.real_location() : null
|
||||
|
||||
//What players can access
|
||||
//this proc can probably eat a refactor at some point.
|
||||
/datum/component/storage/proc/accessible_items(random_access = TRUE)
|
||||
var/list/contents = contents()
|
||||
if(contents)
|
||||
if(limited_random_access && random_access)
|
||||
if(limited_random_access_stack_position && (length(contents) > limited_random_access_stack_position))
|
||||
if(limited_random_access_stack_bottom_up)
|
||||
contents.Cut(1, limited_random_access_stack_position + 1)
|
||||
else
|
||||
contents.Cut(1, length(contents) - limited_random_access_stack_position + 1)
|
||||
return contents
|
||||
|
||||
/datum/component/storage/proc/canreach_react(datum/source, list/next)
|
||||
var/datum/component/storage/concrete/master = master()
|
||||
if(!master)
|
||||
@@ -283,8 +301,7 @@
|
||||
|
||||
/datum/component/storage/proc/_process_numerical_display()
|
||||
. = list()
|
||||
var/atom/real_location = real_location()
|
||||
for(var/obj/item/I in real_location.contents)
|
||||
for(var/obj/item/I in accessible_items())
|
||||
if(QDELETED(I))
|
||||
continue
|
||||
if(!.[I.type])
|
||||
@@ -295,8 +312,8 @@
|
||||
|
||||
//This proc determines the size of the inventory to be displayed. Please touch it only if you know what you're doing.
|
||||
/datum/component/storage/proc/orient2hud(mob/user, maxcolumns)
|
||||
var/atom/real_location = real_location()
|
||||
var/adjusted_contents = real_location.contents.len
|
||||
var/list/accessible_contents = accessible_items()
|
||||
var/adjusted_contents = length(accessible_contents)
|
||||
|
||||
//Numbered contents display
|
||||
var/list/datum/numbered_display/numbered_contents
|
||||
@@ -328,8 +345,7 @@
|
||||
if(cy - screen_start_y >= rows)
|
||||
break
|
||||
else
|
||||
var/atom/real_location = real_location()
|
||||
for(var/obj/O in real_location)
|
||||
for(var/obj/O in accessible_items())
|
||||
if(QDELETED(O))
|
||||
continue
|
||||
O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip"
|
||||
@@ -350,9 +366,8 @@
|
||||
return FALSE
|
||||
var/list/cview = getviewsize(M.client.view)
|
||||
var/maxallowedscreensize = cview[1]-8
|
||||
var/atom/real_location = real_location()
|
||||
if(M.active_storage != src && (M.stat == CONSCIOUS))
|
||||
for(var/obj/item/I in real_location)
|
||||
for(var/obj/item/I in accessible_items())
|
||||
if(I.on_found(M))
|
||||
return FALSE
|
||||
if(M.active_storage)
|
||||
@@ -360,7 +375,7 @@
|
||||
orient2hud(M, (isliving(M) ? maxallowedscreensize : 7))
|
||||
M.client.screen |= boxes
|
||||
M.client.screen |= closer
|
||||
M.client.screen |= real_location.contents
|
||||
M.client.screen |= accessible_items()
|
||||
M.active_storage = src
|
||||
LAZYOR(is_using, M)
|
||||
return TRUE
|
||||
@@ -386,6 +401,11 @@
|
||||
close(M)
|
||||
. = TRUE //returns TRUE if any mobs actually got a close(M) call
|
||||
|
||||
/datum/component/storage/proc/check_views()
|
||||
for(var/mob/M in can_see_contents())
|
||||
if(!isobserver(M) && !M.CanReach(src, view_only = TRUE))
|
||||
close(M)
|
||||
|
||||
/datum/component/storage/proc/emp_act(datum/source, severity)
|
||||
if(emp_shielded)
|
||||
return
|
||||
@@ -587,7 +607,7 @@
|
||||
return FALSE
|
||||
if(isitem(host))
|
||||
var/obj/item/IP = host
|
||||
GET_COMPONENT_FROM(STR_I, /datum/component/storage, I)
|
||||
var/datum/component/storage/STR_I = I.GetComponent(/datum/component/storage)
|
||||
if((I.w_class >= IP.w_class) && STR_I && !allow_big_nesting)
|
||||
if(!stop_messages)
|
||||
to_chat(M, "<span class='warning'>[IP] cannot hold [I] as it's a storage item of the same size!</span>")
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm)
|
||||
|
||||
/datum/component/swarming/proc/join_swarm(datum/source, atom/movable/AM)
|
||||
GET_COMPONENT_FROM(other_swarm, /datum/component/swarming, AM)
|
||||
var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming)
|
||||
if(!other_swarm)
|
||||
return
|
||||
swarm()
|
||||
@@ -21,7 +21,7 @@
|
||||
other_swarm.swarm_members |= src
|
||||
|
||||
/datum/component/swarming/proc/leave_swarm(datum/source, atom/movable/AM)
|
||||
GET_COMPONENT_FROM(other_swarm, /datum/component/swarming, AM)
|
||||
var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming)
|
||||
if(!other_swarm || !(other_swarm in swarm_members))
|
||||
return
|
||||
swarm_members -= other_swarm
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/component/virtual_reality
|
||||
dupe_mode = COMPONENT_DUPE_ALLOWED //mindswap memes, shouldn't stack up otherwise.
|
||||
can_transfer = TRUE
|
||||
var/datum/mind/mastermind // where is my mind t. pixies
|
||||
var/datum/mind/current_mind
|
||||
var/obj/machinery/vr_sleeper/vr_sleeper
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/datum/component/wearertargeting
|
||||
var/list/valid_slots = list()
|
||||
var/list/signals = list()
|
||||
var/datum/callback/callback = CALLBACK(GLOBAL_PROC, .proc/pass)
|
||||
var/proctype = .proc/pass
|
||||
var/mobtype = /mob/living
|
||||
|
||||
/datum/component/wearertargeting/Initialize()
|
||||
@@ -14,13 +14,9 @@
|
||||
|
||||
/datum/component/wearertargeting/proc/on_equip(datum/source, mob/equipper, slot)
|
||||
if((slot in valid_slots) && istype(equipper, mobtype))
|
||||
RegisterSignal(equipper, signals, callback, TRUE)
|
||||
RegisterSignal(equipper, signals, proctype, TRUE)
|
||||
else
|
||||
UnregisterSignal(equipper, signals)
|
||||
|
||||
/datum/component/wearertargeting/proc/on_drop(datum/source, mob/user)
|
||||
UnregisterSignal(user, signals)
|
||||
|
||||
/datum/component/wearertargeting/Destroy()
|
||||
QDEL_NULL(callback) //is likely to ourselves.
|
||||
return ..()
|
||||
UnregisterSignal(user, signals)
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/component/wet_floor
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
can_transfer = TRUE
|
||||
var/highest_strength = TURF_DRY
|
||||
var/lube_flags = NONE //why do we have this?
|
||||
var/list/time_left_list //In deciseconds.
|
||||
@@ -26,14 +27,19 @@
|
||||
if(!isopenturf(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
add_wet(strength, duration_minimum, duration_add, duration_maximum)
|
||||
RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet)
|
||||
RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry)
|
||||
permanent = _permanent
|
||||
if(!permanent)
|
||||
START_PROCESSING(SSwet_floors, src)
|
||||
addtimer(CALLBACK(src, .proc/gc, TRUE), 1) //GC after initialization.
|
||||
last_process = world.time
|
||||
|
||||
/datum/component/wet_floor/RegisterWithParent()
|
||||
RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet)
|
||||
RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry)
|
||||
|
||||
/datum/component/wet_floor/UnregisterFromParent()
|
||||
UnregisterSignal(parent, list(COMSIG_TURF_IS_WET, COMSIG_TURF_MAKE_DRY))
|
||||
|
||||
/datum/component/wet_floor/Destroy()
|
||||
STOP_PROCESSING(SSwet_floors, src)
|
||||
var/turf/T = parent
|
||||
@@ -138,12 +144,19 @@
|
||||
/datum/component/wet_floor/PreTransfer()
|
||||
var/turf/O = parent
|
||||
O.cut_overlay(current_overlay)
|
||||
//That turf is no longer slippery, we're out of here
|
||||
//Slippery components don't transfer due to callbacks
|
||||
qdel(O.GetComponent(/datum/component/slippery))
|
||||
|
||||
/datum/component/wet_floor/PostTransfer()
|
||||
if(!isopenturf(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
var/turf/T = parent
|
||||
T.add_overlay(current_overlay)
|
||||
//Make sure to add/update any slippery component on the new turf (update_flags calls LoadComponent)
|
||||
update_flags()
|
||||
|
||||
//NB it's possible we get deleted after this, due to inherit
|
||||
|
||||
/datum/component/wet_floor/proc/add_wet(type, duration_minimum = 0, duration_add = 0, duration_maximum = MAXIMUM_WET_TIME, _permanent = FALSE)
|
||||
var/static/list/allowed_types = list(TURF_WET_WATER, TURF_WET_LUBE, TURF_WET_ICE, TURF_WET_PERMAFROST)
|
||||
|
||||
+1
-1
@@ -42,8 +42,8 @@
|
||||
destination.dna.unique_enzymes = unique_enzymes
|
||||
destination.dna.uni_identity = uni_identity
|
||||
destination.dna.blood_type = blood_type
|
||||
destination.set_species(species.type, icon_update=0)
|
||||
destination.dna.features = features.Copy()
|
||||
destination.set_species(species.type, icon_update=0)
|
||||
destination.dna.real_name = real_name
|
||||
destination.dna.nameless = nameless
|
||||
destination.dna.custom_species = custom_species
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
var/config_max_users = 0
|
||||
var/config_min_users = 0
|
||||
var/voteweight = 1
|
||||
var/max_round_search_span = 0 //If this is nonzero, then if the map has been played more than max_rounds_played within the search span (max determined by define in persistence.dm), this map won't be available.
|
||||
var/max_rounds_played = 0
|
||||
|
||||
// Config actually from the JSON - should default to Box
|
||||
var/map_name = "Box Station"
|
||||
@@ -23,6 +25,10 @@
|
||||
|
||||
var/minetype = "lavaland"
|
||||
|
||||
var/maptype = MAP_TYPE_STATION //This should be used to adjust ingame behavior depending on the specific type of map being played. For instance, if an overmap were added, it'd be appropriate for it to only generate with a MAP_TYPE_SHIP
|
||||
|
||||
var/announcertype = "standard" //Determines the announcer the map uses. standard uses the default announcer, classic, but has a random chance to use other similarly-themed announcers, like medibot
|
||||
|
||||
var/allow_custom_shuttles = TRUE
|
||||
var/shuttles = list(
|
||||
"cargo" = "cargo_box",
|
||||
@@ -30,6 +36,8 @@
|
||||
"whiteship" = "whiteship_box",
|
||||
"emergency" = "emergency_box")
|
||||
|
||||
var/year_offset = 540 //The offset of ingame year from the actual IRL year. You know you want to make a map that takes place in the 90's. Don't lie.
|
||||
|
||||
/proc/load_map_config(filename = "data/next_map.json", default_to_box, delete_after, error_if_missing = TRUE)
|
||||
var/datum/map_config/config = new
|
||||
if (default_to_box)
|
||||
@@ -122,8 +130,21 @@
|
||||
log_world("map_config space_empty_levels is not a number!")
|
||||
return
|
||||
|
||||
temp = json["year_offset"]
|
||||
if (isnum(temp))
|
||||
year_offset = temp
|
||||
else if (!isnull(temp))
|
||||
log_world("map_config year_offset is not a number!")
|
||||
return
|
||||
|
||||
if ("minetype" in json)
|
||||
minetype = json["minetype"]
|
||||
|
||||
if ("maptype" in json)
|
||||
maptype = json["maptype"]
|
||||
|
||||
if ("announcertype" in json)
|
||||
announcertype = json["announcertype"]
|
||||
|
||||
allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE
|
||||
|
||||
|
||||
@@ -10,10 +10,11 @@
|
||||
// And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var
|
||||
|
||||
// Helper similar to image()
|
||||
/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE)
|
||||
/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, color = "#FFFFFF")
|
||||
var/mutable_appearance/MA = new()
|
||||
MA.icon = icon
|
||||
MA.icon_state = icon_state
|
||||
MA.layer = layer
|
||||
MA.plane = plane
|
||||
MA.color = color
|
||||
return MA
|
||||
|
||||
@@ -282,6 +282,11 @@
|
||||
name = "Ancient Cloning Lab"
|
||||
description = "An experimental cloning lab snapped off from an ancient ship. The cloner model inside lacks many modern functionalities and security measures."
|
||||
|
||||
/datum/map_template/ruin/space/hilbertresearchfacility
|
||||
id = "hilbert_facility"
|
||||
suffix = "hilbertshoteltestingsite.dmm"
|
||||
name = "Hilbert Research Facility"
|
||||
description = "A research facility of great bluespace discoveries. Long since abandoned, willingly or not..."
|
||||
/datum/map_template/ruin/space/augmentation
|
||||
id = "augmentationfacility"
|
||||
suffix = "augmentationfacility.dmm"
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
|
||||
/datum/status_effect/belligerent/proc/do_movement_toggle(force_damage)
|
||||
var/number_legs = owner.get_num_legs(FALSE)
|
||||
if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.anti_magic_check() && number_legs)
|
||||
if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.anti_magic_check(chargecost = 0) && number_legs)
|
||||
if(force_damage || owner.m_intent != MOVE_INTENT_WALK)
|
||||
if(GLOB.ratvar_awakens)
|
||||
owner.Knockdown(20)
|
||||
@@ -248,7 +248,7 @@
|
||||
if(owner.confused)
|
||||
owner.confused = 0
|
||||
severity = 0
|
||||
else if(!owner.anti_magic_check() && owner.stat != DEAD && severity)
|
||||
else if(!owner.anti_magic_check(chargecost = 0) && owner.stat != DEAD && severity)
|
||||
var/static/hum = get_sfx('sound/effects/screech.ogg') //same sound for every proc call
|
||||
if(owner.getToxLoss() > MANIA_DAMAGE_TO_CONVERT)
|
||||
if(is_eligible_servant(owner))
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
alert_type = /obj/screen/alert/status_effect/freon
|
||||
var/icon/cube
|
||||
var/can_melt = TRUE
|
||||
var/datum/weakref/redirect_component
|
||||
|
||||
/obj/screen/alert/status_effect/freon
|
||||
name = "Frozen Solid"
|
||||
@@ -13,7 +12,7 @@
|
||||
icon_state = "frozen"
|
||||
|
||||
/datum/status_effect/freon/on_apply()
|
||||
redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist))))
|
||||
RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/owner_resist)
|
||||
if(!owner.stat)
|
||||
to_chat(owner, "<span class='userdanger'>You become frozen in a cube!</span>")
|
||||
cube = icon('icons/effects/freeze.dmi', "ice_cube")
|
||||
@@ -40,8 +39,7 @@
|
||||
owner.cut_overlay(cube)
|
||||
owner.adjust_bodytemperature(100)
|
||||
owner.update_canmove()
|
||||
qdel(redirect_component.resolve())
|
||||
redirect_component = null
|
||||
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
|
||||
|
||||
/datum/status_effect/freon/watcher
|
||||
duration = 8
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
mood_quirk = TRUE
|
||||
|
||||
/datum/quirk/apathetic/add()
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder)
|
||||
var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood)
|
||||
if(mood)
|
||||
mood.mood_modifier = 0.8
|
||||
|
||||
/datum/quirk/apathetic/remove()
|
||||
if(quirk_holder)
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder)
|
||||
var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood)
|
||||
if(mood)
|
||||
mood.mood_modifier = 1 //Change this once/if species get their own mood modifiers.
|
||||
|
||||
|
||||
+129
-11
@@ -36,6 +36,12 @@
|
||||
var/rad_flags = NONE // Will move to flags_1 when i can be arsed to
|
||||
var/rad_insulation = RAD_NO_INSULATION
|
||||
|
||||
var/icon/blood_splatter_icon
|
||||
var/list/fingerprints
|
||||
var/list/fingerprintshidden
|
||||
var/list/blood_DNA
|
||||
var/list/suit_fibers
|
||||
|
||||
/atom/New(loc, ...)
|
||||
//atom creation method that preloads variables at creation
|
||||
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
|
||||
@@ -220,7 +226,7 @@
|
||||
return FALSE
|
||||
|
||||
/atom/proc/CheckExit()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/atom/proc/HasProximity(atom/movable/AM as mob|obj)
|
||||
return
|
||||
@@ -254,14 +260,26 @@
|
||||
if(article)
|
||||
. = "[article] [src]"
|
||||
override[EXAMINE_POSITION_ARTICLE] = article
|
||||
|
||||
var/should_override = FALSE
|
||||
|
||||
if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED)
|
||||
should_override = TRUE
|
||||
|
||||
|
||||
if(blood_DNA && !istype(src, /obj/effect/decal))
|
||||
override[EXAMINE_POSITION_BEFORE] = " blood-stained "
|
||||
should_override = TRUE
|
||||
|
||||
if(should_override)
|
||||
. = override.Join("")
|
||||
|
||||
///Generate the full examine string of this atom (including icon for goonchat)
|
||||
/atom/proc/get_examine_string(mob/user, thats = FALSE)
|
||||
. = "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]"
|
||||
|
||||
/atom/proc/examine(mob/user)
|
||||
to_chat(user, get_examine_string(user, TRUE))
|
||||
to_chat(user, "[get_examine_string(user, TRUE)].")
|
||||
|
||||
if(desc)
|
||||
to_chat(user, desc)
|
||||
@@ -326,12 +344,14 @@
|
||||
|
||||
//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list
|
||||
/mob/living/proc/get_blood_dna_list()
|
||||
if(get_blood_id() != "blood")
|
||||
var/blood_id = get_blood_id()
|
||||
if(!(blood_id =="blood" || blood_id == "jellyblood"))
|
||||
return
|
||||
return list("ANIMAL DNA" = "Y-")
|
||||
|
||||
/mob/living/carbon/get_blood_dna_list()
|
||||
if(get_blood_id() != "blood")
|
||||
var/blood_id = get_blood_id()
|
||||
if(!(blood_id =="blood" || blood_id == "jellyblood"))
|
||||
return
|
||||
var/list/blood_dna = list()
|
||||
if(dna)
|
||||
@@ -349,18 +369,116 @@
|
||||
var/new_blood_dna = L.get_blood_dna_list()
|
||||
if(!new_blood_dna)
|
||||
return FALSE
|
||||
var/old_length = blood_DNA_length()
|
||||
add_blood_DNA(new_blood_dna)
|
||||
if(blood_DNA_length() == old_length)
|
||||
LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it.
|
||||
var/old_length = blood_DNA.len
|
||||
blood_DNA |= new_blood_dna
|
||||
if(blood_DNA.len == old_length)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
//to add blood dna info to the object's blood_DNA list
|
||||
/atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases)
|
||||
LAZYINITLIST(blood_DNA)
|
||||
var/old_length = blood_DNA.len
|
||||
blood_DNA |= blood_dna
|
||||
if(blood_DNA.len > old_length)
|
||||
return TRUE
|
||||
//some new blood DNA was added
|
||||
|
||||
//to add blood from a mob onto something, and transfer their dna info
|
||||
/atom/proc/add_mob_blood(mob/living/M)
|
||||
var/list/blood_dna = M.get_blood_dna_list()
|
||||
if(!blood_dna)
|
||||
return FALSE
|
||||
return add_blood_DNA(blood_dna)
|
||||
return add_blood_DNA(blood_dna, M.diseases)
|
||||
|
||||
//to add blood onto something, with blood dna info to include.
|
||||
/atom/proc/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
|
||||
return FALSE
|
||||
|
||||
/obj/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
|
||||
return transfer_blood_dna(blood_dna, diseases)
|
||||
|
||||
/obj/item/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
add_blood_overlay()
|
||||
|
||||
/obj/item/proc/add_blood_overlay()
|
||||
if(!blood_DNA.len)
|
||||
return
|
||||
if(initial(icon) && initial(icon_state))
|
||||
blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object
|
||||
blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
|
||||
blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
|
||||
blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY)
|
||||
add_overlay(blood_splatter_icon)
|
||||
|
||||
/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
|
||||
. = ..()
|
||||
transfer_blood = rand(2, 4)
|
||||
|
||||
/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
|
||||
var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src
|
||||
if(!B)
|
||||
B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases)
|
||||
B.transfer_blood_dna(blood_dna, diseases) //give blood info to the blood decal.
|
||||
return TRUE //we bloodied the floor
|
||||
|
||||
/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
|
||||
if(head)
|
||||
head.add_blood_DNA(blood_dna, diseases)
|
||||
update_inv_head()
|
||||
else if(wear_mask)
|
||||
wear_mask.add_blood_DNA(blood_dna, diseases)
|
||||
update_inv_wear_mask()
|
||||
if(wear_neck)
|
||||
wear_neck.add_blood_DNA(blood_dna, diseases)
|
||||
update_inv_neck()
|
||||
if(wear_suit)
|
||||
wear_suit.add_blood_DNA(blood_dna, diseases)
|
||||
update_inv_wear_suit()
|
||||
else if(w_uniform)
|
||||
w_uniform.add_blood_DNA(blood_dna, diseases)
|
||||
update_inv_w_uniform()
|
||||
if(gloves)
|
||||
var/obj/item/clothing/gloves/G = gloves
|
||||
G.add_blood_DNA(blood_dna, diseases)
|
||||
else
|
||||
transfer_blood_dna(blood_dna, diseases)
|
||||
bloody_hands = rand(2, 4)
|
||||
update_inv_gloves() //handles bloody hands overlays and updating
|
||||
return TRUE
|
||||
|
||||
/atom/proc/blood_DNA_to_color()
|
||||
var/list/colors = list()//first we make a list of all bloodtypes present
|
||||
for(var/bloop in blood_DNA)
|
||||
if(colors[blood_DNA[bloop]])
|
||||
colors[blood_DNA[bloop]]++
|
||||
else
|
||||
colors[blood_DNA[bloop]] = 1
|
||||
|
||||
var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up
|
||||
|
||||
if(colors.len)
|
||||
var/sum = 0 //this is all shitcode, but it works; trust me
|
||||
final_rgb = bloodtype_to_color(colors[1])
|
||||
sum = colors[colors[1]]
|
||||
if(colors.len > 1)
|
||||
var/i = 2
|
||||
while(i <= colors.len)
|
||||
var/tmp = colors[colors[i]]
|
||||
final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum))
|
||||
sum += tmp
|
||||
i++
|
||||
|
||||
return final_rgb
|
||||
|
||||
/atom/proc/clean_blood()
|
||||
if(islist(blood_DNA))
|
||||
blood_DNA = null
|
||||
return TRUE
|
||||
|
||||
/atom/proc/wash_cream()
|
||||
return TRUE
|
||||
@@ -410,7 +528,7 @@
|
||||
/atom/proc/component_storage_contents_dump_act(datum/component/storage/src_object, mob/user)
|
||||
var/list/things = src_object.contents()
|
||||
var/datum/progressbar/progress = new(user, things.len, src)
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
|
||||
while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress)))
|
||||
stoplag(1)
|
||||
qdel(progress)
|
||||
@@ -711,7 +829,7 @@ Proc for attack log creation, because really why not
|
||||
return filters[filter_data.Find(name)]
|
||||
|
||||
/atom/movable/proc/remove_filter(name)
|
||||
if(filter_data[name])
|
||||
if(filter_data && filter_data[name])
|
||||
filter_data -= name
|
||||
update_filters()
|
||||
return TRUE
|
||||
return TRUE
|
||||
@@ -27,7 +27,6 @@
|
||||
glide_size = 8
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE
|
||||
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
|
||||
var/floating = FALSE
|
||||
var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc.
|
||||
var/atom/movable/pulling
|
||||
var/grab_state = 0
|
||||
@@ -422,6 +421,9 @@
|
||||
var/atom/movable/AM = item
|
||||
AM.onTransitZ(old_z,new_z)
|
||||
|
||||
/atom/movable/proc/setMovetype(newval)
|
||||
movement_type = newval
|
||||
|
||||
//Called whenever an object moves and by mobs when they attempt to move themselves through space
|
||||
//And when an object or action applies a force on src, see newtonian_move() below
|
||||
//Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting
|
||||
@@ -518,6 +520,8 @@
|
||||
TT.thrower = thrower
|
||||
TT.diagonals_first = diagonals_first
|
||||
TT.callback = callback
|
||||
if(!QDELETED(thrower))
|
||||
TT.target_zone = thrower.zone_selected
|
||||
|
||||
var/dist_x = abs(target.x - src.x)
|
||||
var/dist_y = abs(target.y - src.y)
|
||||
@@ -684,14 +688,14 @@
|
||||
/atom/movable/proc/float(on)
|
||||
if(throwing)
|
||||
return
|
||||
if(on && !floating)
|
||||
if(on && !(movement_type & FLOATING))
|
||||
animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
|
||||
sleep(10)
|
||||
animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1)
|
||||
floating = TRUE
|
||||
else if (!on && floating)
|
||||
setMovetype(movement_type | FLOATING)
|
||||
else if (!on && (movement_type & FLOATING))
|
||||
animate(src, pixel_y = initial(pixel_y), time = 10)
|
||||
floating = FALSE
|
||||
setMovetype(movement_type & ~FLOATING)
|
||||
|
||||
/* Language procs */
|
||||
/atom/movable/proc/get_language_holder(shadow=TRUE)
|
||||
|
||||
@@ -39,12 +39,12 @@
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/Initialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(bananium, /datum/component/material_container)
|
||||
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
|
||||
bananium.insert_amount(max_recharge, MAT_BANANIUM)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/process()
|
||||
GET_COMPONENT(bananium, /datum/component/material_container)
|
||||
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
|
||||
var/bananium_amount = bananium.amount(MAT_BANANIUM)
|
||||
if(bananium_amount < max_recharge)
|
||||
bananium.insert_amount(min(recharge_rate, max_recharge - bananium_amount), MAT_BANANIUM)
|
||||
@@ -73,19 +73,19 @@
|
||||
/obj/item/melee/transforming/energy/sword/bananium/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
|
||||
GET_COMPONENT(slipper, /datum/component/slippery)
|
||||
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
|
||||
slipper.signal_enabled = active
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/bananium/attack(mob/living/M, mob/living/user)
|
||||
..()
|
||||
if(active)
|
||||
GET_COMPONENT(slipper, /datum/component/slippery)
|
||||
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
|
||||
slipper.Slip(M)
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum)
|
||||
. = ..()
|
||||
if(active)
|
||||
GET_COMPONENT(slipper, /datum/component/slippery)
|
||||
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
|
||||
slipper.Slip(hit_atom)
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/bananium/attackby(obj/item/I, mob/living/user, params)
|
||||
@@ -98,7 +98,7 @@
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/bananium/transform_weapon(mob/living/user, supress_message_text)
|
||||
..()
|
||||
GET_COMPONENT(slipper, /datum/component/slippery)
|
||||
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
|
||||
slipper.signal_enabled = active
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/bananium/ignition_effect(atom/A, mob/user)
|
||||
@@ -108,7 +108,7 @@
|
||||
if(!active)
|
||||
transform_weapon(user, TRUE)
|
||||
user.visible_message("<span class='suicide'>[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku, but the blade slips off of [user.p_them()] harmlessly!</span>")
|
||||
GET_COMPONENT(slipper, /datum/component/slippery)
|
||||
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
|
||||
slipper.Slip(user)
|
||||
return SHAME
|
||||
|
||||
@@ -130,12 +130,12 @@
|
||||
/obj/item/shield/energy/bananium/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
|
||||
GET_COMPONENT(slipper, /datum/component/slippery)
|
||||
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
|
||||
slipper.signal_enabled = active
|
||||
|
||||
/obj/item/shield/energy/bananium/attack_self(mob/living/carbon/human/user)
|
||||
..()
|
||||
GET_COMPONENT(slipper, /datum/component/slippery)
|
||||
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
|
||||
slipper.signal_enabled = active
|
||||
|
||||
/obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1)
|
||||
@@ -149,7 +149,7 @@
|
||||
if(active)
|
||||
var/caught = hit_atom.hitby(src, 0, 0)
|
||||
if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it
|
||||
GET_COMPONENT(slipper, /datum/component/slippery)
|
||||
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
|
||||
slipper.Slip(hit_atom)
|
||||
if(thrownby && !caught)
|
||||
throw_at(thrownby, throw_range+2, throw_speed, null, 1)
|
||||
@@ -267,6 +267,7 @@
|
||||
operation_req_access = list(ACCESS_SYNDICATE)
|
||||
wreckage = /obj/structure/mecha_wreckage/honker/dark
|
||||
max_equip = 3
|
||||
spawn_tracked = FALSE
|
||||
|
||||
/obj/mecha/combat/honker/dark/GrantActions(mob/living/user, human_occupant = 0)
|
||||
..()
|
||||
|
||||
@@ -107,6 +107,11 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
/// If a only ruleset has been executed.
|
||||
var/only_ruleset_executed = FALSE
|
||||
|
||||
/datum/game_mode/dynamic/New() // i have NO IDEA if this is the proper way to do this.
|
||||
..()
|
||||
pop_per_requirement = CONFIG_GET(number/dynamic_pop_per_requirement)
|
||||
GLOB.dynamic_high_pop_limit = CONFIG_GET(number/dynamic_high_pop_limit)
|
||||
|
||||
/datum/game_mode/dynamic/admin_panel()
|
||||
var/list/dat = list("<html><head><title>Game Mode Panel</title></head><body><h1><B>Game Mode Panel</B></h1>")
|
||||
dat += "Dynamic Mode <a href='?_src_=vars;[HrefToken()];Vars=[REF(src)]'>\[VV\]</A><BR>"
|
||||
@@ -216,7 +221,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
. += G.get_report()
|
||||
|
||||
print_command_report(., "Central Command Status Summary", announce=FALSE)
|
||||
priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", 'sound/ai/intercept.ogg')
|
||||
priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", "intercept")
|
||||
if(GLOB.security_level < SEC_LEVEL_BLUE)
|
||||
set_security_level(SEC_LEVEL_BLUE)
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
var/name = ""
|
||||
/// For admin logging and round end screen, do not change this unless making a new rule type.
|
||||
var/ruletype = ""
|
||||
/// For config purposes, similar to config_tag for secret game modes.
|
||||
var/config_tag = null
|
||||
/// If set to TRUE, the rule won't be discarded after being executed, and dynamic will call rule_process() every time it ticks.
|
||||
var/persistent = FALSE
|
||||
/// If set to TRUE, dynamic mode will be able to draft this ruleset again later on. (doesn't apply for roundstart rules)
|
||||
@@ -65,7 +67,18 @@
|
||||
restricted_roles += protected_roles
|
||||
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
|
||||
restricted_roles += "Assistant"
|
||||
|
||||
var/weights = CONFIG_GET(keyed_list/dynamic_weight)
|
||||
var/costs = CONFIG_GET(keyed_list/dynamic_cost)
|
||||
var/requirementses = CONFIG_GET(keyed_list/dynamic_requirements) // can't damn well use requirements
|
||||
var/high_population_requirements = CONFIG_GET(keyed_list/dynamic_high_population_requirement)
|
||||
if(config_tag in weights)
|
||||
weight = weights[config_tag]
|
||||
if(config_tag in costs)
|
||||
cost = costs[config_tag]
|
||||
if(config_tag in requirementses)
|
||||
requirements = requirementses[config_tag]
|
||||
if(config_tag in high_population_requirements)
|
||||
high_population_requirement = high_population_requirements[config_tag]
|
||||
if (istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
mode = SSticker.mode
|
||||
else if (GLOB.master_mode != "dynamic") // This is here to make roundstart forced ruleset function.
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/latejoin/infiltrator
|
||||
name = "Syndicate Infiltrator"
|
||||
config_tag = "latejoin_traitor"
|
||||
antag_datum = /datum/antagonist/traitor
|
||||
antag_flag = ROLE_TRAITOR
|
||||
restricted_roles = list("AI", "Cyborg")
|
||||
@@ -72,6 +73,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/latejoin/provocateur
|
||||
name = "Provocateur"
|
||||
config_tag = "latejoin_revolution"
|
||||
antag_datum = /datum/antagonist/rev/head
|
||||
antag_flag = ROLE_REV_HEAD
|
||||
antag_flag_override = ROLE_REV
|
||||
|
||||
@@ -169,6 +169,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/autotraitor
|
||||
name = "Syndicate Sleeper Agent"
|
||||
config_tag = "midround_traitor"
|
||||
antag_datum = /datum/antagonist/traitor
|
||||
antag_flag = ROLE_TRAITOR
|
||||
restricted_roles = list("AI", "Cyborg", "Positronic Brain")
|
||||
@@ -224,6 +225,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/malf
|
||||
name = "Malfunctioning AI"
|
||||
config_tag = "malf_ai"
|
||||
antag_datum = /datum/antagonist/traitor
|
||||
antag_flag = ROLE_MALF
|
||||
enemy_roles = list("Security Officer", "Warden","Detective","Head of Security", "Captain", "Scientist", "Chemist", "Research Director", "Chief Engineer")
|
||||
@@ -261,7 +263,7 @@
|
||||
M.mind.special_role = antag_flag
|
||||
M.mind.add_antag_datum(AI)
|
||||
if(prob(ion_announce))
|
||||
priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/ai/ionstorm.ogg')
|
||||
priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", "ionstorm")
|
||||
if(prob(removeDontImproveChance))
|
||||
M.replace_random_law(generate_ion_law(), list(LAW_INHERENT, LAW_SUPPLIED, LAW_ION))
|
||||
else
|
||||
@@ -276,6 +278,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/wizard
|
||||
name = "Wizard"
|
||||
config_tag = "midround_wizard"
|
||||
antag_datum = /datum/antagonist/wizard
|
||||
antag_flag = ROLE_WIZARD
|
||||
enemy_roles = list("Security Officer","Detective","Head of Security", "Captain")
|
||||
@@ -308,6 +311,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/nuclear
|
||||
name = "Nuclear Assault"
|
||||
config_tag = "midround_nuclear"
|
||||
antag_flag = ROLE_OPERATIVE
|
||||
antag_datum = /datum/antagonist/nukeop
|
||||
enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain")
|
||||
@@ -351,6 +355,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/blob
|
||||
name = "Blob"
|
||||
config_tag = "blob"
|
||||
antag_datum = /datum/antagonist/blob
|
||||
antag_flag = ROLE_BLOB
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
@@ -374,6 +379,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/xenomorph
|
||||
name = "Alien Infestation"
|
||||
config_tag = "xenos"
|
||||
antag_datum = /datum/antagonist/xeno
|
||||
antag_flag = ROLE_ALIEN
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
@@ -420,6 +426,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/nightmare
|
||||
name = "Nightmare"
|
||||
config_tag = "nightmare"
|
||||
antag_datum = /datum/antagonist/nightmare
|
||||
antag_flag = "Nightmare"
|
||||
antag_flag_override = ROLE_ALIEN
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/traitor
|
||||
name = "Traitors"
|
||||
config_tag = "traitor"
|
||||
persistent = TRUE
|
||||
antag_flag = ROLE_TRAITOR
|
||||
antag_datum = /datum/antagonist/traitor/
|
||||
@@ -48,6 +49,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/traitorbro
|
||||
name = "Blood Brothers"
|
||||
config_tag = "traitorbro"
|
||||
antag_flag = ROLE_BROTHER
|
||||
antag_datum = /datum/antagonist/brother/
|
||||
restricted_roles = list("AI", "Cyborg")
|
||||
@@ -100,6 +102,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/changeling
|
||||
name = "Changelings"
|
||||
config_tag = "changeling"
|
||||
antag_flag = ROLE_CHANGELING
|
||||
antag_datum = /datum/antagonist/changeling
|
||||
restricted_roles = list("AI", "Cyborg")
|
||||
@@ -149,6 +152,7 @@
|
||||
// Dynamic is a wonderful thing that adds wizards to every round and then adds even more wizards during the round.
|
||||
/datum/dynamic_ruleset/roundstart/wizard
|
||||
name = "Wizard"
|
||||
config_tag = "wizard"
|
||||
antag_flag = ROLE_WIZARD
|
||||
antag_datum = /datum/antagonist/wizard
|
||||
minimum_required_age = 14
|
||||
@@ -194,6 +198,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/bloodcult
|
||||
name = "Blood Cult"
|
||||
config_tag = "cult"
|
||||
antag_flag = ROLE_CULTIST
|
||||
antag_datum = /datum/antagonist/cult
|
||||
minimum_required_age = 14
|
||||
@@ -254,6 +259,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/nuclear
|
||||
name = "Nuclear Emergency"
|
||||
config_tag = "nuclear"
|
||||
antag_flag = ROLE_OPERATIVE
|
||||
antag_datum = /datum/antagonist/nukeop
|
||||
var/datum/antagonist/antag_leader_datum = /datum/antagonist/nukeop/leader
|
||||
@@ -343,6 +349,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/delayed/revs
|
||||
name = "Revolution"
|
||||
config_tag = "revolution"
|
||||
persistent = TRUE
|
||||
antag_flag = ROLE_REV_HEAD
|
||||
antag_flag_override = ROLE_REV
|
||||
@@ -433,6 +440,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/extended
|
||||
name = "Extended"
|
||||
config_tag = "extended"
|
||||
antag_flag = null
|
||||
antag_datum = null
|
||||
restricted_roles = list()
|
||||
@@ -456,6 +464,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/clockcult
|
||||
name = "Clockcult"
|
||||
config_tag = "clockwork_cult"
|
||||
antag_flag = ROLE_SERVANT_OF_RATVAR
|
||||
antag_datum = /datum/antagonist/clockcult
|
||||
restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
@@ -559,6 +568,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/nuclear/clown_ops
|
||||
name = "Clown Ops"
|
||||
config_tag = "clownops"
|
||||
antag_datum = /datum/antagonist/nukeop/clownop
|
||||
antag_leader_datum = /datum/antagonist/nukeop/leader/clownop
|
||||
requirements = list(101,101,101,101,101,101,101,101,101,101)
|
||||
@@ -584,6 +594,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/devil
|
||||
name = "Devil"
|
||||
config_tag = "devil"
|
||||
antag_flag = ROLE_DEVIL
|
||||
antag_datum = /datum/antagonist/devil
|
||||
restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI")
|
||||
@@ -642,6 +653,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/monkey
|
||||
name = "Monkey"
|
||||
config_tag = "monkey"
|
||||
antag_flag = ROLE_MONKEY
|
||||
antag_datum = /datum/antagonist/monkey/leader
|
||||
restricted_roles = list("Cyborg", "AI")
|
||||
@@ -704,6 +716,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/meteor
|
||||
name = "Meteor"
|
||||
config_tag = "meteor"
|
||||
persistent = TRUE
|
||||
required_candidates = 0
|
||||
weight = 3
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/proc/power_failure()
|
||||
priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", 'sound/ai/poweroff.ogg')
|
||||
priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", "poweroff")
|
||||
for(var/obj/machinery/power/smes/S in GLOB.machines)
|
||||
if(istype(get_area(S), /area/ai_monitored/turret_protected) || !is_station_level(S.z))
|
||||
continue
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
/proc/power_restore()
|
||||
|
||||
priority_announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", 'sound/ai/poweron.ogg')
|
||||
priority_announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", "poweron")
|
||||
for(var/obj/machinery/power/apc/C in GLOB.machines)
|
||||
if(C.cell && is_station_level(C.z))
|
||||
C.cell.charge = C.cell.maxcharge
|
||||
@@ -70,7 +70,7 @@
|
||||
|
||||
/proc/power_restore_quick()
|
||||
|
||||
priority_announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", 'sound/ai/poweron.ogg')
|
||||
priority_announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", "poweron")
|
||||
for(var/obj/machinery/power/smes/S in GLOB.machines)
|
||||
if(!is_station_level(S.z))
|
||||
continue
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user