mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-02 04:52:10 +00:00
* Initial commit, first PR added, small sprite tweaks done myself * hardsuit tail sprite and more modifications * Language and stuff, most of second PR * idk what I did here because I slept between commits but probably a lot * Adds many many matrix coloured earsprites fuck me this was a lot of work * Species page, body markings and final cosmetic changes * Small tail tweak * Small clothing sprite tweak * Linter: trailing newline * schechi icon made, code clothing moved to modular/master file * Some suggestions implemented * Comments etc * snake_case * Changes var names, rejects body size modification * again but properly this time * Moves clothing pixel stuff into defines * Quirks can be restricted for some species now * And now it actually works * Move to modular file * removes species quirk stuff * Fixed Schechi * Fixes 0 damage punch, made a husk sprite * improves clothing sprites, fixes offsets of 'certain' bodyparts... :/ * Nevermind, it just doesn't work, no dicks for you Co-authored-by: Ranged <nickvanderkroon@gmail.com>
333 lines
11 KiB
Plaintext
333 lines
11 KiB
Plaintext
/datum/nanite_program/sensor
|
|
name = "Sensor Nanites"
|
|
desc = "These nanites send a signal code when a certain condition is met."
|
|
unique = FALSE
|
|
var/can_rule = FALSE
|
|
|
|
/datum/nanite_program/sensor/register_extra_settings()
|
|
extra_settings[NES_SENT_CODE] = new /datum/nanite_extra_setting/number(0, 1, 9999)
|
|
|
|
/datum/nanite_program/sensor/proc/check_event()
|
|
return FALSE
|
|
|
|
/datum/nanite_program/sensor/proc/send_code()
|
|
if(activated)
|
|
var/datum/nanite_extra_setting/ES = extra_settings[NES_SENT_CODE]
|
|
SEND_SIGNAL(host_mob, COMSIG_NANITE_SIGNAL, ES.value, "a [name] program")
|
|
|
|
/datum/nanite_program/sensor/active_effect()
|
|
if(check_event())
|
|
send_code()
|
|
|
|
/datum/nanite_program/sensor/proc/make_rule(datum/nanite_program/target)
|
|
return
|
|
|
|
/datum/nanite_program/sensor/repeat
|
|
name = "Signal Repeater"
|
|
desc = "When triggered, sends another signal to the nanites, optionally with a delay."
|
|
can_trigger = TRUE
|
|
trigger_cost = 0
|
|
trigger_cooldown = 10
|
|
var/spent = FALSE
|
|
|
|
/datum/nanite_program/sensor/repeat/register_extra_settings()
|
|
. = ..()
|
|
extra_settings[NES_DELAY] = new /datum/nanite_extra_setting/number(0, 0, 3600, "s")
|
|
|
|
/datum/nanite_program/sensor/repeat/on_trigger(comm_message)
|
|
var/datum/nanite_extra_setting/ES = extra_settings[NES_DELAY]
|
|
addtimer(CALLBACK(src, .proc/send_code), ES.get_value() * 10)
|
|
|
|
/datum/nanite_program/sensor/relay_repeat
|
|
name = "Relay Signal Repeater"
|
|
desc = "When triggered, sends another signal to a relay channel, optionally with a delay."
|
|
can_trigger = TRUE
|
|
trigger_cost = 0
|
|
trigger_cooldown = 10
|
|
var/spent = FALSE
|
|
|
|
/datum/nanite_program/sensor/relay_repeat/register_extra_settings()
|
|
. = ..()
|
|
extra_settings[NES_RELAY_CHANNEL] = new /datum/nanite_extra_setting/number(1, 1, 9999)
|
|
extra_settings[NES_DELAY] = new /datum/nanite_extra_setting/number(0, 0, 3600, "s")
|
|
|
|
/datum/nanite_program/sensor/relay_repeat/on_trigger(comm_message)
|
|
var/datum/nanite_extra_setting/ES = extra_settings[NES_DELAY]
|
|
addtimer(CALLBACK(src, .proc/send_code), ES.get_value() * 10)
|
|
|
|
/datum/nanite_program/sensor/relay_repeat/send_code()
|
|
var/datum/nanite_extra_setting/relay = extra_settings[NES_RELAY_CHANNEL]
|
|
if(activated && relay.get_value())
|
|
for(var/X in SSnanites.nanite_relays)
|
|
var/datum/nanite_program/relay/N = X
|
|
var/datum/nanite_extra_setting/code = extra_settings[NES_SENT_CODE]
|
|
N.relay_signal(code.get_value(), relay.get_value(), "a [name] program")
|
|
|
|
/datum/nanite_program/sensor/health
|
|
name = "Health Sensor"
|
|
desc = "The nanites receive a signal when the host's health is above/below a target percentage."
|
|
can_rule = TRUE
|
|
var/spent = FALSE
|
|
|
|
/datum/nanite_program/sensor/health/register_extra_settings()
|
|
. = ..()
|
|
extra_settings[NES_HEALTH_PERCENT] = new /datum/nanite_extra_setting/number(50, -99, 100, "%")
|
|
extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below")
|
|
|
|
/datum/nanite_program/sensor/health/check_event()
|
|
var/health_percent = host_mob.health / host_mob.maxHealth * 100
|
|
var/datum/nanite_extra_setting/percent = extra_settings[NES_HEALTH_PERCENT]
|
|
var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION]
|
|
var/detected = FALSE
|
|
if(direction.get_value())
|
|
if(health_percent >= percent.get_value())
|
|
detected = TRUE
|
|
else
|
|
if(health_percent < percent.get_value())
|
|
detected = TRUE
|
|
|
|
if(detected)
|
|
if(!spent)
|
|
spent = TRUE
|
|
return TRUE
|
|
return FALSE
|
|
else
|
|
spent = FALSE
|
|
return FALSE
|
|
|
|
/datum/nanite_program/sensor/health/make_rule(datum/nanite_program/target)
|
|
var/datum/nanite_rule/health/rule = new(target)
|
|
var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION]
|
|
var/datum/nanite_extra_setting/percent = extra_settings[NES_HEALTH_PERCENT]
|
|
rule.above = direction.get_value()
|
|
rule.threshold = percent.get_value()
|
|
return rule
|
|
|
|
/datum/nanite_program/sensor/crit
|
|
name = "Critical Health Sensor"
|
|
desc = "The nanites receive a signal when the host first reaches critical health."
|
|
can_rule = TRUE
|
|
var/spent = FALSE
|
|
|
|
/datum/nanite_program/sensor/crit/check_event()
|
|
if(HAS_TRAIT(host_mob, TRAIT_CRITICAL_CONDITION))
|
|
if(spent)
|
|
return FALSE
|
|
spent = TRUE
|
|
return TRUE
|
|
spent = FALSE
|
|
return FALSE
|
|
|
|
|
|
/datum/nanite_program/sensor/crit/make_rule(datum/nanite_program/target)
|
|
var/datum/nanite_rule/crit/rule = new(target)
|
|
return rule
|
|
|
|
/datum/nanite_program/sensor/death
|
|
name = "Death Sensor"
|
|
desc = "The nanites receive a signal when they detect the host is dead."
|
|
can_rule = TRUE
|
|
var/spent = FALSE
|
|
|
|
/datum/nanite_program/sensor/death/on_death()
|
|
send_code()
|
|
|
|
/datum/nanite_program/sensor/death/make_rule(datum/nanite_program/target)
|
|
var/datum/nanite_rule/death/rule = new(target)
|
|
return rule
|
|
|
|
/datum/nanite_program/sensor/nanite_volume
|
|
name = "Nanite Volume Sensor"
|
|
desc = "The nanites receive a signal when the nanite supply is above/below a certain percentage."
|
|
can_rule = TRUE
|
|
var/spent = FALSE
|
|
|
|
/datum/nanite_program/sensor/nanite_volume/register_extra_settings()
|
|
. = ..()
|
|
extra_settings[NES_NANITE_PERCENT] = new /datum/nanite_extra_setting/number(50, -99, 100, "%")
|
|
extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below")
|
|
|
|
/datum/nanite_program/sensor/nanite_volume/check_event()
|
|
var/nanite_percent = (nanites.nanite_volume - nanites.safety_threshold)/(nanites.max_nanites - nanites.safety_threshold)*100
|
|
var/datum/nanite_extra_setting/percent = extra_settings[NES_NANITE_PERCENT]
|
|
var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION]
|
|
var/detected = FALSE
|
|
if(direction.get_value())
|
|
if(nanite_percent >= percent.get_value())
|
|
detected = TRUE
|
|
else
|
|
if(nanite_percent < percent.get_value())
|
|
detected = TRUE
|
|
|
|
if(detected)
|
|
if(!spent)
|
|
spent = TRUE
|
|
return TRUE
|
|
return FALSE
|
|
else
|
|
spent = FALSE
|
|
return FALSE
|
|
|
|
/datum/nanite_program/sensor/nanite_volume/make_rule(datum/nanite_program/target)
|
|
var/datum/nanite_rule/nanites/rule = new(target)
|
|
var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION]
|
|
var/datum/nanite_extra_setting/percent = extra_settings[NES_NANITE_PERCENT]
|
|
rule.above = direction.get_value()
|
|
rule.threshold = percent.get_value()
|
|
return rule
|
|
|
|
/datum/nanite_program/sensor/damage
|
|
name = "Damage Sensor"
|
|
desc = "The nanites receive a signal when a host's specific damage type is above/below a target value."
|
|
can_rule = TRUE
|
|
var/spent = FALSE
|
|
|
|
/datum/nanite_program/sensor/damage/register_extra_settings()
|
|
. = ..()
|
|
extra_settings[NES_DAMAGE_TYPE] = new /datum/nanite_extra_setting/type(BRUTE, list(BRUTE, BURN, TOX, OXY, CLONE))
|
|
extra_settings[NES_DAMAGE] = new /datum/nanite_extra_setting/number(50, 0, 500)
|
|
extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below")
|
|
|
|
/datum/nanite_program/sensor/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
|
|
switch(type.get_value())
|
|
if(BRUTE)
|
|
damage_amt = host_mob.getBruteLoss()
|
|
if(BURN)
|
|
damage_amt = host_mob.getFireLoss()
|
|
if(TOX)
|
|
damage_amt = host_mob.getToxLoss()
|
|
if(OXY)
|
|
damage_amt = host_mob.getOxyLoss()
|
|
if(CLONE)
|
|
damage_amt = host_mob.getCloneLoss()
|
|
|
|
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/damage/make_rule(datum/nanite_program/target)
|
|
var/datum/nanite_rule/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
|
|
|
|
/datum/nanite_program/sensor/voice
|
|
name = "Voice Sensor"
|
|
desc = "The nanites receive a signal when they detect a specific, preprogrammed word or phrase being said."
|
|
|
|
/datum/nanite_program/sensor/voice/register_extra_settings()
|
|
. = ..()
|
|
extra_settings[NES_SENTENCE] = new /datum/nanite_extra_setting/text("")
|
|
extra_settings[NES_INCLUSIVE_MODE] = new /datum/nanite_extra_setting/boolean(TRUE, "Inclusive", "Exclusive")
|
|
|
|
/datum/nanite_program/sensor/voice/on_mob_add()
|
|
. = ..()
|
|
RegisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear)
|
|
|
|
/datum/nanite_program/sensor/voice/on_mob_remove()
|
|
UnregisterSignal(host_mob, COMSIG_MOVABLE_HEAR)
|
|
|
|
/datum/nanite_program/sensor/voice/proc/on_hear(datum/source, list/hearing_args)
|
|
SIGNAL_HANDLER
|
|
var/datum/nanite_extra_setting/sentence = extra_settings[NES_SENTENCE]
|
|
var/datum/nanite_extra_setting/inclusive = extra_settings[NES_INCLUSIVE_MODE]
|
|
if(!sentence.get_value())
|
|
return
|
|
if(inclusive.get_value())
|
|
if(findtext(hearing_args[HEARING_RAW_MESSAGE], sentence.get_value()))
|
|
send_code()
|
|
else
|
|
if(lowertext(hearing_args[HEARING_RAW_MESSAGE]) == lowertext(sentence.get_value()))
|
|
send_code()
|
|
|
|
/datum/nanite_program/sensor/species
|
|
name = "Species Sensor"
|
|
desc = "When triggered, the nanites scan the host to determine their species and receive a signal depending on the conditions set in the settings."
|
|
can_trigger = TRUE
|
|
trigger_cost = 0
|
|
trigger_cooldown = 5
|
|
|
|
var/list/static/allowed_species = list(
|
|
"Human" = /datum/species/human,
|
|
"Lizard" = /datum/species/lizard,
|
|
"Moth" = /datum/species/moth,
|
|
"Ethereal" = /datum/species/ethereal,
|
|
"Pod" = /datum/species/pod,
|
|
"Fly" = /datum/species/fly,
|
|
"Felinid" = /datum/species/human/felinid,
|
|
"Jelly" = /datum/species/jelly,
|
|
"Skrell" = /datum/species/skrell, // SKYRAT EDIT - START
|
|
"Anthromorph" = /datum/species/mammal,
|
|
"Slime Person" = /datum/species/jelly/roundstartslime,
|
|
"Vox" = /datum/species/vox,
|
|
"Humanoid" = /datum/species/humanoid,
|
|
"Insect" = /datum/species/insect,
|
|
"Xeno-Hybrid" = /datum/species/xeno,
|
|
"Aquatic" = /datum/species/aquatic,
|
|
"Akula" = /datum/species/akula,
|
|
"Vulpkanin" = /datum/species/vulpkanin,
|
|
"Unathi" = /datum/species/unathi,
|
|
"Tajaran" = /datum/species/tajaran,
|
|
"Dwarf" = /datum/species/dwarf,
|
|
"IPC" = /datum/species/robotic/ipc,
|
|
"Teshari" = /datum/species/teshari,
|
|
"Synthetic Lizard" = /datum/species/robotic/synthliz,
|
|
"Synthetic Mammal" = /datum/species/robotic/synthetic_mammal,
|
|
"Synthetic Human" = /datum/species/robotic/synthetic_human, // SKYRAT EDIT - END
|
|
)
|
|
|
|
/datum/nanite_program/sensor/species/register_extra_settings()
|
|
. = ..()
|
|
var/list/species_types = list()
|
|
for(var/name in allowed_species)
|
|
species_types += name
|
|
species_types += "Other"
|
|
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)
|
|
var/datum/nanite_extra_setting/species_type = extra_settings[NES_RACE]
|
|
var/species = allowed_species[species_type.get_value()]
|
|
var/species_match = FALSE
|
|
|
|
if(species)
|
|
if(is_species(host_mob, species))
|
|
species_match = TRUE
|
|
else //this is the check for the "Other" option
|
|
species_match = TRUE
|
|
for(var/name in allowed_species)
|
|
var/species_other = allowed_species[name]
|
|
if(is_species(host_mob, species_other))
|
|
species_match = FALSE
|
|
break
|
|
|
|
var/datum/nanite_extra_setting/mode = extra_settings[NES_MODE]
|
|
if(mode.get_value())
|
|
if(species_match)
|
|
send_code()
|
|
else
|
|
if(!species_match)
|
|
send_code()
|