diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 0992b2e586..7a284ff1a0 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -75,3 +75,10 @@
#define JP_LOW 1
#define JP_MEDIUM 2
#define JP_HIGH 3
+
+//Chaos levels for dynamic voting
+#define CHAOS_NONE "None (Extended)"
+#define CHAOS_LOW "Low"
+#define CHAOS_MED "Medium"
+#define CHAOS_HIGH "High"
+#define CHAOS_MAX "Maximum"
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 605782535b..f87d3a9c25 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -153,9 +153,24 @@ SUBSYSTEM_DEF(vote)
if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started.
return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.")
GLOB.master_mode = "dynamic"
- if(voted.len==0)
- return message_admins("Nobody voted in the dynamic vote; using default dynamic settings.")
- var/mean = (choices[PEACE]*-1+choices[CHAOS])/voted.len
+ var/mean = 0
+ var/voters = 0
+ for(var/client/c in GLOB.clients)
+ var/vote = c.prefs.preferred_chaos
+ if(vote)
+ voters += 1
+ switch(vote)
+ if(CHAOS_NONE)
+ mean -= 0.1
+ if(CHAOS_LOW)
+ mean -= 0.05
+ if(CHAOS_HIGH)
+ mean += 0.05
+ if(CHAOS_MAX)
+ mean += 0.1
+ mean/=voters
+ if(voted.len != 0)
+ mean += (choices[PEACE]*-1+choices[CHAOS])/voted.len
GLOB.dynamic_curve_centre = mean*20
GLOB.dynamic_curve_width = CLAMP(4-abs(mean*3.5),0.5,4)
to_chat(world,"Dynamic curve centre set to [GLOB.dynamic_curve_centre] and width set to [GLOB.dynamic_curve_width].")
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index edec4d74a6..90b47aa53b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -58,6 +58,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/inquisitive_ghost = 1
var/allow_midround_antag = 1
var/preferred_map = null
+ var/preferred_chaos = null
var/pda_style = MONO
var/pda_color = "#808000"
var/pda_skin = PDA_SKIN_ALT
@@ -834,6 +835,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
"
if (user && user.client && !user.client.prefs.screenshake==0)
dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
"
+ var/p_chaos
+ if (!preferred_chaos)
+ p_chaos = "No preference"
+ else
+ p_chaos = preferred_chaos
+ dat += "Preferred Chaos Amount: [p_chaos]
"
dat += "
"
dat += ""
dat += ""
@@ -1996,6 +2003,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (pickedmap)
preferred_map = maplist[pickedmap]
+ if ("preferred_chaos")
+ var/pickedchaos = input(user, "Choose your preferred level of chaos. This will help with dynamic threat level ratings.", "Character Preference") as null|anything in list(CHAOS_NONE,CHAOS_LOW,CHAOS_MED,CHAOS_HIGH,CHAOS_MAX)
+ preferred_chaos = pickedchaos
if ("clientfps")
var/desiredfps = input(user, "Choose your desired fps. (0 = synced with server tick rate (currently:[world.fps]))", "Character Preference", clientfps) as null|num
if (!isnull(desiredfps))
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 98ef2ed0e8..29ea8f5821 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -183,6 +183,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["autostand"] >> autostand
S["cit_toggles"] >> cit_toggles
S["lewdchem"] >> lewdchem
+ S["preferred_chaos"] >> preferred_chaos
+
//try to fix any outdated data if necessary
if(needs_update >= 0)
@@ -278,6 +280,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["autostand"], autostand)
WRITE_FILE(S["cit_toggles"], cit_toggles)
WRITE_FILE(S["lewdchem"], lewdchem)
+ WRITE_FILE(S["preferred_chaos"], preferred_chaos)
return 1