From f9f4c80055be48162f5ff603bb3ba118c7dfc63f Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 Mar 2023 07:06:22 +0100 Subject: [PATCH] [MIRROR] Refactors the Nuclear Authentication Disk's Lone Op Behavior Into a Component, + Examine Message [MDB IGNORE] (#19407) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactors the Nuclear Authentication Disk's Lone Op Behavior Into a Component, + Examine Message (#73453) ## About The Pull Request ### Refactor Turns all the behavior for the nuke disk raising lone op probability when unsecured into a new component, the "Keep Me Secure" component. As an example (and really, I made it to test that the component was actually working), there is a new admin plush called the "whiny plushie" that will change icon depending on whether it is secure or not. Useful! ### Examine I also added an examine message. Will explain below ## Why It's Good For The Game The examine message was really what this entire pr's purpose was really for. > [Capsandi](https://tgstation13.org/phpBB/memberlist.php?mode=viewprofile&u=7767) wrote: [↑](https://tgstation13.org/phpBB/viewtopic.php?p=665827#p665827)Wed Feb 15, 2023 2:42 pm Someone needs to pr some sort of indicator as to whether the disk is 'secure' or not so players who don't know about the niche lone op mechanic won't make the same intuitive assumption (though swat has been trolled for putting it in the safe before). I agree with this for the same reasons I did #73016 so I'll restate the point with it here: A piece of banning a captain recently was that they didn't secure the disk, but there is no indication in game that the disk has special condiitons that trigger lone op, just that it should be kept safe (which yeah, nuke ops want it). I'd rather remove the ambiguity of a captain knowing this mechanic or not for the sake of the game, a single examine for it is harmless I'm considering this administration, not a feature. If maints want me to take it out and have this be refactor only, that's fine with me ## Changelog :cl: refactor: Refactors how nuclear activation disk works. Shouldn't notice a whole lot but if you do, it might be because of this. admin: Disk now has an examine message for whether it's secure or not, to make it less ambiguous for players. /:cl: * Refactors the Nuclear Authentication Disk's Lone Op Behavior Into a Component, + Examine Message --------- Co-authored-by: tralezab <40974010+tralezab@users.noreply.github.com> --- code/datums/components/keep_me_secure.dm | 75 ++++++++++++++++++ code/game/objects/items/plushes.dm | 47 +++++++++++ .../equipment/nuclear_authentication_disk.dm | 71 ++++++----------- icons/obj/toys/plushes.dmi | Bin 13979 -> 14703 bytes tgstation.dme | 1 + 5 files changed, 148 insertions(+), 46 deletions(-) create mode 100644 code/datums/components/keep_me_secure.dm diff --git a/code/datums/components/keep_me_secure.dm b/code/datums/components/keep_me_secure.dm new file mode 100644 index 00000000000..b9e8a403a0d --- /dev/null +++ b/code/datums/components/keep_me_secure.dm @@ -0,0 +1,75 @@ +/** + * ### Keep Me Secure component! + * + * Component that attaches to items, invoking a function to react when left unmoved and unsecured for too long. + * Used for Nuclear Authentication Disks, and whiny plushy as an example (which changes sprites depending on whether it considers itself secure.) + */ +/datum/component/keep_me_secure + /// callback for the parent being secure + var/datum/callback/secured_callback + /// callback for the parent being unsecured + var/datum/callback/unsecured_callback + + /// The last secure location the parent was at. + var/turf/last_secured_location + /// The last world time the parent moved. + var/last_move + +/datum/component/keep_me_secure/Initialize(secured_callback, unsecured_callback) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.secured_callback = secured_callback + src.unsecured_callback = unsecured_callback + +/datum/component/keep_me_secure/RegisterWithParent() + last_move = world.time + START_PROCESSING(SSobj, src) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE_MORE, PROC_REF(on_examine_more)) + + +/datum/component/keep_me_secure/UnregisterFromParent() + STOP_PROCESSING(SSobj, src) + UnregisterSignal(parent, COMSIG_PARENT_EXAMINE) + +/// Returns whether the game is supposed to consider the parent "secure". +/datum/component/keep_me_secure/proc/is_secured() + var/obj/item/item_parent = parent + if (last_secured_location == get_turf(item_parent)) + return FALSE + + var/mob/holder = item_parent.pulledby || get(parent, /mob) + if (isnull(holder?.client)) + return FALSE + + return TRUE + +/datum/component/keep_me_secure/process(delta_time) + if(is_secured()) + last_secured_location = get_turf(parent) + last_move = world.time + if(secured_callback) + secured_callback.Invoke(last_move) + else + if(unsecured_callback) + unsecured_callback.Invoke(last_move) + +/// signal sent when parent is examined +/datum/component/keep_me_secure/proc/on_examine(mob/living/source, mob/examiner, list/examine_list) + SIGNAL_HANDLER + + examine_list += span_boldnotice("[parent] should be secured at all times.") + if(is_secured()) + examine_list += span_notice("Right now, it is.") + else + examine_list += span_warning("Right now, it isn't...") + examine_list += span_notice("Examine closer for more info.") + +/// signal sent when parent is examined more +/datum/component/keep_me_secure/proc/on_examine_more(mob/living/source, mob/examiner, list/examine_list) + SIGNAL_HANDLER + + examine_list += span_notice("For [parent] to be secure, it needs to be:") + examine_list += span_notice("1. Always on the move, and...") + examine_list += span_notice("2. Held or dragged by someone.") diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 8bf2bfd69dd..f7eea34cbc2 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -586,6 +586,53 @@ . = ..() AddComponent(/datum/component/edit_complainer) +/obj/item/toy/plush/whiny_plushie + name = "whiny plushie" + desc = "An ancient plushie that demands constant companionship, after being forgotten for too long." + icon_state = "plushie_whiny" + inhand_icon_state = null + /// static list of cry messages it picks from to speak when it is insecure from no movement + var/static/list/cry_still_messages + /// static list of cry messages it picks from to speak when it is insecure from no holder + var/static/list/cry_alone_messages + /// cooldown for it sending messages, it will every 10 seconds + COOLDOWN_DECLARE(cry_cooldown) + +/obj/item/toy/plush/whiny_plushie/Initialize(mapload) + . = ..() + if(!cry_still_messages) + cry_still_messages = list( + "WHY DID WE STOP MOVING?! ARE YOU GOING TO LEAVE ME?!!", + "WE COULD GET ATTACKED WE'RE SITTING DUCKS MOVE MOOOOOOOVE!!", + "YOU'RE PLANNING ON DROPPING ME AREN'T YOU I KNOW YOU AAAAAAAREE!!", + "THE SYNDICATE ARE TRIANGULATING OUR LOCAAAAAAAATIONNN!!", + "THIS PLACE IS SCARY I WANNA LEEEEEAAAAAVVVEEEEEE!!", + "CHELP, CHELP CCCCHHHHEEEEEEEEEEEEEEELLLLLLLPPPPPP!!", + ) + cry_alone_messages = list( + "NOOOOOOOOOOOOOOOOOO DON'T LEAVE MEEEEE!!", + "WUH WHERE DID EVERYONE GOOOOOOHHHHHHH WAHHH!!", + "SOMEONE, ANYONEEEEEEEEE PICK ME UPP!!", + "I DIDN'T DESERVE ITTTTTTTTTT!!", + "I WILL DIE TO JUST ONE ATTTTTTAAAAACKKKKKK!!", + "I WILLLLLL NOT DROP GOOOD IITITTEEEEEMMMS!!", + ) + AddComponent(/datum/component/keep_me_secure, CALLBACK(src, PROC_REF(secured_process)) , CALLBACK(src, PROC_REF(unsecured_process))) + +/obj/item/toy/plush/whiny_plushie/proc/secured_process(last_move) + icon_state = initial(icon_state) + +/obj/item/toy/plush/whiny_plushie/proc/unsecured_process(last_move) + if(!COOLDOWN_FINISHED(src, cry_cooldown)) + return + COOLDOWN_START(src, cry_cooldown, 10 SECONDS) + icon_state = "plushie_whiny_crying" + if(isturf(loc)) + say(pick(cry_alone_messages)) + else + say(pick(cry_still_messages)) + playsound(src, 'sound/items/intents/Help.ogg', 50, FALSE) + /obj/item/toy/plush/beeplushie name = "bee plushie" desc = "A cute toy that resembles an even cuter bee." diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm index 633a8b7384d..a903fc02d45 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm @@ -18,10 +18,6 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF /// Whether we're a real nuke disk or not. var/fake = FALSE - /// The last secure location the disk was at. - var/turf/last_secured_location - /// The last world time the disk moved. - var/last_disk_move /datum/armor/disk_nuclear bomb = 30 @@ -34,54 +30,37 @@ AddComponent(/datum/component/stationloving, !fake) if(!fake) + AddComponent(/datum/component/keep_me_secure, CALLBACK(src, PROC_REF(secured_process)), CALLBACK(src, PROC_REF(unsecured_process))) SSpoints_of_interest.make_point_of_interest(src) - last_disk_move = world.time - START_PROCESSING(SSobj, src) - -/obj/item/disk/nuclear/process() - if(fake) - STOP_PROCESSING(SSobj, src) - CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck") +/obj/item/disk/nuclear/proc/secured_process(last_move) var/turf/new_turf = get_turf(src) + var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control + if(istype(loneop) && loneop.occurrences < loneop.max_occurrences && prob(loneop.weight)) + loneop.weight = max(loneop.weight - 1, 0) + if(loneop.weight % 5 == 0 && SSticker.totalPlayers > 1) + message_admins("[src] is secured (currently in [ADMIN_VERBOSEJMP(new_turf)]). The weight of Lone Operative is now [loneop.weight].") + log_game("[src] being secured has reduced the weight of the Lone Operative event to [loneop.weight].") - if (is_secured()) - last_secured_location = new_turf - last_disk_move = world.time +/obj/item/disk/nuclear/proc/unsecured_process(last_move) + var/turf/new_turf = get_turf(src) + /// How comfy is our disk? + var/disk_comfort_level = 0 + + //Go through and check for items that make disk comfy + for(var/obj/comfort_item in loc) + if(istype(comfort_item, /obj/item/bedsheet) || istype(comfort_item, /obj/structure/bed)) + disk_comfort_level++ + + if(last_move < world.time - 500 SECONDS && prob((world.time - 500 SECONDS - last_move)*0.0001)) var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control - if(istype(loneop) && loneop.occurrences < loneop.max_occurrences && prob(loneop.weight)) - loneop.weight = max(loneop.weight - 1, 0) + if(istype(loneop) && loneop.occurrences < loneop.max_occurrences) + loneop.weight += 1 if(loneop.weight % 5 == 0 && SSticker.totalPlayers > 1) - message_admins("[src] is secured (currently in [ADMIN_VERBOSEJMP(new_turf)]). The weight of Lone Operative is now [loneop.weight].") - log_game("[src] being secured has reduced the weight of the Lone Operative event to [loneop.weight].") - else - /// How comfy is our disk? - var/disk_comfort_level = 0 - - //Go through and check for items that make disk comfy - for(var/obj/comfort_item in loc) - if(istype(comfort_item, /obj/item/bedsheet) || istype(comfort_item, /obj/structure/bed)) - disk_comfort_level++ - - if(last_disk_move < world.time - 5000 && prob((world.time - 5000 - last_disk_move)*0.0001)) - var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control - if(istype(loneop) && loneop.occurrences < loneop.max_occurrences) - loneop.weight += 1 - if(loneop.weight % 5 == 0 && SSticker.totalPlayers > 1) - if(disk_comfort_level >= 2) - visible_message(span_notice("[src] sleeps soundly. Sleep tight, disky.")) - message_admins("[src] is unsecured in [ADMIN_VERBOSEJMP(new_turf)]. The weight of Lone Operative is now [loneop.weight].") - log_game("[src] was left unsecured in [loc_name(new_turf)]. Weight of the Lone Operative event increased to [loneop.weight].") - -/obj/item/disk/nuclear/proc/is_secured() - if (last_secured_location == get_turf(src)) - return FALSE - - var/mob/holder = pulledby || get(src, /mob) - if (isnull(holder?.client)) - return FALSE - - return TRUE + if(disk_comfort_level >= 2) + visible_message(span_notice("[src] sleeps soundly. Sleep tight, disky.")) + message_admins("[src] is unsecured in [ADMIN_VERBOSEJMP(new_turf)]. The weight of Lone Operative is now [loneop.weight].") + log_game("[src] was left unsecured in [loc_name(new_turf)]. Weight of the Lone Operative event increased to [loneop.weight].") /obj/item/disk/nuclear/examine(mob/user) . = ..() diff --git a/icons/obj/toys/plushes.dmi b/icons/obj/toys/plushes.dmi index f6d957db64079731626ee75d9b601978c8ce2e01..1452b85aa47a1763e06e41538c1e1587ef2f1fb9 100644 GIT binary patch literal 14703 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 literal 13979 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 R@K0xe!h2PjDk-y&{{w7_7N!6I diff --git a/tgstation.dme b/tgstation.dme index 6cb87793c29..5113a2490a8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -973,6 +973,7 @@ #include "code\datums\components\itempicky.dm" #include "code\datums\components\jetpack.dm" #include "code\datums\components\jousting.dm" +#include "code\datums\components\keep_me_secure.dm" #include "code\datums\components\knockoff.dm" #include "code\datums\components\label.dm" #include "code\datums\components\light_eater.dm"