From 2853e3ffef0bcce88b3d629850b36dbd7c90f3a9 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 19 Oct 2022 13:25:29 +0200 Subject: [PATCH] [MIRROR] Wizard DLC - Tower of Babel [MDB IGNORE] (#16978) * Wizard DLC - Tower of Babel (#69629) About The Pull Request This adds a new status effect called - Tower of Babel Any carbon mob afflicted by the status effect will lose knowledge of every known language and gain a randomized one as a replacement. The affected mob will also be hit with a depressing moodlet that lasts for 15 seconds. Silicons are immune to all effects. This effect is implemented in several ways: Tower of Babel wizard event (all crew on the station z level are affected. The wizard is not and gains mastery of every language to taunt their victims) Admin smite option Admin secret event (can be reversed) Staff of Babel (formerly the Staff of Sapping) will spawn during spawn magic wizard event Magicarp will randomly shoot bolts of babel Staff of Chaos will randomly shoot bolts of babel Overdosing on Mushroom Hallucinogen will temporarily and sporadically acquire the effect The effect can be blocked or cured in several ways: Curators are given immunity Reading a book of babel (via lavaland loot) cures and gives immunity Reading a language book cures and gives immunity ONLY for that particular language Note - The Tower of Babel does not allow tongueless, mute, or tongue tied people the ability to speak * Wizard DLC - Tower of Babel Co-authored-by: Tim --- code/__DEFINES/language.dm | 1 + code/__DEFINES/time.dm | 2 + code/__DEFINES/traits.dm | 3 + .../mood_events/generic_negative_events.dm | 8 +- .../status_effects/debuffs/tower_of_babel.dm | 56 ++++++++++++ code/modules/admin/smites/curse_of_babel.dm | 17 ++++ code/modules/admin/verbs/secrets.dm | 12 +++ code/modules/events/wizard/magicarp.dm | 2 +- code/modules/events/wizard/tower_of_babel.dm | 11 +++ code/modules/jobs/job_types/curator.dm | 6 +- code/modules/language/language_manuals.dm | 5 +- code/modules/mining/lavaland/tendril_loot.dm | 4 +- code/modules/mob/living/carbon/carbon_say.dm | 3 +- .../projectiles/ammunition/special/magic.dm | 4 +- code/modules/projectiles/guns/magic/staff.dm | 14 +-- code/modules/projectiles/projectile/magic.dm | 13 +-- .../chemistry/reagents/drug_reagents.dm | 9 ++ .../spells/spell_types/right_and_wrong.dm | 1 + .../spells/spell_types/tower_of_babel.dm | 81 ++++++++++++++++++ code/modules/surgery/organs/autosurgeon.dm | 2 - icons/mob/clothing/back.dmi | Bin 101963 -> 101966 bytes icons/obj/weapons/guns/magic.dmi | Bin 18296 -> 18295 bytes icons/obj/weapons/guns/projectiles.dmi | Bin 132733 -> 132737 bytes tgstation.dme | 4 + tgui/packages/tgui/interfaces/Secrets.js | 70 ++++++++++----- 25 files changed, 281 insertions(+), 47 deletions(-) create mode 100644 code/datums/status_effects/debuffs/tower_of_babel.dm create mode 100644 code/modules/admin/smites/curse_of_babel.dm create mode 100644 code/modules/events/wizard/tower_of_babel.dm create mode 100644 code/modules/spells/spell_types/tower_of_babel.dm diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index 8abd951e0f0..c2f7f343b94 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -22,3 +22,4 @@ #define LANGUAGE_STONER "stoner" #define LANGUAGE_VOICECHANGE "voicechange" #define LANGUAGE_RADIOKEY "radiokey" +#define LANGUAGE_BABEL "babel" diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index fda27f56d1a..5e56e3e7a4c 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -46,6 +46,8 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using #define SATURDAY "Sat" #define SUNDAY "Sun" +#define INFINITE -1 // -1 is commonly used to indicate an infinite time duration + #define MILLISECONDS *0.01 #define DECISECONDS *1 //the base unit all of these defines are scaled by, because byond uses that as a unit of measurement for some fucking reason diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e8cf179bf4c..2d6ef8cb537 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -660,6 +660,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// trait that prevents AI controllers from planning detached from ai_status to prevent weird state stuff. #define TRAIT_AI_PAUSED "TRAIT_AI_PAUSED" +/// this is used to bypass tongue language restrictions but not tongue disabilities +#define TRAIT_TOWER_OF_BABEL "tower_of_babel" + //Medical Categories for quirks #define CAT_QUIRK_ALL 0 #define CAT_QUIRK_NOTES 1 diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index b3d3b53dc92..27786632481 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -197,10 +197,10 @@ var/unhinged = uppertext(unstable.Join(""))//example Tinea Luxor > TINEA LUXORRRR (with randomness in how long that slur is) description = "THEY NEEEEEEED [unhinged]!!" -/datum/mood_event/sapped - description = "Some unexplainable sadness is consuming me..." - mood_change = -15 - timeout = 90 SECONDS +/datum/mood_event/tower_of_babel + description = "My ability to communicate is an incoherent babel..." + mood_change = -1 + timeout = 15 SECONDS /datum/mood_event/back_pain description = "Bags never sit right on my back, this hurts like hell!" diff --git a/code/datums/status_effects/debuffs/tower_of_babel.dm b/code/datums/status_effects/debuffs/tower_of_babel.dm new file mode 100644 index 00000000000..bc3df34f2be --- /dev/null +++ b/code/datums/status_effects/debuffs/tower_of_babel.dm @@ -0,0 +1,56 @@ +/datum/status_effect/tower_of_babel + id = "tower_of_babel" + status_type = STATUS_EFFECT_UNIQUE + alert_type = /atom/movable/screen/alert/status_effect/tower_of_babel + var/trait_source = STATUS_EFFECT_TRAIT + +/datum/status_effect/tower_of_babel/on_creation(mob/living/new_owner, duration = 15 SECONDS) + src.duration = duration + return ..() + +/datum/status_effect/tower_of_babel/on_apply() + var/random_language = pick(GLOB.all_languages) + owner.grant_language(random_language, source = LANGUAGE_BABEL) + // block every language except the randomized one + owner.add_blocked_language(GLOB.all_languages - random_language, source = LANGUAGE_BABEL) + // this lets us bypass tongue language restrictions except for people who have stuff like mute, + // no tongue, tongue tied, etc. curse of babel shouldn't let people who have a tongue disability speak + ADD_TRAIT(owner, TRAIT_TOWER_OF_BABEL, trait_source) + owner.add_mood_event(id, /datum/mood_event/tower_of_babel) + return ..() + +/datum/status_effect/tower_of_babel/on_remove() + owner.clear_mood_event(id) + // if user is affected by tower of babel, we remove the blocked languages + owner.remove_blocked_language(GLOB.all_languages, source = LANGUAGE_BABEL) + owner.remove_all_languages(source = LANGUAGE_BABEL) + owner.update_atom_languages() + REMOVE_TRAIT(owner, TRAIT_TOWER_OF_BABEL, trait_source) + return ..() + +// Used by wizard magic and tower of babel event +/datum/status_effect/tower_of_babel/magical + id = "tower_of_babel_magic" // do we need a new id? + duration = -1 + trait_source = TRAUMA_TRAIT + +/datum/status_effect/tower_of_babel/magical/on_apply() + . = ..() + if(!.) + return + + owner.emote("mumble") + owner.playsound_local(get_turf(owner), 'sound/magic/magic_block_mind.ogg', 75, vary = TRUE) // sound of creepy whispers + to_chat(owner, span_reallybig(span_hypnophrase("You feel a magical force affecting your speech patterns!"))) + +/datum/status_effect/tower_of_babel/magical/on_remove() + . = ..() + if(!.) + return + + to_chat(owner, span_reallybig(span_hypnophrase("You feel the magical force affecting your speech patterns fade away..."))) + +/atom/movable/screen/alert/status_effect/tower_of_babel + name = "Tower of babel" + desc = "You seem to be babbling in a strange language..." + icon_state = "mind_control" diff --git a/code/modules/admin/smites/curse_of_babel.dm b/code/modules/admin/smites/curse_of_babel.dm new file mode 100644 index 00000000000..4098cbf928c --- /dev/null +++ b/code/modules/admin/smites/curse_of_babel.dm @@ -0,0 +1,17 @@ +/// Strikes the target with a lightning bolt +/datum/smite/curse_of_babel + name = "Curse of Babel" + /// How long should the effect last + var/duration + +/datum/smite/curse_of_babel/configure(client/user) + duration = tgui_input_number(user, "How many minutes would you like this effect to last?", "Time", 1, 60, -1, round_value = FALSE) MINUTES + +/datum/smite/curse_of_babel/effect(client/user, mob/living/carbon/target) + . = ..() + if(!iscarbon(target)) + to_chat(user, span_warning("This must be used on a carbon mob."), confidential = TRUE) + return + + target.apply_status_effect(/datum/status_effect/tower_of_babel, duration) + to_chat(target, span_userdanger("The gods have punished you for your sins!"), confidential = TRUE) diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 1335f78c3f7..8b6b7b7656c 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -291,6 +291,18 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) summon_magic(holder, survivor_probability) + if("towerOfBabel") + if(!is_funmin) + return + if(tgui_alert(usr,"Would you like to randomize language for everyone?",,list("Yes","No")) == "Yes") + SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Tower of babel")) + holder.tower_of_babel() + + if("cureTowerOfBabel") + if(!is_funmin) + return + holder.tower_of_babel_undo() + if("events") if(!is_funmin) return diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index 8abae54696a..eb709c5dc63 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -39,7 +39,6 @@ health = 50 gold_core_spawnable = NO_SPAWN random_color = FALSE - /// List of all projectiles we can fire. /// Non-static, because subtypes can have their own lists. var/list/allowed_projectile_types = list( @@ -52,6 +51,7 @@ /obj/projectile/magic/resurrection, /obj/projectile/magic/spellblade, /obj/projectile/magic/teleport, + /obj/projectile/magic/babel, ) /mob/living/simple_animal/hostile/carp/ranged/Initialize(mapload) diff --git a/code/modules/events/wizard/tower_of_babel.dm b/code/modules/events/wizard/tower_of_babel.dm new file mode 100644 index 00000000000..6c35cae81aa --- /dev/null +++ b/code/modules/events/wizard/tower_of_babel.dm @@ -0,0 +1,11 @@ +/datum/round_event_control/wizard/tower_of_babel + name = "Tower of Babel" + weight = 3 + typepath = /datum/round_event/wizard/tower_of_babel + max_occurrences = 1 + earliest_start = 0 MINUTES + description = "Everyone forgets their current languages and gains a randomized one" + +/datum/round_event/wizard/tower_of_babel/start() + GLOB.tower_of_babel = new /datum/tower_of_babel() + diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index b19394410eb..371f2eb426c 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -54,10 +54,12 @@ accessory = /obj/item/clothing/accessory/pocketprotector/full -/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/curator/post_equip(mob/living/carbon/human/translator, visualsOnly = FALSE) ..() if(visualsOnly) return - H.grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_CURATOR) + translator.grant_all_languages(source=LANGUAGE_CURATOR) + translator.remove_blocked_language(GLOB.all_languages, source=LANGUAGE_ALL) + ADD_TRAIT(translator, TRAIT_TOWER_OF_BABEL, JOB_TRAIT) diff --git a/code/modules/language/language_manuals.dm b/code/modules/language/language_manuals.dm index 77ee8b28dd0..15fff94b251 100644 --- a/code/modules/language/language_manuals.dm +++ b/code/modules/language/language_manuals.dm @@ -17,7 +17,10 @@ return to_chat(user, span_boldannounce("You start skimming through [src], and [flavour_text].")) - user.grant_language(language, TRUE, TRUE, LANGUAGE_MIND) + + user.grant_language(language) + user.remove_blocked_language(language, source=LANGUAGE_ALL) + ADD_TRAIT(user, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) // this makes you immune to babel effects use_charge(user) diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index 007ab9956af..94eab53a941 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -496,8 +496,10 @@ if(!user.can_read(src)) return FALSE to_chat(user, span_notice("You flip through the pages of the book, quickly and conveniently learning every language in existence. Somewhat less conveniently, the aging book crumbles to dust in the process. Whoops.")) + cure_curse_of_babel(user) // removes tower of babel if we have it + user.grant_all_languages(source=LANGUAGE_BABEL) user.remove_blocked_language(GLOB.all_languages, source = LANGUAGE_ALL) - user.grant_all_languages() + ADD_TRAIT(user, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) // this makes you immune to babel effects new /obj/effect/decal/cleanable/ash(get_turf(user)) qdel(src) diff --git a/code/modules/mob/living/carbon/carbon_say.dm b/code/modules/mob/living/carbon/carbon_say.dm index f8ba87fe764..a9de5875e42 100644 --- a/code/modules/mob/living/carbon/carbon_say.dm +++ b/code/modules/mob/living/carbon/carbon_say.dm @@ -20,6 +20,7 @@ /mob/living/carbon/could_speak_language(datum/language/language) var/obj/item/organ/internal/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(T) - return T.could_speak_language(language) + // the tower of babel needs to bypass the tongue language restrictions without giving omnitongue + return HAS_TRAIT(src, TRAIT_TOWER_OF_BABEL) || T.could_speak_language(language) else return initial(language.flags) & TONGUELESS_SPEECH diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index 423f1ab6148..0965aae2fdd 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -71,8 +71,8 @@ /obj/item/ammo_casing/magic/antimagic projectile_type = /obj/projectile/magic/antimagic -/obj/item/ammo_casing/magic/sapping - projectile_type = /obj/projectile/magic/sapping +/obj/item/ammo_casing/magic/babel + projectile_type = /obj/projectile/magic/babel /obj/item/ammo_casing/magic/necropotence projectile_type = /obj/projectile/magic/necropotence diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index f33e480b896..b8c5e30258b 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -137,7 +137,7 @@ /obj/projectile/magic/locker, /obj/projectile/magic/necropotence, /obj/projectile/magic/resurrection, - /obj/projectile/magic/sapping, + /obj/projectile/magic/babel, /obj/projectile/magic/spellblade, /obj/projectile/magic/teleport, /obj/projectile/magic/wipe, @@ -241,14 +241,14 @@ worn_icon_state = "flightstaff" school = SCHOOL_EVOCATION -/obj/item/gun/magic/staff/sapping - name = "staff of sapping" - desc = "An artefact that spits bolts of sapping magic that can make something sad." +/obj/item/gun/magic/staff/babel + name = "staff of babel" + desc = "An artefact that spits bolts of confusion magic that can make something depressed and incoherent." fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/sapping - icon_state = "staffofsapping" + ammo_type = /obj/item/ammo_casing/magic/babel + icon_state = "staffofbabel" inhand_icon_state = "staffofdoor" - worn_icon_state = "sapstaff" + worn_icon_state = "babelstaff" school = SCHOOL_FORBIDDEN //evil /obj/item/gun/magic/staff/necropotence diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 0de2b8234b1..98bdae7adcd 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -366,14 +366,15 @@ var/atom/throw_target = get_edge_target_turf(target, get_dir(target, firer)) target.throw_at(throw_target, 200, 4) -/obj/projectile/magic/sapping - name = "bolt of sapping" - icon_state = "sapping" +/obj/projectile/magic/babel + name = "bolt of babel" + icon_state = "babel" -/obj/projectile/magic/sapping/on_hit(mob/living/target) +/obj/projectile/magic/babel/on_hit(mob/living/carbon/target) . = ..() - if(isliving(target)) - target.add_mood_event(REF(src), /datum/mood_event/sapped) + if(iscarbon(target)) + if(curse_of_babel(target)) + target.add_mood_event("curse_of_babel", /datum/mood_event/tower_of_babel) /obj/projectile/magic/necropotence name = "bolt of necropotence" diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 7dbd60b91b9..f9329a464af 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -446,6 +446,7 @@ metabolization_rate = 0.2 * REAGENTS_METABOLISM taste_description = "mushroom" ph = 11 + overdose_threshold = 30 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/hallucinogens = 12) @@ -502,6 +503,14 @@ game_plane_master_controller.remove_filter("rainbow") game_plane_master_controller.remove_filter("psilocybin_wave") +/datum/reagent/drug/mushroomhallucinogen/overdose_process(mob/living/psychonaut, delta_time, times_fired) + . = ..() + if(DT_PROB(10, delta_time)) + psychonaut.emote(pick("twitch","drool","moan")) + + if(DT_PROB(10, delta_time)) + psychonaut.apply_status_effect(/datum/status_effect/tower_of_babel) + /datum/reagent/drug/blastoff name = "bLaStOoF" description = "A drug for the hardcore party crowd said to enhance ones abilities on the dance floor.\nMost old heads refuse to touch this stuff, perhaps because memories of the luna discoteque incident are seared into their brains." diff --git a/code/modules/spells/spell_types/right_and_wrong.dm b/code/modules/spells/spell_types/right_and_wrong.dm index 9657e0b3c6d..f6563b244c9 100644 --- a/code/modules/spells/spell_types/right_and_wrong.dm +++ b/code/modules/spells/spell_types/right_and_wrong.dm @@ -75,6 +75,7 @@ GLOBAL_LIST_INIT(summoned_magic, list( /obj/item/gun/magic/wand/fireball, /obj/item/gun/magic/staff/healing, /obj/item/gun/magic/staff/door, + /obj/item/gun/magic/staff/babel, /obj/item/scrying, /obj/item/warp_whistle, /obj/item/immortality_talisman, diff --git a/code/modules/spells/spell_types/tower_of_babel.dm b/code/modules/spells/spell_types/tower_of_babel.dm new file mode 100644 index 00000000000..70468903d69 --- /dev/null +++ b/code/modules/spells/spell_types/tower_of_babel.dm @@ -0,0 +1,81 @@ +GLOBAL_DATUM(tower_of_babel, /datum/tower_of_babel) + +/datum/tower_of_babel + +/datum/tower_of_babel/New(mob/badmin) + if(badmin) + message_admins("[ADMIN_LOOKUPFLW(badmin)] has stricken the station with the Tower of Babel!") + log_admin("[key_name(badmin)] used the Tower of Babel.") + badmin.log_message("has stricken the station with the Tower of Babel!", LOG_GAME) + + RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, .proc/handle_new_player) + deadchat_broadcast("The [span_name("Tower of Babel")] has stricken the station, people will struggle to communicate.", message_type=DEADCHAT_ANNOUNCEMENT) + + for(var/mob/living/carbon/target in GLOB.player_list) + if(IS_WIZARD(target) && !badmin) + // wizards are not only immune but can speak all languages to taunt their victims over the radio + target.grant_all_languages(source=LANGUAGE_BABEL) + ADD_TRAIT(target, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) + to_chat(target, span_reallybig(span_hypnophrase("You feel a magical force improving your speech patterns!"))) + continue + + if(target.stat == DEAD) + continue + var/turf/curse_turf = get_turf(target) + if(curse_turf && !is_station_level(curse_turf.z) && !badmin) // badmin magic affects everyone + continue + + curse_of_babel(target) + +/datum/tower_of_babel/Destroy(force, ...) + . = ..() + UnregisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED) + + for(var/mob/living/carbon/target in GLOB.player_list) + // some players might be off the z-level or dead but we still need to cure them + cure_curse_of_babel(target) + +/datum/tower_of_babel/proc/handle_new_player(datum/source, mob/living/new_crewmember, rank) + SIGNAL_HANDLER + + curse_of_babel(new_crewmember) + +/proc/curse_of_babel(mob/living/carbon/to_curse) + // silicon mobs are immune + if(!iscarbon(to_curse)) + return + + if(to_curse.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND) || HAS_TRAIT(to_curse, TRAIT_TOWER_OF_BABEL)) + to_chat(to_curse, span_notice("You have a strange feeling for a moment, but then it passes.")) + return + + to_curse.apply_status_effect(/datum/status_effect/tower_of_babel/magical, INFINITE) + return TRUE + +/// Mainly so admin triggered tower of babel can be undone +/proc/cure_curse_of_babel(mob/living/carbon/to_cure) + if(!iscarbon(to_cure)) + return + + // anyone who has this trait from another source is immune to being cursed by tower of babel + if(!HAS_TRAIT_FROM(to_cure, TRAIT_TOWER_OF_BABEL, TRAUMA_TRAIT)) + return + + to_cure.remove_status_effect(/datum/status_effect/tower_of_babel/magical) + +/client/proc/tower_of_babel() + if(!SSticker.HasRoundStarted()) + tgui_alert(usr,"The game hasn't started yet!") + return + + GLOB.tower_of_babel = new /datum/tower_of_babel(usr) + +/client/proc/tower_of_babel_undo() + if(GLOB.tower_of_babel) + message_admins("[ADMIN_LOOKUPFLW(usr)] has cured the station from the effects of Tower of Babel!") + log_admin("[key_name(usr)] has cured the station from the effects of Tower of Babel.") + usr.log_message("has cured the station from the effects of Tower of Babel!", LOG_GAME) + + deadchat_broadcast("The [span_name("Tower of Babel")] has been cured, people will now communicate normally.", message_type=DEADCHAT_ANNOUNCEMENT) + + QDEL_NULL(GLOB.tower_of_babel) diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 6ca3ae28f99..6870a3fc53e 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -1,5 +1,3 @@ -#define INFINITE -1 - /obj/item/autosurgeon name = "autosurgeon" desc = "A device that automatically inserts an implant, skillchip or organ into the user without the hassle of extensive surgery. \ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index b119ae85df5227a20dfb5b642e1521e338901b50..d6cd10d235971bcd886a6438f05d64a1cbdaa0d7 100644 GIT binary patch delta 1325 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 diff --git a/icons/obj/weapons/guns/magic.dmi b/icons/obj/weapons/guns/magic.dmi index 8888a3961960eff63edaf5e1615e9739f2b8efbc..19894c6f6017fafaf8c7e264ce8693162ceedd6d 100644 GIT binary patch delta 460 zcmV;-0W<#ijsf?M0gxnrvU*flbVOxyV{&P5bZKvH004NLos_|DoG=iE&+rtZ0?FVQ;N5rH?7H7>@~g4N8tZ?$DJG-sY28bFpUeabEKy+O zyD+vcsHpKukSomG@MX1h&Top#0`Jc{BjxNnM|_qU55f6!B;;9@i>Dg@de=`kbfFHv6qC{RyzM2v&SnAymMAdt zUKv{#RMdDQ$PH$0__SI&=Xb?rfz!RsNICn?5ubI&Lva2Q33*ZF;;F{Jp6%TYU1B@dY-R;`pP%5a+gDe6;@cy+Oc+V@ghpe6jXd=`NuZ1tas)kDY#XI1Dj8# zC7tt0Id$5nZ83u1qW(pC(w6@NV6tLjmn@i&rN=aqN)}ASk_C$+maI|Ez3(?;&&K>R zBqQ_od9L0!6ezGpfdUT;yo$Ud^>b*s4?beE>{HjKOo{tHvgBmPq0$+BR$;fdM1i7M z&tPu7>s?^mM$%ZeXT9u|X{J%%$A1s2->Q1wKdhYT0br3v!iZ9Uu~;ZGoSUSyFQ%%@c{x>+v<~d!23^s^I5CeSKDeipY0e1 z^wqX%=Cc+FPSv(r*2{MjITB%*wuxX4i(pDhO9kEt`~cIi&BZ~_Pn4m85ReHxayE>X z2*W#SeFG(^5XXhM5Dr=7C~oADEEr-o@nC;xbDvu@$lYn$W_4AP`HboiBY9jF!h}p5=|kKSq*f^Mk+nk6WKk_DvL??5X(^QS zi%pQGm;l}(lja70ih`RkOT+t0d~8)1@g@WFxz7` z&>lo!PzB|G3g`)hWBU_T(3GlMM90O`rd~Wfm%h=maAIvbbZmcSj|Hs2ppd`}U7k$c zI7mosB5?sMk#^PKT#G4E){WqLLsm0gdC+L6wW3--pA!(LSjeu z*n??P3vQIqy1wyDxJ(iFewQAxrKAo=c{X)ZHZ@}~vbGhMSIe6jrf)h5IN#uARD{670SB#;iW)18+L!bO>8`(10i+#GNUX2T zMc$Er)|j9N=yZNX++k4t{T(JjV*b*2RYik}t+N45>Uwc2UZ$UD#F3R*&ld`LZmH;v+7gVhrf6hJ-F4`LD7m-d;KUuS1B362 zklv2u34DTWt2pid>OXHR0pPL delta 943 zcmV;g15o^djR^gW2#_RyiF#C6bVOxyV{&P5bZKvH004NLrC7m^+At73!&gM@HC;h~ zc6;DbZB^}|{RL~{42jFcw#GJ;zwd!+*X+jFP(?vPdNbp(-@F;;WA*L(kLO?2)6eJm z0of^|t8KM@Sj=Zf)%l^?R;y+{8&LIwKmTzaJXYK4gR{W<5A#`nr`T27YB`_n7)Er} zwrb|H4hc@xwp!N9SCcjnp`W&iU>1vDvTY3&cq4ElOv5%83q3zkh7!C-CUD5vFselu zUs3BTC_#ldF2s3%$RdNdl1K8u5VMJU^GE61+@ePAPt!K5H%Bs`F&>rfE`yHHD>+Vk zSid{eX&=ra(f=%e!Ul4<$P+M-!(|~%w239Xi(7(J5=B0;k|>%iszXUe=lReY@+I|R z5~L|6fU^ksI5;X_vYwU#Itwz9;Nyf+TqD<+;)z`?OY!Vt^*=8DFeJ(>0`(A_6HXCo ziCr1|h>+0!x5zS-^K5jV#WHrDL6-Tn1GoaZQou5WXY2}piixqiM`?RT)OSfV1-!@Z zghb|ekEIQ4>8_Z2rO_)XS^}47+*9IB#@NeEmIE7YZfO596o~)|r-AdNL7~xmRlwLj z0Cx%!S{DH|1~ylE>AQk|u{Tx}ep9bvgZDwUs zJ|G-UWl%F}RfgOt#`HmMViJDc)Du5Z76>*KaY7+~-`I&Zv@M~qCb4<%hldG?4eW3L z-K7THD4}(I<(Y7qBJk}l9b!jG9ggyB>ZWck#Vmip4CHqz)u|%qn|krEshh;4sfdj>ZYA)N{2 z2wZ}1t2pg1^}jb30dW2ZhdVf+^bT1YH<*GM?`eFx3jA1o|MgTo{d}JP1rb@U^9R+# RoP)Xphq?m+x4HuY#{yyP#~=Uz diff --git a/tgstation.dme b/tgstation.dme index 1231f9d24ec..e5549569627 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1311,6 +1311,7 @@ #include "code\datums\status_effects\debuffs\silenced.dm" #include "code\datums\status_effects\debuffs\speech_debuffs.dm" #include "code\datums\status_effects\debuffs\strandling.dm" +#include "code\datums\status_effects\debuffs\tower_of_babel.dm" #include "code\datums\storage\storage.dm" #include "code\datums\storage\subtypes\bag_of_holding.dm" #include "code\datums\storage\subtypes\cards.dm" @@ -2150,6 +2151,7 @@ #include "code\modules\admin\smites\brain_damage.dm" #include "code\modules\admin\smites\bread.dm" #include "code\modules\admin\smites\bsa.dm" +#include "code\modules\admin\smites\curse_of_babel.dm" #include "code\modules\admin\smites\dock_pay.dm" #include "code\modules\admin\smites\fake_bwoink.dm" #include "code\modules\admin\smites\fat.dm" @@ -3073,6 +3075,7 @@ #include "code\modules\events\wizard\rpgtitles.dm" #include "code\modules\events\wizard\shuffle.dm" #include "code\modules\events\wizard\summons.dm" +#include "code\modules\events\wizard\tower_of_babel.dm" #include "code\modules\experisci\destructive_scanner.dm" #include "code\modules\experisci\handheld_scanner.dm" #include "code\modules\experisci\experiment\experiments.dm" @@ -4430,6 +4433,7 @@ #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\madness_curse.dm" #include "code\modules\spells\spell_types\right_and_wrong.dm" +#include "code\modules\spells\spell_types\tower_of_babel.dm" #include "code\modules\spells\spell_types\aoe_spell\_aoe_spell.dm" #include "code\modules\spells\spell_types\aoe_spell\area_conversion.dm" #include "code\modules\spells\spell_types\aoe_spell\knock.dm" diff --git a/tgui/packages/tgui/interfaces/Secrets.js b/tgui/packages/tgui/interfaces/Secrets.js index 02bd43da4c0..6cfae95e63e 100644 --- a/tgui/packages/tgui/interfaces/Secrets.js +++ b/tgui/packages/tgui/interfaces/Secrets.js @@ -484,26 +484,30 @@ const FunForYouTab = (props, context) => { - -