Skip to content
This repository has been archived by the owner on Jan 28, 2023. It is now read-only.

Commit

Permalink
fixes and improvements for suit sensors and jammers
Browse files Browse the repository at this point in the history
  • Loading branch information
Ithalan authored and comma committed Jul 22, 2018
1 parent 52f77b0 commit d3a4bb2
Show file tree
Hide file tree
Showing 22 changed files with 270 additions and 250 deletions.
35 changes: 21 additions & 14 deletions code/datums/repositories/crew/binary.dm
Original file line number Diff line number Diff line change
@@ -1,26 +1,33 @@
/*********
*Binary *
*********/

/* Binary */
/crew_sensor_modifier/binary/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
crew_data["dead"] = H.stat > UNCONSCIOUS
crew_data["alert"] = FALSE
if(!H.isSynthetic() && H.should_have_organ(BP_HEART))
var/obj/item/organ/internal/heart/O = H.internal_organs_by_name[BP_HEART]
if (!O || O.robotic < ORGAN_ROBOT) // Don't make medical freak out over prosthetic hearts
var/pulse = H.pulse()
if(pulse == PULSE_NONE || pulse == PULSE_THREADY)
crew_data["alert"] = TRUE
if(H.get_blood_oxygenation() < BLOOD_VOLUME_SAFE)
crew_data["alert"] = TRUE
return ..()

/**********
*Jamming *
**********/

/* Jamming */
/crew_sensor_modifier/binary/jamming
priority = 5

/crew_sensor_modifier/binary/jamming/alive/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
crew_data["dead"] = FALSE
return MOD_SUIT_SENSORS_HANDLED
if (crew_data["sensor_type"] == SUIT_SENSOR_BINARY )
crew_data["alert"] = FALSE
return MOD_SUIT_SENSORS_HANDLED
return ..()

/crew_sensor_modifier/binary/jamming/dead/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
crew_data["dead"] = TRUE
return MOD_SUIT_SENSORS_HANDLED
if (crew_data["sensor_type"] == SUIT_SENSOR_BINARY )
crew_data["alert"] = TRUE
return MOD_SUIT_SENSORS_HANDLED
return ..()

/* Random */
/crew_sensor_modifier/binary/jamming/random
var/error_prob = 25

Expand All @@ -33,4 +40,4 @@
/crew_sensor_modifier/binary/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
. = ..()
if(prob(error_prob))
crew_data["dead"] = pick(TRUE, FALSE)
crew_data["alert"] = pick(TRUE, FALSE)
49 changes: 16 additions & 33 deletions code/datums/repositories/crew/crew.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ var/global/datum/repository/crew/crew_repository = new()

/datum/repository/crew
var/list/cache_data
var/list/cache_data_alert
var/list/modifier_queues
var/list/modifier_queues_by_type

/datum/repository/crew/New()
cache_data = list()
cache_data_alert = list()
var/PriorityQueue/general_modifiers = new/PriorityQueue(/proc/cmp_crew_sensor_modifier)
var/PriorityQueue/binary_modifiers = new/PriorityQueue(/proc/cmp_crew_sensor_modifier)
var/PriorityQueue/vital_modifiers = new/PriorityQueue(/proc/cmp_crew_sensor_modifier)
Expand Down Expand Up @@ -44,6 +46,7 @@ var/global/datum/repository/crew/crew_repository = new()
if(world.time < cache_entry.timestamp)
return cache_entry.data

cache_data_alert[num2text(z_level)] = 0
var/tracked = scan()
for(var/obj/item/clothing/under/C in tracked)
var/turf/pos = get_turf(C)
Expand All @@ -52,48 +55,28 @@ var/global/datum/repository/crew/crew_repository = new()
var/mob/living/carbon/human/H = C.loc
if(H.w_uniform != C)
continue

