diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm
index dc2ac19e6579..d5fa67406a53 100644
--- a/code/__DEFINES/language.dm
+++ b/code/__DEFINES/language.dm
@@ -3,5 +3,21 @@
#define LANGUAGE_HIDE_ICON_IF_UNDERSTOOD 4
#define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8
-#define LANGUAGE_KNOWN "language_known"
-#define LANGUAGE_SHADOWED "language_shadowed"
+// LANGUAGE SOURCE DEFINES
+#define LANGUAGE_ALL "all" // For use in full removal only.
+#define LANGUAGE_ATOM "atom"
+#define LANGUAGE_MIND "mind"
+
+#define LANGUAGE_ABSORB "absorb"
+#define LANGUAGE_APHASIA "aphasia"
+#define LANGUAGE_CULTIST "cultist"
+#define LANGUAGE_CURATOR "curator"
+#define LANGUAGE_DEVIL "devil"
+#define LANGUAGE_GLAND "gland"
+#define LANGUAGE_HAT "hat"
+#define LANGUAGE_HIGH "high"
+#define LANGUAGE_MALF "malf"
+#define LANGUAGE_MASTER "master"
+#define LANGUAGE_SOFTWARE "software"
+#define LANGUAGE_STONER "stoner"
+#define LANGUAGE_VOICECHANGE "voicechange"
diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm
index 186a67d1d089..522bb59e0a33 100644
--- a/code/datums/brain_damage/imaginary_friend.dm
+++ b/code/datums/brain_damage/imaginary_friend.dm
@@ -89,7 +89,6 @@
trauma = _trauma
owner = trauma.owner
- copy_known_languages_from(owner, TRUE)
setup_friend()
diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm
index 2ba242c67e8b..f5a0d1134e8b 100644
--- a/code/datums/brain_damage/severe.dm
+++ b/code/datums/brain_damage/severe.dm
@@ -26,21 +26,15 @@
scan_desc = "extensive damage to the brain's language center"
gain_text = "You have trouble forming words in your head..."
lose_text = "You suddenly remember how languages work."
- var/datum/language_holder/prev_language
- var/datum/language_holder/mob_language
/datum/brain_trauma/severe/aphasia/on_gain()
- mob_language = owner.get_language_holder()
- prev_language = mob_language.copy()
- mob_language.remove_all_languages()
- mob_language.grant_language(/datum/language/aphasia)
+ owner.add_blocked_language(subtypesof(/datum/language/) - /datum/language/aphasia, LANGUAGE_APHASIA)
+ owner.grant_language(/datum/language/aphasia, TRUE, TRUE, LANGUAGE_APHASIA)
..()
/datum/brain_trauma/severe/aphasia/on_lose()
- mob_language.remove_language(/datum/language/aphasia)
- mob_language.copy_known_languages_from(prev_language) //this will also preserve languages learned during the trauma
- QDEL_NULL(prev_language)
- mob_language = null
+ owner.remove_blocked_language(subtypesof(/datum/language/), LANGUAGE_APHASIA)
+ owner.remove_language(/datum/language/aphasia, TRUE, TRUE, LANGUAGE_APHASIA)
..()
/datum/brain_trauma/severe/blindness
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index 559d8f475414..ea20048221a5 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -28,8 +28,10 @@ Bonus
base_message_chance = 15
symptom_delay_min = 10
symptom_delay_max = 30
- threshold_desc = "Stage Speed 8: Causes choking more frequently.
\
- Stealth 4: The symptom remains hidden until active."
+ threshold_descs = list(
+ "Stage Speed 8" = "Causes choking more frequently.",
+ "Stealth 4" = "The symptom remains hidden until active."
+ )
/datum/symptom/choking/Start(datum/disease/advance/A)
if(!..())
@@ -99,8 +101,10 @@ Bonus
symptom_delay_min = 14
symptom_delay_max = 30
var/paralysis = FALSE
- threshold_desc = "Stage Speed 8: Additionally synthesizes pancuronium and sodium thiopental inside the host.
\
- Transmission 8: Doubles the damage caused by the symptom."
+ threshold_descs = list(
+ "Stage Speed 8" = "Additionally synthesizes pancuronium and sodium thiopental inside the host.",
+ "Transmission 8" = "Doubles the damage caused by the symptom."
+ )
/datum/symptom/asphyxiation/Start(datum/disease/advance/A)
diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm
index c5daf8b5866b..5c1c18f38a9a 100644
--- a/code/datums/diseases/advance/symptoms/confusion.dm
+++ b/code/datums/diseases/advance/symptoms/confusion.dm
@@ -29,9 +29,11 @@ Bonus
symptom_delay_min = 10
symptom_delay_max = 30
var/brain_damage = FALSE
- threshold_desc = "Resistance 6: Causes brain damage over time.
\
- Transmission 6: Increases confusion duration.
\
- Stealth 4: The symptom remains hidden until active."
+ threshold_descs = list(
+ "Resistance 6" = "Causes brain damage over time.",
+ "Transmission 6" = "Increases confusion duration and strength.",
+ "Stealth 4" = "The symptom remains hidden until active.",
+ )
/datum/symptom/confusion/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm
index 9d7aed5056a4..e79276ce3eb9 100644
--- a/code/datums/diseases/advance/symptoms/cough.dm
+++ b/code/datums/diseases/advance/symptoms/cough.dm
@@ -29,11 +29,13 @@ BONUS
symptom_delay_min = 2
symptom_delay_max = 15
var/infective = FALSE
- threshold_desc = "Resistance 3: Host will drop small items when coughing.
\
- Resistance 10: Occasionally causes coughing fits that stun the host.
\
- Stage Speed 6: Increases cough frequency.
\
- If Airborne: Coughing will infect bystanders.
\
- Stealth 4: The symptom remains hidden until active."
+ threshold_descs = list(
+ "Resistance 11" = "The host will drop small items when coughing.",
+ "Resistance 15" = "Occasionally causes coughing fits that stun the host. The extra coughs do not spread the virus.",
+ "Stage Speed 6" = "Increases cough frequency.",
+ "Transmission 7" = "Coughing will now infect bystanders up to 2 tiles away.",
+ "Stealth 4" = "The symptom remains hidden until active.",
+ )
/datum/symptom/cough/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm
index 8031b60e8e15..d09d44b6eb6b 100644
--- a/code/datums/diseases/advance/symptoms/deafness.dm
+++ b/code/datums/diseases/advance/symptoms/deafness.dm
@@ -28,9 +28,10 @@ Bonus
base_message_chance = 100
symptom_delay_min = 25
symptom_delay_max = 80
- threshold_desc = "Resistance 9: Causes permanent deafness, instead of intermittent.
\
- Stealth 4: The symptom remains hidden until active."
-
+ threshold_descs = list(
+ "Resistance 9" = "Causes permanent deafness, instead of intermittent.",
+ "Stealth 4" = "The symptom remains hidden until active.",
+ )
/datum/symptom/deafness/Start(datum/disease/advance/A)
if(!..())
return
diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm
index b4b06be5acf3..ed5126a84882 100644
--- a/code/datums/diseases/advance/symptoms/dizzy.dm
+++ b/code/datums/diseases/advance/symptoms/dizzy.dm
@@ -27,8 +27,10 @@ Bonus
base_message_chance = 50
symptom_delay_min = 15
symptom_delay_max = 40
- threshold_desc = "Transmission 6: Also causes druggy vision.
\
- Stealth 4: The symptom remains hidden until active."
+ threshold_descs = list(
+ "Transmission 6" = "Also causes druggy vision.",
+ "Stealth 4" = "The symptom remains hidden until active.",
+ )
/datum/symptom/dizzy/Start(datum/disease/advance/A)
if(!..())
@@ -50,4 +52,4 @@ Bonus
to_chat(M, "A wave of dizziness washes over you!")
M.Dizzy(5)
if(power >= 2)
- M.set_drugginess(5)
\ No newline at end of file
+ M.set_drugginess(5)
diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm
index a178cba196e0..d2d1c9844d40 100644
--- a/code/datums/diseases/advance/symptoms/fever.dm
+++ b/code/datums/diseases/advance/symptoms/fever.dm
@@ -28,8 +28,10 @@ Bonus
symptom_delay_min = 10
symptom_delay_max = 30
var/unsafe = FALSE //over the heat threshold
- threshold_desc = "Resistance 5: Increases fever intensity, fever can overheat and harm the host.
\
- Resistance 10: Further increases fever intensity."
+ threshold_descs = list(
+ "Resistance 5" = "Increases fever intensity, fever can overheat and harm the host.",
+ "Resistance 10" = "Further increases fever intensity.",
+ )
/datum/symptom/fever/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index b7a482a0f702..c9a637bd659d 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -29,10 +29,12 @@ Bonus
symptom_delay_min = 20
symptom_delay_max = 75
var/infective = FALSE
- threshold_desc = "Stage Speed 4: Increases the intensity of the flames.
\
- Stage Speed 8: Further increases flame intensity.
\
- Transmission 8: Host will spread the virus through skin flakes when bursting into flame.
\
- Stealth 4: The symptom remains hidden until active."
+ threshold_descs = list(
+ "Stage Speed 4" = "Increases the intensity of the flames.",
+ "Stage Speed 8" = "Further increases flame intensity.",
+ "Transmission 8" = "Host will spread the virus through skin flakes when bursting into flame.",
+ "Stealth 4" = "The symptom remains hidden until active.",
+ )
/datum/symptom/fire/Start(datum/disease/advance/A)
if(!..())
@@ -112,9 +114,11 @@ Bonus
symptom_delay_max = 90
var/chems = FALSE
var/explosion_power = 1
- threshold_desc = "Resistance 9: Doubles the intensity of the effect, but reduces its frequency.
\
- Stage Speed 8: Increases explosion radius when the host is wet.
\
- Transmission 8: Additionally synthesizes chlorine trifluoride and napalm inside the host."
+ threshold_descs = list(
+ "Resistance 9" = "Doubles the intensity of the immolation effect, but reduces the frequency of all of this symptom's effects.",
+ "Stage Speed 8" = "Increases explosion radius and explosion damage to the host when the host is wet.",
+ "Transmission 8" = "Additionally synthesizes chlorine trifluoride and napalm inside the host. More chemicals are synthesized if the resistance 9 threshold has been met."
+ )
/datum/symptom/alkali/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index b8037a594473..08b82bb23b9d 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -26,8 +26,10 @@ Bonus
symptom_delay_max = 60
var/bleed = FALSE
var/pain = FALSE
- threshold_desc = "Resistance 7: Host will bleed profusely during necrosis.
\
- Transmission 8: Causes extreme pain to the host, weakening it."
+ threshold_descs = list(
+ "Resistance 7" = "Host will bleed profusely during necrosis.",
+ "Transmission 8" = "Causes extreme pain to the host, weakening it.",
+ )
/datum/symptom/flesh_eating/Start(datum/disease/advance/A)
if(!..())
@@ -88,8 +90,10 @@ Bonus
symptom_delay_max = 6
var/chems = FALSE
var/zombie = FALSE
- threshold_desc = "Stage Speed 7: Synthesizes Heparin and Lipolicide inside the host, causing increased bleeding and hunger.
\
- Stealth 5: The symptom remains hidden until active."
+ threshold_descs = list(
+ "Stage Speed 7" = "Synthesizes Heparin and Lipolicide inside the host, causing increased bleeding and hunger.",
+ "Stealth 5" = "The symptom remains hidden until active.",
+ )
/datum/symptom/flesh_death/Start(datum/disease/advance/A)
if(!..())
@@ -119,4 +123,4 @@ Bonus
M.reagents.add_reagent_list(list(/datum/reagent/toxin/heparin = 2, /datum/reagent/toxin/lipolicide = 2))
if(zombie)
M.reagents.add_reagent(/datum/reagent/romerol, 1)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm
index 49b229e5032d..2f1d6a6530f8 100644
--- a/code/datums/diseases/advance/symptoms/genetics.dm
+++ b/code/datums/diseases/advance/symptoms/genetics.dm
@@ -30,9 +30,12 @@ Bonus
symptom_delay_min = 60
symptom_delay_max = 120
var/no_reset = FALSE
- threshold_desc = "Resistance 8: Causes two harmful mutations at once.
\
- Stage Speed 10: Increases mutation frequency.
\
- Stealth 5: The mutations persist even if the virus is cured."
+ threshold_descs = list(
+ "Resistance 8" = "The negative and mildly negative mutations caused by the virus are mutadone-proof (but will still be undone when the virus is cured if the resistance 14 threshold is not met).",
+ "Resistance 14" = "The host's genetic alterations are not undone when the virus is cured.",
+ "Stage Speed 10" = "The virus activates dormant mutations at a much faster rate.",
+ "Stealth 5" = "Only activates negative mutations in hosts."
+ )
/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm
index 873d96052459..0f6594b379aa 100644
--- a/code/datums/diseases/advance/symptoms/hallucigen.dm
+++ b/code/datums/diseases/advance/symptoms/hallucigen.dm
@@ -28,8 +28,10 @@ Bonus
symptom_delay_min = 25
symptom_delay_max = 90
var/fake_healthy = FALSE
- threshold_desc = "Stage Speed 7: Increases the amount of hallucinations.
\
- Stealth 4: The virus mimics positive symptoms.."
+ threshold_descs = list(
+ "Stage Speed 7" = "Increases the amount of hallucinations.",
+ "Stealth 4" = "The virus mimics positive symptoms.",
+ )
/datum/symptom/hallucigen/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm
index 72b03000ed42..5082e8aff315 100644
--- a/code/datums/diseases/advance/symptoms/headache.dm
+++ b/code/datums/diseases/advance/symptoms/headache.dm
@@ -29,9 +29,11 @@ BONUS
base_message_chance = 100
symptom_delay_min = 15
symptom_delay_max = 30
- threshold_desc = "Stage Speed 6: Headaches will cause severe pain, that weakens the host.
\
- Stage Speed 9: Headaches become less frequent but far more intense, preventing any action from the host.
\
- Stealth 4: Reduces headache frequency until later stages."
+ threshold_descs = list(
+ "Stage Speed 6" = "Headaches will cause severe pain, that weakens the host.",
+ "Stage Speed 9" = "Headaches become less frequent but far more intense, preventing any action from the host.",
+ "Stealth 4" = "Reduces headache frequency until later stages.",
+ )
/datum/symptom/headache/Start(datum/disease/advance/A)
if(!..())
@@ -57,4 +59,4 @@ BONUS
M.adjustStaminaLoss(25)
if(power >= 3 && A.stage >= 5)
to_chat(M, "[pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your head!")]")
- M.Stun(35)
\ No newline at end of file
+ M.Stun(35)
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 2d807c3c589d..d6d81c5fb990 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -10,8 +10,10 @@
symptom_delay_min = 1
symptom_delay_max = 1
var/passive_message = "" //random message to infected but not actively healing people
- threshold_desc = "Stage Speed 6: Doubles healing speed.
\
- Stealth 4: Healing will no longer be visible to onlookers."
+ threshold_descs = list(
+ "Stage Speed 6" = "Doubles healing speed.",
+ "Stealth 4" = "Healing will no longer be visible to onlookers.",
+ )
/datum/symptom/heal/Start(datum/disease/advance/A)
if(!..())
@@ -54,8 +56,10 @@
level = 6
passive_message = "You miss the feeling of starlight on your skin."
var/nearspace_penalty = 0.3
- threshold_desc = "Stage Speed 6: Increases healing speed.
\
- Transmission 6: Removes penalty for only being close to space."
+ threshold_descs = list(
+ "Stage Speed 6" = "Increases healing speed.",
+ "Transmission 6" = "Removes penalty for only being close to space.",
+ )
/datum/symptom/heal/starlight/Start(datum/disease/advance/A)
if(!..())
@@ -105,8 +109,10 @@
level = 7
var/food_conversion = FALSE
desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
- threshold_desc = "Resistance 7: Increases chem removal speed.
\
- Stage Speed 6: Consumed chemicals nourish the host."
+ threshold_descs = list(
+ "Resistance 7" = "Increases chem removal speed.",
+ "Stage Speed 6" = "Consumed chemicals nourish the host.",
+ )
/datum/symptom/heal/chem/Start(datum/disease/advance/A)
if(!..())
@@ -138,8 +144,10 @@
var/reduced_hunger = FALSE
desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\
but also causing increased hunger."
- threshold_desc = "Stealth 3: Reduces hunger rate.
\
- Stage Speed 10: Chemical metabolization is tripled instead of doubled."
+ threshold_descs = list(
+ "Stealth 3" = "Reduces hunger rate.",
+ "Stage Speed 10" = "Chemical metabolization is tripled instead of doubled.",
+ )
/datum/symptom/heal/metabolism/Start(datum/disease/advance/A)
if(!..())
@@ -171,7 +179,9 @@
transmittable = -1
level = 6
passive_message = "You feel tingling on your skin as light passes over it."
- threshold_desc = "Stage Speed 8: Doubles healing speed."
+ threshold_descs = list(
+ "Stage Speed 8" = "Doubles healing speed.",
+ )
/datum/symptom/heal/darkness/Start(datum/disease/advance/A)
if(!..())
@@ -220,8 +230,11 @@
passive_message = "The pain from your wounds makes you feel oddly sleepy..."
var/deathgasp = FALSE
var/active_coma = FALSE //to prevent multiple coma procs
- threshold_desc = "Stealth 2: Host appears to die when falling into a coma.
\
- Stage Speed 7: Increases healing speed."
+ threshold_descs = list(
+ "Stealth 2" = "Host appears to die when falling into a coma.",
+ "Resistance 4" = "The virus also stabilizes the host while they are in critical condition.",
+ "Stage Speed 7" = "Increases healing speed.",
+ )
/datum/symptom/heal/coma/Start(datum/disease/advance/A)
if(!..())
@@ -294,8 +307,10 @@
level = 6
passive_message = "Your skin feels oddly dry..."
var/absorption_coeff = 1
- threshold_desc = "Resistance 5: Water is consumed at a much slower rate.
\
- Stage Speed 7: Increases healing speed."
+ threshold_descs = list(
+ "Resistance 5" = "Water is consumed at a much slower rate.",
+ "Stage Speed 7" = "Increases healing speed.",
+ )
/datum/symptom/heal/water/Start(datum/disease/advance/A)
if(!..())
@@ -350,8 +365,10 @@
level = 8
passive_message = "You feel an odd attraction to plasma."
var/temp_rate = 1
- threshold_desc = "Transmission 6: Increases temperature adjustment rate.
\
- Stage Speed 7: Increases healing speed."
+ threshold_descs = list(
+ "Transmission 6" = "Increases temperature adjustment rate.",
+ "Stage Speed 7" = "Increases healing speed.",
+ )
/datum/symptom/heal/plasma/Start(datum/disease/advance/A)
if(!..())
@@ -417,8 +434,10 @@
symptom_delay_max = 1
passive_message = "Your skin glows faintly for a moment."
var/cellular_damage = FALSE
- threshold_desc = "Transmission 6: Additionally heals cellular damage.
\
- Resistance 7: Increases healing speed."
+ threshold_descs = list(
+ "Transmission 6" = "Additionally heals cellular damage.",
+ "Resistance 7" = "Increases healing speed.",
+ )
/datum/symptom/heal/radiation/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm
index b0812e023533..174dafa18fe6 100644
--- a/code/datums/diseases/advance/symptoms/itching.dm
+++ b/code/datums/diseases/advance/symptoms/itching.dm
@@ -29,8 +29,10 @@ BONUS
symptom_delay_min = 5
symptom_delay_max = 25
var/scratch = FALSE
- threshold_desc = "Transmission 6: Increases frequency of itching.
\
- Stage Speed 7: The host will scrath itself when itching, causing superficial damage."
+ threshold_descs = list(
+ "Transmission 6" = "Increases frequency of itching.",
+ "Stage Speed 7" = "The host will scrath itself when itching, causing superficial damage.",
+ )
/datum/symptom/itching/Start(datum/disease/advance/A)
if(!..())
@@ -51,4 +53,4 @@ BONUS
var/can_scratch = scratch && !M.incapacitated() && get_location_accessible(M, picked_bodypart)
M.visible_message("[can_scratch ? "[M] scratches [M.p_their()] [bodypart.name]." : ""]", "Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]")
if(can_scratch)
- bodypart.receive_damage(0.5)
\ No newline at end of file
+ bodypart.receive_damage(0.5)
diff --git a/code/datums/diseases/advance/symptoms/nanites.dm b/code/datums/diseases/advance/symptoms/nanites.dm
index e2d1229eac7a..f15616edb153 100644
--- a/code/datums/diseases/advance/symptoms/nanites.dm
+++ b/code/datums/diseases/advance/symptoms/nanites.dm
@@ -10,8 +10,10 @@
symptom_delay_min = 1
symptom_delay_max = 1
var/reverse_boost = FALSE
- threshold_desc = "Transmission 5: Increases the virus' growth rate while nanites are present.
\
- Stage Speed 7: Increases the replication boost."
+ threshold_descs = list(
+ "Transmission 5" = "Increases the virus' growth rate while nanites are present.",
+ "Stage Speed 7" = "Increases the replication boost."
+ )
/datum/symptom/nano_boost/Start(datum/disease/advance/A)
if(!..())
@@ -42,8 +44,10 @@
symptom_delay_min = 1
symptom_delay_max = 1
var/reverse_boost = FALSE
- threshold_desc = "Stage Speed 5: Increases the virus' growth rate while nanites are present.
\
- Resistance 7: Severely increases the rate at which the nanites are destroyed."
+ threshold_descs = list(
+ "Stage Speed 5" = "Increases the virus' growth rate while nanites are present.",
+ "Resistance 7" = "Severely increases the rate at which the nanites are destroyed."
+ )
/datum/symptom/nano_destroy/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/narcolepsy.dm b/code/datums/diseases/advance/symptoms/narcolepsy.dm
index 24ba024aa6fa..356d5bc1e47d 100644
--- a/code/datums/diseases/advance/symptoms/narcolepsy.dm
+++ b/code/datums/diseases/advance/symptoms/narcolepsy.dm
@@ -26,8 +26,10 @@ Bonus
var/sleep_level = 0
var/sleepy_ticks = 0
var/stamina = FALSE
- threshold_desc = "Transmission 7: Also relaxes the muscles, weakening and slowing the host.
\
- Resistance 10: Causes narcolepsy more often, increasing the chance of the host falling asleep."
+ threshold_descs = list(
+ "Transmission 7" = "Also relaxes the muscles, weakening and slowing the host.",
+ "Resistance 10" = "Causes narcolepsy more often, increasing the chance of the host falling asleep",
+ )
/datum/symptom/narcolepsy/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm
index 5b6d53c7195f..fd8efaee7717 100644
--- a/code/datums/diseases/advance/symptoms/oxygen.dm
+++ b/code/datums/diseases/advance/symptoms/oxygen.dm
@@ -28,7 +28,9 @@ Bonus
symptom_delay_min = 1
symptom_delay_max = 1
var/regenerate_blood = FALSE
- threshold_desc = "Resistance 8:Additionally regenerates lost blood.
"
+ threshold_descs = list(
+ "Resistance 8" = "Additionally regenerates lost blood."
+ )
/datum/symptom/oxygen/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/radiation.dm b/code/datums/diseases/advance/symptoms/radiation.dm
index 2cc2af78a01a..71614e8454db 100644
--- a/code/datums/diseases/advance/symptoms/radiation.dm
+++ b/code/datums/diseases/advance/symptoms/radiation.dm
@@ -11,8 +11,10 @@
symptom_delay_max = 30
var/fastrads = FALSE
var/radothers = FALSE
- threshold_desc = "Transmission 12: Makes the host irradiate others around them as well.
\
- Speed 8: Host takes radiation damage faster."
+ threshold_descs = list(
+ "Transmission 12" = "Makes the host irradiate others around them as well.",
+ "Speed 8" = "Host takes radiation damage faster."
+ )
/datum/symptom/radiation/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm
index 58b64ae4903c..4c1e1d4543af 100644
--- a/code/datums/diseases/advance/symptoms/sensory.dm
+++ b/code/datums/diseases/advance/symptoms/sensory.dm
@@ -11,9 +11,11 @@
var/purge_alcohol = FALSE
var/trauma_heal_mild = FALSE
var/trauma_heal_severe = FALSE
- threshold_desc = "Resistance 6: Heals minor brain traumas.
\
- Resistance 9: Heals severe brain traumas.
\
- Transmission 8: Purges alcohol in the bloodstream."
+ threshold_descs = list(
+ "Resistance 6" = "Heals minor brain traumas.",
+ "Resistance 9" = "Heals severe brain traumas.",
+ "Transmission 8" = "Purges alcohol in the bloodstream.",
+ )
/datum/symptom/mind_restoration/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm
index 741e2a1e16c7..ab9aa0e9e57b 100644
--- a/code/datums/diseases/advance/symptoms/shivering.dm
+++ b/code/datums/diseases/advance/symptoms/shivering.dm
@@ -27,8 +27,10 @@ Bonus
symptom_delay_min = 10
symptom_delay_max = 30
var/unsafe = FALSE //over the cold threshold
- threshold_desc = "Stage Speed 5: Increases cooling speed; the host can fall below safe temperature levels.
\
- Stage Speed 10: Further increases cooling speed."
+ threshold_descs = list(
+ "Stage Speed 5" = "Increases cooling speed,; the host can fall below safe temperature levels.",
+ "Stage Speed 10" = "Further increases cooling speed."
+ )
/datum/symptom/fever/Start(datum/disease/advance/A)
if(!..())
@@ -56,4 +58,4 @@ Bonus
if(unsafe)
limit = 0
M.adjust_bodytemperature(-get_cold * A.stage, limit)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index b4108cd27b46..274a81b57c15 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/advance/symptoms/sneeze.dm
@@ -27,8 +27,10 @@ Bonus
severity = 1
symptom_delay_min = 5
symptom_delay_max = 35
- threshold_desc = "Transmission 9: Increases sneezing range, spreading the virus over a larger area.
\
- Stealth 4: The symptom remains hidden until active."
+ threshold_descs = list(
+ "Transmission 9" = "Increases sneezing range, spreading the virus over 6 meter cone instead of over a 4 meter cone.",
+ "Stealth 4" = "The symptom remains hidden until active.",
+ )
/datum/symptom/sneeze/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm
index 92f6f1d9ba2d..ed93d05fd92e 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/advance/symptoms/symptoms.dm
@@ -4,7 +4,7 @@
// Buffs/Debuffs the symptom has to the overall engineered disease.
var/name = ""
var/desc = "If you see this something went very wrong." //Basic symptom description
- var/threshold_desc = "" //Description of threshold effects
+ var/threshold_descs = list() //Descriptions of threshold effects
var/stealth = 0
var/resistance = 0
var/stage_speed = 0
diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm
index b4759117d3f2..87a784e7ded9 100644
--- a/code/datums/diseases/advance/symptoms/vision.dm
+++ b/code/datums/diseases/advance/symptoms/vision.dm
@@ -29,8 +29,10 @@ Bonus
symptom_delay_min = 25
symptom_delay_max = 80
var/remove_eyes = FALSE
- threshold_desc = "Resistance 12: Weakens extraocular muscles, eventually leading to complete detachment of the eyes.
\
- Stealth 4: The symptom remains hidden until active."
+ threshold_descs = list(
+ "Resistance 12" = "Weakens extraocular muscles, eventually leading to complete detachment of the eyes.",
+ "Stealth 4" = "The symptom remains hidden until active.",
+ )
/datum/symptom/visionloss/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm
index 4403bb07d0b7..20c0a6df40d0 100644
--- a/code/datums/diseases/advance/symptoms/voice_change.dm
+++ b/code/datums/diseases/advance/symptoms/voice_change.dm
@@ -30,11 +30,11 @@ Bonus
symptom_delay_max = 120
var/scramble_language = FALSE
var/datum/language/current_language
- var/datum/language_holder/original_language
- var/datum/language_holder/mob_language
- threshold_desc = "Transmission 14: The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.
\
- Stage Speed 7: Changes voice more often.
\
- Stealth 3: The symptom remains hidden until active."
+ threshold_descs = list(
+ "Transmission 14" = "The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.",
+ "Stage Speed 7" = "Changes voice more often.",
+ "Stealth 3" = "The symptom remains hidden until active."
+ )
/datum/symptom/voice_change/Start(datum/disease/advance/A)
if(!..())
@@ -47,9 +47,6 @@ Bonus
symptom_delay_max = 85
if(A.properties["transmittable"] >= 14) //random language
scramble_language = TRUE
- var/mob/living/M = A.affected_mob
- mob_language = M.get_language_holder()
- original_language = mob_language.copy()
/datum/symptom/voice_change/Activate(datum/disease/advance/A)
if(!..())
@@ -63,12 +60,10 @@ Bonus
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.SetSpecialVoice(H.dna.species.random_name(H.gender))
- if(scramble_language)
- H.remove_language(current_language)
+ if(scramble_language && !current_language) // Last part prevents rerolling language with small amounts of cure.
current_language = pick(subtypesof(/datum/language) - /datum/language/common)
- H.grant_language(current_language)
- mob_language = H.get_language_holder()
- mob_language.only_speaks_language = current_language
+ H.add_blocked_language(subtypesof(/datum/language) - current_language, LANGUAGE_VOICECHANGE)
+ H.grant_language(current_language, TRUE, TRUE, LANGUAGE_VOICECHANGE)
/datum/symptom/voice_change/End(datum/disease/advance/A)
..()
@@ -76,10 +71,5 @@ Bonus
var/mob/living/carbon/human/H = A.affected_mob
H.UnsetSpecialVoice()
if(scramble_language)
- var/mob/living/M = A.affected_mob
- M.copy_known_languages_from(original_language, TRUE)
- mob_language = M.get_language_holder()
- mob_language.only_speaks_language = null
- M.selected_default_language = original_language
- current_language = null
- QDEL_NULL(original_language)
+ A.affected_mob.remove_blocked_language(subtypesof(/datum/language), LANGUAGE_VOICECHANGE)
+ A.affected_mob.remove_all_languages(LANGUAGE_VOICECHANGE) // In case someone managed to get more than one anyway.
diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm
index f53638bc1294..d823df53c29c 100644
--- a/code/datums/diseases/advance/symptoms/vomit.dm
+++ b/code/datums/diseases/advance/symptoms/vomit.dm
@@ -34,9 +34,11 @@ Bonus
symptom_delay_max = 80
var/vomit_blood = FALSE
var/proj_vomit = 0
- threshold_desc = "Resistance 7: Host will vomit blood, causing internal damage.
\
- Transmission 7: Host will projectile vomit, increasing vomiting range.
\
- Stealth 4: The symptom remains hidden until active."
+ threshold_descs = list(
+ "Resistance 7" = "Host will vomit blood, causing internal damage.",
+ "Transmission 7" = "Host will projectile vomit, increasing vomiting range.",
+ "Stealth 4" = "The symptom remains hidden until active."
+ )
/datum/symptom/vomit/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm
index 13472a5308dc..4f42a597e2f6 100644
--- a/code/datums/diseases/advance/symptoms/weight.dm
+++ b/code/datums/diseases/advance/symptoms/weight.dm
@@ -29,7 +29,9 @@ Bonus
base_message_chance = 100
symptom_delay_min = 15
symptom_delay_max = 45
- threshold_desc = "Stealth 4: The symptom is less noticeable."
+ threshold_descs = list(
+ "Stealth 4" = "The symptom is less noticeable."
+ )
/datum/symptom/weight_loss/Start(datum/disease/advance/A)
if(!..())
@@ -48,4 +50,4 @@ Bonus
else
to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]")
M.overeatduration = max(M.overeatduration - 100, 0)
- M.adjust_nutrition(-100)
\ No newline at end of file
+ M.adjust_nutrition(-100)
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index 17c9ed64fa56..4245e120ecd5 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -305,6 +305,11 @@
var/datum/species/old_species = dna.species
dna.species = new_race
dna.species.on_species_gain(src, old_species, pref_load)
+ if(ishuman(src))
+ qdel(language_holder)
+ var/species_holder = initial(mrace.species_language_holder)
+ language_holder = new species_holder(src)
+ update_atom_languages()
/mob/living/carbon/human/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE)
..()
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 192fc3c5b7c4..6273d46f04c7 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -81,8 +81,7 @@
/datum/mind/proc/get_language_holder()
if(!language_holder)
- var/datum/language_holder/L = current.get_language_holder(shadow=FALSE)
- language_holder = L.copy(src)
+ language_holder = new (src)
return language_holder
@@ -103,9 +102,6 @@
current.mind = null
UnregisterSignal(current, COMSIG_MOB_DEATH)
SStgui.on_transfer(current, new_character)
- if(!language_holder)
- var/datum/language_holder/mob_holder = new_character.get_language_holder(shadow = FALSE)
- language_holder = mob_holder.copy(src)
if(key)
if(new_character.key != key) //if we're transferring into a body with a key associated which is not ours
@@ -139,6 +135,7 @@
RegisterSignal(new_character, COMSIG_MOB_DEATH, .proc/set_death_time)
if(active || force_key_move)
new_character.key = key //now transfer the key to link the client to our new body
+ current.update_atom_languages()
/datum/mind/proc/set_death_time()
last_death = world.time
diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm
index 398116456f4b..b35b2f97d9b7 100644
--- a/code/datums/mutations/speech.dm
+++ b/code/datums/mutations/speech.dm
@@ -266,10 +266,10 @@
/datum/mutation/human/stoner/on_acquiring(mob/living/carbon/human/owner)
..()
- owner.grant_language(/datum/language/beachbum)
- owner.remove_language(/datum/language/common)
+ owner.grant_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_STONER)
+ owner.add_blocked_language(subtypesof(/datum/language) - /datum/language/beachbum, LANGUAGE_STONER)
/datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner)
..()
- owner.grant_language(/datum/language/common)
- owner.remove_language(/datum/language/beachbum)
\ No newline at end of file
+ owner.remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_STONER)
+ owner.remove_blocked_language(subtypesof(/datum/language) - /datum/language/beachbum, LANGUAGE_STONER)
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 709ca14092de..0dc8fbb90a21 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -574,5 +574,5 @@
/datum/quirk/sheltered/on_spawn()
var/mob/living/carbon/human/H = quirk_holder
H.remove_language(/datum/language/common)
- if(!H.can_speak_in_language(/datum/language/draconic) && !H.can_speak_in_language(/datum/language/machine))
+ if(!H.can_speak_language(/datum/language/draconic) && !H.can_speak_language(/datum/language/machine))
H.grant_language(/datum/language/japanese)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index d5a198e12c9d..504342b4014a 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -788,88 +788,92 @@
animate(src, pixel_y = initial(pixel_y), time = 10)
setMovetype(movement_type & ~FLOATING)
-/* Language procs */
-/atom/movable/proc/get_language_holder(shadow=TRUE)
- if(language_holder)
- return language_holder
- else
- language_holder = new initial_language_holder(src)
- return language_holder
+/* Language procs
+* Unless you are doing something very specific, these are the ones you want to use.
+*/
-/atom/movable/proc/grant_language(datum/language/dt, body = FALSE)
- var/datum/language_holder/H = get_language_holder(!body)
- H.grant_language(dt, body)
+/// Gets or creates the relevant language holder. For mindless atoms, gets the local one. For atom with mind, gets the mind one.
+/atom/movable/proc/get_language_holder(get_minds = TRUE)
+ if(!language_holder)
+ language_holder = new initial_language_holder(src)
+ return language_holder
+
+/// Grants the supplied language and sets omnitongue true.
+/atom/movable/proc/grant_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ATOM)
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.grant_language(language, understood, spoken, source)
+
+/// Grants every language.
+/atom/movable/proc/grant_all_languages(understood = TRUE, spoken = TRUE, grant_omnitongue = TRUE, source = LANGUAGE_MIND)
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.grant_all_languages(understood, spoken, grant_omnitongue, source)
+
+/// Removes a single language.
+/atom/movable/proc/remove_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ALL)
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.remove_language(language, understood, spoken, source)
+
+/// Removes every language and sets omnitongue false.
+/atom/movable/proc/remove_all_languages(source = LANGUAGE_ALL, remove_omnitongue = FALSE)
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.remove_all_languages(source, remove_omnitongue)
+
+/// Adds a language to the blocked language list. Use this over remove_language in cases where you will give languages back later.
+/atom/movable/proc/add_blocked_language(language, source = LANGUAGE_ATOM)
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.add_blocked_language(language, source)
+
+/// Removes a language from the blocked language list.
+/atom/movable/proc/remove_blocked_language(language, source = LANGUAGE_ATOM)
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.remove_blocked_language(language, source)
+
+/// Checks if atom has the language. If spoken is true, only checks if atom can speak the language.
+/atom/movable/proc/has_language(language, spoken = FALSE)
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.has_language(language, spoken)
+
+/// Checks if atom can speak the language.
+/atom/movable/proc/can_speak_language(language)
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.can_speak_language(language)
+
+/// Returns the result of tongue specific limitations on spoken languages.
+/atom/movable/proc/could_speak_language(language)
+ return TRUE
-/atom/movable/proc/grant_all_languages(omnitongue=FALSE)
- var/datum/language_holder/H = get_language_holder()
- H.grant_all_languages(omnitongue)
+/// Returns selected language, if it can be spoken, or finds, sets and returns a new selected language if possible.
+/atom/movable/proc/get_selected_language()
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.get_selected_language()
+/// Gets a random understood language, useful for hallucinations and such.
/atom/movable/proc/get_random_understood_language()
- var/datum/language_holder/H = get_language_holder()
- . = H.get_random_understood_language()
-
-/atom/movable/proc/remove_language(datum/language/dt, body = FALSE)
- var/datum/language_holder/H = get_language_holder(!body)
- H.remove_language(dt, body)
-
-/atom/movable/proc/remove_all_languages()
- var/datum/language_holder/H = get_language_holder()
- H.remove_all_languages()
-
-/atom/movable/proc/has_language(datum/language/dt)
- var/datum/language_holder/H = get_language_holder()
- . = H.has_language(dt)
-
-/atom/movable/proc/copy_known_languages_from(thing, replace=FALSE)
- var/datum/language_holder/H = get_language_holder()
- . = H.copy_known_languages_from(thing, replace)
-
-// Whether an AM can speak in a language or not, independent of whether
-// it KNOWS the language
-/atom/movable/proc/could_speak_in_language(datum/language/dt)
- . = TRUE
-
-/atom/movable/proc/can_speak_in_language(datum/language/dt)
- var/datum/language_holder/H = get_language_holder()
-
- if(!H.has_language(dt))
- return FALSE
- else if(H.omnitongue)
- return TRUE
- else if(could_speak_in_language(dt) && (!H.only_speaks_language || H.only_speaks_language == dt))
- return TRUE
- else
- return FALSE
-
-/atom/movable/proc/get_default_language()
- // if no language is specified, and we want to say() something, which
- // language do we use?
- var/datum/language_holder/H = get_language_holder()
-
- if(H.selected_default_language)
- if(can_speak_in_language(H.selected_default_language))
- return H.selected_default_language
- else
- H.selected_default_language = null
-
-
- var/datum/language/chosen_langtype
- var/highest_priority
-
- for(var/lt in H.languages)
- var/datum/language/langtype = lt
- if(!can_speak_in_language(langtype))
- continue
-
- var/pri = initial(langtype.default_priority)
- if(!highest_priority || (pri > highest_priority))
- chosen_langtype = langtype
- highest_priority = pri
-
- H.selected_default_language = .
- . = chosen_langtype
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.get_random_understood_language()
+
+/// Gets a random spoken language, useful for forced speech and such.
+/atom/movable/proc/get_random_spoken_language()
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.get_random_spoken_language()
+
+/// Copies all languages into the supplied atom/language holder. Source should be overridden when you
+/// do not want the language overwritten by later atom updates or want to avoid blocked languages.
+/atom/movable/proc/copy_languages(from_holder, source_override)
+ if(isatom(from_holder))
+ var/atom/movable/thing = from_holder
+ from_holder = thing.get_language_holder()
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.copy_languages(from_holder, source_override)
+
+/// Empties out the atom specific languages and updates them according to the current atoms language holder.
+/// As a side effect, it also creates missing language holders in the process.
+/atom/movable/proc/update_atom_languages()
+ var/datum/language_holder/LH = get_language_holder()
+ return LH.update_atom_languages(src)
/* End language procs */
+
/atom/movable/proc/ConveyorMove(movedir)
set waitfor = FALSE
if(!anchored && has_gravity())
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 841c0648a07b..9482d903a476 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -38,7 +38,6 @@
return
return ..()
-
/obj/machinery/computer/bank_machine/process()
..()
if(siphoning)
@@ -60,34 +59,39 @@
radio.talk_into(src, message, radio_channel)
next_warning = world.time + minimum_time_between_warnings
-/obj/machinery/computer/bank_machine/ui_interact(mob/user)
- . = ..()
+/obj/machinery/computer/bank_machine/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "bank_machine", name, 320, 165, master_ui, state)
+ ui.open()
- var/dat = "[station_name()] secure vault. Authorized personnel only.
"
+/obj/machinery/computer/bank_machine/ui_data(mob/user)
+ var/list/data = list()
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
+
if(D)
- dat += "Current Balance: $[D.account_balance]
"
- if(!siphoning)
- dat += "Siphon Credits
"
+ data["current_balance"] = D.account_balance
else
- dat += "Halt Credit Siphon
"
+ data["current_balance"] = 0
+ data["siphoning"] = siphoning
+ data["station_name"] = station_name()
- dat += "Close"
+ return data
- var/datum/browser/popup = new(user, "computer", "Bank Vault", 300, 200)
- popup.set_content("