Merge pull request #1 from quotefox/master

Updates my branch
This commit is contained in:
Nam
2019-11-18 04:59:37 -08:00
committed by GitHub
427 changed files with 19571 additions and 92040 deletions
@@ -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
"}
+545
View File
@@ -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
"}
+289
View File
@@ -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
"}
+639
View File
@@ -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
"}
+23
View File
@@ -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
"}
+970
View File
@@ -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
"}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+598
View File
@@ -0,0 +1,598 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/obj/structure/shuttle/engine/propulsion{
dir = 1
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"c" = (
/turf/closed/wall/mineral/plastitanium,
/area/shuttle/escape)
"d" = (
/obj/structure/window/reinforced,
/obj/structure/shuttle/engine/heater{
dir = 1
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"e" = (
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/shuttle/escape)
"f" = (
/turf/open/floor/plating,
/area/shuttle/escape)
"g" = (
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock"
},
/turf/open/floor/plating,
/area/shuttle/escape)
"h" = (
/obj/effect/spawner/structure/window/shuttle,
/turf/open/floor/plating,
/area/shuttle/escape)
"i" = (
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock"
},
/obj/docking_port/mobile/emergency/shuttle_build{
dwidth = 9;
height = 15;
name = "Shuttle Under Construction";
port_direction = 4;
preferred_direction = 2;
width = 26
},
/turf/open/floor/plating,
/area/shuttle/escape)
"j" = (
/obj/structure/table,
/obj/item/storage/toolbox/mechanical{
pixel_x = 3;
pixel_y = 10
},
/obj/item/storage/toolbox/mechanical{
pixel_y = 4
},
/obj/item/storage/toolbox/mechanical{
pixel_x = -3;
pixel_y = -2
},
/obj/item/airlock_painter,
/turf/open/floor/plating,
/area/shuttle/escape)
"k" = (
/obj/structure/table,
/obj/item/storage/toolbox/electrical,
/obj/item/clothing/gloves/color/yellow{
pixel_y = 8
},
/obj/item/storage/toolbox/electrical,
/obj/item/multitool{
pixel_x = 2;
pixel_y = -4
},
/turf/open/floor/plating,
/area/shuttle/escape)
"l" = (
/obj/structure/table,
/obj/item/storage/box/lights/mixed{
pixel_x = -4;
pixel_y = 8
},
/obj/item/electronics/airalarm{
pixel_x = 8
},
/obj/item/electronics/airalarm{
pixel_x = 8
},
/obj/item/electronics/airalarm{
pixel_x = 8
},
/obj/item/electronics/airalarm{
pixel_x = 8
},
/obj/item/electronics/airlock{
pixel_x = -6;
pixel_y = -6
},
/obj/item/electronics/airlock{
pixel_x = -6;
pixel_y = -6
},
/obj/item/electronics/airlock{
pixel_x = -6;
pixel_y = -6
},
/obj/item/electronics/airlock{
pixel_x = -6;
pixel_y = -6
},
/obj/item/electronics/airlock{
pixel_x = -6;
pixel_y = -6
},
/obj/item/electronics/airlock{
pixel_x = -6;
pixel_y = -6
},
/obj/item/electronics/airlock{
pixel_x = -6;
pixel_y = -6
},
/obj/item/electronics/airlock{
pixel_x = -6;
pixel_y = -6
},
/turf/open/floor/plating,
/area/shuttle/escape)
"m" = (
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty{
pixel_x = 3;
pixel_y = 3
},
/obj/item/stack/sheet/metal/fifty{
pixel_x = -2;
pixel_y = -2
},
/obj/item/stack/rods/fifty,
/turf/open/floor/plating,
/area/shuttle/escape)
"n" = (
/obj/structure/table,
/obj/item/stack/sheet/mineral/titanium/fifty{
pixel_x = 3;
pixel_y = 3
},
/obj/item/stack/sheet/mineral/titanium/fifty{
pixel_x = -2;
pixel_y = -2
},
/turf/open/floor/plating,
/area/shuttle/escape)
"o" = (
/obj/structure/table,
/obj/item/stack/sheet/glass/fifty{
pixel_x = 3;
pixel_y = 3
},
/obj/item/stack/sheet/titaniumglass{
pixel_x = -2;
pixel_y = -2
},
/turf/open/floor/plating,
/area/shuttle/escape)
"p" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/escape)
(1,1,1) = {"
a
c
e
e
h
e
e
g
e
i
e
e
h
e
e
g
e
g
e
p
a
a
a
a
a
a
"}
(2,1,1) = {"
b
d
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
e
p
a
a
a
a
a
"}
(3,1,1) = {"
b
d
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
e
a
a
a
a
a
"}
(4,1,1) = {"
c
c
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
e
e
h
h
h
a
"}
(5,1,1) = {"
b
d
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
h
h
"}
(6,1,1) = {"
b
d
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
h
"}
(7,1,1) = {"
b
d
f
f
f
f
f
f
f
f
j
m
f
f
f
f
f
f
f
f
f
f
f
f
f
h
"}
(8,1,1) = {"
c
c
f
f
f
f
f
f
f
f
k
n
f
f
f
f
f
f
f
f
f
f
f
f
f
h
"}
(9,1,1) = {"
b
d
f
f
f
f
f
f
f
f
l
o
f
f
f
f
f
f
f
f
f
f
f
f
f
h
"}
(10,1,1) = {"
b
d
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
h
"}
(11,1,1) = {"
b
d
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
h
h
"}
(12,1,1) = {"
c
c
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
e
e
h
h
h
a
"}
(13,1,1) = {"
b
d
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
e
a
a
a
a
a
"}
(14,1,1) = {"
b
d
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
e
p
a
a
a
a
a
"}
(15,1,1) = {"
a
c
e
e
h
e
e
e
h
e
e
e
h
e
e
e
h
e
e
p
a
a
a
a
a
a
"}
File diff suppressed because it is too large Load Diff
+545
View File
@@ -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
"}
+289
View File
@@ -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
"}
+639
View File
@@ -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
"}
+23
View File
@@ -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
"}
+59 -30
View File
@@ -2,32 +2,45 @@
#define CHECK_DNA_AND_SPECIES(C) if((!(C.dna)) || (!(C.dna.species))) return
//Defines copying names of mutations in all cases, make sure to change this if you change mutation's name
#define HULK "Hulk"
#define XRAY "X Ray Vision"
#define COLDRES "Cold Resistance"
#define TK "Telekinesis"
#define NERVOUS "Nervousness"
#define EPILEPSY "Epilepsy"
#define MUTATE "Unstable DNA"
#define COUGH "Cough"
#define DWARFISM "Dwarfism"
#define CLOWNMUT "Clumsiness"
#define TOURETTES "Tourettes Syndrome"
#define DEAFMUT "Deafness"
#define BLINDMUT "Blindness"
#define RACEMUT "Monkified"
#define BADSIGHT "Near Sightness"
#define LASEREYES "Laser Eyes"
#define CHAMELEON "Chameleon"
#define WACKY "Wacky"
#define MUT_MUTE "Mute"
#define SMILE "Smile"
#define STONER "Stoner"
#define UNINTELLIGIBLE "Unintelligible"
#define SWEDISH "Swedish"
#define CHAV "Chav"
#define ELVIS "Elvis"
//Defines copying names of mutations in all cases, make sure to change this if you change mutation's type
#define HULK /datum/mutation/human/hulk
#define XRAY /datum/mutation/human/thermal/x_ray
#define SPACEMUT /datum/mutation/human/space_adaptation
#define TK /datum/mutation/human/telekinesis
#define NERVOUS /datum/mutation/human/nervousness
#define EPILEPSY /datum/mutation/human/epilepsy
#define MUTATE /datum/mutation/human/bad_dna
#define COUGH /datum/mutation/human/cough
#define DWARFISM /datum/mutation/human/dwarfism
#define CLOWNMUT /datum/mutation/human/clumsy
#define TOURETTES /datum/mutation/human/tourettes
#define DEAFMUT /datum/mutation/human/deaf
#define BLINDMUT /datum/mutation/human/blind
#define RACEMUT /datum/mutation/human/race
#define BADSIGHT /datum/mutation/human/nearsight
#define LASEREYES /datum/mutation/human/laser_eyes
#define CHAMELEON /datum/mutation/human/chameleon
#define WACKY /datum/mutation/human/wacky
#define MUT_MUTE /datum/mutation/human/mute
#define SMILE /datum/mutation/human/smile
#define STONER /datum/mutation/human/stoner
#define UNINTELLIGIBLE /datum/mutation/human/unintelligible
#define SWEDISH /datum/mutation/human/swedish
#define CHAV /datum/mutation/human/chav
#define ELVIS /datum/mutation/human/elvis
#define RADIOACTIVE /datum/mutation/human/radioactive
#define GLOWY /datum/mutation/human/glow
#define TELEPATHY /datum/mutation/human/telepathy
#define FIREBREATH /datum/mutation/human/firebreath
#define VOID /datum/mutation/human/void
#define STRONG /datum/mutation/human/strong
#define FIRESWEAT /datum/mutation/human/fire
#define THERMAL /datum/mutation/human/thermal
#define INSULATED /datum/mutation/human/insulated
#define SHOCKTOUCH /datum/mutation/human/shock
#define ANTENNA /datum/mutation/human/antenna
#define PARANOIA /datum/mutation/human/paranoia
#define MINDREAD /datum/mutation/human/mindreader
#define UI_CHANGED "ui changed"
#define UE_CHANGED "ue changed"
@@ -39,10 +52,13 @@
//Types of usual mutations
#define POSITIVE 1
#define NEGATIVE 2
#define MINOR_NEGATIVE 3
#define MINOR_NEGATIVE 4
//Mutations that cant be taken from genetics and are not in SE
#define NON_SCANNABLE -1
//Mutation classes. Normal being on them, extra being additional mutations with instability and other being stuff you dont want people to fuck with like wizard mutate
#define MUT_NORMAL 1
#define MUT_EXTRA 2
#define MUT_OTHER 3
//DNA - Because fuck you and your magic numbers being all over the codebase.
#define DNA_BLOCK_SIZE 3
@@ -63,7 +79,8 @@
#define DNA_MUTANTMARKING_BLOCK 13
#define DNA_TAUR_BLOCK 14
#define DNA_STRUC_ENZYMES_BLOCKS 18
#define DNA_SEQUENCE_LENGTH 4
#define DNA_MUTATION_BLOCKS 8
#define DNA_UNIQUE_ENZYMES_LEN 32
//Transformation proc stuff
@@ -99,6 +116,7 @@
#define NOEYES 16
#define MARKINGS 17
//organ slots
#define ORGAN_SLOT_BRAIN "brain"
#define ORGAN_SLOT_APPENDIX "appendix"
#define ORGAN_SLOT_RIGHT_ARM_AUG "r_arm_device"
@@ -122,3 +140,14 @@
#define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun"
#define ORGAN_SLOT_TAIL "tail"
#define ORGAN_SLOT_PENIS "penis"
////organ defines
#define STANDARD_ORGAN_THRESHOLD 100
#define STANDARD_ORGAN_HEALING 0.001
#define STANDARD_ORGAN_DECAY 0.00222 //designed to fail organs when left to decay for ~15 minutes
//used for the can_chromosome var on mutations
#define CHROMOSOME_NEVER 0
#define CHROMOSOME_NONE 1
#define CHROMOSOME_USED 2
+7
View File
@@ -81,3 +81,10 @@
#define SPAM_TRIGGER_WARNING 5 //Number of identical messages required before the spam-prevention will warn you to stfu
#define SPAM_TRIGGER_AUTOMUTE 10 //Number of identical messages required before the spam-prevention will automute you
///Max length of a keypress command before it's considered to be a forged packet/bogus command
#define MAX_KEYPRESS_COMMANDLENGTH 16
///Max amount of keypress messages per second over two seconds before client is autokicked
#define MAX_KEYPRESS_AUTOKICK 100
///Length of held key rolling buffer
#define HELD_KEY_BUFFER_LENGTH 15
+2
View File
@@ -10,6 +10,8 @@
#define CHECK_BITFIELD(variable, flag) (variable & (flag))
#define TOGGLE_BITFIELD(variable, flag) (variable ^= (flag))
#define CHECK_MULTIPLE_BITFIELDS(flagvar, flags) (((flagvar) & (flags)) == (flags))
GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768))
// for /datum/var/datum_flags
+1
View File
@@ -11,6 +11,7 @@
#define GROSS (1<<10)
#define TOXIC (1<<11)
#define PINEAPPLE (1<<12)
#define CLOTH (1<<14)
#define DRINK_NICE 1
#define DRINK_GOOD 2
+2
View File
@@ -57,8 +57,10 @@
#define isluminescent(A) (is_species(A, /datum/species/jelly/luminescent))
#define iszombie(A) (is_species(A, /datum/species/zombie))
#define ismoth(A) (is_species(A, /datum/species/moth))
#define ismoth(A) (is_species(A, /datum/species/insect))
#define ishumanbasic(A) (is_species(A, /datum/species/human))
#define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) )
#define isvampire(A) (is_species(A,/datum/species/vampire))
//more carbon mobs
#define ismonkey(A) (istype(A, /mob/living/carbon/monkey))
+4
View File
@@ -99,3 +99,7 @@
#define NUKE_OFF_UNLOCKED 1
#define NUKE_ON_TIMING 2
#define NUKE_ON_EXPLODING 3
//these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified.
#define PLANT_GENE_REMOVABLE (1<<0)
#define PLANT_GENE_EXTRACTABLE (1<<1)
+17
View File
@@ -0,0 +1,17 @@
#define MECHA_INT_FIRE (1<<0)
#define MECHA_INT_TEMP_CONTROL (1<<1)
#define MECHA_INT_SHORT_CIRCUIT (1<<2)
#define MECHA_INT_TANK_BREACH (1<<3)
#define MECHA_INT_CONTROL_LOST (1<<4)
#define MECHA_MELEE (1 << 0)
#define MECHA_RANGED (1 << 1)
#define MECHA_FRONT_ARMOUR 1
#define MECHA_SIDE_ARMOUR 2
#define MECHA_BACK_ARMOUR 3
#define MECHA_LOCKED 0
#define MECHA_SECURE_BOLTS 1
#define MECHA_LOOSE_BOLTS 2
#define MECHA_OPEN_HATCH 3
+2 -2
View File
@@ -82,7 +82,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define HANDS_LAYER 3
#define BODY_FRONT_LAYER 2
#define FIRE_LAYER 1 //If you're on fire
#define TOTAL_LAYERS 30 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
#define TOTAL_LAYERS 31 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
//Human Overlay Index Shortcuts for alternate_worn_layer, layers
//Because I *KNOW* somebody will think layer+1 means "above"
@@ -314,7 +314,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define MAP_MAXZ 6
// Defib stats
#define DEFIB_TIME_LIMIT 120
#define DEFIB_TIME_LIMIT 1500
#define DEFIB_TIME_LOSS 60
// Diagonal movement
+3 -3
View File
@@ -203,9 +203,6 @@
#define MAX_CHICKENS 50
#define UNHEALING_EAR_DAMAGE 100
#define INCORPOREAL_MOVE_BASIC 1
#define INCORPOREAL_MOVE_SHADOW 2 // leaves a trail of shadows
#define INCORPOREAL_MOVE_JAUNT 3 // is blocked by holy water/salt
@@ -256,6 +253,9 @@
#define MAX_QUIRKS 6 //The maximum amount of quirks one character can have at roundstart
#define MAX_REVIVE_FIRE_DAMAGE 180
#define MAX_REVIVE_BRUTE_DAMAGE 180
// AI Toggles
#define AI_CAMERA_LUMINOSITY 5
#define AI_VOX // Comment out if you don't want VOX to be enabled and have players download the voice sounds.
+2
View File
@@ -31,3 +31,5 @@
#define MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD "PAI_SPACEWALK_MODIFIER"
#define MOVESPEED_ID_SANITY "MOOD_SANITY"
#define MOVESPEED_ID_TASED_STATUS "TASED"
+9
View File
@@ -38,3 +38,12 @@
#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.
// Flags for the organ_flags var on /obj/item/organ
#define ORGAN_SYNTHETIC (1<<0) //Synthetic organs, or cybernetic organs. Reacts to EMPs and don't deteriorate or heal
#define ORGAN_FROZEN (1<<1) //Frozen organs, don't deteriorate
#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
+2 -1
View File
@@ -40,4 +40,5 @@
#define PARTICLE_CHANCE_CONSTANT (-20000000)
#define FUSION_RAD_MAX 2000
#define FUSION_RAD_COEFFICIENT (-1000)
#define FUSION_INSTABILITY_ENDOTHERMALITY 2
#define FUSION_INSTABILITY_ENDOTHERMALITY 2
#define FUSION_MAXIMUM_TEMPERATURE 1e8
+3
View File
@@ -8,6 +8,9 @@
#define UNCONSCIOUS 2
#define DEAD 3
//Maximum healthiness an individual can have
#define MAX_SATIETY 600
// bitflags for machine stat variable
#define BROKEN (1<<0)
#define NOPOWER (1<<1)
+4
View File
@@ -44,6 +44,8 @@
#define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep
#define STATUS_EFFECT_TASED /datum/status_effect/electrode //the affected has been tased, preventing fine muscle control
#define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions
#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
@@ -91,3 +93,5 @@
#define STATUS_EFFECT_RAINBOWPROTECTION /datum/status_effect/rainbow_protection //Invulnerable and pacifistic
#define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor
#define STATUS_EFFECT_DNA_MELT /datum/status_effect/dna_melt //usually does something horrible to you when you hit 100 genetic instability
+2
View File
@@ -153,6 +153,8 @@
#define TRAIT_FRIENDLY "friendly"
#define TRAIT_ASSBLASTUSA "assblastusa"
#define TRAIT_CULT_EYES "cult_eyes"
#define TRAIT_XRAY_VISION "xray_vision"
#define TRAIT_THERMAL_VISION "thermal_vision"
// common trait sources
+12
View File
@@ -0,0 +1,12 @@
//////////////////////////////////////////////////////////
//A bunch of helpers to make genetics less of a headache//
//////////////////////////////////////////////////////////
#define GET_INITIALIZED_MUTATION(A) GLOB.all_mutations[A]
#define GET_GENE_STRING(A, B) (B.mutation_index[A])
#define GET_SEQUENCE(A) (GLOB.full_sequences[A])
#define GET_MUTATION_STABILIZER(A) ((A.stabilizer_coeff < 0) ? 1 : A.stabilizer_coeff)
#define GET_MUTATION_SYNCHRONIZER(A) ((A.synchronizer_coeff < 0) ? 1 : A.synchronizer_coeff)
#define GET_MUTATION_POWER(A) ((A.power_coeff < 0) ? 1 : A.power_coeff)
#define GET_MUTATION_ENERGY(A) ((A.energy_coeff < 0) ? 1 : A.energy_coeff)
+37
View File
@@ -159,6 +159,43 @@
processing_list.Cut(1, 2)
processing_list += A.contents
/** recursive_organ_check
* inputs: O (object to start with)
* outputs:
* description: A pseudo-recursive loop based off of the recursive mob check, this check looks for any organs held
* within 'O', toggling their frozen flag. This check excludes items held within other safe organ
* storage units, so that only the lowest level of container dictates whether we do or don't decompose
*/
/proc/recursive_organ_check(atom/O)
var/list/processing_list = list(O)
var/list/processed_list = list()
var/index = 1
var/obj/item/organ/found_organ
while(index <= length(processing_list))
var/atom/A = processing_list[index]
if(istype(A, /obj/item/organ))
found_organ = A
found_organ.organ_flags ^= ORGAN_FROZEN
else if(istype(A, /mob/living/carbon))
var/mob/living/carbon/Q = A
for(var/organ in Q.internal_organs)
found_organ = organ
found_organ.organ_flags ^= ORGAN_FROZEN
for(var/atom/B in A) //objects held within other objects are added to the processing list, unless that object is something that can hold organs safely
if(!processed_list[B] && !istype(B, /obj/structure/closet/crate/freezer) && !istype(B, /obj/structure/closet/secure_closet/freezer))
processing_list+= B
index++
processed_list[A] = A
return
// Better recursive loop, technically sort of not actually recursive cause that shit is retarded, enjoy.
//No need for a recursive limit either
/proc/recursive_mob_check(atom/O,client_check=1,sight_check=1,include_radio=1)
+7
View File
@@ -200,6 +200,7 @@
"vag_clit_diam" = 0.25,
"vag_clit_len" = 0.25,
"has_womb" = FALSE,
"can_get_preg" = FALSE,
"womb_cum_rate" = CUM_RATE,
"womb_cum_mult" = CUM_RATE_MULT,
"womb_efficiency" = CUM_EFFICIENCY,
@@ -395,6 +396,12 @@ GLOBAL_LIST_EMPTY(species_list)
. = 0
break
if(isliving(user))
var/mob/living/L = user
if(L.recoveringstam)
. = 0
break
if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc))
if((Uloc != Tloc || Tloc != user) && !drifting)
. = 0
+9
View File
@@ -177,4 +177,13 @@ GLOBAL_LIST_INIT(bitfields, list(
"CAN_CARRY" = CAN_CARRY,
"CAN_RESIST" = CAN_RESIST
),
"organ_flags" = list(
"ORGAN_SYNTHETIC" = ORGAN_SYNTHETIC,
"ORGAN_FROZEN" = ORGAN_FROZEN,
"ORGAN_FAILING" = ORGAN_FAILING,
"ORGAN_EXTERNAL" = ORGAN_EXTERNAL,
"ORGAN_VITAL" = ORGAN_VITAL,
"ORGAN_NO_SPOIL" = ORGAN_NO_SPOIL
),
))
+5 -2
View File
@@ -21,8 +21,11 @@ GLOBAL_LIST(op_se_blocks)
GLOBAL_VAR(NULLED_SE)
GLOBAL_VAR(NULLED_UI)
GLOBAL_LIST_EMPTY(global_mutations) // list of hidden mutation things
GLOBAL_LIST_EMPTY(all_mutations)
GLOBAL_LIST_EMPTY(full_sequences)
GLOBAL_LIST_EMPTY(bad_mutations)
GLOBAL_LIST_EMPTY(good_mutations)
GLOBAL_LIST_EMPTY(not_good_mutations)
GLOBAL_LIST_EMPTY(not_good_mutations)
GLOBAL_LIST_EMPTY(mutation_recipes)
+1 -1
View File
@@ -86,7 +86,7 @@
var/widescreenlayout = FALSE //CIT CHANGE - adds support for different hud layouts depending on widescreen pref
if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref) //CIT CHANGE - ditto
widescreenlayout = TRUE // CIT CHANGE - ditto
widescreenlayout = FALSE // CIT CHANGE - ditto
var/obj/screen/using
var/obj/screen/inventory/inv_box
+1
View File
@@ -351,6 +351,7 @@
switch(user.m_intent)
if(MOVE_INTENT_WALK)
icon_state = "walking"
if(MOVE_INTENT_RUN)
icon_state = "running"
+1 -5
View File
@@ -1,12 +1,10 @@
/*
Telekinesis
This needs more thinking out, but I might as well.
*/
/*
Telekinetic attack:
By default, emulate the user's unarmed attack
*/
@@ -45,7 +43,6 @@
/*
This is similar to item attack_self, but applies to anything
that you can grab with a telekinetic grab.
It is used for manipulating things at range, for example, opening and closing closets.
There are not a lot of defaults at this time, add more where appropriate.
*/
@@ -59,7 +56,6 @@
/*
TK Grab Item (the workhorse of old TK)
* If you have not grabbed something, do a normal tk attack
* If you have something, throw it at the target. If it is already adjacent, do a normal attackby()
* If you click what you are holding, or attack_self(), do an attack_self_tk() on it.
@@ -196,4 +192,4 @@
return (OXYLOSS)
#undef TK_MAXRANGE
#undef TK_MAXRANGE
+13 -10
View File
@@ -16,7 +16,7 @@ SUBSYSTEM_DEF(atoms)
/datum/controller/subsystem/atoms/Initialize(timeofday)
GLOB.fire_overlay.appearance_flags = RESET_COLOR
setupGenetics() //to set the mutations' place in structural enzymes, so monkey.initialize() knows where to put the monkey mutation.
setupGenetics() //to set the mutations' sequence
initialized = INITIALIZATION_INNEW_MAPLOAD
InitializeAtoms()
return ..()
@@ -108,16 +108,19 @@ SUBSYSTEM_DEF(atoms)
BadInitializeCalls = SSatoms.BadInitializeCalls
/datum/controller/subsystem/atoms/proc/setupGenetics()
var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS)
for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++)
avnums[i] = i
CHECK_TICK
for(var/A in subtypesof(/datum/mutation/human))
var/datum/mutation/human/B = new A()
if(B.dna_block == NON_SCANNABLE)
var/list/mutations = subtypesof(/datum/mutation/human)
shuffle_inplace(mutations)
for(var/A in subtypesof(/datum/generecipe))
var/datum/generecipe/GR = A
GLOB.mutation_recipes[initial(GR.required)] = initial(GR.result)
for(var/i in 1 to LAZYLEN(mutations))
var/path = mutations[i] //byond gets pissy when we do it in one line
var/datum/mutation/human/B = new path ()
B.alias = "Mutation #[i]"
GLOB.all_mutations[B.type] = B
GLOB.full_sequences[B.type] = generate_gene_sequence(B.blocks)
if(B.locked)
continue
B.dna_block = pick_n_take(avnums)
if(B.quality == POSITIVE)
GLOB.good_mutations |= B
else if(B.quality == NEGATIVE)
+2 -2
View File
@@ -294,7 +294,7 @@ Versioning
var/lakey = L.lastattackerckey
var/sqlbrute = L.getBruteLoss()
var/sqlfire = L.getFireLoss()
var/sqlbrain = L.getBrainLoss()
var/sqlbrain = L.getOrganLoss(ORGAN_SLOT_BRAIN)
var/sqloxy = L.getOxyLoss()
var/sqltox = L.getToxLoss()
var/sqlclone = L.getCloneLoss()
@@ -308,7 +308,7 @@ Versioning
if(!SSdbcore.Connect())
return
sqlname = sanitizeSQL(sqlname)
sqlkey = sanitizeSQL(sqlkey)
sqljob = sanitizeSQL(sqljob)
+7
View File
@@ -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()
@@ -449,6 +450,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 +487,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().
+8
View File
@@ -245,6 +245,14 @@
/datum/action/item_action/toggle_helmet_light
name = "Toggle Helmet Light"
/datum/action/item_action/toggle_welding_screen/plasmaman
name = "Toggle Welding Screen"
/datum/action/item_action/toggle_welding_screen/plasmaman/Trigger()
var/obj/item/clothing/head/helmet/space/plasmaman/H = target
if(istype(H))
H.toggle_welding_screen(owner)
/datum/action/item_action/toggle_headphones
name = "Toggle Headphones"
desc = "UNTZ UNTZ UNTZ"
+2 -2
View File
@@ -26,5 +26,5 @@
if(!HAS_TRAIT(wearer, TRAIT_DEAF))
var/obj/item/organ/ears/ears = wearer.getorganslot(ORGAN_SLOT_EARS)
if (ears)
ears.deaf = max(ears.deaf - 1, (ears.ear_damage < UNHEALING_EAR_DAMAGE ? 0 : 1)) // Do not clear deafness while above the unhealing ear damage threshold
ears.ear_damage = max(ears.ear_damage - 0.1, 0)
ears.deaf = max(ears.deaf - 1, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged
ears.damage = max(ears.damage - 0.1, 0)
+3 -3
View File
@@ -3,7 +3,7 @@
var/volume
var/e_range
/datum/component/footstep/Initialize(volume_ = 0.5, e_range_ = -1)
/datum/component/footstep/Initialize(volume_ = 0.4, e_range_ = -1)
if(!isliving(parent))
return COMPONENT_INCOMPATIBLE
volume = volume_
@@ -32,7 +32,7 @@
return
if(ishuman(C) && C.m_intent == MOVE_INTENT_WALK)
v /= 2
e -= 5
e -= 4
steps++
if(steps >= 3)
@@ -58,7 +58,7 @@
if(isclawfoot(LM))
if(isalienadult(LM)) //xenos are stealthy and get quieter footsteps
v /= 3
e -= 5
e -= 4
playsound(T, pick(GLOB.clawfootstep[T.clawfootstep][1]),
GLOB.clawfootstep[T.clawfootstep][2] * v,
-1
View File
@@ -277,7 +277,6 @@
L.fields["sex"] = H.gender
L.fields["blood_type"] = H.dna.blood_type
L.fields["b_dna"] = H.dna.unique_enzymes
L.fields["enzymes"] = H.dna.struc_enzymes
L.fields["identity"] = H.dna.uni_identity
L.fields["species"] = H.dna.species.type
L.fields["features"] = H.dna.features
+41 -4
View File
@@ -94,10 +94,23 @@
TOXIN:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=toxin' id='toxin'>[M.getToxLoss()]</a>
OXY:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=oxygen' id='oxygen'>[M.getOxyLoss()]</a>
CLONE:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=clone' id='clone'>[M.getCloneLoss()]</a>
BRAIN:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=brain' id='brain'>[M.getBrainLoss()]</a>
BRAIN:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=brain' id='brain'>[M.getOrganLoss(ORGAN_SLOT_BRAIN)]</a>
STAMINA:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=stamina' id='stamina'>[M.getStaminaLoss()]</a>
AROUSAL:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=arousal' id='arousal'>[M.getArousalLoss()]</a>
</font>
"}
if(GLOB.Debug2)
atomsnowflake += {"
HEART:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=heart' id='heart'>[M.getOrganLoss(ORGAN_SLOT_HEART)]</a>
LIVER:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=liver' id='liver'>[M.getOrganLoss(ORGAN_SLOT_LIVER)]</a>
LUNGS:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=lungs' id='lungs'>[M.getOrganLoss(ORGAN_SLOT_LUNGS)]</a>
EYES:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=eye_sight' id='eye_sight'>[M.getOrganLoss(ORGAN_SLOT_EYES)]</a>
EARS:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=ears' id='ears'>[M.getOrganLoss(ORGAN_SLOT_EARS)]</a>
STOMACH:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=stomach' id='stomach'>[M.getOrganLoss(ORGAN_SLOT_STOMACH)]</a>
TONGUE:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=tongue' id='tongue'>[M.getOrganLoss(ORGAN_SLOT_TONGUE)]</a>
APPENDIX:<font size='1'><a href='?_src_=vars;[HrefToken()];mobToDamage=[refid];adjustDamage=appendix' id='appendix'>[M.getOrganLoss(ORGAN_SLOT_APPENDIX)]</a>
"}
atomsnowflake += {"
</font>
"}
else
atomsnowflake += "<a href='?_src_=vars;[HrefToken()];datumedit=[refid];varnameedit=name'><b id='name'>[D]</b></a>"
@@ -1334,8 +1347,8 @@
L.adjustOxyLoss(amount)
newamt = L.getOxyLoss()
if("brain")
L.adjustBrainLoss(amount)
newamt = L.getBrainLoss()
L.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount)
newamt = L.getOrganLoss(ORGAN_SLOT_BRAIN)
if("clone")
L.adjustCloneLoss(amount)
newamt = L.getCloneLoss()
@@ -1345,6 +1358,30 @@
if("arousal")
L.adjustArousalLoss(amount)
newamt = L.getArousalLoss()
if("heart")
L.adjustOrganLoss(ORGAN_SLOT_HEART, amount)
newamt = L.getOrganLoss(ORGAN_SLOT_HEART)
if("liver")
L.adjustOrganLoss(ORGAN_SLOT_LIVER, amount)
newamt = L.getOrganLoss(ORGAN_SLOT_LIVER)
if("lungs")
L.adjustOrganLoss(ORGAN_SLOT_LUNGS, amount)
newamt = L.getOrganLoss(ORGAN_SLOT_LUNGS)
if("eye_sight")
L.adjustOrganLoss(ORGAN_SLOT_EYES, amount)
newamt = L.getOrganLoss(ORGAN_SLOT_EYES)
if("ears")
L.adjustOrganLoss(ORGAN_SLOT_EARS, amount)
newamt = L.getOrganLoss(ORGAN_SLOT_EARS)
if("stomach")
L.adjustOrganLoss(ORGAN_SLOT_STOMACH, amount)
newamt = L.getOrganLoss(ORGAN_SLOT_STOMACH)
if("tongue")
L.adjustOrganLoss(ORGAN_SLOT_TONGUE, amount)
newamt = L.getOrganLoss(ORGAN_SLOT_TONGUE)
if("appendix")
L.adjustOrganLoss(ORGAN_SLOT_APPENDIX, amount)
newamt = L.getOrganLoss(ORGAN_SLOT_APPENDIX)
else
to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]")
return
@@ -144,5 +144,5 @@ Bonus
/datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A)
var/get_damage = rand(25,35) * power
M.adjustOxyLoss(get_damage)
M.adjustBrainLoss(get_damage/2)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, get_damage/2)
return 1
@@ -55,7 +55,7 @@ Bonus
to_chat(M, "<span class='userdanger'>You can't think straight!</span>")
M.confused = min(100 * power, M.confused + 8)
if(brain_damage)
M.adjustBrainLoss(3 * power, 80)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * power, 80)
M.updatehealth()
return
@@ -50,9 +50,9 @@ Bonus
if(5)
if(power > 2)
var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS)
if(istype(ears) && ears.ear_damage < UNHEALING_EAR_DAMAGE)
if(istype(ears) && ears.damage < ears.maxHealth)
to_chat(M, "<span class='userdanger'>Your ears pop painfully and start bleeding!</span>")
ears.ear_damage = max(ears.ear_damage, UNHEALING_EAR_DAMAGE)
ears.damage = max(ears.damage, ears.maxHealth)
M.emote("scream")
else
to_chat(M, "<span class='userdanger'>Your ears pop and begin ringing loudly!</span>")
@@ -58,12 +58,12 @@ Bonus
symptom_delay_max = 60
if(A.properties["resistance"] >= 8) //mutate twice
power = 2
possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.mutations_list[RACEMUT]
possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT]
var/mob/living/carbon/M = A.affected_mob
if(M)
if(!M.has_dna())
return
archived_dna = M.dna.struc_enzymes
archived_dna = M.dna.mutation_index
// Give them back their old DNA when cured.
/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
@@ -74,5 +74,5 @@ Bonus
if(M && archived_dna)
if(!M.has_dna())
return
M.dna.struc_enzymes = archived_dna
M.dna.mutation_index = archived_dna
M.domutcheck()
@@ -51,7 +51,7 @@
M.hallucination = max(0, M.hallucination - 10)
if(A.stage >= 5)
M.adjustBrainLoss(-3)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3)
if(trauma_heal_mild && iscarbon(M))
var/mob/living/carbon/C = M
if(prob(10))
@@ -100,8 +100,8 @@
else if(M.eye_blind || M.eye_blurry)
M.set_blindness(0)
M.set_blurriness(0)
else if(eyes.eye_damage > 0)
M.adjust_eye_damage(-1)
else if(eyes.damage > 0)
eyes.applyOrganDamage(-1)
else
if(prob(base_message_chance))
to_chat(M, "<span class='notice'>[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your healing feels more acute.")]</span>")
@@ -45,7 +45,7 @@ Bonus
return
var/mob/living/carbon/M = A.affected_mob
var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if(istype(eyes))
if(eyes)
switch(A.stage)
if(1, 2)
if(prob(base_message_chance) && !suppress_warning)
@@ -53,20 +53,20 @@ Bonus
if(3, 4)
to_chat(M, "<span class='warning'><b>Your eyes burn!</b></span>")
M.blur_eyes(10)
M.adjust_eye_damage(1)
eyes.applyOrganDamage(1)
else
M.blur_eyes(20)
M.adjust_eye_damage(5)
if(eyes.eye_damage >= 10)
eyes.applyOrganDamage(5)
if(eyes.damage >= 10)
M.become_nearsighted(EYE_DAMAGE)
if(prob(eyes.eye_damage - 10 + 1))
if(prob(eyes.damage - 10 + 1))
if(!remove_eyes)
if(!HAS_TRAIT(M, TRAIT_BLIND))
to_chat(M, "<span class='userdanger'>You go blind!</span>")
M.become_blind(EYE_DAMAGE)
eyes.applyOrganDamage(eyes.maxHealth)
else
M.visible_message("<span class='warning'>[M]'s eyes fall off their sockets!</span>", "<span class='userdanger'>Your eyes fall off their sockets!</span>")
eyes.Remove(M)
eyes.forceMove(get_turf(M))
else
to_chat(M, "<span class='userdanger'>Your eyes burn horrifically!</span>")
to_chat(M, "<span class='userdanger'>Your eyes burn horrifically!</span>")
+2
View File
@@ -27,8 +27,10 @@
A.update_icon()
if(prob(3))
to_chat(affected_mob, "<span class='warning'>You feel a stabbing pain in your abdomen!</span>")
affected_mob.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 5)
affected_mob.Stun(rand(40,60))
affected_mob.adjustToxLoss(1)
if(3)
if(prob(1))
affected_mob.vomit(95)
affected_mob.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15)
+3 -3
View File
@@ -24,7 +24,7 @@
if(prob(2))
to_chat(affected_mob, "<span class='danger'>You don't feel like yourself.</span>")
if(prob(5))
affected_mob.adjustBrainLoss(1, 170)
affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 170)
affected_mob.updatehealth()
if(3)
if(prob(2))
@@ -32,7 +32,7 @@
if(prob(2))
affected_mob.emote("drool")
if(prob(10))
affected_mob.adjustBrainLoss(2, 170)
affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170)
affected_mob.updatehealth()
if(prob(2))
to_chat(affected_mob, "<span class='danger'>Your try to remember something important...but can't.</span>")
@@ -43,7 +43,7 @@
if(prob(2))
affected_mob.emote("drool")
if(prob(15))
affected_mob.adjustBrainLoss(3, 170)
affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 170)
affected_mob.updatehealth()
if(prob(2))
to_chat(affected_mob, "<span class='danger'>Strange buzzing fills your head, removing all thoughts.</span>")
+238 -55
View File
@@ -2,7 +2,6 @@
/////////////////////////// DNA DATUM
/datum/dna
var/unique_enzymes
var/struc_enzymes
var/uni_identity
var/blood_type
var/datum/species/species = new /datum/species/human //The type of mutant race the player is if applicable (i.e. potato-man)
@@ -11,10 +10,13 @@
var/nameless = FALSE
var/custom_species //siiiiigh I guess this is important
var/list/mutations = list() //All mutations are from now on here
var/list/temporary_mutations = list() //Timers for temporary mutations
var/list/temporary_mutations = list() //Temporary changes to the UE
var/list/previous = list() //For temporary name/ui/ue/blood_type modifications
var/mob/living/holder
var/delete_species = TRUE //Set to FALSE when a body is scanned by a cloner to fix #38875
var/mutation_index[DNA_MUTATION_BLOCKS] //List of which mutations this carbon has and its assigned block
var/stability = 100
var/scrambled = FALSE //Did we take something like mutagen? In that case we cant get our genes scanned to instantly cheese all the powers.
/datum/dna/New(mob/living/new_holder)
if(istype(new_holder))
@@ -53,11 +55,11 @@
H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA
destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text
if(transfer_SE)
destination.dna.struc_enzymes = struc_enzymes
destination.dna.mutation_index = mutation_index
/datum/dna/proc/copy_dna(datum/dna/new_dna)
new_dna.unique_enzymes = unique_enzymes
new_dna.struc_enzymes = struc_enzymes
new_dna.mutation_index = mutation_index
new_dna.uni_identity = uni_identity
new_dna.blood_type = blood_type
new_dna.features = features.Copy()
@@ -67,26 +69,32 @@
new_dna.custom_species = custom_species
new_dna.mutations = mutations.Copy()
/datum/dna/proc/add_mutation(mutation_name)
var/datum/mutation/human/HM = GLOB.mutations_list[mutation_name]
HM.on_acquiring(holder)
//See mutation.dm for what 'class' does. 'time' is time till it removes itself in decimals. 0 for no timer
/datum/dna/proc/add_mutation(mutation, class = MUT_OTHER, time)
var/mutation_type = mutation
if(istype(mutation, /datum/mutation/human))
var/datum/mutation/human/HM = mutation
mutation_type = HM.type
if(get_mutation(mutation_type))
return
return force_give(new mutation_type (class, time, copymut = mutation))
/datum/dna/proc/remove_mutation(mutation_name)
var/datum/mutation/human/HM = GLOB.mutations_list[mutation_name]
HM.on_losing(holder)
/datum/dna/proc/remove_mutation(mutation_type)
return force_lose(get_mutation(mutation_type))
/datum/dna/proc/check_mutation(mutation_name)
var/datum/mutation/human/HM = GLOB.mutations_list[mutation_name]
return mutations.Find(HM)
/datum/dna/proc/check_mutation(mutation_type)
return get_mutation(mutation_type)
/datum/dna/proc/remove_all_mutations()
remove_mutation_group(mutations)
/datum/dna/proc/remove_all_mutations(list/classes = list(MUT_NORMAL, MUT_EXTRA, MUT_OTHER), mutadone = FALSE)
remove_mutation_group(mutations, classes, mutadone)
scrambled = FALSE
/datum/dna/proc/remove_mutation_group(list/group)
/datum/dna/proc/remove_mutation_group(list/group, list/classes = list(MUT_NORMAL, MUT_EXTRA, MUT_OTHER), mutadone = FALSE)
if(!group)
return
for(var/datum/mutation/human/HM in group)
HM.force_lose(holder)
if((HM.class in classes) && !(HM.mutadone_proof && mutadone))
force_lose(HM)
/datum/dna/proc/generate_uni_identity()
. = ""
@@ -128,19 +136,49 @@
. += random_string(DNA_BLOCK_SIZE,GLOB.hex_characters)
return .
/datum/dna/proc/generate_struc_enzymes()
var/list/sorting = new /list(DNA_STRUC_ENZYMES_BLOCKS)
var/result = ""
for(var/datum/mutation/human/A in GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations)
if(A.name == RACEMUT && ismonkey(holder))
sorting[A.dna_block] = num2hex(A.lowest_value + rand(0, 256 * 6), DNA_BLOCK_SIZE)
mutations |= A
else
sorting[A.dna_block] = random_string(DNA_BLOCK_SIZE, list("0","1","2","3","4","5","6"))
/datum/dna/proc/generate_dna_blocks()
var/bonus
if(species && species.inert_mutation)
bonus = GET_INITIALIZED_MUTATION(species.inert_mutation)
var/list/mutations_temp = GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations + bonus
if(!LAZYLEN(mutations_temp))
return
mutation_index.Cut()
shuffle_inplace(mutations_temp)
if(ismonkey(holder))
mutations |= new RACEMUT(MUT_NORMAL)
mutation_index[RACEMUT] = GET_SEQUENCE(RACEMUT)
else
mutation_index[RACEMUT] = create_sequence(RACEMUT, FALSE)
for(var/i in 2 to DNA_MUTATION_BLOCKS)
var/datum/mutation/human/M = mutations_temp[i]
mutation_index[M.type] = create_sequence(M.type, FALSE,M.difficulty)
shuffle_inplace(mutation_index)
for(var/B in sorting)
result += B
return result
//Used to generate original gene sequences for every mutation
/proc/generate_gene_sequence(length=4)
var/static/list/active_sequences = list("AT","TA","GC","CG")
var/sequence
for(var/i in 1 to length*DNA_SEQUENCE_LENGTH)
sequence += pick(active_sequences)
return sequence
//Used to create a chipped gene sequence
/proc/create_sequence(mutation, active, difficulty)
if(!difficulty)
var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(mutation) //leaves the possibility to change difficulty mid-round
if(!A)
return
difficulty = A.difficulty
difficulty += rand(-2,4)
var/sequence = GET_SEQUENCE(mutation)
if(active)
return sequence
while(difficulty)
var/randnum = rand(1, length(sequence))
sequence = copytext(sequence, 1, randnum) + "X" + copytext(sequence, randnum+1, length(sequence)+1)
difficulty--
return sequence
/datum/dna/proc/generate_unique_enzymes()
. = ""
@@ -185,12 +223,57 @@
if(DNA_TAUR_BLOCK)
construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len)
//Please use add_mutation or activate_mutation instead
/datum/dna/proc/force_give(datum/mutation/human/HM)
if(holder && HM)
if(HM.class == MUT_NORMAL)
set_se(1, HM)
. = HM.on_acquiring(holder)
if(.)
qdel(HM)
update_instability()
//Use remove_mutation instead
/datum/dna/proc/force_lose(datum/mutation/human/HM)
if(holder && (HM in mutations))
set_se(0, HM)
. = HM.on_losing(holder)
update_instability(FALSE)
return
/datum/dna/proc/is_same_as(datum/dna/D)
if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species)
if(uni_identity == D.uni_identity && mutation_index == D.mutation_index && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species)
if(species.type == D.species.type && features == D.features && blood_type == D.blood_type)
return 1
return 0
/datum/dna/proc/update_instability(alert=TRUE)
stability = 100
for(var/datum/mutation/human/M in mutations)
if(M.class == MUT_EXTRA)
stability -= M.instability * GET_MUTATION_STABILIZER(M)
if(holder)
var/message
if(alert)
switch(stability)
if(70 to 90)
message = "<span class='warning'>You shiver.</span>"
if(60 to 69)
message = "<span class='warning'>You feel cold.</span>"
if(40 to 59)
message = "<span class='warning'>You feel sick.</span>"
if(20 to 39)
message = "<span class='warning'>It feels like your skin is moving.</span>"
if(1 to 19)
message = "<span class='warning'>You can feel your cells burning.</span>"
if(-INFINITY to 0)
message = "<span class='boldwarning'>You can feel your DNA exploding, we need to do something fast!</span>"
if(stability <= 0)
holder.apply_status_effect(STATUS_EFFECT_DNA_MELT)
if(message)
to_chat(holder, message)
//used to update dna UI, UE, and dna.real_name.
/datum/dna/proc/update_dna_identity()
uni_identity = generate_uni_identity()
@@ -201,7 +284,7 @@
blood_type = newblood_type
unique_enzymes = generate_unique_enzymes()
uni_identity = generate_uni_identity()
struc_enzymes = generate_struc_enzymes()
generate_dna_blocks()
features = random_features()
@@ -265,7 +348,7 @@
return dna
/mob/living/carbon/human/proc/hardset_dna(ui, se, newreal_name, newblood_type, datum/species/mrace, newfeatures)
/mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures)
if(newfeatures)
dna.features = newfeatures
@@ -287,8 +370,8 @@
dna.uni_identity = ui
updateappearance(icon_update=0)
if(se)
dna.struc_enzymes = se
if(LAZYLEN(mutation_index))
dna.mutation_index = mutation_index
domutcheck()
if(mrace || newfeatures || ui)
@@ -331,19 +414,63 @@
/mob/proc/domutcheck()
return
/mob/living/carbon/domutcheck(force_powers=0) //Set force_powers to 1 to bypass the power chance
/mob/living/carbon/domutcheck()
if(!has_dna())
return
for(var/datum/mutation/human/A in GLOB.good_mutations | GLOB.bad_mutations | GLOB.not_good_mutations)
if(ismob(A.check_block(src, force_powers)))
for(var/mutation in dna.mutation_index)
if(ismob(dna.check_block(mutation)))
return //we got monkeyized/humanized, this mob will be deleted, no need to continue.
update_mutations_overlay()
/datum/dna/proc/check_block(mutation)
var/datum/mutation/human/HM = get_mutation(mutation)
if(check_block_string(mutation))
if(!HM)
. = add_mutation(mutation, MUT_NORMAL)
return
return force_lose(HM)
//Return the active mutation of a type if there is one
/datum/dna/proc/get_mutation(A)
for(var/datum/mutation/human/HM in mutations)
if(HM.type == A)
return HM
/datum/dna/proc/check_block_string(mutation)
if((LAZYLEN(mutation_index) > DNA_MUTATION_BLOCKS) || !(mutation in mutation_index))
return 0
return is_gene_active(mutation)
/datum/dna/proc/is_gene_active(mutation)
return (mutation_index[mutation] == GET_SEQUENCE(mutation))
/datum/dna/proc/set_se(on=TRUE, datum/mutation/human/HM)
if(!HM || !(HM.type in mutation_index) || (LAZYLEN(mutation_index) < DNA_MUTATION_BLOCKS))
return
. = TRUE
if(on)
mutation_index[HM.type] = GET_SEQUENCE(HM.type)
else if(GET_SEQUENCE(HM.type) == mutation_index[HM.type])
mutation_index[HM.type] = create_sequence(HM.type, FALSE, HM.difficulty)
/datum/dna/proc/activate_mutation(mutation) //note that this returns a boolean and not a new mob
if(!mutation)
return FALSE
var/mutation_type = mutation
if(istype(mutation, /datum/mutation/human))
var/datum/mutation/human/M = mutation
mutation_type = M.type
if(!mutation_in_sequence(mutation_type)) //cant activate what we dont have, use add_mutation
return FALSE
add_mutation(mutation, MUT_NORMAL)
return TRUE
/////////////////////////// DNA HELPER-PROCS //////////////////////////////
/proc/getleftblocks(input,blocknumber,blocksize)
if(blocknumber > 1)
return copytext(input,1,((blocksize*blocknumber)-(blocksize-1)))
@@ -360,29 +487,47 @@
return 0
return getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize)
/datum/dna/proc/mutation_in_sequence(mutation)
if(!mutation)
return
if(istype(mutation, /datum/mutation/human))
var/datum/mutation/human/HM = mutation
if(HM.type in mutation_index)
return TRUE
else if(mutation in mutation_index)
return TRUE
/mob/living/carbon/proc/randmut(list/candidates, difficulty = 2)
if(!has_dna())
return
var/datum/mutation/human/num = pick(candidates)
. = num.force_give(src)
var/mutation = pick(candidates)
. = dna.add_mutation(mutation)
/mob/living/carbon/proc/randmutb()
/mob/living/carbon/proc/easy_randmut(quality = POSITIVE + NEGATIVE + MINOR_NEGATIVE, scrambled = TRUE, sequence = TRUE, exclude_monkey = TRUE)
if(!has_dna())
return
var/datum/mutation/human/HM = pick((GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.mutations_list[RACEMUT])
. = HM.force_give(src)
var/list/mutations = list()
if(quality & POSITIVE)
mutations += GLOB.good_mutations
if(quality & NEGATIVE)
mutations += GLOB.bad_mutations
if(quality & MINOR_NEGATIVE)
mutations += GLOB.not_good_mutations
var/list/possible = list()
for(var/datum/mutation/human/A in mutations)
if((!sequence || dna.mutation_in_sequence(A.type)) && !dna.get_mutation(A.type))
possible += A.type
if(exclude_monkey)
possible.Remove(RACEMUT)
if(LAZYLEN(possible))
var/mutation = pick(possible)
. = dna.activate_mutation(mutation)
if(scrambled)
var/datum/mutation/human/HM = dna.get_mutation(mutation)
if(HM)
HM.scrambled = TRUE
return TRUE
/mob/living/carbon/proc/randmutg()
if(!has_dna())
return
var/datum/mutation/human/HM = pick(GLOB.good_mutations)
. = HM.force_give(src)
/mob/living/carbon/proc/randmutvg()
if(!has_dna())
return
var/datum/mutation/human/HM = pick((GLOB.good_mutations) - GLOB.mutations_list[HULK] - GLOB.mutations_list[DWARFISM])
. = HM.force_give(src)
/mob/living/carbon/proc/randmuti()
if(!has_dna())
@@ -405,9 +550,9 @@
if(!M.has_dna())
return 0
if(se)
for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++)
for(var/i=1, i<=DNA_MUTATION_BLOCKS, i++)
if(prob(probability))
M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, random_string(DNA_BLOCK_SIZE, GLOB.hex_characters))
M.dna.generate_dna_blocks()
M.domutcheck()
if(ui)
for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++)
@@ -434,3 +579,41 @@
return value
/////////////////////////// DNA HELPER-PROCS
/mob/living/carbon/human/proc/something_horrible()
if(!has_dna()) //shouldn't ever happen anyway so it's just in really weird cases
return
if(dna.stability > 0)
return
var/instability = -dna.stability
dna.remove_all_mutations()
dna.stability = 100
if(prob(max(70-instability,0)))
switch(rand(0,3)) //not complete and utter death
if(0)
monkeyize()
if(1)
gain_trauma(/datum/brain_trauma/severe/paralysis)
if(2)
corgize()
if(3)
to_chat(src, "<span class='notice'>Oh, we actually feel quite alright!</span>")
else
switch(rand(0,3))
if(0)
gib()
if(1)
dust()
if(2)
death()
petrify(INFINITY)
if(3)
if(prob(90))
var/obj/item/bodypart/BP = get_bodypart(pick(BODY_ZONE_CHEST,BODY_ZONE_HEAD))
if(BP)
BP.dismember()
else
gib()
else
set_species(/datum/species/dullahan)
+1 -1
View File
@@ -79,7 +79,7 @@
"<span class='userdanger'>[A] kicks your head, knocking you out!</span>")
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
D.SetSleeping(300)
D.adjustBrainLoss(15, 150)
D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150)
return TRUE
/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
+1 -1
View File
@@ -46,7 +46,7 @@
D.apply_damage(rand(5,10), BRUTE, BODY_ZONE_HEAD)
A.apply_damage(rand(5,10), BRUTE, BODY_ZONE_HEAD)
if(!istype(D.head,/obj/item/clothing/head/helmet/) && !istype(D.head,/obj/item/clothing/head/hardhat))
D.adjustBrainLoss(5)
D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5)
A.Stun(rand(10,45))
D.Knockdown(rand(5,30))//CIT CHANGE - makes stuns from martial arts always use Knockdown instead of Stun for the sake of consistency
if(5,6)
+1 -1
View File
@@ -224,7 +224,7 @@
H.visible_message("<span class='warning'>[user] delivers a heavy hit to [H]'s head, knocking [H.p_them()] out cold!</span>", \
"<span class='userdanger'>[user] knocks you unconscious!</span>")
H.SetSleeping(600)
H.adjustBrainLoss(15, 150)
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150)
else
return ..()
+96 -40
View File
@@ -1,58 +1,55 @@
GLOBAL_LIST_EMPTY(mutations_list)
/datum/mutation
var/name
/datum/mutation/New()
GLOB.mutations_list[name] = src
/datum/mutation/human
var/dna_block
name = "mutation"
var/desc = "A mutation."
var/locked
var/quality
var/get_chance = 100
var/lowest_value = 256 * 8
var/text_gain_indication = ""
var/text_lose_indication = ""
var/list/mutable_appearance/visual_indicators = list()
var/obj/effect/proc_holder/spell/power
var/layer_used = MUTATIONS_LAYER //which mutation layer to use
var/list/species_allowed = list() //to restrict mutation to only certain species
var/health_req //minimum health required to acquire the mutation
var/limb_req //required limbs to acquire this mutation
var/time_coeff = 1 //coefficient for timed mutations
var/datum/dna/dna
var/mob/living/carbon/human/owner
var/instability = 0 //instability the holder gets when the mutation is not native
var/blocks = 4 //Amount of those big blocks with gene sequences
var/difficulty = 8 //Amount of missing sequences. Sometimes it removes an entire pair for 2 points
var/timed = FALSE //Boolean to easily check if we're going to self destruct
var/alias //'Mutation #49', decided every round to get some form of distinction between undiscovered mutations
var/scrambled = FALSE //Wheter we can read it if it's active. To avoid cheesing with mutagen
var/class //Decides player accesibility, sorta
//MUT_NORMAL - A mutation that can be activated and deactived by completing a sequence
//MUT_EXTRA - A mutation that is in the mutations tab, and can be given and taken away through though the DNA console. Has a 0 before it's name in the mutation section of the dna console
//MUT_OTHER Cannot be interacted with by players through normal means. I.E. wizards mutate
/datum/mutation/human/proc/force_give(mob/living/carbon/human/owner)
set_block(owner)
. = on_acquiring(owner)
var/can_chromosome = CHROMOSOME_NONE //can we take chromosomes? 0: CHROMOSOME_NEVER never, 1:CHROMOSOME_NONE yeah, 2: CHROMOSOME_USED no, already have one
var/chromosome_name //purely cosmetic
var/modified = FALSE //ugly but we really don't want chromosomes and on_acquiring to overlap and apply double the powers
var/mutadone_proof = FALSE
/datum/mutation/human/proc/force_lose(mob/living/carbon/human/owner)
set_block(owner, 0)
. = on_losing(owner)
//Chromosome stuff - set to -1 to prevent people from changing it. Example: It'd be a waste to decrease cooldown on mutism
var/stabilizer_coeff = 1 //genetic stability coeff
var/synchronizer_coeff = -1 //makes the mutation hurt the user less
var/power_coeff = -1 //boosts mutation strength
var/energy_coeff = -1 //lowers mutation cooldown
/datum/mutation/human/proc/set_se(se_string, on = 1)
if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE)
return
var/before = copytext(se_string, 1, ((dna_block - 1) * DNA_BLOCK_SIZE) + 1)
var/injection = num2hex(on ? rand(lowest_value, (256 * 16) - 1) : rand(0, lowest_value - 1), DNA_BLOCK_SIZE)
var/after = copytext(se_string, (dna_block * DNA_BLOCK_SIZE) + 1, 0)
return before + injection + after
/datum/mutation/human/proc/set_block(mob/living/carbon/owner, on = 1)
if(owner && owner.has_dna())
owner.dna.struc_enzymes = set_se(owner.dna.struc_enzymes, on)
/datum/mutation/human/proc/check_block_string(se_string)
if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE)
return 0
if(hex2num(getblock(se_string, dna_block)) >= lowest_value)
return 1
/datum/mutation/human/proc/check_block(mob/living/carbon/human/owner, force_powers=0)
if(check_block_string(owner.dna.struc_enzymes))
if(prob(get_chance)||force_powers)
. = on_acquiring(owner)
else
. = on_losing(owner)
/datum/mutation/human/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
. = ..()
class = class_
if(timer)
addtimer(CALLBACK(src, .proc/remove), timer)
timed = TRUE
if(copymut && istype(copymut, /datum/mutation/human))
copy_mutation(copymut)
/datum/mutation/human/proc/on_acquiring(mob/living/carbon/human/owner)
if(!owner || !istype(owner) || owner.stat == DEAD || (src in owner.dna.mutations))
@@ -63,7 +60,8 @@ GLOBAL_LIST_EMPTY(mutations_list)
return TRUE
if(limb_req && !owner.get_bodypart(limb_req))
return TRUE
owner.dna.mutations.Add(src)
dna = owner.dna
dna.mutations += src
if(text_gain_indication)
to_chat(owner, text_gain_indication)
if(visual_indicators.len)
@@ -75,6 +73,10 @@ GLOBAL_LIST_EMPTY(mutations_list)
owner.overlays_standing[layer_used] = mut_overlay
owner.apply_overlay(layer_used)
grant_spell(owner)
if(!modified)
addtimer(CALLBACK(src, .proc/modify, 5)) //gonna want children calling ..() to run first
/datum/mutation/human/proc/get_visual_indicator(mob/living/carbon/human/owner)
return
@@ -102,26 +104,80 @@ GLOBAL_LIST_EMPTY(mutations_list)
mut_overlay.Remove(get_visual_indicator(owner))
owner.overlays_standing[layer_used] = mut_overlay
owner.apply_overlay(layer_used)
if(power)
owner.RemoveSpell(power)
qdel(src)
return 0
return 1
/datum/mutation/human/proc/say_mod(message)
if(message)
return message
/datum/mutation/human/proc/get_spans()
return list()
/mob/living/carbon/proc/update_mutations_overlay()
return
/mob/living/carbon/human/update_mutations_overlay()
for(var/datum/mutation/human/CM in dna.mutations)
if(CM.species_allowed.len && !CM.species_allowed.Find(dna.species.id))
CM.force_lose(src) //shouldn't have that mutation at all
dna.force_lose(CM) //shouldn't have that mutation at all
continue
if(CM.visual_indicators.len)
var/list/mut_overlay = list()
if(overlays_standing[CM.layer_used])
mut_overlay = overlays_standing[CM.layer_used]
var/mutable_appearance/V = CM.get_visual_indicator(src)
var/mutable_appearance/V = CM.get_visual_indicator()
if(!mut_overlay.Find(V)) //either we lack the visual indicator or we have the wrong one
remove_overlay(CM.layer_used)
for(var/mutable_appearance/MA in CM.visual_indicators)
for(var/mutable_appearance/MA in CM.visual_indicators[CM.type])
mut_overlay.Remove(MA)
mut_overlay |= V
overlays_standing[CM.layer_used] = mut_overlay
apply_overlay(CM.layer_used)
/datum/mutation/human/proc/modify() //called when a genome is applied so we can properly update some stats without having to remove and reapply the mutation from someone
if(modified || !power || !owner)
return
power.charge_max *= GET_MUTATION_ENERGY(src)
power.charge_counter *= GET_MUTATION_ENERGY(src)
modified = TRUE
/datum/mutation/human/proc/copy_mutation(datum/mutation/human/HM)
if(!HM)
return
chromosome_name = HM.chromosome_name
stabilizer_coeff = HM.stabilizer_coeff
synchronizer_coeff = HM.synchronizer_coeff
power_coeff = HM.power_coeff
energy_coeff = HM.energy_coeff
mutadone_proof = HM.mutadone_proof
can_chromosome = HM.can_chromosome
/datum/mutation/human/proc/remove_chromosome()
stabilizer_coeff = initial(stabilizer_coeff)
synchronizer_coeff = initial(synchronizer_coeff)
power_coeff = initial(power_coeff)
energy_coeff = initial(energy_coeff)
mutadone_proof = initial(mutadone_proof)
can_chromosome = initial(can_chromosome)
chromosome_name = null
/datum/mutation/human/proc/remove()
if(dna)
dna.force_lose(src)
else
qdel(src)
/datum/mutation/human/proc/grant_spell(mob/living/carbon/human/owner)
if(!ispath(power) || !owner)
return FALSE
power = new power()
power.action_background_icon_state = "bg_tech_blue_on"
power.panel = "Genetic"
owner.AddSpell(power)
return TRUE
+169
View File
@@ -0,0 +1,169 @@
/datum/mutation/human/telepathy
name = "Telepathy"
desc = "A rare mutation that allows the user to telepathically communicate to others."
quality = POSITIVE
text_gain_indication = "<span class='notice'>You can hear your own voice echoing in your mind!</span>"
text_lose_indication = "<span class='notice'>You don't hear your mind echo anymore.</span>"
difficulty = 12
power = /obj/effect/proc_holder/spell/targeted/telepathy/genetic
instability = 10
energy_coeff = 1
/datum/mutation/human/telepathy/on_acquiring(mob/living/carbon/human/owner)
. = ..()
/datum/mutation/human/telepathy/on_losing(mob/living/carbon/human/owner)
. = ..()
/obj/effect/proc_holder/spell/targeted/telepathy/genetic
magic_check = FALSE
/datum/mutation/human/firebreath
name = "Fire Breath"
desc = "An ancient mutation that gives lizards breath of fire."
quality = POSITIVE
difficulty = 12
locked = TRUE
text_gain_indication = "<span class='notice'>Your throat is burning!</span>"
text_lose_indication = "<span class='notice'>Your throat is cooling down.</span>"
power = /obj/effect/proc_holder/spell/aimed/firebreath
instability = 30
energy_coeff = 1
power_coeff = 1
/datum/mutation/human/firebreath/modify()
if(power)
var/obj/effect/proc_holder/spell/aimed/firebreath/S = power
S.strength = GET_MUTATION_POWER(src)
/obj/effect/proc_holder/spell/aimed/firebreath
name = "Fire Breath"
desc = "You can breathe fire at a target."
school = "evocation"
charge_max = 1200
clothes_req = FALSE
range = 20
projectile_type = /obj/item/projectile/magic/aoe/fireball/firebreath
base_icon_state = "fireball"
action_icon_state = "fireball0"
sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises
active_msg = "You built up heat in your mouth."
deactive_msg = "You swallow the flame."
var/strength = 1
/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets)
. = ..()
if(iscarbon(usr))
var/mob/living/carbon/C = usr
if(C.is_mouth_covered())
C.adjust_fire_stacks(2)
C.IgniteMob()
to_chat(C,"<span class='warning'>Something in front of your mouth caught fire!</span>")
return FALSE
/obj/effect/proc_holder/spell/aimed/firebreath/ready_projectile(obj/item/projectile/P, atom/target, mob/user, iteration)
if(!istype(P, /obj/item/projectile/magic/aoe/fireball))
return
var/obj/item/projectile/magic/aoe/fireball/F = P
switch(strength)
if(1 to 3)
F.exp_light = strength-1
if(4 to INFINITY)
F.exp_heavy = strength-3
F.exp_fire += strength
/obj/item/projectile/magic/aoe/fireball/firebreath
name = "fire breath"
exp_heavy = 0
exp_light = 0
exp_flash = 0
exp_fire= 4
/datum/mutation/human/void
name = "Void Magnet"
desc = "A rare genome that attracts odd forces not usually observed."
quality = MINOR_NEGATIVE //upsides and downsides
text_gain_indication = "<span class='notice'>You feel a heavy, dull force just beyond the walls watching you.</span>"
instability = 30
power = /obj/effect/proc_holder/spell/self/void
energy_coeff = 1
synchronizer_coeff = 1
/datum/mutation/human/void/on_life(mob/living/carbon/human/owner)
if(!isturf(owner.loc))
return
if(prob((0.5+((100-dna.stability)/20))) * GET_MUTATION_SYNCHRONIZER(src)) //very rare, but enough to annoy you hopefully. +0.5 probability for every 10 points lost in stability
new /obj/effect/immortality_talisman/void(get_turf(owner), owner)
/obj/effect/proc_holder/spell/self/void
name = "Convoke Void" //magic the gathering joke here
desc = "A rare genome that attracts odd forces not usually observed. May sometimes pull you in randomly."
school = "evocation"
clothes_req = FALSE
charge_max = 600
invocation = "DOOOOOOOOOOOOOOOOOOOOM!!!"
invocation_type = "shout"
action_icon_state = "void_magnet"
var/in_use = FALSE //so it doesnt cast while you are already deep innit
/obj/effect/proc_holder/spell/self/void/can_cast(mob/user = usr)
. = ..()
if(!isturf(user.loc))
return FALSE
/obj/effect/proc_holder/spell/self/void/cast(mob/user = usr)
. = ..()
new /obj/effect/immortality_talisman/void(get_turf(user), user)
/datum/mutation/human/shock
name = "Shock Touch"
desc = "The affected can channel excess electricity through their hands without shocking themselves, allowing them to shock others."
quality = POSITIVE
locked = TRUE
difficulty = 16
text_gain_indication = "<span class='notice'>You feel power flow through your hands.</span>"
text_lose_indication = "<span class='notice'>The energy in your hands subsides.</span>"
power = /obj/effect/proc_holder/spell/targeted/touch/shock
instability = 30
/obj/effect/proc_holder/spell/targeted/touch/shock
name = "Shock Touch"
desc = "Channel electricity to your hand to shock people with."
drawmessage = "You channel electricity into your hand."
dropmessage = "You let the electricity from your hand dissipate."
hand_path = /obj/item/melee/touch_attack/shock
charge_max = 400
clothes_req = FALSE
action_icon_state = "zap"
/obj/item/melee/touch_attack/shock
name = "\improper shock touch"
desc = "This is kind of like when you rub your feet on a shag rug so you can zap your friends, only a lot less safe."
catchphrase = null
on_use_sound = 'sound/weapons/zapbang.ogg'
icon_state = "zapper"
item_state = "zapper"
/obj/item/melee/touch_attack/shock/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || !isliving(target))
return
if(iscarbon(target))
var/mob/living/carbon/C = target
if(C.electrocute_act(15, user, 1, stun = 0))//doesnt stun. never let this stun
C.dropItemToGround(C.get_active_held_item())
C.dropItemToGround(C.get_inactive_held_item())
C.confused += 10
C.visible_message("<span class='danger'>[user] electrocutes [target]!</span>","<span class='userdanger'>[user] electrocutes you!</span>")
return ..()
else
user.visible_message("<span class='warning'>[user] fails to electrocute [target]!</span>")
return ..()
else if(isliving(target))
var/mob/living/L = target
L.electrocute_act(15, user, 1, stun = 0)
L.visible_message("<span class='danger'>[user] electrocutes [target]!</span>","<span class='userdanger'>[user] electrocutes you!</span>")
return ..()
else
to_chat(user,"<span class='warning'>The electricity doesn't seem to affect [target]...</span>")
return ..()
+107
View File
@@ -0,0 +1,107 @@
/datum/mutation/human/antenna
name = "Antenna"
desc = "The affected person sprouts an antenna. This is known to allow them to access common radio channels passively."
quality = POSITIVE
text_gain_indication = "<span class='notice'>You feel an antenna sprout from your forehead.</span>"
text_lose_indication = "<span class='notice'>Your antenna shrinks back down.</span>"
instability = 5
difficulty = 8
var/obj/item/implant/radio/antenna/linked_radio
/obj/item/implant/radio/antenna
name = "internal antenna organ"
desc = "The internal organ part of the antenna. Science has not yet given it a good name."
icon = 'icons/obj/radio.dmi'//maybe make a unique sprite later. not important
icon_state = "walkietalkie"
/obj/item/implant/radio/antenna/Initialize(mapload)
..()
radio.name = "internal antenna"
/datum/mutation/human/antenna/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
linked_radio = new(owner)
linked_radio.implant(owner, null, TRUE, TRUE)
/datum/mutation/human/antenna/on_losing(mob/living/carbon/human/owner)
if(..())
return
if(linked_radio)
linked_radio.Destroy()
/datum/mutation/human/antenna/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..()
if(!(type in visual_indicators))
visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1))//-MUTATIONS_LAYER+1
/datum/mutation/human/antenna/get_visual_indicator(mob/living/carbon/human/owner)
return visual_indicators[type][1]
/datum/mutation/human/mindreader
name = "Mind Reader"
desc = "The affected person can look into the recent memories of others."
quality = POSITIVE
text_gain_indication = "<span class='notice'>You hear distant voices at the corners of your mind.</span>"
text_lose_indication = "<span class='notice'>The distant voices fade.</span>"
power = /obj/effect/proc_holder/spell/targeted/mindread
instability = 40
difficulty = 8
locked = TRUE
/obj/effect/proc_holder/spell/targeted/mindread
name = "Mindread"
desc = "Read the target's mind."
charge_max = 300
range = 7
clothes_req = FALSE
action_icon_state = "mindread"
/obj/effect/proc_holder/spell/targeted/mindread/cast(list/targets, mob/living/carbon/human/user = usr)
for(var/mob/living/M in targets)
if(usr.anti_magic_check(FALSE, FALSE, TRUE, 0) || M.anti_magic_check(FALSE, FALSE, TRUE, 0))
to_chat(usr, "<span class='warning'>As you reach out with your mind, you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.</span>")
return
if(M.stat == DEAD)
to_chat(user, "<span class='boldnotice'>[M] is dead!</span>")
return
if(M.mind)
to_chat(user, "<span class='boldnotice'>You plunge into [M]'s mind...</span>")
if(prob(20))
to_chat(M, "<span class='danger'>You feel something foreign enter your mind.</span>")//chance to alert the read-ee
var/list/recent_speech = list()
var/list/say_log = list()
var/log_source = M.logging
for(var/log_type in log_source)//this whole loop puts the read-ee's say logs into say_log in an easy to access way
var/nlog_type = text2num(log_type)
if(nlog_type & LOG_SAY)
var/list/reversed = log_source[log_type]
if(islist(reversed))
say_log = reverseRange(reversed.Copy())
break
if(LAZYLEN(say_log))
for(var/spoken_memory in say_log)
if(recent_speech.len >= 3)//up to 3 random lines of speech, favoring more recent speech
break
if(prob(50))
recent_speech[spoken_memory] = say_log[spoken_memory]
if(recent_speech.len)
to_chat(user, "<span class='boldnotice'>You catch some drifting memories of their past conversations...</span>")
for(var/spoken_memory in recent_speech)
to_chat(user, "<span class='notice'>[recent_speech[spoken_memory]]</span>")
if(iscarbon(M))
var/mob/living/carbon/human/H = M
to_chat(user, "<span class='boldnotice'>You find that their intent is to [H.a_intent]...</span>")
var/datum/dna/the_dna = H.has_dna()
if(the_dna)
to_chat(user, "<span class='boldnotice'>You uncover that [H.p_their()] true identity is [the_dna.real_name].</span>")
else
to_chat(user, "<span class='warning'>You can't find a mind to read inside of [M]!</span>")
/datum/mutation/human/mindreader/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..()
if(!(type in visual_indicators))
visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1))
/datum/mutation/human/mindreader/get_visual_indicator(mob/living/carbon/human/owner)
return visual_indicators[type][1]
+125 -10
View File
@@ -3,16 +3,19 @@
//Epilepsy gives a very small chance to have a seizure every life tick, knocking you unconscious.
/datum/mutation/human/epilepsy
name = "Epilepsy"
desc = "A genetic defect that sporadically causes seizures."
quality = NEGATIVE
text_gain_indication = "<span class='danger'>You get a headache.</span>"
synchronizer_coeff = 1
power_coeff = 1
/datum/mutation/human/epilepsy/on_life(mob/living/carbon/human/owner)
if(prob(1) && owner.stat == CONSCIOUS)
if(prob(1 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS)
owner.visible_message("<span class='danger'>[owner] starts having a seizure!</span>", "<span class='userdanger'>You have a seizure!</span>")
owner.Unconscious(200)
owner.Jitter(1000)
owner.Unconscious(200 * GET_MUTATION_POWER(src))
owner.Jitter(1000 * GET_MUTATION_POWER(src))
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "epilepsy", /datum/mood_event/epilepsy)
addtimer(CALLBACK(src, .proc/jitter_less, owner), 90)
addtimer(CALLBACK(src, .proc/jitter_less), 90)
/datum/mutation/human/epilepsy/proc/jitter_less(mob/living/carbon/human/owner)
if(owner)
@@ -22,19 +25,23 @@
//Unstable DNA induces random mutations!
/datum/mutation/human/bad_dna
name = "Unstable DNA"
desc = "Strange mutation that causes the holder to randomly mutate."
quality = NEGATIVE
text_gain_indication = "<span class='danger'>You feel strange.</span>"
locked = TRUE
/datum/mutation/human/bad_dna/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
to_chat(owner, text_gain_indication)
var/mob/new_mob
if(prob(95))
if(prob(50))
new_mob = owner.randmutb()
new_mob = owner.easy_randmut(NEGATIVE + MINOR_NEGATIVE)
else
new_mob = owner.randmuti()
else
new_mob = owner.randmutg()
new_mob = owner.easy_randmut(POSITIVE)
if(new_mob && ismob(new_mob))
owner = new_mob
. = owner
@@ -44,21 +51,31 @@
//Cough gives you a chronic cough that causes you to drop items.
/datum/mutation/human/cough
name = "Cough"
desc = "A chronic cough."
quality = MINOR_NEGATIVE
text_gain_indication = "<span class='danger'>You start coughing.</span>"
synchronizer_coeff = 1
power_coeff = 1
/datum/mutation/human/cough/on_life(mob/living/carbon/human/owner)
if(prob(5) && owner.stat == CONSCIOUS)
if(prob(5 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS)
owner.drop_all_held_items()
owner.emote("cough")
if(GET_MUTATION_POWER(src) > 1)
var/cough_range = GET_MUTATION_POWER(src) * 4
var/turf/target = get_ranged_target_turf(owner, turn(owner.dir, 180), cough_range)
owner.throw_at(target, cough_range, GET_MUTATION_POWER(src))
//Dwarfism shrinks your body and lets you pass tables.
/datum/mutation/human/dwarfism
name = "Dwarfism"
desc = "A mutation believed to be the cause of dwarfism."
quality = POSITIVE
get_chance = 15
lowest_value = 256 * 12
difficulty = 16
instability = 5
locked = TRUE // Default intert species for now, so locked from regular pool.
/datum/mutation/human/dwarfism/on_acquiring(mob/living/carbon/human/owner)
if(..())
@@ -78,6 +95,7 @@
//Clumsiness has a very large amount of small drawbacks depending on item.
/datum/mutation/human/clumsy
name = "Clumsiness"
desc = "A genome that inhibits certain brain functions, causing the holder to appear clumsy. Honk"
quality = MINOR_NEGATIVE
text_gain_indication = "<span class='danger'>You feel lightheaded.</span>"
@@ -95,11 +113,13 @@
//Tourettes causes you to randomly stand in place and shout.
/datum/mutation/human/tourettes
name = "Tourette's Syndrome"
desc = "A chronic twitch that forces the user to use colorful language."
quality = NEGATIVE
text_gain_indication = "<span class='danger'>You twitch.</span>"
synchronizer_coeff = 1
/datum/mutation/human/tourettes/on_life(mob/living/carbon/human/owner)
if(prob(10) && owner.stat == CONSCIOUS && !owner.IsStun())
if(prob(10 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS && !owner.IsStun())
owner.Stun(200)
switch(rand(1, 3))
if(1)
@@ -117,6 +137,7 @@
//Deafness makes you deaf.
/datum/mutation/human/deaf
name = "Deafness"
desc = "The holder of this genome is completely deaf."
quality = NEGATIVE
text_gain_indication = "<span class='danger'>You can't seem to hear anything.</span>"
@@ -134,8 +155,10 @@
//Monified turns you into a monkey.
/datum/mutation/human/race
name = "Monkified"
desc = "A strange genome, believing to be what differentiates monkeys from humans."
quality = NEGATIVE
time_coeff = 2
locked = TRUE //Species specific, keep out of actual gene pool
/datum/mutation/human/race/on_acquiring(mob/living/carbon/human/owner)
if(..())
@@ -145,3 +168,95 @@
/datum/mutation/human/race/on_losing(mob/living/carbon/monkey/owner)
if(owner && istype(owner) && owner.stat != DEAD && (owner.dna.mutations.Remove(src)))
. = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE)
/datum/mutation/human/glow
name = "Glowy"
desc = "You permanently emit a light with a random color and intensity."
quality = POSITIVE
text_gain_indication = "<span class='notice'>Your skin begins to glow softly.</span>"
instability = 5
var/obj/effect/dummy/luminescent_glow/glowth //shamelessly copied from luminescents
var/glow = 1.5
power_coeff = 1
/datum/mutation/human/glow/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
glowth = new(owner)
glowth.set_light(glow, glow, dna.features["mcolor"])
/datum/mutation/human/glow/modify(mob/living/carbon/human/owner)
if(glowth)
glowth.set_light(glow + GET_MUTATION_POWER(src) , glow + GET_MUTATION_POWER(src), dna.features["mcolor"])
/datum/mutation/human/glow/on_losing(mob/living/carbon/human/owner)
if(..())
return
qdel(glowth)
/datum/mutation/human/strong
name = "Strength"
desc = "The user's muscles slightly expand."
quality = POSITIVE
text_gain_indication = "<span class='notice'>You feel strong.</span>"
difficulty = 16
/datum/mutation/human/fire
name = "Fiery Sweat"
desc = "The user's skin will randomly combust, but is generally alot more resilient to burning."
quality = NEGATIVE
text_gain_indication = "<span class='warning'>You feel hot.</span>"
text_lose_indication = "<span class'notice'>You feel a lot cooler.</span>"
difficulty = 14
synchronizer_coeff = 1
power_coeff = 1
/datum/mutation/human/fire/on_life(mob/living/carbon/human/owner)
if(prob((1+(100-dna.stability)/10)) * GET_MUTATION_SYNCHRONIZER(src))
owner.adjust_fire_stacks(2 * GET_MUTATION_POWER(src))
owner.IgniteMob()
/datum/mutation/human/fire/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
owner.physiology.burn_mod *= 0.5
/datum/mutation/human/fire/on_losing(mob/living/carbon/human/owner)
if(..())
return
owner.physiology.burn_mod *= 2
/datum/mutation/human/insulated
name = "Insulated"
desc = "The affected person does not conduct electricity."
quality = POSITIVE
text_gain_indication = "<span class='notice'>Your fingertips go numb.</span>"
text_lose_indication = "<span class='notice'>Your fingertips regain feeling.</span>"
difficulty = 16
instability = 25
/datum/mutation/human/insulated/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "genetics")
/datum/mutation/human/insulated/on_losing(mob/living/carbon/human/owner)
if(..())
return
REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "genetics")
/datum/mutation/human/paranoia
name = "Paranoia"
desc = "Subject is easily terrified, and may suffer from hallucinations."
quality = NEGATIVE
text_gain_indication = "<span class='danger'>You feel screams echo through your mind...</span>"
text_lose_indication = "<span class'notice'>The screaming in your mind fades.</span>"
/datum/mutation/human/paranoia/on_life(mob/living/carbon/human/owner)
if(prob(5) && owner.stat == CONSCIOUS)
owner.emote("scream")
owner.jitteriness = min(max(0, owner.jitteriness + 5), 30)
if(prob(25))
to_chat(owner,"<span class='warning'>You feel someone creeping in on you...</span>")
owner.hallucination += 20
+3 -2
View File
@@ -1,12 +1,13 @@
//Chameleon causes the owner to slowly become transparent when not moving.
/datum/mutation/human/chameleon
name = "Chameleon"
desc = "A genome that causes the holder's skin to become transparent over time."
quality = POSITIVE
get_chance = 20
lowest_value = 256 * 12
difficulty = 16
text_gain_indication = "<span class='notice'>You feel one with your surroundings.</span>"
text_lose_indication = "<span class='notice'>You feel oddly exposed.</span>"
time_coeff = 5
instability = 25
/datum/mutation/human/chameleon/on_acquiring(mob/living/carbon/human/owner)
if(..())
+14 -17
View File
@@ -1,32 +1,29 @@
//Cold Resistance gives your entire body an orange halo, and makes you immune to the effects of vacuum and cold.
/datum/mutation/human/cold_resistance
name = "Cold Resistance"
/datum/mutation/human/space_adaptation
name = "Space Adaptation"
desc = "A strange mutation that renders the host immune to the vacuum if space. Will still need an oxygen supply."
quality = POSITIVE
get_chance = 25
lowest_value = 256 * 12
difficulty = 16
text_gain_indication = "<span class='notice'>Your body feels warm!</span>"
time_coeff = 5
instability = 30
/datum/mutation/human/cold_resistance/New()
/datum/mutation/human/space_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..()
visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER)
if(!(type in visual_indicators))
visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER))
/datum/mutation/human/cold_resistance/get_visual_indicator(mob/living/carbon/human/owner)
return visual_indicators[1]
/datum/mutation/human/space_adaptation/get_visual_indicator(mob/living/carbon/human/owner)
return visual_indicators[type][1]
/datum/mutation/human/cold_resistance/on_acquiring(mob/living/carbon/human/owner)
/datum/mutation/human/space_adaptation/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
ADD_TRAIT(owner, TRAIT_RESISTCOLD, "cold_resistance")
// ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") CITADEL CHANGE
ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance")
/datum/mutation/human/cold_resistance/on_losing(mob/living/carbon/human/owner)
/datum/mutation/human/space_adaptation/on_losing(mob/living/carbon/human/owner)
if(..())
return
REMOVE_TRAIT(owner, TRAIT_RESISTCOLD, "cold_resistance")
// REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") CITADEL CHANGE
/datum/mutation/human/cold_resistance/on_life(mob/living/carbon/human/owner)
if(owner.getFireLoss())
if(prob(1))
owner.heal_bodypart_damage(0,1) //Is this really needed?
REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance")
+24
View File
@@ -0,0 +1,24 @@
/datum/generecipe
var/required = "" //it hurts so bad but initial is not compatible with lists
var/result = null
/proc/get_mixed_mutation(mutation1, mutation2)
if(!mutation1 || !mutation2)
return FALSE
if(mutation1 == mutation2) //this could otherwise be bad
return FALSE
for(var/A in GLOB.mutation_recipes)
if(findtext(A, "[mutation1]") && findtext(A, "[mutation2]"))
return GLOB.mutation_recipes[A]
/datum/generecipe/x_ray
required = "/datum/mutation/human/thermal; /datum/mutation/human/radioactive"
result = /datum/mutation/human/thermal/x_ray
/datum/generecipe/shock
required = "/datum/mutation/human/insulated; /datum/mutation/human/radioactive"
result = SHOCKTOUCH
/datum/generecipe/mindread
required = "/datum/mutation/human/antenna; /datum/mutation/human/paranoia"
result = MINDREAD
+7 -4
View File
@@ -1,12 +1,15 @@
//Hulk turns your skin green, and allows you to punch through walls.
/datum/mutation/human/hulk
name = "Hulk"
desc = "A poorly understood genome that causes the holder's muscles to expand, inhibit speech and gives the person a bad skin condition."
quality = POSITIVE
get_chance = 15
lowest_value = 256 * 12
locked = TRUE
difficulty = 16
text_gain_indication = "<span class='notice'>Your muscles hurt!</span>"
species_allowed = list("human") //no skeleton/lizard hulk
health_req = 25
instability = 40
locked = TRUE
/datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner)
if(..())
@@ -17,11 +20,11 @@
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk)
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
/datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity)
/datum/mutation/human/hulk/on_attack_hand(atom/target, proximity)
if(proximity) //no telekinetic hulk attack
return target.attack_hulk(owner)
/datum/mutation/human/hulk/on_life(mob/living/carbon/human/owner)
/datum/mutation/human/hulk/on_life()
if(owner.health < 0)
on_losing(owner)
to_chat(owner, "<span class='danger'>You suddenly feel very weak.</span>")
+19
View File
@@ -0,0 +1,19 @@
/datum/mutation/human/radioactive
name = "Radioactivity"
desc = "A volatile mutation that causes the host to sent out deadly beta radiation. This affects both the hosts and their surroundings."
quality = NEGATIVE
text_gain_indication = "<span class='warning'>You can feel it in your bones!</span>"
time_coeff = 5
instability = 5
difficulty = 8
/datum/mutation/human/radioactive/on_life(mob/living/carbon/human/owner)
radiation_pulse(owner, 20)
/datum/mutation/human/radioactive/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..()
if(!(type in visual_indicators))
visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "radiation", -MUTATIONS_LAYER))
/datum/mutation/human/radioactive/get_visual_indicator()
return visual_indicators[type][1]
+29 -12
View File
@@ -1,6 +1,7 @@
//Nearsightedness restricts your vision by several tiles.
/datum/mutation/human/nearsight
name = "Near Sightness"
desc = "The holder of this mutation has poor eyesight."
quality = MINOR_NEGATIVE
text_gain_indication = "<span class='danger'>You can't see very well.</span>"
@@ -18,6 +19,7 @@
//Blind makes you blind. Who knew?
/datum/mutation/human/blind
name = "Blindness"
desc = "Renders the subject completely blind."
quality = NEGATIVE
text_gain_indication = "<span class='danger'>You can't seem to see anything.</span>"
@@ -32,43 +34,58 @@
owner.cure_blind(GENETIC_MUTATION)
//X-ray Vision lets you see through walls.
/datum/mutation/human/x_ray
name = "X Ray Vision"
///Thermal Vision lets you see mobs through walls
/datum/mutation/human/thermal
name = "Thermal Vision"
desc = "The user of this genome can visually percieve the unique human thermal signature."
quality = POSITIVE
get_chance = 25
lowest_value = 256 * 12
text_gain_indication = "<span class='notice'>The walls suddenly disappear!</span>"
difficulty = 18
text_gain_indication = "<span class='notice'>You can see the heat rising off of your skin...</span>"
time_coeff = 2
instability = 25
var/visionflag = TRAIT_THERMAL_VISION
/datum/mutation/human/x_ray/on_acquiring(mob/living/carbon/human/owner)
/datum/mutation/human/thermal/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
ADD_TRAIT(owner, visionflag, GENETIC_MUTATION)
owner.update_sight()
/datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner)
/datum/mutation/human/thermal/on_losing(mob/living/carbon/human/owner)
if(..())
return
REMOVE_TRAIT(owner, visionflag, GENETIC_MUTATION)
owner.update_sight()
///X-ray Vision lets you see through walls.
/datum/mutation/human/thermal/x_ray
name = "X Ray Vision"
desc = "A strange genome that allows the user to see between the spaces of walls." //actual x-ray would mean you'd constantly be blasting rads, wich might be fun for later //hmb
text_gain_indication = "<span class='notice'>The walls suddenly disappear!</span>"
instability = 35
locked = TRUE
visionflag = TRAIT_XRAY_VISION
//Laser Eyes lets you shoot lasers from your eyes!
/datum/mutation/human/laser_eyes
name = "Laser Eyes"
desc = "Reflects concentrated light back from the eyes."
quality = POSITIVE
dna_block = NON_SCANNABLE
locked = TRUE
difficulty = 16
text_gain_indication = "<span class='notice'>You feel pressure building up behind your eyes.</span>"
layer_used = FRONT_MUTATIONS_LAYER
limb_req = BODY_ZONE_HEAD
/datum/mutation/human/laser_eyes/New()
/datum/mutation/human/laser_eyes/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..()
visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "lasereyes", -FRONT_MUTATIONS_LAYER)
/datum/mutation/human/laser_eyes/get_visual_indicator(mob/living/carbon/human/owner)
/datum/mutation/human/laser_eyes/get_visual_indicator()
return visual_indicators[1]
/datum/mutation/human/laser_eyes/on_ranged_attack(mob/living/carbon/human/owner, atom/target, mouseparams)
/datum/mutation/human/laser_eyes/on_ranged_attack(atom/target, mouseparams)
if(owner.a_intent == INTENT_HARM)
owner.LaserEyes(target, mouseparams)
+13 -7
View File
@@ -3,6 +3,7 @@
/datum/mutation/human/nervousness
name = "Nervousness"
desc = "Causes the holder to stutter."
quality = MINOR_NEGATIVE
text_gain_indication = "<span class='danger'>You feel nervous.</span>"
@@ -13,6 +14,7 @@
/datum/mutation/human/wacky
name = "Wacky"
desc = "<span class='sans'>Unknown.</span>"
quality = MINOR_NEGATIVE
text_gain_indication = "<span class='sans'>You feel an off sensation in your voicebox.</span>"
text_lose_indication = "<span class='notice'>The off sensation passes.</span>"
@@ -34,6 +36,7 @@
/datum/mutation/human/mute
name = "Mute"
desc = "Completely inhibits the vocal section of the brain."
quality = NEGATIVE
text_gain_indication = "<span class='danger'>You feel unable to express yourself at all.</span>"
text_lose_indication = "<span class='danger'>You feel able to speak freely again.</span>"
@@ -53,8 +56,8 @@
/datum/mutation/human/smile
name = "Smile"
desc = "Causes the user to be in constant mania."
quality = MINOR_NEGATIVE
dna_block = NON_SCANNABLE
text_gain_indication = "<span class='notice'>You feel so happy. Nothing can be wrong with anything. :)</span>"
text_lose_indication = "<span class='notice'>Everything is terrible again. :(</span>"
@@ -120,8 +123,8 @@
/datum/mutation/human/unintelligible
name = "Unintelligible"
desc = "Partially inhibits the vocal center of the brain, severely distorting speech."
quality = NEGATIVE
dna_block = NON_SCANNABLE
text_gain_indication = "<span class='danger'>You can't seem to form any coherent thoughts!</span>"
text_lose_indication = "<span class='danger'>Your mind feels more clear.</span>"
@@ -140,8 +143,9 @@
/datum/mutation/human/swedish
name = "Swedish"
desc = "A horrible mutation originating from the distant past. Thought to be eradicated after the incident in 2037."
quality = MINOR_NEGATIVE
dna_block = NON_SCANNABLE
locked = TRUE
text_gain_indication = "<span class='notice'>You feel Swedish, however that works.</span>"
text_lose_indication = "<span class='notice'>The feeling of Swedishness passes.</span>"
@@ -172,8 +176,8 @@
/datum/mutation/human/chav
name = "Chav"
desc = "Unknown"
quality = MINOR_NEGATIVE
dna_block = NON_SCANNABLE
text_gain_indication = "<span class='notice'>Ye feel like a reet prat like, innit?</span>"
text_lose_indication = "<span class='notice'>You no longer feel like being rude and sassy.</span>"
@@ -219,12 +223,13 @@
/datum/mutation/human/elvis
name = "Elvis"
desc = "A terrifying mutation named after its 'patient-zero'."
quality = MINOR_NEGATIVE
dna_block = NON_SCANNABLE
locked = TRUE
text_gain_indication = "<span class='notice'>You feel pretty good, honeydoll.</span>"
text_lose_indication = "<span class='notice'>You feel a little less conversation would be great.</span>"
/datum/mutation/human/elvis/on_life(mob/living/carbon/human/owner)
/datum/mutation/human/elvis/on_life()
switch(pick(1,2))
if(1)
if(prob(15))
@@ -265,8 +270,9 @@
/datum/mutation/human/stoner
name = "Stoner"
desc = "A common mutation that severely decreases intelligence."
quality = NEGATIVE
dna_block = NON_SCANNABLE
locked = TRUE
text_gain_indication = "<span class='notice'>You feel...totally chill, man!</span>"
text_lose_indication = "<span class='notice'>You feel like you have a better sense of time.</span>"
+8 -6
View File
@@ -1,18 +1,20 @@
//Telekinesis lets you interact with objects from range, and gives you a light blue halo around your head.
/datum/mutation/human/telekinesis
name = "Telekinesis"
desc = "A strange mutation that allows the holder to interact with objects through thought."
quality = POSITIVE
get_chance = 20
lowest_value = 256 * 12
difficulty = 18
text_gain_indication = "<span class='notice'>You feel smarter!</span>"
limb_req = BODY_ZONE_HEAD
instability = 30
/datum/mutation/human/telekinesis/New()
/datum/mutation/human/telekinesis/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..()
visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER)
if(!(type in visual_indicators))
visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER))
/datum/mutation/human/telekinesis/get_visual_indicator(mob/living/carbon/human/owner)
return visual_indicators[1]
return visual_indicators[type][1]
/datum/mutation/human/telekinesis/on_ranged_attack(mob/living/carbon/human/owner, atom/target)
target.attack_tk(owner)
target.attack_tk(owner)
+6
View File
@@ -282,6 +282,12 @@
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"
+7 -7
View File
@@ -174,16 +174,16 @@
name = "Backup Shuttle"
can_be_bought = FALSE
/datum/map_template/shuttle/emergency/airless
suffix = "airless"
/datum/map_template/shuttle/emergency/construction
suffix = "construction"
name = "Build your own shuttle kit"
description = "Save money by building your own shuttle! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Interior and atmosphere not included."
admin_notes = "No brig, no medical facilities, no air."
credit_cost = -7500
description = "For the enterprising shuttle engineer! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Comes stocked with construction materials."
admin_notes = "No brig, no medical facilities, no shuttle console."
credit_cost = 2500
/datum/map_template/shuttle/emergency/airless/prerequisites_met()
// first 10 minutes only
return world.time - SSticker.round_start_time < 6000
// first 30 minutes only
return world.time - SSticker.round_start_time < 18000
/datum/map_template/shuttle/emergency/airless/on_bought()
//enable buying engines from cargo
+2 -2
View File
@@ -520,7 +520,7 @@
itemUser.adjustToxLoss(-1.5, forced = TRUE) //Because Slime People are people too
itemUser.adjustOxyLoss(-1.5)
itemUser.adjustStaminaLoss(-1.5)
itemUser.adjustBrainLoss(-1.5)
itemUser.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.5)
itemUser.adjustCloneLoss(-0.5) //Becasue apparently clone damage is the bastion of all health
//Heal all those around you, unbiased
for(var/mob/living/L in view(7, owner))
@@ -532,7 +532,7 @@
L.adjustToxLoss(-3.5, forced = TRUE) //Because Slime People are people too
L.adjustOxyLoss(-3.5)
L.adjustStaminaLoss(-3.5)
L.adjustBrainLoss(-3.5)
L.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3.5)
L.adjustCloneLoss(-1) //Becasue apparently clone damage is the bastion of all health
else if(issilicon(L))
L.adjustBruteLoss(-3.5)
+53
View File
@@ -80,6 +80,36 @@
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
icon_state = "asleep"
//TASER
/datum/status_effect/electrode
id = "tased"
blocks_combatmode = TRUE
status_type = STATUS_EFFECT_REPLACE
alert_type = null
/datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration)
if(isnum(set_duration))
duration = set_duration
. = ..()
if(iscarbon(owner))
var/mob/living/carbon/C = owner
if(C.combatmode)
C.toggle_combat_mode(TRUE)
C.add_movespeed_modifier(MOVESPEED_ID_TASED_STATUS, TRUE, override = TRUE, multiplicative_slowdown = 8)
/datum/status_effect/electrode/on_remove()
if(iscarbon(owner))
var/mob/living/carbon/C = owner
C.remove_movespeed_modifier(MOVESPEED_ID_TASED_STATUS)
. = ..()
/datum/status_effect/electrode/tick()
if(owner)
owner.adjustStaminaLoss(5) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing.
/datum/status_effect/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y
return 2
//STASIS
/datum/status_effect/incapacitating/stasis
id = "stasis"
@@ -643,3 +673,26 @@ datum/status_effect/pacify
addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10)
addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it
qdel(src)
/datum/status_effect/dna_melt
id = "dna_melt"
duration = 600
status_type = STATUS_EFFECT_REPLACE
alert_type = /obj/screen/alert/status_effect/dna_melt
var/kill_either_way = FALSE //no amount of removing mutations is gonna save you now
/datum/status_effect/dna_melt/on_creation(mob/living/new_owner, set_duration, updating_canmove)
. = ..()
to_chat(new_owner, "<span class='boldwarning'>My body can't handle the mutations! I need to get my mutations removed fast!</span>")
/datum/status_effect/dna_melt/on_remove()
if(!ishuman(owner))
owner.gib() //fuck you in particular
return
var/mob/living/carbon/human/H = owner
H.something_horrible(kill_either_way)
/obj/screen/alert/status_effect/dna_melt
name = "Genetic Breakdown"
desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate."
icon_state = "dna_melt"
@@ -11,6 +11,7 @@
var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves
var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
var/blocks_combatmode //Does this status effect prevent the user from toggling combat mode?
var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists
/datum/status_effect/New(list/arguments)
+4 -1
View File
@@ -119,7 +119,7 @@
medical_record_text = "Patient has a tumor in their brain that is slowly driving them to brain death."
/datum/quirk/brainproblems/on_process()
quirk_holder.adjustBrainLoss(0.2)
quirk_holder.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2)
/datum/quirk/nearsighted //t. errorage
name = "Nearsighted"
@@ -345,9 +345,12 @@
gain_text = "<span class='danger'>You find yourself unable to speak!</span>"
lose_text = "<span class='notice'>You feel a growing strength in your vocal chords.</span>"
medical_record_text = "Functionally mute, patient is unable to use their voice in any capacity."
var/datum/brain_trauma/severe/mute/mute
/datum/quirk/mute/add()
var/mob/living/carbon/human/H = quirk_holder
mute = new
H.gain_trauma(mute, TRAUMA_RESILIENCE_SURGERY)
H.gain_trauma(TRAIT_MUTE, TRAUMA_RESILIENCE_SURGERY)
/datum/quirk/mute/on_process()
@@ -38,9 +38,9 @@
H.randmuti()
if(prob(50))
if(prob(90))
H.randmutb()
H.easy_randmut(NEGATIVE+MINOR_NEGATIVE)
else
H.randmutg()
H.easy_randmut(POSITIVE)
H.domutcheck()
L.rad_act(20)
+2 -2
View File
@@ -19,12 +19,12 @@
var/atom/inertia_last_loc
var/inertia_moving = 0
var/inertia_next_move = 0
var/inertia_move_delay = 3
var/inertia_move_delay = 7
var/pass_flags = 0
var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move
var/list/client_mobs_in_contents // This contains all the client mobs within this container
var/list/acted_explosions //for explosion dodging
glide_size = 7
glide_size = 13
appearance_flags = TILE_BOUND|PIXEL_SCALE
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
var/floating = FALSE
+1 -1
View File
@@ -146,7 +146,7 @@
data["occupant"]["toxLoss"] = mob_occupant.getToxLoss()
data["occupant"]["fireLoss"] = mob_occupant.getFireLoss()
data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss()
data["occupant"]["brainLoss"] = mob_occupant.getBrainLoss()
data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN)
data["occupant"]["reagents"] = list()
if(mob_occupant.reagents && mob_occupant.reagents.reagent_list.len)
for(var/datum/reagent/R in mob_occupant.reagents.reagent_list)
+15 -6
View File
@@ -80,6 +80,8 @@
name = "cloning data disk"
icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk.
var/list/fields = list()
var/list/mutations = list()
var/max_mutations = 6
var/read_only = 0 //Well,it's still a floppy disk
//Disk stuff.
@@ -127,7 +129,7 @@
return examine(user)
//Start growing a human clone in the pod!
/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, se, mindref, datum/species/mrace, list/features, factions, list/quirks)
/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks)
if(panel_open)
return FALSE
if(mess || attempting)
@@ -161,10 +163,10 @@
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
H.hardset_dna(ui, se, H.real_name, null, mrace, features)
H.hardset_dna(ui, mutation_index, H.real_name, null, mrace, features)
if(prob(50 - efficiency*10)) //Chance to give a bad mutation.
H.randmutb() //100% bad mutation. Can be cured with mutadone.
H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) //100% bad mutation. Can be cured with mutadone.
H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment.
occupant = H
@@ -241,13 +243,15 @@
var/obj/item/I = pick_n_take(unattached_flesh)
if(isorgan(I))
var/obj/item/organ/O = I
O.organ_flags &= ~ORGAN_FROZEN
O.Insert(mob_occupant)
else if(isbodypart(I))
var/obj/item/bodypart/BP = I
BP.attach_limb(mob_occupant)
//Premature clones may have brain damage.
mob_occupant.adjustBrainLoss(-((speed_coeff / 2) * dmg_mult))
mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, -((speed_coeff / 2) * dmg_mult))
use_power(7500) //This might need tweaking.
@@ -261,6 +265,7 @@
for(var/i in unattached_flesh)
if(isorgan(i))
var/obj/item/organ/O = i
O.organ_flags &= ~ORGAN_FROZEN
O.Insert(mob_occupant)
else if(isbodypart(i))
var/obj/item/bodypart/BP = i
@@ -344,6 +349,9 @@
if(mess) //Clean that mess and dump those gibs!
for(var/obj/fl in unattached_flesh)
fl.forceMove(T)
if(istype(fl, /obj/item/organ))
var/obj/item/organ/O = fl
O.organ_flags &= ~ORGAN_FROZEN
unattached_flesh.Cut()
mess = FALSE
new /obj/effect/gibspawner/generic(get_turf(src))
@@ -440,7 +448,7 @@
unattached_flesh.Cut()
H.setCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health
H.setBrainLoss(CLONE_INITIAL_DAMAGE)
//H.setOrganLoss(ORGAN_SLOT_BRAIN, CLONE_INITIAL_DAMAGE)
// In addition to being cellularly damaged and having barely any
// brain function, they also have no limbs or internal organs.
@@ -456,8 +464,9 @@
for(var/o in H.internal_organs)
var/obj/item/organ/organ = o
if(!istype(organ) || organ.vital)
if(!istype(organ) || (organ.organ_flags & ORGAN_VITAL))
continue
organ.organ_flags |= ORGAN_FROZEN
organ.Remove(H, special=TRUE)
organ.forceMove(src)
unattached_flesh += organ
+1 -1
View File
@@ -486,7 +486,7 @@
R.fields["id"] = copytext(md5(mob_occupant.real_name), 2, 6)
R.fields["UE"] = dna.unique_enzymes
R.fields["UI"] = dna.uni_identity
R.fields["SE"] = dna.struc_enzymes
R.fields["SE"] = dna.mutation_index
R.fields["blood_type"] = dna.blood_type
R.fields["features"] = dna.features
R.fields["factions"] = mob_occupant.faction
+488 -130
View File
@@ -1,14 +1,16 @@
#define INJECTOR_TIMEOUT 100
#define REJUVENATORS_INJECT 15
#define REJUVENATORS_MAX 90
#define NUMBER_OF_BUFFERS 3
#define SCRAMBLE_TIMEOUT 600
#define JOKER_TIMEOUT 12000 //20 minutes
#define JOKER_UPGRADE 1800
#define RADIATION_STRENGTH_MAX 15
#define RADIATION_STRENGTH_MULTIPLIER 1 //larger has a more range
#define RADIATION_STRENGTH_MULTIPLIER 1 //larger has more range
#define RADIATION_DURATION_MAX 30
#define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate
#define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject receives
#define SCANNER_ACTION_SE 1
@@ -23,22 +25,33 @@
icon_keyboard = "med_key"
density = TRUE
circuit = /obj/item/circuitboard/computer/scan_consolenew
var/radduration = 2
var/radstrength = 1
var/list/buffer[NUMBER_OF_BUFFERS]
var/injectorready = 0 //world timer cooldown var
var/current_screen = "mainmenu"
var/obj/machinery/dna_scannernew/connected = null
var/obj/item/disk/data/diskette = null
var/list/delayed_action = null
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 400
light_color = LIGHT_COLOR_BLUE
var/datum/techweb/stored_research
var/max_storage = 6
var/combine
var/radduration = 2
var/radstrength = 1
var/max_chromosomes = 6
var/list/buffer[NUMBER_OF_BUFFERS]
var/list/stored_mutations = list()
var/list/stored_chromosomes = list()
var/injectorready = 0 //world timer cooldown var
var/jokerready = 0
var/scrambleready = 0
var/current_screen = "mainmenu"
var/current_mutation //what block are we inspecting? only used when screen = "info"
var/current_storage //what storage block are we looking at?
var/obj/machinery/dna_scannernew/connected = null
var/obj/item/disk/data/diskette = null
var/list/delayed_action = null
/obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params)
if (istype(I, /obj/item/disk/data)) //INSERT SOME DISKETTES
if (!src.diskette)
@@ -48,6 +61,28 @@
to_chat(user, "<span class='notice'>You insert [I].</span>")
src.updateUsrDialog()
return
if (istype(I, /obj/item/chromosome))
if(LAZYLEN(stored_chromosomes) < max_chromosomes)
I.forceMove(src)
stored_chromosomes += I
to_chat(user, "<span class='notice'>You insert [I].</span>")
else
to_chat(user, "<span class='warning'>You cannot store any more chromosomes!</span>")
return
if(istype(I, /obj/item/dnainjector/activator))
var/obj/item/dnainjector/activator/A = I
if(A.used)
to_chat(user,"<span class='notice'>Recycled [I].</span>")
if(A.research)
var/c_typepath = generate_chromosome()
var/obj/item/chromosome/CM = new c_typepath (drop_location())
to_chat(user,"<span class='notice'>Recycled [I].</span>")
if((LAZYLEN(stored_chromosomes) < max_chromosomes) && prob(60))
CM.forceMove(src)
stored_chromosomes += CM
to_chat(user,"<span class='notice'>[capitalize(CM.name)] added to storage.</span>")
qdel(I)
return
else
return ..()
@@ -58,12 +93,26 @@
if(!isnull(connected))
break
injectorready = world.time + INJECTOR_TIMEOUT
scrambleready = world.time + SCRAMBLE_TIMEOUT
jokerready = world.time + JOKER_TIMEOUT
stored_research = SSresearch.science_tech
/obj/machinery/computer/scan_consolenew/examine(mob/user)
..()
if(jokerready < world.time)
to_chat(user, "<span class='notice'>JOKER algorithm available.</span>")
else
to_chat(user, "<span class='notice'>JOKER algorithm available in about [round(0.00166666667 * (jokerready - world.time))] minutes.")
/obj/machinery/computer/scan_consolenew/ui_interact(mob/user, last_change)
. = ..()
if(!user)
return
var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window
if(user.client)
var/datum/asset/simple/assets = get_asset_datum(/datum/asset/simple/genetics)
assets.send(user.client)
if(!(in_range(src, user) || issilicon(user)))
popup.close()
return
@@ -88,8 +137,6 @@
occupant_status += "</div></div>"
occupant_status += "<div class='line'><div class='statusLabel'>Health:</div><div class='progressBar'><div style='width: [viable_occupant.health]%;' class='progressFill good'></div></div><div class='statusValue'>[viable_occupant.health] %</div></div>"
occupant_status += "<div class='line'><div class='statusLabel'>Radiation Level:</div><div class='progressBar'><div style='width: [viable_occupant.radiation/(RAD_MOB_SAFE/100)]%;' class='progressFill bad'></div></div><div class='statusValue'>[viable_occupant.radiation/(RAD_MOB_SAFE/100)] %</div></div>"
var/rejuvenators = viable_occupant.reagents.get_reagent_amount("potass_iodide")
occupant_status += "<div class='line'><div class='statusLabel'>Rejuvenators:</div><div class='progressBar'><div style='width: [round((rejuvenators / REJUVENATORS_MAX) * 100)]%;' class='progressFill highlight'></div></div><div class='statusValue'>[rejuvenators] units</div></div>"
occupant_status += "<div class='line'><div class='statusLabel'>Unique Enzymes :</div><div class='statusValue'><span class='highlight'>[viable_occupant.dna.unique_enzymes]</span></div></div>"
occupant_status += "<div class='line'><div class='statusLabel'>Last Operation:</div><div class='statusValue'>[last_change ? last_change : "----"]</div></div>"
else
@@ -147,28 +194,53 @@
buttons += "<a href='?src=[REF(src)];task=togglelock;'>[connected.locked ? "Unlock" : "Lock"] Scanner</a>"
else
buttons += "<span class='linkOff'>Open Scanner</span> <span class='linkOff'>Lock Scanner</span>"
if(viable_occupant)
buttons += "<a href='?src=[REF(src)];task=rejuv'>Inject Rejuvenators</a>"
if(viable_occupant && (scrambleready < world.time))
buttons += "<a href='?src=[REF(src)];task=scramble'>Scramble DNA</a>"
else
buttons += "<span class='linkOff'>Inject Rejuvenators</span>"
buttons += "<span class='linkOff'>Scramble DNA</span>"
if(diskette)
buttons += "<a href='?src=[REF(src)];task=ejectdisk'>Eject Disk</a>"
buttons += "<a href='?src=[REF(src)];task=screen;text=disk;'>Disk</a>"
else
buttons += "<span class='linkOff'>Eject Disk</span>"
if(current_screen == "buffer")
buttons += "<a href='?src=[REF(src)];task=screen;text=mainmenu;'>Radiation Emitter Menu</a>"
buttons += "<span class='linkOff'>Disk</span>"
if(current_screen == "mutations")
buttons += "<span class='linkOff'>Mutations</span>"
else
buttons += "<a href='?src=[REF(src)];task=screen;text=buffer;'>Buffer Menu</a>"
buttons += "<a href='?src=[REF(src)];task=screen;text=mutations;'>Mutations</a>"
if((current_screen == "mainmenu") || !current_screen)
buttons += "<span class='linkOff'>Genetic Sequencer</span>"
else
buttons += "<a href='?src=[REF(src)];task=screen;text=mainmenu;'>Genetic Sequencer</a>"
if(current_screen == "ui")
buttons += "<span class='linkOff'>Unique Identifiers</span>"
else
buttons += "<a href='?src=[REF(src)];task=screen;text=ui;'>Unique Identifiers</a>"
switch(current_screen)
if("working")
temp_html += status
temp_html += "<h1>System Busy</h1>"
temp_html += "Working ... Please wait ([DisplayTimeText(radduration*10)])"
if("buffer")
if("ui")
temp_html += status
temp_html += buttons
temp_html += "<h1>Buffer Menu</h1>"
temp_html += "<h1>Unique Identifiers</h1>"
temp_html += "<a href='?src=[REF(src)];task=setstrength;num=[radstrength-1];'>--</a> <a href='?src=[REF(src)];task=setstrength;'>Output Level</a> <a href='?src=[REF(src)];task=setstrength;num=[radstrength+1];'>++</a>"
temp_html += "<br><a href='?src=[REF(src)];task=setduration;num=[radduration-1];'>--</a> <a href='?src=[REF(src)];task=setduration;'>Pulse Duration</a> <a href='?src=[REF(src)];task=setduration;num=[radduration+1];'>++</a>"
temp_html += "<h3>Irradiate Subject</h3>"
temp_html += "<div class='line'><div class='statusLabel'>Unique Identifier:</div><div class='statusValue'><div class='clearBoth'>"
var/max_line_len = 7*DNA_BLOCK_SIZE
if(viable_occupant)
temp_html += "<div class='dnaBlockNumber'>1</div>"
var/len = length(viable_occupant.dna.uni_identity)
for(var/i=1, i<=len, i++)
temp_html += "<a class='dnaBlock' href='?src=[REF(src)];task=pulseui;num=[i];'>[copytext(viable_occupant.dna.uni_identity,i,i+1)]</a>"
if ((i % max_line_len) == 0)
temp_html += "</div><div class='clearBoth'>"
if((i % DNA_BLOCK_SIZE) == 0 && i < len)
temp_html += "<div class='dnaBlockNumber'>[(i / DNA_BLOCK_SIZE) + 1]</div>"
else
temp_html += "---------"
temp_html += "</div></div><br><h1>Buffer Menu</h1>"
if(istype(buffer))
for(var/i=1, i<=buffer.len, i++)
@@ -188,7 +260,6 @@
temp_html += "<span class='linkOff'>Save to Disk</span>"
else
var/ui = buffer_slot["UI"]
var/se = buffer_slot["SE"]
var/ue = buffer_slot["UE"]
var/name = buffer_slot["name"]
var/label = buffer_slot["label"]
@@ -234,19 +305,6 @@
temp_html += "<a href='?src=[REF(src)];task=injector;num=[i];text=mixed'>UI+UE Injector</a>"
else
temp_html += "<span class='linkOff'>UI+UE Injector</span>"
if(se)
temp_html += "<br>\tSE: [se] "
if(viable_occupant)
temp_html += "<a href='?src=[REF(src)];task=transferbuffer;num=[i];text=se'>Occupant</a>"
else
temp_html += "<span class='linkOff'>Occupant</span>"
temp_html += "<a href='?src=[REF(src)];task=setdelayed;num=[i];delayaction=[SCANNER_ACTION_SE]'>Occupant:Delayed</a>"
if(injectorready < world.time )
temp_html += "<a href='?src=[REF(src)];task=injector;num=[i];text=se'>Injector</a>"
else
temp_html += "<span class='linkOff'>Injector</span>"
else
temp_html += "<br>\tSE: No Data"
if(viable_occupant)
temp_html += "<br><a href='?src=[REF(src)];task=setbuffer;num=[i];'>Save to Buffer</a>"
else
@@ -260,48 +318,197 @@
temp_html += "<a href='?src=[REF(src)];task=savedisk;num=[i];'>Save to Disk</a>"
else
temp_html += "<span class='linkOff'>Save to Disk</span>"
if("disk")
temp_html += status
temp_html += buttons
if(diskette)
temp_html += "<h3>[diskette.name]</h3><br>"
temp_html += "<a href='?src=[REF(src)];task=ejectdisk'>Eject Disk</a><br>"
if(LAZYLEN(diskette.mutations))
temp_html += "<table>"
for(var/datum/mutation/human/A in diskette.mutations)
temp_html += "<tr><td><span class='linkOff'>[A.name]</span></td>"
temp_html += "<td><a href='?src=[REF(src)];task=deletediskmut;num=[diskette.mutations.Find(A)];'>Delete</a></td>"
if(LAZYLEN(stored_mutations) < max_storage)
temp_html += "<td><a href='?src=[REF(src)];task=importdiskmut;num=[diskette.mutations.Find(A)];'>Import</a></td>"
else
temp_html += "<td><td><span class='linkOff'>Import</span></td>"
temp_html += "</tr>"
temp_html += "</table>"
else
temp_html += "<br>Load diskette to start ----------"
if("info")
if(LAZYLEN(stored_mutations))
if(LAZYLEN(stored_mutations) >= current_storage)
var/datum/mutation/human/HM = stored_mutations[current_storage]
if(HM)
temp_html += display_sequence(HM.type, current_storage)
else
current_screen = "mainmenu"
if("mutations")
temp_html += status
temp_html += buttons
temp_html += "<h3>Mutation Storage:<br></h3>"
temp_html += "<table>"
for(var/datum/mutation/human/HM in stored_mutations)
var/i = stored_mutations.Find(HM)
temp_html += "<tr><td><a href='?src=[REF(src)];task=inspectstorage;num=[i]'>[HM.name]</a></td>"
temp_html += "<td><a href='?src=[REF(src)];task=exportdiskmut;path=[HM.type]'>Export</a></td>"
temp_html += "<td><a href='?src=[REF(src)];task=deletemut;num=[i]'>Delete</a></td>"
if(combine == HM.type)
temp_html += "<td><span class='linkOff'>Combine</span></td></tr>"
else
temp_html += "<td><a href='?src=[REF(src)];task=combine;num=[i]'>Combine</a></td></tr>"
temp_html += "</table><br>"
temp_html += "<h3>Chromosome Storage:<br></h3>"
temp_html += "<table>"
for(var/i in 1 to stored_chromosomes.len)
var/obj/item/chromosome/CM = stored_chromosomes[i]
temp_html += "<td><a href='?src=[REF(src)];task=ejectchromosome;num=[i]'>[CM.name]</a></td><br>"
temp_html += "</table>"
else
temp_html += status
temp_html += buttons
temp_html += "<h1>Radiation Emitter Menu</h1>"
temp_html += "<a href='?src=[REF(src)];task=setstrength;num=[radstrength-1];'>--</a> <a href='?src=[REF(src)];task=setstrength;'>Output Level</a> <a href='?src=[REF(src)];task=setstrength;num=[radstrength+1];'>++</a>"
temp_html += "<br><a href='?src=[REF(src)];task=setduration;num=[radduration-1];'>--</a> <a href='?src=[REF(src)];task=setduration;'>Pulse Duration</a> <a href='?src=[REF(src)];task=setduration;num=[radduration+1];'>++</a>"
temp_html += "<h3>Irradiate Subject</h3>"
temp_html += "<div class='line'><div class='statusLabel'>Unique Identifier:</div><div class='statusValue'><div class='clearBoth'>"
var/max_line_len = 7*DNA_BLOCK_SIZE
temp_html += "<div class='line'><div class='statusLabel'>Genetic Sequence:</div><br>"
if(viable_occupant)
temp_html += "<div class='dnaBlockNumber'>1</div>"
var/len = length(viable_occupant.dna.uni_identity)
for(var/i=1, i<=len, i++)
temp_html += "<a class='dnaBlock' href='?src=[REF(src)];task=pulseui;num=[i];'>[copytext(viable_occupant.dna.uni_identity,i,i+1)]</a>"
if ((i % max_line_len) == 0)
temp_html += "</div><div class='clearBoth'>"
if((i % DNA_BLOCK_SIZE) == 0 && i < len)
temp_html += "<div class='dnaBlockNumber'>[(i / DNA_BLOCK_SIZE) + 1]</div>"
if(viable_occupant)
for(var/A in get_mutation_list())
temp_html += display_inactive_sequence(A)
temp_html += "<br>"
else
temp_html += "----"
if(viable_occupant && (current_mutation in get_mutation_list(viable_occupant)))
temp_html += display_sequence(current_mutation)
temp_html += "</div><br>"
else
temp_html += "----"
temp_html += "</div></div></div><br>"
temp_html += "<br><div class='line'><div class='statusLabel'>Structural Enzymes:</div><div class='statusValue'><div class='clearBoth'>"
if(viable_occupant)
temp_html += "<div class='dnaBlockNumber'>1</div>"
var/len = length(viable_occupant.dna.struc_enzymes)
for(var/i=1, i<=len, i++)
temp_html += "<a class='dnaBlock' href='?src=[REF(src)];task=pulsese;num=[i];'>[copytext(viable_occupant.dna.struc_enzymes,i,i+1)]</a>"
if ((i % max_line_len) == 0)
temp_html += "</div><div class='clearBoth'>"
if((i % DNA_BLOCK_SIZE) == 0 && i < len)
temp_html += "<div class='dnaBlockNumber'>[(i / DNA_BLOCK_SIZE) + 1]</div>"
else
temp_html += "----"
temp_html += "</div></div></div>"
temp_html += "----------"
popup.set_content(temp_html.Join())
popup.open()
/obj/machinery/computer/scan_consolenew/proc/display_inactive_sequence(mutation)
var/temp_html = ""
var/class = "unselected"
var/mob/living/carbon/viable_occupant = get_viable_occupant()
if(!viable_occupant)
return
var/location = viable_occupant.dna.mutation_index.Find(mutation) //We do this because we dont want people using sysexp or similair tools to just read the mutations.
if(!location) //Do this only when needed, dont make a list with mutations for every iteration if you dont need to
var/list/mutations = get_mutation_list(TRUE)
if(mutation in mutations)
location = mutations.Find(mutation)
if(mutation == current_mutation)
class = "selected"
if(location > DNA_MUTATION_BLOCKS)
temp_html += "<a class='clean' href='?src=[REF(src)];task=inspect;num=[location];'><img class='[class]' src='dna_extra.gif' width = '65' alt='Extra Mutation'></a>"
else if(mutation in stored_research.discovered_mutations)
temp_html += "<a class='clean' href='?src=[REF(src)];task=inspect;num=[location];'><img class='[class]' src='dna_discovered.gif' width = '65' alt='Discovered Mutation'></a>"
else
temp_html += "<a class='clean' clean href='?src=[REF(src)];task=inspect;num=[location];'><img class='[class]' src='dna_undiscovered.gif' width = '65' alt=Undiscovered Mutation'></a>"
return temp_html
/obj/machinery/computer/scan_consolenew/proc/display_sequence(mutation, storage_slot) //Storage slot is for when viewing from the stored mutations
var/temp_html = ""
if(!mutation)
temp_html += "ERR-"
return
var/mut_name = "Unknown gene"
var/mut_desc = "No information available."
var/alias
var/discovered = FALSE
var/active = FALSE
var/scrambled = FALSE
var/instability
var/mob/living/carbon/viable_occupant = get_viable_occupant()
var/datum/mutation/human/HM = get_valid_mutation(mutation)
if(viable_occupant)
var/datum/mutation/human/M = viable_occupant.dna.get_mutation(mutation)
if(M)
scrambled = M.scrambled
active = TRUE
var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(mutation)
alias = A.alias
if(active && !scrambled)
discover(mutation)
if(stored_research && (mutation in stored_research.discovered_mutations))
mut_name = A.name
mut_desc = A.desc
discovered = TRUE
instability = A.instability
var/extra
if(viable_occupant && !(storage_slot || viable_occupant.dna.mutation_in_sequence(mutation)))
extra = TRUE
if(discovered && !scrambled)
var/mutcolor
switch(A.quality)
if(POSITIVE)
mutcolor = "good"
if(MINOR_NEGATIVE)
mutcolor = "average"
if(NEGATIVE)
mutcolor = "bad"
if(HM)
instability *= GET_MUTATION_STABILIZER(HM)
temp_html += "<div class='statusDisplay'><div class='statusLine'><span class='[mutcolor]'><b>[mut_name]</b></span><small> ([alias])</small><br>"
temp_html += "<div class='statusLine'>Instability : [round(instability)]</span><br>"
else
temp_html += "<div class='statusDisplay'><div class='statusLine'><b>[alias]</b><br>"
temp_html += "<div class='statusLine'>[mut_desc]<br></div>"
if(active && !storage_slot)
if(HM?.can_chromosome && (HM in viable_occupant.dna.mutations))
var/i = viable_occupant.dna.mutations.Find(HM)
var/chromosome_name = "<a href='?src=[REF(src)];task=applychromosome;path=[mutation];num=[i];'>----</a>"
if(HM.chromosome_name)
chromosome_name = HM.chromosome_name
temp_html += "<div class='statusLine'>Chromosome status: [chromosome_name]<br></div>"
temp_html += "<div class='statusLine'>Sequence:<br><br></div>"
if(!scrambled)
for(var/block in 1 to A.blocks)
var/whole_sequence = get_valid_gene_string(mutation)
var/sequence = copytext(whole_sequence, 1+(block-1)*(DNA_SEQUENCE_LENGTH*2),(DNA_SEQUENCE_LENGTH*2*block+1))
temp_html += "<div class='statusLine'><table class='statusDisplay'><tr>"
for(var/i in 1 to DNA_SEQUENCE_LENGTH)
var/num = 1+(i-1)*2
var/genenum = num+(DNA_SEQUENCE_LENGTH*2*(block-1))
temp_html += "<td><div class='statusLine'><span class='dnaBlockNumber'><a href='?src=[REF(src)];task=pulsegene;num=[genenum];path=[mutation];'>[sequence[num]]</span></a></div></td>"
temp_html += "</tr><tr>"
for(var/i in 1 to DNA_SEQUENCE_LENGTH)
temp_html += "<td><div class='statusLine'>|</div></td>"
temp_html += "</tr><tr>"
for(var/i in 1 to DNA_SEQUENCE_LENGTH)
var/num = i*2
var/genenum = num+(DNA_SEQUENCE_LENGTH*2*(block-1))
temp_html += "<td><div class='statusLine'><span class='dnaBlockNumber'><a href='?src=[REF(src)];task=pulsegene;num=[genenum];path=[mutation];'>[sequence[num]]</span></a></div></td>"
temp_html += "</tr></table></div>"
temp_html += "<br><br><br><br><br>"
else
temp_html = "<div class='statusLine'>Sequence unreadable due to unpredictable mutation.</div>"
if((active || storage_slot) && (injectorready < world.time) && !scrambled)
temp_html += "<a href='?src=[REF(src)];task=activator;path=[mutation];slot=[storage_slot];'>Print Activator</a>"
temp_html += "<a href='?src=[REF(src)];task=mutator;path=[mutation];slot;=[storage_slot];'>Print Mutator</a>"
else
temp_html += "<span class='linkOff'>Print Activator</span>"
temp_html += "<span class='linkOff'>Print Mutator</span>"
temp_html += "<br><div class='statusLine'>"
if(storage_slot)
temp_html += "<a href='?src=[REF(src)];task=deletemut;num=[storage_slot];'>Delete</a>"
if((LAZYLEN(stored_mutations) < max_storage) && diskette && !diskette.read_only)
temp_html += "<a href='?src=[REF(src)];task=exportdiskmut;path=[mutation];'>Export</a>"
else
temp_html += "<span class='linkOff'>Export</span>"
temp_html += "<a href='?src=[REF(src)];task=screen;text=mutations;'>Back</a>"
else if(active && !scrambled)
temp_html += "<a href='?src=[REF(src)];task=savemut;path=[mutation];'>Store</a>"
if(extra || scrambled)
temp_html += "<a href='?src=[REF(src)];task=nullify;'>Nullify</a>"
else
temp_html += "<span class='linkOff'>Nullify</span>"
temp_html += "</div></div>"
return temp_html
/obj/machinery/computer/scan_consolenew/Topic(href, href_list)
if(..())
@@ -340,13 +547,16 @@
radstrength = WRAP(num, 1, RADIATION_STRENGTH_MAX+1)
if("screen")
current_screen = href_list["text"]
if("rejuv")
if(viable_occupant && viable_occupant.reagents)
var/potassiodide_amount = viable_occupant.reagents.get_reagent_amount("potass_iodide")
var/can_add = max(min(REJUVENATORS_MAX - potassiodide_amount, REJUVENATORS_INJECT), 0)
viable_occupant.reagents.add_reagent("potass_iodide", can_add)
if("scramble")
if(viable_occupant && (scrambleready < world.time))
viable_occupant.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA))
viable_occupant.dna.generate_dna_blocks()
scrambleready = world.time + SCRAMBLE_TIMEOUT
to_chat(usr,"<span class'notice'>DNA scrambled.</span>")
viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER*50/(connected.damage_coeff ** 2)
if("setbufferlabel")
var/text = sanitize(input(usr, "Input a new label:", "Input an Text", null) as text|null)
var/text = sanitize(input(usr, "Input a new label:", "Input a Text", null) as text|null)
if(num && text)
num = CLAMP(num, 1, NUMBER_OF_BUFFERS)
var/list/buffer_slot = buffer[num]
@@ -358,7 +568,6 @@
buffer[num] = list(
"label"="Buffer[num]:[viable_occupant.real_name]",
"UI"=viable_occupant.dna.uni_identity,
"SE"=viable_occupant.dna.struc_enzymes,
"UE"=viable_occupant.dna.unique_enzymes,
"name"=viable_occupant.real_name,
"blood_type"=viable_occupant.dna.blood_type
@@ -372,8 +581,6 @@
if("transferbuffer")
if(num && viable_occupant)
switch(href_list["text"]) //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove
if("se")
apply_buffer(SCANNER_ACTION_SE,num)
if("ui")
apply_buffer(SCANNER_ACTION_UI,num)
if("ue")
@@ -387,28 +594,6 @@
if(istype(buffer_slot))
var/obj/item/dnainjector/timed/I
switch(href_list["text"])
if("se")
if(buffer_slot["SE"])
I = new /obj/item/dnainjector/timed(loc)
var/powers = 0
for(var/datum/mutation/human/HM in GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations)
if(HM.check_block_string(buffer_slot["SE"]))
I.add_mutations.Add(HM)
if(HM in GLOB.good_mutations)
powers += 1
if(HM in GLOB.bad_mutations + GLOB.not_good_mutations)
powers -= 1 //To prevent just unlocking everything to get all powers to a syringe for max tech
else
I.remove_mutations.Add(HM)
var/time_coeff
for(var/datum/mutation/human/HM in I.add_mutations)
if(!time_coeff)
time_coeff = HM.time_coeff
continue
time_coeff = min(time_coeff,HM.time_coeff)
if(connected)
I.duration = I.duration * time_coeff * connected.damage_coeff
I.damage_coeff = connected.damage_coeff
if("ui")
if(buffer_slot["UI"])
I = new /obj/item/dnainjector/timed(loc)
@@ -447,7 +632,7 @@
if("setdelayed")
if(num)
delayed_action = list("action"=text2num(href_list["delayaction"]),"buffer"=num)
if("pulseui","pulsese")
if("pulseui")
if(num && viable_occupant && connected)
radduration = WRAP(radduration, 1, RADIATION_DURATION_MAX+1)
radstrength = WRAP(radstrength, 1, RADIATION_STRENGTH_MAX+1)
@@ -459,7 +644,7 @@
ui_interact(usr)
sleep(radduration*10)
current_screen = "mainmenu"
current_screen = "ui"
if(viable_occupant && connected && connected.occupant==viable_occupant)
viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation
@@ -480,35 +665,173 @@
viable_occupant.dna.uni_identity = copytext(viable_occupant.dna.uni_identity, 1, num) + hex + copytext(viable_occupant.dna.uni_identity, num+1, 0)
viable_occupant.updateappearance(mutations_overlay_update=1)
if("pulsese")
var/len = length(viable_occupant.dna.struc_enzymes)
num = WRAP(num, 1, len+1)
num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len)
var/block = round((num-1)/DNA_BLOCK_SIZE)+1
var/subblock = num - block*DNA_BLOCK_SIZE
last_change = "SE #[block]-[subblock]; "
var/hex = copytext(viable_occupant.dna.struc_enzymes, num, num+1)
last_change += "[hex]"
hex = scramble(hex, radstrength, radduration)
last_change += "->[hex]"
viable_occupant.dna.struc_enzymes = copytext(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext(viable_occupant.dna.struc_enzymes, num+1, 0)
viable_occupant.domutcheck()
else
current_screen = "mainmenu"
if(connected)
connected.locked = locked_state
if("inspect")
if(viable_occupant)
var/list/mutations = get_mutation_list(TRUE)
if(current_mutation == mutations[num])
current_mutation = null
else
current_mutation = mutations[num]
if("inspectstorage")
current_storage = num
current_screen = "info"
if("savemut")
if(viable_occupant)
var/succes
if(LAZYLEN(stored_mutations) < max_storage)
var/mutation = text2path(href_list["path"])
if(ispath(mutation, /datum/mutation/human)) //sanity checks
var/datum/mutation/human/HM = viable_occupant.dna.get_mutation(mutation)
if(HM)
var/datum/mutation/human/A = new HM.type()
A.copy_mutation(HM)
succes = TRUE
stored_mutations += A
to_chat(usr,"<span class='notice'>Mutation succesfully stored.</span>")
if(!succes) //we can exactly return here
to_chat(usr,"<span class='warning'>Mutation storage is full.</span>")
if("deletemut")
var/datum/mutation/human/HM = stored_mutations[num]
if(HM)
stored_mutations.Remove(HM)
qdel(HM)
current_screen = "mutations"
if("activator")
if(injectorready < world.time)
var/mutation = text2path(href_list["path"])
if(ispath(mutation, /datum/mutation/human))
var/datum/mutation/human/HM = get_valid_mutation(mutation)
if(HM)
var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc)
I.add_mutations += new HM.type (copymut = HM)
I.name = "[HM.name] activator"
I.research = TRUE
if(connected)
I.damage_coeff = connected.damage_coeff*4
injectorready = world.time + INJECTOR_TIMEOUT * (1 - 0.1 * connected.precision_coeff) //precision_coeff being the matter bin rating
else
injectorready = world.time + INJECTOR_TIMEOUT
if("mutator")
if(injectorready < world.time)
var/mutation = text2path(href_list["path"])
if(ispath(mutation, /datum/mutation/human))
var/datum/mutation/human/HM = get_valid_mutation(mutation)
if(HM)
var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc)
I.add_mutations += new HM.type (copymut = HM)
I.doitanyway = TRUE
I.name = "[HM.name] injector"
if(connected)
I.damage_coeff = connected.damage_coeff
injectorready = world.time + INJECTOR_TIMEOUT * 5 * (1 - 0.1 * connected.precision_coeff)
else
injectorready = world.time + INJECTOR_TIMEOUT * 5
if("nullify")
if(viable_occupant)
var/datum/mutation/human/A = viable_occupant.dna.get_mutation(current_mutation)
if(A && (!viable_occupant.dna.mutation_in_sequence(current_mutation) || A.scrambled))
viable_occupant.dna.remove_mutation(current_mutation)
current_screen = "mainmenu"
current_mutation = null
if("pulsegene")
if(current_screen != "info")
var/path = text2path(href_list["path"])
if(viable_occupant && num && (path in viable_occupant.dna.mutation_index))
var/list/genes = list("A","T","G","C","X")
if(jokerready < world.time)
genes += "JOKER"
var/sequence = GET_GENE_STRING(path, viable_occupant.dna)
var/original = sequence[num]
var/new_gene = input("From [original] to-", "New block", original) as null|anything in genes
if(!new_gene)
new_gene = original
if(viable_occupant == get_viable_occupant()) //No cheesing
if((new_gene == "JOKER") && (jokerready < world.time))
var/true_genes = GET_SEQUENCE(current_mutation)
new_gene = true_genes[num]
jokerready = world.time + JOKER_TIMEOUT - (JOKER_UPGRADE * (connected.precision_coeff-1))
sequence = copytext(sequence, 1, num) + new_gene + copytext(sequence, num+1, length(sequence)+1)
viable_occupant.dna.mutation_index[path] = sequence
viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER/connected.damage_coeff
viable_occupant.domutcheck()
if("exportdiskmut")
if(diskette && !diskette.read_only)
var/path = text2path(href_list["path"])
if(ispath(path, /datum/mutation/human))
var/datum/mutation/human/A = get_valid_mutation(path)
if(A && diskette && (LAZYLEN(diskette.mutations) < diskette.max_mutations))
var/datum/mutation/human/HM = new A.type()
diskette.mutations += HM
HM.copy_mutation(A)
to_chat(usr, "<span class='notice'>Succesfully written [A.name] to [diskette.name].</span>")
if("deletediskmut")
if(diskette && !diskette.read_only)
if(num && (LAZYLEN(diskette.mutations) >= num))
var/datum/mutation/human/A = diskette.mutations[num]
diskette.mutations.Remove(A)
qdel(A)
if("importdiskmut")
if(diskette && (LAZYLEN(diskette.mutations) >= num))
if(LAZYLEN(stored_mutations) < max_storage)
var/datum/mutation/human/A = diskette.mutations[num]
var/datum/mutation/human/HM = new A.type()
HM.copy_mutation(A)
stored_mutations += HM
to_chat(usr,"<span class='notice'>Succesfully written [A.name] to storage.")
if("combine")
if(num && (LAZYLEN(stored_mutations) >= num))
if(LAZYLEN(stored_mutations) < max_storage)
var/datum/mutation/human/A = stored_mutations[num]
var/path = A.type
if(combine)
var/result_path = get_mixed_mutation(combine, path)
if(result_path)
stored_mutations += new result_path()
to_chat(usr, "<span class='boldnotice'>Succes! New mutation has been added to storage</span>")
discover(result_path)
combine = null
else
to_chat(usr, "<span class='warning'>Failed. No mutation could be created.</span>")
combine = null
else
combine = path
to_chat(usr,"<span class='notice'>Selected [A.name] for combining</span>")
else
to_chat(usr, "<span class='warning'>Not enough space to store potential mutation.</span>")
if("ejectchromosome")
if(LAZYLEN(stored_chromosomes) <= num)
var/obj/item/chromosome/CM = stored_chromosomes[num]
CM.forceMove(drop_location())
adjust_item_drop_location(CM)
stored_chromosomes -= CM
if("applychromosome")
if(viable_occupant && (LAZYLEN(viable_occupant.dna.mutations) <= num))
var/datum/mutation/human/HM = viable_occupant.dna.mutations[num]
var/list/chromosomes = list()
for(var/obj/item/chromosome/CM in stored_chromosomes)
if(CM.can_apply(HM))
chromosomes += CM
if(chromosomes.len)
var/obj/item/chromosome/CM = input("Select a chromosome to apply", "Apply Chromosome") as null|anything in sortNames(chromosomes)
if(CM)
to_chat(usr, "<span class='notice'>You apply [CM] to [HM.name].</span>")
stored_chromosomes -= CM
CM.apply(HM)
ui_interact(usr,last_change)
/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs,rd)
/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs,rd) //hexadecimal genetics. dont confuse with scramble button
var/length = length(input)
var/ran = gaussian(0, rs*RADIATION_STRENGTH_MULTIPLIER)
if(ran == 0)
ran = pick(-1,1) //hacky, statistically should almost never happen. 0-change makes people mad though
ran = pick(-1,1) //hacky, statistically should almost never happen. 0-chance makes people mad though
else if(ran < 0)
ran = round(ran) //negative, so floor it
else
@@ -537,10 +860,6 @@
//Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3
//Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove
switch(action)
if(SCANNER_ACTION_SE)
if(buffer_slot["SE"])
viable_occupant.dna.struc_enzymes = buffer_slot["SE"]
viable_occupant.domutcheck()
if(SCANNER_ACTION_UI)
if(buffer_slot["UI"])
viable_occupant.dna.uni_identity = buffer_slot["UI"]
@@ -562,15 +881,54 @@
viable_occupant.dna.blood_type = buffer_slot["blood_type"]
/obj/machinery/computer/scan_consolenew/proc/on_scanner_close()
if(delayed_action && connected)
if(delayed_action && get_viable_occupant())
to_chat(connected.occupant, "<span class='notice'>[src] activates!</span>")
apply_buffer(delayed_action["action"],delayed_action["buffer"])
delayed_action = null //or make it stick + reset button ?
/obj/machinery/computer/scan_consolenew/proc/get_valid_mutation(mutation)
var/mob/living/carbon/C = get_viable_occupant()
if(C)
var/datum/mutation/human/HM = C.dna.get_mutation(mutation)
if(HM)
return HM
for(var/datum/mutation/human/A in stored_mutations)
if(A.type == mutation)
return A
/obj/machinery/computer/scan_consolenew/proc/get_mutation_list(include_storage) //Returns a list of the mutation index types and any extra mutations
var/mob/living/carbon/viable_occupant = get_viable_occupant()
var/list/paths = list()
if(viable_occupant)
for(var/A in viable_occupant.dna.mutation_index)
paths += A
for(var/datum/mutation/human/A in viable_occupant.dna.mutations)
if(A.class == MUT_EXTRA)
paths += A.type
if(include_storage)
for(var/datum/mutation/human/A in stored_mutations)
paths += A.type
return paths
/obj/machinery/computer/scan_consolenew/proc/get_valid_gene_string(mutation)
var/mob/living/carbon/C = get_viable_occupant()
if(C && (mutation in C.dna.mutation_index))
return GET_GENE_STRING(mutation, C.dna)
else if(C && (LAZYLEN(C.dna.mutations)))
for(var/datum/mutation/human/A in C.dna.mutations)
if(A.type == mutation)
return GET_SEQUENCE(mutation)
for(var/datum/mutation/human/A in stored_mutations)
if(A.type == mutation)
return GET_SEQUENCE(mutation)
/obj/machinery/computer/scan_consolenew/proc/discover(mutation)
if(stored_research && !(mutation in stored_research.discovered_mutations))
stored_research.discovered_mutations += mutation
return TRUE
/////////////////////////// DNA MACHINES
#undef INJECTOR_TIMEOUT
#undef REJUVENATORS_INJECT
#undef REJUVENATORS_MAX
#undef NUMBER_OF_BUFFERS
#undef RADIATION_STRENGTH_MAX
+4
View File
@@ -1241,6 +1241,10 @@
icon = 'icons/obj/doors/airlocks/station/medical.dmi'
overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_med
if("Medical Double")
icon = 'icons/obj/doors/airlocks/station/medbaydouble.dmi'
overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
// assemblytype = /obj/structure/door_assembly/door_assembly_med
if("Research")
icon = 'icons/obj/doors/airlocks/station/research.dmi'
overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+3 -3
View File
@@ -26,9 +26,9 @@
var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations)
H.dna.remove_mutation_group(unclean_mutations)
if(efficiency > 5 && prob(20))
H.randmutvg()
H.easy_randmut(POSITIVE)
if(efficiency < 3 && prob(50))
var/mob/M = H.randmutb()
var/mob/M = H.easy_randmut(NEGATIVE+MINOR_NEGATIVE)
if(ismob(M))
H = M
@@ -292,6 +292,6 @@
temp = "<font class='bad'>Cloning cycle already in progress.</font>"
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
else
pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.struc_enzymes, clone_species, dna.features, mob_occupant.faction)
pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.mutation_index, clone_species, dna.features, mob_occupant.faction)
temp = "[mob_occupant.real_name] => <font class='good'>Cloning data sent to pod.</font>"
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
@@ -40,6 +40,8 @@
var/stun_projectile = null //stun mode projectile type
var/stun_projectile_sound
var/nonlethal_projectile //projectile to use in stun mode when the target is resting, if any
var/nonlethal_projectile_sound
var/lethal_projectile = null //lethal mode projectile type
var/lethal_projectile_sound
@@ -533,13 +535,21 @@
T = closer
break
var/mob/living/carbon/C
if(iscarbon(target))
C = target
update_icon()
var/obj/item/projectile/A
//any emagged turrets drains 2x power and uses a different projectile?
if(mode == TURRET_STUN)
use_power(reqpower)
A = new stun_projectile(T)
playsound(loc, stun_projectile_sound, 75, 1)
if(nonlethal_projectile && C && C.resting)
use_power(reqpower*0.5)
A = new nonlethal_projectile(T)
playsound(loc, nonlethal_projectile_sound, 75, 1)
else
use_power(reqpower)
A = new stun_projectile(T)
playsound(loc, stun_projectile_sound, 75, 1)
else
use_power(reqpower * 2)
A = new lethal_projectile(T)
@@ -651,6 +661,8 @@
base_icon_state = "standard"
stun_projectile = /obj/item/projectile/energy/electrode
stun_projectile_sound = 'sound/weapons/taser.ogg'
nonlethal_projectile = /obj/item/projectile/beam/disabler
nonlethal_projectile_sound = 'sound/weapons/taser2.ogg'
lethal_projectile = /obj/item/projectile/beam/laser
lethal_projectile_sound = 'sound/weapons/laser.ogg'
desc = "An energy blaster auto-turret."
@@ -660,6 +672,8 @@
base_icon_state = "standard"
stun_projectile = /obj/item/projectile/energy/electrode
stun_projectile_sound = 'sound/weapons/taser.ogg'
nonlethal_projectile = /obj/item/projectile/beam/disabler
nonlethal_projectile_sound = 'sound/weapons/taser2.ogg'
lethal_projectile = /obj/item/projectile/beam/laser/heavylaser
lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg'
desc = "An energy blaster auto-turret."
@@ -679,6 +693,8 @@
/obj/machinery/porta_turret/ai
faction = list("silicon")
nonlethal_projectile = /obj/item/projectile/beam/disabler
nonlethal_projectile_sound = 'sound/weapons/taser2.ogg'
/obj/machinery/porta_turret/ai/assess_perp(mob/living/carbon/human/perp)
return 10 //AI turrets shoot at everything not in their faction
+5
View File
@@ -134,4 +134,9 @@
/obj/machinery/stasis/crowbar_act(mob/living/user, obj/item/I)
return default_deconstruction_crowbar(I)
/obj/machinery/stasis/attack_robot(mob/user)
if(Adjacent(user) && occupant)
unbuckle_mob(occupant)
else
..()
#undef STASIS_TOGGLE_COOLDOWN
+4 -3
View File
@@ -11,7 +11,8 @@
var/equip_ready = 1 //whether the equipment is ready for use. (or deactivated/activated for static stuff)
var/energy_drain = 0
var/obj/mecha/chassis = null
var/range = MELEE //bitFflags
///Bitflag. Determines the range of the equipment.
var/range = MECHA_MELEE
var/salvageable = 1
var/selectable = 1 // Set to 0 for passive equipment such as mining scanner or armor plates
var/harmful = FALSE //Controls if equipment can be used to attack by a pacifist.
@@ -59,10 +60,10 @@
return txt
/obj/item/mecha_parts/mecha_equipment/proc/is_ranged()//add a distance restricted equipment. Why not?
return range&RANGED
return range&MECHA_RANGED
/obj/item/mecha_parts/mecha_equipment/proc/is_melee()
return range&MELEE
return range&MECHA_MELEE
/obj/item/mecha_parts/mecha_equipment/proc/action_checks(atom/target)
@@ -34,7 +34,7 @@
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
energy_drain = 20
range = MELEE
range = MECHA_MELEE
equip_cooldown = 20
var/mob/living/carbon/patient = null
var/inject_amount = 10
@@ -166,7 +166,7 @@
<font color="[patient.getToxLoss() < 60 ? "#3d5bc3" : "#c51e1e"]"><b>Toxin Content:</b> [patient.getToxLoss()]%</font><br />
<font color="[patient.getFireLoss() < 60 ? "#3d5bc3" : "#c51e1e"]"><b>Burn Severity:</b> [patient.getFireLoss()]%</font><br />
<span class='danger'>[patient.getCloneLoss() ? "Subject appears to have cellular damage." : ""]</span><br />
<span class='danger'>[patient.getBrainLoss() ? "Significant brain damage detected." : ""]</span><br />
<span class='danger'>[patient.getOrganLoss(ORGAN_SLOT_BRAIN) ? "Significant brain damage detected." : ""]</span><br />
<span class='danger'>[length(patient.get_traumas()) ? "Brain Traumas detected." : ""]</span><br />
"}
@@ -252,7 +252,7 @@
var/synth_speed = 5 //[num] reagent units per cycle
energy_drain = 10
var/mode = 0 //0 - fire syringe, 1 - analyze reagents.
range = MELEE|RANGED
range = MECHA_MELEE|MECHA_RANGED
equip_cooldown = 10
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Initialize()
@@ -527,7 +527,7 @@
desc = "Equipment for medical exosuits. Generates a focused beam of medical nanites."
icon_state = "mecha_medigun"
energy_drain = 10
range = MELEE|RANGED
range = MECHA_MELEE|MECHA_RANGED
equip_cooldown = 0
var/obj/item/gun/medbeam/mech/medigun
materials = list(MAT_METAL = 15000, MAT_GLASS = 8000, MAT_PLASMA = 3000, MAT_GOLD = 8000, MAT_DIAMOND = 2000)
@@ -10,7 +10,7 @@
icon_state = "mecha_teleport"
equip_cooldown = 150
energy_drain = 1000
range = RANGED
range = MECHA_RANGED
/obj/item/mecha_parts/mecha_equipment/teleporter/action(atom/target)
if(!action_checks(target) || is_centcom_level(loc.z))
@@ -30,7 +30,7 @@
icon_state = "mecha_wholegen"
equip_cooldown = 50
energy_drain = 300
range = RANGED
range = MECHA_RANGED
/obj/item/mecha_parts/mecha_equipment/wormhole_generator/action(atom/target)
@@ -73,7 +73,7 @@
icon_state = "mecha_teleport"
equip_cooldown = 10
energy_drain = 100
range = MELEE|RANGED
range = MECHA_MELEE|MECHA_RANGED
var/atom/movable/locked
var/mode = 1 //1 - gravsling 2 - gravpush
@@ -284,12 +284,12 @@
if(equip_ready) //disabled
return
var/area/A = get_area(chassis)
var/pow_chan = get_power_channel(A)
var/pow_chan = GET_MUTATION_POWER_channel(A)
if(pow_chan)
return 1000 //making magic
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_power_channel(var/area/A)
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/GET_MUTATION_POWER_channel(var/area/A)
var/pow_chan
if(A)
for(var/c in use_channels)
@@ -350,7 +350,7 @@
name = "exosuit plasma converter"
desc = "An exosuit module that generates power using solid plasma as fuel. Pollutes the environment."
icon_state = "tesla"
range = MELEE
range = MECHA_MELEE
var/coeff = 100
var/obj/item/stack/sheet/fuel
var/max_fuel = 150000
@@ -164,7 +164,7 @@
icon_state = "mecha_exting"
equip_cooldown = 5
energy_drain = 0
range = MELEE|RANGED
range = MECHA_MELEE|MECHA_RANGED
/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize()
. = ..()
@@ -231,7 +231,7 @@
icon_state = "mecha_rcd"
equip_cooldown = 10
energy_drain = 250
range = MELEE|RANGED
range = MECHA_MELEE|MECHA_RANGED
item_flags = NO_MAT_REDEMPTION
var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock.
+3 -3
View File
@@ -1,6 +1,6 @@
/obj/item/mecha_parts/mecha_equipment/weapon
name = "mecha weapon"
range = RANGED
range = MECHA_RANGED
var/projectile
var/fire_sound
var/projectiles_per_shot = 1
@@ -154,7 +154,7 @@
icon_state = "mecha_honker"
energy_drain = 200
equip_cooldown = 150
range = MELEE|RANGED
range = MECHA_MELEE|MECHA_RANGED
kickback = FALSE
/obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/mecha/combat/honker/M)
@@ -405,7 +405,7 @@
icon_state = "mecha_punching_glove"
energy_drain = 250
equip_cooldown = 20
range = MELEE|RANGED
range = MECHA_MELEE|MECHA_RANGED
missile_range = 5
projectile = /obj/item/punching_glove
fire_sound = 'sound/items/bikehorn.ogg'
+5 -19
View File
@@ -1,17 +1,3 @@
#define MECHA_INT_FIRE (1<<0)
#define MECHA_INT_TEMP_CONTROL (1<<1)
#define MECHA_INT_SHORT_CIRCUIT (1<<2)
#define MECHA_INT_TANK_BREACH (1<<3)
#define MECHA_INT_CONTROL_LOST (1<<4)
#define MELEE 1
#define RANGED 2
#define FRONT_ARMOUR 1
#define SIDE_ARMOUR 2
#define BACK_ARMOUR 3
/obj/mecha
name = "mecha"
desc = "Exosuit"
@@ -35,9 +21,9 @@
max_integrity = 300 //max_integrity is base health
var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
armor = list("melee" = 20, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5)
var/list/facing_modifiers = list(MECHA_FRONT_ARMOUR = 1.5, MECHA_SIDE_ARMOUR = 1, MECHA_BACK_ARMOUR = 0.5)
var/obj/item/stock_parts/cell/cell
var/state = 0
var/construction_state = MECHA_LOCKED
var/list/log = new
var/last_message = 0
var/add_req_access = 1
@@ -436,7 +422,7 @@
return
if(user.incapacitated())
return
if(state)
if(construction_state)
occupant_message("<span class='warning'>Maintenance protocols in effect.</span>")
return
if(!get_charge())
@@ -519,7 +505,7 @@
occupant_message("<span class='warning'>Unable to move while connected to the air system port!</span>")
last_message = world.time
return 0
if(state)
if(construction_state)
occupant_message("<span class='danger'>Maintenance protocols in effect.</span>")
return
return domove(direction)
@@ -689,7 +675,7 @@
//Transfer from core or card to mech. Proc is called by mech.
switch(interaction)
if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card.
if(!state) //Mech must be in maint mode to allow carding.
if(construction_state) //Mech must be in maint mode to allow carding.
to_chat(user, "<span class='warning'>[name] must have maintenance protocols active in order to allow a transfer.</span>")
return
AI = occupant
+226 -53
View File
@@ -116,7 +116,7 @@
//9
list(
"key" = /obj/item/stock_parts/cell,
"key" = /obj/item/stock_parts/scanning_module,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Peripherals control module is secured."
@@ -126,10 +126,40 @@
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "The power cell is installed."
"desc" = "Scanner module is installed."
),
//11
list(
"key" = /obj/item/stock_parts/capacitor,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Scanner module is secured."
),
//12
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "Capacitor is installed."
),
//13
list(
"key" = /obj/item/stock_parts/cell,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Capacitor is secured."
),
//14
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "The power cell is installed."
),
//15
list(
"key" = /obj/item/stack/sheet/metal,
"amount" = 5,
@@ -137,21 +167,21 @@
"desc" = "The power cell is secured."
),
//12
//16
list(
"key" = TOOL_WRENCH,
"back_key" = TOOL_CROWBAR,
"desc" = "Internal armor is installed."
),
//13
//17
list(
"key" = TOOL_WELDER,
"back_key" = TOOL_WRENCH,
"desc" = "Internal armor is wrenched."
),
//14
//18
list(
"key" = /obj/item/stack/sheet/plasteel,
"amount" = 5,
@@ -159,14 +189,14 @@
"desc" = "Internal armor is welded."
),
//15
//19
list(
"key" = TOOL_WRENCH,
"back_key" = TOOL_CROWBAR,
"desc" = "External armor is installed."
),
//16
//20
list(
"key" = TOOL_WELDER,
"back_key" = TOOL_WRENCH,
@@ -222,36 +252,56 @@
else
user.visible_message("[user] unfastens the peripherals control module.", "<span class='notice'>You unfasten the peripherals control module.</span>")
if(10)
if(diff==FORWARD)
user.visible_message("[user] secures the scanner module.", "<span class='notice'>You secure the scanner module.</span>")
else
user.visible_message("[user] removes the scanner module from [parent].", "<span class='notice'>You remove the scanner module from [parent].</span>")
if(11)
if(diff==FORWARD)
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] unfastens the scanner module.", "<span class='notice'>You unfasten the scanner module.</span>")
if(12)
if(diff==FORWARD)
user.visible_message("[user] secures [I].", "<span class='notice'>You secure [I].</span>")
else
user.visible_message("[user] removes the capacitor from [parent].", "<span class='notice'>You remove the capacitor from [parent].</span>")
if(13)
if(diff==FORWARD)
user.visible_message("[user] installs [I].", "<span class='notice'>You install [I].</span>")
else
user.visible_message("[user] unsecures the capacitor from [parent].", "<span class='notice'>You unsecure the capacitor from [parent].</span>")
if(14)
if(diff==FORWARD)
user.visible_message("[user] secures the power cell.", "<span class='notice'>You secure the power cell.</span>")
else
user.visible_message("[user] pries the power cell from [parent].", "<span class='notice'>You pry the power cell from [parent].</span>")
if(11)
if(15)
if(diff==FORWARD)
user.visible_message("[user] installs the internal armor layer to [parent].", "<span class='notice'>You install the internal armor layer to [parent].</span>")
else
user.visible_message("[user] unfastens the power cell.", "<span class='notice'>You unfasten the power cell.</span>")
if(12)
if(16)
if(diff==FORWARD)
user.visible_message("[user] secures the internal armor layer.", "<span class='notice'>You secure the internal armor layer.</span>")
else
user.visible_message("[user] pries internal armor layer from [parent].", "<span class='notice'>You pry internal armor layer from [parent].</span>")
if(13)
if(17)
if(diff==FORWARD)
user.visible_message("[user] welds the internal armor layer to [parent].", "<span class='notice'>You weld the internal armor layer to [parent].</span>")
else
user.visible_message("[user] unfastens the internal armor layer.", "<span class='notice'>You unfasten the internal armor layer.</span>")
if(14)
if(18)
if(diff==FORWARD)
user.visible_message("[user] installs the external reinforced armor layer to [parent].", "<span class='notice'>You install the external reinforced armor layer to [parent].</span>")
else
user.visible_message("[user] cuts the internal armor layer from [parent].", "<span class='notice'>You cut the internal armor layer from [parent].</span>")
if(15)
if(19)
if(diff==FORWARD)
user.visible_message("[user] secures the external armor layer.", "<span class='notice'>You secure the external reinforced armor layer.</span>")
else
user.visible_message("[user] pries external armor layer from [parent].", "<span class='notice'>You pry external armor layer from [parent].</span>")
if(16)
if(20)
if(diff==FORWARD)
user.visible_message("[user] welds the external armor layer to [parent].", "<span class='notice'>You weld the external armor layer to [parent].</span>")
else
@@ -629,7 +679,7 @@
//9
list(
"key" = /obj/item/stock_parts/cell,
"key" = /obj/item/stock_parts/scanning_module,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Peripherals control module is secured."
@@ -639,10 +689,40 @@
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "The power cell is installed."
"desc" = "Scanner module is installed."
),
//11
list(
"key" = /obj/item/stock_parts/capacitor,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Scanner module is secured."
),
//12
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "Capacitor is installed."
),
//13
list(
"key" = /obj/item/stock_parts/cell,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Capacitor is secured."
),
//14
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "The power cell is installed."
),
//15
list(
"key" = /obj/item/stack/sheet/plasteel,
"amount" = 5,
@@ -650,21 +730,21 @@
"desc" = "The power cell is secured."
),
//12
//16
list(
"key" = TOOL_WRENCH,
"back_key" = TOOL_CROWBAR,
"desc" = "Internal armor is installed."
),
//13
//17
list(
"key" = TOOL_WELDER,
"back_key" = TOOL_WRENCH,
"desc" = "Internal armor is wrenched."
),
//14
//18
list(
"key" = /obj/item/stack/sheet/plasteel,
"amount" = 5,
@@ -672,7 +752,7 @@
"desc" = "Internal armor is welded."
),
//15
//19
list(
"key" = /obj/item/stack/sheet/plasteel,
"amount" = 5,
@@ -680,14 +760,14 @@
"desc" = "External armor is being installed."
),
//16
//20
list(
"key" = TOOL_WRENCH,
"back_key" = TOOL_CROWBAR,
"desc" = "External armor is installed."
),
//17
//21
list(
"key" = TOOL_WELDER,
"back_key" = TOOL_WRENCH,
@@ -744,41 +824,61 @@
else
user.visible_message("[user] unfastens the peripherals control module.", "<span class='notice'>You unfasten the peripherals control module.</span>")
if(10)
if(diff==FORWARD)
user.visible_message("[user] secures the scanner module.", "<span class='notice'>You secure the scanner module.</span>")
else
user.visible_message("[user] removes the scanner module from [parent].", "<span class='notice'>You remove the scanner module from [parent].</span>")
if(12)
if(diff==FORWARD)
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] unfastens the scanner module.", "<span class='notice'>You unfasten the scanner module.</span>")
if(13)
if(diff==FORWARD)
user.visible_message("[user] secures the capacitor.", "<span class='notice'>You secure the capacitor.</span>")
else
user.visible_message("[user] removes the capacitor from [parent].", "<span class='notice'>You remove the capacitor from [parent].</span>")
if(14)
if(diff==FORWARD)
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the capacitor.", "<span class='notice'>You unfasten the capacitor.</span>")
if(15)
if(diff==FORWARD)
user.visible_message("[user] secures the power cell.", "<span class='notice'>You secure the power cell.</span>")
else
user.visible_message("[user] pries the power cell from [parent].", "<span class='notice'>You pry the power cell from [parent].</span>")
if(11)
if(16)
if(diff==FORWARD)
user.visible_message("[user] installs the internal armor layer to [parent].", "<span class='notice'>You install the internal armor layer to [parent].</span>")
else
user.visible_message("[user] unfastens the power cell.", "<span class='notice'>You unfasten the power cell.</span>")
if(12)
if(17)
if(diff==FORWARD)
user.visible_message("[user] secures the internal armor layer.", "<span class='notice'>You secure the internal armor layer.</span>")
else
user.visible_message("[user] pries internal armor layer from [parent].", "<span class='notice'>You pry internal armor layer from [parent].</span>")
if(13)
if(18)
if(diff==FORWARD)
user.visible_message("[user] welds the internal armor layer to [parent].", "<span class='notice'>You weld the internal armor layer to [parent].</span>")
else
user.visible_message("[user] unfastens the internal armor layer.", "<span class='notice'>You unfasten the internal armor layer.</span>")
if(14)
if(19)
if(diff==FORWARD)
user.visible_message("[user] starts to install the external armor layer to [parent].", "<span class='notice'>You install the external armor layer to [parent].</span>")
else
user.visible_message("[user] cuts the internal armor layer from [parent].", "<span class='notice'>You cut the internal armor layer from [parent].</span>")
if(15)
if(20)
if(diff==FORWARD)
user.visible_message("[user] installs the external reinforced armor layer to [parent].", "<span class='notice'>You install the external reinforced armor layer to [parent].</span>")
else
user.visible_message("[user] removes the external armor from [parent].", "<span class='notice'>You remove the external armor from [parent].</span>")
if(16)
if(21)
if(diff==FORWARD)
user.visible_message("[user] secures the external armor layer.", "<span class='notice'>You secure the external reinforced armor layer.</span>")
else
user.visible_message("[user] pries external armor layer from [parent].", "<span class='notice'>You pry external armor layer from [parent].</span>")
if(17)
if(22)
if(diff==FORWARD)
user.visible_message("[user] welds the external armor layer to [parent].", "<span class='notice'>You weld the external armor layer to [parent].</span>")
else
@@ -825,47 +925,63 @@
list(
"key" = /obj/item/bikehorn
),
//6
list(
"key" = /obj/item/circuitboard/mecha/honker/targeting,
"action" = ITEM_DELETE
),
//7
list(
"key" = /obj/item/bikehorn
),
//8
list(
"key" = /obj/item/stock_parts/cell,
"key" = /obj/item/stock_parts/scanning_module,
"action" = ITEM_MOVE_INSIDE
),
//9
list(
"key" = /obj/item/bikehorn
),
//10
list(
"key" = /obj/item/clothing/mask/gas/clown_hat,
"action" = ITEM_DELETE
"key" = /obj/item/stock_parts/capacitor,
"action" = ITEM_MOVE_INSIDE
),
//11
list(
"key" = /obj/item/bikehorn
),
//12
list(
"key" = /obj/item/stock_parts/cell,
"action" = ITEM_MOVE_INSIDE
),
//13
list(
"key" = /obj/item/bikehorn
),
//14
list(
"key" = /obj/item/clothing/mask/gas/clown_hat,
"action" = ITEM_DELETE
),
//15
list(
"key" = /obj/item/bikehorn
),
//16
list(
"key" = /obj/item/clothing/shoes/clown_shoes,
"action" = ITEM_DELETE
),
//13
//17
list(
"key" = /obj/item/bikehorn
),
@@ -898,8 +1014,12 @@
if(8)
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
if(10)
user.visible_message("[user] puts [I] on [parent].", "<span class='notice'>You put [I] on [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
if(12)
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
if(14)
user.visible_message("[user] puts [I] on [parent].", "<span class='notice'>You put [I] on [parent].</span>")
if(16)
user.visible_message("[user] puts [I] on [parent].", "<span class='notice'>You put [I] on [parent].</span>")
return TRUE
@@ -1629,7 +1749,7 @@
//9
list(
"key" = /obj/item/stock_parts/cell,
"key" = /obj/item/stock_parts/scanning_module,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Peripherals control module is secured."
@@ -1639,32 +1759,65 @@
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "The power cell is installed."
"desc" = "Scanner module is installed."
),
//11
list(
"key" = /obj/item/stock_parts/capacitor,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Scanner module is secured."
),
//12
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "Capacitor is installed."
),
//13
list(
"key" = /obj/item/stock_parts/cell,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Capacitor is secured."
),
//14
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "The power cell is installed."
//15
),
list(
"key" = /obj/item/stack/sheet/metal,
"amount" = 5,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "The power cell is secured."
),
//12
//16
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "The power cell is installed."
),
//17
list(
"key" = TOOL_WRENCH,
"back_key" = TOOL_CROWBAR,
"desc" = "Internal armor is installed."
),
//13
//18
list(
"key" = TOOL_WELDER,
"back_key" = TOOL_WRENCH,
"desc" = "Internal armor is wrenched."
),
//14
//19
list(
"key" = /obj/item/stack/sheet/plasteel,
"amount" = 5,
@@ -1672,14 +1825,14 @@
"desc" = "Internal armor is welded."
),
//15
//20
list(
"key" = TOOL_WRENCH,
"back_key" = TOOL_CROWBAR,
"desc" = "External armor is installed."
),
//16
//21
list(
"key" = TOOL_WELDER,
"back_key" = TOOL_WRENCH,
@@ -1736,36 +1889,56 @@
else
user.visible_message("[user] unfastens the peripherals control module.", "<span class='notice'>You unfasten the peripherals control module.</span>")
if(10)
if(diff==FORWARD)
user.visible_message("[user] secures the scanner module.", "<span class='notice'>You secure the scanner module.</span>")
else
user.visible_message("[user] removes the scanner module from [parent].", "<span class='notice'>You remove the scanner module from [parent].</span>")
if(11)
if(diff==FORWARD)
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] unfastens the scanner module.", "<span class='notice'>You unfasten the scanner module.</span>")
if(12)
if(diff==FORWARD)
user.visible_message("[user] secures the capacitor.", "<span class='notice'>You secure the capacitor.</span>")
else
user.visible_message("[user] removes the capacitor from [parent].", "<span class='notice'>You remove the capacitor from [parent].</span>")
if(13)
if(diff==FORWARD)
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the capacitor.", "<span class='notice'>You unfasten the capacitor.</span>")
if(14)
if(diff==FORWARD)
user.visible_message("[user] secures the power cell.", "<span class='notice'>You secure the power cell.</span>")
else
user.visible_message("[user] pries the power cell from [parent].", "<span class='notice'>You pry the power cell from [parent].</span>")
if(11)
if(15)
if(diff==FORWARD)
user.visible_message("[user] installs the internal armor layer to [parent].", "<span class='notice'>You install the internal armor layer to [parent].</span>")
else
user.visible_message("[user] unfastens the power cell.", "<span class='notice'>You unfasten the power cell.</span>")
if(12)
if(16)
if(diff==FORWARD)
user.visible_message("[user] secures the internal armor layer.", "<span class='notice'>You secure the internal armor layer.</span>")
else
user.visible_message("[user] pries internal armor layer from [parent].", "<span class='notice'>You pry internal armor layer from [parent].</span>")
if(13)
if(17)
if(diff==FORWARD)
user.visible_message("[user] welds the internal armor layer to [parent].", "<span class='notice'>You weld the internal armor layer to [parent].</span>")
else
user.visible_message("[user] unfastens the internal armor layer.", "<span class='notice'>You unfasten the internal armor layer.</span>")
if(14)
if(18)
if(diff==FORWARD)
user.visible_message("[user] installs the external armor layer to [parent].", "<span class='notice'>You install the external reinforced armor layer to [parent].</span>")
else
user.visible_message("[user] cuts the internal armor layer from [parent].", "<span class='notice'>You cut the internal armor layer from [parent].</span>")
if(15)
if(19)
if(diff==FORWARD)
user.visible_message("[user] secures the external armor layer.", "<span class='notice'>You secure the external reinforced armor layer.</span>")
else
user.visible_message("[user] pries the external armor layer from [parent].", "<span class='notice'>You pry the external armor layer from [parent].</span>")
if(16)
if(20)
if(diff==FORWARD)
user.visible_message("[user] welds the external armor layer to [parent].", "<span class='notice'>You weld the external armor layer to [parent].</span>")
else
+17 -17
View File
@@ -1,11 +1,11 @@
/obj/mecha/proc/get_armour_facing(relative_dir)
switch(relative_dir)
if(0) // BACKSTAB!
return facing_modifiers[BACK_ARMOUR]
return facing_modifiers[MECHA_BACK_ARMOUR]
if(45, 90, 270, 315)
return facing_modifiers[SIDE_ARMOUR]
return facing_modifiers[MECHA_SIDE_ARMOUR]
if(225, 180, 135)
return facing_modifiers[FRONT_ARMOUR]
return facing_modifiers[MECHA_FRONT_ARMOUR]
return 1 //always return non-0
/obj/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
@@ -199,23 +199,23 @@
else
to_chat(user, "<span class='warning'>Maintenance protocols disabled by operator.</span>")
else if(istype(W, /obj/item/wrench))
if(state==1)
state = 2
if(construction_state==1)
construction_state = 2
to_chat(user, "<span class='notice'>You undo the securing bolts.</span>")
else if(state==2)
state = 1
else if(construction_state==2)
construction_state = 1
to_chat(user, "<span class='notice'>You tighten the securing bolts.</span>")
return
else if(istype(W, /obj/item/crowbar))
if(state==2)
state = 3
if(construction_state==2)
construction_state = 3
to_chat(user, "<span class='notice'>You open the hatch to the power unit.</span>")
else if(state==3)
state=2
else if(construction_state==3)
construction_state=2
to_chat(user, "<span class='notice'>You close the hatch to the power unit.</span>")
return
else if(istype(W, /obj/item/stack/cable_coil))
if(state == 3 && (internal_damage & MECHA_INT_SHORT_CIRCUIT))
if(construction_state == 3 && (internal_damage & MECHA_INT_SHORT_CIRCUIT))
var/obj/item/stack/cable_coil/CC = W
if(CC.use(2))
clearInternalDamage(MECHA_INT_SHORT_CIRCUIT)
@@ -227,19 +227,19 @@
if(internal_damage & MECHA_INT_TEMP_CONTROL)
clearInternalDamage(MECHA_INT_TEMP_CONTROL)
to_chat(user, "<span class='notice'>You repair the damaged temperature controller.</span>")
else if(state==3 && cell)
else if(construction_state==3 && cell)
cell.forceMove(loc)
cell = null
state = 4
construction_state = 4
to_chat(user, "<span class='notice'>You unscrew and pry out the powercell.</span>")
log_message("Powercell removed")
else if(state==4 && cell)
state=3
else if(construction_state==4 && cell)
construction_state=3
to_chat(user, "<span class='notice'>You screw the cell in place.</span>")
return
else if(istype(W, /obj/item/stock_parts/cell))
if(state==4)
if(construction_state==4)
if(!cell)
if(!user.transferItemToLoc(W, src))
return
+8 -8
View File
@@ -199,8 +199,8 @@
</head>
<body>
[add_req_access?"<a href='?src=[REF(src)];req_access=1;id_card=[REF(id_card)];user=[REF(user)]'>Edit operation keycodes</a>":null]
[maint_access?"<a href='?src=[REF(src)];maint_access=1;id_card=[REF(id_card)];user=[REF(user)]'>[(state>0) ? "Terminate" : "Initiate"] maintenance protocol</a>":null]
[(state>0) ?"<a href='?src=[REF(src)];set_internal_tank_valve=1;user=[REF(user)]'>Set Cabin Air Pressure</a>":null]
[maint_access?"<a href='?src=[REF(src)];maint_access=1;id_card=[REF(id_card)];user=[REF(user)]'>[(construction_state > MECHA_LOCKED) ? "Terminate" : "Initiate"] maintenance protocol</a>":null]
[(construction_state > MECHA_LOCKED) ?"<a href='?src=[REF(src)];set_internal_tank_valve=1;user=[REF(user)]'>Set Cabin Air Pressure</a>":null]
</body>
</html>"}
user << browse(., "window=exosuit_maint_console")
@@ -231,15 +231,15 @@
if(href_list["maint_access"] && maint_access)
var/mob/user = afilter.getMob("user")
if(user)
if(state==0)
state = 1
if(construction_state == MECHA_LOCKED)
construction_state = MECHA_SECURE_BOLTS
to_chat(user, "The securing bolts are now exposed.")
else if(state==1)
state = 0
else if(construction_state == MECHA_SECURE_BOLTS)
construction_state = MECHA_LOCKED
to_chat(user, "The securing bolts are now hidden.")
output_maintenance_dialog(afilter.getObj("id_card"),user)
if(href_list["set_internal_tank_valve"] && state >=1)
if(href_list["set_internal_tank_valve"] && construction_state)
var/mob/user = afilter.getMob("user")
if(user)
var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num
@@ -305,7 +305,7 @@
send_byjax(src.occupant,"exosuit.browser","t_id_upload","[add_req_access?"L":"Unl"]ock ID upload panel")
if(href_list["toggle_maint_access"])
if(state)
if(construction_state)
occupant_message("<span class='danger'>Maintenance protocols in effect</span>")
return
maint_access = !maint_access
+4 -4
View File
@@ -513,12 +513,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
log_combat(user, M, "attacked", "[src.name]", "(INTENT: [uppertext(user.a_intent)])")
M.adjust_blurriness(3)
M.adjust_eye_damage(rand(2,4))
var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if (!eyes)
return
if(eyes.eye_damage >= 10)
M.adjust_blurriness(3)
eyes.applyOrganDamage(rand(2,4))
if(eyes.damage >= 10)
M.adjust_blurriness(15)
if(M.stat != DEAD)
to_chat(M, "<span class='danger'>Your eyes start to bleed profusely!</span>")
@@ -532,7 +532,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
M.adjust_blurriness(10)
M.Unconscious(20)
M.Knockdown(40)
if (prob(eyes.eye_damage - 10 + 1))
if (prob(eyes.damage - 10 + 1))
M.become_blind(EYE_DAMAGE)
to_chat(M, "<span class='danger'>You go blind!</span>")
+2
View File
@@ -153,6 +153,8 @@
/area/centcom,
/area/asteroid,
/area/tdome,
/area/hilbertshotel,
/area/hilbertshotelstorage,
/area/wizard_station
)
for (var/type in SPECIALS)
+7 -6
View File
@@ -17,26 +17,27 @@
/obj/item/organ/body_egg/Insert(var/mob/living/carbon/M, special = 0)
..()
ADD_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC)
START_PROCESSING(SSobj, src)
owner.med_hud_set_status()
INVOKE_ASYNC(src, .proc/AddInfectionImages, owner)
/obj/item/organ/body_egg/Remove(var/mob/living/carbon/M, special = 0)
STOP_PROCESSING(SSobj, src)
if(owner)
REMOVE_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC)
owner.med_hud_set_status()
INVOKE_ASYNC(src, .proc/RemoveInfectionImages, owner)
..()
/obj/item/organ/body_egg/process()
/obj/item/organ/body_egg/on_death()
. = ..()
if(!owner)
return
if(!(src in owner.internal_organs))
Remove(owner)
return
egg_process()
/obj/item/organ/body_egg/on_life()
. = ..()
egg_process()
/obj/item/organ/body_egg/proc/egg_process()
return
+92
View File
@@ -0,0 +1,92 @@
/obj/item/chromosome
name = "blank chromosome"
icon = 'icons/obj/chromosomes.dmi'
icon_state = ""
desc = "A tube holding chromosomic data."
force = 0
w_class = WEIGHT_CLASS_SMALL
var/stabilizer_coeff = 1 //lower is better, affects genetic stability
var/synchronizer_coeff = 1 //lower is better, affects chance to backfire
var/power_coeff = 1 //higher is better, affects "strength"
var/energy_coeff = 1 //lower is better. affects recharge time
var/weight = 5
/obj/item/chromosome/proc/can_apply(datum/mutation/human/HM)
if(!HM || !(HM.can_chromosome == CHROMOSOME_NONE))
return FALSE
if((stabilizer_coeff != 1) && (HM.stabilizer_coeff != -1)) //if the chromosome is 1, we dont change anything. If the mutation is -1, we cant change it. sorry
return TRUE
if((synchronizer_coeff != 1) && (HM.synchronizer_coeff != -1))
return TRUE
if((power_coeff != 1) && (HM.power_coeff != -1))
return TRUE
if((energy_coeff != 1) && (HM.energy_coeff != -1))
return TRUE
/obj/item/chromosome/proc/apply(datum/mutation/human/HM)
if(HM.stabilizer_coeff != -1)
HM.stabilizer_coeff = stabilizer_coeff
if(HM.synchronizer_coeff != -1)
HM.synchronizer_coeff = synchronizer_coeff
if(HM.power_coeff != -1)
HM.power_coeff = power_coeff
if(HM.energy_coeff != -1)
HM.energy_coeff = energy_coeff
HM.can_chromosome = 2
HM.chromosome_name = name
HM.modify()
qdel(src)
/proc/generate_chromosome()
var/static/list/chromosomes
if(!chromosomes)
chromosomes = list()
for(var/A in subtypesof(/obj/item/chromosome))
var/obj/item/chromosome/CM = A
if(!initial(CM.weight))
break
chromosomes[A] = initial(CM.weight)
return pickweight(chromosomes)
/obj/item/chromosome/stabilizer
name = "stabilizer chromosome"
desc = "A chromosome that adjusts to the body to reduce genetic damage by 20%."
icon_state = "stabilizer"
stabilizer_coeff = 0.8
weight = 1
/obj/item/chromosome/synchronizer
name = "synchronizer chromosome"
desc = "A chromosome that gives the mind more controle over the mutation, reducing knockback and downsides by 50%."
icon_state = "synchronizer"
synchronizer_coeff = 0.5
/obj/item/chromosome/power
name = "power chromosome"
desc = "A power chromosome for boosting certain mutation's power by 50%."
icon_state = "power"
power_coeff = 1.5
/obj/item/chromosome/energy
name = "energetic chromosome"
desc = "A chromosome that reduces cooldown on action based mutations by 50%."
icon_state = "energy"
energy_coeff = 0.5
/obj/item/chromosome/reinforcer
name = "reinforcement chromosome"
desc = "Renders the mutation immune to mutadone."
icon_state = "reinforcer"
weight = 3
/obj/item/chromosome/reinforcer/can_apply(datum/mutation/human/HM)
if(!HM || !(HM.can_chromosome == CHROMOSOME_NONE))
return FALSE
return !HM.mutadone_proof
/obj/item/chromosome/reinforcer/apply(datum/mutation/human/HM)
HM.mutadone_proof = TRUE
..()
@@ -65,7 +65,7 @@
build_path = /obj/machinery/dna_scannernew
req_components = list(
/obj/item/stock_parts/scanning_module = 1,
/obj/item/stock_parts/manipulator = 1,
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stack/sheet/glass = 1,
/obj/item/stack/cable_coil = 2)
@@ -407,6 +407,7 @@
/obj/machinery/smartfridge/food = "food",
/obj/machinery/smartfridge/drinks = "drinks",
/obj/machinery/smartfridge/extract = "slimes",
/obj/machinery/smartfridge/organ = "organs",
/obj/machinery/smartfridge/chemistry = "chems",
/obj/machinery/smartfridge/chemistry/virology = "viruses",
/obj/machinery/smartfridge/disks = "disks")
+39 -18
View File
@@ -140,12 +140,10 @@
return ..()
/obj/item/defibrillator/emag_act(mob/user)
if(safety)
safety = FALSE
to_chat(user, "<span class='warning'>You silently disable [src]'s safety protocols with the cryptographic sequencer.</span>")
else
safety = TRUE
to_chat(user, "<span class='notice'>You silently enable [src]'s safety protocols with the cryptographic sequencer.</span>")
. = ..()
safety = !safety
to_chat(user, "<span class='warning'>You silently [safety ? "enable" : "disable"] [src]'s safety protocols with the cryptographic sequencer.</span>")
return TRUE
/obj/item/defibrillator/emp_act(severity)
. = ..()
@@ -442,9 +440,20 @@
do_help(H, user)
/obj/item/twohanded/shockpaddles/proc/can_defib(mob/living/carbon/H)
/obj/item/twohanded/shockpaddles/proc/can_defib(mob/living/carbon/H) //Our code here is different than tg, if it breaks in testing; BUG_PROBABLE_CAUSE
var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart)
if(H.suiciding || H.hellbound || HAS_TRAIT(H, TRAIT_HUSK))
return
if((world.time - H.timeofdeath) > tlimit)
return
if((H.getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (H.getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE))
return
if(!heart || (heart.organ_flags & ORGAN_FAILING))
return
var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain)
return (!H.suiciding && !(HAS_TRAIT(H, TRAIT_NOCLONE)) && !H.hellbound && ((world.time - H.timeofdeath) < tlimit) && (H.getBruteLoss() < 180) && (H.getFireLoss() < 180) && H.getorgan(/obj/item/organ/heart) && BR && !BR.damaged_brain)
if(QDELETED(BR) || BR.brain_death || (BR.organ_flags & ORGAN_FAILING) || H.suiciding)
return
return TRUE
/obj/item/twohanded/shockpaddles/proc/shock_touching(dmg, mob/H)
if(req_defib)
@@ -559,14 +568,12 @@
if(do_after(user, primetimer, target = H)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("<span class='notice'>[user] places [src] on [H]'s chest.</span>", "<span class='warning'>You place [src] on [H]'s chest.</span>")
playsound(src, 'sound/machines/defib_charge.ogg', 75, 0)
var/tplus = world.time - H.timeofdeath
// past this much time the patient is unrecoverable
// (in deciseconds)
// brain damage starts setting in on the patient after
// some time left rotting
// patients rot when they are killed, and die when they are dead
var/tplus = world.time - H.timeofdeath //length of time spent dead
var/tloss = deathtimer
var/total_burn = 0
var/total_brute = 0
var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart)
if(do_after(user, primetimer2, target = H)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
for(var/obj/item/carried_item in H.contents)
if(istype(carried_item, /obj/item/clothing/suit/space))
@@ -591,16 +598,26 @@
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existence. Further attempts futile.</span>"
else if (tplus > tlimit)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile.</span>"
else if (!H.getorgan(/obj/item/organ/heart))
else if (!heart)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing.</span>"
else if (heart.organ_flags & ORGAN_FAILING)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart too damaged.</span>"
else if(total_burn >= 180 || total_brute >= 180)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Further attempts futile.</span>"
else if(H.get_ghost())
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful.</span>"
else
var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain)
if(!BR || BR.damaged_brain)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is missing or damaged beyond point of no return. Further attempts futile.</span>"
if(BR) //BUG_PROBABLE_CAUSE - slight difference between us and tg
if(BR.organ_flags & ORGAN_FAILING)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain tissue is damaged making recovery of patient impossible via defibrillator. Further attempts futile.</span>"
if(BR.brain_death)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain damaged beyond point of no return. Further attempts futile.</span>"
if(H.suiciding || BR.brainmob?.suiciding)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No intelligence pattern can be detected in patient's brain. Further attempts futile.</span>"
else
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is missing. Further attempts futile.</span>"
if(failed)
user.visible_message(failed)
@@ -625,7 +642,7 @@
H.Jitter(100)
SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK)
if(tplus > tloss)
H.adjustBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))), 150)
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, max(0, min(99, ((tlimit - tplus) / tlimit * 100))), 150)
log_combat(user, H, "revived", defib)
if(req_defib)
if(defib.healdisk)
@@ -643,7 +660,11 @@
playsound(src, 'sound/machines/defib_failed.ogg', 50, 0)
else if(H.undergoing_cardiac_arrest())
H.set_heartattack(FALSE)
user.visible_message("<span class='notice'>[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.</span>")
if(!(heart.organ_flags & ORGAN_FAILING))
H.set_heartattack(FALSE)
user.visible_message("<span class='notice'>[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.</span>")
else
user.visible_message("<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed, heart damage detected.</span>")
playsound(src, 'sound/machines/defib_zap.ogg', 50, 1, -1)

Some files were not shown because too many files have changed in this diff Show More