Map NPCs and Events#
Every non-match node on the campaign map is an event: you meet an NPC, look at some cards, and pick one (or skip, where that's allowed). This page lists every event node, what it offers and the numbers behind it.
Conventions: "skater" means a forward on your roster. Stats are the four base attributes Shot Power, Accuracy, Checking, Speed (Overall = their average, see the attributes page).
Node types#
STS.Map.NodeType |
Map name (tooltip) | Tooltip text | Event asset |
|---|---|---|---|
| 0 Challenge / 1 Elite / 2 Boss | (matches) | — | match nodes, see run-structure.md |
| 3 Conditioning | — | legacy value; no blueprint uses it now | — |
| 12 PlayerTraining | Skater Training | "Train {skater} to boost their attributes" | RegularPlayerTraining "SkaterTraining" |
| 13 TeamTraining | Team Training | "Train to boost the attributes of your whole team" | TeamTraining |
| 14 StatTraining | Stat Training | "Train {stat} to boost this attribute on a skater or the whole team" | StatsTraining |
| 4 Chaos | Chaos | "Gain a power-up with a drawback" | ChaosEvent3Choice "chaos3Choice" |
| 5 Nurse | Nurse | "Heal your skaters or let the Butcher operate" | NurseEvent |
| 6 Blademaster | Blademaster | "Gain or upgrade activatable abilities" | BlademasterEvent |
| 7 FanNumber1 | Fan Number 1 | "A special upgrade for {skater}" | FanNumber1Event "fanEvent" |
| 8 GeneralManager | General Manager | "Recruit a free agent" | GeneralManagerEvent |
| 9 Coach | Coach | "Choose a strong relic" | CoachEvent |
All events have canSkip = 1 except Chaos (canSkip = 0, so you have to take one of the cards). Every event lets you edit your lineup (canEditLineup = 1).
Several events pick a skater, or a set of candidate skaters, with CampaignUtil.GetEventEligibleForwards(team, onlyActive, minimum = 3). It returns forwards that are not flagged Never Rewarded. When onlyActive is set it uses only the players in your active lineup, but it falls back to the rest of the roster to reach at least 3 candidates (inferred from the minimum parameter).
Source: STS.Map.NodeType, STS.Map.NodeBlueprintRepository and *Blueprint assets (tooltip terms v2ui/world_map/node/*), STS.Map.EventNode assets, Tape2Tape.CampaignUtil::GetEventEligibleForwards.
Training (Skater / Stat / Team)#
All three training events pick from 4 stats. Data.RandomBasicStats.GetRandomStats() rolls one stat uniformly (25% each). GetRandomStats(3) draws 3 distinct stats, re-rolling duplicates.
| Event | Fixed on the map node | Cards offered | Reward |
|---|---|---|---|
| Skater Training | one skater: a random eligible active forward, whose face shows on the node | 3 cards, one per stat (3 distinct random stats) | chosen stat +15 on that skater |
| Stat Training | one stat (25% each), whose icon shows on the node | 3 cards, one per skater: 3 random eligible active skaters (GetRandomElements(…,3)) |
that stat +15 on the chosen skater |
| Team Training | nothing | 3 cards, one per stat (3 distinct random stats) | chosen stat +10 on every forward (TeamData.GetForwards, bench included; m_SelectOnlyActivePlayers = 0) |
Asset values: SkaterTraining.statsBonus = 15, StatsTraining.statsBonus = 15, TeamTraining.statsBonusForward = 10.
Modifiers#
| Source | Effect |
|---|---|
Can of Worms relic (Rogue.VanillaTraining, trainingMultiplier 0.5, trainingMultiplierUpgrade 0.5) |
bonus × (1 + 0.5) = ×1.5 at level 1; × (1 + 0.5 + 0.5) = ×2.0 at level 2. The result is rounded to an integer (15 → 23 / 30, 10 → 15 / 20). Each training visit also adds 1 to the relic's _trainingCount. |
| Quantum Sextant relic | a training that would raise Speed raises Shot Power instead (GetTrainedStat) |
Stat locks (ForwardData.TryGetStatLock) |
the card preview accounts for locked stats |
| Gauntlet mode | displayed bonuses pass through GauntletStackBonusScaler.ScaleBonus |
Formula (verified): bonus = RoundToInt(baseBonus × m), where m = 1 without the relic, 1 + trainingMultiplier at level 1 and 1 + trainingMultiplier + trainingMultiplierUpgrade at level 2.
Source: Rogue.NPC.ConditioningNPC.{RegularPlayerTraining,StatsTraining,TeamTraining}::Initialize, TrainingEvent::GetModifiedStatBonus / GetTrainedStat / MarkVisited, STS.NodeRewards.TrainingReward::GenerateReward, Data.RandomBasicStats::GetRandomStats.
Coach#
"Pick a Relic and let's get to work." The Coach offers 3 relics and you take 1. The CoachChoiceCount = 3 constant comes from IRelicRepository.GetRandomRelics(category, excluded, numberOfRelics: 3).
| Coach node | Relic pool (RelicCategory) |
|---|---|
Starter node: the run's first node (runData.currentFloor == 0) |
Starter (0x1000000), 28 relics |
| Any other Coach node, e.g. act starts | BossRelics (0x1000), 33 relics |
Relics you already own are excluded. Two squads replace the pool:
- Speedrun squad: a fixed set of starter relics at the starter node, and one not-yet-picked speedrun relic per act at later nodes (
GetSpeedrunStarterRelics,GetSpeedrunActRelics). - Stat Rewards squad: stat-reward relics only (
GetStatRewardRelics), weighted byRelic.GetRewardWeight.
Coach Coupon relic (Rogue.DoubleCoaching, "Gain a second pick when visiting the Coach"): NextChoices re-rolls a second set of 3 while fewer than 2 picks have been made, so you get 2 picks in total.
Level-1 relics in each pool:
- Starter (28): Bench Charger, Blue Cone, Briefcase, Bubble Wrap, Can of Worms, Carrot on a Stick, Convenient Bag, D20, Deca-Egg, Deviled Egg, Double Yolk, Fragile, Frogeree, Gigantism, Golden Goose, Golden Wheats, Good Luck Puck, Jar of Tears, Macrocephalia, Nut Job, Pucky Charms, Rage Switch, Royal Treatment, Short Fuse, Shrimp Squad, Shrink Serum, Special D, Sweet Spot.
- Boss (33): Benchwarmer Boost, Briberee, Buzzer Beater, Coach's Grunt, Comfy Cushion, Deca-Egg, Dentist Appointment, Double-Decker, Dry Noodle, Extra Reward, Fartillery, Gigantism, Ginger Fury, Holy Fungus, Last Minute, Lumberjack, Macrocephalia, Odd Fungus, Organ Donor, Pain Points, Quantum Sextant, Rage Burger, Random Abilities, Relic Freezer, Remarkable Rock, Spare Bucket, Spiked Armor Relic, The Improverizer, The Original Puck, The Squeezer, Wet Noodle, Whistle Blower.
Source: Rogue.NPC.CoachNPC.CoachEvent::Initialize / get_IsStarterNode / NextChoices, Rogue.Relics.Repository.RelicCategory, RelicRepository data.
Blademaster#
"I'll teach a skater a new ability... or upgrade something they already know." The map node decides in advance which of two modes the visit uses (BlademasterNodeReward, reward id "ability:<id>" or "upgrade").
Which mode the node rolls#
Let E be the skaters with no ability (SkaterData.ability == null), and U the number of upgradeable power-ups on eligible skaters (UpgradeHelper.GetUpgradeablePowerups):
| Condition (checked in order) | Mode |
|---|---|
| Playing the Tchel squad | always Upgrade |
| E is empty | Upgrade |
| U = 0 | New Ability |
Act 1 (runData._currentAct ≤ 1) |
New Ability |
| Otherwise | 50% New Ability, 50% Upgrade (Random.Range(0,1) ≤ 0.5) |
In New Ability mode, the ability itself is rolled when the node is generated: one random ability from the UsedInCampaignPool category (IAbilityRepository, category 0x100). It shows on the map node.
What the visit offers#
| Mode | Cards |
|---|---|
| New Ability | Up to 3 skaters from E, in random order (ordered by a random GUID, then Take(3)). Each card reads "New: {Ability} for {Skater}"; pick one to equip the ability on that skater. |
| Upgrade | All upgradeable abilities, talents and relics on eligible skaters, shuffled, 3 shown (Shuffle + Take(3)). Picking one upgrades it to its Level 2 version. If fewer than 3 upgrades exist, the remaining slots get new-ability offers for random skaters without an ability (OldBlademasterEvent). |
Source: Rogue.NPC.BlademasterNPC.BlademasterEvent::{ShouldOfferNewAbility, GetPlayersEligibleForNewAbility, InitializeLockedAbilityChoices, InitializeUpgradeChoices, OldBlademasterEvent}, STS.NodeRewards.BlademasterNodeReward::GenerateReward.
Fan Number 1#
"I'm your skater's Number 1 Fan!" The node is tied to one skater (FanNodeReward): a random eligible forward, never one flagged Never Rewarded. The fan gives that skater a gift.
Standard visit: 3 of 4 gift types#
PrototypeRewardPoolSubEvent builds up to 4 candidate cards, shuffles them (Rand.Shuffled) and shows 3 (PrototypeChoiceCount = 3). A candidate that can't apply, such as a size change at the size limit, is dropped.
| Card | Effect |
|---|---|
| Grow / Shrink | one size step up or down. If both are possible, it's 50/50 (Random.Range(0,2)); otherwise it's whichever is possible. |
| Random talent | a random talent from the UsedInCampaignPool category (0x100) for this skater |
| Attribute Boost | one random stat (25% each): +10 (20%), +15 (60%) or +20 (20%) |
| Ability | if the skater already has an ability, an upgrade of it; otherwise a new random ability. The Tchel squad has special handling. |
Attribute Boost roll (verified): r = Random.Range(0,1); r ≤ 0.2 → +10; r ≤ 0.8 → +15; otherwise +20.
Stat Rewards squad#
Playing the Stat Rewards squad replaces the visit with StatRewardFanTalentsSubEvent: 3 "stat reward" talents. The class also contains older sub-event types (AllStats, PowerupsOnly, PowerupsStats, MixedBag, AbilityOnly, GoalieTalents) chosen by weight. They appear to be legacy code that the current Initialize doesn't use (inferred).
Source: Rogue.NPC.FanNumber1NPC.FanNumber1Event::Initialize / SelectSkater, Events.PrototypeRewardPoolSubEvent::*, Events.FanNumber1SubEvent::GenerateStats (<>c__DisplayClass9_0::<GenerateStats>b__0).
Chaos#
"Free curses! You'll love what they do. You might hate what they also do..." The Chaos node is tied to one skater (ChaosNodeReward, random eligible forward). It offers 2 random Chaos-category talents (TalentCategory.Chaos 0x4000, m_NumChoices = 2) for that skater. Every card is a power-up with a built-in drawback, for example Anchor, Bedrock, Bee Sting, Critical Chaos, Cursed Noodle, Even Steven, Fire Cracker, Glass Cannon, Heavy Puck, Krill, Liquidation, Live Wire, Monkey's Paw, Paper Jet, Porcelain Hammer, Railgun, Rocket Skates, Shell Fish, Short Contract, Split Personality, Tail Wind, Top Gear and Unstable Chaos (the chaosTalents list). You can't skip it (canSkip = 0). Each talent is described on the talents page.
Source: Rogue.NPC.ChaosEvents.ChaosEvent3Choice::Initialize / SelectForward, TalentRepository.chaosTalents.
Nurse and Butcher#
"Welcome to the Infirmary. I can patch up every injury on your team. Or cause a fresh one..." The Nurse node always shows two offers: a Nurse card (healing) and a Butcher card (one surgical procedure with a cost).
How the offers are drawn#
| Side | Candidates (weight) | How one is chosen |
|---|---|---|
| Nurse | Full Recovery (1.0), Kinesiotherapy (1.0) | Weighted random among the valid ones. If neither is valid (for example, nobody is injured), the card is Full Recovery shown as not interactable ("No injured skaters"). |
| Butcher | every other procedure (weights below), except InjuryForAttribute, which is disabled | First the teaching order: the first procedure in the order below that has never been offered on this profile and is valid right now. Once every procedure has been offered, weighted random among the valid ones. If none is valid: "No procedure available today." |
Teaching order (ButcherTeachingOrder, read from the static array data): Implant → Experimental Surgery → Transplant → Reconstruction → Transfusion → Organ Harvest → Cloning. "Offered" flags are saved to the profile, so they persist across runs (MarkOfferedAndSave → ProfileData.Save).
Procedures#
| Procedure (UI name) | Side | Draw weight | Effect | Cost / restrictions |
|---|---|---|---|---|
Full Recovery (HealAll) |
Nurse | 1.0 | Heals every injured skater (InjurySystem.HealAllInjuries). |
Needs at least one injured skater. |
Kinesiotherapy (FrozenPeas) |
Nurse | 1.0 | Heals one player and makes them immune to new injuries ("{0} is healed and protected from new injuries"). | Can't target a player who is already immune. |
Implant (InjuryForTalent) |
Butcher | 1.0 | Pick a skater and accept a disclosed Butchery talent for them. | That skater gets a random-body-part injury lasting 1 game (55%) or 2 games (45%). Target must be injurable and not already injured. |
Experimental Surgery (ReplaceTalent) |
Butcher | 1.0 | Removes one talent and replaces it with 2 random Butchery talents (SurgeryTalentCount = 2). |
The removed talent is lost. Needs a replaceable talent and eligible Butchery talents. |
Transplant (Transplant) |
Butcher | 1.0 | Moves one talent from a donor to a recipient. | The donor loses it. Some talents are locked or non-movable. A recipient that already has the talent is not eligible. |
Reconstruction (ExchangeAttributes) |
Butcher | 1.0 | Swaps the values of two attributes on one player. | Not allowed if the values are equal or if the result exceeds an attribute cap. |
Transfusion (SwapAttribute) |
Butcher | 1.0 | Swaps one attribute's value between two players. | Not allowed for the same value or if the result exceeds an attribute cap. |
Organ Harvest (Sacrifice) |
Butcher | 0.35 | Sacrifices a player: their attributes are split evenly among teammates, their talents go to random teammates, and their ability goes to a teammate with a free ability slot. | The player leaves the team (removed from the run). Talents with no eligible teammate are lost ("Lost {talent}: No eligible teammate"), and so is the ability if no slot is free. Can't be used on the last player on the ice or on a player the squad requires. |
Cloning (Cloning) |
Butcher | 1.0 | Creates an exact mini-clone of a player ("Who gets a tiny twin?"), with the same power-ups (CloneSkaterPowerups) and a renamed identity (see table below). |
The source is injured in every body part (Eye, Shoulder, Arm, Leg) for 3 games (CloneInjuryGames = 3). Needs room on the bench. |
| InjuryForAttribute | — | (1.0) | Disabled: never drawn (IsDrawnOnSide excludes it). The code would trade an injury for Speed (InjuryForAttributeSpeed = 5). |
— |
Attribute caps checked by Reconstruction and Transfusion (NurseProcedureState.AttributeCaps):
| Overall | Shot Power | Accuracy | Speed | Checking |
|---|---|---|---|---|
| none | 200 | 100 | 250 | 500 |
Butchery talent pool (TalentRepository.butcheryTalents, category 0x200), used by Implant and Experimental Surgery: Curve Ball, Slapshot Immunity (Deadzone), Pass Puncher, Point Sniper, Power Transfer, Slapshart, Sonic Slap, The Howitzer, Trickshot, Wild Shot, X-Ray Shot. Level 1 and Level 2 versions of these are in the list.
Banked talents: when a stacking stat talent is moved or replaced, its accumulated stat bonus is banked onto the skater it came from (inferred from BankTalentBonus). This applies to Momentum, Twig Tax, Try Hard, Cannon Arm, Game Winner Bonus, Target Practice, Growing Anger, Hat Trick, Silent Hero, Inflated Ego, Goal Based Stat Change, Assisted By Playmaker, Assist Count Goal OVR, Krill, Liquidation and Stat Stuffer.
Clone name table#
A clone of a known skater gets a fixed parody name (NurseCloneNameTable). Any other skater's clone gets the first name "Clone" (FallbackFirstName).
| Source | Clone | Source | Clone |
|---|---|---|---|
| Cam Amber | Mac Camber | Gawain Guretski | Gawain Garetskey |
| Prince Tristan Arthur XIV | Prince Tristan Arthur XV | Walter Hoffman | Walter Duffman |
| Fortune Banks | Poorer Blanks | Kelly Jelly | Smelly Jelley |
| Mark Bench | Marc Bunch | Ricky Kirby | Pricky Kirbo |
| Brad Bird | Bradley Birdey | Freddy Kovalski | Fredo Kovalskiev |
| Clarabelle Boogins | Clara Boogers | Gedeon Lamoustache | Gedeon Lemoustache |
| Jimothy Bowel | Timothy Towel | Sergei Lancelov | Serge Lancoliev |
| Buster Brewster | Baxter Broster | Kent Levaylapuck | Cant Liftthepuck |
| Willie Brie | Willy Bro | Clementine McShaggy | Orange McShugger |
| Barry Butthead | Barry Butterhead | Rory McShaggy | Brory McShugger |
| Gary Buttman | Gary Butterman | Wobbly McShatterface | Bobby Shatternose |
| Maurice Cassoulet | Gilles Patopoulet | Norman Norm | Normal Normie |
| Clive Chickensneeze | Steve Chickensnooze | Ozzie Oioioi | Ozzie Aiaiai |
| Chloe Crockett | Zoe Croquette | Joan Ozark | Juan OftheArk |
| Calvin Dord | Kelvin Durd | Ryan Pepito | Bryan Pepiti |
| Boring Dude | Exciting Dudelino | Sally Poppins | Salty Muffins |
| Johnny Faceless | Johnny Faces | Stu Stumple | Stew Simple |
| Nigel Flincher | Nigel Falincher | Buck Wurst | Worst Buck |
| Averell Foulton | Averell Moulton | Zinedine Zidanejad | Zanedine Zanedijad |
| Ma Foulton | Ma Moulton | Bear Grohl | Beer Grill |
Source: Rogue.NPC.NurseNPC.NurseEvent, Procedures.NurseProcedures::{Draw, Commit, HealAll, InjureForTalent, InjureForClone, CreateClone, SetCloneIdentity, MoveTalent, ReplaceTalent, Sacrifice, RemoveFromRun, BankTalentBonus}, Procedures.NurseProcedureState::{.cctor (Definitions/weights, ButcherTeachingOrder, AttributeCaps), DrawWeighted, IsDrawnOnSide}, NurseProcedureRoster::{DrawButcheryTalent, SurgeryTalentCount}, Skaters.Injuries.InjurySystem::GetRandomizedHealingTimeInEvent, NurseCloneNameTable asset, loc v2ui/event_choice/nurse/*.
General Manager#
"I always know a Free Agent or two looking for ice time." The GM signs a free agent to your roster.
Offers#
- Each offer round shows 2 free agents (
GetRandomElements(pool, 2)); you sign one. - Number of rounds per visit =
NumTimesToOfferChoices, set from the map layer'sgmSelectionCount. In the General Manager squad's maps that is 6 at the act 1 start node and 2 at the act 2 and 3 start nodes. Everywhere else it is 1. - The GM offers nothing if the roster is full, meaning playing forwards ≥ the active maximum and no bench room. A signed player joins the active line if there is room, otherwise the bench.
Pool and filters#
The pool is CampaignState.freeAgents (30 skaters, below). A squad's m_CustomSwapPool replaces it when that list is non-empty. A candidate is skipped if any of these apply:
- it is "Gawain" (Mini Gawain) and you are not in act 1;
- its name was already offered or is already on your roster (
_previouslyOfferedNames, inferred); - it is not unlocked (
UnlockSystem.IsUnlocked; not checked when a custom squad pool is used); - the squad excludes it (
IsForwardExcludedBySquad).
Free agent stats are rescaled#
ForwardData.AdjustPlayerStatsToMatchTeam rewrites every stat (verified):
stat = RoundToInt(baseStat × A / D) + RandomInt(−5 … +5), clamped to 0–300.
| Squad | A (target level) | D (divisor) | Contract | Bonus random talents (campaign pool) |
|---|---|---|---|---|
| Normal squads | average Overall of your current forwards (inferred: average of each forward's previewed stat) | 50; 15% chance of Random.Range(35,45) instead, which makes a stronger agent |
none | 1st talent 30%, 2nd talent 5% |
| General Manager squad | 35 in act 1, 55 in act 2, 70 in act 3+ | depends on contract length (below) | 2–6 game contract (MaxGamesCondition) |
depends on contract length (below) |
General Manager squad contracts: the length is drawn from [2,3,3,4,4,4,4,5,5,6]. Shorter contracts give stronger stats and more bonus talents.
| Contract | Chance | D | Stat multiplier A/D (act 1 / 2 / 3) | P(1st bonus talent) | P(2nd bonus talent) |
|---|---|---|---|---|---|
| 2 games | 10% | 35 | 1.00 / 1.57 / 2.00 | 70% | 25% |
| 3 games | 20% | 43 | 0.81 / 1.28 / 1.63 | 50% | 15% |
| 4 games | 40% | 50 | 0.70 / 1.10 / 1.40 | 30% | 5% |
| 5 games | 20% | 65 | 0.54 / 0.85 / 1.08 | 15% | 2% |
| 6 games | 10% | 75 | 0.47 / 0.73 / 0.93 | 10% | 1% |
Other rules:
- Bonus talents come from
ITalentRepositorycategory UsedInCampaignPool (0x100). The two rolls are independent:n = [r1 ≤ p1] + [r2 ≤ p2]. - Talents the squad excludes are replaced by random campaign-pool talents.
- On the Tchel squad, each free agent is also given a random ability.
Free agent pool (base data)#
Stats are the asset values before rescaling. "Avg" is the plain mean of the four stats.
| Free agent | Shot Pwr | Acc | Chk | Spd | Avg | Size step | Talents / ability |
|---|---|---|---|---|---|---|---|
| Brad Bird | 75 | 82 | 76 | 67 | 75.0 | 2 | Trenchcoat |
| Clarabelle Boogins | 71 | 71 | 33 | 37 | 53.0 | 2 | Propeller Helmet; ability Magnet |
| Clive Chickensneeze | 0 | 100 | 21 | 122 | 60.8 | 2 | — |
| Jimothy Bowel | 25 | 25 | 50 | 100 | 50.0 | 2 | Diarrhea |
| Ryan Pepito | 69 | 70 | 0 | 62 | 50.2 | 1 | One Strike |
| Kent Levaylapuck | 83 | 83 | 39 | 43 | 62.0 | 2 | Flat Puck; ability Yeet |
| Gawain Guretski (Mini Gawain, act 1 only) | 60 | 60 | 6 | 80 | 51.5 | 0 | Iron Helmet, Evolution |
| Nigel Flincher | 130 | 50 | 25 | 25 | 57.5 | 2 | Spasms |
| Bear Grohl | 90 | 60 | 90 | 15 | 63.8 | 5 | Bonecrusher |
| Willie Brie | 41 | 52 | 40 | 36 | 42.2 | 3 | Rebound Magnet, Mega Deflect |
| Sergei Lancelov | 47 | 20 | 102 | 20 | 47.2 | 4 | Iron Helmet |
| Rory McShaggy | 51 | 47 | 55 | 47 | 50.0 | 3 | X-Ray Shot; ability Tomahawk |
| Ozzie Oioioi | 48 | 41 | 10 | 71 | 42.5 | 3 | ability Disco Dance |
| Kelly Jelly | 3 | 80 | 2 | 144 | 57.2 | 1 | Puckless Rocket; ability Spin-O-Rama |
| Joan Ozark | 44 | 54 | 53 | 58 | 52.2 | 2 | Sonic Slap; ability Gas |
| Gedeon Lamoustache | 54 | 40 | 55 | 30 | 44.8 | 2 | No Goal; ability Kazoo |
| Clementine McShaggy | 66 | 24 | 57 | 34 | 45.2 | 2 | Triple Twig; ability Tomahawk |
| Chloe Crockett | 38 | 49 | 34 | 66 | 46.8 | 2 | Defensive Deflect, Flawless Feeder |
| Cam Amber | 53 | 50 | 43 | 56 | 50.5 | 2 | Bouncy McBounce |
| Calvin Dord | 54 | 91 | 21 | 34 | 50.0 | 3 | ability Yo-Yo |
| Buck Wurst | 34 | 75 | 81 | 37 | 56.8 | 3 | ability Grappling Hook |
| Zinedine Zidanejad | 27 | 58 | 19 | 76 | 45.0 | 2 | No Stick, Dribbler, Curve Ball; ability Headshot Redirect |
| Prince Tristan Arthur XIV | 100 | 67 | 6 | 36 | 52.2 | 1 | Charge Shot, X-Ray Shot |
| Gary Buttman | 0 | 0 | 0 | 0 | 0.0 | 2 | Butt Bench |
| Walter Hoffman | 63 | 71 | 33 | 30 | 49.2 | 2 | Cherry Picker |
| Norman Norm | 50 | 50 | 50 | 50 | 50.0 | 2 | Balanced Talent |
| Wobbly McShatterface | 103 | 0 | 55 | 8 | 41.5 | 3 | Golden Throne; ability Prod |
| Ma Foulton | 50 | 20 | 25 | 85 | 45.0 | 1 | ability Wet Towel |
| Averell Foulton | 60 | 20 | 80 | 25 | 46.2 | 3 | Ball and Chain |
| Fortune Banks | 75 | 86 | 44 | 136 | 85.2 | 2 | Performance Bonus |
Source: Rogue.NPC.GeneralManagerNPC.GeneralManagerEvent::{NextChoices, CreatePlayerChoice}, Data.ForwardData::AdjustPlayerStatsToMatchTeam, <PrivateImplementationDetails> int array (contract lengths), State.CampaignState.freeAgents, STS.Map.MapLayerNodeType.gmSelectionCount.
Team Canada curses ("Canadian Tariff")#
Team Canada (team id 8652786b-…) is an elite opponent. Before the match, and again for the second period, it makes you take a curse:
- Pick 1: "You want to play Team Canada? There is a tariff to pay."
- Pick 2: "Still here? Then you pay again."
Each pick shows 3 random offerable curses (GetRandomElements(GetOfferable(team), 3)); you choose 1. The second pick draws from curses not offered in the first. If the menu closes without a choice, the first option is applied. Curses are relics implementing ICurse and last for that match.
| Curse | Key | Effect | Offered when |
|---|---|---|---|
| Tiny Team | xs_team |
Your whole team becomes size XS (ISkaterSizeModifier). |
always |
| Angus Goes Cold | angus_zero |
Angus plays with 0 OVR (Overall modifier forced to 0, applied last). | only for an Angus squad ("allangus", inferred) |
| Deep Freeze | freeze_two |
2 of your relics are frozen (RelicsToFreeze = 2). |
you own a freezable relic (HasFreezableRelic) |
| Frog Duty | frog_two |
2 skaters on your team are frogged for 3600 s, i.e. the whole match (FrogCount = 2). |
always |
| Rusty Squad | ovr_minus20 |
Your team gets −20 OVR. | always |
| Heavy Legs | speed_minus40 |
Your team gets −40 Speed. | always |
| Glass Bones | fragile_team |
Every skater on your team gains Fragile: 10% chance of an injury each time they are knocked flat. It is removed at game end, but the injuries remain. | not on the Old School squad (inferred) |
| Canadian Insurance | canada_briefcase |
Team Canada gains the Briefcase relic (reverts a goal). | not on the Eliminator squad (inferred) |
| Bonecrusher Nation | canada_bonecrusher |
Every Team Canada skater gains Bonecrusher (knocked-out skaters are thrown further and lose their stick). | always |
The pairing of each restriction with its curse was read from the order of the catalog's static constructor. The "allangus", "oldschool" and "eliminator" string tests are verified; which curse each one belongs to is inferred.
Source: CanadaCursePicker::{Run, RunSecondPick, RunPick, IsCanadaMatch}, Rogue.CanadaCurses.CanadaCurseCatalog::.cctor / GetOfferable, Rogue.CanadaCurses.* and *Controller classes (constants Bonus = -20, Penalty = -40, FrogCount = 2, FrogDuration = 3600, RelicsToFreeze = 2), loc relics/canada_curse_*.