Hello!
Dynamic is highly unblalanced.
I believe it should be changed.
I’ll explain how dynamics works, for people who are not familiar with it.
Most of the stuff written here is straight up ripped from the code (I tried removing all mentions of useless stuff, if you’re curious you can check in code/game/gamemodes/dynamic)
Dynamic initially rolls threat based on a special sauce formula:
“dynamic_curve_width * tan((3.1416 * (rand() - 0.5) * 57.2957795)) + dynamic_curve_centre”
Most rounds will have a threat level around ~50, but chaotic and tame rounds still exist for variety.
This threat is then split into two separate budgets: a round_start_budget
and a mid_round_budget
.
For example, a round with 50 threat might be split into a 30 roundstart budget, and a 20 midround budget.
The roundstart budget is used to apply antagonists applied on readied players.
The midround budget is used for two types of rulesets:
-
/datum/dynamic_ruleset/midround
- Rulesets that apply to either existing alive players, or to ghosts. Think Blob or Space Ninja, which poll ghosts asking if they want to play as these roles. -
/datum/dynamic_ruleset/latejoin
- Rulesets that apply to the next player that joins. Think Syndicate Infiltrator, which converts a player just joining an existing round into traitor.
The gamemode will try to spend as many points as it can.
If the same threat is picked twice, it will “scale up”. The meaning of this depends on the ruleset itself, using the scaled_times
variable; traitors for instance will create more the higher they scale.
Any leftover roundstart threat will be given to the existing midround budget
Latejoin and midround injection cooldowns are set using exponential distribution between:
5 minutes and 25 for latejoin
15 minutes and 35 for midround
these are some words that might be useful knowing when discussing dynamic:
-
required_candidates
- The number of people that must be willing (in their preferences) to be an antagonist with this ruleset. If the candidates do not meet this requirement, then the ruleset will not bother to be drafted. -
antag_cap
- Judges the amount of antagonists to apply, for both solo and teams. Note that some antagonists (such as traitors, lings, heretics, etc) will add more based on how many times they’ve been scaled. -
weight
- How likely this ruleset is to be picked. A higher weight results in a higher chance of drafting. -
cost
- The initial cost of the ruleset. -
scaling_cost
- Cost for every additional application of this ruleset.- Suppose traitors has a
cost
of 8, and ascaling_cost
of 5. This means that buying 1 application of the traitor ruleset costs 8 threat, but buying two costs 13 (8 + 5). Buying it a third time is 18 (8 + 5 + 5), etc.
- Suppose traitors has a
-
requirements
- A list that represents, per population range (see:pop_per_requirement
), how much threat is required to consider this ruleset. This is independent of how much it’ll actually cost. This uses threat level, not the budget–meaning if a round has 50 threat level, but only 10 points of round start threat, a ruleset with a requirement of 40 can still be picked if it can be bought.- Suppose wizard has a
requirements
oflist(90,90,70,40,30,20,10,10,10,10)
. This means that, at 0-5 and 6-11 players, A station must have 90 threat in order for a wizard to be possible. At 12-17, 70 threat is required instead, etc.
- Suppose wizard has a
These are the values for roundstart:
ROUNDSTART
TRAITORS:
required_candidates = 1
weight = 5
cost = 8 // Avoid raising traitor threat above 10, as it is the default low cost ruleset.
scaling_cost = 9
BLOOD BROTHERS:
required_candidates = 2
weight = 4
cost = 15
scaling_cost = 15
CHANGELINGS:
required_candidates = 1
weight = 3
cost = 16
scaling_cost = 10
HERETICS:
required_candidates = 1
weight = 3
cost = 15
scaling_cost = 9
WIZARDS:
required_candidates = 1
weight = 2
cost = 20
BLOOD CULT:
required_candidates = 2
weight = 3
cost = 20
NUCLEAR OPERATIVES:
required_candidates = 5
weight = 3
cost = 20
REVS
required_candidates = 3
weight = 3
delay = 7 MINUTES
cost = 20
antag_cap = 3
minimum_players = 35
EXTENDED:
required_candidates = 0
weight = 3
cost = 0
CLOCKCULT:
required_candidates = 4
weight = 3
cost = 35
MIDROUNDS
TRAITORS:
required_candidates = 1
weight = 7
cost = 10
Malfunctioning AI:
required_candidates = 1
weight = 3
cost = 20
WIZARD:
required_candidates = 1
weight = 1
cost = 20
NUCLEAR OPERATIVES:
required_candidates = 5
weight = 5
cost = 20
BLOB:
required_candidates = 1
weight = 4
cost = 10
XENOMORPH:
required_candidates = 1
weight = 3
cost = 10
NIGHTMARE:
required_candidates = 1
weight = 3
cost = 10
ABDUCTORS:
required_candidates = 2
weight = 4
cost = 10
LATEJOINS
TRAITORS:
required_candidates = 1
weight = 7
cost = 5
REVS:
weight = 2
cost = 20
var/required_heads_of_staff = 3
/// How much threat should be injected when the revolution wins?
var/revs_win_threat_injection = 20
HERETIC:
required_candidates = 1
weight = 4
cost = 10
Some of these values (i’m looking at you xenos and blood brother) are not in what I’d call a balanced place.
What’s your opinion on this?
Are threat level and cost balanced?
Should the initial threat be higher? lower?
A bit related, do you prefer dynamic to normal rounds? Would you like it to see it (maybe? ) replace all gamemodes?
I’ll add here a few polls (because they’re fun )
- 50-ish is good
- Lower than 50
- Higher than 50
0 voters
- Yes
- No
0 voters