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"