diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 8ae4e5c167..7cef577226 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -1,107 +1,114 @@
-// channel numbers for power
-#define EQUIP 1
-#define LIGHT 2
-#define ENVIRON 3
-#define TOTAL 4 //for total power used only
-#define STATIC_EQUIP 5
-#define STATIC_LIGHT 6
-#define STATIC_ENVIRON 7
-
-//Power use
-#define NO_POWER_USE 0
-#define IDLE_POWER_USE 1
-#define ACTIVE_POWER_USE 2
-
-
-//bitflags for door switches.
-#define OPEN (1<<0)
-#define IDSCAN (1<<1)
-#define BOLTS (1<<2)
-#define SHOCK (1<<3)
-#define SAFE (1<<4)
-
-//used in design to specify which machine can build it
-#define IMPRINTER (1<<0) //For circuits. Uses glass/chemicals.
-#define PROTOLATHE (1<<1) //New stuff. Uses glass/metal/chemicals
-#define AUTOLATHE (1<<2) //Uses glass/metal only.
-#define CRAFTLATHE (1<<3) //Uses fuck if I know. For use eventually.
-#define MECHFAB (1<<4) //Remember, objects utilising this flag should have construction_time and construction_cost vars.
-#define BIOGENERATOR (1<<5) //Uses biomass
-#define LIMBGROWER (1<<6) //Uses synthetic flesh
-#define SMELTER (1<<7) //uses various minerals
-#define AUTOYLATHE (1<<8) // CITADEL ADD
-#define NANITE_COMPILER (1<<9) //Prints nanite disks
-#define AUTOBOTTLER (1<<10) //Uses booze, for printing
-//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
-
-//Modular computer/NTNet defines
-
-//Modular computer part defines
-#define MC_CPU "CPU"
-#define MC_HDD "HDD"
-#define MC_SDD "SDD"
-#define MC_CARD "CARD"
-#define MC_NET "NET"
-#define MC_PRINT "PRINT"
-#define MC_CELL "CELL"
-#define MC_CHARGE "CHARGE"
-#define MC_AI "AI"
-
-//NTNet stuff, for modular computers
- // NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc)
-#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet
-#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices
-#define NTNET_COMMUNICATION 3 // Communication (messaging)
-#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc.
-
-//NTNet transfer speeds, used when downloading/uploading a file/program.
-#define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal
-#define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal
-#define NTNETSPEED_ETHERNET 2 // GQ/s transfer speed when the device is using wired connection
-
-//Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it.
-#define MAX_NTNET_LOGS 300
-#define MIN_NTNET_LOGS 10
-
-//Program bitflags
-#define PROGRAM_ALL (~0)
-#define PROGRAM_CONSOLE (1<<0)
-#define PROGRAM_LAPTOP (1<<1)
-#define PROGRAM_TABLET (1<<2)
-//Program states
-#define PROGRAM_STATE_KILLED 0
-#define PROGRAM_STATE_BACKGROUND 1
-#define PROGRAM_STATE_ACTIVE 2
-
-#define FIREDOOR_OPEN 1
-#define FIREDOOR_CLOSED 2
-
-
-
-// These are used by supermatter and supermatter monitor program, mostly for UI updating purposes. Higher should always be worse!
-#define SUPERMATTER_ERROR -1 // Unknown status, shouldn't happen but just in case.
-#define SUPERMATTER_INACTIVE 0 // No or minimal energy
-#define SUPERMATTER_NORMAL 1 // Normal operation
-#define SUPERMATTER_NOTIFY 2 // Ambient temp > 80% of CRITICAL_TEMPERATURE
-#define SUPERMATTER_WARNING 3 // Ambient temp > CRITICAL_TEMPERATURE OR integrity damaged
-#define SUPERMATTER_DANGER 4 // Integrity < 50%
-#define SUPERMATTER_EMERGENCY 5 // Integrity < 25%
-#define SUPERMATTER_DELAMINATING 6 // Pretty obvious.
-
-//Nuclear bomb stuff
-#define NUKESTATE_INTACT 5
-#define NUKESTATE_UNSCREWED 4
-#define NUKESTATE_PANEL_REMOVED 3
-#define NUKESTATE_WELDED 2
-#define NUKESTATE_CORE_EXPOSED 1
-#define NUKESTATE_CORE_REMOVED 0
-
-#define NUKE_OFF_LOCKED 0
-#define NUKE_OFF_UNLOCKED 1
-#define NUKE_ON_TIMING 2
-#define NUKE_ON_EXPLODING 3
-
-
-//these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified.
-#define PLANT_GENE_REMOVABLE (1<<0)
+// channel numbers for power
+#define EQUIP 1
+#define LIGHT 2
+#define ENVIRON 3
+#define TOTAL 4 //for total power used only
+#define STATIC_EQUIP 5
+#define STATIC_LIGHT 6
+#define STATIC_ENVIRON 7
+
+//Power use
+#define NO_POWER_USE 0
+#define IDLE_POWER_USE 1
+#define ACTIVE_POWER_USE 2
+
+
+//bitflags for door switches.
+#define OPEN (1<<0)
+#define IDSCAN (1<<1)
+#define BOLTS (1<<2)
+#define SHOCK (1<<3)
+#define SAFE (1<<4)
+
+//used in design to specify which machine can build it
+#define IMPRINTER (1<<0) //For circuits. Uses glass/chemicals.
+#define PROTOLATHE (1<<1) //New stuff. Uses glass/metal/chemicals
+#define AUTOLATHE (1<<2) //Uses glass/metal only.
+#define CRAFTLATHE (1<<3) //Uses fuck if I know. For use eventually.
+#define MECHFAB (1<<4) //Remember, objects utilising this flag should have construction_time and construction_cost vars.
+#define BIOGENERATOR (1<<5) //Uses biomass
+#define LIMBGROWER (1<<6) //Uses synthetic flesh
+#define SMELTER (1<<7) //uses various minerals
+#define AUTOYLATHE (1<<8) // CITADEL ADD
+#define NANITE_COMPILER (1<<9) //Prints nanite disks
+#define AUTOBOTTLER (1<<10) //Uses booze, for printing
+//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
+
+//Modular computer/NTNet defines
+
+//Modular computer part defines
+#define MC_CPU "CPU"
+#define MC_HDD "HDD"
+#define MC_SDD "SDD"
+#define MC_CARD "CARD"
+#define MC_NET "NET"
+#define MC_PRINT "PRINT"
+#define MC_CELL "CELL"
+#define MC_CHARGE "CHARGE"
+#define MC_AI "AI"
+
+//NTNet stuff, for modular computers
+ // NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc)
+#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet
+#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices
+#define NTNET_COMMUNICATION 3 // Communication (messaging)
+#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc.
+
+//NTNet transfer speeds, used when downloading/uploading a file/program.
+#define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal
+#define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal
+#define NTNETSPEED_ETHERNET 2 // GQ/s transfer speed when the device is using wired connection
+
+//Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it.
+#define MAX_NTNET_LOGS 300
+#define MIN_NTNET_LOGS 10
+
+//Program bitflags
+#define PROGRAM_ALL (~0)
+#define PROGRAM_CONSOLE (1<<0)
+#define PROGRAM_LAPTOP (1<<1)
+#define PROGRAM_TABLET (1<<2)
+//Program states
+#define PROGRAM_STATE_KILLED 0
+#define PROGRAM_STATE_BACKGROUND 1
+#define PROGRAM_STATE_ACTIVE 2
+
+#define FIREDOOR_OPEN 1
+#define FIREDOOR_CLOSED 2
+
+
+
+// These are used by supermatter and supermatter monitor program, mostly for UI updating purposes. Higher should always be worse!
+#define SUPERMATTER_ERROR -1 // Unknown status, shouldn't happen but just in case.
+#define SUPERMATTER_INACTIVE 0 // No or minimal energy
+#define SUPERMATTER_NORMAL 1 // Normal operation
+#define SUPERMATTER_NOTIFY 2 // Ambient temp > 80% of CRITICAL_TEMPERATURE
+#define SUPERMATTER_WARNING 3 // Ambient temp > CRITICAL_TEMPERATURE OR integrity damaged
+#define SUPERMATTER_DANGER 4 // Integrity < 50%
+#define SUPERMATTER_EMERGENCY 5 // Integrity < 25%
+#define SUPERMATTER_DELAMINATING 6 // Pretty obvious.
+
+//Nuclear bomb stuff
+#define NUKESTATE_INTACT 5
+#define NUKESTATE_UNSCREWED 4
+#define NUKESTATE_PANEL_REMOVED 3
+#define NUKESTATE_WELDED 2
+#define NUKESTATE_CORE_EXPOSED 1
+#define NUKESTATE_CORE_REMOVED 0
+
+#define NUKEUI_AWAIT_DISK 0
+#define NUKEUI_AWAIT_CODE 1
+#define NUKEUI_AWAIT_TIMER 2
+#define NUKEUI_AWAIT_ARM 3
+#define NUKEUI_TIMING 4
+#define NUKEUI_EXPLODED 5
+
+#define NUKE_OFF_LOCKED 0
+#define NUKE_OFF_UNLOCKED 1
+#define NUKE_ON_TIMING 2
+#define NUKE_ON_EXPLODING 3
+
+
+//these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified.
+#define PLANT_GENE_REMOVABLE (1<<0)
#define PLANT_GENE_EXTRACTABLE (1<<1)
\ No newline at end of file
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index 4dd590d9a1..36d27ba73a 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -165,6 +165,11 @@
/proc/start_log(log)
WRITE_LOG(log, "Starting up round ID [GLOB.round_id].\n-------------------------")
+/* ui logging */
+
+/proc/log_tgui(text)
+ WRITE_LOG(GLOB.tgui_log, text)
+
/* Close open log handles. This should be called as late as possible, and no logging should hapen after. */
/proc/shutdown_logging()
rustg_log_close_all()
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 74c32dd52f..39f3ae3614 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1547,3 +1547,47 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
return -1
else
return 0
+
+// Converts browser keycodes to BYOND keycodes.
+/proc/browser_keycode_to_byond(keycode)
+ keycode = text2num(keycode)
+ switch(keycode)
+ // letters and numbers
+ if(65 to 90, 48 to 57)
+ return ascii2text(keycode)
+ if(17)
+ return "Ctrl"
+ if(18)
+ return "Alt"
+ if(16)
+ return "Shift"
+ if(37)
+ return "West"
+ if(38)
+ return "North"
+ if(39)
+ return "East"
+ if(40)
+ return "South"
+ if(45)
+ return "Insert"
+ if(46)
+ return "Delete"
+ if(36)
+ return "Northwest"
+ if(35)
+ return "Southwest"
+ if(33)
+ return "Northeast"
+ if(34)
+ return "Southeast"
+ if(112 to 123)
+ return "F[keycode-111]"
+ if(96 to 105)
+ return "Numpad[keycode-96]"
+ if(188)
+ return ","
+ if(190)
+ return "."
+ if(189)
+ return "-"
\ No newline at end of file
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index 2a97c596b2..dc8a6799cf 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -1,64 +1,67 @@
-GLOBAL_VAR(log_directory)
-GLOBAL_PROTECT(log_directory)
-GLOBAL_VAR(world_game_log)
-GLOBAL_PROTECT(world_game_log)
-GLOBAL_VAR(world_runtime_log)
-GLOBAL_PROTECT(world_runtime_log)
-GLOBAL_VAR(world_qdel_log)
-GLOBAL_PROTECT(world_qdel_log)
-GLOBAL_VAR(world_attack_log)
-GLOBAL_PROTECT(world_attack_log)
-GLOBAL_VAR(world_href_log)
-GLOBAL_PROTECT(world_href_log)
-GLOBAL_VAR(round_id)
-GLOBAL_PROTECT(round_id)
-GLOBAL_VAR(config_error_log)
-GLOBAL_PROTECT(config_error_log)
-GLOBAL_VAR(sql_error_log)
-GLOBAL_PROTECT(sql_error_log)
-GLOBAL_VAR(world_pda_log)
-GLOBAL_PROTECT(world_pda_log)
-GLOBAL_VAR(world_telecomms_log)
-GLOBAL_PROTECT(world_telecomms_log)
-GLOBAL_VAR(world_manifest_log)
-GLOBAL_PROTECT(world_manifest_log)
-GLOBAL_VAR(query_debug_log)
-GLOBAL_PROTECT(query_debug_log)
-GLOBAL_VAR(world_job_debug_log)
-GLOBAL_PROTECT(world_job_debug_log)
-GLOBAL_VAR(world_virus_log)
-GLOBAL_PROTECT(world_virus_log)
-GLOBAL_VAR(world_map_error_log)
-GLOBAL_PROTECT(world_map_error_log)
-GLOBAL_VAR(subsystem_log)
-GLOBAL_PROTECT(subsystem_log)
-
-GLOBAL_LIST_EMPTY(bombers)
-GLOBAL_PROTECT(bombers)
-GLOBAL_LIST_EMPTY(admin_log)
-GLOBAL_PROTECT(admin_log)
-GLOBAL_LIST_EMPTY(lastsignalers) //keeps last 100 signals here in format: "[src] used [REF(src)] @ location [src.loc]: [freq]/[code]"
-GLOBAL_PROTECT(lastsignalers)
-GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
-GLOBAL_PROTECT(lawchanges)
-
-GLOBAL_LIST_EMPTY(combatlog)
-GLOBAL_PROTECT(combatlog)
-GLOBAL_LIST_EMPTY(IClog)
-GLOBAL_PROTECT(IClog)
-GLOBAL_LIST_EMPTY(OOClog)
-GLOBAL_PROTECT(OOClog)
-GLOBAL_LIST_EMPTY(adminlog)
-GLOBAL_PROTECT(adminlog)
-
-GLOBAL_LIST_EMPTY(active_turfs_startlist)
-
-/////Picture logging
-GLOBAL_VAR(picture_log_directory)
-GLOBAL_PROTECT(picture_log_directory)
-
-GLOBAL_VAR_INIT(picture_logging_id, 1)
-GLOBAL_PROTECT(picture_logging_id)
-GLOBAL_VAR(picture_logging_prefix)
-GLOBAL_PROTECT(picture_logging_prefix)
-/////
+GLOBAL_VAR(log_directory)
+GLOBAL_PROTECT(log_directory)
+GLOBAL_VAR(world_game_log)
+GLOBAL_PROTECT(world_game_log)
+GLOBAL_VAR(world_runtime_log)
+GLOBAL_PROTECT(world_runtime_log)
+GLOBAL_VAR(world_qdel_log)
+GLOBAL_PROTECT(world_qdel_log)
+GLOBAL_VAR(world_attack_log)
+GLOBAL_PROTECT(world_attack_log)
+GLOBAL_VAR(world_href_log)
+GLOBAL_PROTECT(world_href_log)
+GLOBAL_VAR(round_id)
+GLOBAL_PROTECT(round_id)
+GLOBAL_VAR(config_error_log)
+GLOBAL_PROTECT(config_error_log)
+GLOBAL_VAR(sql_error_log)
+GLOBAL_PROTECT(sql_error_log)
+GLOBAL_VAR(world_pda_log)
+GLOBAL_PROTECT(world_pda_log)
+GLOBAL_VAR(world_telecomms_log)
+GLOBAL_PROTECT(world_telecomms_log)
+GLOBAL_VAR(world_manifest_log)
+GLOBAL_PROTECT(world_manifest_log)
+GLOBAL_VAR(query_debug_log)
+GLOBAL_PROTECT(query_debug_log)
+GLOBAL_VAR(world_job_debug_log)
+GLOBAL_PROTECT(world_job_debug_log)
+GLOBAL_VAR(world_virus_log)
+GLOBAL_PROTECT(world_virus_log)
+GLOBAL_VAR(world_map_error_log)
+GLOBAL_PROTECT(world_map_error_log)
+GLOBAL_VAR(subsystem_log)
+GLOBAL_PROTECT(subsystem_log)
+
+GLOBAL_LIST_EMPTY(bombers)
+GLOBAL_PROTECT(bombers)
+GLOBAL_LIST_EMPTY(admin_log)
+GLOBAL_PROTECT(admin_log)
+GLOBAL_LIST_EMPTY(lastsignalers) //keeps last 100 signals here in format: "[src] used [REF(src)] @ location [src.loc]: [freq]/[code]"
+GLOBAL_PROTECT(lastsignalers)
+GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
+GLOBAL_PROTECT(lawchanges)
+
+GLOBAL_VAR(tgui_log)
+GLOBAL_PROTECT(tgui_log)
+
+GLOBAL_LIST_EMPTY(combatlog)
+GLOBAL_PROTECT(combatlog)
+GLOBAL_LIST_EMPTY(IClog)
+GLOBAL_PROTECT(IClog)
+GLOBAL_LIST_EMPTY(OOClog)
+GLOBAL_PROTECT(OOClog)
+GLOBAL_LIST_EMPTY(adminlog)
+GLOBAL_PROTECT(adminlog)
+
+GLOBAL_LIST_EMPTY(active_turfs_startlist)
+
+/////Picture logging
+GLOBAL_VAR(picture_log_directory)
+GLOBAL_PROTECT(picture_log_directory)
+
+GLOBAL_VAR_INIT(picture_logging_id, 1)
+GLOBAL_PROTECT(picture_logging_id)
+GLOBAL_VAR(picture_logging_prefix)
+GLOBAL_PROTECT(picture_logging_prefix)
+/////
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 2a8289697b..ec4784bd1f 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -140,10 +140,7 @@
if(obj_flags & EMAGGED)
return
- if(locked)
- bolt_raise(usr)
- else
- bolt_drop(usr)
+ toggle_bolt(usr)
/obj/machinery/door/airlock/AIAltClick() // Eletrifies doors.
if(obj_flags & EMAGGED)
@@ -165,10 +162,7 @@
if(obj_flags & EMAGGED)
return
- if(!emergency)
- emergency_on(usr)
- else
- emergency_off(usr)
+ toggle_emergency(usr)
/* APC */
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm
index b10d0af8c5..dacbac409d 100644
--- a/code/controllers/subsystem/tgui.dm
+++ b/code/controllers/subsystem/tgui.dm
@@ -11,7 +11,7 @@ SUBSYSTEM_DEF(tgui)
var/basehtml // The HTML base used for all UIs.
/datum/controller/subsystem/tgui/PreInit()
- basehtml = file2text('tgui/tgui.html')
+ basehtml = file2text('tgui-next/packages/tgui/public/tgui-main.html')
/datum/controller/subsystem/tgui/Shutdown()
close_all_uis()
diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm
index 2c3b7518ba..07bdacdc7e 100644
--- a/code/datums/components/uplink.dm
+++ b/code/datums/components/uplink.dm
@@ -25,6 +25,7 @@ GLOBAL_LIST_EMPTY(uplinks)
var/unlock_code
var/failsafe_code
var/datum/ui_state/checkstate
+ var/compact_mode = FALSE
/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20, datum/ui_state/_checkstate)
if(!isitem(parent))
@@ -121,7 +122,7 @@ GLOBAL_LIST_EMPTY(uplinks)
active = TRUE
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "uplink", name, 450, 750, master_ui, state)
+ ui = new(user, src, ui_key, "uplink", name, 620, 580, master_ui, state)
ui.set_autoupdate(FALSE) // This UI is only ever opened by one person, and never is updated outside of user input.
ui.set_style("syndicate")
ui.open()
@@ -138,22 +139,25 @@ GLOBAL_LIST_EMPTY(uplinks)
var/list/data = list()
data["telecrystals"] = telecrystals
data["lockable"] = lockable
+ data["compact_mode"] = compact_mode
+ return data
+/datum/component/uplink/ui_static_data(mob/user)
+ var/list/data = list()
data["categories"] = list()
for(var/category in uplink_items)
var/list/cat = list(
"name" = category,
"items" = (category == selected_cat ? list() : null))
- if(category == selected_cat)
- for(var/item in uplink_items[category])
- var/datum/uplink_item/I = uplink_items[category][item]
- if(I.limited_stock == 0)
- continue
- if(I.restricted_roles.len)
- var/is_inaccessible = 1
- for(var/R in I.restricted_roles)
- if(R == user.mind.assigned_role)
- is_inaccessible = 0
+ for(var/item in uplink_items[category])
+ var/datum/uplink_item/I = uplink_items[category][item]
+ if(I.limited_stock == 0)
+ continue
+ if(I.restricted_roles.len)
+ var/is_inaccessible = TRUE
+ for(var/R in I.restricted_roles)
+ if(R == user.mind.assigned_role)
+ is_inaccessible = FALSE
if(is_inaccessible)
continue
cat["items"] += list(list(
@@ -188,6 +192,8 @@ GLOBAL_LIST_EMPTY(uplinks)
SStgui.close_uis(src)
if("select")
selected_cat = params["category"]
+ if("compact_toggle")
+ compact_mode = !compact_mode
return TRUE
/datum/component/uplink/proc/MakePurchase(mob/user, datum/uplink_item/U)
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index 559d8f4754..a9776384f6 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -1,148 +1,152 @@
-/*
-//////////////////////////////////////
-
-Choking
-
- Very very noticable.
- Lowers resistance.
- Decreases stage speed.
- Decreases transmittablity tremendously.
- Moderate Level.
-
-Bonus
- Inflicts spikes of oxyloss
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/choking
-
- name = "Choking"
- desc = "The virus causes inflammation of the host's air conduits, leading to intermittent choking."
- stealth = -3
- resistance = -2
- stage_speed = -2
- transmittable = -4
- level = 3
- severity = 3
- 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."
-
-/datum/symptom/choking/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 8)
- symptom_delay_min = 7
- symptom_delay_max = 24
- if(A.properties["stealth"] >= 4)
- suppress_warning = TRUE
-
-/datum/symptom/choking/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2)
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]")
- if(3, 4)
- if(!suppress_warning)
- to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]")
- else
- to_chat(M, "You feel very [pick("dizzy","woozy","faint")].") //fake bloodloss messages
- Choke_stage_3_4(M, A)
- M.emote("gasp")
- else
- to_chat(M, "[pick("You're choking!", "You can't breathe!")]")
- Choke(M, A)
- M.emote("gasp")
-
-/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
- M.adjustOxyLoss(rand(6,13))
- return 1
-
-/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
- M.adjustOxyLoss(rand(10,18))
- return 1
-
-/*
-//////////////////////////////////////
-
-Asphyxiation
-
- Very very noticable.
- Decreases stage speed.
- Decreases transmittablity.
-
-Bonus
- Inflicts large spikes of oxyloss
- Introduces Asphyxiating drugs to the system
- Causes cardiac arrest on dying victims.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/asphyxiation
-
- name = "Acute respiratory distress syndrome"
- desc = "The virus causes shrinking of the host's lungs, causing severe asphyxiation. May also lead to heart attacks."
- stealth = -2
- resistance = -0
- stage_speed = -1
- transmittable = -2
- level = 7
- severity = 6
- base_message_chance = 15
- 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."
-
-
-/datum/symptom/asphyxiation/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 8)
- paralysis = TRUE
- if(A.properties["transmittable"] >= 8)
- power = 2
-
-/datum/symptom/asphyxiation/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(3, 4)
- to_chat(M, "[pick("Your windpipe feels thin.", "Your lungs feel small.")]")
- Asphyxiate_stage_3_4(M, A)
- M.emote("gasp")
- if(5)
- to_chat(M, "[pick("Your lungs hurt!", "It hurts to breathe!")]")
- Asphyxiate(M, A)
- M.emote("gasp")
- if(M.getOxyLoss() >= 120)
- M.visible_message("[M] stops breathing, as if their lungs have totally collapsed!")
- Asphyxiate_death(M, A)
- return
-
-/datum/symptom/asphyxiation/proc/Asphyxiate_stage_3_4(mob/living/M, datum/disease/advance/A)
- var/get_damage = rand(10,15) * power
- M.adjustOxyLoss(get_damage)
- return 1
-
-/datum/symptom/asphyxiation/proc/Asphyxiate(mob/living/M, datum/disease/advance/A)
- var/get_damage = rand(15,21) * power
- M.adjustOxyLoss(get_damage)
- if(paralysis)
- M.reagents.add_reagent_list(list(/datum/reagent/toxin/pancuronium = 3, /datum/reagent/toxin/sodium_thiopental = 3))
- return 1
-
-/datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A)
- var/get_damage = rand(25,35) * power
- M.adjustOxyLoss(get_damage)
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, get_damage/2)
- return 1
+/*
+//////////////////////////////////////
+
+Choking
+
+ Very very noticable.
+ Lowers resistance.
+ Decreases stage speed.
+ Decreases transmittablity tremendously.
+ Moderate Level.
+
+Bonus
+ Inflicts spikes of oxyloss
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/choking
+
+ name = "Choking"
+ desc = "The virus causes inflammation of the host's air conduits, leading to intermittent choking."
+ stealth = -3
+ resistance = -2
+ stage_speed = -2
+ transmittable = -4
+ level = 3
+ severity = 3
+ base_message_chance = 15
+ symptom_delay_min = 10
+ symptom_delay_max = 30
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stage_rate"] >= 8)
+ symptom_delay_min = 7
+ symptom_delay_max = 24
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+
+/datum/symptom/choking/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2)
+ if(prob(base_message_chance) && !suppress_warning)
+ to_chat(M, "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]")
+ if(3, 4)
+ if(!suppress_warning)
+ to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]")
+ else
+ to_chat(M, "You feel very [pick("dizzy","woozy","faint")].") //fake bloodloss messages
+ Choke_stage_3_4(M, A)
+ M.emote("gasp")
+ else
+ to_chat(M, "[pick("You're choking!", "You can't breathe!")]")
+ Choke(M, A)
+ M.emote("gasp")
+
+/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
+ M.adjustOxyLoss(rand(6,13))
+ return 1
+
+/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
+ M.adjustOxyLoss(rand(10,18))
+ return 1
+
+/*
+//////////////////////////////////////
+
+Asphyxiation
+
+ Very very noticable.
+ Decreases stage speed.
+ Decreases transmittablity.
+
+Bonus
+ Inflicts large spikes of oxyloss
+ Introduces Asphyxiating drugs to the system
+ Causes cardiac arrest on dying victims.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/asphyxiation
+
+ name = "Acute respiratory distress syndrome"
+ desc = "The virus causes shrinking of the host's lungs, causing severe asphyxiation. May also lead to heart attacks."
+ stealth = -2
+ resistance = -0
+ stage_speed = -1
+ transmittable = -2
+ level = 7
+ severity = 6
+ base_message_chance = 15
+ symptom_delay_min = 14
+ symptom_delay_max = 30
+ var/paralysis = FALSE
+ threshold_desc = 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)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 8)
+ paralysis = TRUE
+ if(A.properties["transmittable"] >= 8)
+ power = 2
+
+/datum/symptom/asphyxiation/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(3, 4)
+ to_chat(M, "[pick("Your windpipe feels thin.", "Your lungs feel small.")]")
+ Asphyxiate_stage_3_4(M, A)
+ M.emote("gasp")
+ if(5)
+ to_chat(M, "[pick("Your lungs hurt!", "It hurts to breathe!")]")
+ Asphyxiate(M, A)
+ M.emote("gasp")
+ if(M.getOxyLoss() >= 120)
+ M.visible_message("[M] stops breathing, as if their lungs have totally collapsed!")
+ Asphyxiate_death(M, A)
+ return
+
+/datum/symptom/asphyxiation/proc/Asphyxiate_stage_3_4(mob/living/M, datum/disease/advance/A)
+ var/get_damage = rand(10,15) * power
+ M.adjustOxyLoss(get_damage)
+ return 1
+
+/datum/symptom/asphyxiation/proc/Asphyxiate(mob/living/M, datum/disease/advance/A)
+ var/get_damage = rand(15,21) * power
+ M.adjustOxyLoss(get_damage)
+ if(paralysis)
+ M.reagents.add_reagent_list(list(/datum/reagent/toxin/pancuronium = 3, /datum/reagent/toxin/sodium_thiopental = 3))
+ return 1
+
+/datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A)
+ var/get_damage = rand(25,35) * power
+ M.adjustOxyLoss(get_damage)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, get_damage/2)
+ return 1
diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm
index eb6c5342f9..fa6494cd83 100644
--- a/code/datums/diseases/advance/symptoms/confusion.dm
+++ b/code/datums/diseases/advance/symptoms/confusion.dm
@@ -1,61 +1,63 @@
-/*
-//////////////////////////////////////
-
-Confusion
-
- Little bit hidden.
- Lowers resistance.
- Decreases stage speed.
- Not very transmissibile.
- Intense Level.
-
-Bonus
- Makes the affected mob be confused for short periods of time.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/confusion
-
- name = "Confusion"
- desc = "The virus interferes with the proper function of the neural system, leading to bouts of confusion and erratic movement."
- stealth = 1
- resistance = -1
- stage_speed = -3
- transmittable = 0
- level = 4
- severity = 2
- base_message_chance = 25
- 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."
-
-/datum/symptom/confusion/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["resistance"] >= 6)
- brain_damage = TRUE
- if(A.properties["transmittable"] >= 6)
- power = 1.5
- if(A.properties["stealth"] >= 4)
- suppress_warning = TRUE
-
-/datum/symptom/confusion/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3, 4)
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("Your head hurts.", "Your mind blanks for a moment.")]")
- else
- to_chat(M, "You can't think straight!")
- M.confused = min(100 * power, M.confused + 8)
- if(brain_damage)
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * power, 80)
- M.updatehealth()
-
- return
+/*
+//////////////////////////////////////
+
+Confusion
+
+ Little bit hidden.
+ Lowers resistance.
+ Decreases stage speed.
+ Not very transmissibile.
+ Intense Level.
+
+Bonus
+ Makes the affected mob be confused for short periods of time.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/confusion
+
+ name = "Confusion"
+ desc = "The virus interferes with the proper function of the neural system, leading to bouts of confusion and erratic movement."
+ stealth = 1
+ resistance = -1
+ stage_speed = -3
+ transmittable = 0
+ level = 4
+ severity = 2
+ base_message_chance = 25
+ symptom_delay_min = 10
+ symptom_delay_max = 30
+ var/brain_damage = FALSE
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["resistance"] >= 6)
+ brain_damage = TRUE
+ if(A.properties["transmittable"] >= 6)
+ power = 1.5
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+
+/datum/symptom/confusion/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3, 4)
+ if(prob(base_message_chance) && !suppress_warning)
+ to_chat(M, "[pick("Your head hurts.", "Your mind blanks for a moment.")]")
+ else
+ to_chat(M, "You can't think straight!")
+ M.confused = min(100 * power, M.confused + 8)
+ if(brain_damage)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * power, 80)
+ M.updatehealth()
+
+ return
diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm
index b1767d7cb5..c3144fb6ff 100644
--- a/code/datums/diseases/advance/symptoms/cough.dm
+++ b/code/datums/diseases/advance/symptoms/cough.dm
@@ -1,75 +1,76 @@
-/*
-//////////////////////////////////////
-
-Coughing
-
- Noticable.
- Little Resistance.
- Doesn't increase stage speed much.
- Transmissibile.
- Low Level.
-
-BONUS
- Will force the affected mob to drop small items!
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/cough
-
- name = "Cough"
- desc = "The virus irritates the throat of the host, causing occasional coughing."
- stealth = -1
- resistance = 3
- stage_speed = 1
- transmittable = 2
- level = 1
- severity = 1
- base_message_chance = 15
- 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."
-
-/datum/symptom/cough/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 4)
- suppress_warning = TRUE
- if(A.spread_flags &= DISEASE_SPREAD_AIRBORNE) //infect bystanders
- infective = TRUE
- if(A.properties["resistance"] >= 3) //strong enough to drop items
- power = 1.5
- if(A.properties["resistance"] >= 10) //strong enough to stun (rarely)
- power = 2
- if(A.properties["stage_rate"] >= 6) //cough more often
- symptom_delay_max = 10
-
-/datum/symptom/cough/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3)
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("You swallow excess mucus.", "You lightly cough.")]")
- else
- M.emote("cough")
- if(power >= 1.5)
- var/obj/item/I = M.get_active_held_item()
- if(I && I.w_class == WEIGHT_CLASS_TINY)
- M.dropItemToGround(I)
- if(power >= 2 && prob(10))
- to_chat(M, "[pick("You have a coughing fit!", "You can't stop coughing!")]")
- M.Stun(20)
- M.emote("cough")
- addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6)
- addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12)
- addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18)
- if(infective && M.CanSpreadAirborneDisease())
- A.spread(1)
-
+/*
+//////////////////////////////////////
+
+Coughing
+
+ Noticable.
+ Little Resistance.
+ Doesn't increase stage speed much.
+ Transmissibile.
+ Low Level.
+
+BONUS
+ Will force the affected mob to drop small items!
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/cough
+
+ name = "Cough"
+ desc = "The virus irritates the throat of the host, causing occasional coughing."
+ stealth = -1
+ resistance = 3
+ stage_speed = 1
+ transmittable = 2
+ level = 1
+ severity = 1
+ base_message_chance = 15
+ symptom_delay_min = 2
+ symptom_delay_max = 15
+ var/infective = FALSE
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+ if(A.spread_flags &= DISEASE_SPREAD_AIRBORNE) //infect bystanders
+ infective = TRUE
+ if(A.properties["resistance"] >= 3) //strong enough to drop items
+ power = 1.5
+ if(A.properties["resistance"] >= 10) //strong enough to stun (rarely)
+ power = 2
+ if(A.properties["stage_rate"] >= 6) //cough more often
+ symptom_delay_max = 10
+
+/datum/symptom/cough/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3)
+ if(prob(base_message_chance) && !suppress_warning)
+ to_chat(M, "[pick("You swallow excess mucus.", "You lightly cough.")]")
+ else
+ M.emote("cough")
+ if(power >= 1.5)
+ var/obj/item/I = M.get_active_held_item()
+ if(I && I.w_class == WEIGHT_CLASS_TINY)
+ M.dropItemToGround(I)
+ if(power >= 2 && prob(10))
+ to_chat(M, "[pick("You have a coughing fit!", "You can't stop coughing!")]")
+ M.Stun(20)
+ M.emote("cough")
+ addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6)
+ addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12)
+ addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18)
+ if(infective && M.CanSpreadAirborneDisease())
+ A.spread(1)
+
diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm
index e0336506e3..4d4aa6dee5 100644
--- a/code/datums/diseases/advance/symptoms/deafness.dm
+++ b/code/datums/diseases/advance/symptoms/deafness.dm
@@ -1,59 +1,61 @@
-/*
-//////////////////////////////////////
-
-Deafness
-
- Slightly noticable.
- Lowers resistance.
- Decreases stage speed slightly.
- Decreases transmittablity.
- Intense Level.
-
-Bonus
- Causes intermittent loss of hearing.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/deafness
-
- name = "Deafness"
- desc = "The virus causes inflammation of the eardrums, causing intermittent deafness."
- stealth = -1
- resistance = -2
- stage_speed = -1
- transmittable = -3
- level = 4
- severity = 4
- 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."
-
-/datum/symptom/deafness/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 4)
- suppress_warning = TRUE
- if(A.properties["resistance"] >= 9) //permanent deafness
- power = 2
-
-/datum/symptom/deafness/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
- switch(A.stage)
- if(3, 4)
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]")
- if(5)
- if(power > 2)
- var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS)
- if(istype(ears) && ears.damage < ears.maxHealth)
- to_chat(M, "Your ears pop painfully and start bleeding!")
- ears.damage = max(ears.damage, ears.maxHealth)
- M.emote("scream")
- else
- to_chat(M, "Your ears pop and begin ringing loudly!")
- M.minimumDeafTicks(20)
+/*
+//////////////////////////////////////
+
+Deafness
+
+ Slightly noticable.
+ Lowers resistance.
+ Decreases stage speed slightly.
+ Decreases transmittablity.
+ Intense Level.
+
+Bonus
+ Causes intermittent loss of hearing.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/deafness
+
+ name = "Deafness"
+ desc = "The virus causes inflammation of the eardrums, causing intermittent deafness."
+ stealth = -1
+ resistance = -2
+ stage_speed = -1
+ transmittable = -3
+ level = 4
+ severity = 4
+ base_message_chance = 100
+ symptom_delay_min = 25
+ symptom_delay_max = 80
+ threshold_desc = 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
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+ if(A.properties["resistance"] >= 9) //permanent deafness
+ power = 2
+
+/datum/symptom/deafness/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(3, 4)
+ if(prob(base_message_chance) && !suppress_warning)
+ to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]")
+ if(5)
+ if(power > 2)
+ var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS)
+ if(istype(ears) && ears.damage < ears.maxHealth)
+ to_chat(M, "Your ears pop painfully and start bleeding!")
+ ears.damage = max(ears.damage, ears.maxHealth)
+ M.emote("scream")
+ else
+ to_chat(M, "Your ears pop and begin ringing loudly!")
+ M.minimumDeafTicks(20)
diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm
index b4b06be5ac..6f2da5d02c 100644
--- a/code/datums/diseases/advance/symptoms/dizzy.dm
+++ b/code/datums/diseases/advance/symptoms/dizzy.dm
@@ -1,53 +1,55 @@
-/*
-//////////////////////////////////////
-
-Dizziness
-
- Hidden.
- Lowers resistance considerably.
- Decreases stage speed.
- Reduced transmittability
- Intense Level.
-
-Bonus
- Shakes the affected mob's screen for short periods.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/dizzy // Not the egg
-
- name = "Dizziness"
- desc = "The virus causes inflammation of the vestibular system, leading to bouts of dizziness."
- resistance = -2
- stage_speed = -3
- transmittable = -1
- level = 4
- severity = 2
- 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."
-
-/datum/symptom/dizzy/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 4)
- suppress_warning = TRUE
- if(A.properties["transmittable"] >= 6) //druggy
- power = 2
-
-/datum/symptom/dizzy/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3, 4)
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("You feel dizzy.", "Your head spins.")]")
- else
- to_chat(M, "A wave of dizziness washes over you!")
- M.Dizzy(5)
- if(power >= 2)
+/*
+//////////////////////////////////////
+
+Dizziness
+
+ Hidden.
+ Lowers resistance considerably.
+ Decreases stage speed.
+ Reduced transmittability
+ Intense Level.
+
+Bonus
+ Shakes the affected mob's screen for short periods.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/dizzy // Not the egg
+
+ name = "Dizziness"
+ desc = "The virus causes inflammation of the vestibular system, leading to bouts of dizziness."
+ resistance = -2
+ stage_speed = -3
+ transmittable = -1
+ level = 4
+ severity = 2
+ base_message_chance = 50
+ symptom_delay_min = 15
+ symptom_delay_max = 40
+ threshold_desc = list(
+ "Transmission 6" = "Also causes druggy vision.",
+ "Stealth 4" = "The symptom remains hidden until active.",
+ )
+
+/datum/symptom/dizzy/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+ if(A.properties["transmittable"] >= 6) //druggy
+ power = 2
+
+/datum/symptom/dizzy/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3, 4)
+ if(prob(base_message_chance) && !suppress_warning)
+ to_chat(M, "[pick("You feel dizzy.", "Your head spins.")]")
+ else
+ 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
diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm
index a178cba196..091fe453a1 100644
--- a/code/datums/diseases/advance/symptoms/fever.dm
+++ b/code/datums/diseases/advance/symptoms/fever.dm
@@ -1,60 +1,61 @@
-/*
-//////////////////////////////////////
-
-Fever
-
- No change to hidden.
- Increases resistance.
- Increases stage speed.
- Little transmittable.
- Low level.
-
-Bonus
- Heats up your body.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/fever
- name = "Fever"
- desc = "The virus causes a febrile response from the host, raising its body temperature."
- stealth = 0
- resistance = 3
- stage_speed = 3
- transmittable = 2
- level = 2
- severity = 2
- base_message_chance = 20
- 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."
-
-/datum/symptom/fever/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["resistance"] >= 5) //dangerous fever
- power = 1.5
- unsafe = TRUE
- if(A.properties["resistance"] >= 10)
- power = 2.5
-
-/datum/symptom/fever/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
- if(!unsafe || A.stage < 4)
- to_chat(M, "[pick("You feel hot.", "You feel like you're burning.")]")
- else
- to_chat(M, "[pick("You feel too hot.", "You feel like your blood is boiling.")]")
- if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT || unsafe)
- Heat(M, A)
-
-/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A)
- var/get_heat = 6 * power
- if(!unsafe)
- M.adjust_bodytemperature(get_heat * A.stage, 0, BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
- else
- M.adjust_bodytemperature(get_heat * A.stage)
- return 1
+/*
+//////////////////////////////////////
+
+Fever
+
+ No change to hidden.
+ Increases resistance.
+ Increases stage speed.
+ Little transmittable.
+ Low level.
+
+Bonus
+ Heats up your body.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/fever
+ name = "Fever"
+ desc = "The virus causes a febrile response from the host, raising its body temperature."
+ stealth = 0
+ resistance = 3
+ stage_speed = 3
+ transmittable = 2
+ level = 2
+ severity = 2
+ base_message_chance = 20
+ symptom_delay_min = 10
+ symptom_delay_max = 30
+ var/unsafe = FALSE //over the heat threshold
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["resistance"] >= 5) //dangerous fever
+ power = 1.5
+ unsafe = TRUE
+ if(A.properties["resistance"] >= 10)
+ power = 2.5
+
+/datum/symptom/fever/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ if(!unsafe || A.stage < 4)
+ to_chat(M, "[pick("You feel hot.", "You feel like you're burning.")]")
+ else
+ to_chat(M, "[pick("You feel too hot.", "You feel like your blood is boiling.")]")
+ if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT || unsafe)
+ Heat(M, A)
+
+/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A)
+ var/get_heat = 6 * power
+ if(!unsafe)
+ M.adjust_bodytemperature(get_heat * A.stage, 0, BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
+ else
+ M.adjust_bodytemperature(get_heat * A.stage)
+ return 1
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index 6429db9439..c758f284dc 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -29,11 +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_desc = 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(!..())
return
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index 48668afc90..58b2d479b7 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -1,130 +1,136 @@
-/*
-//////////////////////////////////////
-
-Necrotizing Fasciitis (AKA Flesh-Eating Disease)
-
- Very very noticable.
- Lowers resistance tremendously.
- No changes to stage speed.
- Decreases transmittablity temrendously.
- Fatal Level.
-
-Bonus
- Deals brute damage over time.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/flesh_eating
-
- name = "Necrotizing Fasciitis"
- desc = "The virus aggressively attacks body cells, necrotizing tissues and organs."
- stealth = -3
- resistance = -4
- stage_speed = 0
- transmittable = -4
- level = 6
- severity = 5
- base_message_chance = 50
- symptom_delay_min = 15
- 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."
-
-/datum/symptom/flesh_eating/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["resistance"] >= 7) //extra bleeding
- bleed = TRUE
- if(A.properties["transmittable"] >= 8) //extra stamina damage
- pain = TRUE
-
-/datum/symptom/flesh_eating/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(2,3)
- if(prob(base_message_chance))
- to_chat(M, "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]")
- if(4,5)
- to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]")
- Flesheat(M, A)
-
-/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
- var/get_damage = rand(15,25) * power
- M.adjustBruteLoss(get_damage)
- if(pain)
- M.adjustStaminaLoss(get_damage)
- if(bleed)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- H.bleed_rate += 5 * power
- return 1
-
-/*
-//////////////////////////////////////
-
-Autophagocytosis (AKA Programmed mass cell death)
-
- Very noticable.
- Lowers resistance.
- Fast stage speed.
- Decreases transmittablity.
- Fatal Level.
-
-Bonus
- Deals brute damage over time.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/flesh_death
-
- name = "Autophagocytosis Necrosis"
- desc = "The virus rapidly consumes infected cells, leading to heavy and widespread damage."
- stealth = -2
- resistance = -2
- stage_speed = 1
- transmittable = -2
- level = 7
- severity = 6
- base_message_chance = 50
- symptom_delay_min = 3
- 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."
-
-/datum/symptom/flesh_death/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 5)
- suppress_warning = TRUE
- if(A.properties["stage_rate"] >= 7) //bleeding and hunger
- chems = TRUE
-
-/datum/symptom/flesh_death/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(2,3)
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("You feel your body break apart.", "Your skin rubs off like dust.")]")
- if(4,5)
- if(prob(base_message_chance / 2)) //reduce spam
- to_chat(M, "[pick("You feel your muscles weakening.", "Some of your skin detaches itself.", "You feel sandy.")]")
- Flesh_death(M, A)
-
-/datum/symptom/flesh_death/proc/Flesh_death(mob/living/M, datum/disease/advance/A)
- var/get_damage = rand(6,10)
- M.adjustBruteLoss(get_damage)
- if(chems)
- 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)
+/*
+//////////////////////////////////////
+
+Necrotizing Fasciitis (AKA Flesh-Eating Disease)
+
+ Very very noticable.
+ Lowers resistance tremendously.
+ No changes to stage speed.
+ Decreases transmittablity temrendously.
+ Fatal Level.
+
+Bonus
+ Deals brute damage over time.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/flesh_eating
+
+ name = "Necrotizing Fasciitis"
+ desc = "The virus aggressively attacks body cells, necrotizing tissues and organs."
+ stealth = -3
+ resistance = -4
+ stage_speed = 0
+ transmittable = -4
+ level = 6
+ severity = 5
+ base_message_chance = 50
+ symptom_delay_min = 15
+ symptom_delay_max = 60
+ var/bleed = FALSE
+ var/pain = FALSE
+ threshold_desc = 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/flesh_eating/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["resistance"] >= 7) //extra bleeding
+ bleed = TRUE
+ if(A.properties["transmittable"] >= 8) //extra stamina damage
+ pain = TRUE
+
+/datum/symptom/flesh_eating/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(2,3)
+ if(prob(base_message_chance))
+ to_chat(M, "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]")
+ if(4,5)
+ to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]")
+ Flesheat(M, A)
+
+/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
+ var/get_damage = rand(15,25) * power
+ M.adjustBruteLoss(get_damage)
+ if(pain)
+ M.adjustStaminaLoss(get_damage)
+ if(bleed)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.bleed_rate += 5 * power
+ return 1
+
+/*
+//////////////////////////////////////
+
+Autophagocytosis (AKA Programmed mass cell death)
+
+ Very noticable.
+ Lowers resistance.
+ Fast stage speed.
+ Decreases transmittablity.
+ Fatal Level.
+
+Bonus
+ Deals brute damage over time.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/flesh_death
+
+ name = "Autophagocytosis Necrosis"
+ desc = "The virus rapidly consumes infected cells, leading to heavy and widespread damage."
+ stealth = -2
+ resistance = -2
+ stage_speed = 1
+ transmittable = -2
+ level = 7
+ severity = 6
+ base_message_chance = 50
+ symptom_delay_min = 3
+ symptom_delay_max = 6
+ var/chems = FALSE
+ var/zombie = FALSE
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stealth"] >= 5)
+ suppress_warning = TRUE
+ if(A.properties["stage_rate"] >= 7) //bleeding and hunger
+ chems = TRUE
+
+/datum/symptom/flesh_death/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(2,3)
+ if(prob(base_message_chance) && !suppress_warning)
+ to_chat(M, "[pick("You feel your body break apart.", "Your skin rubs off like dust.")]")
+ if(4,5)
+ if(prob(base_message_chance / 2)) //reduce spam
+ to_chat(M, "[pick("You feel your muscles weakening.", "Some of your skin detaches itself.", "You feel sandy.")]")
+ Flesh_death(M, A)
+
+/datum/symptom/flesh_death/proc/Flesh_death(mob/living/M, datum/disease/advance/A)
+ var/get_damage = rand(6,10)
+ M.adjustBruteLoss(get_damage)
+ if(chems)
+ 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
diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm
index 7f21b03dff..2a7cb23e96 100644
--- a/code/datums/diseases/advance/symptoms/genetics.dm
+++ b/code/datums/diseases/advance/symptoms/genetics.dm
@@ -1,78 +1,81 @@
-/*
-//////////////////////////////////////
-
-DNA Saboteur
-
- Very noticable.
- Lowers resistance tremendously.
- No changes to stage speed.
- Decreases transmittablity tremendously.
- Fatal Level.
-
-Bonus
- Cleans the DNA of a person and then randomly gives them a trait.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/genetic_mutation
- name = "Deoxyribonucleic Acid Saboteur"
- desc = "The virus bonds with the DNA of the host, causing damaging mutations until removed."
- stealth = -2
- resistance = -3
- stage_speed = 0
- transmittable = -3
- level = 6
- severity = 4
- var/list/possible_mutations
- var/archived_dna = null
- base_message_chance = 50
- 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."
-
-/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/C = A.affected_mob
- if(!C.has_dna())
- return
- switch(A.stage)
- if(4, 5)
- to_chat(C, "[pick("Your skin feels itchy.", "You feel light headed.")]")
- C.dna.remove_mutation_group(possible_mutations)
- for(var/i in 1 to power)
- C.randmut(possible_mutations)
-
-// Archive their DNA before they were infected.
-/datum/symptom/genetic_mutation/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 5) //don't restore dna after curing
- no_reset = TRUE
- if(A.properties["stage_rate"] >= 10) //mutate more often
- symptom_delay_min = 20
- symptom_delay_max = 60
- if(A.properties["resistance"] >= 8) //mutate twice
- power = 2
- possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.mutations_list[RACEMUT]
- var/mob/living/carbon/M = A.affected_mob
- if(M)
- if(!M.has_dna())
- return
- archived_dna = M.dna.struc_enzymes
-
-// Give them back their old DNA when cured.
-/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
- if(!..())
- return
- if(!no_reset)
- var/mob/living/carbon/M = A.affected_mob
- if(M && archived_dna)
- if(!M.has_dna())
- return
- M.dna.struc_enzymes = archived_dna
- M.domutcheck()
+/*
+//////////////////////////////////////
+
+DNA Saboteur
+
+ Very noticable.
+ Lowers resistance tremendously.
+ No changes to stage speed.
+ Decreases transmittablity tremendously.
+ Fatal Level.
+
+Bonus
+ Cleans the DNA of a person and then randomly gives them a trait.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/genetic_mutation
+ name = "Deoxyribonucleic Acid Saboteur"
+ desc = "The virus bonds with the DNA of the host, causing damaging mutations until removed."
+ stealth = -2
+ resistance = -3
+ stage_speed = 0
+ transmittable = -3
+ level = 6
+ severity = 4
+ var/list/possible_mutations
+ var/archived_dna = null
+ base_message_chance = 50
+ symptom_delay_min = 60
+ symptom_delay_max = 120
+ var/no_reset = FALSE
+ threshold_desc = 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(!..())
+ return
+ var/mob/living/carbon/C = A.affected_mob
+ if(!C.has_dna())
+ return
+ switch(A.stage)
+ if(4, 5)
+ to_chat(C, "[pick("Your skin feels itchy.", "You feel light headed.")]")
+ C.dna.remove_mutation_group(possible_mutations)
+ for(var/i in 1 to power)
+ C.randmut(possible_mutations)
+
+// Archive their DNA before they were infected.
+/datum/symptom/genetic_mutation/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stealth"] >= 5) //don't restore dna after curing
+ no_reset = TRUE
+ if(A.properties["stage_rate"] >= 10) //mutate more often
+ symptom_delay_min = 20
+ symptom_delay_max = 60
+ if(A.properties["resistance"] >= 8) //mutate twice
+ power = 2
+ possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.mutations_list[RACEMUT]
+ var/mob/living/carbon/M = A.affected_mob
+ if(M)
+ if(!M.has_dna())
+ return
+ archived_dna = M.dna.struc_enzymes
+
+// Give them back their old DNA when cured.
+/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
+ if(!..())
+ return
+ if(!no_reset)
+ var/mob/living/carbon/M = A.affected_mob
+ if(M && archived_dna)
+ if(!M.has_dna())
+ return
+ M.dna.struc_enzymes = archived_dna
+ M.domutcheck()
diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm
index 873d960524..339df38a37 100644
--- a/code/datums/diseases/advance/symptoms/hallucigen.dm
+++ b/code/datums/diseases/advance/symptoms/hallucigen.dm
@@ -1,65 +1,67 @@
-/*
-//////////////////////////////////////
-
-Hallucigen
-
- Very noticable.
- Lowers resistance considerably.
- Decreases stage speed.
- Reduced transmittable.
- Critical Level.
-
-Bonus
- Makes the affected mob be hallucinated for short periods of time.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/hallucigen
- name = "Hallucigen"
- desc = "The virus stimulates the brain, causing occasional hallucinations."
- stealth = -2
- resistance = -3
- stage_speed = -3
- transmittable = -1
- level = 5
- severity = 2
- base_message_chance = 25
- 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.."
-
-/datum/symptom/hallucigen/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 4) //fake good symptom messages
- fake_healthy = TRUE
- base_message_chance = 50
- if(A.properties["stage_rate"] >= 7) //stronger hallucinations
- power = 2
-
-/datum/symptom/hallucigen/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
- var/list/healthy_messages = list("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.",\
- "Your eyes feel great.", "You are now blinking manually.", "You don't feel the need to blink.")
- switch(A.stage)
- if(1, 2)
- if(prob(base_message_chance))
- if(!fake_healthy)
- to_chat(M, "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whisper with no source.", "Your head aches.")]")
- else
- to_chat(M, "[pick(healthy_messages)]")
- if(3, 4)
- if(prob(base_message_chance))
- if(!fake_healthy)
- to_chat(M, "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]")
- else
- to_chat(M, "[pick(healthy_messages)]")
- else
- if(prob(base_message_chance))
- to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]")
- M.hallucination += (45 * power)
+/*
+//////////////////////////////////////
+
+Hallucigen
+
+ Very noticable.
+ Lowers resistance considerably.
+ Decreases stage speed.
+ Reduced transmittable.
+ Critical Level.
+
+Bonus
+ Makes the affected mob be hallucinated for short periods of time.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/hallucigen
+ name = "Hallucigen"
+ desc = "The virus stimulates the brain, causing occasional hallucinations."
+ stealth = -2
+ resistance = -3
+ stage_speed = -3
+ transmittable = -1
+ level = 5
+ severity = 2
+ base_message_chance = 25
+ symptom_delay_min = 25
+ symptom_delay_max = 90
+ var/fake_healthy = FALSE
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stealth"] >= 4) //fake good symptom messages
+ fake_healthy = TRUE
+ base_message_chance = 50
+ if(A.properties["stage_rate"] >= 7) //stronger hallucinations
+ power = 2
+
+/datum/symptom/hallucigen/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ var/list/healthy_messages = list("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.",\
+ "Your eyes feel great.", "You are now blinking manually.", "You don't feel the need to blink.")
+ switch(A.stage)
+ if(1, 2)
+ if(prob(base_message_chance))
+ if(!fake_healthy)
+ to_chat(M, "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whisper with no source.", "Your head aches.")]")
+ else
+ to_chat(M, "[pick(healthy_messages)]")
+ if(3, 4)
+ if(prob(base_message_chance))
+ if(!fake_healthy)
+ to_chat(M, "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]")
+ else
+ to_chat(M, "[pick(healthy_messages)]")
+ else
+ if(prob(base_message_chance))
+ to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]")
+ M.hallucination += (45 * power)
diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm
index 72b03000ed..8fcab58c0c 100644
--- a/code/datums/diseases/advance/symptoms/headache.dm
+++ b/code/datums/diseases/advance/symptoms/headache.dm
@@ -1,60 +1,62 @@
-/*
-//////////////////////////////////////
-
-Headache
-
- Noticable.
- Highly resistant.
- Increases stage speed.
- Not transmittable.
- Low Level.
-
-BONUS
- Displays an annoying message!
- Should be used for buffing your disease.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/headache
-
- name = "Headache"
- desc = "The virus causes inflammation inside the brain, causing constant headaches."
- stealth = -1
- resistance = 4
- stage_speed = 2
- transmittable = 0
- level = 1
- severity = 1
- 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."
-
-/datum/symptom/headache/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 4)
- base_message_chance = 50
- if(A.properties["stage_rate"] >= 6) //severe pain
- power = 2
- if(A.properties["stage_rate"] >= 9) //cluster headaches
- symptom_delay_min = 30
- symptom_delay_max = 60
- power = 3
-
-/datum/symptom/headache/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- if(power < 2)
- if(prob(base_message_chance) || A.stage >=4)
- to_chat(M, "[pick("Your head hurts.", "Your head pounds.")]")
- if(power >= 2 && A.stage >= 4)
- to_chat(M, "[pick("Your head hurts a lot.", "Your head pounds incessantly.")]")
- 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!")]")
+/*
+//////////////////////////////////////
+
+Headache
+
+ Noticable.
+ Highly resistant.
+ Increases stage speed.
+ Not transmittable.
+ Low Level.
+
+BONUS
+ Displays an annoying message!
+ Should be used for buffing your disease.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/headache
+
+ name = "Headache"
+ desc = "The virus causes inflammation inside the brain, causing constant headaches."
+ stealth = -1
+ resistance = 4
+ stage_speed = 2
+ transmittable = 0
+ level = 1
+ severity = 1
+ base_message_chance = 100
+ symptom_delay_min = 15
+ symptom_delay_max = 30
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stealth"] >= 4)
+ base_message_chance = 50
+ if(A.properties["stage_rate"] >= 6) //severe pain
+ power = 2
+ if(A.properties["stage_rate"] >= 9) //cluster headaches
+ symptom_delay_min = 30
+ symptom_delay_max = 60
+ power = 3
+
+/datum/symptom/headache/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ if(power < 2)
+ if(prob(base_message_chance) || A.stage >=4)
+ to_chat(M, "[pick("Your head hurts.", "Your head pounds.")]")
+ if(power >= 2 && A.stage >= 4)
+ to_chat(M, "[pick("Your head hurts a lot.", "Your head pounds incessantly.")]")
+ 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
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index c1b3526f41..73ea5e2aad 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -1,485 +1,497 @@
-/datum/symptom/heal
- name = "Basic Healing (does nothing)" //warning for adminspawn viruses
- desc = "You should not be seeing this."
- stealth = 0
- resistance = 0
- stage_speed = 0
- transmittable = 0
- level = 0 //not obtainable
- base_message_chance = 20 //here used for the overlays
- 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."
-
-/datum/symptom/heal/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 6) //stronger healing
- power = 2
-
-/datum/symptom/heal/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(4, 5)
- var/effectiveness = CanHeal(A)
- if(!effectiveness)
- if(passive_message && prob(2) && passive_message_condition(M))
- to_chat(M, passive_message)
- return
- else
- Heal(M, A, effectiveness)
- return
-
-/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A)
- return power
-
-/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power)
- return TRUE
-
-/datum/symptom/heal/proc/passive_message_condition(mob/living/M)
- return TRUE
-
-
-/datum/symptom/heal/starlight
- name = "Starlight Condensation"
- desc = "The virus reacts to direct starlight, producing regenerative chemicals. Works best against toxin-based damage."
- stealth = -1
- resistance = -2
- stage_speed = 0
- transmittable = 1
- 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."
-
-/datum/symptom/heal/starlight/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["transmittable"] >= 6)
- nearspace_penalty = 1
- if(A.properties["stage_rate"] >= 6)
- power = 2
-
-/datum/symptom/heal/starlight/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- if(istype(get_turf(M), /turf/open/space))
- return power
- else
- for(var/turf/T in view(M, 2))
- if(istype(T, /turf/open/space))
- return power * nearspace_penalty
-
-/datum/symptom/heal/starlight/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = actual_power
- if(M.getToxLoss() && prob(5))
- to_chat(M, "Your skin tingles as the starlight seems to heal you.")
-
- M.adjustToxLoss(-(4 * heal_amt), forced = TRUE) //most effective on toxins
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
- return 1
-
-/datum/symptom/heal/starlight/passive_message_condition(mob/living/M)
- if(M.getBruteLoss() || M.getFireLoss() || M.getToxLoss())
- return TRUE
- return FALSE
-
-/datum/symptom/heal/chem
- name = "Toxolysis"
- stealth = 0
- resistance = -2
- stage_speed = 2
- transmittable = -2
- 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."
-
-/datum/symptom/heal/chem/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 6)
- food_conversion = TRUE
- if(A.properties["resistance"] >= 7)
- power = 2
-
-/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power)
- for(var/E in M.reagents.reagent_list) //Not just toxins!
- var/datum/reagent/R = E
- M.reagents.remove_reagent(R.type, actual_power)
- if(food_conversion)
- M.nutrition += 0.3
- if(prob(2))
- to_chat(M, "You feel a mild warmth as your blood purifies itself.")
- return 1
-
-
-
-/datum/symptom/heal/metabolism
- name = "Metabolic Boost"
- stealth = -1
- resistance = -2
- stage_speed = 2
- transmittable = 1
- level = 7
- var/triple_metabolism = FALSE
- 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."
-
-/datum/symptom/heal/metabolism/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 10)
- triple_metabolism = TRUE
- if(A.properties["stealth"] >= 3)
- reduced_hunger = TRUE
-
-/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power)
- if(!istype(C))
- return
- C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
- if(triple_metabolism)
- C.reagents.metabolize(C, can_overdose=TRUE)
- C.overeatduration = max(C.overeatduration - 2, 0)
- var/lost_nutrition = 9 - (reduced_hunger * 5)
- C.nutrition = max(C.nutrition - (lost_nutrition * HUNGER_FACTOR), 0) //Hunger depletes at 10x the normal speed
- if(prob(2))
- to_chat(C, "You feel an odd gurgle in your stomach, as if it was working much faster than normal.")
- return 1
-
-/datum/symptom/heal/darkness
- name = "Nocturnal Regeneration"
- desc = "The virus is able to mend the host's flesh when in conditions of low light, repairing physical damage. More effective against brute damage."
- stealth = 2
- resistance = -1
- stage_speed = -2
- 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."
-
-/datum/symptom/heal/darkness/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 8)
- power = 2
-
-/datum/symptom/heal/darkness/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- var/light_amount = 0
- if(isturf(M.loc)) //else, there's considered to be no light
- var/turf/T = M.loc
- light_amount = min(1,T.get_lumcount()) - 0.5
- if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
- return power
-
-/datum/symptom/heal/darkness/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 2 * actual_power
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- if(prob(5))
- to_chat(M, "The darkness soothes and mends your wounds.")
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5)) //more effective on brute
- M.update_damage_overlays()
- return 1
-
-/datum/symptom/heal/darkness/passive_message_condition(mob/living/M)
- if(M.getBruteLoss() || M.getFireLoss())
- return TRUE
- return FALSE
-
-/datum/symptom/heal/coma
- name = "Regenerative Coma"
- desc = "The virus causes the host to fall into a death-like coma when severely damaged, then rapidly fixes the damage."
- stealth = 0
- resistance = 2
- stage_speed = -3
- transmittable = -2
- level = 8
- passive_message = "The pain from your wounds makes you feel oddly sleepy..."
- var/deathgasp = FALSE
- var/stabilize = FALSE
- var/active_coma = FALSE //to prevent multiple coma procs
- threshold_desc = "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(!..())
- return
- if(A.properties["stage_rate"] >= 7)
- power = 1.5
- if(A.properties["resistance"] >= 4)
- stabilize = TRUE
- if(A.properties["stealth"] >= 2)
- deathgasp = TRUE
-
-/datum/symptom/heal/coma/on_stage_change(datum/disease/advance/A) //mostly copy+pasted from the code for self-respiration's TRAIT_NOBREATH stuff
- if(!..())
- return FALSE
- if(A.stage >= 4 && stabilize)
- ADD_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT)
- else
- REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT)
- return TRUE
-
-/datum/symptom/heal/coma/End(datum/disease/advance/A)
- if(!..())
- return
- REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT)
-
-/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
- return power
- else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
- return power * 0.9
- else if(M.stat == SOFT_CRIT)
- return power * 0.5
- else if(M.IsSleeping())
- return power * 0.25
- else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
- to_chat(M, "You feel yourself slip into a regenerative coma...")
- active_coma = TRUE
- addtimer(CALLBACK(src, .proc/coma, M), 60)
-
-/datum/symptom/heal/coma/proc/coma(mob/living/M)
- if(deathgasp)
- M.emote("deathgasp")
- M.fakedeath("regenerative_coma")
- M.update_stat()
- M.update_canmove()
- addtimer(CALLBACK(src, .proc/uncoma, M), 300)
-
-/datum/symptom/heal/coma/proc/uncoma(mob/living/M)
- if(!active_coma)
- return
- active_coma = FALSE
- M.cure_fakedeath("regenerative_coma")
- M.update_stat()
- M.update_canmove()
-
-/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 4 * actual_power
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
-
- if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0)
- uncoma(M)
-
- return 1
-
-/datum/symptom/heal/coma/passive_message_condition(mob/living/M)
- if((M.getBruteLoss() + M.getFireLoss()) > 30)
- return TRUE
- return FALSE
-
-/datum/symptom/heal/water
- name = "Tissue Hydration"
- desc = "The virus uses excess water inside and outside the body to repair damaged tissue cells. More effective against burns."
- stealth = 0
- resistance = -1
- stage_speed = 0
- transmittable = 1
- 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."
-
-/datum/symptom/heal/water/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 7)
- power = 2
- if(A.properties["stealth"] >= 2)
- absorption_coeff = 0.25
-
-/datum/symptom/heal/water/CanHeal(datum/disease/advance/A)
- . = 0
- var/mob/living/M = A.affected_mob
- if(M.fire_stacks < 0)
- M.fire_stacks = min(M.fire_stacks + 1 * absorption_coeff, 0)
- . += power
- if(M.reagents.has_reagent(/datum/reagent/water/holywater))
- M.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff)
- . += power * 0.75
- else if(M.reagents.has_reagent(/datum/reagent/water))
- M.reagents.remove_reagent(/datum/reagent/water, 0.5 * absorption_coeff)
- . += power * 0.5
-
-/datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 2 * actual_power
-
- var/list/parts = M.get_damaged_bodyparts(1,1) //more effective on burns
-
- if(!parts.len)
- return
-
- if(prob(5))
- to_chat(M, "You feel yourself absorbing the water around you to soothe your damaged skin.")
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len))
- M.update_damage_overlays()
-
- return 1
-
-/datum/symptom/heal/water/passive_message_condition(mob/living/M)
- if(M.getBruteLoss() || M.getFireLoss())
- return TRUE
- return FALSE
-
-/datum/symptom/heal/plasma
- name = "Plasma Fixation"
- desc = "The virus draws plasma from the atmosphere and from inside the body to heal and stabilize body temperature."
- stealth = 0
- resistance = 3
- stage_speed = -2
- transmittable = -2
- level = 8
- passive_message = "You feel an odd attraction to plasma."
- var/temp_rate = 1
- threshold_desc = "Transmission 6: Increases temperature adjustment rate and heals toxin lovers.
\
- Stage Speed 7: Increases healing speed."
-
-/datum/symptom/heal/plasma/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 7)
- power = 2
- if(A.properties["transmittable"] >= 6)
- temp_rate = 4
-
-/datum/symptom/heal/plasma/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- var/datum/gas_mixture/environment
- var/plasmamount
-
- . = 0
-
- if(M.loc)
- environment = M.loc.return_air()
- if(environment)
- plasmamount = environment.gases[/datum/gas/plasma]
- if(plasmamount && plasmamount > GLOB.meta_gas_visibility[/datum/gas/plasma]) //if there's enough plasma in the air to see
- . += power * 0.5
- if(M.reagents.has_reagent(/datum/reagent/toxin/plasma))
- . += power * 0.75
-
-/datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = 4 * actual_power
-
- if(prob(5))
- to_chat(M, "You feel yourself absorbing plasma inside and around you...")
-
- if(M.bodytemperature > BODYTEMP_NORMAL)
- M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,BODYTEMP_NORMAL)
- if(prob(5))
- to_chat(M, "You feel less hot.")
- else if(M.bodytemperature < (BODYTEMP_NORMAL + 1))
- M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,0,BODYTEMP_NORMAL)
- if(prob(5))
- to_chat(M, "You feel warmer.")
-
- M.adjustToxLoss(-heal_amt, forced = (temp_rate == 4))
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
- if(!parts.len)
- return
- if(prob(5))
- to_chat(M, "The pain from your wounds fades rapidly.")
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
- return 1
-
-
-/datum/symptom/heal/radiation
- name = "Radioactive Resonance"
- desc = "The virus uses radiation to fix damage through dna mutations."
- stealth = -1
- resistance = -2
- stage_speed = 2
- transmittable = -3
- level = 6
- symptom_delay_min = 1
- 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 and toxin lovers.
\
- Resistance 7: Increases healing speed."
-
-/datum/symptom/heal/radiation/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["resistance"] >= 7)
- power = 2
- if(A.properties["transmittable"] >= 6)
- cellular_damage = TRUE
-
-/datum/symptom/heal/radiation/CanHeal(datum/disease/advance/A)
- var/mob/living/M = A.affected_mob
- switch(M.radiation)
- if(0)
- return FALSE
- if(1 to RAD_MOB_SAFE)
- return 0.25
- if(RAD_MOB_SAFE to RAD_BURN_THRESHOLD)
- return 0.5
- if(RAD_BURN_THRESHOLD to RAD_MOB_MUTATE)
- return 0.75
- if(RAD_MOB_MUTATE to RAD_MOB_KNOCKDOWN)
- return 1
- else
- return 1.5
-
-/datum/symptom/heal/radiation/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
- var/heal_amt = actual_power
-
- if(cellular_damage)
- M.adjustCloneLoss(-heal_amt * 0.5)
-
- M.adjustToxLoss(-(2 * heal_amt), forced = cellular_damage)
-
- var/list/parts = M.get_damaged_bodyparts(1,1)
-
- if(!parts.len)
- return
-
- if(prob(4))
- to_chat(M, "Your skin glows faintly, and you feel your wounds mending themselves.")
-
- for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
- M.update_damage_overlays()
- return 1
+/datum/symptom/heal
+ name = "Basic Healing (does nothing)" //warning for adminspawn viruses
+ desc = "You should not be seeing this."
+ stealth = 0
+ resistance = 0
+ stage_speed = 0
+ transmittable = 0
+ level = 0 //not obtainable
+ base_message_chance = 20 //here used for the overlays
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/passive_message = "" //random message to infected but not actively healing people
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stage_rate"] >= 6) //stronger healing
+ power = 2
+
+/datum/symptom/heal/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ var/effectiveness = CanHeal(A)
+ if(!effectiveness)
+ if(passive_message && prob(2) && passive_message_condition(M))
+ to_chat(M, passive_message)
+ return
+ else
+ Heal(M, A, effectiveness)
+ return
+
+/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A)
+ return power
+
+/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power)
+ return TRUE
+
+/datum/symptom/heal/proc/passive_message_condition(mob/living/M)
+ return TRUE
+
+
+/datum/symptom/heal/starlight
+ name = "Starlight Condensation"
+ desc = "The virus reacts to direct starlight, producing regenerative chemicals. Works best against toxin-based damage."
+ stealth = -1
+ resistance = -2
+ stage_speed = 0
+ transmittable = 1
+ level = 6
+ passive_message = "You miss the feeling of starlight on your skin."
+ var/nearspace_penalty = 0.3
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["transmittable"] >= 6)
+ nearspace_penalty = 1
+ if(A.properties["stage_rate"] >= 6)
+ power = 2
+
+/datum/symptom/heal/starlight/CanHeal(datum/disease/advance/A)
+ var/mob/living/M = A.affected_mob
+ if(istype(get_turf(M), /turf/open/space))
+ return power
+ else
+ for(var/turf/T in view(M, 2))
+ if(istype(T, /turf/open/space))
+ return power * nearspace_penalty
+
+/datum/symptom/heal/starlight/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
+ var/heal_amt = actual_power
+ if(M.getToxLoss() && prob(5))
+ to_chat(M, "Your skin tingles as the starlight seems to heal you.")
+
+ M.adjustToxLoss(-(4 * heal_amt), forced = TRUE) //most effective on toxins
+
+ var/list/parts = M.get_damaged_bodyparts(1,1)
+
+ if(!parts.len)
+ return
+
+ for(var/obj/item/bodypart/L in parts)
+ if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
+ M.update_damage_overlays()
+ return 1
+
+/datum/symptom/heal/starlight/passive_message_condition(mob/living/M)
+ if(M.getBruteLoss() || M.getFireLoss() || M.getToxLoss())
+ return TRUE
+ return FALSE
+
+/datum/symptom/heal/chem
+ name = "Toxolysis"
+ stealth = 0
+ resistance = -2
+ stage_speed = 2
+ transmittable = -2
+ level = 7
+ var/food_conversion = FALSE
+ desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stage_rate"] >= 6)
+ food_conversion = TRUE
+ if(A.properties["resistance"] >= 7)
+ power = 2
+
+/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power)
+ for(var/E in M.reagents.reagent_list) //Not just toxins!
+ var/datum/reagent/R = E
+ M.reagents.remove_reagent(R.type, actual_power)
+ if(food_conversion)
+ M.nutrition += 0.3
+ if(prob(2))
+ to_chat(M, "You feel a mild warmth as your blood purifies itself.")
+ return 1
+
+
+
+/datum/symptom/heal/metabolism
+ name = "Metabolic Boost"
+ stealth = -1
+ resistance = -2
+ stage_speed = 2
+ transmittable = 1
+ level = 7
+ var/triple_metabolism = FALSE
+ 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 = 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(!..())
+ return
+ if(A.properties["stage_rate"] >= 10)
+ triple_metabolism = TRUE
+ if(A.properties["stealth"] >= 3)
+ reduced_hunger = TRUE
+
+/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power)
+ if(!istype(C))
+ return
+ C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
+ if(triple_metabolism)
+ C.reagents.metabolize(C, can_overdose=TRUE)
+ C.overeatduration = max(C.overeatduration - 2, 0)
+ var/lost_nutrition = 9 - (reduced_hunger * 5)
+ C.nutrition = max(C.nutrition - (lost_nutrition * HUNGER_FACTOR), 0) //Hunger depletes at 10x the normal speed
+ if(prob(2))
+ to_chat(C, "You feel an odd gurgle in your stomach, as if it was working much faster than normal.")
+ return 1
+
+/datum/symptom/heal/darkness
+ name = "Nocturnal Regeneration"
+ desc = "The virus is able to mend the host's flesh when in conditions of low light, repairing physical damage. More effective against brute damage."
+ stealth = 2
+ resistance = -1
+ stage_speed = -2
+ transmittable = -1
+ level = 6
+ passive_message = "You feel tingling on your skin as light passes over it."
+ threshold_desc = list(
+ "Stage Speed 8" = "Doubles healing speed.",
+ )
+/datum/symptom/heal/darkness/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 8)
+ power = 2
+
+/datum/symptom/heal/darkness/CanHeal(datum/disease/advance/A)
+ var/mob/living/M = A.affected_mob
+ var/light_amount = 0
+ if(isturf(M.loc)) //else, there's considered to be no light
+ var/turf/T = M.loc
+ light_amount = min(1,T.get_lumcount()) - 0.5
+ if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
+ return power
+
+/datum/symptom/heal/darkness/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
+ var/heal_amt = 2 * actual_power
+
+ var/list/parts = M.get_damaged_bodyparts(1,1)
+
+ if(!parts.len)
+ return
+
+ if(prob(5))
+ to_chat(M, "The darkness soothes and mends your wounds.")
+
+ for(var/obj/item/bodypart/L in parts)
+ if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5)) //more effective on brute
+ M.update_damage_overlays()
+ return 1
+
+/datum/symptom/heal/darkness/passive_message_condition(mob/living/M)
+ if(M.getBruteLoss() || M.getFireLoss())
+ return TRUE
+ return FALSE
+
+/datum/symptom/heal/coma
+ name = "Regenerative Coma"
+ desc = "The virus causes the host to fall into a death-like coma when severely damaged, then rapidly fixes the damage."
+ stealth = 0
+ resistance = 2
+ stage_speed = -3
+ transmittable = -2
+ level = 8
+ passive_message = "The pain from your wounds makes you feel oddly sleepy..."
+ var/deathgasp = FALSE
+ var/stabilize = FALSE
+ var/active_coma = FALSE //to prevent multiple coma procs
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stage_rate"] >= 7)
+ power = 1.5
+ if(A.properties["resistance"] >= 4)
+ stabilize = TRUE
+ if(A.properties["stealth"] >= 2)
+ deathgasp = TRUE
+
+/datum/symptom/heal/coma/on_stage_change(datum/disease/advance/A) //mostly copy+pasted from the code for self-respiration's TRAIT_NOBREATH stuff
+ if(!..())
+ return FALSE
+ if(A.stage >= 4 && stabilize)
+ ADD_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT)
+ else
+ REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT)
+ return TRUE
+
+/datum/symptom/heal/coma/End(datum/disease/advance/A)
+ if(!..())
+ return
+ REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT)
+
+/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
+ var/mob/living/M = A.affected_mob
+ if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
+ return power
+ else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
+ return power * 0.9
+ else if(M.stat == SOFT_CRIT)
+ return power * 0.5
+ else if(M.IsSleeping())
+ return power * 0.25
+ else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
+ to_chat(M, "You feel yourself slip into a regenerative coma...")
+ active_coma = TRUE
+ addtimer(CALLBACK(src, .proc/coma, M), 60)
+
+/datum/symptom/heal/coma/proc/coma(mob/living/M)
+ if(deathgasp)
+ M.emote("deathgasp")
+ M.fakedeath("regenerative_coma")
+ M.update_stat()
+ M.update_canmove()
+ addtimer(CALLBACK(src, .proc/uncoma, M), 300)
+
+/datum/symptom/heal/coma/proc/uncoma(mob/living/M)
+ if(!active_coma)
+ return
+ active_coma = FALSE
+ M.cure_fakedeath("regenerative_coma")
+ M.update_stat()
+ M.update_canmove()
+
+/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
+ var/heal_amt = 4 * actual_power
+
+ var/list/parts = M.get_damaged_bodyparts(1,1)
+
+ if(!parts.len)
+ return
+
+ for(var/obj/item/bodypart/L in parts)
+ if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
+ M.update_damage_overlays()
+
+ if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0)
+ uncoma(M)
+
+ return 1
+
+/datum/symptom/heal/coma/passive_message_condition(mob/living/M)
+ if((M.getBruteLoss() + M.getFireLoss()) > 30)
+ return TRUE
+ return FALSE
+
+/datum/symptom/heal/water
+ name = "Tissue Hydration"
+ desc = "The virus uses excess water inside and outside the body to repair damaged tissue cells. More effective against burns."
+ stealth = 0
+ resistance = -1
+ stage_speed = 0
+ transmittable = 1
+ level = 6
+ passive_message = "Your skin feels oddly dry..."
+ var/absorption_coeff = 1
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stage_rate"] >= 7)
+ power = 2
+ if(A.properties["stealth"] >= 2)
+ absorption_coeff = 0.25
+
+/datum/symptom/heal/water/CanHeal(datum/disease/advance/A)
+ . = 0
+ var/mob/living/M = A.affected_mob
+ if(M.fire_stacks < 0)
+ M.fire_stacks = min(M.fire_stacks + 1 * absorption_coeff, 0)
+ . += power
+ if(M.reagents.has_reagent(/datum/reagent/water/holywater))
+ M.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff)
+ . += power * 0.75
+ else if(M.reagents.has_reagent(/datum/reagent/water))
+ M.reagents.remove_reagent(/datum/reagent/water, 0.5 * absorption_coeff)
+ . += power * 0.5
+
+/datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
+ var/heal_amt = 2 * actual_power
+
+ var/list/parts = M.get_damaged_bodyparts(1,1) //more effective on burns
+
+ if(!parts.len)
+ return
+
+ if(prob(5))
+ to_chat(M, "You feel yourself absorbing the water around you to soothe your damaged skin.")
+
+ for(var/obj/item/bodypart/L in parts)
+ if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len))
+ M.update_damage_overlays()
+
+ return 1
+
+/datum/symptom/heal/water/passive_message_condition(mob/living/M)
+ if(M.getBruteLoss() || M.getFireLoss())
+ return TRUE
+ return FALSE
+
+/datum/symptom/heal/plasma
+ name = "Plasma Fixation"
+ desc = "The virus draws plasma from the atmosphere and from inside the body to heal and stabilize body temperature."
+ stealth = 0
+ resistance = 3
+ stage_speed = -2
+ transmittable = -2
+ level = 8
+ passive_message = "You feel an odd attraction to plasma."
+ var/temp_rate = 1
+ threshold_desc = list(
+ "Transmission 6" = "Additionally increases temperature adjustment rate and heals those who love toxins",
+ "Resistance 7" = "Increases healing speed.",
+ )
+/datum/symptom/heal/plasma/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stage_rate"] >= 7)
+ power = 2
+ if(A.properties["transmittable"] >= 6)
+ temp_rate = 4
+
+/datum/symptom/heal/plasma/CanHeal(datum/disease/advance/A)
+ var/mob/living/M = A.affected_mob
+ var/datum/gas_mixture/environment
+ var/plasmamount
+
+ . = 0
+
+ if(M.loc)
+ environment = M.loc.return_air()
+ if(environment)
+ plasmamount = environment.gases[/datum/gas/plasma]
+ if(plasmamount && plasmamount > GLOB.meta_gas_visibility[/datum/gas/plasma]) //if there's enough plasma in the air to see
+ . += power * 0.5
+ if(M.reagents.has_reagent(/datum/reagent/toxin/plasma))
+ . += power * 0.75
+
+/datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
+ var/heal_amt = 4 * actual_power
+
+ if(prob(5))
+ to_chat(M, "You feel yourself absorbing plasma inside and around you...")
+
+ if(M.bodytemperature > BODYTEMP_NORMAL)
+ M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,BODYTEMP_NORMAL)
+ if(prob(5))
+ to_chat(M, "You feel less hot.")
+ else if(M.bodytemperature < (BODYTEMP_NORMAL + 1))
+ M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,0,BODYTEMP_NORMAL)
+ if(prob(5))
+ to_chat(M, "You feel warmer.")
+
+ M.adjustToxLoss(-heal_amt, forced = (temp_rate == 4))
+
+ var/list/parts = M.get_damaged_bodyparts(1,1)
+ if(!parts.len)
+ return
+ if(prob(5))
+ to_chat(M, "The pain from your wounds fades rapidly.")
+ for(var/obj/item/bodypart/L in parts)
+ if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
+ M.update_damage_overlays()
+ return 1
+
+
+/datum/symptom/heal/radiation
+ name = "Radioactive Resonance"
+ desc = "The virus uses radiation to fix damage through dna mutations."
+ stealth = -1
+ resistance = -2
+ stage_speed = 2
+ transmittable = -3
+ level = 6
+ symptom_delay_min = 1
+ 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 and toxin lovers.
\
+ Resistance 7: Increases healing speed."
+
+/datum/symptom/heal/radiation/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["resistance"] >= 7)
+ power = 2
+ if(A.properties["transmittable"] >= 6)
+ cellular_damage = TRUE
+
+/datum/symptom/heal/radiation/CanHeal(datum/disease/advance/A)
+ var/mob/living/M = A.affected_mob
+ switch(M.radiation)
+ if(0)
+ return FALSE
+ if(1 to RAD_MOB_SAFE)
+ return 0.25
+ if(RAD_MOB_SAFE to RAD_BURN_THRESHOLD)
+ return 0.5
+ if(RAD_BURN_THRESHOLD to RAD_MOB_MUTATE)
+ return 0.75
+ if(RAD_MOB_MUTATE to RAD_MOB_KNOCKDOWN)
+ return 1
+ else
+ return 1.5
+
+/datum/symptom/heal/radiation/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
+ var/heal_amt = actual_power
+
+ if(cellular_damage)
+ M.adjustCloneLoss(-heal_amt * 0.5)
+
+ M.adjustToxLoss(-(2 * heal_amt), forced = cellular_damage)
+
+ var/list/parts = M.get_damaged_bodyparts(1,1)
+
+ if(!parts.len)
+ return
+
+ if(prob(4))
+ to_chat(M, "Your skin glows faintly, and you feel your wounds mending themselves.")
+
+ for(var/obj/item/bodypart/L in parts)
+ if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
+ M.update_damage_overlays()
+ return 1
diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm
index b0812e0235..edcd1f3a73 100644
--- a/code/datums/diseases/advance/symptoms/itching.dm
+++ b/code/datums/diseases/advance/symptoms/itching.dm
@@ -1,54 +1,56 @@
-/*
-//////////////////////////////////////
-
-Itching
-
- Not noticable or unnoticable.
- Resistant.
- Increases stage speed.
- Little transmissibility.
- Low Level.
-
-BONUS
- Displays an annoying message!
- Should be used for buffing your disease.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/itching
-
- name = "Itching"
- desc = "The virus irritates the skin, causing itching."
- stealth = 0
- resistance = 3
- stage_speed = 3
- transmittable = 1
- level = 1
- severity = 1
- 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."
-
-/datum/symptom/itching/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["transmittable"] >= 6) //itch more often
- symptom_delay_min = 1
- symptom_delay_max = 4
- if(A.properties["stage_rate"] >= 7) //scratch
- scratch = TRUE
-
-/datum/symptom/itching/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
- var/picked_bodypart = pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)
- var/obj/item/bodypart/bodypart = M.get_bodypart(picked_bodypart)
- if(bodypart && bodypart.status == BODYPART_ORGANIC && !bodypart.is_pseudopart) //robotic limbs will mean less scratching overall
- 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)
+/*
+//////////////////////////////////////
+
+Itching
+
+ Not noticable or unnoticable.
+ Resistant.
+ Increases stage speed.
+ Little transmissibility.
+ Low Level.
+
+BONUS
+ Displays an annoying message!
+ Should be used for buffing your disease.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/itching
+
+ name = "Itching"
+ desc = "The virus irritates the skin, causing itching."
+ stealth = 0
+ resistance = 3
+ stage_speed = 3
+ transmittable = 1
+ level = 1
+ severity = 1
+ symptom_delay_min = 5
+ symptom_delay_max = 25
+ var/scratch = FALSE
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["transmittable"] >= 6) //itch more often
+ symptom_delay_min = 1
+ symptom_delay_max = 4
+ if(A.properties["stage_rate"] >= 7) //scratch
+ scratch = TRUE
+
+/datum/symptom/itching/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ var/picked_bodypart = pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)
+ var/obj/item/bodypart/bodypart = M.get_bodypart(picked_bodypart)
+ if(bodypart && bodypart.status == BODYPART_ORGANIC && !bodypart.is_pseudopart) //robotic limbs will mean less scratching overall
+ 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
diff --git a/code/datums/diseases/advance/symptoms/nanites.dm b/code/datums/diseases/advance/symptoms/nanites.dm
index b18e089a41..9598b3fd33 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_desc = 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_desc = 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 24ba024aa6..c2bf349f43 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_desc = list(
+ "Transmission 4" = "Causes the host to periodically emit a yawn that spreads the virus in a manner similar to that of a sneeze.",
+ "Stage Speed 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 e66bdf5ee0..bc56e027f7 100644
--- a/code/datums/diseases/advance/symptoms/oxygen.dm
+++ b/code/datums/diseases/advance/symptoms/oxygen.dm
@@ -1,68 +1,70 @@
-/*
-//////////////////////////////////////
-
-Self-Respiration
-
- Slightly hidden.
- Lowers resistance significantly.
- Decreases stage speed significantly.
- Decreases transmittablity tremendously.
- Fatal Level.
-
-Bonus
- The body generates salbutamol.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/oxygen
-
- name = "Self-Respiration"
- desc = "The virus rapidly synthesizes oxygen, effectively removing the need for breathing."
- stealth = 1
- resistance = -3
- stage_speed = -3
- transmittable = -4
- level = 6
- base_message_chance = 5
- symptom_delay_min = 1
- symptom_delay_max = 1
- var/regenerate_blood = FALSE
- threshold_desc = "Resistance 8:Additionally regenerates lost blood.
"
-
-/datum/symptom/oxygen/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["resistance"] >= 8) //blood regeneration
- regenerate_blood = TRUE
-
-/datum/symptom/oxygen/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
- switch(A.stage)
- if(4, 5)
- M.adjustOxyLoss(-7, 0)
- M.losebreath = max(0, M.losebreath - 4)
- if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio))
- M.blood_volume += 1
- else
- if(prob(base_message_chance))
- to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]")
- return
-
-/datum/symptom/oxygen/on_stage_change(datum/disease/advance/A)
- if(!..())
- return FALSE
- var/mob/living/carbon/M = A.affected_mob
- if(A.stage >= 4)
- ADD_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
- else
- REMOVE_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
- return TRUE
-
-/datum/symptom/oxygen/End(datum/disease/advance/A)
- if(!..())
- return
- if(A.stage >= 4)
+/*
+//////////////////////////////////////
+
+Self-Respiration
+
+ Slightly hidden.
+ Lowers resistance significantly.
+ Decreases stage speed significantly.
+ Decreases transmittablity tremendously.
+ Fatal Level.
+
+Bonus
+ The body generates salbutamol.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/oxygen
+
+ name = "Self-Respiration"
+ desc = "The virus rapidly synthesizes oxygen, effectively removing the need for breathing."
+ stealth = 1
+ resistance = -3
+ stage_speed = -3
+ transmittable = -4
+ level = 6
+ base_message_chance = 5
+ symptom_delay_min = 1
+ symptom_delay_max = 1
+ var/regenerate_blood = FALSE
+ threshold_desc = list(
+ "Resistance 8" = "Additionally regenerates lost blood."
+ )
+
+/datum/symptom/oxygen/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["resistance"] >= 8) //blood regeneration
+ regenerate_blood = TRUE
+
+/datum/symptom/oxygen/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ M.adjustOxyLoss(-7, 0)
+ M.losebreath = max(0, M.losebreath - 4)
+ if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio))
+ M.blood_volume += 1
+ else
+ if(prob(base_message_chance))
+ to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]")
+ return
+
+/datum/symptom/oxygen/on_stage_change(datum/disease/advance/A)
+ if(!..())
+ return FALSE
+ var/mob/living/carbon/M = A.affected_mob
+ if(A.stage >= 4)
+ ADD_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
+ else
+ REMOVE_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
+ return TRUE
+
+/datum/symptom/oxygen/End(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.stage >= 4)
REMOVE_TRAIT(A.affected_mob, TRAIT_NOBREATH, DISEASE_TRAIT)
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm
index 1f8cc8d7af..bbacdd885d 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_desc = 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 741e2a1e16..fa51f8fa7e 100644
--- a/code/datums/diseases/advance/symptoms/shivering.dm
+++ b/code/datums/diseases/advance/symptoms/shivering.dm
@@ -1,59 +1,61 @@
-/*
-//////////////////////////////////////
-
-Shivering
-
- No change to hidden.
- Increases resistance.
- Increases stage speed.
- Little transmittable.
- Low level.
-
-Bonus
- Cools down your body.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/shivering
- name = "Shivering"
- desc = "The virus inhibits the body's thermoregulation, cooling the body down."
- stealth = 0
- resistance = 2
- stage_speed = 2
- transmittable = 2
- level = 2
- severity = 2
- 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."
-
-/datum/symptom/fever/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stage_rate"] >= 5) //dangerous cold
- power = 1.5
- unsafe = TRUE
- if(A.properties["stage_rate"] >= 10)
- power = 2.5
-
-/datum/symptom/shivering/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
- if(!unsafe || A.stage < 4)
- to_chat(M, "[pick("You feel cold.", "You shiver.")]")
- else
- to_chat(M, "[pick("You feel your blood run cold.", "You feel ice in your veins.", "You feel like you can't heat up.", "You shiver violently." )]")
- if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT || unsafe)
- Chill(M, A)
-
-/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
- var/get_cold = 6 * power
- var/limit = BODYTEMP_COLD_DAMAGE_LIMIT + 1
- if(unsafe)
- limit = 0
- M.adjust_bodytemperature(-get_cold * A.stage, limit)
+/*
+//////////////////////////////////////
+
+Shivering
+
+ No change to hidden.
+ Increases resistance.
+ Increases stage speed.
+ Little transmittable.
+ Low level.
+
+Bonus
+ Cools down your body.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/shivering
+ name = "Shivering"
+ desc = "The virus inhibits the body's thermoregulation, cooling the body down."
+ stealth = 0
+ resistance = 2
+ stage_speed = 2
+ transmittable = 2
+ level = 2
+ severity = 2
+ symptom_delay_min = 10
+ symptom_delay_max = 30
+ var/unsafe = FALSE //over the cold threshold
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stage_rate"] >= 5) //dangerous cold
+ power = 1.5
+ unsafe = TRUE
+ if(A.properties["stage_rate"] >= 10)
+ power = 2.5
+
+/datum/symptom/shivering/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ if(!unsafe || A.stage < 4)
+ to_chat(M, "[pick("You feel cold.", "You shiver.")]")
+ else
+ to_chat(M, "[pick("You feel your blood run cold.", "You feel ice in your veins.", "You feel like you can't heat up.", "You shiver violently." )]")
+ if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT || unsafe)
+ Chill(M, A)
+
+/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
+ var/get_cold = 6 * power
+ var/limit = BODYTEMP_COLD_DAMAGE_LIMIT + 1
+ if(unsafe)
+ limit = 0
+ M.adjust_bodytemperature(-get_cold * A.stage, limit)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index 5d4d40fb95..c6a3431750 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/advance/symptoms/sneeze.dm
@@ -1,52 +1,54 @@
-/*
-//////////////////////////////////////
-
-Sneezing
-
- Very Noticable.
- Increases resistance.
- Doesn't increase stage speed.
- Very transmissible.
- Low Level.
-
-Bonus
- Forces a spread type of AIRBORNE
- with extra range!
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/sneeze
- name = "Sneezing"
- desc = "The virus causes irritation of the nasal cavity, making the host sneeze occasionally."
- stealth = -2
- resistance = 3
- stage_speed = 0
- transmittable = 4
- level = 1
- 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."
-
-/datum/symptom/sneeze/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["transmittable"] >= 9) //longer spread range
- power = 2
- if(A.properties["stealth"] >= 4)
- suppress_warning = TRUE
-
-/datum/symptom/sneeze/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3)
- if(!suppress_warning)
- M.emote("sniff")
- else
- M.emote("sneeze")
- if(M.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
+/*
+//////////////////////////////////////
+
+Sneezing
+
+ Very Noticable.
+ Increases resistance.
+ Doesn't increase stage speed.
+ Very transmissible.
+ Low Level.
+
+Bonus
+ Forces a spread type of AIRBORNE
+ with extra range!
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/sneeze
+ name = "Sneezing"
+ desc = "The virus causes irritation of the nasal cavity, making the host sneeze occasionally."
+ stealth = -2
+ resistance = 3
+ stage_speed = 0
+ transmittable = 4
+ level = 1
+ severity = 1
+ symptom_delay_min = 5
+ symptom_delay_max = 35
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["transmittable"] >= 9) //longer spread range
+ power = 2
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+
+/datum/symptom/sneeze/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3)
+ if(!suppress_warning)
+ M.emote("sniff")
+ else
+ M.emote("sneeze")
+ if(M.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
A.spread(4 + power)
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm
index b4a33cb837..6c9ad5a941 100644
--- a/code/datums/diseases/advance/symptoms/vision.dm
+++ b/code/datums/diseases/advance/symptoms/vision.dm
@@ -29,9 +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_desc = 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(!..())
return
diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm
index 8b9b7d069a..f065708c16 100644
--- a/code/datums/diseases/advance/symptoms/voice_change.dm
+++ b/code/datums/diseases/advance/symptoms/voice_change.dm
@@ -1,81 +1,83 @@
-/*
-//////////////////////////////////////
-
-Voice Change
-
- Noticeable.
- Lowers resistance.
- Decreases stage speed.
- Increased transmittable.
- Fatal Level.
-
-Bonus
- Changes the voice of the affected mob. Causing confusion in communication.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/voice_change
-
- name = "Voice Change"
- desc = "The virus alters the pitch and tone of the host's vocal cords, changing how their voice sounds."
- stealth = -1
- resistance = -2
- stage_speed = -2
- transmittable = 2
- level = 6
- severity = 2
- base_message_chance = 100
- symptom_delay_min = 60
- symptom_delay_max = 120
- var/scramble_language = FALSE
- var/datum/language/current_language
- var/datum/language_holder/original_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."
-
-/datum/symptom/voice_change/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 3)
- suppress_warning = TRUE
- if(A.properties["stage_rate"] >= 7) //faster change of voice
- base_message_chance = 25
- symptom_delay_min = 25
- symptom_delay_max = 85
- if(A.properties["transmittable"] >= 14) //random language
- scramble_language = TRUE
- var/mob/living/M = A.affected_mob
- var/datum/language_holder/mob_language = M.get_language_holder()
- original_language = mob_language.copy()
-
-/datum/symptom/voice_change/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/carbon/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3, 4)
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("Your throat hurts.", "You clear your throat.")]")
- else
- 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)
- current_language = pick(subtypesof(/datum/language) - /datum/language/common)
- H.grant_language(current_language)
- var/datum/language_holder/mob_language = H.get_language_holder()
- mob_language.only_speaks_language = current_language
-
-/datum/symptom/voice_change/End(datum/disease/advance/A)
- ..()
- if(ishuman(A.affected_mob))
- 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)
- current_language = null
- QDEL_NULL(original_language)
+/*
+//////////////////////////////////////
+
+Voice Change
+
+ Noticeable.
+ Lowers resistance.
+ Decreases stage speed.
+ Increased transmittable.
+ Fatal Level.
+
+Bonus
+ Changes the voice of the affected mob. Causing confusion in communication.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/voice_change
+
+ name = "Voice Change"
+ desc = "The virus alters the pitch and tone of the host's vocal cords, changing how their voice sounds."
+ stealth = -1
+ resistance = -2
+ stage_speed = -2
+ transmittable = 2
+ level = 6
+ severity = 2
+ base_message_chance = 100
+ symptom_delay_min = 60
+ symptom_delay_max = 120
+ var/scramble_language = FALSE
+ var/datum/language/current_language
+ var/datum/language_holder/original_language
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stealth"] >= 3)
+ suppress_warning = TRUE
+ if(A.properties["stage_rate"] >= 7) //faster change of voice
+ base_message_chance = 25
+ symptom_delay_min = 25
+ symptom_delay_max = 85
+ if(A.properties["transmittable"] >= 14) //random language
+ scramble_language = TRUE
+ var/mob/living/M = A.affected_mob
+ var/datum/language_holder/mob_language = M.get_language_holder()
+ original_language = mob_language.copy()
+
+/datum/symptom/voice_change/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/carbon/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3, 4)
+ if(prob(base_message_chance) && !suppress_warning)
+ to_chat(M, "[pick("Your throat hurts.", "You clear your throat.")]")
+ else
+ 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)
+ current_language = pick(subtypesof(/datum/language) - /datum/language/common)
+ H.grant_language(current_language)
+ var/datum/language_holder/mob_language = H.get_language_holder()
+ mob_language.only_speaks_language = current_language
+
+/datum/symptom/voice_change/End(datum/disease/advance/A)
+ ..()
+ if(ishuman(A.affected_mob))
+ 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)
+ current_language = null
+ QDEL_NULL(original_language)
diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm
index f53638bc12..a937e9e212 100644
--- a/code/datums/diseases/advance/symptoms/vomit.dm
+++ b/code/datums/diseases/advance/symptoms/vomit.dm
@@ -1,63 +1,65 @@
-/*
-//////////////////////////////////////
-
-Vomiting
-
- Very Very Noticable.
- Decreases resistance.
- Doesn't increase stage speed.
- Little transmissibility.
- Medium Level.
-
-Bonus
- Forces the affected mob to vomit!
- Meaning your disease can spread via
- people walking on vomit.
- Makes the affected mob lose nutrition and
- heal toxin damage.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/vomit
-
- name = "Vomiting"
- desc = "The virus causes nausea and irritates the stomach, causing occasional vomit."
- stealth = -2
- resistance = -1
- stage_speed = 0
- transmittable = 1
- level = 3
- severity = 3
- base_message_chance = 100
- symptom_delay_min = 25
- 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."
-
-/datum/symptom/vomit/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 4)
- suppress_warning = TRUE
- if(A.properties["resistance"] >= 7) //blood vomit
- vomit_blood = TRUE
- if(A.properties["transmittable"] >= 7) //projectile vomit
- proj_vomit = 5
-
-/datum/symptom/vomit/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3, 4)
- if(prob(base_message_chance) && !suppress_warning)
- to_chat(M, "[pick("You feel nauseated.", "You feel like you're going to throw up!")]")
- else
- vomit(M)
-
-/datum/symptom/vomit/proc/vomit(mob/living/carbon/M)
- M.vomit(20, vomit_blood, distance = proj_vomit)
+/*
+//////////////////////////////////////
+
+Vomiting
+
+ Very Very Noticable.
+ Decreases resistance.
+ Doesn't increase stage speed.
+ Little transmissibility.
+ Medium Level.
+
+Bonus
+ Forces the affected mob to vomit!
+ Meaning your disease can spread via
+ people walking on vomit.
+ Makes the affected mob lose nutrition and
+ heal toxin damage.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/vomit
+
+ name = "Vomiting"
+ desc = "The virus causes nausea and irritates the stomach, causing occasional vomit."
+ stealth = -2
+ resistance = -1
+ stage_speed = 0
+ transmittable = 1
+ level = 3
+ severity = 3
+ base_message_chance = 100
+ symptom_delay_min = 25
+ symptom_delay_max = 80
+ var/vomit_blood = FALSE
+ var/proj_vomit = 0
+ threshold_desc = 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(!..())
+ return
+ if(A.properties["stealth"] >= 4)
+ suppress_warning = TRUE
+ if(A.properties["resistance"] >= 7) //blood vomit
+ vomit_blood = TRUE
+ if(A.properties["transmittable"] >= 7) //projectile vomit
+ proj_vomit = 5
+
+/datum/symptom/vomit/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3, 4)
+ if(prob(base_message_chance) && !suppress_warning)
+ to_chat(M, "[pick("You feel nauseated.", "You feel like you're going to throw up!")]")
+ else
+ vomit(M)
+
+/datum/symptom/vomit/proc/vomit(mob/living/carbon/M)
+ M.vomit(20, vomit_blood, distance = proj_vomit)
diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm
index 66fc90f1f8..92f05ce3ea 100644
--- a/code/datums/diseases/advance/symptoms/weight.dm
+++ b/code/datums/diseases/advance/symptoms/weight.dm
@@ -1,51 +1,53 @@
-/*
-//////////////////////////////////////
-
-Weight Loss
-
- Very Very Noticable.
- Decreases resistance.
- Decreases stage speed.
- Reduced Transmittable.
- High level.
-
-Bonus
- Decreases the weight of the mob,
- forcing it to be skinny.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/weight_loss
-
- name = "Weight Loss"
- desc = "The virus mutates the host's metabolism, making it almost unable to gain nutrition from food."
- stealth = -2
- resistance = 2
- stage_speed = -2
- transmittable = -2
- level = 3
- severity = 3
- base_message_chance = 100
- symptom_delay_min = 15
- symptom_delay_max = 45
- threshold_desc = "Stealth 4: The symptom is less noticeable."
-
-/datum/symptom/weight_loss/Start(datum/disease/advance/A)
- if(!..())
- return
- if(A.properties["stealth"] >= 4) //warn less often
- base_message_chance = 25
-
-/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
- if(!..())
- return
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2, 3, 4)
- if(prob(base_message_chance))
- to_chat(M, "[pick("You feel hungry.", "You crave for food.")]")
- 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)
+/*
+//////////////////////////////////////
+
+Weight Loss
+
+ Very Very Noticable.
+ Decreases resistance.
+ Decreases stage speed.
+ Reduced Transmittable.
+ High level.
+
+Bonus
+ Decreases the weight of the mob,
+ forcing it to be skinny.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/weight_loss
+
+ name = "Weight Loss"
+ desc = "The virus mutates the host's metabolism, making it almost unable to gain nutrition from food."
+ stealth = -2
+ resistance = 2
+ stage_speed = -2
+ transmittable = -2
+ level = 3
+ severity = 3
+ base_message_chance = 100
+ symptom_delay_min = 15
+ symptom_delay_max = 45
+ threshold_desc = list(
+ "Stealth 4" = "The symptom is less noticeable."
+ )
+
+/datum/symptom/weight_loss/Start(datum/disease/advance/A)
+ if(!..())
+ return
+ if(A.properties["stealth"] >= 4) //warn less often
+ base_message_chance = 25
+
+/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
+ if(!..())
+ return
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2, 3, 4)
+ if(prob(base_message_chance))
+ to_chat(M, "[pick("You feel hungry.", "You crave for food.")]")
+ 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.nutrition = max(M.nutrition - 100, 0)
\ No newline at end of file
diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm
index bb7dc4cdb7..95ea4b1b93 100644
--- a/code/datums/spawners_menu.dm
+++ b/code/datums/spawners_menu.dm
@@ -1,54 +1,58 @@
-/datum/spawners_menu
- var/mob/dead/observer/owner
-
-/datum/spawners_menu/New(mob/dead/observer/new_owner)
- if(!istype(new_owner))
- qdel(src)
- owner = new_owner
-
-/datum/spawners_menu/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.observer_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "spawners_menu", "Spawners Menu", 700, 600, master_ui, state)
- ui.open()
-
-/datum/spawners_menu/ui_data(mob/user)
- var/list/data = list()
- data["spawners"] = list()
- for(var/spawner in GLOB.mob_spawners)
- var/list/this = list()
- this["name"] = spawner
- this["desc"] = ""
- this["refs"] = list()
- for(var/spawner_obj in GLOB.mob_spawners[spawner])
- this["refs"] += "[REF(spawner_obj)]"
- if(!this["desc"])
- if(istype(spawner_obj, /obj/effect/mob_spawn))
- var/obj/effect/mob_spawn/MS = spawner_obj
- this["desc"] = MS.flavour_text
- else
- var/obj/O = spawner_obj
- this["desc"] = O.desc
- this["amount_left"] = LAZYLEN(GLOB.mob_spawners[spawner])
- data["spawners"] += list(this)
-
- return data
-
-/datum/spawners_menu/ui_act(action, params)
- if(..())
- return
-
- var/spawner_ref = pick(GLOB.mob_spawners[params["name"]])
- var/obj/effect/mob_spawn/MS = locate(spawner_ref) in GLOB.poi_list
- if(!MS)
- return
-
- switch(action)
- if("jump")
- if(MS)
- owner.forceMove(get_turf(MS))
- . = TRUE
- if("spawn")
- if(MS)
- MS.attack_ghost(owner)
+/datum/spawners_menu
+ var/mob/dead/observer/owner
+
+/datum/spawners_menu/New(mob/dead/observer/new_owner)
+ if(!istype(new_owner))
+ qdel(src)
+ owner = new_owner
+
+/datum/spawners_menu/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.observer_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "spawners_menu", "Spawners Menu", 700, 600, master_ui, state)
+ ui.open()
+
+/datum/spawners_menu/ui_data(mob/user)
+ var/list/data = list()
+ data["spawners"] = list()
+ for(var/spawner in GLOB.mob_spawners)
+ var/list/this = list()
+ this["name"] = spawner
+ this["short_desc"] = ""
+ this["flavor_text"] = ""
+ this["important_warning"] = ""
+ this["refs"] = list()
+ for(var/spawner_obj in GLOB.mob_spawners[spawner])
+ this["refs"] += "[REF(spawner_obj)]"
+ if(!this["desc"])
+ if(istype(spawner_obj, /obj/effect/mob_spawn))
+ var/obj/effect/mob_spawn/MS = spawner_obj
+ this["short_desc"] = MS.short_desc
+ this["flavor_text"] = MS.flavour_text
+ this["important_info"] = MS.important_info
+ else
+ var/obj/O = spawner_obj
+ this["desc"] = O.desc
+ this["amount_left"] = LAZYLEN(GLOB.mob_spawners[spawner])
+ data["spawners"] += list(this)
+
+ return data
+
+/datum/spawners_menu/ui_act(action, params)
+ if(..())
+ return
+
+ var/spawner_ref = pick(GLOB.mob_spawners[params["name"]])
+ var/obj/effect/mob_spawn/MS = locate(spawner_ref) in GLOB.poi_list
+ if(!MS)
+ return
+
+ switch(action)
+ if("jump")
+ if(MS)
+ owner.forceMove(get_turf(MS))
+ . = TRUE
+ if("spawn")
+ if(MS)
+ MS.attack_ghost(owner)
. = TRUE
\ No newline at end of file
diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm
index fab5a1313c..52e9f39a51 100644
--- a/code/datums/wires/_wires.dm
+++ b/code/datums/wires/_wires.dm
@@ -215,8 +215,8 @@
/datum/wires/ui_interact(mob/user, ui_key = "wires", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if (!ui)
- ui = new(user, src, ui_key, "wires", "[holder.name] wires", 350, 150 + wires.len * 30, master_ui, state)
+ if(!ui)
+ ui = new(user, src, ui_key, "wires", "[holder.name] Wires", 350, 150 + wires.len * 30, master_ui, state)
ui.open()
/datum/wires/ui_data(mob/user)
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 5f44fccdac..a0666b3133 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -113,6 +113,11 @@ Class Procs:
var/atom/movable/occupant = null
var/speed_process = FALSE // Process as fast as possible?
var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created
+ // For storing and overriding ui id and dimensions
+ var/tgui_id // ID of TGUI interface
+ var/ui_style // ID of custom TGUI style (optional)
+ var/ui_x
+ var/ui_y
var/interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 0b9ed6bb3f..41867a8520 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -46,34 +46,37 @@
new /obj/item/stack/spacecash/c200(drop_location()) // will autostack
playsound(src.loc, 'sound/items/poster_being_created.ogg', 100, 1)
SSshuttle.points -= 200
- if(next_warning < world.time && prob(15))
- var/area/A = get_area(loc)
- var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!"
- radio.talk_into(src, message, radio_channel)
- next_warning = world.time + minimum_time_between_warnings
+ if(next_warning < world.time && prob(15))
+ var/area/A = get_area(loc)
+ var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!"
+ radio.talk_into(src, message, radio_channel)
+ next_warning = world.time + minimum_time_between_warnings
-/obj/machinery/computer/bank_machine/ui_interact(mob/user)
- . = ..()
- var/dat = "[station_name()] secure vault. Authorized personnel only.
"
- dat += "Current Balance: [SSshuttle.points] credits.
"
- if(!siphoning)
- dat += "Siphon Credits
"
- else
- dat += "Halt Credit Siphon
"
+/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()
- dat += "Close"
+/obj/machinery/computer/bank_machine/ui_data(mob/user)
+ var/list/data = list()
+ data["current_balance"] = SSshuttle.points
+ data["siphoning"] = siphoning
+ data["station_name"] = station_name()
- var/datum/browser/popup = new(user, "computer", "Bank Vault", 300, 200)
- popup.set_content("
Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of - energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator - will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.
-Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then - please proceed to panic; otherwise follow these steps.
Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of + energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator + will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.
+Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then + please proceed to panic; otherwise follow these steps.