From be4861ab10422856f43bb591e175fbe94ef08ef6 Mon Sep 17 00:00:00 2001 From: BongaTheProto <93835010+BongaTheProto@users.noreply.github.com> Date: Mon, 6 May 2024 20:32:04 -0500 Subject: [PATCH] no one is gone forever For :dawgdoin: For :Mos: For SPLURT --- code/__SPLURTCODE/DEFINES/dcs/signals.dm | 3 + code/game/machinery/_machinery.dm | 11 +- .../research/techweb/nodes/medical_nodes.dm | 2 +- .../machinery/self_actualization_device.dm | 215 ++++++++++++++++++ .../machinery/self_actualization_device.dmi | Bin 0 -> 11365 bytes tgstation.dme | 1 + 6 files changed, 230 insertions(+), 2 deletions(-) create mode 100644 modular_splurt/code/game/machinery/self_actualization_device.dm create mode 100644 modular_splurt/icons/obj/machinery/self_actualization_device.dmi diff --git a/code/__SPLURTCODE/DEFINES/dcs/signals.dm b/code/__SPLURTCODE/DEFINES/dcs/signals.dm index 30320d2b1a77..93ae14594d2f 100644 --- a/code/__SPLURTCODE/DEFINES/dcs/signals.dm +++ b/code/__SPLURTCODE/DEFINES/dcs/signals.dm @@ -14,3 +14,6 @@ ///called on [/obj/item] AFTER unequip from base of [mob/proc/doUnEquip]: (force, atom/newloc, no_move, invdrop, silent) #define COMSIG_ITEM_POST_UNEQUIP "item_post_unequip" + +///from /obj/machinery/set_occupant(atom/movable/O): (new_occupant) +#define COMSIG_MACHINERY_SET_OCCUPANT "machinery_set_occupant" diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index e88a0a1a03b1..4de6fc618925 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -142,6 +142,9 @@ Class Procs: ///Boolean on whether this machines interact with atmos var/atmos_processing = FALSE + var/allow_oversized_characters = FALSE //SPLURT EDIT - To allow large characters to fit inside machinery + + /obj/machinery/Initialize(mapload) if(!armor) armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70) @@ -244,7 +247,7 @@ Class Procs: continue if(isliving(AM)) var/mob/living/L = am - if(L.buckled || L.mob_size >= MOB_SIZE_LARGE) + if(L.buckled || (!allow_oversized_characters && L.mob_size >= MOB_SIZE_LARGE)) // SPLURT EDIT - added allow_oversized_characters continue target = am @@ -256,6 +259,12 @@ Class Procs: updateUsrDialog() update_icon() +/obj/machinery/proc/set_occupant(atom/movable/new_occupant) + SHOULD_CALL_PARENT(TRUE) + + SEND_SIGNAL(src, COMSIG_MACHINERY_SET_OCCUPANT, new_occupant) + occupant = new_occupant + /obj/machinery/proc/auto_use_power() if(!powered(power_channel)) return FALSE diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm index 7b6047724fe5..0fe54a669bc9 100644 --- a/code/modules/research/techweb/nodes/medical_nodes.dm +++ b/code/modules/research/techweb/nodes/medical_nodes.dm @@ -5,7 +5,7 @@ display_name = "Genetic Engineering" description = "We have the technology to make him." prereq_ids = list("biotech") - design_ids = list("clonecontrol", "clonepod", "clonescanner", "scan_console", "cloning_disk") + design_ids = list("clonecontrol", "clonepod", "clonescanner", "scan_console", "self_actualization_device", "cloning_disk") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) /datum/techweb_node/cryotech diff --git a/modular_splurt/code/game/machinery/self_actualization_device.dm b/modular_splurt/code/game/machinery/self_actualization_device.dm new file mode 100644 index 000000000000..c83a6c037140 --- /dev/null +++ b/modular_splurt/code/game/machinery/self_actualization_device.dm @@ -0,0 +1,215 @@ +/datum/design/board/self_actualization_device + name = "Machine Design (Self-Actualization Device)" + desc = "The circuit board for a Self-Actualization Device by Cinco: A Family Company." + id = "self_actualization_device" + build_path = /obj/item/circuitboard/machine/self_actualization_device + category = list("Medical Machinery") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/obj/item/circuitboard/machine/self_actualization_device + name = "Self-Actualization Device (Machine Board)" + build_path = /obj/machinery/self_actualization_device + req_components = list(/obj/item/stock_parts/micro_laser = 5) + +/obj/machinery/self_actualization_device + name = "Self-Actualization Device" + desc = "With the power of modern neurological scanning and synthflesh cosmetic surgery, the Veymed Corporation \ + has teamed up with Nanotrasen Human Resources (and elsewise) to bring you the Self-Actualization Device! \ + Ever revived a patient and had them file a malpractice lawsuit because their head got attached to the wrong body? \ + Just slap 'em in the SAD and turn it on! Their frown will turn upside down as they're reconstituted as their ideal self \ + via the magic technology of brain scanning! Within a few short moments, they'll be popped out as their ideal self, \ + ready to continue on with their day lawsuit-free!" + icon = 'modular_splurt/icons/obj/machinery/self_actualization_device.dmi' + icon_state = "sad_open" + circuit = /obj/item/circuitboard/machine/self_actualization_device + state_open = FALSE + density = TRUE + /// Is someone being processed inside of the machine? + var/processing = FALSE + /// How long does it take to break out of the machine? + var/breakout_time = 10 SECONDS + /// How long does the machine take to work? + var/processing_time = 1 MINUTES + /// The interval that advertisements are said by the machine's speaker. + var/next_fact = 10 + /// A list containing advertisements that the machine says while working. + var/static/list/advertisements = list(\ + "Thank you for using the Self-Actualization Device, brought to you by Veymed, because you asked for it.", \ + "The Self-Actualization device is not to be used by the elderly without direct adult supervision. Cinco is not liable for any and all injuries sustained under unsupervised usage of the Self-Actualization Device.", \ + "Please make sure to clean the Self-Actualization Device every fifteen minutes! The Self-Actualization Device is not to be used un-cleaned.", \ + "Before using the Self-Actualization Device, remove any and all metal devices, or you might make the term 'ironman' a bit too literal!" , \ + "Have more questions about the Self-Actualization Device? Call your nearest Veymed Representative to requisition more information about the Self-Actualization Device!" \ + ) + allow_oversized_characters = TRUE + +/obj/machinery/self_actualization_device/update_appearance(updates) + . = ..() + +/obj/machinery/self_actualization_device/Initialize(mapload) + . = ..() + update_appearance() + +/obj/machinery/self_actualization_device/close_machine(mob/user) + ..() + playsound(src, 'sound/machines/click.ogg', 50) + icon_state = "sad_closed" + if(!occupant) + return FALSE + if(!ishuman(occupant) || !check_for_normalizer(occupant)) // BLUEMOON EDIT - normalizer check added + occupant.forceMove(drop_location()) + set_occupant(null) + return FALSE + to_chat(occupant, span_notice("You enter [src].")) + update_appearance() + + +/obj/machinery/self_actualization_device/examine(mob/user) + . = ..() + . += span_notice("ALT-Click to turn ON when closed.") + +/obj/machinery/self_actualization_device/open_machine(mob/user) + playsound(src, 'sound/machines/click.ogg', 50) + icon_state = "sad_open" + ..() + +/obj/machinery/self_actualization_device/AltClick(mob/user) + . = ..() + if(!powered() || !occupant || state_open) + return FALSE + to_chat(user, "You power on [src].") + addtimer(CALLBACK(src, PROC_REF(eject_new_you)), processing_time, TIMER_OVERRIDE|TIMER_UNIQUE) + if(occupant) + if(!processing) + icon_state = "sad_on" + else + icon_state = "sad_off" + processing = TRUE + update_appearance() + +/obj/machinery/self_actualization_device/interact(mob/user) + if(state_open) + close_machine() + return + + if(!processing) + open_machine() + return + +// SPLURT ADD - if a character is wearing a normalizer, he cannot get inside/complete the procedure (otherwise it leads to errors with setting the size) +/obj/machinery/self_actualization_device/proc/check_for_normalizer(mob/target) + if(target.GetComponent(/datum/component/size_normalized)) + visible_message(span_warning("[src] beeps, as it denies user with normalization devices!")) + return FALSE // prohibition + return TRUE // permission +// SPLURT ADD END + +/obj/machinery/self_actualization_device/process(delta_time) + if(!processing) + return + if(!powered() || !occupant || !iscarbon(occupant)) + open_machine() + return + + next_fact-- + if(next_fact <= 0) + next_fact = rand(initial(next_fact), 2 * initial(next_fact)) + say(pick(advertisements)) + playsound(loc, 'sound/machines/chime.ogg', 30, FALSE) + + use_power(500) + +/// Ejects the occupant as either their preference character, or as a monke based on emag status. +/obj/machinery/self_actualization_device/proc/eject_new_you() + if(state_open || !occupant || !powered()) + return + processing = FALSE + + if(!ishuman(occupant) || !check_for_normalizer(occupant)) // BLUEMOON EDIT - added || !check_for_normalizer(occupant) + return FALSE + + var/mob/living/carbon/human/patient = occupant + var/original_name = patient.dna.real_name + + //Organ damage saving code. + var/heart_damage = check_organ(patient, /obj/item/organ/heart) + var/liver_damage = check_organ(patient, /obj/item/organ/liver) + var/lung_damage = check_organ(patient, /obj/item/organ/lungs) + var/stomach_damage = check_organ(patient, /obj/item/organ/stomach) + var/brain_damage = check_organ(patient, /obj/item/organ/brain) + var/eye_damage = check_organ(patient, /obj/item/organ/eyes) + var/ear_damage = check_organ(patient, /obj/item/organ/ears) + + var/list/trauma_list = list() + if(patient.get_traumas()) + for(var/datum/brain_trauma/trauma as anything in patient.get_traumas()) + trauma_list += trauma + + var/brute_damage = patient.getBruteLoss() + var/burn_damage = patient.getFireLoss() + + patient.client?.prefs?.copy_to(patient) + patient.dna.update_dna_identity() + log_game("[key_name(patient)] used a Self-Actualization Device at [loc_name(src)].") + + if(patient.dna.real_name != original_name) + message_admins("[key_name_admin(patient)] has used the Self-Actualization Device, and changed the name of their character. \ + Original Name: [original_name], New Name: [patient.dna.real_name]. \ + This may be a false positive from changing from a humanized monkey into a character, so be careful.") + + // Apply organ damage + patient.setOrganLoss(ORGAN_SLOT_HEART, heart_damage) + patient.setOrganLoss(ORGAN_SLOT_LIVER, liver_damage) + patient.setOrganLoss(ORGAN_SLOT_LUNGS, lung_damage) + patient.setOrganLoss(ORGAN_SLOT_STOMACH, stomach_damage) + // Head organ damage. + patient.setOrganLoss(ORGAN_SLOT_EYES, eye_damage) + patient.setOrganLoss(ORGAN_SLOT_EARS, ear_damage) + patient.setOrganLoss(ORGAN_SLOT_BRAIN, brain_damage) + + //Re-Applies Trauma + var/obj/item/organ/brain/patient_brain = patient.getorgan(/obj/item/organ/brain) + + if(length(trauma_list)) + patient_brain.traumas = trauma_list + + //Re-Applies Damage + patient.getBruteLoss(brute_damage) + patient.getFireLoss(burn_damage) + + SSquirks.AssignQuirks(patient, patient.client, TRUE, TRUE, null, FALSE, patient) + + open_machine() + playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) + +/// Checks the damage on the inputed organ and stores it. +/obj/machinery/self_actualization_device/proc/check_organ(mob/living/carbon/human/patient, obj/item/organ/organ_to_check) + var/obj/item/organ/organ_to_track = patient.getorgan(organ_to_check) + + // If the organ is missing, the organ damage is automatically set to 100. + if(!organ_to_track) + return 100 //If the organ is missing, return max damage. + + return organ_to_track.damage + +/obj/machinery/self_actualization_device/screwdriver_act(mob/living/user, obj/item/used_item) + . = TRUE + if(..()) + return + + if(occupant) + to_chat(user, span_warning("[src] is currently occupied!")) + return + + if(default_deconstruction_screwdriver(user, icon_state, icon_state, used_item)) + update_appearance() + return + + return FALSE + +/obj/machinery/self_actualization_device/crowbar_act(mob/living/user, obj/item/used_item) + if(occupant) + to_chat(user, span_warning("[src] is currently occupied!")) + return + + if(default_deconstruction_crowbar(used_item)) + return TRUE diff --git a/modular_splurt/icons/obj/machinery/self_actualization_device.dmi b/modular_splurt/icons/obj/machinery/self_actualization_device.dmi new file mode 100644 index 0000000000000000000000000000000000000000..006e20bf29e428da4bd5cda8c3e450737914b256 GIT binary patch literal 11365 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 ArT_o{ literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 49781f0c4408..a4bd3a023acd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4517,6 +4517,7 @@ #include "modular_splurt\code\game\machinery\deployable.dm" #include "modular_splurt\code\game\machinery\limbgrower.dm" #include "modular_splurt\code\game\machinery\research_table.dm" +#include "modular_splurt\code\game\machinery\self_actualization_device.dm" #include "modular_splurt\code\game\machinery\computer\slavery.dm" #include "modular_splurt\code\game\machinery\computer\arcade\tetris.dm" #include "modular_splurt\code\game\machinery\doors\brigdoors.dm"