Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions surfshack13/nanites/code/designs/nanite_sensor.dm
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@

/datum/design/nanites/sensor_species
name = "Species Sensor"
desc = "When triggered, the nanites scan the host to determine their species and output a signal depending on the conditions set in the settings."
desc = "The nanites scan the host to determine their species and output a signal depending on the conditions set in the settings."
id = "sensor_species_nanites"
category = list(NANITES_CATEGORY_SENSOR)
program_type = /datum/nanite_program/sensor/species
Expand All @@ -56,7 +56,7 @@

/datum/design/nanites/sensor_assistant
name = "Assistant Sensor"
desc = "When triggered, the nanites scan the host's biodata and match it with Nanotrasen's private bio-records and outputs a signal if the host is an assistant."
desc = "The nanites scan the host's biodata and match it with Nanotrasen's private bio-records and outputs a signal if the host is an assistant."
id = "sensor_assistant_nanites"
category = list(NANITES_CATEGORY_SENSOR)
program_type = /datum/nanite_program/sensor/assistant
Expand All @@ -74,3 +74,10 @@
id = "sensor_resting_nanites"
category = list(NANITES_CATEGORY_SENSOR)
program_type = /datum/nanite_program/sensor/resting

/datum/design/nanites/sensor_organ
name = "Organ Damage Sensor"
desc = "The nanites receive a signal when a host's organ damage is above/below a target value."
id = "sensor_organ_nanites"
category = list(NANITES_CATEGORY_SENSOR)
program_type = /datum/nanite_program/sensor/organ_damage
3 changes: 3 additions & 0 deletions surfshack13/nanites/code/items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,9 @@
/obj/item/disk/nanite_program/resting
program = /datum/nanite_program/sensor/resting

/obj/item/disk/nanite_program/organ_sensor
program = /datum/nanite_program/sensor/organ_damage

/obj/item/disk/nanite_program/defib
program = /datum/nanite_program/defib

Expand Down
108 changes: 95 additions & 13 deletions surfshack13/nanites/code/programs/sensor.dm
Original file line number Diff line number Diff line change
Expand Up @@ -260,10 +260,8 @@

/datum/nanite_program/sensor/species
name = "Species Sensor"
desc = "When triggered, the nanites scan the host to determine their species and output a signal depending on the conditions set in the settings."
can_trigger = TRUE
trigger_cost = 0
trigger_cooldown = 5
desc = "The nanites scan the host to determine their species and output a signal depending on the conditions set in the settings."
can_rule = TRUE

