From 005870ce99f3a0c598892b224d776ee327d84e69 Mon Sep 17 00:00:00 2001 From: hyperjll Date: Tue, 26 May 2026 23:52:23 -0400 Subject: [PATCH 1/3] Nanite DLC + Changes Adds the organ damage sensor, makes assistant and species sensors completely passive and compatible with rules. --- .../nanites/code/designs/nanite_sensor.dm | 7 ++ surfshack13/nanites/code/items.dm | 3 + surfshack13/nanites/code/programs/sensor.dm | 104 +++++++++++++++-- surfshack13/nanites/code/research.dm | 1 + surfshack13/nanites/code/settings/rules.dm | 106 +++++++++++++++++- 5 files changed, 207 insertions(+), 14 deletions(-) diff --git a/surfshack13/nanites/code/designs/nanite_sensor.dm b/surfshack13/nanites/code/designs/nanite_sensor.dm index ff52811ec08..4d0d7334daa 100644 --- a/surfshack13/nanites/code/designs/nanite_sensor.dm +++ b/surfshack13/nanites/code/designs/nanite_sensor.dm @@ -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 diff --git a/surfshack13/nanites/code/items.dm b/surfshack13/nanites/code/items.dm index 30fdb13fae0..0b0af877bba 100644 --- a/surfshack13/nanites/code/items.dm +++ b/surfshack13/nanites/code/items.dm @@ -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 diff --git a/surfshack13/nanites/code/programs/sensor.dm b/surfshack13/nanites/code/programs/sensor.dm index 4ea7be0165f..574ad20abe9 100644 --- a/surfshack13/nanites/code/programs/sensor.dm +++ b/surfshack13/nanites/code/programs/sensor.dm @@ -261,9 +261,7 @@ /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 + can_rule = TRUE ///List of all species we can add special sensors for. var/static/list/allowed_species = list( @@ -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 @@ -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" @@ -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 + 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" @@ -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 diff --git a/surfshack13/nanites/code/research.dm b/surfshack13/nanites/code/research.dm index ffff0c01859..8cf0bfe22be 100644 --- a/surfshack13/nanites/code/research.dm +++ b/surfshack13/nanites/code/research.dm @@ -89,6 +89,7 @@ "shock_nanites", "emp_nanites", "temperature_nanites", + "sensor_organ_nanites", ) research_costs = list( TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS, diff --git a/surfshack13/nanites/code/settings/rules.dm b/surfshack13/nanites/code/settings/rules.dm index 203d0701472..9ee072f3a3d 100644 --- a/surfshack13/nanites/code/settings/rules.dm +++ b/surfshack13/nanites/code/settings/rules.dm @@ -49,7 +49,6 @@ rule.above = above rule.threshold = threshold -//TODO allow inversion /datum/nanite_rule/crit name = "Crit" desc = "Checks if the host is in critical condition." @@ -57,7 +56,6 @@ /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." @@ -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" @@ -142,7 +171,6 @@ return TRUE return FALSE - /datum/nanite_rule/incapacitated name = "Incapacitated" desc = "Checks if the host is incapacitated." @@ -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(host_mob.mind?.assigned_role.title == "Assistant") + return TRUE + else + if(host_mob.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" @@ -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]" From e212298dad27959997901491727aa5677087fae2 Mon Sep 17 00:00:00 2001 From: hyperjll Date: Tue, 2 Jun 2026 10:29:44 -0400 Subject: [PATCH 2/3] small fix --- surfshack13/nanites/code/settings/rules.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/surfshack13/nanites/code/settings/rules.dm b/surfshack13/nanites/code/settings/rules.dm index 9ee072f3a3d..bec0f7c6058 100644 --- a/surfshack13/nanites/code/settings/rules.dm +++ b/surfshack13/nanites/code/settings/rules.dm @@ -190,10 +190,10 @@ var/mob/living/carbon/human/our_fella = program.host_mob if(mode) - if(host_mob.mind?.assigned_role.title == "Assistant") + if(our_fella.mind?.assigned_role.title == "Assistant") return TRUE else - if(host_mob.mind?.assigned_role.title == "Assistant") + if(our_fella.mind?.assigned_role.title == "Assistant") return FALSE return FALSE From eaf5bb67a31aff6341fb732cea7b79239ba97130 Mon Sep 17 00:00:00 2001 From: hyperjll Date: Thu, 4 Jun 2026 13:37:17 -0400 Subject: [PATCH 3/3] Fixes some descriptions --- surfshack13/nanites/code/designs/nanite_sensor.dm | 4 ++-- surfshack13/nanites/code/programs/sensor.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/surfshack13/nanites/code/designs/nanite_sensor.dm b/surfshack13/nanites/code/designs/nanite_sensor.dm index 4d0d7334daa..fc94f0c9626 100644 --- a/surfshack13/nanites/code/designs/nanite_sensor.dm +++ b/surfshack13/nanites/code/designs/nanite_sensor.dm @@ -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 @@ -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 diff --git a/surfshack13/nanites/code/programs/sensor.dm b/surfshack13/nanites/code/programs/sensor.dm index 574ad20abe9..92f5bd4b618 100644 --- a/surfshack13/nanites/code/programs/sensor.dm +++ b/surfshack13/nanites/code/programs/sensor.dm @@ -260,7 +260,7 @@ /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." + 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. @@ -332,7 +332,7 @@ /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." + 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/assistant/register_extra_settings()