Skip to content

Commit

Permalink
nanites
Browse files Browse the repository at this point in the history
  • Loading branch information
actioninja authored and TheGamerdk committed May 31, 2020
1 parent 0eb7438 commit eade3a6
Show file tree
Hide file tree
Showing 6 changed files with 157 additions and 12 deletions.
20 changes: 20 additions & 0 deletions code/modules/research/nanites/extra_settings/_extra_setting.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/datum/nanite_extra_setting
var/setting_type
var/value

/datum/nanite_extra_setting/proc/get_value()
return value

/datum/nanite_extra_setting/proc/set_value(value)
src.value = value

/datum/nanite_extra_setting/proc/get_copy()
return

//I made the choice to send the name as part of the parameter instead of storing it directly on
//this datum as a way of avoiding duplication of data between the containing assoc list
//and this datum.
//Also make sure to double wrap the list when implementing this as
//+= is interpreted as a combine on lists, so the outer list gets unwrapped
/datum/nanite_extra_setting/proc/get_frontend_list(name)
return
27 changes: 27 additions & 0 deletions code/modules/research/nanites/extra_settings/boolean.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/datum/nanite_extra_setting/boolean
setting_type = NESTYPE_BOOLEAN
var/true_text
var/false_text

/datum/nanite_extra_setting/boolean/New(initial, true_text, false_text)
value = initial
src.true_text = true_text
src.false_text = false_text

/datum/nanite_extra_setting/boolean/set_value(value)
if(isnull(value))
src.value = !src.value
return
. = ..()

/datum/nanite_extra_setting/boolean/get_copy()
return new /datum/nanite_extra_setting/boolean(value, true_text, false_text)

/datum/nanite_extra_setting/boolean/get_frontend_list(name)
return list(list(
"name" = name,
"type" = setting_type,
"value" = value,
"true_text" = true_text,
"false_text" = false_text
))
32 changes: 32 additions & 0 deletions code/modules/research/nanites/extra_settings/number.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/datum/nanite_extra_setting/number
setting_type = NESTYPE_NUMBER
var/min
var/max
var/unit = ""

/datum/nanite_extra_setting/number/New(initial, min, max, unit)
value = initial
src.min = min
src.max = max
if(unit)
src.unit = unit

/datum/nanite_extra_setting/number/set_value(value)
if(istext(value))
value = text2num(value)
if(!value || !isnum(value))
return
src.value = CLAMP(value, min, max)

/datum/nanite_extra_setting/number/get_copy()
return new /datum/nanite_extra_setting/number(value, min, max, unit)

/datum/nanite_extra_setting/number/get_frontend_list(name)
return list(list(
"name" = name,
"type" = setting_type,
"value" = value,
"min" = min,
"max" = max,
"unit" = unit
))
18 changes: 18 additions & 0 deletions code/modules/research/nanites/extra_settings/text.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/datum/nanite_extra_setting/text
setting_type = NESTYPE_TEXT

/datum/nanite_extra_setting/text/New(initial)
value = initial

/datum/nanite_extra_setting/text/set_value(value)
src.value = trim(value)

/datum/nanite_extra_setting/text/get_copy()
return new /datum/nanite_extra_setting/text(value)

/datum/nanite_extra_setting/text/get_frontend_list(name)
return list(list(
"name" = name,
"type" = setting_type,
"value" = value
))
18 changes: 18 additions & 0 deletions code/modules/research/nanites/extra_settings/type.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/datum/nanite_extra_setting/type
setting_type = NESTYPE_TYPE
var/list/types

/datum/nanite_extra_setting/type/New(initial, types)
value = initial
src.types = types

/datum/nanite_extra_setting/type/get_copy()
return new /datum/nanite_extra_setting/type(value, types)

