mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-10 01:34:01 +00:00
* 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>
152 lines
5.0 KiB
Plaintext
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
|
|
|