From 074da2b796ced4564f07dbf9493f5e491a02c267 Mon Sep 17 00:00:00 2001
From: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com>
Date: Fri, 18 Oct 2024 19:30:04 -0400
Subject: [PATCH] Datumizes microbatteries (#26900)
* Datumize microbattery
* comments + feedback when you're revivable
* More comment
* more datumization
* Explaining myself
* Being able to charge while not having a microbattery
* Better comment
Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com>
* Changes proc name to be more accurate
---------
Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com>
Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
---
code/__DEFINES/mob_defines.dm | 1 +
code/game/gamemodes/miniantags/abduction/gland.dm | 2 +-
.../miniantags/demons/slaughter_demon/slaughter.dm | 2 +-
code/game/machinery/rechargestation.dm | 4 ++--
code/modules/mob/living/carbon/carbon_update_status.dm | 2 +-
.../mob/living/carbon/human/human_update_status.dm | 8 ++++++--
code/modules/surgery/organs/augments_arms.dm | 10 +++-------
code/modules/surgery/organs/heart.dm | 2 ++
.../surgery/organs/organ_datums/battery_datum.dm | 5 +++++
code/modules/surgery/organs/organ_helpers.dm | 9 +++++++--
code/modules/surgery/organs/subtypes/machine_organs.dm | 1 +
paradise.dme | 1 +
12 files changed, 31 insertions(+), 16 deletions(-)
create mode 100644 code/modules/surgery/organs/organ_datums/battery_datum.dm
diff --git a/code/__DEFINES/mob_defines.dm b/code/__DEFINES/mob_defines.dm
index 58af2e1bb56..eba27654e8f 100644
--- a/code/__DEFINES/mob_defines.dm
+++ b/code/__DEFINES/mob_defines.dm
@@ -14,6 +14,7 @@
// Organ datum defines. Each one of these represents a slot for organ datums in internal_organ_datums
#define ORGAN_DATUM_HEART "heart"
#define ORGAN_DATUM_LUNGS "lungs"
+#define ORGAN_DATUM_BATTERY "battery"
// For limb resistance flags
#define CANNOT_BREAK (1 << 0)
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index f350a620591..83406308b33 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -6,7 +6,7 @@
dead_icon = null
status = ORGAN_ROBOT
origin_tech = "materials=4;biotech=7;abductor=3"
- organ_datums = list(/datum/organ/heart/always_beating) // alien glands are immune to stopping
+ organ_datums = list(/datum/organ/heart/always_beating, /datum/organ/battery) // alien glands are immune to stopping, and provide power to IPCs
tough = TRUE //not easily broken by combat damage
var/cooldown_low = 300
diff --git a/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm b/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm
index 565a02aadfe..f045de09513 100644
--- a/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm
+++ b/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm
@@ -212,7 +212,7 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "demon_heart"
origin_tech = "combat=5;biotech=7"
- organ_datums = list(/datum/organ/heart/always_beating)
+ organ_datums = list(/datum/organ/heart/always_beating, /datum/organ/battery)
/obj/item/organ/internal/heart/demon/update_icon_state()
return //always beating visually
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index e1690fa8d3c..d07d7a946c6 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -147,7 +147,7 @@
R.cell.charge = min(R.cell.charge + recharge_speed, R.cell.maxcharge)
else if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
- if(H.get_int_organ(/obj/item/organ/internal/cell))
+ if(ismachineperson(H))
if(H.nutrition < NUTRITION_LEVEL_FULL - 1)
H.set_nutrition(min(H.nutrition + recharge_speed_nutrition, NUTRITION_LEVEL_FULL - 1))
if(repairs)
@@ -206,7 +206,7 @@
if(occupant)
to_chat(H, "The cell is already occupied!")
return
- if(ismodcontrol(H.back) || H.get_int_organ(/obj/item/organ/internal/cell))
+ if(ismodcontrol(H.back) || ismachineperson(H))
can_accept_user = TRUE
if(!can_accept_user)
diff --git a/code/modules/mob/living/carbon/carbon_update_status.dm b/code/modules/mob/living/carbon/carbon_update_status.dm
index 58b0c6a3a77..d06555cc631 100644
--- a/code/modules/mob/living/carbon/carbon_update_status.dm
+++ b/code/modules/mob/living/carbon/carbon_update_status.dm
@@ -6,7 +6,7 @@
death()
create_debug_log("died of damage, trigger reason: [reason]")
return
- if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT) || (check_death_method() && getOxyLoss() > 50) || HAS_TRAIT(src, TRAIT_FAKEDEATH) || health < HEALTH_THRESHOLD_KNOCKOUT && check_death_method() || health <= HEALTH_THRESHOLD_DEAD)
+ if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT) || (check_death_method() && getOxyLoss() > 50) || HAS_TRAIT(src, TRAIT_FAKEDEATH) || health < HEALTH_THRESHOLD_KNOCKOUT && check_death_method() || health <= HEALTH_THRESHOLD_DEAD) // In case anyone is wondering where oldcrit is handled, it's here.
if(stat == CONSCIOUS)
KnockOut()
create_debug_log("fell unconscious, trigger reason: [reason]")
diff --git a/code/modules/mob/living/carbon/human/human_update_status.dm b/code/modules/mob/living/carbon/human/human_update_status.dm
index ee7fe70d3ee..fa6516724fa 100644
--- a/code/modules/mob/living/carbon/human/human_update_status.dm
+++ b/code/modules/mob/living/carbon/human/human_update_status.dm
@@ -3,10 +3,14 @@
return
..(reason)
if(stat == DEAD)
- if(dna.species && dna.species.can_revive_by_healing)
+ if(dna.species && dna.species.can_revive_by_healing) // Here's where IPC revival is handled
var/obj/item/organ/internal/brain/B = get_int_organ(/obj/item/organ/internal/brain)
if(B)
- if((health >= (HEALTH_THRESHOLD_DEAD + HEALTH_THRESHOLD_CRIT) * 0.5) && check_vital_organs() && !suiciding)
+ if((health >= (HEALTH_THRESHOLD_DEAD + HEALTH_THRESHOLD_CRIT) * 0.5) && ipc_vital_organ_check() && !suiciding)
+ var/mob/dead/observer/ghost = get_ghost()
+ if(ghost)
+ to_chat(ghost, "Your chassis has been repaired and repowered, re-enter if you want to continue playing! (Verbs -> Ghost -> Re-enter corpse)")
+ SEND_SOUND(ghost, sound('sound/effects/genetics.ogg'))
update_revive()
create_debug_log("revived from healing, trigger reason: [reason]")
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index e11efc6829a..b08a0021cd0 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -425,12 +425,8 @@
user.changeNext_move(CLICK_CD_MELEE)
var/obj/machinery/power/apc/A = target
var/mob/living/carbon/human/H = user
- if(H.get_int_organ(/obj/item/organ/internal/cell) || H.get_int_organ(/obj/item/organ/internal/heart))
- var/obj/item/organ/internal/heart/robotic = H.get_int_organ(/obj/item/organ/internal/heart)
- if(robotic)
- if(!(robotic.status & ORGAN_ROBOT) && !H.get_int_organ(/obj/item/organ/internal/heart/demon/pulse))
- to_chat(user, "You lack a cell in which to store charge!")
- return
+ var/datum/organ/battery/power_source = H.get_int_organ_datum(ORGAN_DATUM_BATTERY)
+ if(istype(power_source))
if(A.emagged || A.stat & BROKEN)
do_sparks(3, 1, A)
to_chat(H, "The APC power currents surge erratically, damaging your chassis!")
@@ -443,7 +439,7 @@
else
to_chat(user, "There is no charge to draw from that APC.")
else
- to_chat(user, "You lack a cell in which to store charge!")
+ to_chat(user, "You lack a power source in which to store charge!")
/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H)
H.visible_message("[H] inserts a power connector into \the [A].", "You begin to draw power from \the [A].")
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 9dac53823a4..0b3e52c5578 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -36,6 +36,7 @@
base_icon_state = "cursedheart"
origin_tech = "biotech=6"
actions_types = list(/datum/action/item_action/organ_action/cursed_heart)
+ organ_datums = list(/datum/organ/heart, /datum/organ/battery) // This doesn't actually work for IPCs but it also doesn't kill you, and it's funny
var/last_pump = 0
var/pump_delay = 30 //you can pump 1 second early, for lag, but no more (otherwise you could spam heal)
var/blood_loss = 100 //600 blood is human default, so 5 failures (below 122 blood is where humans die because reasons?)
@@ -191,6 +192,7 @@
base_icon_state = "heart-c"
dead_icon = "heart-c-off"
status = ORGAN_ROBOT
+ organ_datums = list(/datum/organ/heart, /datum/organ/battery)
/obj/item/organ/internal/heart/cybernetic/upgraded
name = "upgraded cybernetic heart"
diff --git a/code/modules/surgery/organs/organ_datums/battery_datum.dm b/code/modules/surgery/organs/organ_datums/battery_datum.dm
new file mode 100644
index 00000000000..28b3b35d4ac
--- /dev/null
+++ b/code/modules/surgery/organs/organ_datums/battery_datum.dm
@@ -0,0 +1,5 @@
+/*
+ For any species that doesn't have a heart datum but does have heart-like organs, so just IPCs right now. Microbatteries currently have no behavior.
+*/
+/datum/organ/battery
+ organ_tag = ORGAN_DATUM_BATTERY
diff --git a/code/modules/surgery/organs/organ_helpers.dm b/code/modules/surgery/organs/organ_helpers.dm
index 6ec762dee73..e27293dedc4 100644
--- a/code/modules/surgery/organs/organ_helpers.dm
+++ b/code/modules/surgery/organs/organ_helpers.dm
@@ -85,8 +85,13 @@
.++
if(affecting.body_part == LEG_LEFT)
.++
-///Returns true if all the mob's vital organs are functional, otherwise returns false
-/mob/living/carbon/human/proc/check_vital_organs()
+/* Returns true if all the mob's vital organs are functional, otherwise returns false.
+* This proc is only used for checking if IPCs can revive from death, so calling it on a non IPC will always return false (right now)
+*/
+/mob/living/carbon/human/proc/ipc_vital_organ_check()
+ var/has_battery = get_int_organ_datum(ORGAN_DATUM_BATTERY)
+ if(!has_battery)
+ return FALSE
for(var/obj/item/organ/internal/organ in internal_organs)
if(organ.vital && (organ.damage >= organ.max_damage))
return FALSE
diff --git a/code/modules/surgery/organs/subtypes/machine_organs.dm b/code/modules/surgery/organs/subtypes/machine_organs.dm
index a874035f914..c5b60e33263 100644
--- a/code/modules/surgery/organs/subtypes/machine_organs.dm
+++ b/code/modules/surgery/organs/subtypes/machine_organs.dm
@@ -112,6 +112,7 @@
vital = TRUE
status = ORGAN_ROBOT
requires_robotic_bodypart = TRUE
+ organ_datums = list(/datum/organ/battery)
/obj/item/organ/internal/eyes/optical_sensor
name = "optical sensor"
diff --git a/paradise.dme b/paradise.dme
index bbcd4fda1ea..19d95b16219 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -2880,6 +2880,7 @@
#include "code\modules\surgery\organs\robolimbs.dm"
#include "code\modules\surgery\organs\skeleton_organs.dm"
#include "code\modules\surgery\organs\vocal_cords.dm"
+#include "code\modules\surgery\organs\organ_datums\battery_datum.dm"
#include "code\modules\surgery\organs\organ_datums\heart_datum.dm"
#include "code\modules\surgery\organs\organ_datums\lung_datum.dm"
#include "code\modules\surgery\organs\organ_datums\organ_datum.dm"