mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-21 06:25:59 +00:00
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
168 lines
6.0 KiB
Plaintext
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
|