diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm
index 8f8bf16a..aef7a704 100644
--- a/code/game/gamemodes/dynamic/dynamic.dm
+++ b/code/game/gamemodes/dynamic/dynamic.dm
@@ -351,8 +351,8 @@ GLOBAL_VAR_INIT(dynamic_chaos_level, 1.5)
if (ruleset.weight)
midround_rules += ruleset
if ("Event")
- if(ruleset.weight)
- event_rules += ruleset
+ //if(ruleset.weight)
+ event_rules += ruleset
for(var/mob/dead/new_player/player in GLOB.player_list)
if(player.ready == PLAYER_READY_TO_PLAY && player.mind)
roundstart_pop_ready++
@@ -644,7 +644,7 @@ GLOBAL_VAR_INIT(dynamic_chaos_level, 1.5)
if (prob(get_injection_chance()))
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/midround/rule in midround_rules)
- if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost)
+ if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level))
// Classic secret : only autotraitor/minor roles
if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET)))
continue
@@ -665,10 +665,10 @@ GLOBAL_VAR_INIT(dynamic_chaos_level, 1.5)
update_playercounts()
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/event/rule in event_rules)
- if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost)
+ if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level))
// Classic secret : only autotraitor/minor roles
- if (!GLOB.master_mode == "dynamic")
- continue
+ //if (!GLOB.master_mode == "dynamic")
+ //continue
if (world.time < rule.earliest_start)
continue
if(rule.occurances_current >= rule.occurances_max && rule.occurances_max)
@@ -676,8 +676,9 @@ GLOBAL_VAR_INIT(dynamic_chaos_level, 1.5)
rule.candidates = list()
rule.candidates = current_players.Copy()
rule.trim_candidates()
- if (rule.ready() && rule.candidates.len > 0)
- drafted_rules[rule] = rule.get_weight()
+ //if(rule.needs_players)
+ //if (rule.ready() && rule.candidates.len > 0)
+ drafted_rules[rule] = rule.get_weight()
if(drafted_rules.len > 0)
picking_midround_latejoin_rule(drafted_rules)
@@ -727,13 +728,14 @@ GLOBAL_VAR_INIT(dynamic_chaos_level, 1.5)
chance += 25-10*(max_pop_per_antag-current_pop_per_antag)
*/
//Hyper change - Base injection chance based on chaos.
- chance = (GLOB.dynamic_chaos_level * 10) //Base chance from 0 to 50
+ chance = (GLOB.dynamic_chaos_level * 12) //Base chance from 0 to 60
if (current_players[CURRENT_DEAD_PLAYERS].len > current_players[CURRENT_LIVING_PLAYERS].len)
chance -= 30 // More than half the crew died? ew, let's calm down on antags
- if (threat > 70)
- chance += 15
- if (threat < 30)
- chance -= 15
+ //if (threat > 70)
+ // chance += 15
+ //if (threat < 30)
+ // chance -= 15
+ chance += ((threat-40)*0.4) //threat influence injection chance more gradually
if (chance > 100) //I don't know what would happen if we returned a probability greater than 100%
return 100 //So I won't
return round(max(0,chance))
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm
index d4028c43..ecefbb51 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm
@@ -3,9 +3,10 @@
var/typepath // typepath of the event
var/controller //round event controller for the event - Required for certain events dependendant on variables within their controllers
var/triggering
- var/earliest_start = 20 MINUTES
+ var/earliest_start = 20 MINUTES
var/occurances_current = 0 //Don't touch this. Skyrat Change.
var/occurances_max = 0 //Maximum occurances for this event. Set to 0 to allow an infinite amount of this event. Skyrat change.
+ var/needs_players = FALSE //If an event needs players, living or ghosts, set to TRUE. Bypasses the trim_candidates otherwise
var/restrict_ghost_roles = TRUE
var/required_type = /mob/living/carbon/human
var/list/living_players = list()
@@ -26,7 +27,7 @@
if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it
- var/threat = round(mode.threat_level/10)
+ var/threat = max(min(round(mode.threat_level/10),9),1) //min() to stop index errors at 100 threat //Max to stop breaking at 0 threat.
if (job_check < required_enemies[threat])
return FALSE
return ..()
@@ -420,16 +421,22 @@
/datum/dynamic_ruleset/event/operative
name = "Lone Operative"
+ controller = /datum/round_event_control/operative
typepath = /datum/round_event/ghost_role/operative
+ required_enemies = list(0,0,0,0,0,0,0,0,0,0)
weight = 0 //This is changed in nuclearbomb.dm
occurances_max = 1
requirements = list(10,5,0,0,0,0,0,0,0,0) //SECURE THAT DISK
cost = 50
-/datum/dynamic_ruleset/event/operative/ready()
+/datum/dynamic_ruleset/event/operative/get_weight()
var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control
if(istype(loneop))
weight = loneop.weight //Get the weight whenever it's called.
+ to_chat(GLOB.admins, "Current LoneOP weight [weight]")
+ else
+ to_chat(GLOB.admins, "LoneOP is fucking broken.")
+ return weight
//////////////////////////////////////////////
// //
@@ -463,7 +470,7 @@
cost = 4
requirements = list(101,5,5,1,1,1,1,1,1,1)
high_population_requirement = 10
- earliest_start = 10 MINUTES
+ earliest_start = 0 MINUTES
repeatable = TRUE
//property_weights = list("extended" = 1)
occurances_max = 3
@@ -565,7 +572,7 @@
//config_tag = "radiation_storm"
typepath = /datum/round_event/radiation_storm
cost = 3
- weight = 3
+ weight = 2
repeatable_weight_decrease = 2
enemy_roles = list("Chemist","Chief Medical Officer","Geneticist","Medical Doctor","AI","Captain")
required_enemies = list(1,1,1,1,1,1,1,1,1,1)
@@ -715,7 +722,7 @@
weight = 100
repeatable_weight_decrease = 1 //Slightly drop the weight each time it is called to keep the pool from getting too diluted as the round goes on.
repeatable = TRUE
- //occurances_max = 20 //Our rounds can go for a WHILE
+ occurances_max = 200 //Our rounds can go for a WHILE
/datum/dynamic_ruleset/event/disease_outbreak
name = "Disease Outbreak"
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
index a51cd078..8ba449c9 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
@@ -31,8 +31,7 @@
continue // Dead players cannot count as opponents
if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it
-
- var/threat = round(mode.threat_level/10)
+ var/threat = min(round(mode.threat_level/10),9)
if (job_check < required_enemies[threat])
return FALSE
return ..()
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
index 376f4127..c40e04d6 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
@@ -100,7 +100,7 @@
if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it
- var/threat = round(mode.threat_level/10)
+ var/threat = min(round(mode.threat_level/10),9)
if (job_check < required_enemies[threat])
return FALSE
return TRUE
@@ -258,6 +258,112 @@
return TRUE
+//////////////////////////////////////////
+// //
+// LEWD //
+// //
+//////////////////////////////////////////
+
+/datum/dynamic_ruleset/midround/autotraitor/lewd
+ name = "Horny Traitor"
+ persistent = TRUE
+ antag_flag = ROLE_LEWD_TRAITOR
+ antag_datum = /datum/antagonist/traitor/lewd
+ //minimum_required_age = 7
+ protected_roles = list("AI","Cyborg")
+ restricted_roles = list("Cyborg","AI")
+ required_candidates = 1
+ weight = 2
+ cost = 0
+ requirements = list(10,10,10,10,10,10,10,10,10,10)
+ high_population_requirement = 10
+ chaos_min = 0.1
+ chaos_max = 2.5
+ admin_required = TRUE
+ //vars for execution
+ var/list/mob/living/carbon/human/lewd_candidates = list()
+ var/list/mob/living/carbon/human/targets = list()
+ var/numTraitors = 1
+
+/datum/dynamic_ruleset/midround/autotraitor/lewd/acceptable(population = 0, threat = 0) //copy paste to bypass parent
+ if(minimum_players > population)
+ return FALSE
+ if(maximum_players > 0 && population > maximum_players)
+ return FALSE
+ if(GLOB.dynamic_chaos_level < chaos_min || GLOB.dynamic_chaos_level > chaos_max)
+ return FALSE
+ if(admin_required && !GLOB.admins.len)
+ return FALSE
+ if (population >= GLOB.dynamic_high_pop_limit)
+ return (mode.threat_level >= high_population_requirement)
+ else
+ pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : mode.pop_per_requirement
+ var/indice_pop = min(10,round(population/pop_per_requirement)+1)
+ return (mode.threat_level >= requirements[indice_pop])
+
+/datum/dynamic_ruleset/midround/autotraitor/lewd/trim_candidates()
+ ..()
+ lewd_candidates = living_players
+ for(var/mob/living/player in lewd_candidates)
+ if(issilicon(player)) // Your assigned role doesn't change when you are turned into a silicon.
+ lewd_candidates -= player
+ continue
+ if(is_centcom_level(player.z))
+ lewd_candidates -= player // We don't autotator people in CentCom
+ continue
+ if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0))
+ lewd_candidates -= player // We don't autotator people with roles already
+
+/datum/dynamic_ruleset/midround/autotraitor/lewd/trim_list(list/L = list())
+ var/list/trimmed_list = L.Copy()
+ var/antag_name = initial(antag_flag)
+ for(var/mob/living/M in trimmed_list)
+ if (!istype(M, required_type))
+ trimmed_list.Remove(M)
+ continue
+ if (!M.client) // Are they connected?
+ trimmed_list.Remove(M)
+ continue
+ if(!mode.check_age(M.client, minimum_required_age))
+ trimmed_list.Remove(M)
+ continue
+ if (!(antag_name in M.client.prefs.be_special) || jobban_isbanned(M.ckey, list(antag_name, ROLE_SYNDICATE)))//are they willing and not antag-banned?
+ trimmed_list.Remove(M)
+ continue
+ if (M.mind)
+ if (restrict_ghost_roles && M.mind.assigned_role in GLOB.exp_specialmap[EXP_TYPE_SPECIAL]) // Are they playing a ghost role?
+ trimmed_list.Remove(M)
+ continue
+ if (M.mind.assigned_role in restricted_roles) // All this work to bypass mindshield restriction
+ trimmed_list.Remove(M)
+ continue
+ if ((exclusive_roles.len > 0) && !(M.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job?
+ trimmed_list.Remove(M)
+ continue
+ return trimmed_list
+
+/datum/dynamic_ruleset/midround/autotraitor/lewd/ready()
+ for(var/mob/living/target in living_players)
+ if(target.client.prefs.noncon)
+ targets += target
+
+ if(lewd_candidates.len)
+ numTraitors = min(lewd_candidates.len, targets.len, numTraitors)
+ if(numTraitors == 0)
+ to_chat(GLOB.admins, "No lewd traitors created. Are there any valid targets?")
+ return 0
+ return 1
+
+ return 0
+
+/datum/dynamic_ruleset/midround/autotraitor/lewd/execute()
+ var/mob/M = pick(lewd_candidates)
+ lewd_candidates -= M
+ assigned += M.mind
+ var/datum/antagonist/traitor/lewd/newTraitor = new
+ M.mind.add_antag_datum(newTraitor)
+ return TRUE
+
//////////////////////////////////////////////
// //
// Malfunctioning AI //
@@ -268,7 +374,7 @@
name = "Malfunctioning AI"
antag_datum = /datum/antagonist/traitor
antag_flag = ROLE_MALF
- enemy_roles = list("Security Officer", "Warden","Detective","Head of Security", "Captain", "Scientist", "Research Director", "Chief Engineer")
+ enemy_roles = list("Security Officer", "Warden","Detective","Head of Security", "Captain", "Scientist", "Research Director", "Chief Engineer", "Engineer", "Shaft Miner")
exclusive_roles = list("AI")
required_enemies = list(4,4,4,4,4,4,2,2,2,0)
required_candidates = 1
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
index 495b0980..30586ee2 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
@@ -61,7 +61,6 @@
mode.picking_specific_rule(/datum/dynamic_ruleset/midround/autotraitor)
*/
-/* //Not currently functional
//////////////////////////////////////////
// //
// LEWD //
@@ -77,25 +76,24 @@
protected_roles = list("AI","Cyborg")
restricted_roles = list("Cyborg","AI")
required_candidates = 1
- weight = 5
+ weight = 3
cost = 0
- requirements = list(10,10,10,10,10,10,10,10,10,10)
+ requirements = list(101,10,10,10,10,10,10,10,10,10)
high_population_requirement = 10
chaos_min = 0.1
- chaos_max = 2.0
+ chaos_max = 2.5
admin_required = TRUE
//vars for execution
var/list/mob/living/carbon/human/lewd_candidates = list()
- var/numTraitors = 0
+ var/numTraitors = 1
-/datum/dynamic_ruleset/roundstart/traitor/lewd/pre_execute()
+/datum/dynamic_ruleset/roundstart/traitor/lewd/ready()
var/list/mob/living/carbon/human/targets = list()
- for(var/mob/living/carbon/human/target in GLOB.player_list)
+ for(var/mob/dead/new_player/target in GLOB.player_list)
if(target.client.prefs.noncon)
- if(!(target.job in restricted_roles))
- targets += target
+ targets += target
if(candidates.len)
var/numTraitors = min(candidates.len, targets.len, 1) //This number affects the maximum number of traitors. We want 1 for right now.
@@ -105,14 +103,26 @@
return 1
return 0
+
+/datum/dynamic_ruleset/roundstart/traitor/lewd/pre_execute()
+ var/traitor_scaling_coeff = 10 - max(0,round(mode.threat_level/10)-5) // Above 50 threat level, coeff goes down by 1 for every 10 levels
+ var/num_traitors = min(round(mode.candidates.len / traitor_scaling_coeff) + 1, candidates.len)
+ for (var/i = 1 to num_traitors)
+ var/mob/M = pick(candidates)
+ candidates -= M
+ assigned += M.mind
+ M.mind.special_role = ROLE_LEWD_TRAITOR
+ M.mind.restricted_roles = restricted_roles
+ return TRUE
+/*
/datum/dynamic_ruleset/roundstart/traitor/lewd/execute()
- var/mob/living/carbon/human/H = null
+ var/datum/mind/M = null
if(numTraitors)
for(var/i = 0, i