Files
CHOMPStation2/code/game/gamemodes/malfunction/malf_research.dm
CHOMPStation2 7416cbea22 [MIRROR] next set of spans (#9247)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
Co-authored-by: Kashargul <KashL@t-online.de>
2024-10-18 01:33:07 +02:00

65 lines
2.2 KiB
Plaintext

/datum/malf_research
var/stored_cpu = 0 // Currently stored amount of CPU time.
var/last_tick = 0 // Last process() tick.
var/max_cpu = 0 // Maximal amount of CPU time stored.
var/cpu_increase_per_tick = 0 // Amount of CPU time generated by tick
var/list/available_abilities = null // List of available abilities that may be researched.
var/list/unlocked_abilities = null // List of already unlocked abilities.
var/mob/living/silicon/ai/owner = null // AI which owns this research datum.
var/datum/malf_research_ability/focus = null // Currently researched item
/datum/malf_research/New()
setup_abilities()
last_tick = world.time
// Proc: setup_abilities()
// Parameters: None
// Description: Sets up basic abilities for AI Malfunction gamemode.
/datum/malf_research/proc/setup_abilities()
available_abilities = list()
unlocked_abilities = list()
available_abilities += new/datum/malf_research_ability/networking/basic_hack()
available_abilities += new/datum/malf_research_ability/interdiction/recall_shuttle()
available_abilities += new/datum/malf_research_ability/manipulation/electrical_pulse()
// Proc: finish_research()
// Parameters: None
// Description: Finishes currently focused research.
/datum/malf_research/proc/finish_research()
if(!focus)
return
to_chat(owner, span_bold("Research Completed") + ": [focus.name]")
add_verb(owner, focus.ability)
available_abilities -= focus
if(focus.next)
available_abilities += focus.next
unlocked_abilities += focus
focus = null
// Proc: process()
// Parameters: None
// Description: Processes CPU gain and research progress based on "realtime" calculation.
/datum/malf_research/process(var/idle = 0)
if(idle) // No power or running on APU. Do nothing.
last_tick = world.time
return
var/time_diff = (world.time - last_tick)
last_tick = world.time
var/cpu_gained = time_diff * cpu_increase_per_tick
if(cpu_gained < 0)
return // This shouldn't happen, but just in case..
if(max_cpu > stored_cpu)
var/given = min((max_cpu - stored_cpu), cpu_gained)
stored_cpu += given
cpu_gained -= given
cpu_gained = max(0, cpu_gained)
if(focus && (cpu_gained > 0))
focus.process(cpu_gained)
if(focus.unlocked)
finish_research()