From 1e9ee6d82d632a3ea1049a682b18cf785d97265c Mon Sep 17 00:00:00 2001 From: Davis Ford Date: Wed, 18 Oct 2023 12:53:28 -0600 Subject: [PATCH] Add September Andtor updates (#1656) --- package.json | 2 +- src/components/info/banners/app_banner.tsx | 4 +- .../cities_of_sigmar/command_abilities.ts | 2 +- .../daughters_of_khaine/battle_traits.ts | 4 +- .../flesh_eater_courts/battle_traits.ts | 2 +- src/factions/gloomspite_gitz/units.ts | 6 + src/factions/idoneth_deepkin/flavors.ts | 8 +- src/factions/khorne/battle_traits.ts | 2 + src/factions/legions_of_nagash/units.ts | 4 +- src/factions/lumineth_realmlords/flavors.ts | 8 +- src/factions/lumineth_realmlords/units.ts | 6 +- src/factions/nighthaunt/grand_strategies.ts | 4 +- src/factions/nurgle/battle_traits.ts | 7 + src/factions/orruk_warclans/battle_traits.ts | 3 + .../bonesplitterz/battle_traits.ts | 7 +- .../orruk_warclans/kruleboyz/battle_traits.ts | 1 + .../orruk_warclans/kruleboyz/flavors.ts | 7 +- .../orruk_warclans/kruleboyz/units.ts | 7 +- src/factions/ossiarch_bonereapers/units.ts | 7 +- src/factions/skaven/battle_traits.ts | 7 + src/factions/skaven/units.ts | 8 - .../slaves_to_darkness/battle_traits.ts | 12 +- src/factions/sons_of_behemat/battalions.ts | 20 +- .../soulblight_gravelords/battle_traits.ts | 2 + src/factions/soulblight_gravelords/spells.ts | 4 +- src/factions/soulblight_gravelords/units.ts | 2 + .../stormcast_eternals/battle_traits.ts | 7 + .../stormcast_eternals/command_abilities.ts | 2 +- src/factions/stormcast_eternals/units.ts | 2 +- src/generic_rules/artifacts.ts | 2 +- src/generic_rules/command_abilities.ts | 4 +- src/generic_rules/core_rules.ts | 10 +- src/generic_rules/endless_spells.ts | 6 +- src/generic_rules/grand_strategies.ts | 266 ++++----- src/generic_rules/realmscapes.ts | 522 +++++++++--------- src/meta/rule_sources.ts | 9 +- src/tests/warscroll/warscrollJson.test.ts | 2 - src/types/realmscapes.ts | 8 +- 38 files changed, 543 insertions(+), 443 deletions(-) diff --git a/package.json b/package.json index 2ff374097..e33018ba3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aos-reminders", - "version": "5.2.4", + "version": "5.2.5", "private": true, "homepage": "./", "dependencies": { diff --git a/src/components/info/banners/app_banner.tsx b/src/components/info/banners/app_banner.tsx index fa8798f96..b1b456207 100644 --- a/src/components/info/banners/app_banner.tsx +++ b/src/components/info/banners/app_banner.tsx @@ -3,7 +3,7 @@ import { useTheme } from 'context/useTheme' const AppBanner = () => { const { isDark } = useTheme() - const name = '2023-slaanesh-obr-seraphon-release' + const name = '2023-sept-tactics-of-andtor' return ( { variant={isDark ? `info` : `info`} > - NEW: Seraphon, Slaanesh, and Ossiarch Bonereapers battletomes are live! + NEW: Battlescroll: Tactics of Andtor (Sept 2023) is live! ) diff --git a/src/factions/cities_of_sigmar/command_abilities.ts b/src/factions/cities_of_sigmar/command_abilities.ts index 70ee01b11..241a5e0cb 100644 --- a/src/factions/cities_of_sigmar/command_abilities.ts +++ b/src/factions/cities_of_sigmar/command_abilities.ts @@ -164,7 +164,7 @@ const CommandAbilities = { rule_sources: [ rule_sources.BATTLETOME_CITIES_OF_SIGMAR, rule_sources.ERRATA_JULY_2022, - meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, ], diff --git a/src/factions/daughters_of_khaine/battle_traits.ts b/src/factions/daughters_of_khaine/battle_traits.ts index 2d51797b5..1bd3042b9 100644 --- a/src/factions/daughters_of_khaine/battle_traits.ts +++ b/src/factions/daughters_of_khaine/battle_traits.ts @@ -67,7 +67,7 @@ const BattleTraits = { rule_sources: [ rule_sources.BATTLETOME_DAUGHTERS_OF_KHAINE, rule_sources.ERRATA_DECEMBER_2022, - meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, { @@ -83,7 +83,7 @@ const BattleTraits = { rule_sources.BATTLETOME_DAUGHTERS_OF_KHAINE, rule_sources.ERRATA_DECEMBER_2022, meta_rule_sources.BATTLESCROLL_GALLETIAN_CHAMPIONS_JANUARY_2022, - meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, { diff --git a/src/factions/flesh_eater_courts/battle_traits.ts b/src/factions/flesh_eater_courts/battle_traits.ts index 888c85fa2..6b35c7c40 100644 --- a/src/factions/flesh_eater_courts/battle_traits.ts +++ b/src/factions/flesh_eater_courts/battle_traits.ts @@ -14,7 +14,7 @@ const BattleTraits = { rule_sources: [ rule_sources.BATTLETOME_FLESH_EATER_COURTS, rule_sources.ERRATA_JULY_2022, - meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, { diff --git a/src/factions/gloomspite_gitz/units.ts b/src/factions/gloomspite_gitz/units.ts index 96e88973b..0df57db08 100644 --- a/src/factions/gloomspite_gitz/units.ts +++ b/src/factions/gloomspite_gitz/units.ts @@ -25,6 +25,8 @@ import { } from 'types/phases' import CommandAbilities from './command_abilities' import Spells from './spells' +import meta_rule_sources from 'meta/rule_sources' +import rule_sources from './rule_sources' const ArachnarokSpiderVenomEffect = { name: `Spider Venom`, @@ -94,6 +96,10 @@ const SquigsGoneWildEffect = { name: `Squigs Gone Wild`, desc: `Each time a Cave Squig in this unit flees as a result of a failed battleshock test, before that model is removed from play, roll a dice. On a 3+, you can pick the closest enemy unit within 9" of that model. That unit suffers 1 mortal wound. If multiple units are tied to be the closest within 9" of it, you can pick which suffers the mortal wound.`, when: [BATTLESHOCK_PHASE], + rule_sources: [ + rule_sources.BATTLETOME_GLOOMSPITE_GITZ, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], shared: true, } const WallCrawlerEffect = { diff --git a/src/factions/idoneth_deepkin/flavors.ts b/src/factions/idoneth_deepkin/flavors.ts index 4efc53b06..d15d30bbb 100644 --- a/src/factions/idoneth_deepkin/flavors.ts +++ b/src/factions/idoneth_deepkin/flavors.ts @@ -1,9 +1,10 @@ +import meta_rule_sources from 'meta/rule_sources' import { COMBAT_PHASE, DURING_SETUP, END_OF_CHARGE_PHASE, HERO_PHASE, - START_OF_COMBAT_PHASE, + SHOOTING_PHASE, START_OF_HERO_PHASE, } from 'types/phases' @@ -32,8 +33,9 @@ const Flavors = { effects: [ { name: `Bloodthirsty Shiver`, - desc: `You can include Bloodthirsty Shivers in your army (pg 96). At the start of the combat phase, you can pick 1 unit from each Bloodthirsty Shiver in your army. If you do so, until the end of that phase, if the unmodified hit roll for an attack made with that unit's Ferocious Bites is 6, that attack scores 2 hits on the target instead of 1. Make a wound and save roll for each hit. If the attacking unit is within 3" of 1 or more other units from the same Bloodthirsty Shiver, its Ferocious Bite scores 3 hits on an unmodified hit roll of 6 instead.`, - when: [START_OF_COMBAT_PHASE], + desc: `You can include Bloodthirsty Shivers in your army (pg 96). If the unmodified hit roll for an attack made by a unit in a Bloodthirsty Shiver is a 6, that attack scores 2 hits on the target instead of 1.`, + when: [COMBAT_PHASE, SHOOTING_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, ], }, diff --git a/src/factions/khorne/battle_traits.ts b/src/factions/khorne/battle_traits.ts index 42e12e73e..b1c4edfbd 100644 --- a/src/factions/khorne/battle_traits.ts +++ b/src/factions/khorne/battle_traits.ts @@ -1,5 +1,6 @@ import { tagAs } from 'factions/metatagger' import { KHORNE } from 'meta/factions' +import meta_rule_sources from 'meta/rule_sources' import { END_OF_HERO_PHASE, END_OF_MOVEMENT_PHASE, @@ -46,6 +47,7 @@ const BattleTraits = { name: `Blood Tithe: Murderlust`, desc: `Cost: 1 BTP. Pick 1 friendly Blades of Khorne unit that is more than 3" from all enemy units. That unit can make a D6" move, and it can finish that move within 3" of any enemy units. You can spend Blood Tithe points on this Reward up to 3 times at the end of each hero phase instead of only once, but you cannot pick the same unit to benefit from this ability more than once per phase.`, when: [END_OF_HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, { name: `Blood Tithe: Spelleater Curse`, diff --git a/src/factions/legions_of_nagash/units.ts b/src/factions/legions_of_nagash/units.ts index d21478ef9..8fbbfe695 100644 --- a/src/factions/legions_of_nagash/units.ts +++ b/src/factions/legions_of_nagash/units.ts @@ -19,6 +19,7 @@ import { } from 'types/phases' import command_abilities from './command_abilities' import spells from './spells' +import meta_rule_sources from 'meta/rule_sources' const getDeathlyInvocation = (numUnits: number) => ({ name: `Deathly Invocation`, @@ -119,8 +120,9 @@ const Units = { }, { name: `Mortarch of Sacrament`, - desc: `In your hero phase, you can pick up to 3 different friendly OSSIARCH BONEREAPERS units wholly within 24" of this unit. If that unit is not an IMMORTIS GUARD or NECROPOLIS STALKERS unit, you can either heal up to 3 wounds allocated to that unit or, if no wounds have been allocated to that unit, you can return a number of slain models to it that have a combined Wounds characteristic of 3 or less.`, + desc: `In your hero phase, you can pick up to 3 different friendly OSSIARCH BONEREAPERS units wholly within 24" of this unit. If that unit is an Immortis Guard or Necropolis Stalkers unit, you can heal up to 3 wounds allocated to that unit, or if no wounds have been allocated to that unit, roll a dice. On a 3+, you can return 1 slain model to that unit with 4 wounds allocated to it.`, when: [HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, ], }, diff --git a/src/factions/lumineth_realmlords/flavors.ts b/src/factions/lumineth_realmlords/flavors.ts index 47b4402dc..4de72f3cc 100644 --- a/src/factions/lumineth_realmlords/flavors.ts +++ b/src/factions/lumineth_realmlords/flavors.ts @@ -1,3 +1,4 @@ +import meta_rule_sources from 'meta/rule_sources' import { BATTLESHOCK_PHASE, COMBAT_PHASE, DURING_GAME, HERO_PHASE, SHOOTING_PHASE } from 'types/phases' const Flavors = { @@ -5,8 +6,9 @@ const Flavors = { effects: [ { name: `Mountain Realm`, - desc: `When friendly Ymetrica Alarith units that have the Enduring as Rock ability are targeted by an attack, change the Rend characteristic for that attack to '-' if the weapon used for that attack has a Rend characteristic of -1 or -2 instead of only -1.`, + desc: `The Enduring as Rock ability of friendly Ymetrica Alarith units worsens the Rend characteristic of attacks that target those units by 2 instead of 1, to a minimum of 0.`, when: [COMBAT_PHASE, SHOOTING_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, ], }, @@ -50,12 +52,12 @@ const Flavors = { effects: [ { name: `Gale of Killing Shafts`, - desc: `Add 1 to the hit and wound roll of missile weapons used by friendly Helon units that are within 6" of any enemy units.`, + desc: `In your shooting phase, when you pick a friendly Helon unit to shoot, you can say that it will unleash a gale of killing shafts. If you do so, in that phase, you can add 1 to hit rolls and wound rolls for that unit's missile weapons, but that unit can only target enemy units within 6" of it.`, when: [SHOOTING_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, ], }, } -// Note: We do NOT use tagAs for Flavors export default Flavors diff --git a/src/factions/lumineth_realmlords/units.ts b/src/factions/lumineth_realmlords/units.ts index 841f80151..e990a8254 100644 --- a/src/factions/lumineth_realmlords/units.ts +++ b/src/factions/lumineth_realmlords/units.ts @@ -68,8 +68,9 @@ const CrushingBlowEffect = { } const DeepThinkersEffect = { name: `Deep Thinkers`, - desc: `Once per battle, in your hero phase, when this unit attempts to cast its first spell in that phase, it is automatically cast with a casting roll of 9 that cannot be modified (do not roll 2d6), but it can be unbound.`, + desc: `Once per battle, in your hero phase, when this unit attempts to cast its first spell in that phase, it is automatically cast with a casting roll of 9 (do not roll 2d6), but it can be unbound.`, when: [HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], shared: true, } const PurestAetherquartzHitRollEffect = { @@ -114,8 +115,9 @@ const SpiritOfTheWindEffect = { const EnduringAsRockEffect = { name: `Enduring as Rock`, - desc: `When this unit is targeted by an attack, if the weapon used for that attack has an unmodified Rend characteristic of -1, change the Rend characteristic for that attack to '-'.`, + desc: `When this unit is targeted by an attack, worsen the Rend characteristic of that attack by 1, to a minimum of 0.`, when: [COMBAT_PHASE, SHOOTING_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], shared: true, } diff --git a/src/factions/nighthaunt/grand_strategies.ts b/src/factions/nighthaunt/grand_strategies.ts index 1e620e068..3c05781c9 100644 --- a/src/factions/nighthaunt/grand_strategies.ts +++ b/src/factions/nighthaunt/grand_strategies.ts @@ -1,4 +1,5 @@ import { tagAs } from 'factions/metatagger' +import meta_rule_sources from 'meta/rule_sources' import { END_OF_GAME, END_OF_SETUP } from 'types/phases' const GrandStrategies = { @@ -20,8 +21,9 @@ const GrandStrategies = { effects: [ { name: `Fright or Flight`, - desc: `When the battle ends you complete this grand strategy if there are no enemy units within 6" of any friendly NIGHTHAUNT units that are contesting an objective.`, + desc: `When the battle ends, you complete this grand strategy if 1 or more objectives are being contesting by friendly Nighthaunt units and there are no enemy units within 6" of any friendly Nighthaunt units that are contesting an objective.`, when: [END_OF_GAME], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, ], }, diff --git a/src/factions/nurgle/battle_traits.ts b/src/factions/nurgle/battle_traits.ts index 1943abdde..49261e010 100644 --- a/src/factions/nurgle/battle_traits.ts +++ b/src/factions/nurgle/battle_traits.ts @@ -15,6 +15,7 @@ import { WOUND_ALLOCATION_PHASE, } from 'types/phases' import rule_sources from './rule_sources' +import meta_rule_sources from 'meta/rule_sources' const BattleTraits = { [NURGLE]: { @@ -210,6 +211,12 @@ const BattleTraits = { desc: `You complete this tactic if you summon a GREAT UNCLEAN ONE to the battlefield during this turn and it is within 3" of an objective that you control in your opponent's territory at the end of this turn.`, when: [START_OF_HERO_PHASE], }, + { + name: `Don't Squabble, Children`, + desc: `Pick an objective wholly outside your territory. You complete this battle tactic at the end of the turn if you control that objective and any friendly Rotbringers units and any friendly Nurgle Daemon units contest that objective.`, + when: [START_OF_HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], + }, ], }, } diff --git a/src/factions/orruk_warclans/battle_traits.ts b/src/factions/orruk_warclans/battle_traits.ts index 9c3c13359..6a8ada6ff 100644 --- a/src/factions/orruk_warclans/battle_traits.ts +++ b/src/factions/orruk_warclans/battle_traits.ts @@ -1,4 +1,5 @@ import { tagAs } from 'factions/metatagger' +import meta_rule_sources from 'meta/rule_sources' import { START_OF_HERO_PHASE, TURN_ONE_START_OF_HERO_PHASE, TURN_TWO_START_OF_HERO_PHASE } from 'types/phases' const OrrukWarclansBattleTraits = { @@ -18,11 +19,13 @@ const OrrukWarclansBattleTraits = { name: `Sneak Up`, desc: `You complete this tactic if, at the end of the turn, every friendly Kruleboyz unit is within 3" of any terrain features and is more than 3" from all enemy units.`, when: [START_OF_HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, { name: `Dat's Our Turf Now!`, desc: `You complete this tactic if, at the end of the turn, 2 or more friendly Ironjawz units are within 3" of the centre of the battlefield.`, when: [START_OF_HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, ], }, diff --git a/src/factions/orruk_warclans/bonesplitterz/battle_traits.ts b/src/factions/orruk_warclans/bonesplitterz/battle_traits.ts index 454d7b84c..407faaf06 100644 --- a/src/factions/orruk_warclans/bonesplitterz/battle_traits.ts +++ b/src/factions/orruk_warclans/bonesplitterz/battle_traits.ts @@ -7,6 +7,7 @@ import { START_OF_HERO_PHASE, } from 'types/phases' import rule_sources from '../rule_sources' +import meta_rule_sources from 'meta/rule_sources' const BonesplitterzBattleTraits = { 'Battle Tactics': { @@ -47,7 +48,11 @@ const BonesplitterzBattleTraits = { name: `Spirit of Gorkamorka`, desc: `If the unmodified hit roll for an attack made with a melee weapon by a friendly BONESPLITTERZ unit is 6, that attack scores 2 hits on the target instead of 1 (make a wound roll and save roll for each hit).`, when: [COMBAT_PHASE], - rule_sources: [rule_sources.BATTLETOME_ORRUK_WARCLANS, rule_sources.ERRATA_JULY_2022], + rule_sources: [ + rule_sources.BATTLETOME_ORRUK_WARCLANS, + rule_sources.ERRATA_JULY_2022, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, ], }, diff --git a/src/factions/orruk_warclans/kruleboyz/battle_traits.ts b/src/factions/orruk_warclans/kruleboyz/battle_traits.ts index 059be1d21..f2cb01182 100644 --- a/src/factions/orruk_warclans/kruleboyz/battle_traits.ts +++ b/src/factions/orruk_warclans/kruleboyz/battle_traits.ts @@ -52,6 +52,7 @@ const KruleboyzBattleTraits = { rule_sources: [ rule_sources.BATTLETOME_ORRUK_WARCLANS, meta_rule_sources.BATTLESCROLL_DEPLETED_RESERVES_APRIL_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, ], diff --git a/src/factions/orruk_warclans/kruleboyz/flavors.ts b/src/factions/orruk_warclans/kruleboyz/flavors.ts index 06b69456b..ac41ede37 100644 --- a/src/factions/orruk_warclans/kruleboyz/flavors.ts +++ b/src/factions/orruk_warclans/kruleboyz/flavors.ts @@ -1,5 +1,6 @@ import { COMBAT_PHASE, DURING_GAME, SHOOTING_PHASE, TURN_ONE_SHOOTING_PHASE } from 'types/phases' import rule_sources from '../rule_sources' +import meta_rule_sources from 'meta/rule_sources' const KruleboyzFlavors = { "Grinnin' Blades": { @@ -8,7 +9,11 @@ const KruleboyzFlavors = { name: `Out of the Mists`, desc: `Friendly GRINNIN' BLADES units are not visible to enemy models that are more than 12" away from them.`, when: [DURING_GAME], - rule_sources: [rule_sources.BATTLETOME_ORRUK_WARCLANS, rule_sources.ERRATA_JULY_2022], + rule_sources: [ + rule_sources.BATTLETOME_ORRUK_WARCLANS, + rule_sources.ERRATA_JULY_2022, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, ], }, diff --git a/src/factions/orruk_warclans/kruleboyz/units.ts b/src/factions/orruk_warclans/kruleboyz/units.ts index 68ddc6497..a9326e38c 100644 --- a/src/factions/orruk_warclans/kruleboyz/units.ts +++ b/src/factions/orruk_warclans/kruleboyz/units.ts @@ -75,6 +75,7 @@ const KruleboyzUnits = { rule_sources: [ rule_sources.BATTLETOME_ORRUK_WARCLANS, meta_rule_sources.BATTLESCROLL_DEPLETED_RESERVES_APRIL_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, ], @@ -111,7 +112,11 @@ const KruleboyzUnits = { If that unit is given an elixir, add 1 to save rolls for that unit until your next hero phase.`, when: [HERO_PHASE], - rule_sources: [rule_sources.BATTLETOME_ORRUK_WARCLANS, rule_sources.ERRATA_OCTOBER_2022], + rule_sources: [ + rule_sources.BATTLETOME_ORRUK_WARCLANS, + rule_sources.ERRATA_OCTOBER_2022, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, ], }, diff --git a/src/factions/ossiarch_bonereapers/units.ts b/src/factions/ossiarch_bonereapers/units.ts index 3f8185059..2119d1756 100644 --- a/src/factions/ossiarch_bonereapers/units.ts +++ b/src/factions/ossiarch_bonereapers/units.ts @@ -19,6 +19,7 @@ import { } from 'types/phases' import CommandAbilities from './command_abilities' import Spells from './spells' +import meta_rule_sources from 'meta/rule_sources' const TheWillOfTheLegionsEffect = { name: `The Will of the Legions`, @@ -232,8 +233,9 @@ const Units = { GenericEffects.WizardOneSpellEffect, { name: `Boneshaper`, - desc: `In your hero phase, you can pick 1 friendly OSSIARCH BONEREAPERS unit within 6" of this unit. If that unit is not an IMMORTIS GUARD or NECROPOLIS STALKERS unit, you can either heal up to 3 wounds allocated to that unit or, if no wounds have been allocated to that unit, you can return a number of slain models to it that have a combined Wounds characteristic of 3 or less. If that unit is an IMMORTIS GUARD or NECROPOLIS STALKERS unit, you can either heal up to 3 wounds allocated to that unit or, if no wounds have been allocated to that unit, roll a dice. On a 3+, you can return 1 slain model to that unit.`, + desc: `In your hero phase, you can pick 1 friendly OSSIARCH BONEREAPERS unit within 6" of this unit. If that unit is an Immortis Guard or Necropolis Stalkers unit, you can heal up to 3 wounds allocated to that unit, or if no wounds have been allocated to that unit, roll a dice. On a 3+, you can return 1 slain model to that unit with 4 wounds allocated to it.`, when: [HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, ], }, @@ -300,8 +302,9 @@ const Units = { }, { name: `Mortarch of the Necropolis`, - desc: `At the start of your hero phase, if this model is on the battlefield you can pick up to 3 different friendly OSSIARCH BONEREAPERS units wholly within 24" of this model. For each of those units, you can either heal up to 3 wounds allocated to that unit or, if no wounds are allocated to it, you can return a number of slain models to that unit with a combined Wounds characteristic of 3 or less.`, + desc: `At the start of your hero phase, if this model is on the battlefield you can pick up to 3 different friendly OSSIARCH BONEREAPERS units wholly within 24" of this model. If that unit is an Immortis Guard or Necropolis Stalkers unit, you can heal up to 3 wounds allocated to that unit, or if no wounds have been allocated to that unit, roll a dice. On a 3+, you can return 1 slain model to that unit with 4 wounds allocated to it.`, when: [START_OF_HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, { name: `Warmaster`, diff --git a/src/factions/skaven/battle_traits.ts b/src/factions/skaven/battle_traits.ts index 15f483a88..4b3c48de9 100644 --- a/src/factions/skaven/battle_traits.ts +++ b/src/factions/skaven/battle_traits.ts @@ -1,5 +1,6 @@ import { tagAs } from 'factions/metatagger' import { SKAVEN } from 'meta/factions' +import meta_rule_sources from 'meta/rule_sources' import { COMBAT_PHASE, START_OF_HERO_PHASE } from 'types/phases' const BattleTraits = { @@ -45,6 +46,12 @@ const BattleTraits = { desc: `You complete this tactic if 3 or more prayers chanted by different friendly CLANS PESTILENS PRIESTS are answered in this turn.`, when: [START_OF_HERO_PHASE], }, + { + name: `Flee-flee!`, + desc: `You complete this battle tactic at the end of the turn if any friendly Skaven Battleline units retreated this turn and any friendly Skaven Heroes retreated this turn.`, + when: [START_OF_HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], + }, ], }, } diff --git a/src/factions/skaven/units.ts b/src/factions/skaven/units.ts index ae47f721b..eb1c7e7ed 100644 --- a/src/factions/skaven/units.ts +++ b/src/factions/skaven/units.ts @@ -76,12 +76,6 @@ const RegeneratingMonstrosityEffect = { when: [HERO_PHASE], shared: true, } -const PushedIntoBattleEffect = { - name: `Pushed into Battle`, - desc: `This unit cannot move unless it starts the move within 6" of 10 or more other friendly SKAVEN models.`, - when: [MOVEMENT_PHASE], - shared: true, -} const ProtectionOfTheHornedRatEffect = { name: `Protection of the Horned Rat`, desc: `This unit has a ward of 5+.`, @@ -641,7 +635,6 @@ const Units = { prayers: [keyPicker(prayers, ['Pestilence-pestilence!'])], }, effects: [ - PushedIntoBattleEffect, ...AltarOfTheHornedRatEffects, { name: `Great Plague Censer`, @@ -683,7 +676,6 @@ const Units = { desc: `Add the Avalanche of Energy value on this unit's damage table to casting and chanting rolls for this unit.`, when: [HERO_PHASE], }, - PushedIntoBattleEffect, { name: `A Stirring Beyond the Veil`, desc: `Once per battle, at the start of your hero phase, if 7 or more wounds are allocated to this unit, you can say that the Grey Seer will shatter the Screaming Bell. If you do so, roll a dice. On a 1, this unit is destroyed. On any other roll, add the number of wounds allocated to this unit to the roll. diff --git a/src/factions/slaves_to_darkness/battle_traits.ts b/src/factions/slaves_to_darkness/battle_traits.ts index 36221d5f6..8974089c4 100644 --- a/src/factions/slaves_to_darkness/battle_traits.ts +++ b/src/factions/slaves_to_darkness/battle_traits.ts @@ -11,6 +11,7 @@ import { WOUND_ALLOCATION_PHASE, } from 'types/phases' import rule_sources from './rule_sources' +import meta_rule_sources from 'meta/rule_sources' const BattleTraits = { // Slaves to Darkness Allegiance @@ -135,12 +136,19 @@ const BattleTraits = { name: `Blasphemous Rituals`, desc: `CABALIST HEROES become WIZARDS. If the HERO is already a WIZARD, they can attempt to cast 1 additional spell in each of your hero phases and know 1 additional spell from the Lore of the Damned spell lore.`, when: [DURING_GAME, HERO_PHASE], - rule_sources: [rule_sources.ERRATA_JANUARY_2023], + rule_sources: [ + rule_sources.ERRATA_JANUARY_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, { name: `Blasphemous Rituals`, - desc: `In addition, if you carry out the Draw on Power heroic action with a CABALIST HERO, you can immediately carry out the same heroic action with each other CABALIST HERO within 3" of the first.`, + desc: `In addition, if you carry out the Draw on Power heroic action (pg 72) with a Cabalist Hero, you can immediately carry out the same heroic action with each other Cabalist Hero that has the Eye of Gods keyword and that is within 3" of the first.`, when: [START_OF_HERO_PHASE], + rule_sources: [ + rule_sources.ERRATA_JANUARY_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, ], }, diff --git a/src/factions/sons_of_behemat/battalions.ts b/src/factions/sons_of_behemat/battalions.ts index b2cf698a6..01b19edba 100644 --- a/src/factions/sons_of_behemat/battalions.ts +++ b/src/factions/sons_of_behemat/battalions.ts @@ -10,11 +10,17 @@ const Battalions = { effects: [ { ...MagnificentBattalionEffect, - rule_sources: [rule_sources.WHITE_DWARF_AUGUST_2021, meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023], + rule_sources: [ + rule_sources.WHITE_DWARF_AUGUST_2021, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, { ...OneDropDeploymentEffect, - rule_sources: [rule_sources.WHITE_DWARF_AUGUST_2021, meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023], + rule_sources: [ + rule_sources.WHITE_DWARF_AUGUST_2021, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, ], }, @@ -22,11 +28,17 @@ const Battalions = { effects: [ { ...OneDropDeploymentEffect, - rule_sources: [rule_sources.WHITE_DWARF_AUGUST_2021, meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023], + rule_sources: [ + rule_sources.WHITE_DWARF_AUGUST_2021, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, { ...SwiftBattalionEffect, - rule_sources: [rule_sources.WHITE_DWARF_AUGUST_2021, meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023], + rule_sources: [ + rule_sources.WHITE_DWARF_AUGUST_2021, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, ], }, diff --git a/src/factions/soulblight_gravelords/battle_traits.ts b/src/factions/soulblight_gravelords/battle_traits.ts index b4e722d8d..b615576c6 100644 --- a/src/factions/soulblight_gravelords/battle_traits.ts +++ b/src/factions/soulblight_gravelords/battle_traits.ts @@ -1,5 +1,6 @@ import { tagAs } from 'factions/metatagger' import { SOULBLIGHT_GRAVELORDS } from 'meta/factions' +import meta_rule_sources from 'meta/rule_sources' import { DURING_SETUP, END_OF_MOVEMENT_PHASE, @@ -39,6 +40,7 @@ const BattleTraits = { If you pick a Summonable Hero, on a 4+, you can set up that Hero wholly within 12" of a friendly Soulblight Gravelords Hero or gravesite, more than 3" from all enemy units if it is your turn or more than 9" if it is the enemy turn, and with 3 wounds allocated to it. That Hero cannot attempt a charge or make a pile-in move in the same turn. You cannot pick the same Hero to benefit from this ability more than once per battle.`, when: [END_OF_MOVEMENT_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, { name: `Deathly Invocation`, diff --git a/src/factions/soulblight_gravelords/spells.ts b/src/factions/soulblight_gravelords/spells.ts index ca26eb875..2b2d7f55a 100644 --- a/src/factions/soulblight_gravelords/spells.ts +++ b/src/factions/soulblight_gravelords/spells.ts @@ -1,4 +1,5 @@ import { tagAs } from 'factions/metatagger' +import meta_rule_sources from 'meta/rule_sources' import { HERO_PHASE } from 'types/phases' const Spells = { @@ -6,8 +7,9 @@ const Spells = { effects: [ { name: `Spirit Gale`, - desc: `Casting value of 7. If successfully cast, each enemy unit on the battlefield suffers 1 mortal wound. If the unmodified casting roll for this spell is 9+ and this spell is not unbound, after the effect of this spell has been resolved, you can immediately resolve the effect of this spell for a second time.`, + desc: `Casting value of 7. Pick up to 3 different enemy units on the battlefield to suffer 1 mortal wound. If the unmodified casting roll for this spell is 9+ and this spell is not unbound, pick up to 6 different enemy units on the battlefield to suffer 1 mortal wound instead.`, when: [HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, ], }, diff --git a/src/factions/soulblight_gravelords/units.ts b/src/factions/soulblight_gravelords/units.ts index c5c60e6bb..bc90f86a5 100644 --- a/src/factions/soulblight_gravelords/units.ts +++ b/src/factions/soulblight_gravelords/units.ts @@ -23,6 +23,7 @@ import { WOUND_ALLOCATION_PHASE, } from 'types/phases' import spells from './spells' +import meta_rule_sources from 'meta/rule_sources' const VampiricAgilityEffect = { name: `Vampiric Agility`, @@ -570,6 +571,7 @@ const Units = { name: `Dragged Down and Torn Apart`, desc: `Each time a model in this unit is slain by an attack made with a melee weapon, if that model is within 3" of the attacking unit, roll a dice. On a 5+, the attacking unit suffers 1 mortal wound.`, when: [WOUND_ALLOCATION_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], }, { name: `The Newly Dead`, diff --git a/src/factions/stormcast_eternals/battle_traits.ts b/src/factions/stormcast_eternals/battle_traits.ts index 780a433e9..19d0df0ed 100644 --- a/src/factions/stormcast_eternals/battle_traits.ts +++ b/src/factions/stormcast_eternals/battle_traits.ts @@ -1,4 +1,5 @@ import { tagAs } from 'factions/metatagger' +import meta_rule_sources from 'meta/rule_sources' import { BATTLESHOCK_PHASE, CHARGE_PHASE, @@ -85,6 +86,12 @@ const BattleTraits = { desc: `Pick 1 MONSTER in your opponent's starting army that is on the battlefield. You complete this tactic if that unit is destroyed by wounds caused by attacks made by friendly DRACONITH or STARDRAKE units during this turn.`, when: [START_OF_HERO_PHASE], }, + { + name: `Secure the Battlefield`, + desc: `You complete this battle tactic at the end of your turn if there are any friendly Stormcast Eternals units wholly within each large quarter of the battlefield and more than 6" from all enemy units.`, + when: [START_OF_HERO_PHASE], + rule_sources: [meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], + }, ], }, } diff --git a/src/factions/stormcast_eternals/command_abilities.ts b/src/factions/stormcast_eternals/command_abilities.ts index 7e1627a10..c654a47c0 100644 --- a/src/factions/stormcast_eternals/command_abilities.ts +++ b/src/factions/stormcast_eternals/command_abilities.ts @@ -39,7 +39,7 @@ const CommandAbilities = { rule_sources.ERRATA_JULY_2022, meta_rule_sources.BATTLESCROLL_GALLETIAN_CHAMPIONS_JANUARY_2022, meta_rule_sources.BATTLESCROLL_DEPLETED_RESERVES_APRIL_2023, - meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, ], diff --git a/src/factions/stormcast_eternals/units.ts b/src/factions/stormcast_eternals/units.ts index 5b777d053..1722496d0 100644 --- a/src/factions/stormcast_eternals/units.ts +++ b/src/factions/stormcast_eternals/units.ts @@ -1320,7 +1320,7 @@ const Units = { rule_sources.BATTLETOME_STORMCAST_ETERNALS, rule_sources.ERRATA_JULY_2022, meta_rule_sources.BATTLESCROLL_GALLETIAN_CHAMPIONS_JANUARY_2022, - meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, ], diff --git a/src/generic_rules/artifacts.ts b/src/generic_rules/artifacts.ts index ce75c4f38..31ef4bbe8 100644 --- a/src/generic_rules/artifacts.ts +++ b/src/generic_rules/artifacts.ts @@ -44,7 +44,7 @@ const GenericArtifacts: TEntry[] = [ rule_sources: [ meta_rule_sources.CORE_RULES_2021, meta_rule_sources.BATTLESCROLL_DEPLETED_RESERVES_APRIL_2023, - meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, ], diff --git a/src/generic_rules/command_abilities.ts b/src/generic_rules/command_abilities.ts index b8a4e09c0..a94dd4d4d 100644 --- a/src/generic_rules/command_abilities.ts +++ b/src/generic_rules/command_abilities.ts @@ -16,12 +16,12 @@ const GenericCommandAbilities: TEntry[] = [ effects: [ { name: `Rally`, - desc: `You can use this command ability at the start of the hero phase. The unit that receives the command must be more than 3" from all enemy units. Roll 1 dice for each slain model from that unit. For each 6, you can return 1 slain model to that unit. 'You can only return models to that unit that have a combined Wounds characteristic of 10 or less. For example, if the unit that received the command has a Wounds characteristic of 2, you can return a maximum of 5 models to that unit. You can only return models to that unit that have a combined Wounds characteristic of 10 or less. For example, if the unit that received the command has a Wounds characteristic of 2, you can return a maximum of 5 models to that unit.`, + desc: `You can use this command ability at the start of the hero phase. The unit that receives the command must be more than 3" from all enemy units. Roll 1 dice for each slain model from that unit. For each 6, you can return 1 slain model to that unit. You can only return models to that unit that have a combined Wounds characteristic of 10 or less. For example, if the unit that received the command has a Wounds characteristic of 2, you can return a maximum of 5 models to that unit. You can only return models to that unit that have a combined Wounds characteristic of 10 or less. For example, if the unit that received the command has a Wounds characteristic of 2, you can return a maximum of 5 models to that unit.`, when: [START_OF_HERO_PHASE], rule_sources: [ meta_rule_sources.CORE_RULES_2021, meta_rule_sources.BATTLESCROLL_DEPLETED_RESERVES_APRIL_2023, - meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, ], diff --git a/src/generic_rules/core_rules.ts b/src/generic_rules/core_rules.ts index d24492f21..58420c914 100644 --- a/src/generic_rules/core_rules.ts +++ b/src/generic_rules/core_rules.ts @@ -32,7 +32,10 @@ const CoreRules: TEntry[] = [ name: `1.3.3 - Unit Coherency`, desc: `Units must be set up and finish every move as a single coherent group. A unit with 2 to 6 models is coherent if each model in the unit is within 1" horizontally and 6" vertically of at least 1 other model in the unit. A unit with more than 6 models is coherent if each model in the unit is within 1" horizontally and 6" vertically of at least 2 other models in the unit. If a friendly unit is not coherent at the end of a turn or after you set it up, you must remove models in the unit from play, one at a time, until it is coherent.`, when: [DURING_GAME], - rule_sources: [meta_rule_sources.CORE_RULES_2021, meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023], + rule_sources: [ + meta_rule_sources.CORE_RULES_2021, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, ], }, @@ -320,7 +323,10 @@ const CoreRules: TEntry[] = [ name: `10.1.2 - Look Out, Sir!`, desc: `You must subtract 1 from the hit roll (see 13.3) for an attack made with a missile weapon if the target is an enemy HERO within 3" of an enemy unit that has 3 or more models. If that Hero does not have a mount (with the exception of companions), it also cannot be targeted by attacks made with missile weapons if the attacking model is more than 12" away from them. The Look Out, Sir! rule does not apply if the enemy HERO has a Wounds characteristic of 10 or more.`, when: [SHOOTING_PHASE], - rule_sources: [meta_rule_sources.CORE_RULES_2021, meta_rule_sources.BATTLESCROLL_ANDTOR_JULY_2023], + rule_sources: [ + meta_rule_sources.CORE_RULES_2021, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, + ], }, ], }, diff --git a/src/generic_rules/endless_spells.ts b/src/generic_rules/endless_spells.ts index ab15c6cd0..98a8439fe 100644 --- a/src/generic_rules/endless_spells.ts +++ b/src/generic_rules/endless_spells.ts @@ -219,12 +219,13 @@ export const MalevolentMaelstromEffects = [ At the end of a phase in which the dice beside this endless spell reaches '6', this endless spell is removed from play. - When this endless spell is removed from play, add 6 to the value of the dice beside it. Each unit within a number of inches equal to the result suffers D3 mortal wounds. Wizards suffer 3 mortal wounds instead of D3`, + When this endless spell is removed from play, if the dice beside it is a 6, this endless spell explodes. When it explodes, each unit within 12" of this endless spell suffers D3 mortal wounds. Wizard Heroes suffer 3 mortal wounds instead of D3.`, when: [HERO_PHASE], rule_sources: [ meta_rule_sources.GHB_2022, meta_rule_sources.GHB_2022_2023_SEASON_2, meta_rule_sources.GHB_2023_2024, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, ] @@ -307,12 +308,13 @@ export const UmbralSpellportalEffects = [ }, { name: `Arcane Passage`, - desc: `In additions, once per turn, if a predatory endless spell starts a move within 6" of this endless spell, instead of making a move with it, the commanding player can remove that predatory endless spell from the battlefield and set it up again anywhere within 6" of the other part of this endless spell. An endless spell set up in this manner does not count as having moved.`, + desc: `In addition, once per turn, if a predatory endless spell starts a move within 6" of this endless spell, instead of making a move with it, the commanding player can remove that predatory endless spell from the battlefield and set it up again anywhere within 6" of the other part of this endless spell. An endless spell set up in this manner does not count as having moved but cannot move until the next hero phase.`, when: [END_OF_HERO_PHASE], rule_sources: [ meta_rule_sources.GHB_2022, meta_rule_sources.GHB_2022_2023_SEASON_2, meta_rule_sources.GHB_2023_2024, + meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023, ], }, ] diff --git a/src/generic_rules/grand_strategies.ts b/src/generic_rules/grand_strategies.ts index 789b83b42..6f81cf4eb 100644 --- a/src/generic_rules/grand_strategies.ts +++ b/src/generic_rules/grand_strategies.ts @@ -94,140 +94,142 @@ const GenericGrandStrategies: TEntry[] = [ }, // GHB 2022 Grand Strategies - { - name: `No Place for the Weak`, - effects: [ - { - name: `No Place for the Weak`, - desc: `When the battle ends, you complete this grand strategy if there are no Battleline units from your opponent's starting army on the battlefield.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022], - }, - ], - }, - { - name: `Tame the Land`, - effects: [ - { - name: `Tame the Land`, - desc: `When the battle ends, you complete this grand strategy if you control all of the objectives on the battlefield that are wholly outside your territory.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022], - }, - ], - }, - { - name: `Defend What's Ours`, - effects: [ - { - name: `Defend What's Ours`, - desc: `When the battle ends, you complete this grand strategy if there are no enemy units wholly within your territory.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022], - }, - ], - }, - { - name: `Take What's Theirs`, - effects: [ - { - name: `Take What's Theirs`, - desc: `When the battle ends, you complete this grand strategy if there are more friendly units than enemy units wholly within your opponent's territory.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022], - }, - ], - }, - { - name: `Demonstration of Strength`, - effects: [ - { - name: `Demonstration of Strength`, - desc: `When the battle ends, you complete this grand strategy if there are 3 or more GALLETIAN VETERANS units from your starting army on the battlefield.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022], - }, - ], - }, - { - name: `Show of Dominance`, - effects: [ - { - name: `Show of Dominance`, - desc: `When the battle ends, you complete this grand strategy if there are any friendly GALLETIAN VETERANS units in each quarter of the battlefield.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022], - }, - ], - }, + // { + // name: `No Place for the Weak`, + // effects: [ + // { + // name: `No Place for the Weak`, + // desc: `When the battle ends, you complete this grand strategy if there are no Battleline units from your opponent's starting army on the battlefield.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022], + // }, + // ], + // }, + // { + // name: `Tame the Land`, + // effects: [ + // { + // name: `Tame the Land`, + // desc: `When the battle ends, you complete this grand strategy if you control all of the objectives on the battlefield that are wholly outside your territory.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022], + // }, + // ], + // }, + // { + // name: `Defend What's Ours`, + // effects: [ + // { + // name: `Defend What's Ours`, + // desc: `When the battle ends, you complete this grand strategy if there are no enemy units wholly within your territory.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022], + // }, + // ], + // }, + // { + // name: `Take What's Theirs`, + // effects: [ + // { + // name: `Take What's Theirs`, + // desc: `When the battle ends, you complete this grand strategy if there are more friendly units than enemy units wholly within your opponent's territory.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022], + // }, + // ], + // }, + // { + // name: `Demonstration of Strength`, + // effects: [ + // { + // name: `Demonstration of Strength`, + // desc: `When the battle ends, you complete this grand strategy if there are 3 or more GALLETIAN VETERANS units from your starting army on the battlefield.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022], + // }, + // ], + // }, + // { + // name: `Show of Dominance`, + // effects: [ + // { + // name: `Show of Dominance`, + // desc: `When the battle ends, you complete this grand strategy if there are any friendly GALLETIAN VETERANS units in each quarter of the battlefield.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022], + // }, + // ], + // }, // GHB 2022-23 Season 2 Grand Strategies - { - name: `Tame the Land`, - effects: [ - { - name: `Tame the Land`, - desc: `When the battle ends, you complete this grand strategy if you control all of the objectives on the battlefield that are wholly outside your territory.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - ], - }, - { - name: `Defend What's Ours`, - effects: [ - { - name: `Defend What's Ours`, - desc: `When the battle ends, you complete this grand strategy if there are no enemy units wholly within your territory.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - ], - }, - { - name: `Take What's Theirs`, - effects: [ - { - name: `Take What's Theirs`, - desc: `When the battle ends, you complete this grand strategy if there are more friendly than enemy units wholly within enemy territory.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - ], - }, - { - name: `Stake a Claim`, - effects: [ - { - name: `Stake a Claim`, - desc: `When the battle ends, you complete this grand strategy if 3 or more friendly GALLETIAN CHAMPIONS are wholly within enemy territory.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - ], - }, - { - name: `Survivor's Instinct`, - effects: [ - { - name: `Survivor's Instinct`, - desc: `When the battle ends, you complete this grand strategy if the model picked to be your general is a GALLETIAN CHAMPION and that model is contesting an objective wholly outside your territory.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - ], - }, - { - name: `The Day is Ours!`, - effects: [ - { - name: `The Day is Ours!`, - desc: `When the battle ends, you complete this grand strategy if there are more friendly GALLETIAN CHAMPIONS from your starting army than GALLETIAN CHAMPIONS from your opponent's starting army on the battlefield.`, - when: [END_OF_GAME], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - ], - }, + // { + // name: `Tame the Land`, + // effects: [ + // { + // name: `Tame the Land`, + // desc: `When the battle ends, you complete this grand strategy if you control all of the objectives on the battlefield that are wholly outside your territory.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // ], + // }, + // { + // name: `Defend What's Ours`, + // effects: [ + // { + // name: `Defend What's Ours`, + // desc: `When the battle ends, you complete this grand strategy if there are no enemy units wholly within your territory.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // ], + // }, + // { + // name: `Take What's Theirs`, + // effects: [ + // { + // name: `Take What's Theirs`, + // desc: `When the battle ends, you complete this grand strategy if there are more friendly than enemy units wholly within enemy territory.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // ], + // }, + // { + // name: `Stake a Claim`, + // effects: [ + // { + // name: `Stake a Claim`, + // desc: `When the battle ends, you complete this grand strategy if 3 or more friendly GALLETIAN CHAMPIONS are wholly within enemy territory.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // ], + // }, + // { + // name: `Survivor's Instinct`, + // effects: [ + // { + // name: `Survivor's Instinct`, + // desc: `When the battle ends, you complete this grand strategy if the model picked to be your general is a GALLETIAN CHAMPION and that model is contesting an objective wholly outside your territory.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // ], + // }, + // { + // name: `The Day is Ours!`, + // effects: [ + // { + // name: `The Day is Ours!`, + // desc: `When the battle ends, you complete this grand strategy if there are more friendly GALLETIAN CHAMPIONS from your starting army than GALLETIAN CHAMPIONS from your opponent's starting army on the battlefield.`, + // when: [END_OF_GAME], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // ], + // }, + + // GHB 2023-24 Season 2 Grand Strategies { name: `Control the Nexus`, effects: [ diff --git a/src/generic_rules/realmscapes.ts b/src/generic_rules/realmscapes.ts index 9eb68eef7..42bcd9f4a 100644 --- a/src/generic_rules/realmscapes.ts +++ b/src/generic_rules/realmscapes.ts @@ -1,268 +1,267 @@ import meta_rule_sources from 'meta/rule_sources' import { TEntry } from 'types/data' -import { - DURING_GAME, - DURING_SETUP, - END_OF_ROUND, - END_OF_TURN, - HERO_PHASE, - MOVEMENT_PHASE, - SHOOTING_PHASE, - START_OF_COMBAT_PHASE, - START_OF_HERO_PHASE, - TURN_THREE_START_OF_ROUND, - TURN_TWO_START_OF_HERO_PHASE, - WOUND_ALLOCATION_PHASE, -} from 'types/phases' +import { DURING_GAME, HERO_PHASE, START_OF_HERO_PHASE, START_OF_ROUND } from 'types/phases' import { RealmscapesEnum } from 'types/realmscapes' // Realmscapes and their various effects/spells etc. const Realmscapes: TEntry[] = [ - { - name: RealmscapesEnum.GHUR, - effects: [ - { - name: `Predators and Prey`, - desc: `Once per battle round, you score 1 additional victory point if any enemy MONSTERS were slain in that battle round.`, - when: [END_OF_ROUND], - rule_sources: [meta_rule_sources.GHB_2021], - }, - { - name: `Seismic Shift`, - desc: `At the start of the third battle round, after the players roll off to determine who has the first turn, the player taking the second turn in that battle round can pick 1 objective marker on the battlefield and remove it from play.`, - when: [TURN_THREE_START_OF_ROUND], - rule_sources: [meta_rule_sources.GHB_2021], - }, - { - name: `Feral Roar`, - desc: `You can use this command ability at the start of the combat phase. The unit that receives that command must be a MONSTER. Until the end of that phase, when you look up a value on that unit's damage table, it is treated as if it has suffered 0 wounds.`, - when: [START_OF_COMBAT_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - command_ability: true, - }, - { - name: `Metamorphosis`, - desc: `Casting value of 5 and range of 12". Pick 1 friendly HERO that is not a MONSTER and that is within range and visible to the caster. That HERO gains the MONSTER keyword until your next hero phase.`, - when: [HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - spell: true, - }, + // { + // name: RealmscapesEnum.GHUR, + // effects: [ + // { + // name: `Predators and Prey`, + // desc: `Once per battle round, you score 1 additional victory point if any enemy MONSTERS were slain in that battle round.`, + // when: [END_OF_ROUND], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // { + // name: `Seismic Shift`, + // desc: `At the start of the third battle round, after the players roll off to determine who has the first turn, the player taking the second turn in that battle round can pick 1 objective marker on the battlefield and remove it from play.`, + // when: [TURN_THREE_START_OF_ROUND], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // { + // name: `Feral Roar`, + // desc: `You can use this command ability at the start of the combat phase. The unit that receives that command must be a MONSTER. Until the end of that phase, when you look up a value on that unit's damage table, it is treated as if it has suffered 0 wounds.`, + // when: [START_OF_COMBAT_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // command_ability: true, + // }, + // { + // name: `Metamorphosis`, + // desc: `Casting value of 5 and range of 12". Pick 1 friendly HERO that is not a MONSTER and that is within range and visible to the caster. That HERO gains the MONSTER keyword until your next hero phase.`, + // when: [HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // spell: true, + // }, - // Battle Tactics - { - name: `Battle Tactics`, - desc: `At the start of your hero phase, you must pick 1 battle tactic. You must reveal your choice to your opponent, and if your battle tactics instructs you to pick something, you must tell your opponent what you pick. You have until the end of that turn to complete the battle tactic. You cannot pick the same battle tactic more than once per battle.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - }, - { - name: `Battle Tactic: Broken Ranks`, - desc: `When you reveal this battle tactic, pick 1 Battleline unit from your opponent's starting army on the battlefield. You complete this battle tactic if that unit is destroyed during this turn. If that unit was destroyed by an attack made by a friendly MONSTER or an ability of a friendly MONSTER, score 1 additional victory point.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - }, - { - name: `Battle Tactic: Conquer`, - desc: `When you reveal this battle tactic, pick 1 objective marker on the battlefield that your opponent controls. You complete this battle tactic if you control that objective marker at the end of this turn.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - }, - { - name: `Battle Tactic: Slay the Warlord`, - desc: `You complete this battle tactic if the model chosen to be your opponent's general is slain during this turn. If that model was destroyed by an attack made by a friendly MONSTER or an ability of a friendly MONSTER, score 1 additional victory point.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - }, - { - name: `Battle Tactic: Ferocious Advance`, - desc: `When you reveal this battle tactic, pick 3 different units from your starting army on the battlefield. You complete this battle tactic if all of the units your picked run in the following movement phase and finish that run within 3" of each other. If all 3 of those units are MONSTERS, score 1 additional victory point.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - }, - { - name: `Battle Tactic: Bring It Down!`, - desc: `When you reveal this battle tactic, pick 1 enemy MONSTER on the battlefield. You complete this battle tactic if that unit is destroyed during this turn. If that enemy MONSTER was destroyed by an attack made by a friendly MONSTER or an ability of a friendly MONSTER, score 1 additional victory point.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - }, - { - name: `Battle Tactic: Aggressive Expansion`, - desc: `When you reveal this battle tactic, pick 2 objective markers on the battlefield that are not wholly within your territory. You complete this battle tactic if you control both objective markers at the end of this turn.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - }, - { - name: `Battle Tactic: Monstrous Takeover`, - desc: `When you reveal this battle tactic, pick 1 MONSTER from your starting army on the battlefield. You complete this battle tactic if that MONSTER is contesting an objective marker that you control at the end of this turn, and that objective marker is not contested by an enemy MONSTER.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - }, - { - name: `Battle Tactic: Savage Spearhead`, - desc: `You complete this battle tactic if there are 2 or more units from your starting army wholly within your opponent's territory at the end of this turn. If 2 or more of those units are MONSTERS, score 1 additional victory point.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2021], - }, - ], - }, + // // Battle Tactics + // { + // name: `Battle Tactics`, + // desc: `At the start of your hero phase, you must pick 1 battle tactic. You must reveal your choice to your opponent, and if your battle tactics instructs you to pick something, you must tell your opponent what you pick. You have until the end of that turn to complete the battle tactic. You cannot pick the same battle tactic more than once per battle.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // { + // name: `Battle Tactic: Broken Ranks`, + // desc: `When you reveal this battle tactic, pick 1 Battleline unit from your opponent's starting army on the battlefield. You complete this battle tactic if that unit is destroyed during this turn. If that unit was destroyed by an attack made by a friendly MONSTER or an ability of a friendly MONSTER, score 1 additional victory point.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // { + // name: `Battle Tactic: Conquer`, + // desc: `When you reveal this battle tactic, pick 1 objective marker on the battlefield that your opponent controls. You complete this battle tactic if you control that objective marker at the end of this turn.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // { + // name: `Battle Tactic: Slay the Warlord`, + // desc: `You complete this battle tactic if the model chosen to be your opponent's general is slain during this turn. If that model was destroyed by an attack made by a friendly MONSTER or an ability of a friendly MONSTER, score 1 additional victory point.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // { + // name: `Battle Tactic: Ferocious Advance`, + // desc: `When you reveal this battle tactic, pick 3 different units from your starting army on the battlefield. You complete this battle tactic if all of the units your picked run in the following movement phase and finish that run within 3" of each other. If all 3 of those units are MONSTERS, score 1 additional victory point.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // { + // name: `Battle Tactic: Bring It Down!`, + // desc: `When you reveal this battle tactic, pick 1 enemy MONSTER on the battlefield. You complete this battle tactic if that unit is destroyed during this turn. If that enemy MONSTER was destroyed by an attack made by a friendly MONSTER or an ability of a friendly MONSTER, score 1 additional victory point.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // { + // name: `Battle Tactic: Aggressive Expansion`, + // desc: `When you reveal this battle tactic, pick 2 objective markers on the battlefield that are not wholly within your territory. You complete this battle tactic if you control both objective markers at the end of this turn.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // { + // name: `Battle Tactic: Monstrous Takeover`, + // desc: `When you reveal this battle tactic, pick 1 MONSTER from your starting army on the battlefield. You complete this battle tactic if that MONSTER is contesting an objective marker that you control at the end of this turn, and that objective marker is not contested by an enemy MONSTER.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // { + // name: `Battle Tactic: Savage Spearhead`, + // desc: `You complete this battle tactic if there are 2 or more units from your starting army wholly within your opponent's territory at the end of this turn. If 2 or more of those units are MONSTERS, score 1 additional victory point.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2021], + // }, + // ], + // }, - { - name: RealmscapesEnum.GALLET, - effects: [ - { - name: `Galletian Champions`, - desc: `HEROES with a Wounds characteristic of less than 10, that do not have a mount (with the exception of companions) and that are not Unique gain the GALLETIAN CHAMPION keyword.`, - when: [DURING_SETUP], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2, meta_rule_sources.ERRATA_GHB_JANUARY_2023], - }, - { - name: `The Key to Victory`, - desc: `Friendly GALLETIAN CHAMPIONS cannot be picked as the target of attacks made with missile weapons while they are within 1" of any friendly Battleline units.`, - when: [SHOOTING_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Desperate Action`, - desc: `If you are taking the second turn in the current battle round, at the start of your hero phase, you can pick 1 friendly GALLETIAN CHAMPION on the battlefield to carry out 2 different heroic actions in that phase instead of 1.`, - when: [TURN_TWO_START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Strike at the Opening (Heroic Action)`, - desc: `Pick 1 friendly GALLETIAN CHAMPION within 3" of an enemy unit. That HERO can fight if it has not already fought in that phase. However, that HERO cannot fight again in that phase and the strike-last effect applies to that HERO until the end of the turn.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Lead by Example (Heroic Action)`, - desc: `Pick 1 friendly GALLETIAN CHAMPION that has a Sworn Bodyguard unit (pg 14) and that has just carried out the 'Strike at the Opening' heroic action. If that Sworn Bodyguard unit is wholly within 6" of that GALLETIAN CHAMPION and within 3" of an enemy unit, that Sworn Bodyguard unit can fight if it has not already fought in that phase. However, that unit cannot fight again in that phase and the strike-last effect applies to that unit until the end of the turn.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Grinding Teeth of Gallet`, - desc: `Casting value of 6 and a range of 12". Pick 1 objective within range and visible to the caster. Then, roll a dice for each unit within 6" of that objective. On a 4+, that unit suffers D6 mortal wounds. All Wizards know this spell in addition to any others that they know.`, - when: [HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - spell: true, - }, - { - name: `No Retreat, No Surrender`, - desc: `You can use this command ability at the start of the combat phase. The unit that receives the command must be a friendly unit that is not a HERO or MONSTER, that did not charge in the same turn, and that is within 3" of an enemy unit. That unit cannot make pile-in moves in that phase, but add 1 to the Attacks characteristic of melee weapons used by that unit until the end of that phase (excluding those of its mounts, if it has any). Each player can use this command ability in addition to any others that they can use.`, - when: [START_OF_COMBAT_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - command_ability: true, - }, - { - name: `The Prize of Gallet - Victory Points`, - desc: `Each player scores victory points at the end of each of their turns as follows: + // { + // name: RealmscapesEnum.GALLET, + // effects: [ + // { + // name: `Galletian Champions`, + // desc: `HEROES with a Wounds characteristic of less than 10, that do not have a mount (with the exception of companions) and that are not Unique gain the GALLETIAN CHAMPION keyword.`, + // when: [DURING_SETUP], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2, meta_rule_sources.ERRATA_GHB_JANUARY_2023], + // }, + // { + // name: `The Key to Victory`, + // desc: `Friendly GALLETIAN CHAMPIONS cannot be picked as the target of attacks made with missile weapons while they are within 1" of any friendly Battleline units.`, + // when: [SHOOTING_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Desperate Action`, + // desc: `If you are taking the second turn in the current battle round, at the start of your hero phase, you can pick 1 friendly GALLETIAN CHAMPION on the battlefield to carry out 2 different heroic actions in that phase instead of 1.`, + // when: [TURN_TWO_START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Strike at the Opening (Heroic Action)`, + // desc: `Pick 1 friendly GALLETIAN CHAMPION within 3" of an enemy unit. That HERO can fight if it has not already fought in that phase. However, that HERO cannot fight again in that phase and the strike-last effect applies to that HERO until the end of the turn.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Lead by Example (Heroic Action)`, + // desc: `Pick 1 friendly GALLETIAN CHAMPION that has a Sworn Bodyguard unit (pg 14) and that has just carried out the 'Strike at the Opening' heroic action. If that Sworn Bodyguard unit is wholly within 6" of that GALLETIAN CHAMPION and within 3" of an enemy unit, that Sworn Bodyguard unit can fight if it has not already fought in that phase. However, that unit cannot fight again in that phase and the strike-last effect applies to that unit until the end of the turn.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Grinding Teeth of Gallet`, + // desc: `Casting value of 6 and a range of 12". Pick 1 objective within range and visible to the caster. Then, roll a dice for each unit within 6" of that objective. On a 4+, that unit suffers D6 mortal wounds. All Wizards know this spell in addition to any others that they know.`, + // when: [HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // spell: true, + // }, + // { + // name: `No Retreat, No Surrender`, + // desc: `You can use this command ability at the start of the combat phase. The unit that receives the command must be a friendly unit that is not a HERO or MONSTER, that did not charge in the same turn, and that is within 3" of an enemy unit. That unit cannot make pile-in moves in that phase, but add 1 to the Attacks characteristic of melee weapons used by that unit until the end of that phase (excluding those of its mounts, if it has any). Each player can use this command ability in addition to any others that they can use.`, + // when: [START_OF_COMBAT_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // command_ability: true, + // }, + // { + // name: `The Prize of Gallet - Victory Points`, + // desc: `Each player scores victory points at the end of each of their turns as follows: - - Score 1 victory point if you control at least one activated objective. - - Score 1 victory point if you control two or more activated objectives. - - Score 1 victory point if you control more activated objectives than your opponent. - - Score 2 victory points if you completed the battle tactic you picked that turn.`, - when: [END_OF_TURN], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, + // - Score 1 victory point if you control at least one activated objective. + // - Score 1 victory point if you control two or more activated objectives. + // - Score 1 victory point if you control more activated objectives than your opponent. + // - Score 2 victory points if you completed the battle tactic you picked that turn.`, + // when: [END_OF_TURN], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, - // Aspect of the Champion - { - name: `Tunnel Master (Aspect of the Champion)`, - desc: `Once per battle, instead of picking this GALLETIAN CHAMPION to make a normal move, you can remove it from the battlefield and set it up again on the battlefield more than 9" from all enemy units.`, - when: [MOVEMENT_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Fuelled by Ghurish Rage (Aspect of the Champion)`, - desc: `Once per battle, before you allocate a wound or mortal wound to this GALLETIAN CHAMPION and that wound or mortal wound would cause it to be slain, you can roll a dice. On a 3+, that wound or mortal wound is negated, you can heal up to D3 wounds allocated to it and any wounds that currently remain to be allocated to it are negated.`, - when: [WOUND_ALLOCATION_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Stubborn as a Rhinox (Aspect of the Champion)`, - desc: `This GALLETIAN CHAMPION counts as 10 models for the purposes of contesting objectives while there are no enemy GALLETIAN CHAMPIONS contesting the same objective.`, - when: [DURING_GAME], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Leadership of the Alpha (Aspect of the Champion)`, - desc: `Once per battle, this GALLETIAN CHAMPION can issue one of the following commands up to 3 times in the same phase: Rally, All-out Attack, All-out Defence or Redeploy. If it does so, no command point is spent the second and third times this GALLETIAN CHAMPION issues that command in that phase.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, + // // Aspect of the Champion + // { + // name: `Tunnel Master (Aspect of the Champion)`, + // desc: `Once per battle, instead of picking this GALLETIAN CHAMPION to make a normal move, you can remove it from the battlefield and set it up again on the battlefield more than 9" from all enemy units.`, + // when: [MOVEMENT_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Fuelled by Ghurish Rage (Aspect of the Champion)`, + // desc: `Once per battle, before you allocate a wound or mortal wound to this GALLETIAN CHAMPION and that wound or mortal wound would cause it to be slain, you can roll a dice. On a 3+, that wound or mortal wound is negated, you can heal up to D3 wounds allocated to it and any wounds that currently remain to be allocated to it are negated.`, + // when: [WOUND_ALLOCATION_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Stubborn as a Rhinox (Aspect of the Champion)`, + // desc: `This GALLETIAN CHAMPION counts as 10 models for the purposes of contesting objectives while there are no enemy GALLETIAN CHAMPIONS contesting the same objective.`, + // when: [DURING_GAME], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Leadership of the Alpha (Aspect of the Champion)`, + // desc: `Once per battle, this GALLETIAN CHAMPION can issue one of the following commands up to 3 times in the same phase: Rally, All-out Attack, All-out Defence or Redeploy. If it does so, no command point is spent the second and third times this GALLETIAN CHAMPION issues that command in that phase.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + + // // Battle tactics + // { + // name: `Battle Tactics`, + // desc: `At the start of your hero phase, you must pick 1 battle tactic from the list below. You must reveal your choice to your opponent, and if your battle tactic instructs you to pick something, you must tell your opponent what you pick. You have until the end of that turn to complete the battle tactic. You cannot pick the same battle tactic more than once per battle.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Battle Tactic: Gaining Momentum`, + // desc: `Pick 1 enemy unit on the battlefield. You complete this battle tactic if that unit is destroyed during this turn and you control more objectives than your opponent at the end of this turn.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Battle Tactic: An Eye for an Eye`, + // desc: `You complete this battle tactic if 1 or more friendly units were destroyed in the previous turn and 1 or more enemy units are destroyed during this turn.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Battle Tactic: Desecrate their Lands`, + // desc: `Pick 1 terrain feature or faction terrain feature that is partially or wholly within enemy territory. You complete this battle tactic if you control that terrain feature at the end of this turn.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Battle Tactic: This One's Mine!`, + // desc: `Pick 1 enemy unit on the battlefield. You complete this battle tactic if that unit is destroyed during this turn by an attack made by the model picked to be your general.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Battle Tactic: A Matter of Honour`, + // desc: `Pick 1 enemy GALLETIAN CHAMPION or Sworn Bodyguard unit on the battlefield. You complete this battle tactic if that unit is destroyed during this turn by an attack made by a friendly GALLETIAN CHAMPION or Sworn Bodyguard unit.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Battle Tactic: Lead the Assault`, + // desc: `You complete this battle tactic if at least 2 of the objectives you control are in enemy territory and are each contested by any friendly GALLETIAN CHAMPIONS.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Battle Tactic: United Offence`, + // desc: `Pick 1 objective controlled by your opponent. You complete this battle tactic if you control that objective and 2 or more friendly GALLETIAN CHAMPIONS are contesting that objective at the end of this turn.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // { + // name: `Battle Tactic: Cunning Manoeuvre`, + // desc: `Pick 1 friendly GALLETIAN CHAMPION on the battlefield that is more than 3" from all enemy units. You complete this battle tactic if, at the end of the turn, that GALLETIAN CHAMPION is more than 3" from all enemy units and is contesting an objective you control that is wholly outside your territory.`, + // when: [START_OF_HERO_PHASE], + // rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], + // }, + // ], + // }, - // Battle tactics - { - name: `Battle Tactics`, - desc: `At the start of your hero phase, you must pick 1 battle tactic from the list below. You must reveal your choice to your opponent, and if your battle tactic instructs you to pick something, you must tell your opponent what you pick. You have until the end of that turn to complete the battle tactic. You cannot pick the same battle tactic more than once per battle.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Battle Tactic: Gaining Momentum`, - desc: `Pick 1 enemy unit on the battlefield. You complete this battle tactic if that unit is destroyed during this turn and you control more objectives than your opponent at the end of this turn.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Battle Tactic: An Eye for an Eye`, - desc: `You complete this battle tactic if 1 or more friendly units were destroyed in the previous turn and 1 or more enemy units are destroyed during this turn.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Battle Tactic: Desecrate their Lands`, - desc: `Pick 1 terrain feature or faction terrain feature that is partially or wholly within enemy territory. You complete this battle tactic if you control that terrain feature at the end of this turn.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Battle Tactic: This One's Mine!`, - desc: `Pick 1 enemy unit on the battlefield. You complete this battle tactic if that unit is destroyed during this turn by an attack made by the model picked to be your general.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Battle Tactic: A Matter of Honour`, - desc: `Pick 1 enemy GALLETIAN CHAMPION or Sworn Bodyguard unit on the battlefield. You complete this battle tactic if that unit is destroyed during this turn by an attack made by a friendly GALLETIAN CHAMPION or Sworn Bodyguard unit.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Battle Tactic: Lead the Assault`, - desc: `You complete this battle tactic if at least 2 of the objectives you control are in enemy territory and are each contested by any friendly GALLETIAN CHAMPIONS.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Battle Tactic: United Offence`, - desc: `Pick 1 objective controlled by your opponent. You complete this battle tactic if you control that objective and 2 or more friendly GALLETIAN CHAMPIONS are contesting that objective at the end of this turn.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - { - name: `Battle Tactic: Cunning Manoeuvre`, - desc: `Pick 1 friendly GALLETIAN CHAMPION on the battlefield that is more than 3" from all enemy units. You complete this battle tactic if, at the end of the turn, that GALLETIAN CHAMPION is more than 3" from all enemy units and is contesting an objective you control that is wholly outside your territory.`, - when: [START_OF_HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2022_2023_SEASON_2], - }, - ], - }, { name: RealmscapesEnum.ANDTOR, effects: [ + { + name: `One with the Land`, + desc: `WIZARD HEROES with a Wounds characteristic of 9 or less that are not Unique gain the ANDTORIAN LOCUS keyword.`, + when: [DURING_GAME], + rule_sources: [meta_rule_sources.GHB_2023_2024], + }, + { name: `Optimal Focus`, - desc: `At the start of the hero phase, both players roll a dice. For each 4+, each player receives 1 primal magic dice. After a player attempts to cast or unbind a spell, or after a player attempts to dispel an endless spell, they can roll 1 of their primal magic dice. If they do so, add the result to the casting, unbinding or dispelling roll. That player can continue to roll additional primal magic dice until the caster suffers a primal miscast (see below) or there are no more primal magic dice to be rolled. - Abilities that allow you to reroll casting, unbinding or dispelling rolls must be used before primal magic dice are rolled. If you choose to use an ability to reroll a casting, unbinding or dispelling roll, you cannot use primal magic dice to supplement that roll. At the end of each battle round, any primal magic dice that have not been used are lost. - When a primal magic dice is rolled as part of a casting roll, on an unmodified casting roll that includes a double 1, the caster suffers a primal miscast instead of a miscast. The spell is not successfully cast, the caster suffers D3+3 mortal wounds and each other unit within 3 Inches of the caster suffers D3 mortal wounds. In addition, the caster cannot attempt to cast any more spells in that phase. - When a primal magic dice is rolled as part of a casting roll, on an unmodified casting roll that includes a double 6, the spell is successfully cast and cannot be unbound. In addition, the caster cannot attempt to cast any more spells in that phase and both players receive 1 primal magic dice`, - when: [START_OF_HERO_PHASE], + desc: `At the start of the battle round, after priority is determined, the player taking the second turn can pick 1 friendly HERO on the battlefield. If that HERO is an ANDTORIAN LOCUS, they can attempt to cast 1 extra spell and attempt to unbind 1 extra spell in that battle round. If they are not an ANDTORIAN LOCUS, you receive 1 command point that can only be spent to allow that HERO to issue a command.`, + when: [START_OF_ROUND], rule_sources: [meta_rule_sources.GHB_2023_2024], }, + { name: `Primal Magic`, - desc: ``, + desc: `At the start of the hero phase, both players roll a dice. For each 4+, each player receives 1 primal magic dice. After a player attempts to cast or unbind a spell, or after a player attempts to dispel an endless spell, they can roll 1 of their primal magic dice. If they do so, add the result to the casting, unbinding or dispelling roll. That player can continue to roll additional primal magic dice until the caster suffers a primal miscast (see below) or there are no more primal magic dice to be rolled. + + Abilities that allow you to reroll casting, unbinding or dispelling rolls must be used before primal magic dice are rolled. If you choose to use an ability to reroll a casting, unbinding or dispelling roll, you cannot use primal magic dice to supplement that roll. At the end of each battle round, any primal magic dice that have not been used are lost. + + When a primal magic dice modifies a casting roll, if two or more of the dice in the casting roll and primal magic dice are 1s, the caster suffers a primal miscast instead of a miscast. The spell is not successfully cast, the caster suffers D3+3 mortal wounds and each other unit within 3" of the caster suffers D3 mortal wounds. In addition, the caster cannot attempt to cast any more spells in that phase. + + When a primal magic dice modifies a casting roll, if two or more of the dice in the casting roll and primal magic dice are 6s, and the caster did not suffer a primal miscast, the spell is successfully cast and cannot be unbound. In addition, the caster cannot attempt to cast any more spells in that phase and both players receive 1 primal magic dice.`, when: [START_OF_HERO_PHASE], rule_sources: [meta_rule_sources.GHB_2023_2024], }, @@ -271,25 +270,29 @@ const Realmscapes: TEntry[] = [ { name: `Shaman of the Chilled Lands`, desc: `This general knows all of the spells from the Lore of Primal Frost.`, - when: [DURING_GAME], + when: [HERO_PHASE], + command_trait: true, rule_sources: [meta_rule_sources.GHB_2023_2024], }, { name: `Eye of the Blizzard`, desc: `At the start of your hero phase, if this general is on the battlefield, roll a dice. On a 5+, you gain 1 primal magic dice.`, when: [START_OF_HERO_PHASE], + command_trait: true, rule_sources: [meta_rule_sources.GHB_2023_2024], }, { name: `Chilled to the Bone`, desc: `Once per battle, if this general suffers a miscast or primal miscast, you can roll a dice. On a 3+, this general can ignore the effects of that miscast or primal miscast.`, when: [HERO_PHASE], + command_trait: true, rule_sources: [meta_rule_sources.GHB_2023_2024], }, { name: `Eater of Magic`, desc: `Each time this general successfully unbinds a spell, roll a dice. On a 5+, the caster no longer knows that spell and may not cast it again for the rest of the battle.`, when: [HERO_PHASE], + command_trait: true, rule_sources: [meta_rule_sources.GHB_2023_2024], }, @@ -309,14 +312,16 @@ const Realmscapes: TEntry[] = [ { name: `Battle Tactic: Endless Expropriation`, desc: `Pick 1 enemy unit that is controlling or bonded to an endless spell or INCARNATE. You complete this battle tactic at the end of your turn if either of the following are true: + That enemy unit has been destroyed. + That INCARNATE is wild.`, when: [START_OF_HERO_PHASE], rule_sources: [meta_rule_sources.GHB_2023_2024], }, { name: `Battle Tactic: Magical Dominance`, - desc: ` You complete this battle tactic at the end of your turn if a friendly WIZARD unit successfully cast 1 or more spells and none of the spells cast by any units in your army were unbound.`, + desc: `You complete this battle tactic at the end of your turn if a friendly WIZARD unit successfully cast 1 or more spells and none of the spells cast by any units in your army were unbound.`, when: [START_OF_HERO_PHASE], rule_sources: [meta_rule_sources.GHB_2023_2024], }, @@ -344,10 +349,11 @@ const Realmscapes: TEntry[] = [ when: [START_OF_HERO_PHASE], rule_sources: [meta_rule_sources.GHB_2023_2024], }, + // Nullstone Adornments { - name: `Hand - Carved Nullstone Icon`, - desc: `The bearer can attempt to unbind 1 spell or attempt to dispel 1 endless spell in the enemy hero phase in the same manner as a Wizard. Each time the bearer successfully unbinds a spell or dispels an endless spell using this ability, the bearer can attempt to unbind 1 additional spell in that phase.`, + name: `Hand-carved Nullstone Icon`, + desc: `The bearer can attempt to unbind 1 spell or attempt to dispel 1 endless spell in the enemy hero phase in the same manner as a WIZARD. Each time the bearer successfully unbinds a spell or dispels an endless spell using this ability, the bearer can attempt to unbind 1 additional spell in that phase.`, when: [HERO_PHASE], rule_sources: [meta_rule_sources.GHB_2023_2024], }, @@ -363,25 +369,33 @@ const Realmscapes: TEntry[] = [ when: [HERO_PHASE], rule_sources: [meta_rule_sources.GHB_2023_2024], }, + + // Spells { name: `Hoarfrost`, - desc: `Casting value of 8 and a range of 12". Pick 1 friendly unit wholly within range and visible to the caster. Pick 1 melee weapon profile on that unit's warscroll and roll a D3. Change the To Hit, To Wound or Rend characteristic of that melee weapon to match the result until the start of your next hero phase. For example, if the result was 2, you could change either the To Hit characteristic to 2+, the To Wound characteristic to 2+ or the Rend characteristic to -2. While a characteristic has been changed by the effects of this spell, that characteristic cannot be further changed or modified.`, + desc: `Hoarfrost is a spell that has a casting value of 8 and a range of 12". If successfully cast, pick 1 friendly unit wholly within range and visible to the caster. Pick 1 melee weapon profile on that unit's warscroll and roll a D3. Change the To Hit, To Wound or Rend characteristic of that melee weapon to match the result until the start of your next hero phase. For example, if the result was 2, you could change either the To Hit characteristic to 2+, the To Wound characteristic to 2+ or the Rend characteristic to -2. + + Designer's Note: An unmodified hit roll or wound roll of 1 always fails.`, when: [HERO_PHASE], rule_sources: [meta_rule_sources.GHB_2023_2024], spell: true, }, { name: `Rupture`, - desc: `If successfully cast, pick 1 predatory endless spell or 1 Incarnate wholly within range and visible to the caster. The target immediately becomes wild and cannot be picked to be controlled or bonded for the rest of the battle.`, + desc: `Rupture is a spell that has a casting value of 10 and a range of 18". If successfully cast, resolve 1 of the following effects: + + - Pick 1 enemy Incarnate within range and visible to the caster. Inflict D3 mortal wounds on the unit bonded to that Incarnate. Then, that Incarnate immediately loses a power level (to a minimum of 1) and becomes wild. + + - Pick 1 predatory endless spell within range and visible to the caster that was summoned by an enemy Wizard. Inflict D3 mortal wounds on that enemy Wizard. Then, that endless spell is dispelled.`, when: [HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2023_2024], + rule_sources: [meta_rule_sources.GHB_2023_2024, meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], spell: true, }, { name: `Merciless Blizzard`, - desc: `If successfully cast, pick 1 enemy unit within range and visible to the caster. That unit suffers 4D6 mortal wounds, but for each roll of 1, the caster also suffers D3 mortal wounds that cannot be negated. The range of this spell cannot be modified and must be measured from the caster, even if an ability would allow you to measure it from elsewhere.`, + desc: `Casting value of 12 and a range of 12". Pick 1 enemy unit within range and visible to the caster. That unit suffers 4D6 mortal wounds, but for each roll of 1, the caster also suffers D3 mortal wounds that cannot be negated. The range of this spell cannot be modified and must be measured from the caster, even if an ability would allow you to measure it from elsewhere. This spell cannot be cast by a unit that was set up or moved earlier in this phase.`, when: [HERO_PHASE], - rule_sources: [meta_rule_sources.GHB_2023_2024], + rule_sources: [meta_rule_sources.GHB_2023_2024, meta_rule_sources.BATTLESCROLL_ANDTOR_SEPTEMBER_2023], spell: true, }, ], diff --git a/src/meta/rule_sources.ts b/src/meta/rule_sources.ts index fd93d3659..8b766f733 100644 --- a/src/meta/rule_sources.ts +++ b/src/meta/rule_sources.ts @@ -154,7 +154,7 @@ const meta_rule_sources = { }, ERRATA_SEASON_OF_WAR_THONDIA: { - name: 'Core Rules (2021)', + name: 'Season of War: Thondia (January 2023)', type: 'errata', url: 'https://www.warhammer-community.com/wp-content/uploads/2022/10/AIPRIiH3XKEsLKFl.pdf', }, @@ -168,13 +168,12 @@ const meta_rule_sources = { BATTLESCROLL_DEPLETED_RESERVES_APRIL_2023: { name: 'Battlescroll: Depleted Reserves (April 2023)', type: 'other_book', - url: 'https://mail.google.com/mail/u/0/#inbox/FMfcgzGsmWvfDfJlpPmDrqmjPfPhtzsr?projector=1&messagePartId=0.1', }, - BATTLESCROLL_ANDTOR_JULY_2023: { - name: 'Battlescroll: Depleted Reserves (April 2023)', + BATTLESCROLL_ANDTOR_SEPTEMBER_2023: { + name: 'Battlescroll: Tactics of Andtor (September 2023)', type: 'other_book', - url: 'https://mail.google.com/mail/u/0/#inbox/FMfcgzGsmWvfDfJlpPmDrqmjPfPhtzsr?projector=1&messagePartId=0.1', + url: 'https://www.warhammer-community.com/wp-content/uploads/2023/07/AefiGVn8NoPchpF2.pdf', }, } diff --git a/src/tests/warscroll/warscrollJson.test.ts b/src/tests/warscroll/warscrollJson.test.ts index 2adcb399d..d96cadd42 100644 --- a/src/tests/warscroll/warscrollJson.test.ts +++ b/src/tests/warscroll/warscrollJson.test.ts @@ -22,7 +22,6 @@ import { TZEENTCH, } from 'meta/factions' import path from 'path' -import { RealmscapesEnum } from 'types/realmscapes' import { DEPRECATED_MALIGN_SORCERY } from 'utils/import/options' import { getWarscrollArmyFromPdf } from 'utils/warscroll/getWarscrollArmy' @@ -550,7 +549,6 @@ describe('getWarscrollArmyFromJson', () => { const res = getWarscrollArmyFromPdf(parsedText) expect(res.factionName).toEqual(OGOR_MAWTRIBES) - expect(res.origin_realm).toEqual(RealmscapesEnum.GHUR) }) it('should work with OBR 1', () => { diff --git a/src/types/realmscapes.ts b/src/types/realmscapes.ts index bbe1ddde9..f9076b108 100644 --- a/src/types/realmscapes.ts +++ b/src/types/realmscapes.ts @@ -1,11 +1,11 @@ export enum RealmscapesEnum { - GALLET = 'Gallet', - GHUR = 'Ghur', + // GALLET = 'Gallet', + // GHUR = 'Ghur', ANDTOR = 'Andtor', } export const SUPPORTED_REALMSCAPES: RealmscapesEnum[] = [ - RealmscapesEnum.GALLET, - RealmscapesEnum.GHUR, + // RealmscapesEnum.GALLET, + // RealmscapesEnum.GHUR, RealmscapesEnum.ANDTOR, ]