Files
e0aa218843 Shell May Cry: A comprehensive rework of synthetics. (#20721)
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>
2025-12-21 16:26:23 +00:00

120 lines
4.3 KiB
Plaintext

#define ZERO_WIDTH_SPACE "&#8203;" //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