mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-21 20:11:04 +01:00
https://www.youtube.com/watch?v=9mPvZ96pHJI A pull request commissioned by the Synthetic Lore Team to comprehensively rework synthetics (read: IPCs) and how they work in Aurora. The objective is to make IPCs as unique as possible from humans, upgrading the robotic feel and atmosphere, while also preserving a good sense of balance in-game. Key features: - A comprehensive expansion of synthetic organs, all of which now fulfill a purpose: hydraulics, cooling units, power systems, actuators, diagnostics units. - Customizable organs with benefits and drawbacks, such as with cooling units and power systems. - Unique ways to repair the organs and more involved steps. - Unique damage mechanics - every organ has wiring and electronics which affect its functioning, and they are defended by plating which provides natural armour. - Improved and immersive diagnostics. - Unique features, benefits, and drawbacks for every IPC frame. - A rework of the positronic brain, which can be either destroyed or shut down, alongside effects caused by low integrity. - A rework of how EMPs affect IPC organs. - Non-binary damage states for each organ. To-do: - [x] Finish the unique features for each frame. - [x] Look into if mechanical synthskin is possible. - [x] Power system. - [x] Posibrain mechanics. - [ ] Passive cooling expansion. - [x] EMP mechanics. - [x] Repair mechanics. - [x] Mob weight mechanics. - [ ] Gurney for heavy mobs. - [x] New augments. - [ ] IPC tag scanning and flashing. --------- Signed-off-by: Werner <1331699+Arrow768@users.noreply.github.com> Co-authored-by: Matt Atlas <liermattia@gmail.com> Co-authored-by: Geeves <22774890+Geevies@users.noreply.github.com> Co-authored-by: Werner <1331699+Arrow768@users.noreply.github.com>
120 lines
4.3 KiB
Plaintext
120 lines
4.3 KiB
Plaintext
#define ZERO_WIDTH_SPACE "​" //prevents the UI elements from popping out of place when viewport gets too small
|
|
|
|
// Oxyginetion states
|
|
#define OXYGENATION_STATE_HIGH 5
|
|
#define OXYGENATION_STATE_NORMAL 4
|
|
#define OXYGENATION_STATE_LOW 3
|
|
#define OXYGENATION_STATE_VERY_LOW 2
|
|
#define OXYGENATION_STATE_NONE 1
|
|
#define OXYGENATION_STATE_UNDEFINED 0
|
|
|
|
GLOBAL_DATUM_INIT(crew_repository, /datum/repository/crew, new())
|
|
|
|
/datum/repository/crew
|
|
var/list/cache_data
|
|
|
|
/datum/repository/crew/New()
|
|
cache_data = list()
|
|
..()
|
|
|
|
/datum/repository/crew/proc/health_data(var/z_level)
|
|
var/list/crewmembers = list()
|
|
var/area_display_name
|
|
if(!z_level)
|
|
return crewmembers
|
|
|
|
var/datum/cache_entry/cache_entry = cache_data[num2text(z_level)]
|
|
if(!cache_entry)
|
|
cache_entry = new/datum/cache_entry
|
|
cache_data[num2text(z_level)] = cache_entry
|
|
|
|
if(world.time < cache_entry.timestamp)
|
|
return cache_entry.data
|
|
|
|
var/tracked = scan()
|
|
for(var/t in tracked)
|
|
var/obj/item/clothing/under/C = t
|
|
var/turf/pos = get_turf(C)
|
|
if((C) && (C.has_sensor) && (pos) && (pos.z == z_level) && (C.sensor_mode != SUIT_SENSOR_OFF) && !within_jamming_range(C))
|
|
if(istype(C.loc, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = C.loc
|
|
if(H.w_uniform != C)
|
|
continue
|
|
|
|
var/list/crewmemberData = list("area"=null, "x"=null, "y"=null, "z"=null, "level"=null, "ref" = "[REF(H)]")
|
|
|
|
crewmemberData["stype"] = C.sensor_mode
|
|
crewmemberData["name"] = H.get_authentification_name(if_no_id="Unknown")
|
|
crewmemberData["ass"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job")
|
|
|
|
if(C.sensor_mode >= SUIT_SENSOR_BINARY)
|
|
crewmemberData["pulse"] = "N/A"
|
|
crewmemberData["tpulse"] = -1
|
|
crewmemberData["cellCharge"] = -1
|
|
if(!H.isSynthetic())
|
|
if(H.should_have_organ(BP_HEART))
|
|
var/obj/item/organ/internal/heart/O = H.internal_organs_by_name[BP_HEART]
|
|
if (!O || !BP_IS_ROBOTIC(O)) // Don't make medical freak out over prosthetic hearts
|
|
crewmemberData["tpulse"] = H.status_flags & FAKEDEATH ? 0 : H.pulse()
|
|
crewmemberData["pulse"] = H.get_pulse(GETPULSE_TOOL)
|
|
else
|
|
if(isipc(H) && H.internal_organs_by_name[BP_IPCTAG]) // Don't make untagged IPCs obvious
|
|
var/obj/item/organ/internal/machine/power_core/cell = H.internal_organs_by_name[BP_CELL]
|
|
if(cell)
|
|
crewmemberData["cellCharge"] = cell.percent()
|
|
|
|
if(C.sensor_mode >= SUIT_SENSOR_VITAL)
|
|
crewmemberData["pressure"] = "N/A"
|
|
crewmemberData["toxyg"] = -1
|
|
crewmemberData["oxyg"] = OXYGENATION_STATE_UNDEFINED
|
|
if(!H.isSynthetic() && H.should_have_organ(BP_HEART))
|
|
crewmemberData["tpressure"] = H.get_blood_pressure_alert()
|
|
crewmemberData["pressure"] = H.get_blood_pressure()
|
|
crewmemberData["toxyg"] = H.get_blood_oxygenation()
|
|
switch (crewmemberData["toxyg"])
|
|
if(105 to INFINITY)
|
|
crewmemberData["oxyg"] = OXYGENATION_STATE_HIGH
|
|
if(BLOOD_VOLUME_SAFE to 105)
|
|
crewmemberData["oxyg"] = OXYGENATION_STATE_NORMAL
|
|
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
|
|
crewmemberData["oxyg"] = OXYGENATION_STATE_LOW
|
|
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
|
|
crewmemberData["oxyg"] = OXYGENATION_STATE_VERY_LOW
|
|
if(-(INFINITY) to BLOOD_VOLUME_BAD)
|
|
crewmemberData["oxyg"] = OXYGENATION_STATE_NONE
|
|
|
|
crewmemberData["bodytemp"] = H.bodytemperature - T0C + (rand(-5, 5) / 10)
|
|
|
|
if(C.sensor_mode >= SUIT_SENSOR_TRACKING)
|
|
var/area/A = get_area(H)
|
|
area_display_name = get_area_display_name(A)
|
|
crewmemberData["area"] = area_display_name
|
|
crewmemberData["x"] = pos.x
|
|
crewmemberData["y"] = pos.y
|
|
crewmemberData["z"] = pos.z
|
|
|
|
crewmembers += list(crewmemberData)
|
|
|
|
crewmembers = sortByKey(crewmembers, "name")
|
|
cache_entry.timestamp = world.time + 5 SECONDS
|
|
cache_entry.data = crewmembers
|
|
|
|
return crewmembers
|
|
|
|
/datum/repository/crew/proc/scan()
|
|
var/list/tracked = list()
|
|
for(var/mob/living/carbon/human/H in GLOB.mob_list)
|
|
if(istype(H.w_uniform, /obj/item/clothing/under))
|
|
var/obj/item/clothing/under/C = H.w_uniform
|
|
if (C.has_sensor)
|
|
tracked |= C
|
|
return tracked
|
|
|
|
#undef ZERO_WIDTH_SPACE
|
|
#undef OXYGENATION_STATE_HIGH
|
|
#undef OXYGENATION_STATE_NORMAL
|
|
#undef OXYGENATION_STATE_LOW
|
|
#undef OXYGENATION_STATE_VERY_LOW
|
|
#undef OXYGENATION_STATE_NONE
|
|
#undef OXYGENATION_STATE_UNDEFINED
|