/datum/nanite_extra_setting/type/get_frontend_list(name)
return list(list(
"name" = name,
"type" = setting_type,
"value" = value,
"types" = types
))
54 changes: 42 additions & 12 deletions code/modules/research/nanites/nanite_programs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
var/trigger_cost = 0 //Amount of nanites required to trigger
var/trigger_cooldown = 50 //Deciseconds required between each trigger activation
var/next_trigger = 0 //World time required for the next trigger activation
var/timer_counter = 0 //Counts up while active. Used for the timer and the activation delay.

var/program_flags = NONE
var/passive_enabled = FALSE //If the nanites have an on/off-style effect, it's tracked by this var

Expand All @@ -28,9 +28,17 @@

//The following vars are customizable
var/activated = TRUE //If FALSE, the program won't process, disables passive effects, can't trigger and doesn't consume nanites
var/activation_delay = 0 //Seconds before the program self-activates.
var/timer = 0 //Seconds before the timer effect activates. Starts counting AFTER the activation delay
var/timer_type = NANITE_TIMER_DEACTIVATE //What happens when the timer runs out

var/timer_restart = 0 //When deactivated, the program will wait X deciseconds before self-reactivating. Also works if the program begins deactivated.
var/timer_shutdown = 0 //When activated, the program will wait X deciseconds before self-deactivating. Also works if the program begins activated.
var/timer_trigger = 0 //[Trigger only] While active, the program will attempt to trigger once every x deciseconds.
var/timer_trigger_delay = 0 //[Trigger only] While active, the program will delay trigger signals by X deciseconds.

//Indicates the next world.time tick where these timers will act
var/timer_restart_next = 0
var/timer_shutdown_next = 0
var/timer_trigger_next = 0
var/timer_trigger_delay_next = 0

//Signal codes, these handle remote input to the nanites. If set to 0 they'll ignore signals.
var/activation_code = 0 //Code that activates the program [1-9999]
Expand Down Expand Up @@ -80,24 +88,34 @@
/datum/nanite_program/proc/copy_programming(datum/nanite_program/target, copy_activated = TRUE)
if(copy_activated)
target.activated = activated
target.activation_delay = activation_delay
target.timer = timer
target.timer_type = timer_type
target.timer_restart = timer_restart
target.timer_shutdown = timer_shutdown
target.timer_trigger = timer_trigger
target.timer_trigger_delay = timer_trigger_delay
target.activation_code = activation_code
target.deactivation_code = deactivation_code
target.kill_code = kill_code
target.trigger_code = trigger_code

target.rules = list()
for(var/R in rules)
var/datum/nanite_rule/rule = R
rule.copy_to(target)

if(istype(target,src))
copy_extra_settings_to(target)

/datum/nanite_program/proc/set_extra_setting(user, setting)
return

/datum/nanite_program/proc/get_extra_setting(setting)
///Register extra settings by overriding this.
///extra_settings[name] = new typepath() for each extra setting
/datum/nanite_program/proc/register_extra_settings()
return

/datum/nanite_program/proc/copy_extra_settings_to(datum/nanite_program/target)
return
var/list/copy_list = list()
for(var/ns_name in extra_settings)
var/datum/nanite_extra_setting/extra_setting = extra_settings[ns_name]
copy_list[ns_name] = extra_setting.get_copy()
target.extra_settings = copy_list

/datum/nanite_program/proc/on_add(datum/component/nanites/_nanites)
nanites = _nanites
Expand Down Expand Up @@ -138,6 +156,18 @@
if(!activated)
return

if(timer_shutdown_next && world.time > timer_shutdown_next)
deactivate()
timer_shutdown_next = 0

if(timer_trigger && world.time > timer_trigger_next)
trigger()
timer_trigger_next = world.time + timer_trigger

if(timer_trigger_delay_next && world.time > timer_trigger_delay_next)
trigger(delayed = TRUE)
timer_trigger_delay_next = 0

if(timer && timer_counter > timer)
if(timer_type == NANITE_TIMER_DEACTIVATE)
deactivate()
Expand Down

0 comments on commit eade3a6

Please sign in to comment.