var/pressure = H.get_blood_pressure()
if(H.isSynthetic() || !H.should_have_organ(BP_HEART))
pressure = "N/A"
else
var/blood_result = H.get_blood_oxygenation()
if(blood_result > 110)
blood_result = "increased"
else if(blood_result < 90)
blood_result = "low"
else if(blood_result < 60)
blood_result = "extremely low"
else
blood_result = "normal"
pressure += " ([blood_result] oxygenation)"

var/true_pulse = H.pulse()
var/pulse_span = "good"
switch(true_pulse)
if(PULSE_NONE)
pulse_span = "bad"
if(PULSE_SLOW)
pulse_span = "highlight"
if(PULSE_NORM)
pulse_span = "good"
if(PULSE_FAST)
pulse_span = "average"
if(PULSE_2FAST)
pulse_span = "bad"
if(PULSE_THREADY)
pulse_span = "bad"

var/list/crewmemberData = list("sensor_type" = C.sensor_mode, "stat"= H.stat, "span" = pulse_span, "pulse"= H.get_pulse(1), "pressure"= pressure, "bodytemp" = H.bodytemperature - T0C, "area"="", "x"=-1, "y"=-1, "z"=-1, "ref" = "\ref[H]")

var/list/crewmemberData = list("sensor_type"=C.sensor_mode, "stat"=H.stat, "area"="", "x"=-1, "y"=-1, "z"=-1, "ref"="\ref[H]")
if(!(run_queues(H, C, pos, crewmemberData) & MOD_SUIT_SENSORS_REJECTED))
crewmembers[++crewmembers.len] = crewmemberData
if (crewmemberData["alert"])
cache_data_alert[num2text(z_level)] = 1

crewmembers = sortByKey(crewmembers, "name")
cache_entry.timestamp = world.time + 5 SECONDS
cache_entry.data = crewmembers

cache_data[num2text(z_level)] = cache_entry

return crewmembers

/datum/repository/crew/proc/has_health_alert(var/z_level)
. = 0
if(!z_level)
return
health_data(z_level) // Make sure cache doesn't get stale
. = cache_data_alert[num2text(z_level)]

/datum/repository/crew/proc/scan()
var/list/tracked = list()
for(var/mob/living/carbon/human/H in SSmobs.mob_list)
Expand Down
22 changes: 9 additions & 13 deletions code/datums/repositories/crew/general.dm
Original file line number Diff line number Diff line change
@@ -1,24 +1,19 @@
/**********
*General *
**********/

/* General */
/crew_sensor_modifier/general/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
crew_data["name"] = H.get_authentification_name(if_no_id="Unknown")
crew_data["rank"] = H.get_authentification_rank(if_no_id="Unknown", if_no_job="No Job")
crew_data["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job")
return ..()

/**********
* Jamming *
**********/

/* Jamming */
/crew_sensor_modifier/general/jamming
priority = 5

/crew_sensor_modifier/general/jamming/off/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
. = ..()
// This works only because general is checked first and crew_data["sensor_type"] is used to check if whether any additional data should be included.
crew_data["sensor_type"] = SUIT_SENSOR_OFF
return MOD_SUIT_SENSORS_REJECTED

/crew_sensor_modifier/general/jamming/binary/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
. = ..()
Expand All @@ -32,21 +27,22 @@
. = ..()
crew_data["sensor_type"] = SUIT_SENSOR_TRACKING

/* Random */
/crew_sensor_modifier/general/jamming/random
var/random_sensor_type_prob = 15
var/random_rank_prob = 10
var/random_assignment_prob = 10

/crew_sensor_modifier/general/jamming/random/moderate
random_sensor_type_prob = 30
random_rank_prob = 20
random_assignment_prob = 20

/crew_sensor_modifier/general/jamming/random/major
random_sensor_type_prob = 60
random_rank_prob = 40
random_assignment_prob = 40

