Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into revert-8235-defib-notouch

This commit is contained in:
GrayRachnid
2020-09-01 23:57:06 -04:00
65 changed files with 3827 additions and 2900 deletions
+220 -214
View File
@@ -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
File diff suppressed because it is too large Load Diff
+8
View File
@@ -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)
+4 -4
View File
@@ -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>"
+8 -10
View File
@@ -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,
+1
View File
@@ -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
+6
View File
@@ -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"
-14
View File
@@ -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
+4 -6
View File
@@ -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))
+1 -1
View File
@@ -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)
/////////////////////
+16 -18
View File
@@ -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
+7 -7
View File
@@ -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)] &deg;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
+3
View File
@@ -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)
+13 -11
View File
@@ -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()
. = ..()
-13
View File
@@ -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 //
////////////////
+57 -19
View File
@@ -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)
+8 -1
View File
@@ -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)
+3 -1
View File
@@ -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("|")
+3 -1
View File
@@ -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"
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+2
View File
@@ -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)
+2 -2
View File
@@ -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)
+8
View File
@@ -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)
+36 -5
View File
@@ -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////////////
/////////////////////////////////////////
+1
View File
@@ -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]")
+6 -1
View File
@@ -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,
+117 -61
View File
@@ -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>
+74
View File
@@ -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"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

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"
+1
View File
@@ -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"