Files
Bubberstation/code/modules/bitrunning/event.dm
SkyratBot 0c9149bf35 [MIRROR] Refactor gib code to use bitflags and have documentation [MDB IGNORE] (#24143)
* Refactor gib code to use bitflags and have documentation

* Modular updates

* Modular updates

* Modular updates

---------

Co-authored-by: Tim <timothymtorres@gmail.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
2023-10-09 15:00:17 -04:00

152 lines
5.0 KiB
Plaintext

/datum/round_event_control/bitrunning_glitch
name = "Spawn Bitrunning Glitch"
admin_setup = list(
/datum/event_admin_setup/minimum_candidate_requirement/bitrunning_glitch,
/datum/event_admin_setup/listed_options/bitrunning_glitch,
)
category = EVENT_CATEGORY_INVASION
description = "Causes a short term antagonist to spawn in the virtual domain."
dynamic_should_hijack = FALSE
max_occurrences = 5
min_players = 1
typepath = /datum/round_event/ghost_role/bitrunning_glitch
weight = 10
/// List of active servers to choose from
var/list/obj/machinery/quantum_server/active_servers = list()
/// List of possible antags to spawn
var/static/list/possible_antags = list(
ROLE_CYBER_POLICE,
)
/datum/round_event_control/bitrunning_glitch/can_spawn_event(players_amt, allow_magic = FALSE)
. = ..()
if(!.)
return .
active_servers.Cut()
get_active_servers()
if(length(active_servers))
return TRUE
/// All servers currently running, has players in it, and map has valid mobs
/datum/round_event_control/bitrunning_glitch/proc/get_active_servers()
for(var/obj/machinery/quantum_server/server in SSmachines.get_machines_by_type(/obj/machinery/quantum_server))
if(length(server.get_valid_domain_targets()))
active_servers.Add(server)
return length(active_servers) > 0
/datum/event_admin_setup/listed_options/bitrunning_glitch
input_text = "Select a role to spawn."
/datum/event_admin_setup/listed_options/bitrunning_glitch/get_list()
var/datum/round_event_control/bitrunning_glitch/control = event_control
var/list/possible = control.possible_antags.Copy() // this seems pedantic but byond is complaining control was unused
possible += list("Random")
return possible
/datum/event_admin_setup/listed_options/bitrunning_glitch/apply_to_event(datum/round_event/ghost_role/bitrunning_glitch/event)
if(chosen == "Random")
event.forced_role = null
else
event.forced_role = chosen
/datum/event_admin_setup/minimum_candidate_requirement/bitrunning_glitch
output_text = "There must be valid mobs to mutate or players in the domain!"
/datum/event_admin_setup/minimum_candidate_requirement/bitrunning_glitch/count_candidates()
var/datum/round_event_control/bitrunning_glitch/cyber_control = event_control
cyber_control.get_active_servers()
var/total = 0
for(var/obj/machinery/quantum_server/server in cyber_control.active_servers)
total += length(server.mutation_candidate_refs)
return total
/datum/round_event/ghost_role/bitrunning_glitch
minimum_required = 1
role_name = "Bitrunning Glitch"
fakeable = FALSE
/// Admin customization: What to spawn
var/forced_role
/datum/round_event/ghost_role/bitrunning_glitch/spawn_role()
var/datum/round_event_control/bitrunning_glitch/cyber_control = control
var/obj/machinery/quantum_server/unlucky_server = pick(cyber_control.active_servers)
cyber_control.active_servers.Cut()
var/list/mutation_candidates = unlucky_server.get_valid_domain_targets()
if(!length(mutation_candidates))
return MAP_ERROR
var/chosen = pick(mutation_candidates)
if(isnull(chosen) || !length(mutation_candidates))
return MAP_ERROR
var/datum/weakref/target_ref = pick(mutation_candidates)
var/mob/living/mutation_target = target_ref.resolve()
if(isnull(mutation_target)) // just in case since it takes a minute
target_ref = pick(mutation_candidates)
mutation_target = target_ref.resolve()
if(isnull(mutation_target))
return MAP_ERROR
var/chosen_role = forced_role || pick(cyber_control.possible_antags)
var/datum/mind/ghost_mind = get_ghost_mind(chosen_role)
if(isnull(ghost_mind))
return NOT_ENOUGH_PLAYERS
var/mob/living/antag_mob
switch(chosen_role)
if(ROLE_CYBER_POLICE)
antag_mob = spawn_cybercop(mutation_target, ghost_mind)
playsound(antag_mob, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1)
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)
SEND_SIGNAL(unlucky_server, COMSIG_BITRUNNER_SPAWN_GLITCH, antag_mob)
spawned_mobs += antag_mob
return SUCCESSFUL_SPAWN
/// Polls for a ghost that wants to run it
/datum/round_event/ghost_role/bitrunning_glitch/proc/get_ghost_mind(role_name)
var/list/mob/dead/observer/ghosties = poll_ghost_candidates("A short term antagonist role is available. Would you like to spawn as a '[role_name]'?", role_name)
if(!length(ghosties))
return
shuffle_inplace(ghosties)
var/mob/dead/selected = pick(ghosties)
var/datum/mind/player_mind = new /datum/mind(selected.key)
player_mind.active = TRUE
return player_mind
/// Spawns a cybercop on the mutation target
/datum/round_event/ghost_role/bitrunning_glitch/proc/spawn_cybercop(mob/living/mutation_target, datum/mind/player_mind)
var/mob/living/carbon/human/new_agent = new(mutation_target.loc)
mutation_target.gib(DROP_ALL_REMAINS)
mutation_target = null
player_mind.transfer_to(new_agent)
player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/cyber_police))
player_mind.special_role = ROLE_CYBER_POLICE
player_mind.add_antag_datum(/datum/antagonist/cyber_police)
return new_agent