hearthstone-oracle 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +73 -0
- package/dist/data/db.d.ts +49 -0
- package/dist/data/db.d.ts.map +1 -0
- package/dist/data/db.js +109 -0
- package/dist/data/db.js.map +1 -0
- package/dist/data/hearthstone.d.ts +40 -0
- package/dist/data/hearthstone.d.ts.map +1 -0
- package/dist/data/hearthstone.js +58 -0
- package/dist/data/hearthstone.js.map +1 -0
- package/dist/data/pipeline.d.ts +36 -0
- package/dist/data/pipeline.d.ts.map +1 -0
- package/dist/data/pipeline.js +90 -0
- package/dist/data/pipeline.js.map +1 -0
- package/dist/data/schema.sql +111 -0
- package/dist/data/strategy-seed.d.ts +3 -0
- package/dist/data/strategy-seed.d.ts.map +1 -0
- package/dist/data/strategy-seed.js +512 -0
- package/dist/data/strategy-seed.js.map +1 -0
- package/dist/format.d.ts +63 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +331 -0
- package/dist/format.js.map +1 -0
- package/dist/knowledge/archetype-classifier.d.ts +19 -0
- package/dist/knowledge/archetype-classifier.d.ts.map +1 -0
- package/dist/knowledge/archetype-classifier.js +232 -0
- package/dist/knowledge/archetype-classifier.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +269 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analyze-deck.d.ts +45 -0
- package/dist/tools/analyze-deck.d.ts.map +1 -0
- package/dist/tools/analyze-deck.js +159 -0
- package/dist/tools/analyze-deck.js.map +1 -0
- package/dist/tools/decode-deck.d.ts +30 -0
- package/dist/tools/decode-deck.d.ts.map +1 -0
- package/dist/tools/decode-deck.js +127 -0
- package/dist/tools/decode-deck.js.map +1 -0
- package/dist/tools/explain-concept.d.ts +26 -0
- package/dist/tools/explain-concept.d.ts.map +1 -0
- package/dist/tools/explain-concept.js +34 -0
- package/dist/tools/explain-concept.js.map +1 -0
- package/dist/tools/get-archetype.d.ts +29 -0
- package/dist/tools/get-archetype.d.ts.map +1 -0
- package/dist/tools/get-archetype.js +47 -0
- package/dist/tools/get-archetype.js.map +1 -0
- package/dist/tools/get-card.d.ts +13 -0
- package/dist/tools/get-card.d.ts.map +1 -0
- package/dist/tools/get-card.js +71 -0
- package/dist/tools/get-card.js.map +1 -0
- package/dist/tools/get-class-identity.d.ts +43 -0
- package/dist/tools/get-class-identity.d.ts.map +1 -0
- package/dist/tools/get-class-identity.js +69 -0
- package/dist/tools/get-class-identity.js.map +1 -0
- package/dist/tools/get-keyword.d.ts +30 -0
- package/dist/tools/get-keyword.d.ts.map +1 -0
- package/dist/tools/get-keyword.js +88 -0
- package/dist/tools/get-keyword.js.map +1 -0
- package/dist/tools/get-matchup.d.ts +32 -0
- package/dist/tools/get-matchup.d.ts.map +1 -0
- package/dist/tools/get-matchup.js +41 -0
- package/dist/tools/get-matchup.js.map +1 -0
- package/dist/tools/search-cards.d.ts +43 -0
- package/dist/tools/search-cards.d.ts.map +1 -0
- package/dist/tools/search-cards.js +167 -0
- package/dist/tools/search-cards.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
// --- Archetypes ---
|
|
2
|
+
const ARCHETYPES = [
|
|
3
|
+
{
|
|
4
|
+
name: 'aggro',
|
|
5
|
+
description: 'Rush the opponent down with cheap, aggressive minions and direct damage. End the game before the opponent can execute their gameplan.',
|
|
6
|
+
gameplan: 'Play low-cost minions on curve, push face damage every turn, use burn spells to finish. Aim to win by turn 6-7 before opponent stabilises.',
|
|
7
|
+
win_conditions: JSON.stringify(['Deal lethal face damage before opponent stabilises', 'Overwhelm with wide boards of small minions', 'Burn spells for final burst damage']),
|
|
8
|
+
strengths: JSON.stringify(['Fast games', 'Punishes greedy/slow decks', 'Cheap to build', 'Consistent early pressure']),
|
|
9
|
+
weaknesses: JSON.stringify(['Runs out of steam quickly', 'Vulnerable to board clears', 'Healing negates progress', 'Poor topdecks in late game']),
|
|
10
|
+
example_decks: JSON.stringify(['Face Hunter', 'Pirate Warrior', 'Aggro Demon Hunter', 'Zoo Warlock', 'Aggro Paladin']),
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'control',
|
|
14
|
+
description: 'Exhaust the opponent\'s resources through removal, healing, and board clears. Win in the late game with powerful finishers or through attrition.',
|
|
15
|
+
gameplan: 'Survive the early game with removal and healing, clear threats efficiently, then deploy late-game win conditions once the opponent is out of resources.',
|
|
16
|
+
win_conditions: JSON.stringify(['Attrition — outlast opponent\'s threats', 'Late-game finishers after board is stabilised', 'Fatigue advantage in long games']),
|
|
17
|
+
strengths: JSON.stringify(['Beats aggro when stabilised', 'Powerful late-game threats', 'Efficient removal tools', 'High survivability']),
|
|
18
|
+
weaknesses: JSON.stringify(['Loses to combo (ignores board state)', 'Can be out-valued by resource generators', 'Slow — vulnerable to early pressure', 'Draw-dependent for answers']),
|
|
19
|
+
example_decks: JSON.stringify(['Control Warrior', 'Control Priest', 'Handlock', 'Control Shaman']),
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'combo',
|
|
23
|
+
description: 'Assemble specific cards for a game-ending combination, often an OTK (one-turn kill). Stall and draw until combo pieces are assembled.',
|
|
24
|
+
gameplan: 'Draw through the deck as fast as possible while stalling with removal and freeze effects. Once all combo pieces are assembled, execute the lethal combo in a single turn.',
|
|
25
|
+
win_conditions: JSON.stringify(['One-turn-kill combo', 'Game-ending card combination', 'Inevitable win condition that ignores board state']),
|
|
26
|
+
strengths: JSON.stringify(['Inevitability — will win if game goes long enough', 'Ignores opponent\'s board state', 'Consistent win condition', 'Forces opponent to race']),
|
|
27
|
+
weaknesses: JSON.stringify(['Vulnerable to hand disruption (Dirty Rat, Mutanus)', 'Dead cards before combo is assembled', 'Loses to fast aggro pressure', 'Drawing combo pieces in wrong order']),
|
|
28
|
+
example_decks: JSON.stringify(['Miracle Rogue', 'OTK Mage', 'Combo Druid', 'Mecha\'thun Warlock', 'Quest Mage']),
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'midrange',
|
|
32
|
+
description: 'Play powerful standalone minions on curve, dominating the mid-game with efficient threats. Flexible enough to play aggro or control depending on matchup.',
|
|
33
|
+
gameplan: 'Develop strong minions on turns 3-5, make efficient trades to maintain board control, then close out the game with mid-game pressure. Against aggro, play defensively; against control, push tempo.',
|
|
34
|
+
win_conditions: JSON.stringify(['Board dominance through efficient minions', 'Snowballing mid-game threats', 'Flexible role — aggressor or defender as needed']),
|
|
35
|
+
strengths: JSON.stringify(['Flexible gameplan adapts to matchup', 'Strong standalone threats', 'Good at efficient trades', 'Solid early-to-mid curve']),
|
|
36
|
+
weaknesses: JSON.stringify(['Can be out-valued by control in long games', 'Out-tempoed by aggro on the draw', 'Jack of all trades, master of none', 'Dependent on drawing curve']),
|
|
37
|
+
example_decks: JSON.stringify(['Midrange Hunter', 'Midrange Shaman', 'Dragon Paladin', 'Beast Hunter']),
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'tempo',
|
|
41
|
+
description: 'Seize and hold initiative through mana-efficient plays every turn. Snowball early board advantages into an insurmountable lead.',
|
|
42
|
+
gameplan: 'Make the most efficient play each turn — develop threats while removing opponent\'s. Use cheap removal and weapons to maintain board while pushing damage. The opponent should never catch up.',
|
|
43
|
+
win_conditions: JSON.stringify(['Snowball board advantage into lethal', 'Opponent can never catch up on board', 'Efficient resource usage creates permanent lead']),
|
|
44
|
+
strengths: JSON.stringify(['Mana-efficient plays every turn', 'Strong early-mid game transitions', 'Punishes slow starts', 'Combines development with removal']),
|
|
45
|
+
weaknesses: JSON.stringify(['Weak to board clears (loses entire board advantage)', 'Struggles in long games', 'Needs good draws to maintain tempo', 'Falls behind when going second']),
|
|
46
|
+
example_decks: JSON.stringify(['Tempo Mage', 'Tempo Rogue', 'Tempo Demon Hunter', 'Secret Mage']),
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'value',
|
|
50
|
+
description: 'Generate more resources than the opponent through card generation, discover effects, and resource-extending mechanics. Win by never running out of threats.',
|
|
51
|
+
gameplan: 'Play cards that generate additional cards or resources. Outlast the opponent by always having more options. Use discover and generation effects to find answers and threats as needed.',
|
|
52
|
+
win_conditions: JSON.stringify(['Out-resource the opponent completely', 'Never run out of threats or answers', 'Win through card quality advantage over time']),
|
|
53
|
+
strengths: JSON.stringify(['Beats control in grind games', 'Nearly impossible to fatigue', 'Adaptive — discovers answers on demand', 'High resource ceiling']),
|
|
54
|
+
weaknesses: JSON.stringify(['Slow — vulnerable to aggro rushdown', 'Generated cards can be low quality', 'Inconsistent — discover is random', 'Struggles with proactive gameplans']),
|
|
55
|
+
example_decks: JSON.stringify(['Value Priest', 'Reno decks', 'Galakrond decks', 'Casino Mage', 'Thief Rogue']),
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
// --- Class Identities ---
|
|
59
|
+
const CLASS_IDENTITIES = [
|
|
60
|
+
{
|
|
61
|
+
class: 'Death Knight',
|
|
62
|
+
identity: 'Master of undeath and corpse manipulation. Combines board presence with resource generation through the unique Corpse mechanic. Blends aggression with resilience.',
|
|
63
|
+
hero_power_name: 'Ghoul Charge',
|
|
64
|
+
hero_power_cost: 2,
|
|
65
|
+
hero_power_effect: 'Summon a 1/1 Ghoul with Charge that dies at end of turn.',
|
|
66
|
+
hero_power_implications: 'Provides immediate board interaction or face damage every turn. Generates Corpses passively. Excellent for finishing off damaged minions or pushing chip damage.',
|
|
67
|
+
historical_archetypes: JSON.stringify(['Blood Death Knight (control/self-heal)', 'Frost Death Knight (burn/aggro)', 'Unholy Death Knight (board flood)', 'Rainbow Death Knight']),
|
|
68
|
+
strengths: JSON.stringify(['Corpse mechanic provides unique resource', 'Strong board clears', 'Good self-sustain through Blood rune cards', 'Versatile with three rune builds']),
|
|
69
|
+
weaknesses: JSON.stringify(['Rune restrictions limit deckbuilding flexibility', 'Can be resource-hungry', 'Hero power is low-impact compared to some classes', 'Newer class with smaller card pool historically']),
|
|
70
|
+
early_game: 'Develop small undead minions and generate corpses. Use hero power for early trades or chip damage.',
|
|
71
|
+
mid_game: 'Spend corpses on powerful mid-game effects. Deploy key rune-specific threats. Board clears available.',
|
|
72
|
+
late_game: 'Powerful late-game payoffs from corpse accumulation. Blood builds become very hard to kill. Unholy builds flood relentlessly.',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
class: 'Demon Hunter',
|
|
76
|
+
identity: 'Aggressive attacker who uses their hero as a weapon. Low-cost cards, attack buffs, and demon synergies. The most aggressive class identity in the game.',
|
|
77
|
+
hero_power_name: 'Demon Claws',
|
|
78
|
+
hero_power_cost: 1,
|
|
79
|
+
hero_power_effect: '+1 Attack this turn.',
|
|
80
|
+
hero_power_implications: 'Only 1-mana hero power in the game. Enables efficient early trades and consistent face damage. Makes weapon buffs extremely powerful. Always has something to do with leftover mana.',
|
|
81
|
+
historical_archetypes: JSON.stringify(['Aggro Demon Hunter', 'Tempo Demon Hunter', 'OTK Demon Hunter', 'Big Demon Hunter', 'Relic Demon Hunter']),
|
|
82
|
+
strengths: JSON.stringify(['Cheapest hero power enables tempo', 'Strong card draw mechanics', 'Excellent face damage', 'Efficient low-cost minions']),
|
|
83
|
+
weaknesses: JSON.stringify(['Taking face damage from attacking', 'Limited board clears', 'Struggles in long games', 'Narrow class identity (mostly aggro)']),
|
|
84
|
+
early_game: 'Extremely strong. 1-mana hero power plus cheap minions dominate early turns. Best early game of any class.',
|
|
85
|
+
mid_game: 'Push damage with attack buffs and weapons. Strong draw effects keep hand full while maintaining pressure.',
|
|
86
|
+
late_game: 'Generally weak unless built around specific combos or big demons. Prefers to end games before this point.',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
class: 'Druid',
|
|
90
|
+
identity: 'Master of mana acceleration and Choose One flexibility. Ramps ahead in mana to deploy threats earlier than any other class. Nature and beast themes.',
|
|
91
|
+
hero_power_name: 'Shapeshift',
|
|
92
|
+
hero_power_cost: 2,
|
|
93
|
+
hero_power_effect: '+1 Attack this turn. Gain 1 Armor.',
|
|
94
|
+
hero_power_implications: 'Versatile but low-impact. The attack helps with early trades and the armor provides marginal survivability. Neither mode is strong alone, but flexibility has value.',
|
|
95
|
+
historical_archetypes: JSON.stringify(['Ramp Druid', 'Token Druid', 'Combo Druid', 'Aggro Druid', 'Spell Druid', 'Big Druid']),
|
|
96
|
+
strengths: JSON.stringify(['Mana ramp — play big threats early', 'Choose One provides flexibility', 'Strong card draw', 'Powerful large minions']),
|
|
97
|
+
weaknesses: JSON.stringify(['Limited hard removal', 'Weak board clears', 'Vulnerable when ramping (tempo loss)', 'Struggles against wide boards']),
|
|
98
|
+
early_game: 'Spend early turns ramping mana with Wild Growth, Innervate, etc. Sacrifice early board for future mana advantage.',
|
|
99
|
+
mid_game: 'Deploy threats 2-3 turns ahead of curve. Opponents face 7-8 cost minions on turn 4-5. Choose One cards provide flexibility.',
|
|
100
|
+
late_game: 'Overwhelming. Multiple large threats per turn. Combo potential with mana advantage. Token variants flood the board.',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
class: 'Hunter',
|
|
104
|
+
identity: 'Relentless aggressor with inevitable hero power damage. Beast synergies, secrets, and direct damage. Every turn that passes, the Hunter gets closer to lethal.',
|
|
105
|
+
hero_power_name: 'Steady Shot',
|
|
106
|
+
hero_power_cost: 2,
|
|
107
|
+
hero_power_effect: 'Deal 2 damage to the enemy hero.',
|
|
108
|
+
hero_power_implications: 'The most aggressive hero power — guaranteed face damage every turn regardless of board state. Creates a built-in clock. Opponents must end the game or die. Cannot target minions, limiting flexibility.',
|
|
109
|
+
historical_archetypes: JSON.stringify(['Face Hunter', 'Midrange Hunter', 'Beast Hunter', 'Deathrattle Hunter', 'Secret Hunter', 'Spell Hunter']),
|
|
110
|
+
strengths: JSON.stringify(['Inevitable hero power damage', 'Strong beast synergies', 'Excellent secrets', 'Consistent face damage']),
|
|
111
|
+
weaknesses: JSON.stringify(['Hero power cannot interact with board', 'Limited card draw', 'Poor comeback mechanics', 'Struggles when behind on board']),
|
|
112
|
+
early_game: 'Deploy cheap beasts and secrets. Start applying face pressure immediately. Hero power adds 2 damage per turn baseline.',
|
|
113
|
+
mid_game: 'Powerful mid-game beasts and weapons push damage. Secrets disrupt opponent\'s plans. Kill command and other burn available.',
|
|
114
|
+
late_game: 'Weak in extended games. Hero power ensures inevitability but damage per turn is low. Must close before opponent stabilises.',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
class: 'Mage',
|
|
118
|
+
identity: 'Master of spells, direct damage, and board control through AoE. Freeze effects, secrets, and spell synergies. The quintessential spell-based class.',
|
|
119
|
+
hero_power_name: 'Fireblast',
|
|
120
|
+
hero_power_cost: 2,
|
|
121
|
+
hero_power_effect: 'Deal 1 damage to any target.',
|
|
122
|
+
hero_power_implications: 'Flexible targeting (any character) makes it excellent for board control. Pings off divine shields, finishes 1-health minions, enables efficient trades. Can also push face damage. Most versatile hero power.',
|
|
123
|
+
historical_archetypes: JSON.stringify(['Tempo Mage', 'Freeze Mage', 'Control Mage', 'Secret Mage', 'Quest Mage', 'Big Spell Mage', 'Casino Mage']),
|
|
124
|
+
strengths: JSON.stringify(['Powerful board clears (Flamestrike, Blizzard)', 'Flexible hero power', 'Strong spell synergies', 'Freeze effects stall games', 'Direct burn damage']),
|
|
125
|
+
weaknesses: JSON.stringify(['Relies on spells over minions', 'Vulnerable to weapon/attack pressure', 'Burn can be healed through', 'Random effects add inconsistency']),
|
|
126
|
+
early_game: 'Use hero power and cheap spells to control board. Secrets provide tempo. Spell synergy minions begin building advantage.',
|
|
127
|
+
mid_game: 'AoE clears (Flamestrike, Blizzard) control the board. Spell damage minions amplify burn. Freeze effects stall aggression.',
|
|
128
|
+
late_game: 'Powerful burn combos for lethal. Big spell payoffs. Quest/combo finishers. Generated spells provide late-game value.',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
class: 'Paladin',
|
|
132
|
+
identity: 'The army builder. Floods the board with Silver Hand Recruits and buffs them into real threats. Divine shields, healing, and board-wide buffs define the class.',
|
|
133
|
+
hero_power_name: 'Reinforce',
|
|
134
|
+
hero_power_cost: 2,
|
|
135
|
+
hero_power_effect: 'Summon a 1/1 Silver Hand Recruit.',
|
|
136
|
+
hero_power_implications: 'Generates board presence every turn. Alone each recruit is weak, but synergies with buffs, Silver Hand support cards, and board-wide effects make them powerful. Guarantees something to buff.',
|
|
137
|
+
historical_archetypes: JSON.stringify(['Aggro Paladin', 'Midrange Paladin', 'Control Paladin', 'Secret Paladin', 'Murloc Paladin', 'Libram Paladin', 'Dude Paladin']),
|
|
138
|
+
strengths: JSON.stringify(['Board-wide buffs turn recruits into threats', 'Divine Shield provides resilience', 'Strong healing and survivability', 'Excellent at building wide boards']),
|
|
139
|
+
weaknesses: JSON.stringify(['Hero power creates weak 1/1s alone', 'Vulnerable to AoE board clears', 'Buffs are wasted without board', 'Limited card draw options']),
|
|
140
|
+
early_game: 'Develop cheap minions and recruits. Apply buffs to build board advantage. Secrets provide early tempo.',
|
|
141
|
+
mid_game: 'Board-wide buffs turn wide boards into lethal threats. Divine shield minions are hard to remove efficiently. Strong mid-game curve.',
|
|
142
|
+
late_game: 'Tirion and other legendary finishers. Healing and divine shields extend survivability. Can grind with recruit generation.',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
class: 'Priest',
|
|
146
|
+
identity: 'The healer and controller. Keeps minions alive, steals opponent\'s resources, and wins through attrition. Shadow spells add burst damage potential.',
|
|
147
|
+
hero_power_name: 'Lesser Heal',
|
|
148
|
+
hero_power_cost: 2,
|
|
149
|
+
hero_power_effect: 'Restore 2 Health to any target.',
|
|
150
|
+
hero_power_implications: 'Keeps minions alive for value trades. Sustains health total against aggro. Synergises with high-health minions and "while damaged" effects. Can target any character for flexibility.',
|
|
151
|
+
historical_archetypes: JSON.stringify(['Control Priest', 'Combo Priest (Inner Fire)', 'Resurrect Priest', 'Shadow Priest', 'Thief Priest', 'Value Priest', 'Miracle Priest']),
|
|
152
|
+
strengths: JSON.stringify(['Excellent removal (Shadow Word, Holy Nova)', 'Strong healing sustains through aggro', 'Resource generation from opponent\'s class', 'Board clears available']),
|
|
153
|
+
weaknesses: JSON.stringify(['Slow and reactive', 'Limited proactive game plan', 'Struggles to close out games', 'Weak against combo decks']),
|
|
154
|
+
early_game: 'Reactive — remove early threats and heal. Develop high-health minions. Limited proactive plays.',
|
|
155
|
+
mid_game: 'Board clears and targeted removal handle mid-game threats. Start generating value through steal and discover effects.',
|
|
156
|
+
late_game: 'Strongest phase. Out-heal and out-value opponents. Resurrect effects re-deploy threats. Shadow burst can finish games.',
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
class: 'Rogue',
|
|
160
|
+
identity: 'The tempo and combo specialist. Cheap spells chain together for explosive turns. Weapons, stealth, and efficient removal define a hit-and-run playstyle.',
|
|
161
|
+
hero_power_name: 'Dagger Mastery',
|
|
162
|
+
hero_power_cost: 2,
|
|
163
|
+
hero_power_effect: 'Equip a 1/2 Dagger.',
|
|
164
|
+
hero_power_implications: 'Provides 2 damage over 2 turns for 2 mana. Excellent for early board control. Weapon buffs (like Deadly Poison) make it extremely efficient. Enables combo cards through cheap attacks.',
|
|
165
|
+
historical_archetypes: JSON.stringify(['Miracle Rogue', 'Tempo Rogue', 'Thief Rogue', 'Aggro Rogue', 'Pirate Rogue', 'Deathrattle Rogue', 'Mill Rogue']),
|
|
166
|
+
strengths: JSON.stringify(['Cheap spells enable explosive combo turns', 'Excellent card draw (Gadgetzan, Sprint)', 'Strong tempo plays', 'Efficient single-target removal']),
|
|
167
|
+
weaknesses: JSON.stringify(['No healing — health is a finite resource', 'No board clears (AoE)', 'Taking face damage from weapon attacks', 'Combo-dependent — weak without setup']),
|
|
168
|
+
early_game: 'Dagger controls early minions. Cheap spells develop board while removing threats. Backstab and SI:7 Agent are classic tempo tools.',
|
|
169
|
+
mid_game: 'Explosive combo turns with Gadgetzan Auctioneer or similar draw engines. Chain cheap spells for massive tempo swings.',
|
|
170
|
+
late_game: 'Must win before this point in most builds. Miracle/combo variants can assemble game-ending combos. No sustain makes late-game difficult.',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
class: 'Shaman',
|
|
174
|
+
identity: 'Master of elements and overload. Powerful effects at reduced mana cost, paid back next turn. Totems provide incremental value. Versatile with both aggro and control tools.',
|
|
175
|
+
hero_power_name: 'Totemic Call',
|
|
176
|
+
hero_power_cost: 2,
|
|
177
|
+
hero_power_effect: 'Summon a random basic Totem (Healing, Searing, Stoneclaw, or Wrath of Air).',
|
|
178
|
+
hero_power_implications: 'Random but each totem has utility: Spell Damage +1, Taunt, healing, or a 1/1 body. Builds incremental board presence. Totem synergy cards can leverage these. Randomness is a downside.',
|
|
179
|
+
historical_archetypes: JSON.stringify(['Aggro Shaman', 'Midrange Shaman', 'Control Shaman', 'Totem Shaman', 'Evolve Shaman', 'Elemental Shaman', 'Murloc Shaman']),
|
|
180
|
+
strengths: JSON.stringify(['Overload enables above-curve plays', 'Versatile — aggro to control builds', 'Strong AoE and removal', 'Evolve/transform effects are unique']),
|
|
181
|
+
weaknesses: JSON.stringify(['Overload restricts next turn\'s mana', 'Random hero power is inconsistent', 'Can fall behind when overloaded', 'Totem rolls can be bad at wrong time']),
|
|
182
|
+
early_game: 'Overload cards like Lightning Bolt provide above-curve power. Totems build incremental board. Strong early tempo possible.',
|
|
183
|
+
mid_game: 'Powerful mid-game with cards like Thing from Below. Evolve effects create massive boards. AoE handles opponent\'s board.',
|
|
184
|
+
late_game: 'Bloodlust and Windfury provide burst lethals. Control builds have strong value generation. Evolve can highroll into late-game threats.',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
class: 'Warlock',
|
|
188
|
+
identity: 'The deal-maker. Trades health for cards through the most powerful hero power in the game. Demon synergies, self-damage, and board control through sacrifice.',
|
|
189
|
+
hero_power_name: 'Life Tap',
|
|
190
|
+
hero_power_cost: 2,
|
|
191
|
+
hero_power_effect: 'Draw a card. Take 2 damage.',
|
|
192
|
+
hero_power_implications: 'The best hero power in the game for card advantage. Guarantees you never run out of resources. Health becomes a resource to be spent. Enables aggressive zoo strategies (always have cards) and control (always have answers).',
|
|
193
|
+
historical_archetypes: JSON.stringify(['Zoo Warlock', 'Handlock', 'Control Warlock', 'Cube Warlock', 'Discard Warlock', 'Reno Warlock', 'Pain Warlock']),
|
|
194
|
+
strengths: JSON.stringify(['Life Tap provides unmatched card draw', 'Never runs out of resources', 'Powerful demon synergies', 'Strong board clears (Defile, Twisting Nether)']),
|
|
195
|
+
weaknesses: JSON.stringify(['Self-damage from hero power', 'Health is always under pressure', 'Demon costs often have drawbacks', 'Vulnerable to burst damage']),
|
|
196
|
+
early_game: 'Zoo: flood board with cheap minions, tap for refuel. Control: tap to find answers, play removal. Life Tap makes both strategies consistent.',
|
|
197
|
+
mid_game: 'Strong demons and synergy cards come online. Board clears handle aggro. Giants become cheap from tapping (Handlock).',
|
|
198
|
+
late_game: 'Powerful demons and Lord Jaraxxus/other finishers. Card advantage from tapping all game means full hand of threats. Self-damage becomes risky.',
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
class: 'Warrior',
|
|
202
|
+
identity: 'The armoured fortress. Stacks armor to survive, uses weapons for efficient removal, and commands powerful Taunt minions. The premier control class.',
|
|
203
|
+
hero_power_name: 'Armor Up!',
|
|
204
|
+
hero_power_cost: 2,
|
|
205
|
+
hero_power_effect: 'Gain 2 Armor.',
|
|
206
|
+
hero_power_implications: 'Armor stacks infinitely above 30 health, making Warrior the hardest class to burst down. Pure survivability — no board impact. Enables fatigue strategies and makes armor synergy cards powerful.',
|
|
207
|
+
historical_archetypes: JSON.stringify(['Control Warrior', 'Pirate Warrior', 'Taunt Warrior', 'Enrage Warrior', 'Tempo Warrior', 'Galakrond Warrior', 'Bomb Warrior']),
|
|
208
|
+
strengths: JSON.stringify(['Infinite armor stacking', 'Excellent weapons for removal', 'Strong Taunt minions', 'Best board clears (Brawl, Reckoning)']),
|
|
209
|
+
weaknesses: JSON.stringify(['Hero power has no board impact', 'Armor is irrelevant against combo', 'Limited card draw', 'Reactive — struggles to be proactive']),
|
|
210
|
+
early_game: 'Weapons handle early threats efficiently. Armor Up provides survivability buffer. Pirates enable aggressive starts in tempo builds.',
|
|
211
|
+
mid_game: 'Weapons and removal clear mid-game threats. Brawl handles wide boards. Armor total starts building up significantly.',
|
|
212
|
+
late_game: 'Premier control class. Massive armor totals, powerful legendaries, and board clears. Fatigue is a real win condition. Pirate builds must win before this.',
|
|
213
|
+
},
|
|
214
|
+
];
|
|
215
|
+
// --- Matchup Framework ---
|
|
216
|
+
const MATCHUP_FRAMEWORK = [
|
|
217
|
+
// aggro matchups
|
|
218
|
+
{
|
|
219
|
+
archetype_a: 'aggro', archetype_b: 'aggro', favoured: 'even',
|
|
220
|
+
reasoning: 'Mirror matchup — whoever gets on board first and controls trades wins. Going first is a significant advantage.',
|
|
221
|
+
key_tension: 'Board control vs face damage — trading to protect your board or ignoring their board to race.',
|
|
222
|
+
archetype_a_priority: 'Get on board first, make efficient trades to protect your minions',
|
|
223
|
+
archetype_b_priority: 'Get on board first, make efficient trades to protect your minions',
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
archetype_a: 'aggro', archetype_b: 'control', favoured: 'aggro',
|
|
227
|
+
reasoning: 'Aggro is favoured if it pressures before control stabilises. Control wins if it survives to deploy removal and healing. The critical window is turns 4-6.',
|
|
228
|
+
key_tension: 'Can aggro deal enough damage before control clears the board and heals? Every heal or clear extends control\'s survival.',
|
|
229
|
+
archetype_a_priority: 'Maximum face damage — ignore trades unless they protect lethal damage minions. End game before board clears.',
|
|
230
|
+
archetype_b_priority: 'Survive — use all removal and healing to reach late game. One big board clear can swing the game.',
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
archetype_a: 'aggro', archetype_b: 'combo', favoured: 'aggro',
|
|
234
|
+
reasoning: 'Aggro is heavily favoured — combo needs time to draw pieces and aggro denies that time. Combo has dead cards (combo pieces) that don\'t help survive.',
|
|
235
|
+
key_tension: 'Speed vs assembly — can combo survive long enough to draw all pieces? Aggro presents a clock combo cannot ignore.',
|
|
236
|
+
archetype_a_priority: 'Kill them before combo assembles. Maximum pressure. Their hand is full of cards that don\'t affect the board.',
|
|
237
|
+
archetype_b_priority: 'Survive at all costs. Use any stall tools. Each turn alive is one draw closer to combo.',
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
archetype_a: 'aggro', archetype_b: 'midrange', favoured: 'midrange',
|
|
241
|
+
reasoning: 'Midrange slightly favoured — bigger minions win trades against aggro\'s smaller ones. But aggro can win by going under midrange\'s curve.',
|
|
242
|
+
key_tension: 'Size vs speed — midrange minions are bigger but slower. If aggro builds a board before midrange\'s 3-drops arrive, aggro can overwhelm.',
|
|
243
|
+
archetype_a_priority: 'Build board before their bigger minions arrive. Go wide to prevent efficient trades. Push face when possible.',
|
|
244
|
+
archetype_b_priority: 'Contest board with efficient mid-cost minions. Trade favourably with bigger stats. Stabilise by turn 4-5.',
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
archetype_a: 'aggro', archetype_b: 'tempo', favoured: 'even',
|
|
248
|
+
reasoning: 'Close matchup. Both fight for early board. Tempo has better removal but aggro has more reach. Whoever controls the board early usually wins.',
|
|
249
|
+
key_tension: 'Both want early board control. Tempo tries to out-trade while aggro tries to out-damage.',
|
|
250
|
+
archetype_a_priority: 'Establish board presence before tempo\'s removal comes online. Save burn for face.',
|
|
251
|
+
archetype_b_priority: 'Use efficient removal to control aggro\'s board. Develop threats while removing theirs.',
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
archetype_a: 'aggro', archetype_b: 'value', favoured: 'aggro',
|
|
255
|
+
reasoning: 'Aggro heavily favoured. Value decks are slow to set up and their generated resources come too late. Aggro ends the game before value matters.',
|
|
256
|
+
key_tension: 'Speed vs resources. Value decks need many turns to generate their advantage; aggro aims to kill in 6-7 turns.',
|
|
257
|
+
archetype_a_priority: 'End the game fast. Their cards are slow and expensive. Every turn they survive they generate more resources.',
|
|
258
|
+
archetype_b_priority: 'Survive the initial onslaught. If you stabilise, your resource advantage takes over. Play defensively early.',
|
|
259
|
+
},
|
|
260
|
+
// control matchups
|
|
261
|
+
{
|
|
262
|
+
archetype_a: 'control', archetype_b: 'control', favoured: 'even',
|
|
263
|
+
reasoning: 'Control mirror is a value and fatigue battle. The player who generates more resources or manages fatigue better wins. Games go very long.',
|
|
264
|
+
key_tension: 'Resource management is paramount. Every card matters. Fatigue damage becomes the clock.',
|
|
265
|
+
archetype_a_priority: 'Out-value opponent. Don\'t waste removal on small threats. Save answers for their win conditions.',
|
|
266
|
+
archetype_b_priority: 'Out-value opponent. Don\'t waste removal on small threats. Save answers for their win conditions.',
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
archetype_a: 'control', archetype_b: 'combo', favoured: 'combo',
|
|
270
|
+
reasoning: 'Combo is favoured — control\'s removal and healing are irrelevant against an OTK. Combo ignores everything control does and wins inevitably.',
|
|
271
|
+
key_tension: 'Control\'s gameplan is invalidated. Armor and healing don\'t matter against OTK. Only hand disruption (Dirty Rat, Mutanus) can save control.',
|
|
272
|
+
archetype_a_priority: 'Apply pressure — force combo to use stall cards defensively. If you have hand disruption, time it to hit combo pieces.',
|
|
273
|
+
archetype_b_priority: 'Draw your deck. Control gives you all the time you need. Stall is easy against a reactive opponent.',
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
archetype_a: 'control', archetype_b: 'midrange', favoured: 'control',
|
|
277
|
+
reasoning: 'Control favoured — enough removal to handle midrange\'s threats one by one. Midrange lacks the inevitability to overwhelm control\'s answers.',
|
|
278
|
+
key_tension: 'Can midrange stick enough threats to overwhelm removal? Or does control answer every threat and win in the late game?',
|
|
279
|
+
archetype_a_priority: 'Answer each threat efficiently. Don\'t waste board clears on single minions. Save big removal for big threats.',
|
|
280
|
+
archetype_b_priority: 'Play threats every turn. Force awkward removal usage. Try to stick a minion that snowballs before they can clear.',
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
archetype_a: 'control', archetype_b: 'tempo', favoured: 'control',
|
|
284
|
+
reasoning: 'Control slightly favoured. Board clears invalidate tempo\'s snowball strategy. Tempo must win before control draws its clears.',
|
|
285
|
+
key_tension: 'Tempo builds board advantage; control resets it. If tempo can push enough damage before the first board clear, they win.',
|
|
286
|
+
archetype_a_priority: 'Survive early tempo plays. One well-timed board clear resets the game in your favour. Then out-value them.',
|
|
287
|
+
archetype_b_priority: 'Push maximum tempo early. Force damage before board clears. Diversify threats to play around AoE.',
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
archetype_a: 'control', archetype_b: 'value', favoured: 'value',
|
|
291
|
+
reasoning: 'Value is favoured in the grind. Control runs out of threats/answers; value generates infinite resources. Control must find a way to close the game.',
|
|
292
|
+
key_tension: 'Value out-resources control. Control has better individual cards but value has more of them. Fatigue heavily favours value.',
|
|
293
|
+
archetype_a_priority: 'Find a proactive win condition. Don\'t just react — you\'ll run out of answers. Apply pressure when possible.',
|
|
294
|
+
archetype_b_priority: 'Generate resources relentlessly. Don\'t overextend into clears. Grind them out of answers one by one.',
|
|
295
|
+
},
|
|
296
|
+
// combo matchups
|
|
297
|
+
{
|
|
298
|
+
archetype_a: 'combo', archetype_b: 'combo', favoured: 'even',
|
|
299
|
+
reasoning: 'Combo mirror — whoever assembles their combo first wins. Comes down to draw speed and which combo requires fewer pieces.',
|
|
300
|
+
key_tension: 'A race to assemble. Neither player interacts with the other\'s board much. Card draw speed is everything.',
|
|
301
|
+
archetype_a_priority: 'Draw as fast as possible. Your combo must be faster than theirs. Ignore their board entirely.',
|
|
302
|
+
archetype_b_priority: 'Draw as fast as possible. Your combo must be faster than theirs. Ignore their board entirely.',
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
archetype_a: 'combo', archetype_b: 'midrange', favoured: 'even',
|
|
306
|
+
reasoning: 'Roughly even. Midrange can apply enough pressure to threaten lethal before combo assembles, but combo can stall and find pieces if midrange doesn\'t curve well.',
|
|
307
|
+
key_tension: 'Midrange\'s clock vs combo\'s draw speed. If midrange applies consistent pressure, combo can\'t afford to spend turns just drawing.',
|
|
308
|
+
archetype_a_priority: 'Stall and draw. Use freeze/removal to buy time. Every turn is one draw closer to combo.',
|
|
309
|
+
archetype_b_priority: 'Apply consistent pressure. Don\'t overcommit to board (they have stall). Steady damage each turn.',
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
archetype_a: 'combo', archetype_b: 'tempo', favoured: 'tempo',
|
|
313
|
+
reasoning: 'Tempo is slightly favoured. Tempo\'s early pressure and efficient plays create a fast clock. Combo struggles to stall against a tempo deck that develops and removes simultaneously.',
|
|
314
|
+
key_tension: 'Tempo applies pressure while being mana-efficient — combo\'s stall tools are less effective against tempo than pure aggro.',
|
|
315
|
+
archetype_a_priority: 'Survive tempo\'s early game. Their threats are efficient but not as fast as aggro. Find removal for key snowball minions.',
|
|
316
|
+
archetype_b_priority: 'Apply pressure while removing their stall minions. Don\'t let them set up draw engines. Maintain initiative.',
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
archetype_a: 'combo', archetype_b: 'value', favoured: 'combo',
|
|
320
|
+
reasoning: 'Combo favoured. Value is slow and gives combo all the time needed to assemble pieces. Value\'s resource generation is irrelevant against an OTK.',
|
|
321
|
+
key_tension: 'Value cannot pressure combo fast enough. Generated resources don\'t matter if combo kills from hand in one turn.',
|
|
322
|
+
archetype_a_priority: 'Draw freely. Value decks apply almost no pressure. Take your time assembling the combo.',
|
|
323
|
+
archetype_b_priority: 'Apply whatever pressure you can. Discover disruption if available. You\'re on a timer you can\'t control.',
|
|
324
|
+
},
|
|
325
|
+
// midrange matchups
|
|
326
|
+
{
|
|
327
|
+
archetype_a: 'midrange', archetype_b: 'midrange', favoured: 'even',
|
|
328
|
+
reasoning: 'Mirror matchup — board control is everything. Whoever curves out better and makes more efficient trades wins. Going first is significant.',
|
|
329
|
+
key_tension: 'Curve and board control. Each player tries to develop bigger threats on curve and trade up.',
|
|
330
|
+
archetype_a_priority: 'Curve out and control the board. Efficient trades are critical. Snowball any board advantage.',
|
|
331
|
+
archetype_b_priority: 'Curve out and control the board. Efficient trades are critical. Snowball any board advantage.',
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
archetype_a: 'midrange', archetype_b: 'tempo', favoured: 'even',
|
|
335
|
+
reasoning: 'Close matchup. Both fight for board control with efficient plays. Tempo has better removal; midrange has bigger minions. Depends on specific lists.',
|
|
336
|
+
key_tension: 'Efficiency vs stats. Tempo makes more mana-efficient plays; midrange has individually stronger cards.',
|
|
337
|
+
archetype_a_priority: 'Deploy bigger threats that trade favourably. Force tempo to spend removal reactively.',
|
|
338
|
+
archetype_b_priority: 'Use efficient removal to handle their threats while developing your own. Maintain initiative.',
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
archetype_a: 'midrange', archetype_b: 'value', favoured: 'midrange',
|
|
342
|
+
reasoning: 'Midrange slightly favoured. Can pressure value decks before they generate enough resources. Value decks struggle against proactive mid-game threats.',
|
|
343
|
+
key_tension: 'Midrange\'s proactive threats vs value\'s reactive generation. If midrange maintains board pressure, value can\'t stabilise.',
|
|
344
|
+
archetype_a_priority: 'Apply steady pressure every turn. Don\'t let them freely generate value. Close the game in mid-game.',
|
|
345
|
+
archetype_b_priority: 'Survive mid-game pressure. Once you stabilise, your resource advantage takes over. Play defensively until then.',
|
|
346
|
+
},
|
|
347
|
+
// tempo matchups
|
|
348
|
+
{
|
|
349
|
+
archetype_a: 'tempo', archetype_b: 'tempo', favoured: 'even',
|
|
350
|
+
reasoning: 'Mirror — whoever gets on board first and maintains initiative wins. Going first is a huge advantage. Efficient plays determine the outcome.',
|
|
351
|
+
key_tension: 'Initiative is everything. The first player to lose board control usually loses the game.',
|
|
352
|
+
archetype_a_priority: 'Seize board initiative. Make the most efficient play every turn. Never fall behind.',
|
|
353
|
+
archetype_b_priority: 'Seize board initiative. Make the most efficient play every turn. Never fall behind.',
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
archetype_a: 'tempo', archetype_b: 'value', favoured: 'tempo',
|
|
357
|
+
reasoning: 'Tempo is favoured early and mid-game. Value needs too many turns to set up. Tempo ends the game before value\'s resource advantage matters.',
|
|
358
|
+
key_tension: 'Speed vs resources. Tempo pressures before value can generate enough answers.',
|
|
359
|
+
archetype_a_priority: 'Push tempo advantage early. End the game before their resource generation overwhelms you.',
|
|
360
|
+
archetype_b_priority: 'Survive the tempo onslaught. If you reach late game with resources, you win. Play defensively.',
|
|
361
|
+
},
|
|
362
|
+
// value matchup
|
|
363
|
+
{
|
|
364
|
+
archetype_a: 'value', archetype_b: 'value', favoured: 'even',
|
|
365
|
+
reasoning: 'Value mirror is a pure resource war. Whoever generates more and higher-quality cards wins. Games go to fatigue frequently.',
|
|
366
|
+
key_tension: 'Card quality and generation speed. Both players have effectively infinite resources — it\'s about quality, not quantity.',
|
|
367
|
+
archetype_a_priority: 'Generate the highest-quality resources. Save removal for their best threats. Manage fatigue.',
|
|
368
|
+
archetype_b_priority: 'Generate the highest-quality resources. Save removal for their best threats. Manage fatigue.',
|
|
369
|
+
},
|
|
370
|
+
];
|
|
371
|
+
// --- Game Concepts ---
|
|
372
|
+
const GAME_CONCEPTS = [
|
|
373
|
+
{
|
|
374
|
+
name: 'card advantage',
|
|
375
|
+
category: 'fundamental',
|
|
376
|
+
description: 'Having more cards (or more useful cards) in hand than your opponent. The player with more options has more flexibility to answer threats and deploy their own.',
|
|
377
|
+
hearthstone_application: 'Warlock\'s Life Tap hero power is the ultimate card advantage tool. Board clears that destroy multiple minions with one card generate card advantage. 2-for-1 trades (one card killing two) build advantage over time.',
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
name: 'tempo',
|
|
381
|
+
category: 'fundamental',
|
|
382
|
+
description: 'The pace of play and who holds the initiative on board. A tempo advantage means your board is more developed relative to mana spent.',
|
|
383
|
+
hearthstone_application: 'Spending mana efficiently each turn (coining out a 2-drop on turn 1, playing on curve). Cards like Backstab (0 mana removal) are pure tempo. Going first gives a tempo advantage. Tempo is often traded for value and vice versa.',
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
name: 'value',
|
|
387
|
+
category: 'fundamental',
|
|
388
|
+
description: 'Getting more impact per card played. A high-value card does more than one card\'s worth of work — either through card generation, multiple effects, or 2-for-1 trades.',
|
|
389
|
+
hearthstone_application: 'Discover effects generate extra cards from one card played. Siphon Soul (destroy + heal) provides two effects. Trading a single minion into two enemy minions is a value trade. Value and tempo are often in tension — high-value plays are often slow.',
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
name: 'board control',
|
|
393
|
+
category: 'fundamental',
|
|
394
|
+
description: 'Dominating the minion battlefield. The player who controls the board dictates trades, pressures the opponent, and forces reactive plays.',
|
|
395
|
+
hearthstone_application: 'Trading efficiently with minions (using a 3/2 to kill their 2/3 after pinging with hero power). Taunts protect your board. Going first helps establish board control. Losing board control against aggro is often game-losing.',
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
name: 'mana curve',
|
|
399
|
+
category: 'fundamental',
|
|
400
|
+
description: 'The distribution of card costs in your deck. A smooth curve means having playable cards at every mana point, ensuring you spend your mana efficiently each turn.',
|
|
401
|
+
hearthstone_application: 'Aggro decks need low curves (mostly 1-3 cost) to apply early pressure. Control decks can afford gaps in their curve because they hero power on empty turns. Having a "1-2-3" opening (playing on curve for turns 1, 2, 3) is critical for tempo and aggro decks.',
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
name: 'fatigue',
|
|
405
|
+
category: 'hearthstone-specific',
|
|
406
|
+
description: 'When your deck is empty, each draw attempt deals increasing damage (1, then 2, then 3, etc.). A unique Hearthstone mechanic that creates a natural game timer.',
|
|
407
|
+
hearthstone_application: 'Relevant in control mirrors where both players exhaust their decks. Warlock\'s Life Tap accelerates fatigue. Cards that shuffle into your deck delay fatigue. Mill strategies (forcing opponent to draw) weaponise fatigue damage. Dead Man\'s Hand Warrior was the ultimate fatigue deck.',
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
name: 'resource management',
|
|
411
|
+
category: 'fundamental',
|
|
412
|
+
description: 'Balancing the four resources — health, cards in hand, mana, and board presence. Spending one resource to gain another is the core decision of every turn.',
|
|
413
|
+
hearthstone_application: 'Health IS a resource — Warlock pays health for cards (Life Tap), and this is often correct. Knowing when to take face damage to develop board. Using mana efficiently means not floating mana. Overcommitting to board (spending all cards) leaves you vulnerable to clears.',
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
name: 'win condition',
|
|
417
|
+
category: 'fundamental',
|
|
418
|
+
description: 'The specific way your deck plans to win the game. Every deck needs a clear path to victory, and all other cards should support that path.',
|
|
419
|
+
hearthstone_application: 'Aggro\'s win condition is face damage before opponent stabilises. Control wins through attrition and late-game threats. Combo wins through specific card combinations (e.g., Leeroy + Shadowstep). Identifying your win condition each game informs every decision — trade or go face, draw or develop, play for tempo or value.',
|
|
420
|
+
},
|
|
421
|
+
];
|
|
422
|
+
// --- Keywords ---
|
|
423
|
+
const KEYWORDS = [
|
|
424
|
+
{ name: 'Battlecry', description: 'Does something when you play it from your hand.', related_keywords: JSON.stringify(['Combo']) },
|
|
425
|
+
{ name: 'Deathrattle', description: 'Does something when it dies.', related_keywords: JSON.stringify(['Reborn']) },
|
|
426
|
+
{ name: 'Taunt', description: 'Enemies must attack minions with Taunt.', related_keywords: JSON.stringify(['Divine Shield']) },
|
|
427
|
+
{ name: 'Divine Shield', description: 'The first time a Divine Shield minion takes damage, ignore it.', related_keywords: JSON.stringify(['Taunt']) },
|
|
428
|
+
{ name: 'Charge', description: 'Can attack immediately.', related_keywords: JSON.stringify(['Rush']) },
|
|
429
|
+
{ name: 'Rush', description: 'Can attack minions immediately.', related_keywords: JSON.stringify(['Charge']) },
|
|
430
|
+
{ name: 'Windfury', description: 'Can attack twice each turn.', related_keywords: JSON.stringify(['Mega-Windfury']) },
|
|
431
|
+
{ name: 'Lifesteal', description: 'Damage dealt also heals your hero.', related_keywords: JSON.stringify([]) },
|
|
432
|
+
{ name: 'Poisonous', description: 'Destroy any minion damaged by this.', related_keywords: JSON.stringify([]) },
|
|
433
|
+
{ name: 'Stealth', description: 'Cannot be targeted until it attacks.', related_keywords: JSON.stringify([]) },
|
|
434
|
+
{ name: 'Discover', description: 'Choose one of three cards to add to your hand.', related_keywords: JSON.stringify([]) },
|
|
435
|
+
{ name: 'Reborn', description: 'Returns to life with 1 Health the first time it dies.', related_keywords: JSON.stringify(['Deathrattle']) },
|
|
436
|
+
{ name: 'Outcast', description: 'A bonus if played as the left- or right-most card in your hand.', related_keywords: JSON.stringify([]) },
|
|
437
|
+
{ name: 'Infuse', description: 'Upgrades in hand after friendly minions die.', related_keywords: JSON.stringify([]) },
|
|
438
|
+
{ name: 'Forge', description: 'Pay 2 mana to upgrade this card while in your hand.', related_keywords: JSON.stringify([]) },
|
|
439
|
+
{ name: 'Excavate', description: 'Dig for powerful treasures. Higher tiers unlock as you excavate more.', related_keywords: JSON.stringify([]) },
|
|
440
|
+
{ name: 'Magnetic', description: 'Play this to the left of a Mech to fuse them together.', related_keywords: JSON.stringify([]) },
|
|
441
|
+
{ name: 'Echo', description: 'Can be played multiple times in a turn. Each copy costs the same.', related_keywords: JSON.stringify([]) },
|
|
442
|
+
{ name: 'Spell Damage', description: 'Your spell cards deal extra damage equal to the Spell Damage value.', related_keywords: JSON.stringify([]) },
|
|
443
|
+
{ name: 'Overload', description: 'Locks some of your mana crystals next turn.', related_keywords: JSON.stringify([]) },
|
|
444
|
+
{ name: 'Secret', description: 'A hidden card that activates on your opponent\'s turn when a condition is met.', related_keywords: JSON.stringify([]) },
|
|
445
|
+
{ name: 'Quest', description: 'Starts in your opening hand. Complete the condition for a reward.', related_keywords: JSON.stringify([]) },
|
|
446
|
+
{ name: 'Freeze', description: 'Frozen characters lose their next attack.', related_keywords: JSON.stringify([]) },
|
|
447
|
+
{ name: 'Silence', description: 'Removes all card text and enchantments from a minion.', related_keywords: JSON.stringify([]) },
|
|
448
|
+
{ name: 'Adapt', description: 'Choose one of three bonuses from a set of 10 possible adaptations.', related_keywords: JSON.stringify(['Discover']) },
|
|
449
|
+
{ name: 'Choose One', description: 'Pick one of two effects. A signature Druid mechanic.', related_keywords: JSON.stringify([]) },
|
|
450
|
+
{ name: 'Combo', description: 'A bonus if you already played a card this turn. A Rogue mechanic.', related_keywords: JSON.stringify(['Battlecry']) },
|
|
451
|
+
{ name: 'Inspire', description: 'Does something after you use your Hero Power.', related_keywords: JSON.stringify([]) },
|
|
452
|
+
{ name: 'Recruit', description: 'Summon a minion from your deck.', related_keywords: JSON.stringify([]) },
|
|
453
|
+
{ name: 'Overkill', description: 'Deal excess damage on your turn for a bonus.', related_keywords: JSON.stringify([]) },
|
|
454
|
+
{ name: 'Twinspell', description: 'Can be cast twice. The second copy has no Twinspell.', related_keywords: JSON.stringify(['Echo']) },
|
|
455
|
+
{ name: 'Invoke', description: 'Use Galakrond\'s Power.', related_keywords: JSON.stringify([]) },
|
|
456
|
+
{ name: 'Spellburst', description: 'A one-time effect after you cast a spell.', related_keywords: JSON.stringify([]) },
|
|
457
|
+
{ name: 'Frenzy', description: 'A one-time effect the first time this minion survives damage.', related_keywords: JSON.stringify([]) },
|
|
458
|
+
{ name: 'Tradeable', description: 'Drag this into your deck to spend 1 mana and draw a new card.', related_keywords: JSON.stringify([]) },
|
|
459
|
+
{ name: 'Honorable Kill', description: 'Deal exact lethal damage to a minion for a bonus.', related_keywords: JSON.stringify(['Overkill']) },
|
|
460
|
+
{ name: 'Colossal', description: 'Enters the battlefield with additional appendage minions.', related_keywords: JSON.stringify([]) },
|
|
461
|
+
{ name: 'Dredge', description: 'Look at the bottom 3 cards of your deck. Put one on top.', related_keywords: JSON.stringify([]) },
|
|
462
|
+
{ name: 'Corpse', description: 'A Death Knight resource generated when friendly minions die.', related_keywords: JSON.stringify([]) },
|
|
463
|
+
{ name: 'Manathirst', description: 'A bonus if you have enough mana crystals (not current mana).', related_keywords: JSON.stringify([]) },
|
|
464
|
+
{ name: 'Overheal', description: 'A bonus when healed above full Health.', related_keywords: JSON.stringify(['Lifesteal']) },
|
|
465
|
+
{ name: 'Titan', description: 'On play, choose one of three powerful abilities for three turns.', related_keywords: JSON.stringify([]) },
|
|
466
|
+
{ name: 'Quickdraw', description: 'A bonus if played on the same turn it was drawn.', related_keywords: JSON.stringify([]) },
|
|
467
|
+
{ name: 'Miniaturize', description: 'Add a 1-mana 1/1 copy of this to your hand.', related_keywords: JSON.stringify([]) },
|
|
468
|
+
{ name: 'Starship', description: 'Assemble a Starship by adding Starship Pieces throughout the game.', related_keywords: JSON.stringify([]) },
|
|
469
|
+
{ name: 'Tourist', description: 'Allows deckbuilding with cards from another class.', related_keywords: JSON.stringify([]) },
|
|
470
|
+
];
|
|
471
|
+
// --- Seed function ---
|
|
472
|
+
export function seedStrategyKnowledge(db) {
|
|
473
|
+
const insertArchetype = db.prepare(`
|
|
474
|
+
INSERT OR REPLACE INTO archetypes (name, description, gameplan, win_conditions, strengths, weaknesses, example_decks)
|
|
475
|
+
VALUES (@name, @description, @gameplan, @win_conditions, @strengths, @weaknesses, @example_decks)
|
|
476
|
+
`);
|
|
477
|
+
const insertClass = db.prepare(`
|
|
478
|
+
INSERT OR REPLACE INTO class_identities (class, identity, hero_power_name, hero_power_cost, hero_power_effect, hero_power_implications, historical_archetypes, strengths, weaknesses, early_game, mid_game, late_game)
|
|
479
|
+
VALUES (@class, @identity, @hero_power_name, @hero_power_cost, @hero_power_effect, @hero_power_implications, @historical_archetypes, @strengths, @weaknesses, @early_game, @mid_game, @late_game)
|
|
480
|
+
`);
|
|
481
|
+
const insertMatchup = db.prepare(`
|
|
482
|
+
INSERT OR REPLACE INTO matchup_framework (archetype_a, archetype_b, favoured, reasoning, key_tension, archetype_a_priority, archetype_b_priority)
|
|
483
|
+
VALUES (@archetype_a, @archetype_b, @favoured, @reasoning, @key_tension, @archetype_a_priority, @archetype_b_priority)
|
|
484
|
+
`);
|
|
485
|
+
const insertConcept = db.prepare(`
|
|
486
|
+
INSERT OR REPLACE INTO game_concepts (name, category, description, hearthstone_application)
|
|
487
|
+
VALUES (@name, @category, @description, @hearthstone_application)
|
|
488
|
+
`);
|
|
489
|
+
const insertKeyword = db.prepare(`
|
|
490
|
+
INSERT OR REPLACE INTO keywords (name, description, related_keywords)
|
|
491
|
+
VALUES (@name, @description, @related_keywords)
|
|
492
|
+
`);
|
|
493
|
+
const seedAll = db.transaction(() => {
|
|
494
|
+
for (const archetype of ARCHETYPES) {
|
|
495
|
+
insertArchetype.run(archetype);
|
|
496
|
+
}
|
|
497
|
+
for (const classIdentity of CLASS_IDENTITIES) {
|
|
498
|
+
insertClass.run(classIdentity);
|
|
499
|
+
}
|
|
500
|
+
for (const matchup of MATCHUP_FRAMEWORK) {
|
|
501
|
+
insertMatchup.run(matchup);
|
|
502
|
+
}
|
|
503
|
+
for (const concept of GAME_CONCEPTS) {
|
|
504
|
+
insertConcept.run(concept);
|
|
505
|
+
}
|
|
506
|
+
for (const keyword of KEYWORDS) {
|
|
507
|
+
insertKeyword.run(keyword);
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
seedAll();
|
|
511
|
+
}
|
|
512
|
+
//# sourceMappingURL=strategy-seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-seed.js","sourceRoot":"","sources":["../../src/data/strategy-seed.ts"],"names":[],"mappings":"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"}
|