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 b119ae85df5..d6cd10d2359 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/obj/weapons/guns/magic.dmi b/icons/obj/weapons/guns/magic.dmi
index 8888a396196..19894c6f601 100644
Binary files a/icons/obj/weapons/guns/magic.dmi and b/icons/obj/weapons/guns/magic.dmi differ
diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi
index 6a68141ff10..679e5711741 100644
Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ
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) => {
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -579,6 +583,32 @@ const FunForYouTab = (props, context) => {
+
+
+
+
+
+
+
+
+
+
+
+
);
};