/crew_sensor_modifier/general/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
. = ..()
if(prob(random_sensor_type_prob))
crew_data["sensor_type"] = pick(SUIT_SENSOR_OFF, SUIT_SENSOR_BINARY, SUIT_SENSOR_VITAL, SUIT_SENSOR_TRACKING)
if(prob(random_rank_prob))
crew_data["rank"] = pick("Clown", "Mime", "Janitor", "Unknown")
if(prob(random_assignment_prob))
crew_data["assignment"] = pick("Agent", "Infiltrator", "Passenger", "Crewman", "Unknown")
10 changes: 2 additions & 8 deletions code/datums/repositories/crew/tracking.dm
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
/*********
*Vital *
*********/

/* Tracking */
/crew_sensor_modifier/tracking/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
if(pos)
var/area/A = get_area(pos)
Expand All @@ -11,10 +8,7 @@
crew_data["z"] = pos.z
return ..()

/**********
*Jamming *
**********/

/* Random */
/crew_sensor_modifier/tracking/jamming
priority = 5

Expand Down
149 changes: 86 additions & 63 deletions code/datums/repositories/crew/vital.dm
Original file line number Diff line number Diff line change
@@ -1,82 +1,105 @@
/*********
*Vital *
*********/

/* Vital */
/crew_sensor_modifier/vital/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
crew_data["oxy"] = round(H.getOxyLoss(), 1)
crew_data["tox"] = round(H.getToxLoss(), 1)
crew_data["fire"] = round(H.getFireLoss(), 1)
crew_data["brute"] = round(H.getBruteLoss(), 1)
crew_data["true_pulse"] = -1
crew_data["pulse"] = "N/A"
crew_data["pulse_span"] = "neutral"
if(!H.isSynthetic() && H.should_have_organ(BP_HEART))
var/obj/item/organ/internal/heart/O = H.internal_organs_by_name[BP_HEART]
if (!O || O.robotic < ORGAN_ROBOT) // Don't make medical freak out over prosthetic hearts
crew_data["true_pulse"] = H.pulse()
crew_data["pulse"] = H.get_pulse(1)
switch(crew_data["true_pulse"])
if(PULSE_NONE)
crew_data["pulse_span"] = "bad"
if(PULSE_SLOW)
crew_data["pulse_span"] = "average"
if(PULSE_NORM)
crew_data["pulse_span"] = "good"
if(PULSE_FAST)
crew_data["pulse_span"] = "highlight"
if(PULSE_2FAST)
crew_data["pulse_span"] = "average"
if(PULSE_THREADY)
crew_data["pulse_span"] = "bad"

crew_data["pressure"] = "N/A"
crew_data["true_oxygenation"] = -1
crew_data["oxygenation"] = ""
crew_data["oxygenation_span"] = ""
if(!H.isSynthetic() && H.should_have_organ(BP_HEART))
crew_data["pressure"] = H.get_blood_pressure()
crew_data["true_oxygenation"] = H.get_blood_oxygenation()
switch (crew_data["true_oxygenation"])
if(105 to INFINITY)
crew_data["oxygenation"] = "increased"
crew_data["oxygenation_span"] = "highlight"
if(BLOOD_VOLUME_SAFE to 105)
crew_data["oxygenation"] = "normal"
crew_data["oxygenation_span"] = "good"
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
crew_data["oxygenation"] = "low"
crew_data["oxygenation_span"] = "average"
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
crew_data["oxygenation"] = "very low"
crew_data["oxygenation_span"] = "bad"
if(-(INFINITY) to BLOOD_VOLUME_BAD)
crew_data["oxygenation"] = "extremely low"
crew_data["oxygenation_span"] = "bad"

crew_data["bodytemp"] = H.bodytemperature - T0C
return ..()

/**********
*Jamming *
**********/
/crew_sensor_modifier/vital/proc/set_healthy(var/list/crew_data)
crew_data["alert"] = FALSE
if(crew_data["true_pulse"] != -1)
crew_data["true_pulse"] = PULSE_NORM
crew_data["pulse"] = rand(60, 90)
crew_data["pulse_span"] = "good"

