Files
Bubberstation/code/modules/research/nanites/rules.dm
SkyratBot 12cd35c594 Crit status refactor (#53117) (#500)
Co-authored-by: Rohesie <rohesie@gmail.com>
2020-08-25 00:11:20 +02:00

151 lines
3.8 KiB
Plaintext

/datum/nanite_rule
var/name = "Generic Condition"
var/desc = "When triggered, the program is active"
var/datum/nanite_program/program
/datum/nanite_rule/New(datum/nanite_program/new_program)
program = new_program
if(LAZYLEN(new_program.rules) <= 5) //Avoid infinite stacking rules
new_program.rules += src
else
qdel(src)
/datum/nanite_rule/proc/remove()
program.rules -= src
program = null
qdel(src)
/datum/nanite_rule/proc/check_rule()
return TRUE
/datum/nanite_rule/proc/display()
return name
/datum/nanite_rule/proc/copy_to(datum/nanite_program/new_program)
new type(new_program)
/datum/nanite_rule/health
name = "Health"
desc = "Checks the host's health status."
var/threshold = 50
var/above = TRUE
/datum/nanite_rule/health/check_rule()
var/health_percent = program.host_mob.health / program.host_mob.maxHealth * 100
if(above)
if(health_percent >= threshold)
return TRUE
else
if(health_percent < threshold)
return TRUE
return FALSE
/datum/nanite_rule/health/display()
return "[name] [above ? ">" : "<"] [threshold]%"
/datum/nanite_rule/health/copy_to(datum/nanite_program/new_program)
var/datum/nanite_rule/health/rule = new(new_program)
rule.above = above
rule.threshold = threshold
//TODO allow inversion
/datum/nanite_rule/crit
name = "Crit"
desc = "Checks if the host is in critical condition."
/datum/nanite_rule/crit/check_rule()
return HAS_TRAIT(program.host_mob, TRAIT_CRITICAL_CONDITION)
/datum/nanite_rule/death
name = "Death"
desc = "Checks if the host is dead."
/datum/nanite_rule/death/check_rule()
if(program.host_mob.stat == DEAD || HAS_TRAIT(program.host_mob, TRAIT_FAKEDEATH))
return TRUE
return FALSE
/datum/nanite_rule/cloud_sync
name = "Cloud Sync"
desc = "Checks if the nanites have cloud sync enabled or disabled."
var/check_type = "Enabled"
/datum/nanite_rule/cloud_sync/check_rule()
if(check_type == "Enabled")
return program.nanites.cloud_active
else
return !program.nanites.cloud_active
/datum/nanite_rule/cloud_sync/copy_to(datum/nanite_program/new_program)
var/datum/nanite_rule/cloud_sync/rule = new(new_program)
rule.check_type = check_type
/datum/nanite_rule/cloud_sync/display()
return "[name]:[check_type]"
/datum/nanite_rule/nanites
name = "Nanite Volume"
desc = "Checks the host's nanite volume."
var/threshold = 50
var/above = TRUE
/datum/nanite_rule/nanites/check_rule()
var/nanite_percent = (program.nanites.nanite_volume - program.nanites.safety_threshold)/(program.nanites.max_nanites - program.nanites.safety_threshold)*100
if(above)
if(nanite_percent >= threshold)
return TRUE
else
if(nanite_percent < threshold)
return TRUE
return FALSE
/datum/nanite_rule/nanites/copy_to(datum/nanite_program/new_program)
var/datum/nanite_rule/nanites/rule = new(new_program)
rule.above = above
rule.threshold = threshold
/datum/nanite_rule/nanites/display()
return "[name] [above ? ">" : "<"] [threshold]%"
/datum/nanite_rule/damage
name = "Damage"
desc = "Checks the host's damage."
var/threshold = 50
var/above = TRUE
var/damage_type = BRUTE
/datum/nanite_rule/damage/check_rule()
var/damage_amt = 0
switch(damage_type)
if(BRUTE)
damage_amt = program.host_mob.getBruteLoss()
if(BURN)
damage_amt = program.host_mob.getFireLoss()
if(TOX)
damage_amt = program.host_mob.getToxLoss()
if(OXY)
damage_amt = program.host_mob.getOxyLoss()
if(CLONE)
damage_amt = program.host_mob.getCloneLoss()
if(above)
if(damage_amt >= threshold)
return TRUE
else
if(damage_amt < threshold)
return TRUE
return FALSE
/datum/nanite_rule/damage/copy_to(datum/nanite_program/new_program)
var/datum/nanite_rule/damage/rule = new(new_program)
rule.above = above
rule.threshold = threshold
rule.damage_type = damage_type
/datum/nanite_rule/damage/display()
return "[damage_type] [above ? ">" : "<"] [threshold]"