///List of all species we can add special sensors for.
var/static/list/allowed_species = list(
Expand All @@ -286,7 +284,7 @@
extra_settings[NES_RACE] = new /datum/nanite_extra_setting/type("Human", species_types)
extra_settings[NES_MODE] = new /datum/nanite_extra_setting/boolean(TRUE, "Is", "Is Not")

/datum/nanite_program/sensor/species/on_trigger(comm_message)
/datum/nanite_program/sensor/species/check_event()
var/datum/nanite_extra_setting/species_type = extra_settings[NES_RACE]
var/species = allowed_species[species_type.get_value()]
var/species_match = FALSE
Expand All @@ -310,6 +308,13 @@
if(!species_match)
send_code()

/datum/nanite_program/sensor/species/make_rule(datum/nanite_program/target)
var/datum/nanite_rule/species/rule = new(target)
var/datum/nanite_extra_setting/specie_input = extra_settings[NES_RACE]
var/datum/nanite_extra_setting/mymode = extra_settings[NES_MODE]
rule.rule_specie_input = allowed_species[specie_input.get_value()]
rule.mode = mymode.get_value()
return rule

/datum/nanite_program/sensor/alive
name = "Vital Sensor"
Expand All @@ -325,17 +330,30 @@
var/datum/nanite_rule/alive/rule = new(target)
return rule


/datum/nanite_program/sensor/assistant
name = "Assistant Sensor"
desc = "When triggered, the nanites scan the host's biodata and match it with Nanotrasen's private bio-records and output a signal if the host is an assistant."
can_trigger = TRUE
trigger_cost = 0
trigger_cooldown = 5
desc = "The nanites scan the host's biodata and match it with Nanotrasen's private bio-records and output a signal if the host is an assistant."
can_rule = TRUE

/datum/nanite_program/sensor/job/on_trigger(comm_message)
if(host_mob.mind?.assigned_role.title == "Assistant")
send_code()
/datum/nanite_program/sensor/assistant/register_extra_settings()
. = ..()
extra_settings[NES_MODE] = new /datum/nanite_extra_setting/boolean(TRUE, "Is", "Is Not")

/datum/nanite_program/sensor/assistant/check_event()
var/datum/nanite_extra_setting/mode = extra_settings[NES_MODE]

if(mode)
if(host_mob.mind?.assigned_role.title == "Assistant")
return TRUE
else
if(host_mob.mind?.assigned_role.title == "Assistant")
return FALSE

/datum/nanite_program/sensor/assistant/make_rule(datum/nanite_program/target)
var/datum/nanite_rule/assistant/rule = new(target)
var/datum/nanite_extra_setting/mymode = extra_settings[NES_MODE]
rule.mode = mymode.get_value()
return rule

/datum/nanite_program/sensor/incapacitated
name = "Incapacitated Sensor"
Expand Down Expand Up @@ -364,3 +382,67 @@
/datum/nanite_program/sensor/resting/make_rule(datum/nanite_program/target)
var/datum/nanite_rule/resting/rule = new(target)
return rule

/datum/nanite_program/sensor/organ_damage
name = "Organ Damage Sensor"
desc = "The nanites receive a signal when a host's organ damage is above/below a target value."
can_rule = TRUE
var/spent = FALSE

/datum/nanite_program/sensor/organ_damage/register_extra_settings()
. = ..()
extra_settings[NES_DAMAGE_TYPE] = new /datum/nanite_extra_setting/type("BRAIN", list("BRAIN", "HEART", "LUNGS", "LIVER", "STOMACH", "EYES", "EARS", "APPENDIX"))
extra_settings[NES_DAMAGE] = new /datum/nanite_extra_setting/number(0, 0, 500)
extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below")

/datum/nanite_program/sensor/organ_damage/check_event()
var/reached_threshold = FALSE
var/datum/nanite_extra_setting/type = extra_settings[NES_DAMAGE_TYPE]
var/datum/nanite_extra_setting/damage = extra_settings[NES_DAMAGE]
var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION]
var/check_above = direction.get_value()
var/damage_amt = 0
var/mob/living/carbon/human/our_fella = host_mob
switch(type.get_value())
if("BRAIN")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_BRAIN)
if("HEART")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_HEART)
if("LUNGS")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_LUNGS)
if("LIVER")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_LIVER)
if("STOMACH")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_STOMACH)
if("EYES")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_EYES)
if("EARS")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_EARS)
if("APPENDIX")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_APPENDIX)

if(check_above)
if(damage_amt >= damage.get_value())
reached_threshold = TRUE
else
if(damage_amt < damage.get_value())
reached_threshold = TRUE

if(reached_threshold)
if(!spent)
spent = TRUE
return TRUE
return FALSE
else
spent = FALSE
return FALSE

