From 3c485aa6141ac57d68e28e0480b4679933fa6b53 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Fri, 12 Jun 2026 05:44:04 +0200 Subject: [PATCH] Santa Claus can now hear prayers that mention him or christmas. (#96406) ## About The Pull Request Santa Claus can hear prayers that contain the words "santa", "claus", "christmas" or "xmas". Prayers containing the word "satan" have a 40% probability to being "erroneously" relayed to Santa instead. Talk about a terrible typo. I'm toooootally sure nobody will do it on purpose (totally forced joke ik ik). Santa cannot know who the person praying is if not told inside the prayer itself, however he can tell if the person is naughty (either antag or has the evil trait) or not, so be mindful of that. If tired or harassed by unwanted prayers, Santa can also click an action button at any time to silence them. The prayers will still be sent to admins, they just won't be heard by Mr. Claus. This PR comes with a new component and a mild refactor of prayers. For admins, the message from the pray verb is now wrapped in boxed message spans. This will make prayers a bit easier to notice, since the lack of message box coupled with lack of sound (for now, unless it's the chaplain praying) makes them easy to miss. Also tinfoil hats prevent you from hearing prayers, Santa (redundant with the action button, this is just a little touch). ## Why It's Good For The Game Early Christmas PR ! Yeah, I know, headsets exist and Santa Claus is very capable of wearing one, but he's the same guy who rides a flying sleight, climb down chimneys (notwithstanding his corpulent body). The prayer thing makes a bit sense if you think of the more religious roots of the character, though our Santa Claus is a bit more secular ya know, and this is more of an excuse to give him something extra. Oh, yeah, if people will abuse the feature, I guess I could add an incapacitated check for the praying mob so that Santa won't hear prayers from people dying or restrained, or remove the tidbit that says if the person who sent the prayer is naughty or not. ## Changelog :cl: admin: Prayers from players are now boxed (like examine messages and some health readouts for example), making them easier to tell apart from the constant stream of text in your chat tabs. add: Santa Claus can now hear prayers that mention him or Christmas. He won't know who's praying unless told, though he can tell if they're naughty. /:cl: --- code/__DEFINES/dcs/signals/signals_global.dm | 8 ++ code/__DEFINES/religion.dm | 17 ++++ code/__DEFINES/traits/declarations.dm | 2 + code/_globalvars/religion.dm | 33 +++++++ code/_globalvars/traits/_traits.dm | 1 + code/datums/components/listen_prayers.dm | 89 +++++++++++++++++++ code/modules/admin/verbs/pray.dm | 40 +++++---- code/modules/antagonists/santa/santa.dm | 25 ++++++ code/modules/clothing/head/tinfoilhat.dm | 1 + icons/hud/actions.dmi | Bin 9680 -> 10521 bytes strings/sillytips.txt | 1 + tgstation.dme | 1 + 12 files changed, 199 insertions(+), 19 deletions(-) create mode 100644 code/datums/components/listen_prayers.dm diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 81c37f60afa..f706e6b9fe9 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -88,6 +88,14 @@ /// global signal when a global nullrod type is picked #define COMSIG_GLOB_NULLROD_PICKED "!nullrod_picked" +/// global signal when someone prays via prayer verb. +#define COMSIG_GLOB_SEND_PRAYER "!send_prayer" + #define ARG_PRAYING_MOB 1 + #define ARG_PRAYER_MSG 2 + #define ARG_PRAYER_TYPE 3 + #define ARG_PRAYER_SYMBOL 4 + #define ARG_PRAYED_DEITIES 5 + /// Global signal when light debugging is canceled #define COMSIG_LIGHT_DEBUG_DISABLED "!light_debug_disabled" diff --git a/code/__DEFINES/religion.dm b/code/__DEFINES/religion.dm index d3fb3d36e41..694968e0356 100644 --- a/code/__DEFINES/religion.dm +++ b/code/__DEFINES/religion.dm @@ -68,3 +68,20 @@ #define RITE_ALLOW_MULTIPLE_PERFORMS (1<<1) ///The rite can only be fully performed once, so we'll completely remove it from the rite list afterwards. #define RITE_ONE_TIME_USE (1<<2) + +///Default prayer type for the pray verb +#define DEFAULT_PRAYER "PRAYER" +///Cult prayer type +#define CULT_PRAYER "CULTIST PRAYER" +//Heretic prayer type +#define HERETIC_PRAYER "HERETICAL PRAYER" +///Chaplain prayer type +#define CHAPLAIN_PRAYER "CHAPLAIN PRAYER" +///Spiritual prayer type +#define SPIRITUAL_PRAYER "SPIRITUAL PRAYER" +///Evil prayer type +#define EVIL_PRAYER "EVIL PRAYER" +///Standard prayer type that santa sees +#define SANTA_PRAYER "PRAYER" +///what type of prayer santa sees when someone's bad +#define SANTA_NAUGHTY_PRAYER "PRAYER (NAUGHTY)" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 59b12502d1c..ffd89e2cfdb 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -381,6 +381,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SUCCUMB_OVERRIDE "succumb_override" /// Can hear observers #define TRAIT_SIXTHSENSE "sixth_sense" +/// For mobs / minds with the listening_prayers trait, this stops them from hearing prayers +#define TRAIT_DONT_HEAR_PRAYERS "dont_hear_prayers" #define TRAIT_FEARLESS "fearless" /// Ignores darkness for hearing #define TRAIT_HEAR_THROUGH_DARKNESS "hear_through_darkness" diff --git a/code/_globalvars/religion.dm b/code/_globalvars/religion.dm index 063ff0e8642..c2ea1a69d35 100644 --- a/code/_globalvars/religion.dm +++ b/code/_globalvars/religion.dm @@ -15,6 +15,39 @@ GLOBAL_LIST_EMPTY(chaplain_altars) GLOBAL_VAR(holy_weapon_type) GLOBAL_VAR(holy_armor_type) +GLOBAL_LIST_INIT(prayer_type_to_font_color, list( + DEFAULT_PRAYER = "purple", + CULT_PRAYER = "black", + HERETIC_PRAYER = "green", + CHAPLAIN_PRAYER = "yellow", + SPIRITUAL_PRAYER = "blue", + EVIL_PRAYER = "red", + SANTA_PRAYER = "purple", + SANTA_NAUGHTY_PRAYER = "red", +)) + +GLOBAL_LIST_INIT(prayer_type_to_icon_state, list( + DEFAULT_PRAYER = "bible", + CULT_PRAYER = "tome", + HERETIC_PRAYER = "necronomicon", + CHAPLAIN_PRAYER = "kingyellow", + SPIRITUAL_PRAYER = "holylight", + EVIL_PRAYER = "burning", + SANTA_PRAYER = "bible", //here just in case, we use present boxes for the icon + SANTA_NAUGHTY_PRAYER = "burning", +)) + +GLOBAL_LIST_INIT(prayer_type_to_message_box, list( + DEFAULT_PRAYER = "", + CULT_PRAYER = "red_box", + HERETIC_PRAYER = "green_box", + CHAPLAIN_PRAYER = "blue_box", + SPIRITUAL_PRAYER = "", + EVIL_PRAYER = "red_box", + SANTA_PRAYER = "blue_box", + SANTA_NAUGHTY_PRAYER = "red_box", +)) + /// Sets a new religious sect used by all chaplains int he round /proc/set_new_religious_sect(path, reset_existing = FALSE) if(!ispath(path, /datum/religion_sect)) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 61a0255dfaa..1ddfcd9dc14 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -265,6 +265,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, "TRAIT_DISPLAY_JOB_IN_BINARY" = TRAIT_DISPLAY_JOB_IN_BINARY, "TRAIT_DISSECTED" = TRAIT_DISSECTED, + "TRAIT_DONT_HEAR_PRAYERS" = TRAIT_DONT_HEAR_PRAYERS, "TRAIT_DONT_WRITE_MEMORY" = TRAIT_DONT_WRITE_MEMORY, "TRAIT_DOUBLE_TAP" = TRAIT_DOUBLE_TAP, "TRAIT_DREAMING" = TRAIT_DREAMING, diff --git a/code/datums/components/listen_prayers.dm b/code/datums/components/listen_prayers.dm new file mode 100644 index 00000000000..d22724eb666 --- /dev/null +++ b/code/datums/components/listen_prayers.dm @@ -0,0 +1,89 @@ +/** + * A component that allows the attached mind to listen prayers from other mobs. + * Unlike admins, they cannot smite the person for it, also the prayers are anonymous unless the person says who he's in the message. + */ +/datum/component/listen_prayers + ///A callback called before the prayer is heard. May alter the message or prevent it from being heard if it returns FALSE + var/datum/callback/pre_prayer_callback + ///This will be affixed to the "deities" that have heard this message. + var/deity_name + ///The action that the owner can use to ignore the prayers + var/datum/action/innate/listen_prayers/toggle + ///The description we give to the instance of the listen_prayers toggle. + var/toggle_desc + +/datum/component/listen_prayers/Initialize(datum/callback/pre_prayer_callback, deity_name, toggle_desc) + if (!istype(parent, /datum/mind)) + return COMPONENT_INCOMPATIBLE + src.pre_prayer_callback = pre_prayer_callback + src.deity_name = deity_name + src.toggle_desc = toggle_desc + +/datum/component/listen_prayers/Destroy() + pre_prayer_callback = null + return ..() + +/datum/component/listen_prayers/RegisterWithParent() + RegisterSignal(SSdcs, COMSIG_GLOB_SEND_PRAYER, PROC_REF(on_sent_prayer)) + var/datum/mind/mind = parent + + var/datum/action/innate/listen_prayers/toggle = new(mind) + if(toggle_desc) + toggle.desc = toggle_desc + if(mind.current) + toggle.Grant(mind.current) + +/datum/component/listen_prayers/UnregisterFromParent() + UnregisterSignal(SSdcs, COMSIG_GLOB_SEND_PRAYER) + QDEL_NULL(toggle) + +/datum/component/listen_prayers/proc/on_sent_prayer(source, mob/praying, message, prayer_type, symbol, list/deities_that_listened) + SIGNAL_HANDLER + var/datum/mind/mind = parent + if(!mind.current || mind.current.stat >= UNCONSCIOUS || !mind.current.client) //You can't hear prayers if unconscious or disconnected + return + if(!isliving(praying) || praying.stat == DEAD) + return FALSE //I don't see any reason in hell to why dead people should be allowed into this. This isn't a knockoff TRAIT_SIXTHSENSE. + if(praying == mind.current) //Ignore prayers coming from ourselves. + return + if(mind.current.client in GLOB.admins) //This is redundant if we're adminning + return + if(HAS_MIND_TRAIT(mind.current, TRAIT_DONT_HEAR_PRAYERS)) + return + var/list/arguments = args.Copy(2) + if(pre_prayer_callback && !pre_prayer_callback.Invoke(args)) + return + prayer_type = arguments[ARG_PRAYER_TYPE] + symbol = arguments[ARG_PRAYER_SYMBOL] + message = "[icon2html(arguments[ARG_PRAYER_SYMBOL], mind.current.client)][prayer_type]: [span_notice(arguments[ARG_PRAYER_MSG])]" + to_chat(mind.current, custom_boxed_message(GLOB.prayer_type_to_message_box[prayer_type], message)) + SEND_SOUND(mind.current, sound('sound/effects/pray.ogg')) + if(deity_name) + deities_that_listened += deity_name + +///An action to stop hearing prayers on command. Doesn't do a whole lot without the associated component +/datum/action/innate/listen_prayers + name = "Listen Prayers" + button_icon = 'icons/hud/actions.dmi' + button_icon_state = "pray" + desc = "Allows you to eavesdrop on prayers from the world around you." + active = TRUE + +/datum/action/innate/listen_prayers/Destroy() + REMOVE_TRAIT(owner, TRAIT_DONT_HEAR_PRAYERS, ACTION_TRAIT) + return ..() + +/datum/action/innate/listen_prayers/is_action_active(atom/movable/screen/movable/action_button/current_button) + return !HAS_TRAIT_FROM(owner, TRAIT_DONT_HEAR_PRAYERS, ACTION_TRAIT) + +/datum/action/innate/listen_prayers/Activate() + active = TRUE + REMOVE_TRAIT(owner, TRAIT_DONT_HEAR_PRAYERS, ACTION_TRAIT) + to_chat(owner, span_green("You are ready to listen to prayers once again.")) + build_all_button_icons(UPDATE_BUTTON_BACKGROUND) + +/datum/action/innate/listen_prayers/Deactivate() + active = FALSE + ADD_TRAIT(owner, TRAIT_DONT_HEAR_PRAYERS, ACTION_TRAIT) + to_chat(owner, span_green("You stop listening to prayers.")) + build_all_button_icons(UPDATE_BUTTON_BACKGROUND) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index aefd988aa74..c0955dec70b 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -16,31 +16,33 @@ if(src.client.handle_spam_prevention(message, MUTE_PRAY)) return - var/mutable_appearance/cross = mutable_appearance('icons/obj/storage/book.dmi', "bible") - var/font_color = "purple" - var/prayer_type = "PRAYER" - var/deity + + var/prayer_type = DEFAULT_PRAYER + var/list/deities = list() if(src.job == JOB_CHAPLAIN) - cross.icon_state = "kingyellow" - font_color = "blue" - prayer_type = "CHAPLAIN PRAYER" + prayer_type = CHAPLAIN_PRAYER if(GLOB.deity) - deity = GLOB.deity + deities += GLOB.deity else if(IS_CULTIST(src)) - cross.icon_state = "tome" - font_color = "red" - prayer_type = "CULTIST PRAYER" - deity = "Nar'Sie" - else if(isliving(src)) - var/mob/living/L = src - if(HAS_TRAIT(L, TRAIT_SPIRITUAL)) - cross.icon_state = "holylight" - font_color = "blue" - prayer_type = "SPIRITUAL PRAYER" + prayer_type = CULT_PRAYER + deities += "Nar'Sie" + else if(IS_HERETIC_OR_MONSTER(src)) + prayer_type = HERETIC_PRAYER + deities += "the Mansus" + else if(HAS_TRAIT(src, TRAIT_SPIRITUAL)) + prayer_type = SPIRITUAL_PRAYER + else if(HAS_TRAIT(src, TRAIT_EVIL)) + prayer_type = EVIL_PRAYER + + var/mutable_appearance/cross = mutable_appearance('icons/obj/storage/book.dmi', GLOB.prayer_type_to_icon_state[prayer_type]) + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SEND_PRAYER, src, message, prayer_type, cross, deities) + var/msg_tmp = message GLOB.requests.pray(src.client, message, src.job == JOB_CHAPLAIN) - message = span_adminnotice("[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [span_linkify(message)]") + message = span_adminnotice("[icon2html(cross, GLOB.admins)][prayer_type][length(deities) ? " (to [english_list(deities)])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [span_linkify(message)]") + message = custom_boxed_message(GLOB.prayer_type_to_message_box[prayer_type], message) for(var/client/C in GLOB.admins) if(get_chat_toggles(C) & CHAT_PRAYER) to_chat(C, message, type = MESSAGE_TYPE_PRAYER, confidential = TRUE) diff --git a/code/modules/antagonists/santa/santa.dm b/code/modules/antagonists/santa/santa.dm index f3e1cbd02b9..8f6765604e0 100644 --- a/code/modules/antagonists/santa/santa.dm +++ b/code/modules/antagonists/santa/santa.dm @@ -4,6 +4,7 @@ show_name_in_check_antagonists = TRUE show_to_ghosts = TRUE suicide_cry = "FOR CHRISTMAS!!" + var/datum/component/listen_prayers/santa_prayers /datum/antagonist/santa/on_gain() . = ..() @@ -12,6 +13,30 @@ owner.add_traits(list(TRAIT_CANNOT_OPEN_PRESENTS, TRAIT_PRESENT_VISION), TRAIT_SANTA) + santa_prayers = owner.AddComponent(/datum/component/listen_prayers, CALLBACK(src, PROC_REF(check_if_santa_prayer)), "Santa Claus", "Allows you to listen for prayers that mention you or Christmas.") + +/datum/antagonist/santa/proc/check_if_santa_prayer(list/arguments) + SIGNAL_HANDLER + var/message = arguments[ARG_PRAYER_MSG] + var/mob/boy_girl = arguments[ARG_PRAYING_MOB] + var/regex/santa_regex = regex("(santa|claus|christmas|xmas)", "i") + if(!santa_regex.Find(message) && (!prob(60) || !findtext(message, "satan"))) + return FALSE //The message doesn't mention us (or satan, cuz the names are so similar, accidents may happen) + var/is_good_boy_girl = !boy_girl.is_antag() && !HAS_TRAIT(boy_girl, TRAIT_EVIL) + arguments[ARG_PRAYER_TYPE] = is_good_boy_girl ? SANTA_PRAYER : SANTA_NAUGHTY_PRAYER + arguments[ARG_PRAYER_SYMBOL] = icon('icons/obj/storage/wrapping.dmi', "giftdeliverypackage4") + return TRUE + +/datum/antagonist/santa/on_removal() + if(!owner) + return ..() + owner.remove_traits(list(TRAIT_CANNOT_OPEN_PRESENTS, TRAIT_PRESENT_VISION), TRAIT_SANTA) + QDEL_NULL(santa_prayers) + if(owner.current) + var/datum/action/cooldown/spell/teleport/area_teleport/wizard/santa/teleport = locate() in owner.current.actions + qdel(teleport) + return ..() + /datum/antagonist/santa/greet() . = ..() to_chat(owner, span_bolddanger("Your objective is to bring joy to the people on this station. You have a magical bag, which generates presents as long as you have it! You can examine the presents to take a peek inside, to make sure that you give the right gift to the right person.")) diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm index 18cd6fd931a..5d5a6cc25bc 100644 --- a/code/modules/clothing/head/tinfoilhat.dm +++ b/code/modules/clothing/head/tinfoilhat.dm @@ -6,6 +6,7 @@ armor_type = /datum/armor/costume_foilhat equip_delay_other = 14 SECONDS clothing_flags = ANTI_TINFOIL_MANEUVER + clothing_traits = list(TRAIT_DONT_HEAR_PRAYERS) //stops you from hearing prayers as well, yes var/datum/brain_trauma/mild/phobia/conspiracies/paranoia var/warped = FALSE interaction_flags_mouse_drop = NEED_HANDS diff --git a/icons/hud/actions.dmi b/icons/hud/actions.dmi index e8385331596b16edd2d981b021ef408451dabb71..d95481b1ef3154936c6ce65fd7075d73f8e6f8bc 100644 GIT binary patch literal 10521 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 IOPhuL55fSj00000 literal 9680 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�@Qe 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