Skip to content
This repository was archived by the owner on Oct 24, 2021. It is now read-only.

Commit 5122305

Browse files
authored
feat: support sidequests (#54)
* chore: fix vulnerability warning * feat: support sidequests * test: update fixture
1 parent 8bd4675 commit 5122305

File tree

11 files changed

+280
-127
lines changed

11 files changed

+280
-127
lines changed

scripts/generate-quests.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ const main = async () => {
5353
})
5454
.sort((a, b) => a.id.localeCompare(b.id))
5555
.forEach(card => {
56-
questTexts[card.id] = card.text;
56+
questTexts[card.id] = `${card.cardClass}: ${card.text}`;
5757
});
5858
await writeJson(
5959
path.resolve(__dirname, "../src/data/quest-text-map.json"),

src/GameState.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,27 @@
1-
import {SecretClass} from './data/secrets';
1+
import {Class} from './data/meta';
22

33
export interface Secret {
44
cardId: string;
5-
cardClass: SecretClass;
5+
cardClass: Class;
66
cardName: string;
7+
timestamp: number;
8+
}
9+
10+
export interface Quest {
11+
cardName: string;
12+
class: Class;
13+
progress: number;
14+
requirement: number;
15+
sidequest: boolean;
16+
timestamp: number;
717
}
818

919
export interface Player {
1020
id: number;
1121
name: string;
1222
status: 'LOST' | 'WON' | 'TIED' | '';
1323
turn: boolean;
14-
quest?: {
15-
progress: number;
16-
requirement: number;
17-
};
24+
quests: Quest[];
1825
timeout: number;
1926
cardCount: number;
2027
position: 'top' | 'bottom';

src/data/meta.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,13 @@
11
export const DECK_CARD_COUNT = 30;
2+
3+
export const enum Class {
4+
Druid = 'DRUID',
5+
Mage = 'MAGE',
6+
Hunter = 'HUNTER',
7+
Paladin = 'PALADIN',
8+
Priest = 'PRIEST',
9+
Rogue = 'ROGUE',
10+
Shaman = 'SHAMAN',
11+
Warlock = 'WARLOCK',
12+
Warrior = 'WARRIOR'
13+
}

src/data/quest-text-map.json

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
11
{
2-
"ULD_131": "[x]<b>Quest:</b> End 4 turns\nwith any unspent Mana.\n<b>Reward:</b> Ossirian Tear.",
3-
"ULD_140": "<b>Quest:</b> Draw 20 cards.\n<b>Reward:</b> Tome of Origination.",
4-
"ULD_155": "<b>Quest:</b> Summon 20 minions.\n<b>Reward:</b> Ramkahen Roar.",
5-
"ULD_291": "[x]<b>Quest:</b> Play 6 <b>Battlecry</b>\ncards.\n<b>Reward:</b> Heart of Vir'naal.",
6-
"ULD_326": "[x]<b>Quest:</b> Add 4 cards from\nother classes to your hand.\n<b>Reward: </b>Ancient Blades.",
7-
"ULD_431": "[x]<b>Quest:</b> Play 5 <b>Reborn</b>\nminions.\n<b>Reward:</b> Emperor Wraps.",
8-
"ULD_433": "<b>Quest:</b> Cast 10 spells.\n<b>Reward: </b>Ascendant Scroll.",
9-
"ULD_711": "[x]<b>Quest:</b> Attack 5 times\nwith your hero.\n<b>Reward:</b> Anraphet's Core.",
10-
"ULD_724": "<b>Quest:</b> Restore 15 Health.\n<b>Reward:</b> Obelisk's Eye.",
11-
"UNG_028": "[x]<b>Quest:</b> Cast 6 spells that\ndidn't start in your deck.\n<b>Reward:</b> Time Warp.",
12-
"UNG_067": "[x]<b>Quest:</b> Play five minions\nwith the same name.\n<b>Reward:</b> Crystal Core.",
13-
"UNG_116": "[x]<b>Quest:</b> Summon\n5 minions with\n5 or more Attack.\n<b>Reward:</b> Barnabus.",
14-
"UNG_829": "[x]<b>Quest:</b> Discard 6 cards.\n<b>Reward:</b> Nether Portal.",
15-
"UNG_920": "[x]<b>Quest:</b> Play seven\n1-Cost minions.\n<b>Reward:</b> Queen Carnassa.",
16-
"UNG_934": "[x]<b>Quest:</b> Play\n7 <b>Taunt</b> minions.\n<b>Reward:</b> Sulfuras.",
17-
"UNG_940": "<b>Quest:</b> Summon\n7 <b>Deathrattle</b> minions.<b>\nReward:</b> Amara, Warden of Hope.",
18-
"UNG_942": "[x]<b>Quest:</b> Summon\n10 Murlocs.\n<b>Reward:</b> Megafin.",
19-
"UNG_954": "<b>Quest:</b> Cast 6 spells\non your minions.\n<b>Reward:</b> Galvadon."
2+
"DRG_008": "PALADIN: <b>Sidequest:</b> Summon 5 minions.\n<b>Reward:</b> Give your minions +1/+1.",
3+
"DRG_051": "DRUID: <b>Sidequest:</b> Spend 10 Mana on minions.\n<b>Reward:</b> Summon a minion from your deck.",
4+
"DRG_251": "HUNTER: [x]<b>Sidequest:</b> Summon\n3 <b>Rush</b> minions.\n<b>Reward:</b> Summon a\n4/4 Gryphon with <b>Rush</b>.",
5+
"DRG_255": "HUNTER: [x]<b>Sidequest:</b> Use your Hero\nPower three times.\n<b>Reward:</b> Summon three\n1/1 Leper Gnomes.",
6+
"DRG_258": "PALADIN: [x]<b>Sidequest:</b> Take no\ndamage for a turn.\n<b>Reward:</b> Summon a 3/6\nminion with <b>Taunt</b>.",
7+
"DRG_317": "DRUID: <b>Sidequest:</b> Attack twice with your hero. <b>Reward:</b> Add 3 'Claw' spells to your hand.",
8+
"DRG_323": "MAGE: [x]<b>Sidequest:</b> Spend\n8 Mana on spells.\n<b>Reward:</b> Summon a\n6/6 Dragon.",
9+
"DRG_324": "MAGE: [x]<b>Sidequest:</b> Play an\nElemental 2 turns in a row.\n<b>Reward:</b> Draw 3 spells\nfrom your deck.",
10+
"ULD_131": "DRUID: [x]<b>Quest:</b> End 4 turns\nwith any unspent Mana.\n<b>Reward:</b> Ossirian Tear.",
11+
"ULD_140": "WARLOCK: <b>Quest:</b> Draw 20 cards.\n<b>Reward:</b> Tome of Origination.",
12+
"ULD_155": "HUNTER: <b>Quest:</b> Summon 20 minions.\n<b>Reward:</b> Ramkahen Roar.",
13+
"ULD_291": "SHAMAN: [x]<b>Quest:</b> Play 6 <b>Battlecry</b>\ncards.\n<b>Reward:</b> Heart of Vir'naal.",
14+
"ULD_326": "ROGUE: [x]<b>Quest:</b> Add 4 cards from\nother classes to your hand.\n<b>Reward: </b>Ancient Blades.",
15+
"ULD_431": "PALADIN: [x]<b>Quest:</b> Play 5 <b>Reborn</b>\nminions.\n<b>Reward:</b> Emperor Wraps.",
16+
"ULD_433": "MAGE: <b>Quest:</b> Cast 10 spells.\n<b>Reward: </b>Ascendant Scroll.",
17+
"ULD_711": "WARRIOR: [x]<b>Quest:</b> Attack 5 times\nwith your hero.\n<b>Reward:</b> Anraphet's Core.",
18+
"ULD_724": "PRIEST: <b>Quest:</b> Restore 15 Health.\n<b>Reward:</b> Obelisk's Eye.",
19+
"UNG_028": "MAGE: [x]<b>Quest:</b> Cast 6 spells that\ndidn't start in your deck.\n<b>Reward:</b> Time Warp.",
20+
"UNG_067": "ROGUE: [x]<b>Quest:</b> Play five minions\nwith the same name.\n<b>Reward:</b> Crystal Core.",
21+
"UNG_116": "DRUID: [x]<b>Quest:</b> Summon\n5 minions with\n5 or more Attack.\n<b>Reward:</b> Barnabus.",
22+
"UNG_829": "WARLOCK: [x]<b>Quest:</b> Discard 6 cards.\n<b>Reward:</b> Nether Portal.",
23+
"UNG_920": "HUNTER: [x]<b>Quest:</b> Play seven\n1-Cost minions.\n<b>Reward:</b> Queen Carnassa.",
24+
"UNG_934": "WARRIOR: [x]<b>Quest:</b> Play\n7 <b>Taunt</b> minions.\n<b>Reward:</b> Sulfuras.",
25+
"UNG_940": "PRIEST: <b>Quest:</b> Summon\n7 <b>Deathrattle</b> minions.<b>\nReward:</b> Amara, Warden of Hope.",
26+
"UNG_942": "SHAMAN: [x]<b>Quest:</b> Summon\n10 Murlocs.\n<b>Reward:</b> Megafin.",
27+
"UNG_954": "PALADIN: <b>Quest:</b> Cast 6 spells\non your minions.\n<b>Reward:</b> Galvadon."
2028
}

src/data/quests.ts

Lines changed: 139 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,141 @@
1-
import * as quests from './quest-text-map.json';
1+
import * as questData from './quest-text-map.json';
2+
import {Class} from './meta.js';
23

3-
const questToRequirementPair: [keyof typeof quests, number][] = [
4-
['ULD_131', 4],
5-
['ULD_140', 20],
6-
['ULD_155', 20],
7-
['ULD_291', 6],
8-
['ULD_326', 4],
9-
['ULD_431', 5],
10-
['ULD_433', 10],
11-
['ULD_711', 5],
12-
['ULD_724', 15],
13-
['UNG_028', 6],
14-
['UNG_067', 5],
15-
['UNG_116', 5],
16-
['UNG_829', 6],
17-
['UNG_920', 7],
18-
['UNG_934', 7],
19-
['UNG_940', 7],
20-
['UNG_942', 10],
21-
['UNG_954', 6]
22-
];
4+
const quests: {[TK in keyof typeof questData]: {
5+
class: Class;
6+
requirement: number;
7+
sidequest: boolean;
8+
};} = {
9+
DRG_008: {
10+
class: Class.Paladin,
11+
requirement: 5,
12+
sidequest: true
13+
},
14+
DRG_051: {
15+
class: Class.Druid,
16+
requirement: 10,
17+
sidequest: true
18+
},
19+
DRG_251: {
20+
class: Class.Hunter,
21+
requirement: 3,
22+
sidequest: true
23+
},
24+
DRG_255: {
25+
class: Class.Hunter,
26+
requirement: 3,
27+
sidequest: true
28+
},
29+
DRG_258: {
30+
class: Class.Hunter,
31+
requirement: 1,
32+
sidequest: true
33+
},
34+
DRG_317: {
35+
class: Class.Druid,
36+
requirement: 2,
37+
sidequest: true
38+
},
39+
DRG_323: {
40+
class: Class.Mage,
41+
requirement: 8,
42+
sidequest: true
43+
},
44+
DRG_324: {
45+
class: Class.Mage,
46+
requirement: 2,
47+
sidequest: true
48+
},
49+
ULD_131: {
50+
class: Class.Druid,
51+
requirement: 4,
52+
sidequest: false
53+
},
54+
ULD_140: {
55+
class: Class.Warlock,
56+
requirement: 20,
57+
sidequest: false
58+
},
59+
ULD_155: {
60+
class: Class.Hunter,
61+
requirement: 20,
62+
sidequest: false
63+
},
64+
ULD_291: {
65+
class: Class.Shaman,
66+
requirement: 6,
67+
sidequest: false
68+
},
69+
ULD_326: {
70+
class: Class.Rogue,
71+
requirement: 4,
72+
sidequest: false
73+
},
74+
ULD_431: {
75+
class: Class.Paladin,
76+
requirement: 5,
77+
sidequest: false
78+
},
79+
ULD_433: {
80+
class: Class.Mage,
81+
requirement: 10,
82+
sidequest: false
83+
},
84+
ULD_711: {
85+
class: Class.Warrior,
86+
requirement: 5,
87+
sidequest: false
88+
},
89+
ULD_724: {
90+
class: Class.Priest,
91+
requirement: 15,
92+
sidequest: false
93+
},
94+
UNG_028: {
95+
class: Class.Mage,
96+
requirement: 6,
97+
sidequest: false
98+
},
99+
UNG_067: {
100+
class: Class.Rogue,
101+
requirement: 5,
102+
sidequest: false
103+
},
104+
UNG_116: {
105+
class: Class.Druid,
106+
requirement: 5,
107+
sidequest: false
108+
},
109+
UNG_829: {
110+
class: Class.Warlock,
111+
requirement: 6,
112+
sidequest: false
113+
},
114+
UNG_920: {
115+
class: Class.Hunter,
116+
requirement: 7,
117+
sidequest: false
118+
},
119+
UNG_934: {
120+
class: Class.Warrior,
121+
requirement: 7,
122+
sidequest: false
123+
},
124+
UNG_940: {
125+
class: Class.Priest,
126+
requirement: 7,
127+
sidequest: false
128+
},
129+
UNG_942: {
130+
class: Class.Shaman,
131+
requirement: 10,
132+
sidequest: false
133+
},
134+
UNG_954: {
135+
class: Class.Paladin,
136+
requirement: 6,
137+
sidequest: false
138+
}
139+
};
23140

24-
export const questToRequirement = new Map<string, number>(
25-
questToRequirementPair
26-
);
141+
export const questMap = new Map(Object.entries(quests));

src/data/secret-class-map.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
"LOOT_079": "HUNTER",
3434
"LOOT_101": "MAGE",
3535
"LOOT_204": "ROGUE",
36-
"LOOT_210": "ROGUE",
3736
"LOOT_214": "ROGUE",
3837
"TRL_400": "MAGE",
3938
"tt_010": "MAGE",

src/data/secrets.ts

Lines changed: 42 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,44 @@
1-
export const enum SecretClass {
2-
Druid = 'DRUID',
3-
Mage = 'MAGE',
4-
Hunter = 'HUNTER',
5-
Paladin = 'PALADIN',
6-
Priest = 'PRIEST',
7-
Rogue = 'ROGUE',
8-
Shaman = 'SHAMAN',
9-
Warlock = 'WARLOCK',
10-
Warrior = 'WARRIOR'
11-
}
1+
import {Class} from './meta';
122

13-
export const secretToClass: {[id: string]: SecretClass} =
14-
{
15-
AT_002: SecretClass.Mage,
16-
AT_060: SecretClass.Hunter,
17-
AT_073: SecretClass.Paladin,
18-
BOT_908: SecretClass.Paladin,
19-
CFM_026: SecretClass.Hunter,
20-
CFM_620: SecretClass.Mage,
21-
CFM_800: SecretClass.Paladin,
22-
DAL_570: SecretClass.Paladin,
23-
EX1_130: SecretClass.Paladin,
24-
EX1_132: SecretClass.Paladin,
25-
EX1_136: SecretClass.Paladin,
26-
EX1_287: SecretClass.Mage,
27-
EX1_289: SecretClass.Mage,
28-
EX1_294: SecretClass.Mage,
29-
EX1_295: SecretClass.Mage,
30-
EX1_379: SecretClass.Paladin,
31-
EX1_533: SecretClass.Hunter,
32-
EX1_554: SecretClass.Hunter,
33-
EX1_594: SecretClass.Mage,
34-
EX1_609: SecretClass.Hunter,
35-
EX1_610: SecretClass.Hunter,
36-
EX1_611: SecretClass.Hunter,
37-
FP1_018: SecretClass.Mage,
38-
FP1_020: SecretClass.Paladin,
39-
GIL_577: SecretClass.Hunter,
40-
GIL_903: SecretClass.Paladin,
41-
ICC_082: SecretClass.Mage,
42-
ICC_200: SecretClass.Hunter,
43-
KAR_004: SecretClass.Hunter,
44-
LOE_021: SecretClass.Hunter,
45-
LOE_027: SecretClass.Paladin,
46-
LOOT_079: SecretClass.Hunter,
47-
LOOT_101: SecretClass.Mage,
48-
LOOT_204: SecretClass.Rogue,
49-
LOOT_210: SecretClass.Rogue,
50-
LOOT_214: SecretClass.Rogue,
51-
TRL_400: SecretClass.Mage,
52-
tt_010: SecretClass.Mage, // eslint-disable-line @typescript-eslint/camelcase
53-
ULD_152: SecretClass.Hunter,
54-
ULD_239: SecretClass.Mage,
55-
UNG_024: SecretClass.Mage
3+
export const secretToClass: { [id: string]: Class } = {
4+
AT_002: Class.Mage,
5+
AT_060: Class.Hunter,
6+
AT_073: Class.Paladin,
7+
BOT_908: Class.Paladin,
8+
CFM_026: Class.Hunter,
9+
CFM_620: Class.Mage,
10+
CFM_800: Class.Paladin,
11+
DAL_570: Class.Paladin,
12+
EX1_130: Class.Paladin,
13+
EX1_132: Class.Paladin,
14+
EX1_136: Class.Paladin,
15+
EX1_287: Class.Mage,
16+
EX1_289: Class.Mage,
17+
EX1_294: Class.Mage,
18+
EX1_295: Class.Mage,
19+
EX1_379: Class.Paladin,
20+
EX1_533: Class.Hunter,
21+
EX1_554: Class.Hunter,
22+
EX1_594: Class.Mage,
23+
EX1_609: Class.Hunter,
24+
EX1_610: Class.Hunter,
25+
EX1_611: Class.Hunter,
26+
FP1_018: Class.Mage,
27+
FP1_020: Class.Paladin,
28+
GIL_577: Class.Hunter,
29+
GIL_903: Class.Paladin,
30+
ICC_082: Class.Mage,
31+
ICC_200: Class.Hunter,
32+
KAR_004: Class.Hunter,
33+
LOE_021: Class.Hunter,
34+
LOE_027: Class.Paladin,
35+
LOOT_079: Class.Hunter,
36+
LOOT_101: Class.Mage,
37+
LOOT_204: Class.Rogue,
38+
LOOT_214: Class.Rogue,
39+
TRL_400: Class.Mage,
40+
tt_010: Class.Mage, // eslint-disable-line @typescript-eslint/camelcase
41+
ULD_152: Class.Hunter,
42+
ULD_239: Class.Mage,
43+
UNG_024: Class.Mage
5644
};

src/line-parsers/new-player.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export class NewPlayerLineParser extends AbstractLineParser {
2121
cardCount: 0,
2222
position: gameState.numPlayers === 0 ? 'bottom' : 'top',
2323
secrets: [],
24+
quests: [],
2425
discovery: {
2526
enabled: false,
2627
id: null

src/line-parsers/tag-change.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@ export class TagChangeLineParser extends AbstractLineParser {
3535
}
3636

3737
const player = gameState.getPlayerById(data.playerId);
38-
if (player && player.quest) {
39-
player.quest.progress = data.value;
38+
if (player && player.quests) {
39+
const quest = player.quests.find(q => q.cardName === data.cardName);
40+
if (quest) {
41+
quest.progress = data.value;
42+
}
4043
}
4144
}
4245

0 commit comments

Comments
 (0)