Files
Waterpig bb70889f6e TG Upstream Part 1
3591 individual conflicts

Update build.js

Update install_node.sh

Update byond.js

oh my fucking god

hat

slow

huh

holy shit

we all fall down

2 more I missed

2900 individual conflicts

2700 Individual conflicts

replaces yarn file with tg version, bumping us down to 2200-ish

Down to 2000 individual conflicts

140 down

mmm

aaaaaaaaaaaaaaaaaaa

not yt

575

soon

900 individual conflicts

600 individual conflicts, 121 file conflicts

im not okay

160 across 19 files

29 in 4 files

0 conflicts, compiletime fix time

some minor incap stuff

missed ticks

weird dupe definition stuff

missed ticks 2

incap fixes

undefs and pie fix

Radio update and some extra minor stuff

returns a single override

no more dupe definitions, 175 compiletime errors

Unticked file fix

sound and emote stuff

honk and more radio stuff
2024-10-19 08:04:33 -07:00

109 lines
5.4 KiB
Plaintext

/datum/round_event_control/heart_attack
name = "Random Heart Attack"
typepath = /datum/round_event/heart_attack
weight = 20
max_occurrences = 2
min_players = 40 // To avoid shafting lowpop
category = EVENT_CATEGORY_HEALTH
description = "A random crewmember's heart gives out."
min_wizard_trigger_potency = 6
max_wizard_trigger_potency = 7
admin_setup = list(/datum/event_admin_setup/minimum_candidate_requirement/heart_attack, /datum/event_admin_setup/input_number/heart_attack)
///Candidates for receiving a healthy dose of heart disease
var/list/heart_attack_candidates = list()
/datum/round_event_control/heart_attack/can_spawn_event(players_amt, allow_magic = FALSE)
. = ..()
if(!.)
return .
generate_candidates() //generating candidates and checking in can_spawn_event prevents extreme edge case of there being the 40 minimum players, with all being ineligible for a heart attack, wasting the event
if(length(heart_attack_candidates))
return TRUE
/**
* Performs initial analysis of which living players are eligible to be selected for a heart attack.
*
* Traverses player_list and checks entries against a series of reviews to see if they should even be considered for a heart attack,
* and at what weight should they be eligible to receive it. The check for whether or not a heart attack should be "blocked" by something is done
* later, at the round_event level, so this proc mostly just checks users for whether or not a heart attack should be possible.
*/
/datum/round_event_control/heart_attack/proc/generate_candidates()
heart_attack_candidates.Cut()
for(var/mob/living/carbon/human/candidate in shuffle(GLOB.player_list))
if(candidate.stat == DEAD || HAS_TRAIT(candidate, TRAIT_CRITICAL_CONDITION) || !candidate.can_heartattack() || (/datum/disease/heart_failure in candidate.diseases) || candidate.undergoing_cardiac_arrest())
continue
if(!(candidate.mind.assigned_role.job_flags & JOB_CREW_MEMBER))//only crewmembers can get one, a bit unfair for some ghost roles and it wastes the event
continue
// SKYRAT EDIT ADD START - Station/area event candidate filtering
if(engaged_role_play_check(candidate, station = TRUE, dorms = TRUE))
continue
// SKYRAT EDIT ADD END
if(candidate.satiety <= -60 && !candidate.has_status_effect(/datum/status_effect/exercised)) //Multiple junk food items recently //No foodmaxxing for the achievement
heart_attack_candidates[candidate] = 3
else
heart_attack_candidates[candidate] = 1
/datum/round_event/heart_attack
///A list of prime candidates for heart attacking
var/list/victims = list()
///Number of heart attacks to distribute
var/quantity = 1
/datum/round_event/heart_attack/start()
var/datum/round_event_control/heart_attack/heart_control = control
victims += heart_control.heart_attack_candidates
heart_control.heart_attack_candidates.Cut()
while(quantity > 0 && length(victims))
if(attack_heart())
quantity--
/**
* Picks a victim from a list and attempts to give them a heart attack
*
* Performs a pick_weight on a list of potential victims. Once selected, the "winner"
* will receive heart disease. Returns TRUE if a heart attack is successfully given, and
* FALSE if something blocks it.
*/
/datum/round_event/heart_attack/proc/attack_heart()
var/mob/living/carbon/human/winner = pick_weight(victims)
if(winner.has_status_effect(/datum/status_effect/exercised)) //Stuff that should "block" a heart attack rather than just deny eligibility for one goes here.
winner.visible_message(span_warning("[winner] grunts and clutches their chest for a moment, catching [winner.p_their()] breath."), span_medal("Your chest lurches in pain for a brief moment, which quickly fades. \
You feel like you've just avoided a serious health disaster."), span_hear("You hear someone's breathing sharpen for a moment, followed by a sigh of relief."), 4)
winner.playsound_local(get_turf(winner), 'sound/health/slowbeat.ogg', 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
winner.Stun(3 SECONDS)
if(winner.client)
winner.client.give_award(/datum/award/achievement/misc/healthy, winner)
message_admins("[winner] has just survived a random heart attack!") //time to spawn them a trophy :)
victims -= winner
else
var/datum/disease/heart_disease = new /datum/disease/heart_failure()
winner.ForceContractDisease(heart_disease, FALSE, TRUE)
announce_to_ghosts(winner)
victims -= winner
return TRUE
return FALSE
/datum/event_admin_setup/minimum_candidate_requirement/heart_attack
output_text = "There are no candidates eligible to receive a heart attack!"
/datum/event_admin_setup/minimum_candidate_requirement/heart_attack/count_candidates()
var/datum/round_event_control/heart_attack/heart_control = event_control
heart_control.generate_candidates() //can_spawn_event() is bypassed by admin_setup, so this makes sure that the candidates are still generated
return length(heart_control.heart_attack_candidates)
/datum/event_admin_setup/input_number/heart_attack
input_text = "Please select how many people's days you wish to ruin."
default_value = 0
max_value = 90 //Will be overridden
min_value = 0
/datum/event_admin_setup/input_number/heart_attack/prompt_admins()
var/datum/round_event_control/heart_attack/heart_control = event_control
max_value = length(heart_control.heart_attack_candidates)
return ..()
/datum/event_admin_setup/input_number/heart_attack/apply_to_event(datum/round_event/heart_attack/event)
event.quantity = chosen_value