Files
Bubberstation/code/modules/bitrunning/server/threats.dm
13spacemen 357799c8a5 Removes Orbit Polling Component, SSpolling improvement (#81748)
When I made SSpolling, jlsnow gave me his blessing to delete the orbit
polling component [where you orbit something for 20 seconds before it
chooses a ghost from the orbiters]
It's only used in a few places like soulstones replacing
jobbanned/inactive players, etc.

Also upgraded SSpolling; you can now place a little icon on the sides in
the chat message, chat message looks a lot nicer, the alert pic and the
jump target don't have to be the same anymore, and I made it be able to
pre-pick candidates since 90% of the use cases would just want 1
candidate

Also prints to chat who the chosen one was

Also made slime intelligence potions ask the user for a reason, which
will be displayed in the alert poll
2024-03-06 08:24:36 +00:00

168 lines
6.0 KiB
Plaintext

/// Adds threats to the list and notifies players
/obj/machinery/quantum_server/proc/add_threats(mob/living/threat)
spawned_threat_refs.Add(WEAKREF(threat))
SEND_SIGNAL(src, COMSIG_BITRUNNER_THREAT_CREATED)
/// Choses which antagonist role is spawned based on threat
/obj/machinery/quantum_server/proc/get_antagonist_role()
var/list/available = list()
for(var/datum/antagonist/bitrunning_glitch/subtype as anything in subtypesof(/datum/antagonist/bitrunning_glitch))
if(threat >= initial(subtype.threat))
available += subtype
shuffle_inplace(available)
var/datum/antagonist/bitrunning_glitch/chosen = pick(available)
threat -= initial(chosen.threat) * 0.5
return chosen
/// Selects a target to mutate. Gives two attempts, then crashes if it fails.
/obj/machinery/quantum_server/proc/get_mutation_target()
var/datum/weakref/target_ref = pick(mutation_candidate_refs)
var/mob/living/resolved = target_ref.resolve()
if(resolved)
return resolved
mutation_candidate_refs.Remove(target_ref)
if(!length(mutation_candidate_refs))
return
target_ref = pick(mutation_candidate_refs)
resolved = target_ref.resolve()
return resolved
/// Finds any mobs with minds in the zones and gives them the bad news
/obj/machinery/quantum_server/proc/notify_spawned_threats()
for(var/datum/weakref/baddie_ref as anything in spawned_threat_refs)
var/mob/living/baddie = baddie_ref.resolve()
if(isnull(baddie?.mind) || baddie.stat >= UNCONSCIOUS)
continue
var/atom/movable/screen/alert/bitrunning/alert = baddie.throw_alert(
ALERT_BITRUNNER_RESET,
/atom/movable/screen/alert/bitrunning,
new_master = src,
)
alert.name = "Queue Deletion"
alert.desc = "The server is resetting. Oblivion awaits."
to_chat(baddie, span_userdanger("You have been flagged for deletion! Thank you for your service."))
/// Removes a specific threat - used when station spawning
/obj/machinery/quantum_server/proc/remove_threat(mob/living/threat)
spawned_threat_refs.Remove(WEAKREF(threat))
/// Selects the role and waits for a ghost orbiter
/obj/machinery/quantum_server/proc/setup_glitch(datum/antagonist/bitrunning_glitch/forced_role)
if(!validate_mutation_candidates())
return
var/mob/living/mutation_target = get_mutation_target()
if(isnull(mutation_target))
CRASH("vdom: After two attempts, no valid mutation target was found.")
var/atom/thing = mutation_target
thing.create_digital_aura()
var/datum/antagonist/bitrunning_glitch/chosen_role = forced_role || get_antagonist_role()
var/role_name = initial(chosen_role.name)
var/mob/chosen_one = SSpolling.poll_ghosts_for_target(
check_jobban = ROLE_GLITCH,
poll_time = 20 SECONDS,
checked_target = mutation_target,
ignore_category = POLL_IGNORE_GLITCH,
alert_pic = mutation_target,
role_name_text = "Bitrunning Malfunction: [role_name]",
)
spawn_glitch(chosen_role, mutation_target, chosen_one)
return mutation_target
/// Orbit poll has concluded - spawn the antag
/obj/machinery/quantum_server/proc/spawn_glitch(datum/antagonist/bitrunning_glitch/chosen_role, mob/living/mutation_target, mob/dead/observer/ghost)
if(QDELETED(mutation_target))
return
if(QDELETED(src) || isnull(ghost) || isnull(generated_domain) || !is_ready || !is_operational)
var/atom/thing = mutation_target
thing.remove_digital_aura()
return
var/role_name = initial(chosen_role.name)
var/mob/living/antag_mob
switch(role_name)
if(ROLE_NETGUARDIAN)
antag_mob = new /mob/living/basic/netguardian(mutation_target.loc)
else // any other humanoid mob
antag_mob = new /mob/living/carbon/human(mutation_target.loc)
mutation_target.gib(DROP_ALL_REMAINS)
antag_mob.key = ghost.key
var/datum/mind/ghost_mind = antag_mob.mind
ghost_mind.add_antag_datum(chosen_role)
ghost_mind.special_role = ROLE_GLITCH
ghost_mind.set_assigned_role(SSjob.GetJobType(/datum/job/bitrunning_glitch))
playsound(antag_mob, 'sound/magic/ethereal_exit.ogg', 50, vary = TRUE)
message_admins("[ADMIN_LOOKUPFLW(antag_mob)] has been made into virtual antagonist by an event.")
antag_mob.log_message("was spawned as a virtual antagonist by an event.", LOG_GAME)
add_threats(antag_mob)
/// Oh boy - transports the antag station side
/obj/machinery/quantum_server/proc/station_spawn(mob/living/antag, obj/machinery/byteforge/chosen_forge)
antag.balloon_alert(antag, "scanning...")
chosen_forge.setup_particles(angry = TRUE)
radio.talk_into(src, "SECURITY BREACH: Unauthorized entry sequence detected.", RADIO_CHANNEL_SUPPLY)
SEND_SIGNAL(src, COMSIG_BITRUNNER_STATION_SPAWN)
var/timeout = 2 SECONDS
if(!ishuman(antag))
radio.talk_into(src, "Fabrication protocols have crashed unexpectedly. Please evacuate the area.", RADIO_CHANNEL_SUPPLY)
timeout = 10 SECONDS
if(!do_after(antag, timeout) || QDELETED(chosen_forge) || QDELETED(antag) || QDELETED(src) || !is_ready || !is_operational)
chosen_forge.setup_particles()
return
var/datum/component/glitch/effect = antag.AddComponent(/datum/component/glitch, \
server = src, \
forge = chosen_forge, \
)
chosen_forge.flicker(angry = TRUE)
if(!do_after(antag, 1 SECONDS))
chosen_forge.setup_particles()
qdel(effect)
return
chosen_forge.flash()
if(ishuman(antag))
reset_equipment(antag)
else
radio.talk_into(src, "CRITICAL ALERT: Unregistered mechanical entity deployed.")
var/datum/antagonist/antag_datum = antag.mind?.has_antag_datum(/datum/antagonist/bitrunning_glitch)
if(istype(antag_datum))
antag_datum.show_in_roundend = TRUE
do_teleport(antag, get_turf(chosen_forge), forced = TRUE, asoundin = 'sound/magic/ethereal_enter.ogg', asoundout = 'sound/magic/ethereal_exit.ogg', channel = TELEPORT_CHANNEL_QUANTUM)
/// Removes any invalid candidates from the list
/obj/machinery/quantum_server/proc/validate_mutation_candidates()
for(var/datum/weakref/creature_ref as anything in mutation_candidate_refs)
var/mob/living/creature = creature_ref.resolve()
if(isnull(creature) || creature.mind)
mutation_candidate_refs.Remove(creature_ref)
if(!length(mutation_candidate_refs))
return FALSE
shuffle_inplace(mutation_candidate_refs)
return TRUE