/datum/nanite_program/sensor/organ_damage/make_rule(datum/nanite_program/target)
var/datum/nanite_rule/organ_damage/rule = new(target)
var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION]
var/datum/nanite_extra_setting/damage_type = extra_settings[NES_DAMAGE_TYPE]
var/datum/nanite_extra_setting/damage = extra_settings[NES_DAMAGE]
rule.above = direction.get_value()
rule.threshold = damage.get_value()
rule.damage_type = damage_type.get_value()
return rule
1 change: 1 addition & 0 deletions surfshack13/nanites/code/research.dm
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
"shock_nanites",
"emp_nanites",
"temperature_nanites",
"sensor_organ_nanites",
)
research_costs = list(
TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS,
Expand Down
106 changes: 103 additions & 3 deletions surfshack13/nanites/code/settings/rules.dm
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,13 @@
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."
Expand Down Expand Up @@ -132,6 +130,37 @@
/datum/nanite_rule/damage/display()
return "[damage_type] [above ? ">" : "<"] [threshold]"

/datum/nanite_rule/species
name = "Species"
desc = "Checks the host's species."
// What's the name we're looking for.
var/rule_specie_input = /datum/species/human
// IS or IS NOT the name we input
var/mode = TRUE
// What name is displayed on the rule?
var/display_name = "Human"

/datum/nanite_rule/species/check_rule()
var/mob/living/carbon/human/our_fella = program.host_mob
if(!iscarbon(our_fella))
return FALSE

if(mode)
if(is_species(our_fella, rule_specie_input))
return TRUE
else
if(is_species(our_fella, rule_specie_input))
return FALSE
return FALSE

/datum/nanite_rule/species/copy_to(datum/nanite_program/new_program)
var/datum/nanite_rule/species/rule = new(new_program)
rule.rule_specie_input = rule_specie_input
rule.mode = mode
rule.display_name = display_name

/datum/nanite_rule/species/display()
return "[name] [mode ? "Is" : "Is Not"] [display_name]"

/datum/nanite_rule/alive
name = "Alive"
Expand All @@ -142,7 +171,6 @@
return TRUE
return FALSE


/datum/nanite_rule/incapacitated
name = "Incapacitated"
desc = "Checks if the host is incapacitated."
Expand All @@ -152,6 +180,29 @@
return TRUE
return FALSE

/datum/nanite_rule/assistant
name = "Assistant"
desc = "Checks if the host is an assistant or not."
// IS or IS NOT the name we input
var/mode = TRUE

/datum/nanite_rule/assistant/check_rule()
var/mob/living/carbon/human/our_fella = program.host_mob

if(mode)
if(our_fella.mind?.assigned_role.title == "Assistant")
return TRUE
else
if(our_fella.mind?.assigned_role.title == "Assistant")
return FALSE
return FALSE

/datum/nanite_rule/assistant/copy_to(datum/nanite_program/new_program)
var/datum/nanite_rule/assistant/rule = new(new_program)
rule.mode = mode

/datum/nanite_rule/assistant/display()
return "[mode ? "Is" : "Is Not"] [name]"

/datum/nanite_rule/resting
name = "Resting"
Expand All @@ -161,3 +212,52 @@
if(program.host_mob.resting)
return TRUE
return FALSE

/datum/nanite_rule/organ_damage
name = "Organ Damage"
desc = "Checks a specific organ's damage within the host."

var/threshold = 50
var/above = TRUE
var/damage_type = BRAIN

/datum/nanite_rule/organ_damage/check_rule()
var/mob/living/carbon/human/our_fella = program.host_mob
if(!iscarbon(our_fella))
return FALSE

var/damage_amt = 0
switch(damage_type)
if("BRAIN")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_BRAIN)
if("HEART")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_HEART)
if("LUNGS")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_LUNGS)
if("LIVER")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_LIVER)
if("STOMACH")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_STOMACH)
if("EYES")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_EYES)
if("EARS")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_EARS)
if("APPENDIX")
damage_amt = our_fella.get_organ_loss(ORGAN_SLOT_APPENDIX)

if(above)
if(damage_amt >= threshold)
return TRUE
else
if(damage_amt < threshold)
return TRUE
return FALSE

/datum/nanite_rule/organ_damage/copy_to(datum/nanite_program/new_program)
var/datum/nanite_rule/organ_damage/rule = new(new_program)
rule.above = above
rule.threshold = threshold
rule.damage_type = damage_type

/datum/nanite_rule/organ_damage/display()
return "[damage_type] [above ? ">" : "<"] [threshold]"
Loading