A House Divided A House DividedDocumentation
Changelog
Player Wiki/Advanced

Reference: Formulas

Last updated 2026-08-21

Complete formula reference for A House Divided. All values are sourced directly from game code. Formulas marked with (*) use diminishing-return normalization curves: see the NPI normalization section below.


Primary score formulas#

State-level primary score#

Used for: US House, US Senate, US Governor, US State Senate, UK Commons, UK Regional Council, DE Bundestag, JP Shūgiin, JP Sangiin.

Maximum: 100 points (raw), then multiplied by an infamy penalty.

Component Range Formula
Alignment (state) 0 to 25 `max(0, 25 − (
Alignment (party) 0 to 15 `max(0, 15 − (
Favorability 0 to 35 (favorability / 100) × 35
Political Influence 0 to 25 normalizeNPI(politicalInfluence) × 25 (*)

Quick alignment reference (state-vs-state-lean OR state-vs-party):

Manhattan distance State alignment (0 to 25) Party alignment (0 to 15) Fallback (0 to 40)
0 25 15 40
2 22.5 13.5 36
5 18.75 11.25 30
10 12.5 7.5 20
20 0 0 0

NPP primary score penalty: When at least one player is in the same party's primary, all NPP candidates in that primary receive a ×0.5 multiplier on their total score. An NPP with a raw score of 70 competes at an effective 35 against you. NPPs aren't subject to the infamy penalty.


Presidential primary score#

Used for: US President only.

Maximum: 100 points

Component Range Formula
Alignment (party only) 0 to 40 `max(0, 40 − (
Party Influence 0 to 20 normalizePartyInfluencePresidentialPrimary(partyInfluence) × 20 (reference scale: partyInfluence 150)
National Reach 0 to 15 normalizeNationalReachPresidentialPrimary(NPI) × 15 (*)
Favorability 0 to 25 (favorability / 100) × 25

Same infamy penalty applies on the final score. Key differences from the state formula:


Canvassing formula#

Cost: ₳100 + 1 action. Home state / region only.

baseBoost        = 0.05 (percentage points)
distance         = |charEcon − demoEcon| + |charSocial − demoSocial|
alignmentMult    = max(0.1, 1.0 − distance × 0.15)
seasonMult       = isCampaignSeason ? 2.0 : 1.0
rawBoost         = baseBoost × alignmentMult × seasonMult
adjustedBoost    = rawBoost × (1 − |currentModifier| / 20)   // diminishing returns
newModifier      = clamp(currentModifier + adjustedBoost, −20, +20)

Alignment multiplier table:

Manhattan distance Alignment multiplier
0 1.0 ×
3 0.55 ×
5 0.25 ×
6.6+ 0.1 × (floor)

Campaign ops trees#

Fundraising, Ground Game, Media Spending, and Opposition Research are each a branch tree on the campaign page (/campaign/[id]), not a flat level ladder. Each tree unlocks a starter node, then up to three further branches (for example Media Spending's Broadcast and Television branches, Opposition Research's Dossier, Scandal Leak, and Counter-Intel). Branch magnitudes stack with the starter and with each other. Maintenance is deducted from campaign funds each turn; branches that can't be covered auto-downgrade rather than collapsing the whole tree, with no refund.

Full per-tree cost and effect tables, current to the live constants: Campaign Strategy and Campaign Manager.

Campaign season multiplier: All campaign passive effects (Media Spending, Opposition Research, Travel Presence, Primary Campaign bonus) double during the final 4 turns of an election.


Vote accumulation (general elections)#

Per-turn vote pool weighting#

Early band:
  turnPool = 0.50 × totalPool / earlyTurnCount

Ramp band (up to 8 turns before the final band):
  turnPool = 0.20 × totalPool / rampTurnCount

Final 4 turns:
  turnPool = 0.30 × totalPool / 4

The final 4 turns collectively deliver 30% of all votes cast in an election. Races of 4 turns or fewer split the pool evenly.

Total appeal pipeline (per demographic group, per candidate, per turn)#

reach         = normalizeNPI(influence)         // sqrt curve, capped at 1.0 when PI/NPI reaches 100
positionRaw   = max(0, 50 − |econDiff|×5 − |socialDiff|×5)
positionScore = 25 × (positionRaw / 50)^1.5 + 0.5
direction     = up to 5 per aligned ideological axis
influenceAppeal = includeInfluence ? normalizeNPI(influence) × 12.5 : 0
appeal        = positionScore + direction + influenceAppeal
effectiveFav  = clamp(favorability + groupApproval × 0.5, 0, 100)
approval      = (effectiveFav / 100)^0.8
orgShare      = statePartyOrg / sum(all party Org in the state)
partyOrg      = orgShare^0.2
personalFloor = 0.1 × reach × approval
effectiveOrg  = max(partyOrg, personalFloor)
infamyMult    = 1 − 0.05 × (min(100, max(0, infamy))/100)
weight        = appeal × reach × approval × effectiveOrg × infamyMult × other configured general-election factors

State races use influence for reach but not influenceAppeal; presidential generals include it. Directional bonuses are continuous around the center and may be suppressed when a leaning candidate points against their party on that axis. General-election factors also include registration resistance, seeded registration baseline, candidate Support, campaign presence, NPP and regime multipliers, and race-specific coattails where configured.

Office strength multipliers#

Office Strength weight
Governor 1.0
President 1.0
House / State Senate 0.9 / 0.85
Senate 0.8

NPI normalization (*)#

Political Influence (PI) and National Political Influence (NPI) pass through normalizing curves before use in formulas. normalizeNPI is a sqrt curve clamped to [0, 100]: meaningful spread at the high end, hard-capped at 1.0:

PI value normalizeNPI output
0 0.00
25 0.50
50 ~0.71
85 ~0.92
99 ~0.995
100 1.00 (cap)
200+ 1.00 (clamped)

normalizeNPI is used by state-level primary scoring AND by general-election reach (state and presidential).

Presidential primaries use a separate curve (normalizeNationalReachPresidentialPrimary): diminishing returns via 1 − exp(−NPI/45). NPI=25 → 0.426, NPI=55 → 0.706, NPI=80 → 0.831, NPI=100 → 0.892, NPI=200 → 0.988. Above the high end the curve continues to creep toward 1.0 but never reaches it, so the celebrity-bonus regime is naturally bounded.


Party organization scalars#

Party org (0 to 100) affects:

Effect Formula
General election vote weight (ownOrg / totalStateOrg) ^ 0.2
Personal floor max(orgWeight, 0.1 × reach × approval)
Presidential primary score Party Org does not enter; party influence and national reach are separate components

An empty state Org map gives every party a neutral 1× fallback. In a populated map, a party with 0 Org has 0 Org weight before the personal floor. A 3:1 Org lead produces about a 1.25:1 Org-weight advantage because of the 0.2 exponent.


Turnout modifier decay#

Each turn: newModifier = currentModifier × 0.98

Effect accumulates over turns:

Turns since canvassing Modifier remaining
0 100%
4 ~92%
10 ~82%
20 ~67%