Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into revert-8235-defib-notouch
@@ -112,7 +112,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/turf/closed/mineral/random/snow,
|
||||
/turf/open/floor/plating/asteroid/snow/icemoon,
|
||||
/area/icemoon/underground/unexplored/rivers)
|
||||
"eH" = (
|
||||
/obj/machinery/airalarm{
|
||||
@@ -581,7 +581,7 @@
|
||||
desc = "A horn off of a bicycle. This one has been charred to hell and back, yet somehow it still honks.";
|
||||
name = "charred bike horn"
|
||||
},
|
||||
/turf/closed/mineral/random/snow,
|
||||
/turf/open/floor/plating/asteroid/snow/icemoon,
|
||||
/area/icemoon/underground/unexplored/rivers)
|
||||
"nN" = (
|
||||
/turf/closed/wall/r_wall,
|
||||
@@ -722,6 +722,9 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/living_quarters)
|
||||
"rs" = (
|
||||
/turf/open/floor/plating/asteroid/snow/icemoon,
|
||||
/area/icemoon/underground/unexplored/rivers)
|
||||
"ry" = (
|
||||
/obj/effect/turf_decal/tile/purple{
|
||||
dir = 8
|
||||
@@ -809,6 +812,9 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/mine/living_quarters)
|
||||
"sL" = (
|
||||
/turf/open/transparent/openspace/icemoon,
|
||||
/area/icemoon/underground/unexplored/rivers)
|
||||
"sM" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/storage/firstaid/toxin{
|
||||
@@ -2367,7 +2373,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/turf/closed/mineral/random/snow,
|
||||
/turf/open/floor/plating/asteroid/snow/icemoon,
|
||||
/area/icemoon/underground/unexplored/rivers)
|
||||
"WE" = (
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
@@ -29940,9 +29946,9 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -30199,8 +30205,8 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -30456,8 +30462,8 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -30712,10 +30718,10 @@ ah
|
||||
ah
|
||||
ah
|
||||
nE
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
sL
|
||||
sL
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -30968,11 +30974,11 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
sL
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -31498,8 +31504,8 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -31749,14 +31755,14 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -32005,14 +32011,14 @@ Gw
|
||||
op
|
||||
nd
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
sL
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -32262,15 +32268,15 @@ GI
|
||||
Lg
|
||||
nd
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
sL
|
||||
sL
|
||||
rs
|
||||
op
|
||||
WE
|
||||
op
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -32519,17 +32525,17 @@ GN
|
||||
Lu
|
||||
nd
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
op
|
||||
sa
|
||||
op
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -32782,11 +32788,11 @@ nd
|
||||
op
|
||||
WM
|
||||
op
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -33039,10 +33045,10 @@ Rx
|
||||
ry
|
||||
WO
|
||||
op
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -33296,9 +33302,9 @@ sa
|
||||
sa
|
||||
sa
|
||||
op
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -33553,8 +33559,8 @@ TA
|
||||
sa
|
||||
Xf
|
||||
op
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -33810,8 +33816,8 @@ TA
|
||||
sa
|
||||
sa
|
||||
op
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -37651,8 +37657,8 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
op
|
||||
sa
|
||||
Ho
|
||||
@@ -37908,8 +37914,8 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
op
|
||||
ET
|
||||
HY
|
||||
@@ -38165,18 +38171,18 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
op
|
||||
op
|
||||
Iq
|
||||
op
|
||||
op
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -38422,19 +38428,19 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
op
|
||||
Iv
|
||||
op
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -38680,18 +38686,18 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
op
|
||||
Ho
|
||||
op
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
sL
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -38937,18 +38943,18 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
sL
|
||||
rs
|
||||
op
|
||||
Ho
|
||||
op
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
sL
|
||||
sL
|
||||
sL
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -39193,21 +39199,21 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
sL
|
||||
sL
|
||||
rs
|
||||
op
|
||||
Ho
|
||||
op
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
sL
|
||||
sL
|
||||
sL
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -39444,26 +39450,26 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
er
|
||||
IB
|
||||
er
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
sL
|
||||
sL
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -39700,24 +39706,24 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
er
|
||||
IB
|
||||
er
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
sL
|
||||
sL
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -39957,24 +39963,24 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
eZ
|
||||
fB
|
||||
er
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
er
|
||||
IB
|
||||
er
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
sL
|
||||
sL
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -40213,25 +40219,25 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
er
|
||||
fC
|
||||
er
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
er
|
||||
IF
|
||||
er
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
sL
|
||||
sL
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -40470,25 +40476,25 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
er
|
||||
er
|
||||
fD
|
||||
er
|
||||
er
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
Be
|
||||
er
|
||||
IK
|
||||
er
|
||||
er
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -40743,8 +40749,8 @@ IM
|
||||
gS
|
||||
er
|
||||
eq
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -40983,7 +40989,7 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
eq
|
||||
eH
|
||||
fb
|
||||
@@ -41000,8 +41006,8 @@ IB
|
||||
fC
|
||||
Nt
|
||||
eq
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -41240,7 +41246,7 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
er
|
||||
eI
|
||||
fc
|
||||
@@ -41497,7 +41503,7 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
er
|
||||
eJ
|
||||
fd
|
||||
@@ -41774,8 +41780,8 @@ er
|
||||
Tk
|
||||
NK
|
||||
er
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -42009,7 +42015,7 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
dW
|
||||
ei
|
||||
es
|
||||
@@ -42031,9 +42037,9 @@ Rf
|
||||
Tn
|
||||
NP
|
||||
VC
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -42265,8 +42271,8 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
dX
|
||||
ej
|
||||
et
|
||||
@@ -42288,8 +42294,8 @@ er
|
||||
To
|
||||
UJ
|
||||
er
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -42522,8 +42528,8 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
dX
|
||||
ej
|
||||
eu
|
||||
@@ -42780,7 +42786,7 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
dW
|
||||
ek
|
||||
ew
|
||||
@@ -44069,9 +44075,9 @@ ah
|
||||
ah
|
||||
ah
|
||||
ex
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ex
|
||||
ah
|
||||
ah
|
||||
@@ -44324,13 +44330,13 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -44581,13 +44587,13 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -44839,11 +44845,11 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
@@ -45097,9 +45103,9 @@ ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
rs
|
||||
rs
|
||||
rs
|
||||
ah
|
||||
ah
|
||||
ah
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
"b" = (
|
||||
/turf/closed/mineral/random/high_chance/snow,
|
||||
/area/icemoon/underground/unexplored/rivers)
|
||||
"c" = (
|
||||
/turf/open/floor/plating/asteroid/snow/icemoon,
|
||||
/area/icemoon/underground/unexplored/rivers)
|
||||
"d" = (
|
||||
/turf/closed/wall,
|
||||
/area/icemoon/underground/explored)
|
||||
@@ -19,6 +22,9 @@
|
||||
/obj/item/gps/mining,
|
||||
/turf/open/floor/plating/asteroid/snow/icemoon,
|
||||
/area/icemoon/underground/explored)
|
||||
"G" = (
|
||||
/turf/open/floor/plating/asteroid/snow/icemoon,
|
||||
/area/mine/maintenance)
|
||||
"N" = (
|
||||
/obj/item/flashlight/lantern{
|
||||
on = 1
|
||||
@@ -33,6 +39,22 @@
|
||||
/obj/structure/ladder,
|
||||
/turf/open/floor/plating/asteroid/snow/icemoon,
|
||||
/area/icemoon/underground/explored)
|
||||
"X" = (
|
||||
/obj/machinery/telecomms/relay/preset/mining,
|
||||
/obj/machinery/bluespace_beacon,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/machinery/door/window/eastright{
|
||||
dir = 8;
|
||||
req_access_txt = "48"
|
||||
},
|
||||
/turf/open/floor/circuit,
|
||||
/area/icemoon/underground/explored)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
@@ -39499,9 +39521,9 @@ a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
c
|
||||
c
|
||||
c
|
||||
a
|
||||
a
|
||||
a
|
||||
@@ -40011,13 +40033,13 @@ a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
c
|
||||
e
|
||||
i
|
||||
h
|
||||
h
|
||||
e
|
||||
a
|
||||
c
|
||||
a
|
||||
a
|
||||
a
|
||||
@@ -40268,13 +40290,13 @@ a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
c
|
||||
h
|
||||
h
|
||||
T
|
||||
h
|
||||
h
|
||||
a
|
||||
c
|
||||
a
|
||||
a
|
||||
a
|
||||
@@ -40525,13 +40547,13 @@ a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
c
|
||||
e
|
||||
N
|
||||
h
|
||||
h
|
||||
G
|
||||
e
|
||||
a
|
||||
c
|
||||
a
|
||||
a
|
||||
a
|
||||
@@ -40786,7 +40808,7 @@ a
|
||||
d
|
||||
O
|
||||
h
|
||||
e
|
||||
X
|
||||
d
|
||||
a
|
||||
a
|
||||
@@ -41041,9 +41063,9 @@ a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
c
|
||||
c
|
||||
c
|
||||
a
|
||||
a
|
||||
a
|
||||
|
||||
@@ -681,3 +681,11 @@
|
||||
continue
|
||||
if(istype(D, path))
|
||||
return TRUE
|
||||
|
||||
/proc/safe_json_encode(list/L, default = "")
|
||||
. = default
|
||||
return json_encode(L)
|
||||
|
||||
/proc/safe_json_decode(string, default = list())
|
||||
. = default
|
||||
return json_decode(string)
|
||||
|
||||
@@ -402,7 +402,7 @@
|
||||
for (var/i in GLOB.ai_list)
|
||||
var/mob/living/silicon/ai/aiPlayer = i
|
||||
if(aiPlayer.mind)
|
||||
parts += "<b>[aiPlayer.name]</b> (Played by: <b>[aiPlayer.mind.key]</b>)'s laws [aiPlayer.stat != DEAD ? "at the end of the round" : "when it was <span class='redtext'>deactivated</span>"] were:"
|
||||
parts += "<b>[aiPlayer.name]</b>[aiPlayer.mind.hide_ckey ? "" : " (Played by: <b>[aiPlayer.mind.key]</b>)"]'s laws [aiPlayer.stat != DEAD ? "at the end of the round" : "when it was <span class='redtext'>deactivated</span>"] were:"
|
||||
parts += aiPlayer.laws.get_law_list(include_zeroth=TRUE)
|
||||
|
||||
parts += "<b>Total law changes: [aiPlayer.law_change_counter]</b>"
|
||||
@@ -413,14 +413,14 @@
|
||||
for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots)
|
||||
borg_num--
|
||||
if(robo.mind)
|
||||
robolist += "<b>[robo.name]</b> (Played by: <b>[robo.mind.key]</b>)[robo.stat == DEAD ? " <span class='redtext'>(Deactivated)</span>" : ""][borg_num ?", ":""]<br>"
|
||||
robolist += "<b>[robo.name]</b>[robo.mind.hide_ckey ? "" : " (Played by: <b>[robo.mind.key]</b>)"] [robo.stat == DEAD ? " <span class='redtext'>(Deactivated)</span>" : ""][borg_num ?", ":""]<br>"
|
||||
parts += "[robolist]"
|
||||
if(!borg_spacer)
|
||||
borg_spacer = TRUE
|
||||
|
||||
for (var/mob/living/silicon/robot/robo in GLOB.silicon_mobs)
|
||||
if (!robo.connected_ai && robo.mind)
|
||||
parts += "[borg_spacer?"<br>":""]<b>[robo.name]</b> (Played by: <b>[robo.mind.key]</b>) [(robo.stat != DEAD)? "<span class='greentext'>survived</span> as an AI-less borg!" : "was <span class='redtext'>unable to survive</span> the rigors of being a cyborg without an AI."] Its laws were:"
|
||||
parts += "[borg_spacer?"<br>":""]<b>[robo.name]</b>[robo.mind.hide_ckey ? "" : " (Played by: <b>[robo.mind.key]</b>)"] [(robo.stat != DEAD)? "<span class='greentext'>survived</span> as an AI-less borg!" : "was <span class='redtext'>unable to survive</span> the rigors of being a cyborg without an AI."] Its laws were:"
|
||||
|
||||
if(robo) //How the hell do we lose robo between here and the world messages directly above this?
|
||||
parts += robo.laws.get_law_list(include_zeroth=TRUE)
|
||||
@@ -529,7 +529,7 @@
|
||||
var/jobtext = ""
|
||||
if(ply.assigned_role)
|
||||
jobtext = " the <b>[ply.assigned_role]</b>"
|
||||
var/text = "<b>[ply.key]</b> was <b>[ply.name]</b>[jobtext] and"
|
||||
var/text = "<b>[ply.hide_ckey ? "<b>[ply.name]</b>[jobtext] " : "[ply.key]</b> was <b>[ply.name]</b>[jobtext] and "]"
|
||||
if(ply.current)
|
||||
if(ply.current.stat == DEAD)
|
||||
text += " <span class='redtext'>died</span>"
|
||||
|
||||
@@ -462,16 +462,14 @@
|
||||
else
|
||||
. = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307))
|
||||
|
||||
/proc/fusionpower2text(power) //used when displaying fusion power on analyzers
|
||||
switch(power)
|
||||
if(0 to 5)
|
||||
return "low"
|
||||
if(5 to 20)
|
||||
return "mid"
|
||||
if(20 to 50)
|
||||
return "high"
|
||||
if(50 to INFINITY)
|
||||
return "super"
|
||||
/proc/instability2text(instability) //used when displaying fusion power on analyzers
|
||||
switch(instability)
|
||||
if(0 to 2)
|
||||
return "stable, meaning that its heat will always increase."
|
||||
if(2 to 3)
|
||||
return "metastable, meaning that its heat will trend upwards."
|
||||
if (3 to INFINITY)
|
||||
return "unstable, meaning that its heat will trend downwards."
|
||||
|
||||
/proc/color2hex(color) //web colors
|
||||
if(!color)
|
||||
|
||||
@@ -107,13 +107,8 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
|
||||
/obj/item/toy/eightball = 1,
|
||||
/obj/item/reagent_containers/pill/floorpill = 1,
|
||||
/obj/item/reagent_containers/food/snacks/cannedpeaches/maint = 2,
|
||||
/obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint
|
||||
/obj/item/storage/pill_bottle/penis_enlargement = 2,
|
||||
/obj/item/storage/pill_bottle/breast_enlargement = 2,
|
||||
/obj/item/clothing/shoes/wheelys = 1,
|
||||
/obj/item/clothing/shoes/kindleKicks = 1,
|
||||
/obj/item/autosurgeon/penis = 1,
|
||||
/obj/item/autosurgeon/testicles = 1,
|
||||
/obj/item/storage/box/marshmallow = 2,
|
||||
/obj/item/clothing/gloves/tackler/offbrand = 1,
|
||||
/obj/item/stack/sticky_tape = 1,
|
||||
|
||||
@@ -13,6 +13,7 @@ GLOBAL_LIST_EMPTY(deliverybeacontags) //list of all tags associated with d
|
||||
GLOBAL_LIST_EMPTY(nuke_list)
|
||||
GLOBAL_LIST_EMPTY(alarmdisplay) //list of all machines or programs that can display station alerts
|
||||
GLOBAL_LIST_EMPTY(singularities) //list of all singularities on the station (actually technically all engines)
|
||||
GLOBAL_LIST_EMPTY(grounding_rods) //list of all grounding rods on the station
|
||||
|
||||
GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction datums. Used during chemical reactions
|
||||
GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
var/special_role
|
||||
var/list/restricted_roles = list()
|
||||
|
||||
var/hide_ckey = FALSE //hide ckey from round-end report
|
||||
|
||||
var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button.
|
||||
|
||||
var/linglink
|
||||
@@ -69,6 +71,7 @@
|
||||
///What character we spawned in as- either at roundstart or latejoin, so we know for persistent scars if we ended as the same person or not
|
||||
var/mob/original_character
|
||||
|
||||
|
||||
/datum/mind/New(var/key)
|
||||
skill_holder = new(src)
|
||||
src.key = key
|
||||
@@ -137,6 +140,8 @@
|
||||
if(L.client?.prefs && L.client.prefs.auto_ooc && L.client.prefs.chat_toggles & CHAT_OOC)
|
||||
DISABLE_BITFIELD(L.client.prefs.chat_toggles,CHAT_OOC)
|
||||
|
||||
hide_ckey = current.client?.prefs?.hide_ckey
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_MIND_TRANSFER, new_character, old_character)
|
||||
SEND_SIGNAL(new_character, COMSIG_MOB_ON_NEW_MIND)
|
||||
|
||||
@@ -780,6 +785,7 @@
|
||||
if(!mind.name)
|
||||
mind.name = real_name
|
||||
mind.current = src
|
||||
mind.hide_ckey = client?.prefs?.hide_ckey
|
||||
|
||||
/mob/living/carbon/mind_initialize()
|
||||
..()
|
||||
|
||||
@@ -200,13 +200,15 @@
|
||||
/datum/dynamic_ruleset/latejoin/heretic_smuggler
|
||||
name = "Heretic Smuggler"
|
||||
antag_datum = /datum/antagonist/heretic
|
||||
antag_flag = ROLE_HERETIC
|
||||
antag_flag = "latejoin_heretic"
|
||||
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
restricted_roles = list("AI","Cyborg")
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = 10
|
||||
requirements = list(40,30,20,10,10,10,10,10,10,10)
|
||||
cost = 25
|
||||
requirements = list(60,60,60,55,50,50,50,50,50,50)
|
||||
high_population_requirement = 50
|
||||
property_weights = list("story_potential" = 1, "trust" = -1, "chaos" = 2, "extended" = -1, "valid" = 2)
|
||||
repeatable = TRUE
|
||||
|
||||
//////////////////////////////////////////////
|
||||
|
||||
@@ -538,7 +538,7 @@
|
||||
name = "Slaughter Demon"
|
||||
config_tag = "slaughter_demon"
|
||||
antag_flag = ROLE_ALIEN
|
||||
enemy_roles = list("Security Officer","Shaft Miner","Head of Security","Captain","Janitor","AI","Cyborg")
|
||||
enemy_roles = list("Security Officer","Shaft Miner","Head of Security","Captain","Janitor","AI","Cyborg","Bartender")
|
||||
required_enemies = list(3,2,2,2,2,1,1,1,1,0)
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
|
||||
@@ -151,16 +151,18 @@
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/heretics
|
||||
name = "Heretics"
|
||||
antag_flag = ROLE_HERETIC
|
||||
antag_flag = "heretic"
|
||||
antag_datum = /datum/antagonist/heretic
|
||||
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
restricted_roles = list("AI", "Cyborg")
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
cost = 20
|
||||
cost = 25
|
||||
scaling_cost = 15
|
||||
requirements = list(50,45,45,40,35,20,20,15,10,10)
|
||||
requirements = list(60,60,60,55,50,50,50,50,50,50)
|
||||
property_weights = list("story_potential" = 1, "trust" = -1, "chaos" = 2, "extended" = -1, "valid" = 2)
|
||||
antag_cap = list(1,1,1,1,2,2,2,2,3,3)
|
||||
high_population_requirement = 50
|
||||
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/heretics/pre_execute()
|
||||
|
||||
@@ -22,14 +22,14 @@
|
||||
var/datum/game_mode/dynamic/mode = null // Cached as soon as it's made, by dynamic.
|
||||
|
||||
/**
|
||||
Property weights are:
|
||||
Property weights are added to the config weight of the ruleset. They are:
|
||||
"story_potential" -- essentially how many different ways the antag can be played.
|
||||
"trust" -- How much it makes the crew trust each other. Negative values means they're suspicious. Team antags are like this.
|
||||
"chaos" -- How chaotic it makes the round. Has some overlap with "valid" and somewhat contradicts "extended".
|
||||
"valid" -- How likely the non-antag-enemy crew are to get involved, e.g. nukies encouraging the warden to
|
||||
let everyone into the armory, wizard moving around and being a nuisance, nightmare busting lights.
|
||||
"extended" -- How much the antag is conducive to a long round. Nukies and cults are bad for this; Wizard is less bad; and so on.
|
||||
"conversion" -- Basically a bool. Conversion antags, well, convert. It's its own class for a good reason.
|
||||
"conversion" -- Basically a bool. Conversion antags, well, convert. It's in its own class 'cause people kinda hate conversion.
|
||||
*/
|
||||
|
||||
/datum/dynamic_storyteller/proc/start_injection_cooldowns()
|
||||
@@ -126,8 +126,9 @@ Property weights are:
|
||||
for(var/property in property_weights)
|
||||
if(property in rule.property_weights) // just treat it as 0 if it's not in there
|
||||
property_weight += rule.property_weights[property] * property_weights[property]
|
||||
if(property_weight > 0)
|
||||
drafted_rules[rule] = rule.get_weight() * property_weight * rule.weight_mult
|
||||
var/calced_weight = (rule.get_weight() + property_weight) * rule.weight_mult
|
||||
if(calced_weight > 0) // negatives in the list might cause problems
|
||||
drafted_rules[rule] = calced_weight
|
||||
return drafted_rules
|
||||
|
||||
/datum/dynamic_storyteller/proc/midround_draft()
|
||||
@@ -144,21 +145,24 @@ Property weights are:
|
||||
for(var/property in property_weights)
|
||||
if(property in rule.property_weights) // just treat it as 0 if it's not in there
|
||||
property_weight += rule.property_weights[property] * property_weights[property]
|
||||
if(property_weight > 0)
|
||||
var/threat_weight = 1
|
||||
if(!(rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET)) // makes the traitor rulesets always possible anyway
|
||||
var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat))
|
||||
/* Basically, the closer the cost is to the current threat-level-away-from-threat, the more likely it is to
|
||||
pick this particular ruleset.
|
||||
Let's use a toy example: there's 60 threat level and 10 threat spent.
|
||||
We want to pick a ruleset that's close to that, so we run the below equation, on two rulesets.
|
||||
Ruleset 1 has 30 cost, ruleset 2 has 5 cost.
|
||||
When we do the math, ruleset 1's threat_weight is 0.538, and ruleset 2's is 0.238, meaning ruleset 1
|
||||
is 2.26 times as likely to be picked, all other things considered.
|
||||
Of course, we don't want it to GUARANTEE the closest, that's no fun, so it's just a weight.
|
||||
*/
|
||||
threat_weight = abs(1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0)))
|
||||
drafted_rules[rule] = rule.get_weight() * property_weight * rule.weight_mult * threat_weight
|
||||
var/threat_weight = 1
|
||||
if(!(rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET)) // makes the traitor rulesets always possible anyway
|
||||
var/cost_difference = rule.cost-(mode.threat_level-mode.threat)
|
||||
/* Basically, the closer the cost is to the current threat-level-away-from-threat, the more likely it is to
|
||||
pick this particular ruleset.
|
||||
Let's use a toy example: there's 60 threat level and 10 threat spent.
|
||||
We want to pick a ruleset that's close to that, so we run the below equation, on two rulesets.
|
||||
Ruleset 1 has 30 cost, ruleset 2 has 5 cost.
|
||||
When we do the math, ruleset 1's threat_weight is 0.538, and ruleset 2's is 0.238, meaning ruleset 1
|
||||
is 2.26 times as likely to be picked, all other things considered.
|
||||
Of course, we don't want it to GUARANTEE the closest, that's no fun, so it's just a weight.
|
||||
*/
|
||||
threat_weight = abs(1-abs(1-LOGISTIC_FUNCTION(2,0.05,abs(cost_difference),0)))
|
||||
if(cost_difference > 0)
|
||||
threat_weight /= (1+(cost_difference*0.1))
|
||||
var/calced_weight = (rule.get_weight() + property_weight) * rule.weight_mult * threat_weight
|
||||
if(calced_weight > 0)
|
||||
drafted_rules[rule] = calced_weight
|
||||
return drafted_rules
|
||||
|
||||
/datum/dynamic_storyteller/proc/latejoin_draft(mob/living/carbon/human/newPlayer)
|
||||
@@ -180,12 +184,15 @@ Property weights are:
|
||||
for(var/property in property_weights)
|
||||
if(property in rule.property_weights)
|
||||
property_weight += rule.property_weights[property] * property_weights[property]
|
||||
if(property_weight > 0)
|
||||
var/threat_weight = 1
|
||||
if(!(rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))
|
||||
var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat))
|
||||
threat_weight = 1-abs(1-(LOGISTIC_FUNCTION(2,0.05,cost_difference,0)))
|
||||
drafted_rules[rule] = rule.get_weight() * property_weight * rule.weight_mult * threat_weight
|
||||
var/threat_weight = 1
|
||||
if(!(rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))
|
||||
var/cost_difference = rule.cost-(mode.threat_level-mode.threat)
|
||||
threat_weight = 1-abs(1-(LOGISTIC_FUNCTION(2,0.05,abs(cost_difference),0)))
|
||||
if(cost_difference > 0)
|
||||
threat_weight /= (1+(cost_difference*0.1))
|
||||
var/calced_weight = (rule.get_weight() + property_weight) * rule.weight_mult * threat_weight
|
||||
if(calced_weight > 0)
|
||||
drafted_rules[rule] = calced_weight
|
||||
return drafted_rules
|
||||
|
||||
/datum/dynamic_storyteller/proc/event_draft()
|
||||
@@ -196,8 +203,9 @@ Property weights are:
|
||||
for(var/property in property_weights)
|
||||
if(property in rule.property_weights)
|
||||
property_weight += rule.property_weights[property] * property_weights[property]
|
||||
if(property_weight > 0)
|
||||
drafted_rules[rule] = rule.get_weight() + property_weight * rule.weight_mult
|
||||
var/calced_weight = (rule.get_weight() + property_weight) * rule.weight_mult
|
||||
if(calced_weight > 0)
|
||||
drafted_rules[rule] = calced_weight
|
||||
return drafted_rules
|
||||
|
||||
|
||||
@@ -327,12 +335,6 @@ Property weights are:
|
||||
flags = USE_PREV_ROUND_WEIGHTS
|
||||
property_weights = list("story_potential" = 2)
|
||||
|
||||
|
||||
/datum/dynamic_storyteller/story/calculate_threat()
|
||||
var/current_time = (world.time / SSautotransfer.targettime)*180
|
||||
mode.threat_level = round((mode.initial_threat_level*(sin(current_time)/2)+0.75),0.1)
|
||||
return ..()
|
||||
|
||||
/datum/dynamic_storyteller/classic
|
||||
name = "Classic"
|
||||
config_tag = "classic"
|
||||
|
||||
@@ -74,12 +74,6 @@
|
||||
/obj/machinery/door/firedoor/Bumped(atom/movable/AM)
|
||||
if(panel_open || operating || welded)
|
||||
return
|
||||
if(ismob(AM))
|
||||
var/mob/user = AM
|
||||
if(density && !welded && !operating && !(stat & NOPOWER) && (!density || allow_hand_open(user)))
|
||||
add_fingerprint(user)
|
||||
open()
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/door/firedoor/power_change()
|
||||
@@ -90,14 +84,6 @@
|
||||
stat |= NOPOWER
|
||||
|
||||
/obj/machinery/door/firedoor/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
if(!welded && !operating && !(stat & NOPOWER) && (!density || allow_hand_open(user)))
|
||||
add_fingerprint(user)
|
||||
if(density)
|
||||
emergency_close_timer = world.time + 30 // prevent it from instaclosing again if in space
|
||||
open()
|
||||
else
|
||||
close()
|
||||
return TRUE
|
||||
if(operating || !density)
|
||||
return
|
||||
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
/obj/mecha/proc/get_armour_facing(relative_dir)
|
||||
switch(relative_dir)
|
||||
if(0) // BACKSTAB!
|
||||
if(180) // BACKSTAB!
|
||||
return facing_modifiers[BACK_ARMOUR]
|
||||
if(45, 90, 270, 315)
|
||||
return facing_modifiers[SIDE_ARMOUR]
|
||||
if(225, 180, 135)
|
||||
if(0, 45) // direct or 45 degrees off
|
||||
return facing_modifiers[FRONT_ARMOUR]
|
||||
return 1 //always return non-0
|
||||
return facing_modifiers[SIDE_ARMOUR] //if its not a front hit or back hit then assume its from the side
|
||||
|
||||
/obj/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
||||
. = ..()
|
||||
@@ -43,7 +41,7 @@
|
||||
break
|
||||
|
||||
if(attack_dir)
|
||||
var/facing_modifier = get_armour_facing(dir2angle(attack_dir) - dir2angle(src))
|
||||
var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir)))
|
||||
booster_damage_modifier /= facing_modifier
|
||||
booster_deflection_modifier *= facing_modifier
|
||||
if(prob(deflect_chance * booster_deflection_modifier))
|
||||
|
||||
@@ -285,7 +285,7 @@
|
||||
S.rabid = TRUE
|
||||
S.amount_grown = SLIME_EVOLUTION_THRESHOLD
|
||||
S.Evolve()
|
||||
offer_control(S)
|
||||
offer_control(S,POLL_IGNORE_SENTIENCE_POTION)
|
||||
|
||||
/////////////////////
|
||||
|
||||
|
||||
@@ -28,39 +28,37 @@
|
||||
/// triggered on wield of two handed item
|
||||
/obj/item/broom/proc/on_wield(obj/item/source, mob/user)
|
||||
to_chat(user, "<span class='notice'>You brace the [src] against the ground in a firm sweeping stance.</span>")
|
||||
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/sweep)
|
||||
RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, .proc/sweep)
|
||||
|
||||
/// triggered on unwield of two handed item
|
||||
/obj/item/broom/proc/on_unwield(obj/item/source, mob/user)
|
||||
UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
|
||||
UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE)
|
||||
|
||||
/obj/item/broom/afterattack(atom/A, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!proximity)
|
||||
return
|
||||
sweep(user, A, FALSE)
|
||||
sweep(user, A)
|
||||
|
||||
/obj/item/broom/proc/sweep(mob/user, atom/A, moving = TRUE)
|
||||
var/turf/target
|
||||
if (!moving)
|
||||
if (isturf(A))
|
||||
target = A
|
||||
else
|
||||
target = A.loc
|
||||
else
|
||||
target = user.loc
|
||||
if (!isturf(target))
|
||||
/obj/item/broom/proc/sweep(datum/source, atom/newLoc)
|
||||
if(!ismob(source) || !isturf(newLoc) || (get_dist(source, newLoc) > 1))
|
||||
return
|
||||
if (locate(/obj/structure/table) in target.contents)
|
||||
var/turf/target = newLoc
|
||||
var/atom/movable/AM
|
||||
var/sweep_dir = get_dir(source, target)
|
||||
if(!sweep_dir)
|
||||
return
|
||||
for(var/i in target.contents)
|
||||
AM = i
|
||||
if(AM.density) // eh good enough heuristic check
|
||||
return
|
||||
var/i = 0
|
||||
for(var/obj/item/garbage in target.contents)
|
||||
if(!garbage.anchored)
|
||||
garbage.Move(get_step(target, user.dir), user.dir)
|
||||
i++
|
||||
if(i >= 20)
|
||||
step(garbage, sweep_dir)
|
||||
if(++i > 20)
|
||||
break
|
||||
if(i >= 1)
|
||||
if(i)
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1)
|
||||
|
||||
/obj/item/broom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) //bless you whoever fixes this copypasta
|
||||
|
||||
@@ -0,0 +1,207 @@
|
||||
/obj/item/storage/portable_chem_mixer
|
||||
name = "Portable Chemical Mixer"
|
||||
desc = "A portable device that dispenses and mixes chemicals. All necessary reagents need to be supplied with beakers. A label indicates that a screwdriver is required to open it for refills. This device can be worn on a belt. The letters 'S&T' are imprinted on the side."
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "portablechemicalmixer_open"
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
custom_price = 2000
|
||||
custom_premium_price = 2000
|
||||
|
||||
var/obj/item/reagent_containers/beaker = null ///Creating an empty slot for a beaker that can be added to dispense into
|
||||
var/amount = 30 ///The amount of reagent that is to be dispensed currently
|
||||
|
||||
var/list/dispensable_reagents = list() ///List in which all currently dispensable reagents go
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/ComponentInitialize()
|
||||
. = ..()
|
||||
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
|
||||
STR.max_combined_w_class = 200
|
||||
STR.max_items = 50
|
||||
STR.insert_preposition = "in"
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/reagent_containers/glass/beaker,
|
||||
))
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/Destroy()
|
||||
QDEL_NULL(beaker)
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/ex_act(severity, target)
|
||||
if(severity < 3)
|
||||
..()
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/attackby(obj/item/I, mob/user, params)
|
||||
var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
|
||||
if (I.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, !locked)
|
||||
if (!locked)
|
||||
update_contents()
|
||||
if (locked)
|
||||
replace_beaker(user)
|
||||
update_icon()
|
||||
I.play_tool_sound(src, 50)
|
||||
return
|
||||
|
||||
else if (istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container() && locked)
|
||||
var/obj/item/reagent_containers/B = I
|
||||
. = TRUE //no afterattack
|
||||
if(!user.transferItemToLoc(B, src))
|
||||
return
|
||||
replace_beaker(user, B)
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Updates the contents of the portable chemical mixer
|
||||
*
|
||||
* A list of dispensable reagents is created by iterating through each source beaker in the portable chemical beaker and reading its contents
|
||||
*/
|
||||
/obj/item/storage/portable_chem_mixer/proc/update_contents()
|
||||
dispensable_reagents.Cut()
|
||||
|
||||
for (var/obj/item/reagent_containers/glass/beaker/B in contents)
|
||||
var/key = B.reagents.get_master_reagent_id()
|
||||
if (!(key in dispensable_reagents))
|
||||
dispensable_reagents[key] = list()
|
||||
dispensable_reagents[key]["reagents"] = list()
|
||||
dispensable_reagents[key]["reagents"] += B.reagents
|
||||
|
||||
return
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/update_icon_state()
|
||||
var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
|
||||
if (!locked)
|
||||
icon_state = "portablechemicalmixer_open"
|
||||
else if (beaker)
|
||||
icon_state = "portablechemicalmixer_full"
|
||||
else
|
||||
icon_state = "portablechemicalmixer_empty"
|
||||
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/AltClick(mob/living/user)
|
||||
var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
|
||||
if (!locked)
|
||||
return ..()
|
||||
if(!can_interact(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return
|
||||
replace_beaker(user)
|
||||
update_icon()
|
||||
|
||||
/**
|
||||
* Replaces the beaker of the portable chemical mixer with another beaker, or simply adds the new beaker if none is in currently
|
||||
*
|
||||
* Checks if a valid user and a valid new beaker exist and attempts to replace the current beaker in the portable chemical mixer with the one in hand. Simply places the new beaker in if no beaker is currently loaded
|
||||
* Arguments:
|
||||
* * mob/living/user - The user who is trying to exchange beakers
|
||||
* * obj/item/reagent_containers/new_beaker - The new beaker that the user wants to put into the device
|
||||
*/
|
||||
/obj/item/storage/portable_chem_mixer/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
|
||||
if(!user)
|
||||
return FALSE
|
||||
if(beaker)
|
||||
user.put_in_hands(beaker)
|
||||
beaker = null
|
||||
if(new_beaker)
|
||||
beaker = new_beaker
|
||||
return TRUE
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/attack_hand(mob/user)
|
||||
if (loc != user)
|
||||
return ..()
|
||||
if(SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED))
|
||||
ui_interact(user)
|
||||
return
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/attack_self(mob/user)
|
||||
if(loc == user)
|
||||
var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
|
||||
if (locked)
|
||||
ui_interact(user)
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The portable chemical mixer is currently open and its contents can be accessed.</span>")
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/MouseDrop(obj/over_object)
|
||||
. = ..()
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "PortableChemMixer", name)
|
||||
if(user.hallucinating())
|
||||
// to not ruin the immersion by constantly changing the fake chemicals
|
||||
ui.set_autoupdate(FALSE)
|
||||
ui.open()
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["amount"] = amount
|
||||
data["isBeakerLoaded"] = beaker ? 1 : 0
|
||||
data["beakerCurrentVolume"] = beaker ? beaker.reagents.total_volume : null
|
||||
data["beakerMaxVolume"] = beaker ? beaker.volume : null
|
||||
data["beakerTransferAmounts"] = beaker ? beaker.possible_transfer_amounts : null
|
||||
var/chemicals[0]
|
||||
var/is_hallucinating = user.hallucinating()
|
||||
if(user.hallucinating())
|
||||
is_hallucinating = TRUE
|
||||
for(var/re in dispensable_reagents)
|
||||
var/value = dispensable_reagents[re]
|
||||
var/datum/reagent/temp = GLOB.chemical_reagents_list[re]
|
||||
if(temp)
|
||||
var/chemname = temp.name
|
||||
var/total_volume = 0
|
||||
for (var/datum/reagents/rs in value["reagents"])
|
||||
total_volume += rs.total_volume
|
||||
if(is_hallucinating && prob(5))
|
||||
chemname = "[pick_list_replacements("hallucination.json", "chemicals")]"
|
||||
chemicals.Add(list(list("title" = chemname, "id" = ckey(temp.name), "volume" = total_volume )))
|
||||
data["chemicals"] = chemicals
|
||||
var/beakerContents[0]
|
||||
if(beaker)
|
||||
for(var/datum/reagent/R in beaker.reagents.reagent_list)
|
||||
beakerContents.Add(list(list("name" = R.name, "id" = ckey(R.name), "volume" = R.volume))) // list in a list because Byond merges the first list...
|
||||
data["beakerContents"] = beakerContents
|
||||
return data
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
if("amount")
|
||||
var/target = text2num(params["target"])
|
||||
amount = target
|
||||
. = TRUE
|
||||
if("dispense")
|
||||
var/reagent_name = params["reagent"]
|
||||
var/datum/reagent/reagent = GLOB.name2reagent[reagent_name]
|
||||
var/entry = dispensable_reagents[reagent]
|
||||
if(beaker)
|
||||
var/datum/reagents/R = beaker.reagents
|
||||
var/actual = min(amount, 1000, R.maximum_volume - R.total_volume)
|
||||
// todo: add check if we have enough reagent left
|
||||
for (var/datum/reagents/source in entry["reagents"])
|
||||
var/to_transfer = min(source.total_volume, actual)
|
||||
source.trans_to(beaker, to_transfer)
|
||||
actual -= to_transfer
|
||||
if (actual <= 0)
|
||||
break
|
||||
. = TRUE
|
||||
if("remove")
|
||||
var/amount = text2num(params["amount"])
|
||||
beaker.reagents.remove_all(amount)
|
||||
. = TRUE
|
||||
if("eject")
|
||||
replace_beaker(usr)
|
||||
update_icon()
|
||||
. = TRUE
|
||||
@@ -729,10 +729,10 @@ GENETICS SCANNER
|
||||
to_chat(user, "<span class='notice'>[target] is empty!</span>")
|
||||
|
||||
if(cached_scan_results && cached_scan_results["fusion"]) //notify the user if a fusion reaction was detected
|
||||
var/fusion_power = round(cached_scan_results["fusion"], 0.01)
|
||||
var/tier = fusionpower2text(fusion_power)
|
||||
var/instability = round(cached_scan_results["fusion"], 0.01)
|
||||
var/tier = instability2text(instability)
|
||||
to_chat(user, "<span class='boldnotice'>Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.</span>")
|
||||
to_chat(user, "<span class='notice'>Power of the last fusion reaction: [fusion_power]\n This power indicates it was a [tier]-tier fusion reaction.</span>")
|
||||
to_chat(user, "<span class='notice'>Instability of the last fusion reaction: [instability]\n This indicates it was [tier].</span>")
|
||||
return
|
||||
|
||||
/obj/item/analyzer/proc/scan_turf(mob/user, turf/location)
|
||||
@@ -783,10 +783,10 @@ GENETICS SCANNER
|
||||
to_chat(user, "<span class='info'>Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)</span>")
|
||||
|
||||
if(cached_scan_results && cached_scan_results["fusion"]) //notify the user if a fusion reaction was detected
|
||||
var/fusion_power = round(cached_scan_results["fusion"], 0.01)
|
||||
var/tier = fusionpower2text(fusion_power)
|
||||
var/instability = round(cached_scan_results["fusion"], 0.01)
|
||||
var/tier = instability2text(instability)
|
||||
to_chat(user, "<span class='boldnotice'>Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.</span>")
|
||||
to_chat(user, "<span class='notice'>Power of the last fusion reaction: [fusion_power]\n This power indicates it was a [tier]-tier fusion reaction.</span>")
|
||||
to_chat(user, "<span class='notice'>Instability of the last fusion reaction: [instability]\n This indicates it was [tier].</span>")
|
||||
|
||||
/obj/item/analyzer/ranged
|
||||
desc = "A hand-held scanner which uses advanced spectroscopy and infrared readings to analyze gases as a distance. Alt-Click to use the built in barometer function."
|
||||
@@ -992,4 +992,4 @@ GENETICS SCANNER
|
||||
#undef SCANMODE_CHEMICAL
|
||||
#undef SCANMODE_WOUND
|
||||
#undef SCANNER_CONDENSED
|
||||
#undef SCANNER_VERBOSE
|
||||
#undef SCANNER_VERBOSE
|
||||
|
||||
@@ -234,6 +234,9 @@
|
||||
/obj/item/melee/rapier/attack(mob/living/target, mob/living/user)
|
||||
. = ..()
|
||||
if(iscarbon(target))
|
||||
if(HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
visible_message("<span class='warning'>[user] gently taps [target] with [src].</span>",null,null,COMBAT_MESSAGE_RANGE)
|
||||
log_combat(user, target, "slept", src)
|
||||
var/mob/living/carbon/H = target
|
||||
H.Dizzy(10)
|
||||
H.adjustStaminaLoss(30)
|
||||
|
||||
@@ -304,18 +304,20 @@
|
||||
/obj/proc/reskin_obj(mob/M)
|
||||
if(!LAZYLEN(unique_reskin))
|
||||
return
|
||||
var/dat = "<b>Reskin options for [name]:</b>\n"
|
||||
for(var/V in unique_reskin)
|
||||
var/output = icon2html(src, M, unique_reskin[V])
|
||||
dat += "[V]: <span class='reallybig'>[output]</span>\n"
|
||||
to_chat(M, dat)
|
||||
|
||||
var/choice = input(M, always_reskinnable ? "Choose the a reskin for [src]" : "Warning, you can only reskin [src] once!","Reskin Object") as null|anything in unique_reskin
|
||||
if(QDELETED(src) || !choice || (current_skin && !always_reskinnable) || M.incapacitated() || !in_range(M,src) || !unique_reskin[choice] || unique_reskin[choice] == current_skin)
|
||||
return
|
||||
current_skin = choice
|
||||
var/list/skins = list()
|
||||
for(var/S in unique_reskin)
|
||||
skins[S] = image(icon = icon, icon_state = unique_reskin[S])
|
||||
var/choice = show_radial_menu(M, src, skins, custom_check = CALLBACK(src, .proc/check_skinnable, M), radius = 40, require_near = TRUE)
|
||||
if(!choice)
|
||||
return FALSE
|
||||
icon_state = unique_reskin[choice]
|
||||
to_chat(M, "[src] is now skinned as '[choice]'.")
|
||||
current_skin = choice
|
||||
return
|
||||
|
||||
/obj/proc/check_skinnable(/mob/M)
|
||||
if(current_skin || !always_reskinnable)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/update_overlays()
|
||||
. = ..()
|
||||
|
||||
@@ -20,8 +20,6 @@ GLOBAL_LIST(topic_status_cache)
|
||||
|
||||
log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!")
|
||||
|
||||
SetupExternalRSC()
|
||||
|
||||
GLOB.config_error_log = GLOB.world_manifest_log = GLOB.world_pda_log = GLOB.world_job_debug_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = "data/logs/config_error.[GUID()].log" //temporary file used to record errors with loading config, moved to log directory once logging is set bl
|
||||
|
||||
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
|
||||
@@ -87,17 +85,6 @@ GLOBAL_LIST(topic_status_cache)
|
||||
#endif
|
||||
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, cb, 10 SECONDS))
|
||||
|
||||
/world/proc/SetupExternalRSC()
|
||||
#if (PRELOAD_RSC == 0)
|
||||
GLOB.external_rsc_urls = world.file2list("[global.config.directory]/external_rsc_urls.txt","\n")
|
||||
var/i=1
|
||||
while(i<=GLOB.external_rsc_urls.len)
|
||||
if(GLOB.external_rsc_urls[i])
|
||||
i++
|
||||
else
|
||||
GLOB.external_rsc_urls.Cut(i,i+1)
|
||||
#endif
|
||||
|
||||
/world/proc/SetupLogs()
|
||||
var/override_dir = params[OVERRIDE_LOG_DIRECTORY_PARAMETER]
|
||||
if(!override_dir)
|
||||
|
||||
@@ -251,7 +251,8 @@
|
||||
var/mob/camera/eminence/E = owner
|
||||
E.eminence_help()
|
||||
|
||||
//Returns to the Ark
|
||||
/*
|
||||
//Returns to the Ark - Commented out and replaced with obelisk_jump
|
||||
/datum/action/innate/eminence/ark_jump
|
||||
name = "Return to Ark"
|
||||
desc = "Warps you to the Ark."
|
||||
@@ -265,6 +266,40 @@
|
||||
flash_color(owner, flash_color = "#AF0AAF", flash_time = 25)
|
||||
else
|
||||
to_chat(owner, "<span class='warning'>There is no Ark!</span>")
|
||||
*/
|
||||
|
||||
//Warps to a chosen Obelisk
|
||||
/datum/action/innate/eminence/obelisk_jump
|
||||
name = "Warp to Obelisk"
|
||||
desc = "Warps to a chosen clockwork obelisk."
|
||||
button_icon_state = "Abscond"
|
||||
|
||||
/datum/action/innate/eminence/obelisk_jump/Activate()
|
||||
var/list/possible_targets = list()
|
||||
var/list/warpnames = list()
|
||||
|
||||
for(var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/O in GLOB.all_clockwork_objects)
|
||||
if(!O.Adjacent(owner) && O.anchored)
|
||||
var/area/A = get_area(O)
|
||||
var/locname = initial(A.name)
|
||||
possible_targets[avoid_assoc_duplicate_keys("[locname] [O.name]", warpnames)] = O
|
||||
|
||||
if(!possible_targets.len)
|
||||
to_chat(owner, "<span class='warning'>There are no Obelisks to warp to!</span>")
|
||||
return
|
||||
|
||||
var/target_key = input(owner, "Choose an Obelisk to warp to.", "Obelisk Warp") as null|anything in possible_targets
|
||||
var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/target = possible_targets[target_key]
|
||||
|
||||
if(!target_key || !owner)
|
||||
return
|
||||
|
||||
if(!target)
|
||||
to_chat(owner, "<span class='warning'>That Obelisk does no longer exist!</span>")
|
||||
return
|
||||
owner.forceMove(get_turf(target))
|
||||
owner.playsound_local(owner, 'sound/magic/magic_missile.ogg', 50, TRUE)
|
||||
flash_color(owner, flash_color = "#AF0AAF", flash_time = 25)
|
||||
|
||||
//Warps to the Station
|
||||
/datum/action/innate/eminence/station_jump
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
job_rank = ROLE_HERETIC
|
||||
antag_hud_type = ANTAG_HUD_HERETIC
|
||||
antag_hud_name = "heretic"
|
||||
threat = 10
|
||||
var/give_equipment = TRUE
|
||||
var/list/researched_knowledge = list()
|
||||
var/total_sacrifices = 0
|
||||
@@ -208,6 +209,14 @@
|
||||
/datum/antagonist/heretic/proc/get_all_knowledge()
|
||||
return researched_knowledge
|
||||
|
||||
/datum/antagonist/heretic/threat()
|
||||
. = ..()
|
||||
for(var/X in researched_knowledge)
|
||||
var/datum/eldritch_knowledge/EK = researched_knowledge[X]
|
||||
. += EK.cost
|
||||
if(ascended)
|
||||
. += 20
|
||||
|
||||
////////////////
|
||||
// Objectives //
|
||||
////////////////
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
var/wound_bonus_per_hit = 5
|
||||
// How much our wound_bonus hitstreak bonus caps at (peak demonry)
|
||||
var/wound_bonus_hitstreak_max = 12
|
||||
// Keep the people we eat
|
||||
var/list/consumed_mobs = list()
|
||||
//buffs only happen when hearts are eaten, so this needs to be kept track separately
|
||||
var/consumed_buff = 0
|
||||
|
||||
/mob/living/simple_animal/slaughter/Initialize()
|
||||
..()
|
||||
@@ -112,8 +116,44 @@
|
||||
/mob/living/simple_animal/slaughter/phasein()
|
||||
. = ..()
|
||||
add_movespeed_modifier(/datum/movespeed_modifier/slaughter)
|
||||
addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, /datum/movespeed_modifier/slaughter), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
|
||||
var/slowdown_time = 6 SECONDS + (0.5 * consumed_buff)
|
||||
addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, /datum/movespeed_modifier/slaughter), slowdown_time, TIMER_UNIQUE | TIMER_OVERRIDE)
|
||||
|
||||
/mob/living/simple_animal/slaughter/Destroy()
|
||||
release_victims()
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/slaughter/proc/release_victims()
|
||||
if(!consumed_mobs)
|
||||
return
|
||||
|
||||
for(var/mob/living/M in consumed_mobs)
|
||||
if(!M)
|
||||
continue
|
||||
var/turf/T = find_safe_turf()
|
||||
if(!T)
|
||||
T = get_turf(src)
|
||||
M.forceMove(T)
|
||||
|
||||
/mob/living/simple_animal/slaughter/proc/refresh_consumed_buff()
|
||||
melee_damage_lower = 22.5 + (0.5 * consumed_buff)
|
||||
melee_damage_upper = 22.5 + (1 * consumed_buff)
|
||||
|
||||
/mob/living/simple_animal/slaughter/bloodcrawl_swallow(var/mob/living/victim)
|
||||
if(consumed_mobs)
|
||||
// Keep their corpse so rescue is possible
|
||||
consumed_mobs += victim
|
||||
victim.reagents?.add_reagent(/datum/reagent/preservahyde,3) // make it so that they don't decay in there
|
||||
var/obj/item/organ/heart/heart = victim.getorganslot(ORGAN_SLOT_HEART)
|
||||
if(heart)
|
||||
qdel(heart)
|
||||
consumed_buff++
|
||||
refresh_consumed_buff()
|
||||
else
|
||||
// Be safe and just eject the corpse
|
||||
victim.forceMove(get_turf(victim))
|
||||
victim.exit_blood_effect()
|
||||
victim.visible_message("[victim] falls out of the air, covered in blood, looking highly confused. And dead.")
|
||||
|
||||
//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl
|
||||
/obj/item/organ/heart/demon
|
||||
@@ -178,9 +218,6 @@
|
||||
prison of hugs."
|
||||
loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"})
|
||||
|
||||
// Keep the people we hug!
|
||||
var/list/consumed_mobs = list()
|
||||
|
||||
playstyle_string = "<span class='big bold'>You are a laughter \
|
||||
demon,</span><B> a wonderful creature from another realm. You have a single \
|
||||
desire: <span class='clown'>To hug and tickle.</span><BR>\
|
||||
@@ -195,10 +232,6 @@
|
||||
released and fully healed, because in the end it's just a jape, \
|
||||
sibling!</B>"
|
||||
|
||||
/mob/living/simple_animal/slaughter/laughter/Destroy()
|
||||
release_friends()
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/slaughter/laughter/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
@@ -208,7 +241,22 @@
|
||||
if(3)
|
||||
adjustBruteLoss(30)
|
||||
|
||||
/mob/living/simple_animal/slaughter/laughter/proc/release_friends()
|
||||
/mob/living/simple_animal/slaughter/laughter/refresh_consumed_buff()
|
||||
melee_damage_lower -= 0.5 // JAPES
|
||||
melee_damage_upper += 1
|
||||
|
||||
/mob/living/simple_animal/slaughter/laughter/bloodcrawl_swallow(var/mob/living/victim)
|
||||
if(consumed_mobs)
|
||||
// Keep their corpse so rescue is possible
|
||||
consumed_mobs += victim
|
||||
refresh_consumed_buff()
|
||||
else
|
||||
// Be safe and just eject the corpse
|
||||
victim.forceMove(get_turf(victim))
|
||||
victim.exit_blood_effect()
|
||||
victim.visible_message("[victim] falls out of the air, covered in blood, looking highly confused. And dead.")
|
||||
|
||||
/mob/living/simple_animal/slaughter/laughter/release_victims()
|
||||
if(!consumed_mobs)
|
||||
return
|
||||
|
||||
@@ -223,13 +271,3 @@
|
||||
M.grab_ghost(force = TRUE)
|
||||
playsound(T, feast_sound, 50, 1, -1)
|
||||
to_chat(M, "<span class='clown'>You leave [src]'s warm embrace, and feel ready to take on the world.</span>")
|
||||
|
||||
/mob/living/simple_animal/slaughter/laughter/bloodcrawl_swallow(var/mob/living/victim)
|
||||
if(consumed_mobs)
|
||||
// Keep their corpse so rescue is possible
|
||||
consumed_mobs += victim
|
||||
else
|
||||
// Be safe and just eject the corpse
|
||||
victim.forceMove(get_turf(victim))
|
||||
victim.exit_blood_effect()
|
||||
victim.visible_message("[victim] falls out of the air, covered in blood, looking highly confused. And dead.")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/traitor_class/human/freeform
|
||||
name = "Waffle Co Agent"
|
||||
employer = "Waffle Company"
|
||||
weight = 16
|
||||
weight = 0 // should not spawn in unless admins bus something in the traitor panel with setting traitor classes
|
||||
chaos = 0
|
||||
|
||||
/datum/traitor_class/human/freeform/forge_objectives(datum/antagonist/traitor/T)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/traitor_class/human/subterfuge
|
||||
name = "MI13 Operative"
|
||||
employer = "MI13"
|
||||
weight = 20
|
||||
weight = 36
|
||||
chaos = -5
|
||||
|
||||
/datum/traitor_class/human/subterfuge/forge_single_objective(datum/antagonist/traitor/T)
|
||||
|
||||
@@ -163,6 +163,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
)
|
||||
var/custom_speech_verb = "default" //if your say_mod is to be something other than your races
|
||||
var/custom_tongue = "default" //if your tongue is to be something other than your races
|
||||
var/chosen_limb_id //body sprite selected to load for the users limbs, null means default, is sanitized when loaded
|
||||
|
||||
/// Security record note section
|
||||
var/security_records
|
||||
@@ -246,7 +247,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
/// Which of the 5 persistent scar slots we randomly roll to load for this round, if enabled. Actually rolled in [/datum/preferences/proc/load_character(slot)]
|
||||
var/scars_index = 1
|
||||
|
||||
var/chosen_limb_id //body sprite selected to load for the users limbs, null means default, is sanitized when loaded
|
||||
var/hide_ckey = FALSE //pref for hiding if your ckey shows round-end or not
|
||||
|
||||
/datum/preferences/New(client/C)
|
||||
parent = C
|
||||
@@ -372,6 +373,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "[medical_records]"
|
||||
else
|
||||
dat += "[TextPreview(medical_records)]...<BR>"
|
||||
dat += "<br><a href='?_src_=prefs;preference=hide_ckey;task=input'><b>Hide ckey: [hide_ckey ? "Enabled" : "Disabled"]</b></a><br>"
|
||||
dat += "</tr></table>"
|
||||
|
||||
//Character Appearance
|
||||
@@ -1448,6 +1450,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(!isnull(msg))
|
||||
features["ooc_notes"] = msg
|
||||
|
||||
if("hide_ckey")
|
||||
hide_ckey = !hide_ckey
|
||||
if(user)
|
||||
user.mind?.hide_ckey = hide_ckey
|
||||
|
||||
if("hair")
|
||||
var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null
|
||||
if(new_hair)
|
||||
|
||||
@@ -515,7 +515,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["scars4"] >> scars_list["4"]
|
||||
S["scars5"] >> scars_list["5"]
|
||||
S["chosen_limb_id"] >> chosen_limb_id
|
||||
|
||||
S["hide_ckey"] >> hide_ckey //saved per-character
|
||||
|
||||
//Custom names
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
@@ -859,6 +859,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["joblessrole"] , joblessrole)
|
||||
//Write prefs
|
||||
WRITE_FILE(S["job_preferences"] , job_preferences)
|
||||
WRITE_FILE(S["hide_ckey"] , hide_ckey)
|
||||
|
||||
//Quirks
|
||||
WRITE_FILE(S["all_quirks"] , all_quirks)
|
||||
@@ -874,6 +875,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["scars4"] , scars_list["4"])
|
||||
WRITE_FILE(S["scars5"] , scars_list["5"])
|
||||
|
||||
|
||||
//gear loadout
|
||||
if(chosen_gear.len)
|
||||
var/text_to_save = chosen_gear.Join("|")
|
||||
|
||||
@@ -80,7 +80,9 @@
|
||||
item_state = "hostrench"
|
||||
flags_inv = 0
|
||||
strip_delay = 80
|
||||
unique_reskin = list("Coat" = "hostrench", "Cloak" = "trenchcloak")
|
||||
unique_reskin = list("Coat" = "hostrench",
|
||||
"Cloak" = "trenchcloak"
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/warden
|
||||
name = "warden's jacket"
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
continue
|
||||
if(!H.getorgan(/obj/item/organ/brain)) // If only I had a brain
|
||||
continue
|
||||
|
||||
if(HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS))
|
||||
continue
|
||||
traumatize(H)
|
||||
break
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
/datum/round_event/fake_virus/start()
|
||||
var/list/fake_virus_victims = list()
|
||||
for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list))
|
||||
if(!H.client || H.stat == DEAD || H.InCritical())
|
||||
if(!H.client || H.stat == DEAD || H.InCritical() || HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS))
|
||||
continue
|
||||
fake_virus_victims += H
|
||||
|
||||
|
||||
@@ -78,10 +78,7 @@
|
||||
if(28)
|
||||
new /obj/item/clothing/neck/necklace/memento_mori(src)
|
||||
if(29)
|
||||
if(prob(50))
|
||||
new /obj/item/malf_upgrade(src)
|
||||
else
|
||||
new /obj/item/disk/tech_disk/illegal(src)
|
||||
new /obj/item/disk/tech_disk/illegal(src)
|
||||
|
||||
//KA modkit design discs
|
||||
/obj/item/disk/design_disk/modkit_disc
|
||||
|
||||
@@ -106,6 +106,7 @@
|
||||
set_colour(new_colour)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_SLIME, 7.5)
|
||||
set_nutrition(rand(650, 800))
|
||||
|
||||
/mob/living/simple_animal/slime/Destroy()
|
||||
for (var/A in actions)
|
||||
|
||||
@@ -50,6 +50,8 @@
|
||||
var/datum/callback/CB = foo
|
||||
CB.Invoke()
|
||||
|
||||
mind?.hide_ckey = client?.prefs?.hide_ckey
|
||||
|
||||
log_message("Client [key_name(src)] has taken ownership of mob [src]([src.type])", LOG_OWNERSHIP)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGIN, client)
|
||||
|
||||
|
||||
@@ -431,7 +431,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
/mob/living/getImplant(type)
|
||||
return locate(type) in implants
|
||||
|
||||
/proc/offer_control(mob/M)
|
||||
/proc/offer_control(mob/M,ignore_category=null)
|
||||
to_chat(M, "Control of your mob has been offered to dead players.")
|
||||
if(usr)
|
||||
log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.")
|
||||
@@ -445,7 +445,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
var/datum/antagonist/A = M.mind.has_antag_datum(/datum/antagonist/)
|
||||
if(A)
|
||||
poll_message = "[poll_message] Status:[A.name]."
|
||||
var/list/mob/candidates = pollCandidatesForMob(poll_message, ROLE_PAI, null, FALSE, 100, M)
|
||||
var/list/mob/candidates = pollCandidatesForMob(poll_message, ROLE_PAI, null, FALSE, 100, M, ignore_category)
|
||||
|
||||
if(LAZYLEN(candidates))
|
||||
var/mob/C = pick(candidates)
|
||||
|
||||
@@ -160,6 +160,14 @@
|
||||
buckle_lying = FALSE
|
||||
buckle_requires_restraints = TRUE
|
||||
|
||||
/obj/machinery/power/grounding_rod/Initialize()
|
||||
GLOB.grounding_rods |= src
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/grounding_rod/Destroy()
|
||||
GLOB.grounding_rods.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/grounding_rod/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
|
||||
. = ..()
|
||||
if(. == SUCCESSFUL_UNFASTEN)
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
var/produced_power
|
||||
var/energy_to_raise = 32
|
||||
var/energy_to_lower = -20
|
||||
var/obj/machinery/power/grounding_rod/rodtarget
|
||||
|
||||
/obj/singularity/energy_ball/Initialize(mapload, starting_energy = 50, is_miniball = FALSE)
|
||||
miniball = is_miniball
|
||||
@@ -60,11 +61,12 @@
|
||||
return //don't annnounce miniballs
|
||||
..()
|
||||
|
||||
|
||||
/obj/singularity/energy_ball/process()
|
||||
if(!orbiting)
|
||||
handle_energy()
|
||||
|
||||
determine_containment()
|
||||
|
||||
move_the_basket_ball(4 + orbiting_balls.len * 1.5)
|
||||
|
||||
playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, TRUE, extrarange = 30)
|
||||
@@ -87,12 +89,19 @@
|
||||
if(orbiting_balls.len)
|
||||
. += "There are [orbiting_balls.len] mini-balls orbiting it."
|
||||
|
||||
|
||||
/obj/singularity/energy_ball/proc/move_the_basket_ball(var/move_amount)
|
||||
//we face the last thing we zapped, so this lets us favor that direction a bit
|
||||
var/move_bias = pick(GLOB.alldirs)
|
||||
var/move_dir
|
||||
for(var/rod in GLOB.grounding_rods) // grounding rods pull the tesla ball, picks the nearest one
|
||||
if(!rodtarget || get_dist(src,rod)<get_dist(src,rodtarget))
|
||||
rodtarget=rod
|
||||
|
||||
for(var/i in 0 to move_amount)
|
||||
var/move_dir = pick(GLOB.alldirs + move_bias) //ensures large-ball teslas don't just sit around
|
||||
if(rodtarget)
|
||||
move_dir = pick(GLOB.alldirs + get_dir(src,rodtarget))
|
||||
else
|
||||
move_dir = pick(GLOB.alldirs + move_bias) //ensures large-ball teslas don't just sit around
|
||||
if(target && prob(10))
|
||||
move_dir = get_dir(src,target)
|
||||
var/turf/T = get_step(src, move_dir)
|
||||
@@ -102,6 +111,20 @@
|
||||
for(var/mob/living/carbon/C in loc)
|
||||
dust_mobs(C)
|
||||
|
||||
/obj/singularity/energy_ball/proc/determine_containment()
|
||||
contained=0
|
||||
var/found
|
||||
var/tiletocheck
|
||||
for(var/direction in GLOB.cardinals) // check a radius of 10 tiles around the ball for a full containment field
|
||||
tiletocheck=get_step(src,direction)
|
||||
for(var/tile in 1 to 10)
|
||||
found=locate(/obj/machinery/field/containment) in tiletocheck
|
||||
if(found)
|
||||
continue
|
||||
else if (!found && tile==10)
|
||||
return // if one side is lacking a field it doesn't bother checking the others
|
||||
tiletocheck=get_step(tiletocheck,direction)
|
||||
contained=1
|
||||
|
||||
/obj/singularity/energy_ball/proc/handle_energy()
|
||||
if(energy >= energy_to_raise)
|
||||
@@ -121,6 +144,10 @@
|
||||
else if(orbiting_balls.len)
|
||||
dissipate() //sing code has a much better system.
|
||||
|
||||
if(energy<=0)
|
||||
investigate_log("fizzled.", INVESTIGATE_SINGULO)
|
||||
qdel(src)
|
||||
|
||||
/obj/singularity/energy_ball/proc/new_mini_ball()
|
||||
if(!loc)
|
||||
return
|
||||
@@ -134,7 +161,6 @@
|
||||
|
||||
EB.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36))
|
||||
|
||||
|
||||
/obj/singularity/energy_ball/Bump(atom/A)
|
||||
dust_mobs(A)
|
||||
|
||||
@@ -166,7 +192,6 @@
|
||||
if (!QDELETED(src))
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/singularity/energy_ball/proc/dust_mobs(atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
@@ -329,6 +354,12 @@
|
||||
|
||||
else
|
||||
power = closest_atom.zap_act(power, zap_flags, shocked_targets)
|
||||
|
||||
var/obj/singularity/energy_ball/tesla = source
|
||||
if(istype(tesla))
|
||||
if(istype(closest_atom,/obj/machinery/power/grounding_rod) && tesla.energy>13 && !tesla.contained)
|
||||
qdel(closest_atom) // each rod deletes two miniballs,
|
||||
tesla.energy = round(tesla.energy/1.5625) // if there are no miniballs the rod stays and continues to pull the ball in
|
||||
if(prob(20))//I know I know
|
||||
tesla_zap(closest_atom, next_range, power * 0.5, zap_flags, shocked_targets)
|
||||
tesla_zap(closest_atom, next_range, power * 0.5, zap_flags, shocked_targets)
|
||||
|
||||
@@ -329,7 +329,7 @@
|
||||
color = "#101000" // rgb: 16, 16, 0
|
||||
nutriment_factor = 0
|
||||
taste_description = "sweet red tea"
|
||||
glass_icon_state = "teaglass"
|
||||
glass_icon_state = "tea_red"
|
||||
glass_name = "glass of red tea"
|
||||
glass_desc = "A piping hot tea that helps with the digestion of food."
|
||||
|
||||
@@ -340,6 +340,7 @@
|
||||
M.drowsyness = max(0,M.drowsyness-1)
|
||||
M.jitteriness = max(0,M.jitteriness-3)
|
||||
M.adjust_bodytemperature(23 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/consumable/tea/green
|
||||
@@ -348,7 +349,7 @@
|
||||
color = "#101000" // rgb: 16, 16, 0
|
||||
nutriment_factor = 0
|
||||
taste_description = "tart green tea"
|
||||
glass_icon_state = "teaglass"
|
||||
glass_icon_state = "tea_green"
|
||||
glass_name = "glass of tea"
|
||||
glass_desc = "A calming glass of green tea to help get you through the day."
|
||||
|
||||
@@ -358,6 +359,7 @@
|
||||
M.drowsyness = max(0,M.drowsyness-1)
|
||||
M.jitteriness = max(0,M.jitteriness-3)
|
||||
M.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/consumable/tea/forest
|
||||
@@ -367,7 +369,7 @@
|
||||
nutriment_factor = 0
|
||||
quality = DRINK_NICE
|
||||
taste_description = "sweet tea"
|
||||
glass_icon_state = "teaglass"
|
||||
glass_icon_state = "tea_forest"
|
||||
glass_name = "glass of forest tea"
|
||||
glass_desc = "A lovely glass of tea and honey."
|
||||
|
||||
@@ -379,6 +381,7 @@
|
||||
M.drowsyness = max(0,M.drowsyness-1)
|
||||
M.jitteriness = max(0,M.jitteriness-3)
|
||||
M.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/consumable/tea/mush
|
||||
@@ -388,7 +391,7 @@
|
||||
nutriment_factor = 0
|
||||
quality = DRINK_NICE
|
||||
taste_description = "fungal infections"
|
||||
glass_icon_state = "teaglass"
|
||||
glass_icon_state = "tea_mush"
|
||||
glass_name = "glass of mush tea"
|
||||
glass_desc = "A cold merky brown tea."
|
||||
|
||||
@@ -398,6 +401,7 @@
|
||||
M.Dizzy(10)
|
||||
if(prob(10))
|
||||
M.disgust = 0
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/consumable/lemonade
|
||||
|
||||
@@ -354,6 +354,16 @@
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/portable_chem_mixer
|
||||
name = "Portable Chemical Mixer"
|
||||
desc = "A portable device that dispenses and mixes chemicals. Reagents have to be supplied with beakers."
|
||||
id = "portable_chem_mixer"
|
||||
build_type = PROTOLATHE
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
materials = list(/datum/material/plastic = 5000, /datum/material/iron = 10000, /datum/material/glass = 3000)
|
||||
build_path = /obj/item/storage/portable_chem_mixer
|
||||
category = list("Equipment")
|
||||
|
||||
/////////////////////////////////////////
|
||||
//////////Cybernetic Implants////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#ifdef UNIT_TESTS
|
||||
#include "anchored_mobs.dm"
|
||||
#include "character_saving.dm"
|
||||
#include "component_tests.dm"
|
||||
#include "reagent_id_typos.dm"
|
||||
#include "reagent_recipe_collisions.dm"
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
/datum/unit_test/character_saving/Run()
|
||||
try
|
||||
var/datum/preferences/P = new
|
||||
P.load_path("test")
|
||||
P.features["flavor_text"] = "Foo"
|
||||
P.features["ooc_notes"] = "Bar"
|
||||
P.save_character()
|
||||
P.load_character()
|
||||
if(P.features["flavor_text"] != "Foo")
|
||||
Fail("Flavor text is failing to save.")
|
||||
if(P.features["ooc_notes"] != "Bar")
|
||||
Fail("OOC text is failing to save.")
|
||||
catch(var/exception/e)
|
||||
Fail("Failed to save and load character due to exception [e.name]")
|
||||
@@ -26,7 +26,12 @@
|
||||
/obj/item/clothing/under/shorts/polychromic/pantsu = 3,
|
||||
/obj/item/clothing/under/misc/poly_bottomless = 3,
|
||||
/obj/item/clothing/under/misc/poly_tanktop = 3,
|
||||
/obj/item/clothing/under/misc/poly_tanktop/female = 3
|
||||
/obj/item/clothing/under/misc/poly_tanktop/female = 3,
|
||||
/obj/item/autosurgeon/penis = 3,
|
||||
/obj/item/autosurgeon/testicles = 3,
|
||||
/obj/item/storage/pill_bottle/penis_enlargement = 5,
|
||||
/obj/item/storage/pill_bottle/breast_enlargement = 5,
|
||||
/obj/item/storage/daki = 4
|
||||
)
|
||||
contraband = list(
|
||||
/obj/item/clothing/neck/petcollar/locked = 2,
|
||||
|
||||
@@ -50,6 +50,123 @@
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
|
||||
<h2 class="date">02 September 2020</h2>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="code_imp">Added a unit test for character saving.</li>
|
||||
<li class="balance">Plastitanium rapier no longer silently sleeps with no chance at counterplay when used by pacifists.</li>
|
||||
<li class="bugfix">Fusion scan is now actually useful.</li>
|
||||
</ul>
|
||||
<h3 class="author">Tupinambis updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">moved the dakis, genital growth pills, and genital autosurgeons out of the maintenance loot table and into kinkmates.</li>
|
||||
</ul>
|
||||
<h3 class="author">raspy-on-osu updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">pyroclastic anomaly client spam</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">you can hide your ckey now from the roundend report</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">01 September 2020</h2>
|
||||
<h3 class="author">BlueWildrose updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">fixed slimes starting off hungry</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">31 August 2020</h2>
|
||||
<h3 class="author">Arturlang updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Slimes can now damage structures, don't leave them unfed!</li>
|
||||
</ul>
|
||||
<h3 class="author">Chiirno updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Moves pill_bottles/dice to box/dice on CogStation.</li>
|
||||
</ul>
|
||||
<h3 class="author">Couls, ported by NecromancerAnne updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="code_imp">cleans up mech backstabbing code</li>
|
||||
</ul>
|
||||
<h3 class="author">DeltaFire15 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscdel">teleport-to-ark ability of the eminence, commented out</li>
|
||||
<li class="rscadd">teleport-to-obelisk ability for the eminence</li>
|
||||
</ul>
|
||||
<h3 class="author">Detective-Google updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">plasmamen have no more slowdown</li>
|
||||
<li class="rscadd">object reskins now use very nice and cool radials</li>
|
||||
</ul>
|
||||
<h3 class="author">EmeraldSundisk updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds a pool to MetaStation</li>
|
||||
<li class="tweak">Slight readjustments to the surrounding area</li>
|
||||
<li class="bugfix">Fixes a handful of external airlocks</li>
|
||||
</ul>
|
||||
<h3 class="author">ForrestWick updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">removes wall walking boots from nukie uplink</li>
|
||||
</ul>
|
||||
<h3 class="author">Ghommie updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">e-gun overlays and some floor decals should have been fixed.</li>
|
||||
</ul>
|
||||
<h3 class="author">LetterN updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">tgchat</li>
|
||||
</ul>
|
||||
<h3 class="author">Lynxless updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Changed anatomic panacea into a direct buff, instead of a chem injection</li>
|
||||
<li class="balance">Changed the values of anatomic panacea</li>
|
||||
<li class="imageadd">Added a new icon for panacea's buff alert</li>
|
||||
</ul>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Pref for genital/vore examine text</li>
|
||||
<li class="bugfix">Fixed a couple events having ghost roles eligible.</li>
|
||||
<li class="balance">Buffed slaughter demon: gets stronger as it eats people</li>
|
||||
<li class="balance">Nerfed slaughter demon: no longer permanently round-removes all who are eaten by it, instead releasing their now-heartless bodies</li>
|
||||
<li class="bugfix">Dynamic storytellers now calculate property weights properly.</li>
|
||||
</ul>
|
||||
<h3 class="author">Sonic121x updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fix the four type of new tea that will stuck inside your vein.</li>
|
||||
<li class="rscadd">drinking glass sprite for those tea.</li>
|
||||
</ul>
|
||||
<h3 class="author">kappa-sama updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">miners can no longer acquire funny antag item</li>
|
||||
</ul>
|
||||
<h3 class="author">lolman360 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">shuttle engine/heater sprites now face the right way</li>
|
||||
</ul>
|
||||
<h3 class="author">raspy-on-osu updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">TEG power output</li>
|
||||
<li class="tweak">tesla movement priorities</li>
|
||||
<li class="rscadd">tesla counterplay</li>
|
||||
<li class="rscadd">tesla containment check (containment variable now usable)</li>
|
||||
</ul>
|
||||
<h3 class="author">silicons updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">brooms now sweep objects on MOVABLE_PRE_MOVE rather than MOVABLE_MOVED</li>
|
||||
<li class="balance">firedoors no longer automatically open on touch when there's no pressure differences.</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">buzz, buzz2 and ping are now all unrestricted emotes and can be used by anyone</li>
|
||||
<li class="imagedel">the drake credit and pickle credit sprites have been removed</li>
|
||||
<li class="refactor">tongue speech handling is now done by accent datums</li>
|
||||
</ul>
|
||||
<h3 class="author">zeroisthebiggay updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscdel">waffleco</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">30 August 2020</h2>
|
||||
<h3 class="author">raspy-on-osu updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
@@ -1374,67 +1491,6 @@
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">bohbombing is a thing now</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">30 June 2020</h2>
|
||||
<h3 class="author">Fikou updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">spray cans, airlock painters, and decal painters added to engineering/service/autolathe (where applicable)</li>
|
||||
</ul>
|
||||
<h3 class="author">Ghommie updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixed a gap on the male insect anthro torso sprite when facing south.</li>
|
||||
<li class="bugfix">Fixed mecha ID access not being removable.</li>
|
||||
<li class="bugfix">Fixed a peeve with the hypno trance status effect not sanitizing some heard hypnosis inputs (i.e. custom say messages like say"honks*clownem ipsum dolor")</li>
|
||||
<li class="bugfix">fixed an issue about using stacks with only 1 amount left.</li>
|
||||
<li class="bugfix">Fixed a peeve on attack messages against carbons/humans.</li>
|
||||
<li class="bugfix">Fixed missing hypnochair board.</li>
|
||||
<li class="bugfix">Fixed material walls and tiles. My bad on that port.</li>
|
||||
</ul>
|
||||
<h3 class="author">Ghommie (inspired by MrDoomBringer's work on tgstation) updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">New check skills UI.</li>
|
||||
</ul>
|
||||
<h3 class="author">Ghommie (porting PRs by XTDM, coiax, MrDoomBringer) updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Random Events now have a follow link for ghosts!</li>
|
||||
<li class="rscadd">Adds the Spontaneous Brain Trauma to the event pool. Sometimes your brain just goes a little wrong.</li>
|
||||
<li class="rscadd">Sometimes a low level cloning pod will make errors in replicating your brain, leaving you with a mild brain trauma.</li>
|
||||
<li class="rscadd">When a person is cloned, any mental traumas are cloned as well.</li>
|
||||
<li class="rscadd">The wizard federation announces that the Curse of Madness is out of beta and is now available for purchase for 4 points. It causes long-lasting brain traumas to all inhabitants of a target space station.</li>
|
||||
<li class="rscadd">The wizard federation declines responsibility for any self-harm caused by curses cast while inside the targeted station.</li>
|
||||
<li class="rscadd">Due to the extensive testing of the Curse of Madness some unique new trauma types have appeared across Nanotrasen-controlled space.</li>
|
||||
<li class="rscadd">Curse of Madness can now be triggered by a wizard's Summon Events, at the same chance as Summon Guns or Summon Magic.</li>
|
||||
<li class="admin">When an admin triggers Curse of Madness manually, they can specify their own dark truth to horrify the station with.</li>
|
||||
</ul>
|
||||
<h3 class="author">nightred updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="code_imp">Created two_handed component</li>
|
||||
<li class="refactor">Updated all existing two handed items to use the new component</li>
|
||||
</ul>
|
||||
<h3 class="author">silicons updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">typing indicators no longer generates duplicate message boxes.</li>
|
||||
<li class="rscadd">config errors now have line numbers.</li>
|
||||
<li class="tweak">outgoing mentorpms are now blue instead of green for the sender.</li>
|
||||
<li class="soundadd">*squish</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">you can now select your tongue and speech verb in the character customization menu!</li>
|
||||
<li class="rscadd">skeleton is now split into two more types, greater and lesser</li>
|
||||
<li class="bugfix">non-carbon blood is now not white</li>
|
||||
<li class="spellcheck">fixed a bunch of grammar/spelling mistakes</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">29 June 2020</h2>
|
||||
<h3 class="author">b1tt3r1n0 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Made teratomas from sdgf less powergame</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">slimes no longer have white blood by default</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<b>GoonStation 13 Development Team</b>
|
||||
|
||||
@@ -27132,3 +27132,77 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
- rscadd: new explosion echoes
|
||||
- tweak: explosion echo range
|
||||
- soundadd: 5 new explosion related sounds
|
||||
2020-08-31:
|
||||
Arturlang:
|
||||
- tweak: Slimes can now damage structures, don't leave them unfed!
|
||||
Chiirno:
|
||||
- bugfix: Moves pill_bottles/dice to box/dice on CogStation.
|
||||
Couls, ported by NecromancerAnne:
|
||||
- code_imp: cleans up mech backstabbing code
|
||||
DeltaFire15:
|
||||
- rscdel: teleport-to-ark ability of the eminence, commented out
|
||||
- rscadd: teleport-to-obelisk ability for the eminence
|
||||
Detective-Google:
|
||||
- tweak: plasmamen have no more slowdown
|
||||
- rscadd: object reskins now use very nice and cool radials
|
||||
EmeraldSundisk:
|
||||
- rscadd: Adds a pool to MetaStation
|
||||
- tweak: Slight readjustments to the surrounding area
|
||||
- bugfix: Fixes a handful of external airlocks
|
||||
ForrestWick:
|
||||
- balance: removes wall walking boots from nukie uplink
|
||||
- tweak: removes wall walking boots from nukie uplink
|
||||
Ghommie:
|
||||
- bugfix: e-gun overlays and some floor decals should have been fixed.
|
||||
LetterN:
|
||||
- rscadd: tgchat
|
||||
Lynxless:
|
||||
- tweak: Changed anatomic panacea into a direct buff, instead of a chem injection
|
||||
- balance: Changed the values of anatomic panacea
|
||||
- imageadd: Added a new icon for panacea's buff alert
|
||||
Putnam3145:
|
||||
- tweak: Pref for genital/vore examine text
|
||||
- bugfix: Fixed a couple events having ghost roles eligible.
|
||||
- balance: 'Buffed slaughter demon: gets stronger as it eats people'
|
||||
- balance: 'Nerfed slaughter demon: no longer permanently round-removes all who
|
||||
are eaten by it, instead releasing their now-heartless bodies'
|
||||
- bugfix: Dynamic storytellers now calculate property weights properly.
|
||||
Sonic121x:
|
||||
- bugfix: Fix the four type of new tea that will stuck inside your vein.
|
||||
- rscadd: drinking glass sprite for those tea.
|
||||
kappa-sama:
|
||||
- balance: miners can no longer acquire funny antag item
|
||||
lolman360:
|
||||
- bugfix: shuttle engine/heater sprites now face the right way
|
||||
raspy-on-osu:
|
||||
- tweak: TEG power output
|
||||
- tweak: tesla movement priorities
|
||||
- rscadd: tesla counterplay
|
||||
- rscadd: tesla containment check (containment variable now usable)
|
||||
silicons:
|
||||
- bugfix: brooms now sweep objects on MOVABLE_PRE_MOVE rather than MOVABLE_MOVED
|
||||
- balance: firedoors no longer automatically open on touch when there's no pressure
|
||||
differences.
|
||||
timothyteakettle:
|
||||
- tweak: buzz, buzz2 and ping are now all unrestricted emotes and can be used by
|
||||
anyone
|
||||
- imagedel: the drake credit and pickle credit sprites have been removed
|
||||
- refactor: tongue speech handling is now done by accent datums
|
||||
zeroisthebiggay:
|
||||
- rscdel: waffleco
|
||||
2020-09-01:
|
||||
BlueWildrose:
|
||||
- bugfix: fixed slimes starting off hungry
|
||||
2020-09-02:
|
||||
Putnam3145:
|
||||
- code_imp: Added a unit test for character saving.
|
||||
- balance: Plastitanium rapier no longer silently sleeps with no chance at counterplay
|
||||
when used by pacifists.
|
||||
- bugfix: Fusion scan is now actually useful.
|
||||
Tupinambis:
|
||||
- tweak: moved the dakis, genital growth pills, and genital autosurgeons out of
|
||||
the maintenance loot table and into kinkmates.
|
||||
raspy-on-osu:
|
||||
- bugfix: pyroclastic anomaly client spam
|
||||
timothyteakettle:
|
||||
- rscadd: you can hide your ckey now from the roundend report
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "Chiirno"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Moves pill_bottles/dice to box/dice on CogStation."
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "LetterN"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "tgchat"
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "timothyteakettle"
|
||||
delete-after: True
|
||||
changes:
|
||||
- imagedel: "the drake credit and pickle credit sprites have been removed"
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "Ghommie"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "e-gun overlays and some floor decals should have been fixed."
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "Arturlang"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Slimes can now damage structures, don't leave them unfed!"
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "timothyteakettle"
|
||||
delete-after: True
|
||||
changes:
|
||||
- refactor: "tongue speech handling is now done by accent datums"
|
||||
@@ -1,6 +0,0 @@
|
||||
author: "EmeraldSundisk"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Adds a pool to MetaStation"
|
||||
- tweak: "Slight readjustments to the surrounding area"
|
||||
- bugfix: "Fixes a handful of external airlocks"
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "Detective-Google"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "plasmamen have no more slowdown"
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "timothyteakettle"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "buzz, buzz2 and ping are now all unrestricted emotes and can be used by anyone"
|
||||
@@ -1,6 +0,0 @@
|
||||
author: "Lynxless"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Changed anatomic panacea into a direct buff, instead of a chem injection"
|
||||
- balance: "Changed the values of anatomic panacea"
|
||||
- imageadd: "Added a new icon for panacea's buff alert"
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "raspy-on-osu"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "TEG power output"
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "Putnam3145"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Pref for genital/vore examine text"
|
||||
@@ -1,5 +0,0 @@
|
||||
author: "ForrestWick"
|
||||
delete-after: True
|
||||
changes:
|
||||
- balance: "removes wall walking boots from nukie uplink"
|
||||
- tweak: "removes wall walking boots from nukie uplink"
|
||||
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 57 KiB |
@@ -40,12 +40,6 @@
|
||||
path = /obj/item/bikehorn/airhorn
|
||||
ckeywhitelist = list("kevinz000")
|
||||
|
||||
/datum/gear/donator/cebusoap
|
||||
name = "Cebutris' soap"
|
||||
slot = SLOT_IN_BACKPACK
|
||||
path = /obj/item/custom/ceb_soap
|
||||
ckeywhitelist = list("cebutris")
|
||||
|
||||
/datum/gear/donator/kiaracloak
|
||||
name = "Kiara's cloak"
|
||||
slot = SLOT_NECK
|
||||
|
||||
@@ -1,26 +1,8 @@
|
||||
|
||||
//For custom items.
|
||||
|
||||
// Unless there's a digitigrade version make sure you add mutantrace_variation = NONE to all clothing/under and shoes - Pooj
|
||||
// Digitigrade stuff is uniform_digi.dmi and digishoes.dmi in icons/mob
|
||||
|
||||
/obj/item/custom/ceb_soap
|
||||
name = "Cebutris' Soap"
|
||||
desc = "A generic bar of soap that doesn't really seem to work right."
|
||||
gender = PLURAL
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
icon_state = "cebu"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
item_flags = NOBLUDGEON
|
||||
|
||||
/obj/item/soap/cebu //real versions, for admin shenanigans. Adminspawn only
|
||||
desc = "A bright blue bar of soap that smells of wolves"
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
icon_state = "cebu"
|
||||
|
||||
/obj/item/soap/cebu/fast //speedyquick cleaning version. Still not as fast as Syndiesoap. Adminspawn only.
|
||||
cleanspeed = 15
|
||||
|
||||
/obj/item/clothing/neck/cloak/inferno
|
||||
name = "Kiara's Cloak"
|
||||
desc = "The design on this seems a little too familiar."
|
||||
@@ -316,7 +298,7 @@
|
||||
|
||||
/obj/item/clothing/neck/petcollar/naomi
|
||||
name = "worn pet collar"
|
||||
desc = "a pet collar that looks well used."
|
||||
desc = "A pet collar that looks well used."
|
||||
|
||||
/obj/item/clothing/neck/cloak/green
|
||||
name = "Generic Green Cloak"
|
||||
|
||||
@@ -1099,6 +1099,7 @@
|
||||
#include "code\game\objects\items\devices\paicard.dm"
|
||||
#include "code\game\objects\items\devices\pipe_painter.dm"
|
||||
#include "code\game\objects\items\devices\polycircuit.dm"
|
||||
#include "code\game\objects\items\devices\portable_chem_mixer.dm"
|
||||
#include "code\game\objects\items\devices\powersink.dm"
|
||||
#include "code\game\objects\items\devices\pressureplates.dm"
|
||||
#include "code\game\objects\items\devices\quantum_keycard.dm"
|
||||
|
||||