/crew_sensor_modifier/vital/jamming
priority = 5
if(crew_data["true_oxygenation"] != -1)
crew_data["pressure"] = "[Floor(120+rand(-5,5))]/[Floor(80+rand(-5,5))]"
crew_data["true_oxygenation"] = 100
crew_data["oxygenation"] = "normal"
crew_data["oxygenation_span"] = "good"

/crew_sensor_modifier/vital/jamming/healthy/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
crew_data["oxy"] = 0
crew_data["tox"] = 0
crew_data["fire"] = 0
crew_data["brute"] = 0
return MOD_SUIT_SENSORS_HANDLED
/crew_sensor_modifier/vital/proc/set_dead(var/list/crew_data)
crew_data["alert"] = TRUE
if(crew_data["true_pulse"] != -1)
crew_data["true_pulse"] = PULSE_NONE
crew_data["pulse"] = 0
crew_data["pulse_span"] = "bad"

/crew_sensor_modifier/vital/jamming/oxy/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
. = ..()
crew_data["oxy"] = max(200, crew_data["oxy"])
if(crew_data["true_oxygenation"] != -1)
crew_data["pressure"] = "[Floor((120+rand(-5,5))*0.25)]/[Floor((80+rand(-5,5))*0.25)]"
crew_data["true_oxygenation"] = 25
crew_data["oxygenation"] = "extremely low"
crew_data["oxygenation_span"] = "bad"

/crew_sensor_modifier/vital/jamming/tox/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
. = ..()
crew_data["tox"] = max(200, crew_data["tox"])
/* Jamming */
/crew_sensor_modifier/vital/jamming
priority = 5

/crew_sensor_modifier/vital/jamming/fire/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
/crew_sensor_modifier/vital/jamming/healthy/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
. = ..()
crew_data["fire"] = max(200, crew_data["fire"])
set_healthy(crew_data)
return MOD_SUIT_SENSORS_HANDLED

/crew_sensor_modifier/vital/jamming/brute/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
/crew_sensor_modifier/vital/jamming/dead/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
. = ..()
crew_data["brute"] = max(200, crew_data["brute"])

/*********
* Random *
*********/
set_dead(crew_data)
return MOD_SUIT_SENSORS_HANDLED

/* Random */
/crew_sensor_modifier/vital/jamming/random
var/min_diff = -10
var/max_diff = 50
var/next_shift = 0
var/list/harm_diffs
var/static/list/harms

/crew_sensor_modifier/vital/jamming/random/New()
..()
if(!harms)
harms = list("brute", "fire", "oxy", "tox")
harm_diffs = list()
var/error_prob = 25

/crew_sensor_modifier/vital/jamming/random/moderate
min_diff = -15
max_diff = 100
error_prob = 50

/crew_sensor_modifier/vital/jamming/random/major
min_diff = -20
max_diff = 200

/crew_sensor_modifier/vital/jamming/random/proc/update_diff_range()
if(world.time < next_shift)
return
next_shift = world.time + rand(30 SECONDS, 2 MINUTES)
for(var/harm in harms)
harm_diffs[harm] = rand(min_diff, max_diff)
error_prob = 100

/crew_sensor_modifier/vital/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data)
..()
update_diff_range()
for(var/harm in harms)
if(crew_data[harm] == 0 && harm_diffs[harm] < 0) // Making sure jamming(almost) always has an effect
crew_data[harm] = crew_data[harm] - harm_diffs[harm]
else
crew_data[harm] = max(0, crew_data[harm] + harm_diffs[harm])
return MOD_SUIT_SENSORS_HANDLED
. = ..()
if(prob(error_prob))
pick(set_healthy(crew_data), set_dead(crew_data))
Loading

0 comments on commit d3a4bb2

Please sign in to comment.