Merge branch 'master' into upstream-merge-31371

This commit is contained in:
LetterJay
2017-10-08 15:37:46 -04:00
committed by GitHub
43 changed files with 256 additions and 87 deletions
+1 -1
View File
@@ -70,4 +70,4 @@
#define ADMIN_MARKREAD(client) "(<a href='?_src_=holder;markedread=\ref[client]'>MARK READ</a>)"//marks an adminhelp as read and under investigation
#define ADMIN_IC(client) "(<a href='?_src_=holder;icissue=\ref[client]'>IC</a>)"//marks and adminhelp as an IC issue
#define ADMIN_REJECT(client) "(<a href='?_src_=holder;rejectadminhelp=\ref[client]'>REJT</a>)"//Rejects an adminhelp for being unclear or otherwise unhelpful. resets their adminhelp timer
#define ADMIN_REJECT(client) "(<a href='?_src_=holder;rejectadminhelp=\ref[client]'>REJT</a>)"//Rejects an adminhelp for being unclear or otherwise unhelpful. resets their adminhelp timer
-2
View File
@@ -55,8 +55,6 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define POWER_PLASTEEL (CLOCKCULT_POWER_UNIT*0.05) //how much power is in one sheet of plasteel
#define RATVAR_POWER_CHECK "ratvar?" //when passed into can_use_power(), converts it into a check for if ratvar has woken/the fabricator is debug
//Ark defines
#define GATEWAY_SUMMON_RATE 1 //the time amount the Gateway to the Celestial Derelict gets each process tick; defaults to 1 per tick
+1
View File
@@ -2,6 +2,7 @@
#define CONFIG_DEF(X) /datum/config_entry/##X { resident_file = CURRENT_RESIDENT_FILE }; /datum/config_entry/##X
#define CONFIG_GET(X) global.config.Get(/datum/config_entry/##X)
#define CONFIG_SET(X, Y) global.config.Set(/datum/config_entry/##X, ##Y)
#define CONFIG_TWEAK(X) /datum/config_entry/##X
#define CONFIG_MAPS_FILE "maps.txt"
+3 -1
View File
@@ -24,6 +24,7 @@
#define ROLE_SERVANT_OF_RATVAR "servant of Ratvar"
#define ROLE_BORER "borer"
#define ROLE_BROTHER "blood brother"
#define ROLE_MISCREANT "miscreant"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
@@ -46,7 +47,8 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_ABDUCTOR = /datum/game_mode/abduction,
ROLE_DEVIL = /datum/game_mode/devil,
ROLE_BORER,
ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult
ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult,
ROLE_MISCREANT
))
//Job defines for what happens when you fail to qualify for any job during job selection
+3 -2
View File
@@ -1,6 +1,6 @@
/datum/controller/subsystem/ticker/proc/generate_crew_objectives()
for(var/datum/mind/crewMind in SSticker.minds)
if(prob(2) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed)
if(prob(2) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in crewMind.current.client.prefs.be_special)
generate_miscreant_objectives(crewMind)
else
if(CONFIG_GET(flag/allow_crew_objectives))
@@ -25,7 +25,8 @@
return
newObjective.owner = crewMind
crewMind.objectives += newObjective
to_chat(crewMind, "<B>Your objective:</B> [newObjective.explanation_text]")
to_chat(crewMind, "<B>As a part of Nanotrasen's anti-tide efforts, you have been assigned an optional objective. It will be checked at the end of the shift. <font color=red>Performing traitorous acts in pursuit of your objective may result in termination of your employment.</font></B>")
to_chat(crewMind, "<B>Your optional objective:</B> [newObjective.explanation_text]")
/datum/controller/subsystem/ticker/proc/get_valid_crew_objs(var/job = "")//taken from old hippie with adjustments
var/list/objpaths = typesof(/datum/objective/crew)
+6 -1
View File
@@ -7,6 +7,8 @@
return
if(!crewMind.assigned_role)
return
if(ROLE_MISCREANT in crewMind.current.client.prefs.be_special)
return
if(jobban_isbanned(crewMind, "Syndicate"))
return
var/list/objectiveTypes = typesof(/datum/objective/miscreant) - /datum/objective/miscreant
@@ -58,4 +60,7 @@
explanation_text = "Act as out of character as you possibly can."
/datum/objective/miscreant/racism
explanation_text = "Attempt to establish superiority of your race."
explanation_text = "Attempt to establish superiority of your species."
/datum/objective/miscreant/cargonia
explanation_text = "Attempt to establish independence of your department."
@@ -185,29 +185,6 @@
else
return FALSE
/datum/objective/crew/departmentclothes
var/obj/item/clothing/under/rank/targetuniform
explanation_text = "Be wearing a (Yo, this objective broke. report this to citadels discord via the development channel) at the end of the shift."
jobs = "assistant"
/datum/objective/crew/departmentclothes/New()
. = ..()
var/list/blacklist = list(/obj/item/clothing/under/rank, /obj/item/clothing/under/rank/miner, /obj/item/clothing/under/rank/medical/blue, /obj/item/clothing/under/rank/medical/green, /obj/item/clothing/under/rank/medical/purple, /obj/item/clothing/under/rank/security/grey, /obj/item/clothing/under/rank/warden/grey, /obj/item/clothing/under/rank/head_of_security/grey, /obj/item/clothing/under/rank/mailman, /obj/item/clothing/under/rank/psyche, /obj/item/clothing/under/rank/clown/sexy, /obj/item/clothing/under/rank/centcom_officer, /obj/item/clothing/under/rank/centcom_commander, /obj/item/clothing/under/rank/security/navyblue/russian, /obj/item/clothing/under/rank/security/blueshirt)
var/list/validclothes = typesof(/obj/item/clothing/under/rank) - blacklist
targetuniform = pick(validclothes)
update_explanation_text()
/datum/objective/crew/departmentclothes/update_explanation_text()
. = ..()
explanation_text = "Be wearing a [initial(targetuniform.name)] at the end of the shift."
/datum/objective/crew/departmentclothes/check_completion()
if(owner && owner.current)
var/mob/living/carbon/human/H = owner.current
if(istype(H.w_uniform, targetuniform))
return TRUE
return FALSE
/datum/objective/crew/pwrgame //ported from Goon with adjustments
var/obj/item/clothing/targettidegarb
explanation_text = "Get your grubby hands on a (Dear god something broke. Report this to Citadel's development dicussion channel)."
@@ -215,7 +192,9 @@
/datum/objective/crew/pwrgame/New()
. = ..()
var/list/muhvalids = list(/obj/item/clothing/mask/gas, /obj/item/clothing/head/welding, /obj/item/clothing/head/ushanka, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas/owl_mask, /obj/item/clothing/suit/space)
var/list/muhvalids = list(/obj/item/clothing/mask/gas, /obj/item/clothing/head/welding, /obj/item/clothing/head/ushanka, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas/owl_mask)
if(prob(10))
muhvalids += list(/obj/item/clothing/suit/space)
targettidegarb = pick(muhvalids)
update_explanation_text()
@@ -74,7 +74,7 @@
return FALSE
/datum/objective/crew/noinfections
explanation_text = "Ensure no living crew members are infected with harmful viruses at the end of the shift"
explanation_text = "Make sure there are no crew members with harmful diseases at the end of the shift."
jobs = "virologist"
/datum/objective/crew/noinfections/check_completion()
@@ -93,6 +93,17 @@
w_class = WEIGHT_CLASS_SMALL
body_parts_covered = CHEST|GROIN|LEGS|ARMS
/obj/item/toy/plush/tree
name = "christmass tree plushie"
desc = "A festive plush that squeeks when you squeeze it!"
icon = 'icons/obj/plushes.dmi'
icon_state = "pine_c"
item_state = "pine_c"
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("slapped")
resistance_flags = FLAMMABLE
squeak_override = list('sound/items/bikehorn.ogg'= 1)
/*Zigfie*/
@@ -49,7 +49,6 @@ GLOBAL_PROTECT(config_dir)
if(initial(E.abstract_type) == I)
continue
E = new I
_entries_by_type[I] = E
var/esname = E.name
var/datum/config_entry/test = _entries[esname]
if(test)
@@ -57,6 +56,7 @@ GLOBAL_PROTECT(config_dir)
qdel(E)
continue
_entries[esname] = E
_entries_by_type[I] = E
.[E.resident_file] = TRUE
/datum/controller/configuration/proc/RemoveEntry(datum/config_entry/CE)
@@ -268,3 +268,8 @@ CONFIG_DEF(flag/allow_extended_miscreants)
GLOB.MAX_EX_LIGHT_RANGE = value
GLOB.MAX_EX_FLASH_RANGE = value
GLOB.MAX_EX_FLAME_RANGE = value
CONFIG_DEF(number/emergency_shuttle_autocall_threshold)
min_val = 0
max_val = 1
integer = FALSE
+10
View File
@@ -573,3 +573,13 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
for(var/S in subsystems)
var/datum/controller/subsystem/SS = S
SS.StopLoadingMap()
/datum/controller/master/proc/UpdateTickRate()
if (!processing)
return
var/client_count = length(GLOB.clients)
if (client_count < CONFIG_GET(number/mc_tick_rate/disable_high_pop_mc_mode_amount))
processing = CONFIG_GET(number/mc_tick_rate/base_mc_tick_rate)
else if (client_count > CONFIG_GET(number/mc_tick_rate/high_pop_mc_mode_amount))
processing = CONFIG_GET(number/mc_tick_rate/high_pop_mc_tick_rate)
+27 -1
View File
@@ -136,6 +136,7 @@ SUBSYSTEM_DEF(shuttle)
if(changed_transit)
color_space()
#endif
CheckAutoEvac()
while(transit_requesters.len)
var/requester = popleft(transit_requesters)
@@ -148,7 +149,32 @@ SUBSYSTEM_DEF(shuttle)
var/obj/docking_port/mobile/M = requester
M.transit_failure()
if(MC_TICK_CHECK)
return
break
/datum/controller/subsystem/shuttle/proc/CheckAutoEvac()
if(emergencyNoEscape || emergencyNoRecall || !emergency)
return
var/threshold = CONFIG_GET(number/emergency_shuttle_autocall_threshold)
if(!threshold)
return
var/alive = 0
for(var/I in GLOB.player_list)
var/mob/M = I
if(M.stat != DEAD)
++alive
var/total = GLOB.joined_player_list.len
if(alive / total <= threshold)
var/msg = "Automatically dispatching shuttle due to crew death."
message_admins(msg)
log_game("[msg] Alive: [alive], Roundstart: [total], Threshold: [threshold]")
emergencyNoRecall = TRUE
priority_announce("Catastrophic casualties detected: crisis shuttle protocols activated - jamming recall signals across all frequencies.")
if(emergency.timeLeft(1) > emergencyCallTime * 0.4)
emergency.request(null, set_coefficient = 0.4)
/datum/controller/subsystem/shuttle/proc/getShuttle(id)
for(var/obj/docking_port/mobile/M in mobile)
+6 -6
View File
@@ -258,7 +258,7 @@ SUBSYSTEM_DEF(ticker)
//Deleting Startpoints but we need the ai point to AI-ize people later
if(S.name != "AI")
qdel(S)
//assign crew objectives and generate miscreants
if(CONFIG_GET(flag/allow_extended_miscreants) && GLOB.master_mode == "extended")
GLOB.miscreants_allowed = TRUE
@@ -282,7 +282,7 @@ SUBSYSTEM_DEF(ticker)
qdel(bomb)
if(epi)
explosion(epi, 0, 256, 512, 0, TRUE, TRUE, 0, TRUE)
/datum/controller/subsystem/ticker/proc/create_characters()
for(var/mob/dead/new_player/player in GLOB.player_list)
if(player.ready == PLAYER_READY_TO_PLAY && player.mind)
@@ -472,13 +472,13 @@ SUBSYSTEM_DEF(ticker)
if(!crewMind.current || !crewMind.objectives.len)
continue
for(var/datum/objective/miscreant/MO in crewMind.objectives)
miscreants += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>). <B>Objective</B>: [MO.explanation_text]"
miscreants += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>)<BR><B>Objective</B>: [MO.explanation_text] <font color='grey'>(Optional)</font><BR>"
for(var/datum/objective/crew/CO in crewMind.objectives)
if(CO.check_completion())
to_chat(crewMind.current, "<br><B>Your objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font>")
successfulCrew += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>). <B>Objective</B>: [CO.explanation_text]"
to_chat(crewMind.current, "<br><B>Your optional objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font>")
successfulCrew += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>)<BR><B>Objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font> <font color='grey'>(Optional)</font><BR>"
else
to_chat(crewMind.current, "<br><B>Your objective</B>: [CO.explanation_text] <font color='red'><B>Failed.</B></font>")
to_chat(crewMind.current, "<br><B>Your optional objective</B>: [CO.explanation_text] <font color='red'><B>Failed.</B></font>")
if (successfulCrew.len)
var/completedObjectives = "<B>The following crew members completed their Crew Objectives:</B><BR>"
+1 -1
View File
@@ -123,7 +123,7 @@
/datum/disease/advance/proc/HasSymptom(datum/symptom/S)
for(var/datum/symptom/symp in symptoms)
if(symp.id == S.id)
if(symp.type == S.type)
return 1
return 0
@@ -131,7 +131,7 @@ Bonus
/datum/symptom/heal/brute/Heal(mob/living/carbon/M, datum/disease/advance/A)
var/heal_amt = 2 * power
var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
var/list/parts = M.get_damaged_bodyparts(1,0) //brute only
if(!parts.len)
return
@@ -175,7 +175,7 @@ Bonus
/datum/symptom/heal/brute/plus/Heal(mob/living/carbon/M, datum/disease/advance/A)
var/heal_amt = 4 * power
var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
var/list/parts = M.get_damaged_bodyparts(1,0) //brute only
if(M.getCloneLoss() > 0)
M.adjustCloneLoss(-1)
@@ -225,7 +225,7 @@ Bonus
/datum/symptom/heal/burn/Heal(mob/living/carbon/M, datum/disease/advance/A)
var/heal_amt = 2 * power
var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
var/list/parts = M.get_damaged_bodyparts(0,1) //burn only
if(!parts.len)
return
@@ -268,7 +268,7 @@ Bonus
/datum/symptom/heal/burn/plus/Heal(mob/living/carbon/M, datum/disease/advance/A)
var/heal_amt = 4 * power
var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
var/list/parts = M.get_damaged_bodyparts(0,1) //burn only
if(M.bodytemperature > 310)
M.bodytemperature = max(310, M.bodytemperature - (10 * heal_amt * TEMPERATURE_DAMAGE_COEFFICIENT))
@@ -43,8 +43,11 @@ BONUS
/datum/symptom/itching/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
var/can_scratch = scratch && !M.incapacitated()
to_chat(M, "<span class='warning'>Your [pick("back", "arm", "leg", "elbow", "head")] itches. [can_scratch ? " You scratch it." : ""]</span>")
if(can_scratch)
M.adjustBruteLoss(0.5)
var/mob/living/carbon/M = A.affected_mob
var/picked_bodypart = pick("head", "chest", "r_arm", "l_arm", "r_leg", "l_leg")
var/obj/item/bodypart/bodypart = M.get_bodypart(picked_bodypart)
if(bodypart && bodypart.status == BODYPART_ORGANIC && !bodypart.is_pseudopart) //robotic limbs will mean less scratching overall
var/can_scratch = scratch && !M.incapacitated() && get_location_accessible(M, picked_bodypart)
M.visible_message("[can_scratch ? "<span class='warning'>[M] scratches [M.p_their()] [bodypart.name].</span>" : ""]", "<span class='warning'>Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]</span>")
if(can_scratch)
bodypart.receive_damage(0.5)
@@ -90,7 +90,7 @@
if(!no_table_check)
return TRUE
return FALSE
if(get_clockwork_power(RATVAR_POWER_CHECK))
if(GLOB.ratvar_awakens)
fabrication_values["power_cost"] = 0
var/turf/Y = get_turf(user)
@@ -167,7 +167,7 @@
return FALSE
if(target.type != expected_type)
return FALSE
if(get_clockwork_power(RATVAR_POWER_CHECK))
if(GLOB.ratvar_awakens)
fabrication_values["power_cost"] = 0
if(!get_clockwork_power(fabrication_values["power_cost"]))
if(get_clockwork_power() - fabrication_values["power_cost"] < 0)
@@ -212,7 +212,7 @@
return FALSE
repair_values["healing_for_cycle"] = min(repair_values["amount_to_heal"], FABRICATOR_REPAIR_PER_TICK) //modify the healing for this cycle
repair_values["power_required"] = round(repair_values["healing_for_cycle"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER) //and get the power cost from that
if(!get_clockwork_power(RATVAR_POWER_CHECK) && !get_clockwork_power(repair_values["power_required"]))
if(!GLOB.ratvar_awakens && !get_clockwork_power(repair_values["power_required"]))
if(!silent)
to_chat(user, "<span class='warning'>You need at least <b>[DisplayPower(repair_values["power_required"])]</b> power to start repairin[target == user ? "g yourself" : "g [target]"], and at least \
<b>[DisplayPower(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]</b> to fully repair [target == user ? "yourself" : "[target.p_them()]"]!</span>")
+6 -2
View File
@@ -100,9 +100,10 @@
if(cooldowntime > world.time)
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Bastard Sword")
var/option = "Shielded Robe"
option = input(user, "You study the schematics etched into the forge...", "[src]", option) as null|anything in list("Shielded Robe", "Flagellant's Robe", "Bastard Sword", "Nar-Sien Hardsuit")
var/pickedtype
switch(choice)
switch(option)
if("Shielded Robe")
pickedtype = /obj/item/clothing/suit/hooded/cultrobes/cult_shield
if("Flagellant's Robe")
@@ -115,6 +116,9 @@
to_chat(user, "<span class='cultitalic'>The forge fires are not yet hot enough for this weapon, give it another [DisplayTimeText(cooldowntime)].</span>")
cooldowntime = 0
return
if("Nar-Sien Hardsuit")
pickedtype = /obj/item/clothing/suit/space/hardsuit/cult
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
cooldowntime = world.time + 2400
var/obj/item/N = new pickedtype(get_turf(src))
+1
View File
@@ -30,6 +30,7 @@
var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South.
var/step_energy_drain = 10
var/melee_energy_drain = 15
var/overload_step_energy_drain_min = 100
max_integrity = 300 //max_integrity is base health
var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
+1 -1
View File
@@ -203,7 +203,7 @@
chassis.leg_overload_mode = 1
chassis.bumpsmash = 1
chassis.step_in = min(1, round(chassis.step_in/2))
chassis.step_energy_drain = chassis.step_energy_drain*chassis.leg_overload_coeff
chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min,chassis.step_energy_drain*chassis.leg_overload_coeff)
chassis.occupant_message("<span class='danger'>You enable leg actuators overload.</span>")
else
chassis.leg_overload_mode = 0
+1 -1
View File
@@ -513,7 +513,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(!lit)
set_lit(TRUE)
if(fancy)
user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.", "<span class='notice'>Without even breaking stride, you flip open and lights [src] in one smooth movement.</span>")
user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.", "<span class='notice'>Without even breaking stride, you flip open and light [src] in one smooth movement.</span>")
else
var/prot = FALSE
var/mob/living/carbon/human/H = user
+4
View File
@@ -100,6 +100,10 @@
/obj/structure/ladder/attackby(obj/item/W, mob/user, params)
return attack_hand(user)
/obj/structure/ladder/attack_robot(mob/living/silicon/robot/R)
if(R.Adjacent(src))
return attack_hand(R)
/obj/structure/ladder/attack_ghost(mob/dead/observer/user)
use(user,1)
+2
View File
@@ -352,6 +352,7 @@ GLOBAL_LIST(external_rsc_urls)
menuitem.Load_checked(src)
hook_vr("client_new",list(src))
Master.UpdateTickRate()
//////////////
//DISCONNECT//
@@ -399,6 +400,7 @@ GLOBAL_LIST(external_rsc_urls)
if(movingmob != null)
movingmob.client_mobs_in_contents -= mob
UNSETEMPTY(movingmob.client_mobs_in_contents)
Master.UpdateTickRate()
return ..()
/client/Destroy()
+6 -6
View File
@@ -144,15 +144,15 @@
if(pockets)
var/list/how_cool_are_your_threads = list("<span class='notice'>")
if(pockets.priority)
how_cool_are_your_threads += "Your [src]'s storage opens when clicked.\n"
how_cool_are_your_threads += "[src]'s storage opens when clicked.\n"
else
how_cool_are_your_threads += "Your [src]'s storage opens when dragged to yourself.\n"
how_cool_are_your_threads += "Your [src] can store [pockets.storage_slots] item[pockets.storage_slots > 1 ? "s" : ""].\n"
how_cool_are_your_threads += "Your [src] can store items that are [weightclass2text(pockets.max_w_class)] or smaller.\n"
how_cool_are_your_threads += "[src]'s storage opens when dragged to yourself.\n"
how_cool_are_your_threads += "[src] can store [pockets.storage_slots] item[pockets.storage_slots > 1 ? "s" : ""].\n"
how_cool_are_your_threads += "[src] can store items that are [weightclass2text(pockets.max_w_class)] or smaller.\n"
if(pockets.quickdraw)
how_cool_are_your_threads += "You can quickly remove an item from your [src] using Alt-Click.\n"
how_cool_are_your_threads += "You can quickly remove an item from [src] using Alt-Click.\n"
if(pockets.silent)
how_cool_are_your_threads += "Adding or Removing items from your [src] makes no noise.\n"
how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n"
how_cool_are_your_threads += "</span>"
to_chat(user, how_cool_are_your_threads.Join())
+43
View File
@@ -0,0 +1,43 @@
/datum/round_event_control/nightmare
name = "Spawn Nightmare"
typepath = /datum/round_event/ghost_role/nightmare
max_occurrences = 1
min_players = 20
/datum/round_event/ghost_role/nightmare
minimum_required = 1
role_name = "nightmare"
/datum/round_event/ghost_role/nightmare/spawn_role()
var/list/candidates = get_candidates("alien", null, ROLE_ALIEN)
if(!candidates.len)
return NOT_ENOUGH_PLAYERS
var/mob/dead/selected = pick(candidates)
var/datum/mind/player_mind = new /datum/mind(selected.key)
player_mind.active = TRUE
var/list/spawn_locs = list()
for(var/obj/effect/landmark/xeno_spawn/L in GLOB.landmarks_list)
if(isturf(L.loc))
var/turf/T = L.loc
var/light_amount = T.get_lumcount()
if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
spawn_locs += T
if(!spawn_locs.len)
message_admins("No valid spawn locations found, aborting...")
return MAP_ERROR
var/mob/living/carbon/human/S = new ((pick(spawn_locs)))
player_mind.transfer_to(S)
player_mind.assigned_role = "Nightmare"
player_mind.special_role = "Nightmare"
SSticker.mode.traitors += player_mind
S.set_species(/datum/species/shadow/nightmare)
playsound(S, 'sound/magic/ethereal_exit.ogg', 50, 1, -1)
message_admins("[key_name_admin(S)] has been made into a Nightmare by an event.")
log_game("[key_name(S)] was spawned as a Nightmare by an event.")
spawned_mobs += S
return SUCCESSFUL_SPAWN
@@ -80,7 +80,7 @@
if(SSticker.current_state == GAME_STATE_PREGAME)
var/time_remaining = SSticker.GetTimeLeft()
if(time_remaining > 0)
stat("Time To Start:", "[round(time_remaining/10)]s")
stat("Time To Start:", "[round(time_remaining/10)]s")
else if(time_remaining == -10)
stat("Time To Start:", "DELAYED")
else
@@ -375,7 +375,7 @@
if(GLOB.highlander)
to_chat(humanc, "<span class='userdanger'><i>THERE CAN BE ONLY ONE!!!</i></span>")
humanc.make_scottish()
if(prob(2) && !issilicon(humanc) && !jobban_isbanned(humanc.mind, "Syndicate") && GLOB.miscreants_allowed)
if(prob(2) && !issilicon(humanc) && !jobban_isbanned(humanc.mind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in humanc.client.prefs.be_special)
SSticker.generate_miscreant_objectives(humanc.mind)
else
if(CONFIG_GET(flag/allow_crew_objectives))
@@ -288,7 +288,7 @@
..()
container_type |= OPENCONTAINER_1
create_reagents(30)
reagents.set_reacting(FALSE)
reagents.set_reacting(TRUE)
/obj/item/ammo_casing/shotgun/dart/attackby()
return