Merge remote-tracking branch 'Citadel-Station-13/master' into kills_the_shitty_fix
This commit is contained in:
@@ -324,6 +324,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Service Hallway"
|
||||
icon_state = "hall_service"
|
||||
|
||||
/area/hallway/secondary/civilian
|
||||
name = "Civilian Wing"
|
||||
icon_state = "hallFS"
|
||||
|
||||
|
||||
//Command
|
||||
|
||||
/area/bridge
|
||||
@@ -1046,7 +1051,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Monastery Garden"
|
||||
icon_state = "hydro"
|
||||
|
||||
|
||||
//Science
|
||||
|
||||
/area/science
|
||||
@@ -1393,3 +1397,199 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/fitness/pool
|
||||
name = "Pool Area"
|
||||
icon_state = "pool"
|
||||
|
||||
/area/crew_quarters/dorms/blue
|
||||
name = "Blue Dorms"
|
||||
icon_state = "Sleep"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_NONE
|
||||
|
||||
/area/crew_quarters/dorms/purple
|
||||
name = "Purple Dorms"
|
||||
icon_state = "Sleep"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_NONE
|
||||
|
||||
/area/crew_quarters/lounge/jazz
|
||||
name = "Jazz Lounge"
|
||||
icon_state = "yellow"
|
||||
ambientsounds = list('sound/ambience/ambidet1.ogg','sound/ambience/ambidet2.ogg')
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
|
||||
/area/crew_quarters/fitness/recreation
|
||||
name = "Recreation Area"
|
||||
icon_state = "fitness"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/fitness/cogpool
|
||||
name = "Pool"
|
||||
icon_state = "fitness"
|
||||
clockwork_warp_fail = "Pool's closed."
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/barbershop
|
||||
name = "Barbershop"
|
||||
icon_state = "blue"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/observatory
|
||||
name = "Observatory"
|
||||
icon_state = "Sleep"
|
||||
|
||||
//Engineering
|
||||
|
||||
/area/engine/teg_hot
|
||||
name = "Hot Loop"
|
||||
icon_state = "red"
|
||||
|
||||
/area/engine/teg_cold
|
||||
name = "Cold Loop"
|
||||
icon_state = "blue"
|
||||
|
||||
/area/engine/workshop
|
||||
name = "Engineering Workshop"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/security/courtroom/jury
|
||||
name = "Jury Room"
|
||||
icon_state = "courtroom"
|
||||
|
||||
/area/quartermaster/miningdock/airless
|
||||
name = "Mining Dock"
|
||||
icon_state = "mining"
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
valid_territory = FALSE
|
||||
outdoors = TRUE
|
||||
ambientsounds = SPACE
|
||||
blob_allowed = FALSE //While part of the station, what good will it do you?
|
||||
|
||||
/area/quartermaster/miningdock/airless/no_grav
|
||||
name = "Mining Dock"
|
||||
icon_state = "mining"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT
|
||||
power_light = FALSE
|
||||
power_equip = FALSE
|
||||
power_environ = FALSE
|
||||
valid_territory = FALSE
|
||||
outdoors = TRUE
|
||||
ambientsounds = SPACE
|
||||
blob_allowed = FALSE //While part of the station, what good will it do you?
|
||||
|
||||
/area/janitor/aux
|
||||
name = "Auxiliary Custodial Closet"
|
||||
icon_state = "janitor"
|
||||
flags_1 = NONE
|
||||
|
||||
/area/hydroponics/lobby
|
||||
name = "Hydroponics Lobby"
|
||||
icon_state = "hydro"
|
||||
|
||||
//Storage
|
||||
|
||||
/area/storage/emergency/generic
|
||||
name = "Emergency Storage"
|
||||
icon_state = "emergencystorage"
|
||||
|
||||
//Construction
|
||||
|
||||
/area/construction
|
||||
name = "Construction Area"
|
||||
icon_state = "yellow"
|
||||
ambientsounds = ENGINEERING
|
||||
|
||||
/area/construction/secondary
|
||||
name = "Secondary Construction Area"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/minisat_exterior
|
||||
name = "Minisat Exterior"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/mining/aux_base
|
||||
name = "Auxiliary Base Construction"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/mining/aux_base/closet
|
||||
name = "Auxiliary Closet Construction"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/supplyshuttle
|
||||
name = "Supply Shuttle"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/quarters
|
||||
name = "Engineers' Quarters"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/qmaint
|
||||
name = "Maintenance"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/hallway
|
||||
name = "Hallway"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/solars
|
||||
name = "Solar Panels"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/solarscontrol
|
||||
name = "Solar Panel Control"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/storage
|
||||
name = "Construction Site Storage"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/storage/wing
|
||||
name = "Storage Wing"
|
||||
icon_state = "storage_wing"
|
||||
|
||||
//Routers
|
||||
|
||||
/area/router
|
||||
name = "Router"
|
||||
icon_state = "yellow"
|
||||
ambientsounds = ENGINEERING
|
||||
|
||||
/area/router/service
|
||||
name = "Service Router"
|
||||
icon_state = "green"
|
||||
|
||||
/area/router/public
|
||||
name = "Public Router"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/router/sec
|
||||
name = "Security Router"
|
||||
icon_state = "blue"
|
||||
|
||||
/area/router/medsci
|
||||
name = "MedSci Router"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/router/eva
|
||||
name = "EVA Router"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/router/air
|
||||
name = "Airbridge Router"
|
||||
icon_state = "red"
|
||||
|
||||
/area/router/eng
|
||||
name = "Engineering Router"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/router/aux
|
||||
name = "Routing System"
|
||||
icon_state = "yellow"
|
||||
requires_power = FALSE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
always_unpowered = TRUE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT
|
||||
power_light = FALSE
|
||||
power_equip = FALSE
|
||||
power_environ = FALSE
|
||||
valid_territory = FALSE
|
||||
outdoors = TRUE
|
||||
ambientsounds = SPACE
|
||||
blob_allowed = FALSE //While part of the station, what good will it do you?
|
||||
@@ -63,6 +63,7 @@
|
||||
var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default?
|
||||
var/list/canSmoothWithAreas //typecache to limit the areas that atoms in this area can smooth with
|
||||
|
||||
|
||||
/// Color on minimaps, if it's null (which is default) it makes one at random.
|
||||
var/minimap_color
|
||||
|
||||
|
||||
@@ -99,6 +99,9 @@
|
||||
/area/holodeck/rec_center/winterwonderland
|
||||
name = "Holodeck - Winter Wonderland"
|
||||
|
||||
/area/holodeck/rec_center/wrestlingarena
|
||||
name = "Holodeck - Wrestling Arena"
|
||||
|
||||
// Bad programs
|
||||
|
||||
/area/holodeck/rec_center/burn
|
||||
|
||||
+61
-8
@@ -694,14 +694,64 @@
|
||||
|
||||
/atom/vv_get_dropdown()
|
||||
. = ..()
|
||||
. += "---"
|
||||
var/turf/curturf = get_turf(src)
|
||||
if (curturf)
|
||||
.["Jump to"] = "?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[curturf.x];Y=[curturf.y];Z=[curturf.z]"
|
||||
.["Modify Transform"] = "?_src_=vars;[HrefToken()];modtransform=[REF(src)]"
|
||||
.["Add reagent"] = "?_src_=vars;[HrefToken()];addreagent=[REF(src)]"
|
||||
.["Trigger EM pulse"] = "?_src_=vars;[HrefToken()];emp=[REF(src)]"
|
||||
.["Trigger explosion"] = "?_src_=vars;[HrefToken()];explode=[REF(src)]"
|
||||
VV_DROPDOWN_OPTION("", "---------")
|
||||
if(!ismovableatom(src))
|
||||
var/turf/curturf = get_turf(src)
|
||||
if(curturf)
|
||||
. += "<option value='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[curturf.x];Y=[curturf.y];Z=[curturf.z]'>Jump To</option>"
|
||||
VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRANSFORM, "Modify Transform")
|
||||
VV_DROPDOWN_OPTION(VV_HK_ADD_REAGENT, "Add Reagent")
|
||||
VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EMP, "EMP Pulse")
|
||||
VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion")
|
||||
|
||||
/atom/vv_do_topic(list/href_list)
|
||||
. = ..()
|
||||
if(href_list[VV_HK_ADD_REAGENT] && check_rights(R_VAREDIT))
|
||||
if(!reagents)
|
||||
var/amount = input(usr, "Specify the reagent size of [src]", "Set Reagent Size", 50) as num
|
||||
if(amount)
|
||||
create_reagents(amount)
|
||||
|
||||
if(reagents)
|
||||
var/chosen_id = choose_reagent_id(usr)
|
||||
if(chosen_id)
|
||||
var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", reagents.maximum_volume) as num
|
||||
if(amount)
|
||||
reagents.add_reagent(chosen_id, amount)
|
||||
log_admin("[key_name(usr)] has added [amount] units of [chosen_id] to [src]")
|
||||
message_admins("<span class='notice'>[key_name(usr)] has added [amount] units of [chosen_id] to [src]</span>")
|
||||
if(href_list[VV_HK_TRIGGER_EXPLOSION] && check_rights(R_FUN))
|
||||
usr.client.cmd_admin_explosion(src)
|
||||
if(href_list[VV_HK_TRIGGER_EMP] && check_rights(R_FUN))
|
||||
usr.client.cmd_admin_emp(src)
|
||||
if(href_list[VV_HK_MODIFY_TRANSFORM] && check_rights(R_VAREDIT))
|
||||
var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate")
|
||||
var/matrix/M = transform
|
||||
switch(result)
|
||||
if("Scale")
|
||||
var/x = input(usr, "Choose x mod","Transform Mod") as null|num
|
||||
var/y = input(usr, "Choose y mod","Transform Mod") as null|num
|
||||
if(!isnull(x) && !isnull(y))
|
||||
transform = M.Scale(x,y)
|
||||
if("Translate")
|
||||
var/x = input(usr, "Choose x mod","Transform Mod") as null|num
|
||||
var/y = input(usr, "Choose y mod","Transform Mod") as null|num
|
||||
if(!isnull(x) && !isnull(y))
|
||||
transform = M.Translate(x,y)
|
||||
if("Rotate")
|
||||
var/angle = input(usr, "Choose angle to rotate","Transform Mod") as null|num
|
||||
if(!isnull(angle))
|
||||
transform = M.Turn(angle)
|
||||
if(href_list[VV_HK_AUTO_RENAME] && check_rights(R_VAREDIT))
|
||||
var/newname = input(usr, "What do you want to rename this to?", "Automatic Rename") as null|text
|
||||
if(newname)
|
||||
vv_auto_rename(newname)
|
||||
|
||||
/atom/vv_get_header()
|
||||
. = ..()
|
||||
var/refid = REF(src)
|
||||
. += "[VV_HREF_TARGETREF(refid, VV_HK_AUTO_RENAME, "<b id='name'>[src]</b>")]"
|
||||
. += "<br><font size='1'><a href='?_src_=vars;[HrefToken()];rotatedatum=[refid];rotatedir=left'><<</a> <a href='?_src_=vars;[HrefToken()];datumedit=[refid];varnameedit=dir' id='dir'>[dir2text(dir) || dir]</a> <a href='?_src_=vars;[HrefToken()];rotatedatum=[refid];rotatedir=right'>>></a></font>"
|
||||
|
||||
/atom/proc/drop_location()
|
||||
var/atom/L = loc
|
||||
@@ -709,6 +759,9 @@
|
||||
return null
|
||||
return L.AllowDrop() ? L : L.drop_location()
|
||||
|
||||
/atom/proc/vv_auto_rename(newname)
|
||||
name = newname
|
||||
|
||||
/atom/Entered(atom/movable/AM, atom/oldLoc)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc)
|
||||
|
||||
|
||||
@@ -468,9 +468,8 @@
|
||||
|
||||
/atom/movable/vv_get_dropdown()
|
||||
. = ..()
|
||||
. -= "Jump to"
|
||||
.["Follow"] = "?_src_=holder;[HrefToken()];adminplayerobservefollow=[REF(src)]"
|
||||
.["Get"] = "?_src_=holder;[HrefToken()];admingetmovable=[REF(src)]"
|
||||
. += "<option value='?_src_=holder;[HrefToken()];adminplayerobservefollow=[REF(src)]'>Follow</option>"
|
||||
. += "<option value='?_src_=holder;[HrefToken()];admingetmovable=[REF(src)]'>Get</option>"
|
||||
|
||||
/atom/movable/proc/ex_check(ex_id)
|
||||
if(!ex_id)
|
||||
|
||||
@@ -511,7 +511,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
|
||||
drafted_rules -= starting_rule
|
||||
|
||||
starting_rule.trim_candidates()
|
||||
starting_rule.scale_up(extra_rulesets_amount, threat)
|
||||
starting_rule.scale_up(extra_rulesets_amount, threat_level)
|
||||
if (starting_rule.pre_execute())
|
||||
log_threat("[starting_rule.ruletype] - <b>[starting_rule.name]</b> [starting_rule.cost + starting_rule.scaled_times * starting_rule.scaling_cost] threat", verbose = TRUE)
|
||||
if(starting_rule.flags & HIGHLANDER_RULESET)
|
||||
|
||||
@@ -241,5 +241,5 @@
|
||||
requirements = list(10,10,10,10,10,10,10,10,10,10)
|
||||
high_population_requirement = 10
|
||||
repeatable = TRUE
|
||||
flags = TRAITOR_RULESET
|
||||
flags = TRAITOR_RULESET | MINOR_RULESET
|
||||
property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 2)
|
||||
|
||||
@@ -53,6 +53,8 @@ Property weights are:
|
||||
var/turf/T = get_turf(H)
|
||||
if(H.stat != DEAD && is_station_level(T.z) && !("Station" in H.faction))
|
||||
threat += H.threat()
|
||||
for(var/obj/item/phylactery/P in GLOB.poi_list)
|
||||
threat += 25 // can't be giving them too much of a break
|
||||
for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS])
|
||||
if (M?.mind?.assigned_role && M.stat != DEAD)
|
||||
var/datum/job/J = SSjob.GetJob(M.mind.assigned_role)
|
||||
@@ -135,17 +137,19 @@ Property weights are:
|
||||
if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET)))
|
||||
continue
|
||||
rule.trim_candidates()
|
||||
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.
|
||||
*/
|
||||
var/threat_weight = 1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0))
|
||||
var/threat_weight = 1
|
||||
if(!(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 = 1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0))
|
||||
if (rule.ready())
|
||||
var/property_weight = 0
|
||||
for(var/property in property_weights)
|
||||
@@ -168,8 +172,10 @@ Property weights are:
|
||||
|
||||
rule.candidates = list(newPlayer)
|
||||
rule.trim_candidates()
|
||||
var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat))
|
||||
var/threat_weight = 1-abs(1-(LOGISTIC_FUNCTION(2,0.05,cost_difference,0)))
|
||||
var/threat_weight = 1
|
||||
if(!(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)))
|
||||
if (rule.ready())
|
||||
var/property_weight = 0
|
||||
for(var/property in property_weights)
|
||||
@@ -200,7 +206,7 @@ Property weights are:
|
||||
weight = 1
|
||||
event_frequency_lower = 2 MINUTES
|
||||
event_frequency_upper = 10 MINUTES
|
||||
flags = WAROPS_ALWAYS_ALLOWED | FORCE_IF_WON
|
||||
flags = WAROPS_ALWAYS_ALLOWED
|
||||
min_players = 40
|
||||
var/refund_cooldown = 0
|
||||
|
||||
@@ -245,7 +251,10 @@ Property weights are:
|
||||
config_tag = "random"
|
||||
weight = 1
|
||||
desc = "No weighting at all; every ruleset has the same chance of happening. Cooldowns vary wildly. As random as it gets."
|
||||
forced_threat_level = 100
|
||||
|
||||
/datum/dynamic_storyteller/random/on_start()
|
||||
..()
|
||||
GLOB.dynamic_forced_threat_level = rand(0,100)
|
||||
|
||||
/datum/dynamic_storyteller/random/get_midround_cooldown()
|
||||
return rand(GLOB.dynamic_midround_delay_min/2, GLOB.dynamic_midround_delay_max*2)
|
||||
@@ -318,9 +327,10 @@ Property weights are:
|
||||
property_weights = list("story_potential" = 2)
|
||||
|
||||
|
||||
/datum/dynamic_storyteller/story/do_process()
|
||||
/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)+0.5),0.1)
|
||||
mode.threat_level = round(mode.initial_threat_level*(sin(current_time)+0.25),0.1)
|
||||
..()
|
||||
|
||||
/datum/dynamic_storyteller/classic
|
||||
name = "Classic"
|
||||
|
||||
@@ -663,7 +663,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
if(count)
|
||||
target_amount = count
|
||||
update_explanation_text()
|
||||
|
||||
/*
|
||||
/datum/objective/capture
|
||||
name = "capture"
|
||||
var/captured_amount = 0
|
||||
@@ -709,7 +709,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
if(count)
|
||||
target_amount = count
|
||||
update_explanation_text()
|
||||
|
||||
*/
|
||||
//Changeling Objectives
|
||||
|
||||
/datum/objective/absorb
|
||||
|
||||
@@ -77,14 +77,14 @@
|
||||
|
||||
/datum/sabotage_objective/processing/supermatter/can_run()
|
||||
return (locate(/obj/machinery/power/supermatter_crystal) in GLOB.machines)
|
||||
|
||||
/*
|
||||
/datum/sabotage_objective/station_integrity
|
||||
name = "Make sure the station is at less than 80% integrity by the end. Smash walls, windows etc. to reach this goal."
|
||||
sabotage_type = "integrity"
|
||||
|
||||
/datum/sabotage_objective/station_integrity/check_conditions()
|
||||
return 5-(max(SSticker.station_integrity*4,320)/80)
|
||||
|
||||
*/
|
||||
/datum/sabotage_objective/cloner
|
||||
name = "Destroy all Nanotrasen cloning machines."
|
||||
sabotage_type = "cloner"
|
||||
@@ -98,6 +98,9 @@
|
||||
special_equipment = list(/obj/item/aiModule/syndicate)
|
||||
excludefromjob = list("Chief Engineer","Research Director","Head of Personnel","Captain","Chief Medical Officer","Head Of Security")
|
||||
|
||||
/datum/sabotage_objective/ai_law/can_run()
|
||||
return length(active_ais())
|
||||
|
||||
/datum/sabotage_objective/ai_law/check_conditions()
|
||||
for (var/i in GLOB.ai_list)
|
||||
var/mob/living/silicon/ai/aiPlayer = i
|
||||
|
||||
@@ -207,11 +207,14 @@
|
||||
|
||||
/obj/machinery/sleeper/ui_data()
|
||||
var/list/data = list()
|
||||
var/chemical_list = list()
|
||||
var/blood_percent = 0
|
||||
|
||||
data["occupied"] = occupant ? 1 : 0
|
||||
data["open"] = state_open
|
||||
data["efficiency"] = efficiency
|
||||
data["current_vol"] = reagents.total_volume
|
||||
data["tot_capacity"] = reagents.maximum_volume
|
||||
data["blood_levels"] = blood_percent
|
||||
data["blood_status"] = "Patient either has no blood, or does not require it to function."
|
||||
data["chemical_list"] = chemical_list
|
||||
|
||||
data["chems"] = list()
|
||||
for(var/chem in available_chems)
|
||||
@@ -247,10 +250,13 @@
|
||||
data["occupant"]["fireLoss"] = mob_occupant.getFireLoss()
|
||||
data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss()
|
||||
data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN)
|
||||
data["occupant"]["reagents"] = list()
|
||||
if(mob_occupant.reagents && mob_occupant.reagents.reagent_list.len)
|
||||
|
||||
if(mob_occupant.reagents.reagent_list.len)
|
||||
for(var/datum/reagent/R in mob_occupant.reagents.reagent_list)
|
||||
data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume))
|
||||
chemical_list += list(list("name" = R.name, "volume" = R.volume))
|
||||
else
|
||||
chemical_list = "Patient has no reagents."
|
||||
|
||||
data["occupant"]["failing_organs"] = list()
|
||||
var/mob/living/carbon/C = mob_occupant
|
||||
if(C)
|
||||
@@ -259,21 +265,25 @@
|
||||
continue
|
||||
data["occupant"]["failing_organs"] += list(list("name" = Or.name))
|
||||
|
||||
if(mob_occupant.has_dna()) // Blood-stuff is mostly a copy-paste from the healthscanner.
|
||||
var/blood_id = C.get_blood_id()
|
||||
if(blood_id)
|
||||
data["occupant"]["blood"] = list() // We can start populating this list.
|
||||
var/blood_type = C.dna.blood_type
|
||||
if(!(blood_id in GLOB.blood_reagent_types)) // special blood substance
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id]
|
||||
if(R)
|
||||
blood_type = R.name
|
||||
else
|
||||
blood_type = blood_id
|
||||
data["occupant"]["blood"]["maxBloodVolume"] = (BLOOD_VOLUME_NORMAL*C.blood_ratio)
|
||||
data["occupant"]["blood"]["currentBloodVolume"] = C.blood_volume
|
||||
data["occupant"]["blood"]["dangerBloodVolume"] = BLOOD_VOLUME_SAFE
|
||||
data["occupant"]["blood"]["bloodType"] = blood_type
|
||||
if(istype(C)) //Non-carbons shouldn't be able to enter sleepers, but this is to prevent runtimes if something ever breaks
|
||||
if(mob_occupant.has_dna()) // Blood-stuff is mostly a copy-paste from the healthscanner.
|
||||
blood_percent = round((C.blood_volume / BLOOD_VOLUME_NORMAL)*100)
|
||||
var/blood_id = C.get_blood_id()
|
||||
var/blood_warning = ""
|
||||
if(blood_percent < 80)
|
||||
blood_warning = "Patient has low blood levels."
|
||||
if(blood_percent < 60)
|
||||
blood_warning = "Patient has DANGEROUSLY low blood levels."
|
||||
if(blood_id)
|
||||
var/blood_type = C.dna.blood_type
|
||||
if(!(blood_id in GLOB.blood_reagent_types)) // special blood substance
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id]
|
||||
if(R)
|
||||
blood_type = R.name
|
||||
else
|
||||
blood_type = blood_id
|
||||
data["blood_status"] = "Patient has [blood_type] type blood. [blood_warning]"
|
||||
data["blood_levels"] = blood_percent
|
||||
return data
|
||||
|
||||
/obj/machinery/sleeper/ui_act(action, params)
|
||||
@@ -309,14 +319,14 @@
|
||||
if(allowed(usr))
|
||||
if(!is_operational())
|
||||
return
|
||||
reagents.remove_reagent(chem, 10)
|
||||
reagents.remove_reagent(chem, 1000)
|
||||
return
|
||||
if(chem in available_chems)
|
||||
if(!is_operational())
|
||||
return
|
||||
/*var/datum/reagent/R = reagents.has_reagent(chem) //For when purity effects are in
|
||||
if(R.purity < 0.8)*/
|
||||
reagents.remove_reagent(chem, 10)
|
||||
reagents.remove_reagent(chem, 1000)
|
||||
else
|
||||
visible_message("<span class='warning'>Access Denied.</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
|
||||
@@ -159,6 +159,8 @@
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED) && !exploding_hell)
|
||||
exploding_hell = TRUE
|
||||
explode_EVERYTHING()
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(mine_sound)
|
||||
switch(rand(1,3)) //Play every time a mine is hit
|
||||
if(1)
|
||||
@@ -367,10 +369,10 @@
|
||||
var/row_limit = rows-1
|
||||
var/column_limit = columns-1
|
||||
var/mine_limit_v2 = mine_limit
|
||||
if(rows > 11)
|
||||
row_limit = 10
|
||||
if(columns > 11)
|
||||
column_limit = 10
|
||||
if(rows > 21)
|
||||
row_limit = 20
|
||||
if(columns > 21)
|
||||
column_limit = 20
|
||||
if(mine_limit > (rows*columns) * 0.25)
|
||||
mine_limit_v2 = 24
|
||||
message_admins("[key_name_admin(user)] failed an emagged Minesweeper arcade and has unleashed an explosion armageddon of size [row_limit],[column_limit] around [ADMIN_LOOKUPFLW(user.loc)]!")
|
||||
@@ -378,12 +380,27 @@
|
||||
explosion(loc, 2, 5, 10, 15) //Thought you could survive by putting as few mines as possible, huh??
|
||||
else
|
||||
explosion(loc, 1, 3, rand(1,5), rand(1,10))
|
||||
for(var/y69=y-row_limit;y69<y+row_limit;y69++) //Create a shitton of explosions in irl turfs if we lose, it will probably kill us
|
||||
for(var/x69=x-column_limit;x69<x+column_limit;x69++)
|
||||
if(prob(mine_limit_v2)) //Probability of explosion happening, according to how many mines were on the board... up to a limit
|
||||
var/explosionloc
|
||||
explosionloc = locate(y69,x69,z)
|
||||
explosion(explosionloc, 0, rand(1,2),rand(1,5),rand(3,10), adminlog = FALSE)
|
||||
var/list/targets = list()
|
||||
var/cur_y = y - round(row_limit * 0.5, 1)
|
||||
var/start_x = x - round(column_limit * 0.5, 1)
|
||||
for(var/row in table) //translate the mines locations into actual turf coordinates.
|
||||
if(!locate(cur_y, start_x, z))
|
||||
continue
|
||||
var/cur_x = start_x
|
||||
for(var/column in row)
|
||||
var/coord_value = table[row][column]
|
||||
if(coord_value == 10 || coord_value == 0) //there is a mine in here.
|
||||
var/turf/target = locate(cur_y, cur_x, z)
|
||||
if(!target)
|
||||
continue
|
||||
targets += target
|
||||
cur_x++
|
||||
cur_y++
|
||||
var/num_explosions = 0
|
||||
for(var/T in shuffle(targets)) //Create a shitton of explosions in irl turfs if we lose, it will probably kill us
|
||||
addtimer(CALLBACK(GLOBAL_PROC, /proc/explosion, T, 0, rand(1,2),rand(1,5),rand(3,10), FALSE), 15 * ++num_explosions)
|
||||
if(num_explosions == mine_limit_v2)
|
||||
return
|
||||
|
||||
#undef MINESWEEPERIMG
|
||||
#undef MINESWEEPER_GAME_MAIN_MENU
|
||||
|
||||
@@ -384,8 +384,8 @@
|
||||
desc = "The POWER that gamers CRAVE! In partnership with Vlad's Salad."
|
||||
icon_state = "poster39"
|
||||
|
||||
/obj/structure/sign/poster/contraband/sun_kist
|
||||
name = "Sun-kist"
|
||||
/obj/structure/sign/poster/contraband/starkist
|
||||
name = "Star-kist"
|
||||
desc = "Drink the stars!"
|
||||
icon_state = "poster40"
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
var/lit = FALSE
|
||||
var/infinite = FALSE
|
||||
var/start_lit = FALSE
|
||||
var/heats_space = TRUE
|
||||
|
||||
/obj/item/candle/Initialize()
|
||||
. = ..()
|
||||
@@ -35,7 +36,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/candle/get_temperature()
|
||||
return lit * heat
|
||||
return lit * heat * heats_space
|
||||
|
||||
/obj/item/candle/proc/light(show_message)
|
||||
if(!lit)
|
||||
@@ -67,7 +68,8 @@
|
||||
new /obj/item/trash/candle(loc)
|
||||
qdel(src)
|
||||
update_icon()
|
||||
open_flame()
|
||||
if(heats_space)
|
||||
open_flame()
|
||||
|
||||
/obj/item/candle/attack_self(mob/user)
|
||||
if(put_out_candle())
|
||||
@@ -77,4 +79,7 @@
|
||||
infinite = TRUE
|
||||
start_lit = TRUE
|
||||
|
||||
/obj/item/candle/infinite/hugbox
|
||||
heats_space = FALSE
|
||||
|
||||
#undef CANDLE_LUMINOSITY
|
||||
|
||||
@@ -293,10 +293,6 @@
|
||||
name = "Mining Shuttle (Computer Board)"
|
||||
build_path = /obj/machinery/computer/shuttle/mining
|
||||
|
||||
/obj/item/circuitboard/computer/mining_shuttle/common
|
||||
name = "Lavaland Shuttle (Computer Board)"
|
||||
build_path = /obj/machinery/computer/shuttle/mining/common
|
||||
|
||||
/obj/item/circuitboard/computer/white_ship
|
||||
name = "White Ship (Computer Board)"
|
||||
build_path = /obj/machinery/computer/shuttle/white_ship
|
||||
|
||||
@@ -113,24 +113,24 @@
|
||||
desc = "Looks like some cables tied together. Could be used to tie something up."
|
||||
icon_state = "cuff"
|
||||
item_state = "coil"
|
||||
item_color = "red"
|
||||
color = "#ff0000"
|
||||
color = "red"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
custom_materials = list(/datum/material/iron=150, /datum/material/glass=75)
|
||||
breakouttime = 300 //Deciseconds = 30s
|
||||
cuffsound = 'sound/weapons/cablecuff.ogg'
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/Initialize(mapload, param_color)
|
||||
. = ..()
|
||||
|
||||
var/list/cable_colors = GLOB.cable_colors
|
||||
item_color = param_color || item_color || pick(cable_colors)
|
||||
if(cable_colors[item_color])
|
||||
item_color = cable_colors[item_color]
|
||||
color = null
|
||||
add_atom_colour(item_color, FIXED_COLOUR_PRIORITY)
|
||||
cuffsound = 'sound/weapons/cablecuff.ogg'
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/attack_self(mob/user)
|
||||
to_chat(user, "<span class='notice'>You start unwinding the cable restraints back into coil</span>")
|
||||
if(!do_after(user, 25, TRUE, user))
|
||||
return
|
||||
qdel(src)
|
||||
var/obj/item/stack/cable_coil/coil = new(get_turf(user))
|
||||
coil.amount = 15
|
||||
user.put_in_hands(coil)
|
||||
coil.color = color
|
||||
to_chat(user, "<span class='notice'>You unwind the cable restraints back into coil</span>")
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/red
|
||||
item_color = "red"
|
||||
color = "#ff0000"
|
||||
@@ -162,6 +162,13 @@
|
||||
/obj/item/restraints/handcuffs/cable/white
|
||||
item_color = "white"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/random
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/random/Initialize(mapload)
|
||||
. = ..()
|
||||
var/list/cable_colors = GLOB.cable_colors
|
||||
color = pick(cable_colors)
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(istype(I, /obj/item/stack/rods))
|
||||
|
||||
@@ -494,7 +494,7 @@
|
||||
S.ckey = C.ckey
|
||||
S.status_flags |= GODMODE
|
||||
S.language_holder = user.language_holder.copy(S)
|
||||
S.AddElement(/datum/element/ghost_role_eligibility)
|
||||
S.AddElement(/datum/element/ghost_role_eligibility,penalize_on_ghost = TRUE)
|
||||
START_PROCESSING(SSprocessing,src)
|
||||
var/input = stripped_input(S,"What are you named?", ,"", MAX_NAME_LEN)
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
if (!spell)
|
||||
return FALSE
|
||||
if (autorobeless && spell.clothes_req)
|
||||
spell.clothes_req = FALSE
|
||||
spell.clothes_req = NONE
|
||||
target.AddSpell(spell)
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
|
||||
/obj/item/pinpointer/crew/proc/trackable(mob/living/carbon/human/H)
|
||||
var/turf/here = get_turf(src)
|
||||
if((H.z == 0 || H.z == here.z) && istype(H.w_uniform, /obj/item/clothing/under))
|
||||
if(H && (H.z == 0 || H.z == here.z) && istype(H.w_uniform, /obj/item/clothing/under))
|
||||
var/obj/item/clothing/under/U = H.w_uniform
|
||||
|
||||
// Suit sensors must be on maximum.
|
||||
|
||||
@@ -182,8 +182,8 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
|
||||
new/datum/stack_recipe("crate", /obj/structure/closet/crate, 5, time = 90, one_per_turf = TRUE), \
|
||||
null, \
|
||||
new /datum/stack_recipe_list("airlock assemblies", list( \
|
||||
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 6, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("vault door assembly", /obj/structure/door_assembly/door_assembly_vault, 8, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("vault door assembly", /obj/structure/door_assembly/door_assembly_vault, 6, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
)), \
|
||||
))
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
attack_verb = list("beaten")
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
|
||||
|
||||
var/stamforce = 25
|
||||
var/stamforce = 35
|
||||
var/status = FALSE
|
||||
var/knockdown = TRUE
|
||||
var/obj/item/stock_parts/cell/cell
|
||||
|
||||
@@ -498,7 +498,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
icon_state = "catwhip"
|
||||
|
||||
/obj/item/melee/skateboard
|
||||
name = "skateboard"
|
||||
name = "improvised skateboard"
|
||||
desc = "A skateboard. It can be placed on its wheels and ridden, or used as a strong weapon."
|
||||
icon_state = "skateboard"
|
||||
item_state = "skateboard"
|
||||
@@ -506,11 +506,37 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
throwforce = 4
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb = list("smacked", "whacked", "slammed", "smashed")
|
||||
///The vehicle counterpart for the board
|
||||
var/board_item_type = /obj/vehicle/ridden/scooter/skateboard
|
||||
|
||||
/obj/item/melee/skateboard/attack_self(mob/user)
|
||||
new /obj/vehicle/ridden/scooter/skateboard(get_turf(user))
|
||||
if(!user.canUseTopic(src, TRUE, FALSE, TRUE))
|
||||
return
|
||||
var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user))
|
||||
S.buckle_mob(user)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/melee/skateboard/pro
|
||||
name = "skateboard"
|
||||
desc = "A RaDSTORMz brand professional skateboard. It looks sturdy and well made."
|
||||
icon_state = "skateboard2"
|
||||
item_state = "skateboard2"
|
||||
board_item_type = /obj/vehicle/ridden/scooter/skateboard/pro
|
||||
|
||||
/obj/item/melee/skateboard/hoverboard
|
||||
name = "hoverboard"
|
||||
desc = "A blast from the past, so retro!"
|
||||
icon_state = "hoverboard_red"
|
||||
item_state = "hoverboard_red"
|
||||
board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard
|
||||
|
||||
/obj/item/melee/skateboard/hoverboard/admin
|
||||
name = "\improper Board Of Directors"
|
||||
desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too."
|
||||
icon_state = "hoverboard_nt"
|
||||
item_state = "hoverboard_nt"
|
||||
board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin
|
||||
|
||||
/obj/item/melee/baseball_bat
|
||||
name = "baseball bat"
|
||||
desc = "There ain't a skull in the league that can withstand a swatter."
|
||||
|
||||
@@ -213,9 +213,78 @@
|
||||
|
||||
/obj/vv_get_dropdown()
|
||||
. = ..()
|
||||
.["Delete all of type"] = "?_src_=vars;[HrefToken()];delall=[REF(src)]"
|
||||
.["Osay"] = "?_src_=vars;[HrefToken()];osay[REF(src)]"
|
||||
.["Modify armor values"] = "?_src_=vars;[HrefToken()];modarmor=[REF(src)]"
|
||||
VV_DROPDOWN_OPTION("", "---")
|
||||
VV_DROPDOWN_OPTION(VV_HK_MASS_DEL_TYPE, "Delete all of type")
|
||||
VV_DROPDOWN_OPTION(VV_HK_OSAY, "Object Say")
|
||||
VV_DROPDOWN_OPTION(VV_HK_ARMOR_MOD, "Modify armor values")
|
||||
|
||||
/obj/vv_do_topic(list/href_list)
|
||||
if(!(. = ..()))
|
||||
return
|
||||
if(href_list[VV_HK_OSAY])
|
||||
if(check_rights(R_FUN, FALSE))
|
||||
usr.client.object_say(src)
|
||||
if(href_list[VV_HK_ARMOR_MOD])
|
||||
var/list/pickerlist = list()
|
||||
var/list/armorlist = armor.getList()
|
||||
|
||||
for (var/i in armorlist)
|
||||
pickerlist += list(list("value" = armorlist[i], "name" = i))
|
||||
|
||||
var/list/result = presentpicker(usr, "Modify armor", "Modify armor: [src]", Button1="Save", Button2 = "Cancel", Timeout=FALSE, inputtype = "text", values = pickerlist)
|
||||
|
||||
if (islist(result))
|
||||
if (result["button"] != 2) // If the user pressed the cancel button
|
||||
// text2num conveniently returns a null on invalid values
|
||||
armor = armor.setRating(melee = text2num(result["values"]["melee"]),\
|
||||
bullet = text2num(result["values"]["bullet"]),\
|
||||
laser = text2num(result["values"]["laser"]),\
|
||||
energy = text2num(result["values"]["energy"]),\
|
||||
bomb = text2num(result["values"]["bomb"]),\
|
||||
bio = text2num(result["values"]["bio"]),\
|
||||
rad = text2num(result["values"]["rad"]),\
|
||||
fire = text2num(result["values"]["fire"]),\
|
||||
acid = text2num(result["values"]["acid"]))
|
||||
log_admin("[key_name(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], rad: [armor.rad], fire: [armor.fire], acid: [armor.acid]")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], rad: [armor.rad], fire: [armor.fire], acid: [armor.acid]</span>")
|
||||
if(href_list[VV_HK_MASS_DEL_TYPE])
|
||||
if(check_rights(R_DEBUG|R_SERVER))
|
||||
var/action_type = alert("Strict type ([type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
|
||||
if(action_type == "Cancel" || !action_type)
|
||||
return
|
||||
|
||||
if(alert("Are you really sure you want to delete all objects of type [type]?",,"Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
var/O_type = type
|
||||
switch(action_type)
|
||||
if("Strict type")
|
||||
var/i = 0
|
||||
for(var/obj/Obj in world)
|
||||
if(Obj.type == O_type)
|
||||
i++
|
||||
qdel(Obj)
|
||||
CHECK_TICK
|
||||
if(!i)
|
||||
to_chat(usr, "No objects of this type exist")
|
||||
return
|
||||
log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
|
||||
message_admins("<span class='notice'>[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) </span>")
|
||||
if("Type and subtypes")
|
||||
var/i = 0
|
||||
for(var/obj/Obj in world)
|
||||
if(istype(Obj,O_type))
|
||||
i++
|
||||
qdel(Obj)
|
||||
CHECK_TICK
|
||||
if(!i)
|
||||
to_chat(usr, "No objects of this type exist")
|
||||
return
|
||||
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
|
||||
message_admins("<span class='notice'>[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) </span>")
|
||||
|
||||
/obj/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -243,6 +243,7 @@
|
||||
//door.req_access = req_access
|
||||
door.electronics = electronics
|
||||
door.heat_proof = heat_proof_finished
|
||||
door.security_level = 0
|
||||
if(electronics.one_access)
|
||||
door.req_one_access = electronics.accesses
|
||||
else
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
airlock_type = /obj/machinery/door/airlock/highsecurity
|
||||
noglass = TRUE
|
||||
material_type = /obj/item/stack/sheet/plasteel
|
||||
material_amt = 6
|
||||
material_amt = 4
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_vault
|
||||
name = "vault door assembly"
|
||||
@@ -124,7 +124,7 @@
|
||||
airlock_type = /obj/machinery/door/airlock/vault
|
||||
noglass = TRUE
|
||||
material_type = /obj/item/stack/sheet/plasteel
|
||||
material_amt = 8
|
||||
material_amt = 6
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_shuttle
|
||||
name = "shuttle airlock assembly"
|
||||
|
||||
@@ -674,17 +674,14 @@
|
||||
O.equip(new_spawn, FALSE, new_spawn.client)
|
||||
SSjob.equip_loadout(null, new_spawn, FALSE)
|
||||
SSquirks.AssignQuirks(new_spawn, new_spawn.client, TRUE, TRUE, null, FALSE, new_spawn)
|
||||
new_spawn.AddElement(/datum/element/ghost_role_eligibility)
|
||||
new_spawn.AddElement(/datum/element/ghost_role_eligibility, free_ghosting = TRUE)
|
||||
new_spawn.AddElement(/datum/element/dusts_on_catatonia)
|
||||
new_spawn.AddElement(/datum/element/dusts_on_leaving_area,list(A.type,/area/hilbertshotel))
|
||||
ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT)
|
||||
ADD_TRAIT(new_spawn, TRAIT_EXEMPT_HEALTH_EVENTS, GHOSTROLE_TRAIT)
|
||||
ADD_TRAIT(new_spawn, TRAIT_NO_MIDROUND_ANTAG, GHOSTROLE_TRAIT) //The mob can't be made into a random antag, they are still elegible for ghost roles popups.
|
||||
ADD_TRAIT(new_spawn, TRAIT_NO_MIDROUND_ANTAG, GHOSTROLE_TRAIT) //The mob can't be made into a random antag, they are still eligible for ghost roles popups.
|
||||
ADD_TRAIT(new_spawn, TRAIT_PACIFISM, GHOSTROLE_TRAIT)
|
||||
to_chat(new_spawn,"<span class='boldwarning'>You may be sharing your cafe with some ninja-captured individuals, so make sure to only interact with the ghosts you hear as a ghost!</span>")
|
||||
to_chat(new_spawn,"<span class='boldwarning'>You can turn yourself into a ghost and freely reenter your body with the ghost action.</span>")
|
||||
var/datum/action/ghost/G = new(new_spawn)
|
||||
G.Grant(new_spawn)
|
||||
to_chat(new_spawn,"<span class='boldwarning'>Ghosting is free!</span>")
|
||||
var/datum/action/toggle_dead_chat_mob/D = new(new_spawn)
|
||||
D.Grant(new_spawn)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user