Skip to content

Commit 1261ba3

Browse files
authored
feat(Zombies): Handle maps and modes (#694)
1 parent 77db3c0 commit 1261ba3

File tree

7 files changed

+209
-16
lines changed

7 files changed

+209
-16
lines changed

src/Structures/MiniGames/Arcade/Zombies/Zombies.test.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Zombies from './Zombies.js';
2+
import ZombiesMap from './ZombiesMap.js';
23
import { expect, expectTypeOf, test } from 'vitest';
34

45
test('Zombies', () => {
@@ -12,9 +13,9 @@ test('Zombies', () => {
1213
expect(data.basketballZombieKills).toBeDefined();
1314
expect(data.basketballZombieKills).toBeGreaterThanOrEqual(0);
1415
expectTypeOf(data.basketballZombieKills).toEqualTypeOf<number>();
15-
expect(data.bestRoundZombies).toBeDefined();
16-
expect(data.bestRoundZombies).toBeGreaterThanOrEqual(0);
17-
expectTypeOf(data.bestRoundZombies).toEqualTypeOf<number>();
16+
expect(data.bestRound).toBeDefined();
17+
expect(data.bestRound).toBeGreaterThanOrEqual(0);
18+
expectTypeOf(data.bestRound).toEqualTypeOf<number>();
1819
expect(data.blazeZombieKills).toBeDefined();
1920
expect(data.blazeZombieKills).toBeGreaterThanOrEqual(0);
2021
expectTypeOf(data.blazeZombieKills).toEqualTypeOf<number>();
@@ -323,4 +324,28 @@ test('Zombies', () => {
323324
expectTypeOf(data.zombieKills).toEqualTypeOf<number>();
324325
expect(data.hideTutorials).toBeDefined();
325326
expectTypeOf(data.hideTutorials).toEqualTypeOf<boolean>();
327+
expect(data.alienArcadium).toBeDefined();
328+
expect(data.alienArcadium).toBeInstanceOf(ZombiesMap);
329+
expectTypeOf(data.alienArcadium).toEqualTypeOf<ZombiesMap>();
330+
expect(data.alienArcadium.normal).toBeUndefined();
331+
expect(data.alienArcadium.hard).toBeUndefined();
332+
expect(data.alienArcadium.rip).toBeUndefined();
333+
expect(data.badBlood).toBeDefined();
334+
expect(data.badBlood).toBeInstanceOf(ZombiesMap);
335+
expect(data.badBlood.normal).toBeDefined();
336+
expect(data.badBlood.hard).toBeDefined();
337+
expect(data.badBlood.rip).toBeDefined();
338+
expectTypeOf(data.badBlood).toEqualTypeOf<ZombiesMap>();
339+
expect(data.deadEnd).toBeDefined();
340+
expect(data.deadEnd).toBeInstanceOf(ZombiesMap);
341+
expectTypeOf(data.deadEnd).toEqualTypeOf<ZombiesMap>();
342+
expect(data.deadEnd.normal).toBeDefined();
343+
expect(data.deadEnd.hard).toBeDefined();
344+
expect(data.deadEnd.rip).toBeDefined();
345+
expect(data.prison).toBeDefined();
346+
expect(data.prison).toBeInstanceOf(ZombiesMap);
347+
expectTypeOf(data.prison).toEqualTypeOf<ZombiesMap>();
348+
expect(data.prison.normal).toBeDefined();
349+
expect(data.prison.hard).toBeDefined();
350+
expect(data.prison.rip).toBeDefined();
326351
});

src/Structures/MiniGames/Arcade/Zombies/Zombies.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import ZombiesMap from './ZombiesMap.js';
2+
13
class Zombies {
24
basicZombieKills: number;
35
basketballZombieKills: number;
4-
bestRoundZombies: number;
6+
bestRound: number;
57
blazeZombieKills: number;
68
blobZombieKills: number;
79
bombZombieKills: number;
@@ -105,10 +107,14 @@ class Zombies {
105107
wormZombieKills: number;
106108
zombieKills: number;
107109
hideTutorials: boolean;
110+
alienArcadium: ZombiesMap;
111+
badBlood: ZombiesMap;
112+
deadEnd: ZombiesMap;
113+
prison: ZombiesMap;
108114
constructor(data: Record<string, any>) {
109115
this.basicZombieKills = data?.basic_zombie_kills_zombies || 0;
110116
this.basketballZombieKills = data?.basketball_zombie_zombie_kills_zombies || 0;
111-
this.bestRoundZombies = data?.best_round_zombies || 0;
117+
this.bestRound = data?.best_round_zombies || 0;
112118
this.blazeZombieKills = data?.blaze_zombie_kills_zombies || 0;
113119
this.blobZombieKills = data?.blob_zombie_kills_zombies || 0;
114120
this.bombZombieKills = data?.bomb_zombie_kills_zombies || 0;
@@ -212,6 +218,10 @@ class Zombies {
212218
this.wormZombieKills = data?.worm_zombie_kills_zombies || 0;
213219
this.zombieKills = data?.zombie_kills_zombies || 0;
214220
this.hideTutorials = data?.zombies_hideTutorials || false;
221+
this.alienArcadium = new ZombiesMap(data, 'alienarcadium', false);
222+
this.badBlood = new ZombiesMap(data, 'badblood', true);
223+
this.deadEnd = new ZombiesMap(data, 'deadend', true);
224+
this.prison = new ZombiesMap(data, 'prison', true);
215225
}
216226
}
217227

src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.test.ts

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
import ZombiesMap from './ZombiesMap.js';
2+
import ZombiesMapMode from './ZombiesMapMode.js';
23
import { expect, expectTypeOf, test } from 'vitest';
34

4-
test('ZombiesMap', () => {
5-
const data = new ZombiesMap({ stats: 'meow' }, 'alienarcadium');
5+
test('ZombiesMap (alienarcadium)', () => {
6+
const data = new ZombiesMap({ stats: 'meow' }, 'alienarcadium', false);
67
expect(data).toBeDefined();
78
expect(data).toBeInstanceOf(ZombiesMap);
89
expectTypeOf(data).toEqualTypeOf<ZombiesMap>();
9-
expect(data.bestRoundZombies).toBeDefined();
10-
expect(data.bestRoundZombies).toBeGreaterThanOrEqual(0);
11-
expectTypeOf(data.bestRoundZombies).toEqualTypeOf<number>();
10+
expect(data.bestRound).toBeDefined();
11+
expect(data.bestRound).toBeGreaterThanOrEqual(0);
12+
expectTypeOf(data.bestRound).toEqualTypeOf<number>();
1213
expect(data.deaths).toBeDefined();
1314
expect(data.deaths).toBeGreaterThanOrEqual(0);
1415
expectTypeOf(data.deaths).toEqualTypeOf<number>();
16+
expect(data.doorsOpened).toBeDefined();
17+
expect(data.doorsOpened).toBeGreaterThanOrEqual(0);
18+
expectTypeOf(data.doorsOpened).toEqualTypeOf<number>();
1519
expect(data.fastestTime10).toBeDefined();
1620
expect(data.fastestTime10).toBeGreaterThanOrEqual(0);
1721
expectTypeOf(data.fastestTime10).toEqualTypeOf<number>();
@@ -39,4 +43,59 @@ test('ZombiesMap', () => {
3943
expect(data.zombieKills).toBeDefined();
4044
expect(data.zombieKills).toBeGreaterThanOrEqual(0);
4145
expectTypeOf(data.zombieKills).toEqualTypeOf<number>();
46+
expect(data.normal).toBeUndefined();
47+
expect(data.hard).toBeUndefined();
48+
expect(data.rip).toBeUndefined();
49+
});
50+
51+
test('ZombiesMap (deadend)', () => {
52+
const data = new ZombiesMap({ stats: 'meow' }, 'deadend', true);
53+
expect(data).toBeDefined();
54+
expect(data).toBeInstanceOf(ZombiesMap);
55+
expectTypeOf(data).toEqualTypeOf<ZombiesMap>();
56+
expect(data.bestRound).toBeDefined();
57+
expect(data.bestRound).toBeGreaterThanOrEqual(0);
58+
expectTypeOf(data.bestRound).toEqualTypeOf<number>();
59+
expect(data.deaths).toBeDefined();
60+
expect(data.deaths).toBeGreaterThanOrEqual(0);
61+
expectTypeOf(data.deaths).toEqualTypeOf<number>();
62+
expect(data.doorsOpened).toBeDefined();
63+
expect(data.doorsOpened).toBeGreaterThanOrEqual(0);
64+
expectTypeOf(data.doorsOpened).toEqualTypeOf<number>();
65+
expect(data.fastestTime10).toBeDefined();
66+
expect(data.fastestTime10).toBeGreaterThanOrEqual(0);
67+
expectTypeOf(data.fastestTime10).toEqualTypeOf<number>();
68+
expect(data.fastestTime20).toBeDefined();
69+
expect(data.fastestTime20).toBeGreaterThanOrEqual(0);
70+
expectTypeOf(data.fastestTime20).toEqualTypeOf<number>();
71+
expect(data.fastestTime30).toBeDefined();
72+
expect(data.fastestTime30).toBeGreaterThanOrEqual(0);
73+
expectTypeOf(data.fastestTime30).toEqualTypeOf<number>();
74+
expect(data.playersRevived).toBeDefined();
75+
expect(data.playersRevived).toBeGreaterThanOrEqual(0);
76+
expectTypeOf(data.playersRevived).toEqualTypeOf<number>();
77+
expect(data.timesKnockedDown).toBeDefined();
78+
expect(data.timesKnockedDown).toBeGreaterThanOrEqual(0);
79+
expectTypeOf(data.timesKnockedDown).toEqualTypeOf<number>();
80+
expect(data.totalRoundsSurvived).toBeDefined();
81+
expect(data.totalRoundsSurvived).toBeGreaterThanOrEqual(0);
82+
expectTypeOf(data.totalRoundsSurvived).toEqualTypeOf<number>();
83+
expect(data.windowsRepaired).toBeDefined();
84+
expect(data.windowsRepaired).toBeGreaterThanOrEqual(0);
85+
expectTypeOf(data.windowsRepaired).toEqualTypeOf<number>();
86+
expect(data.wins).toBeDefined();
87+
expect(data.wins).toBeGreaterThanOrEqual(0);
88+
expectTypeOf(data.wins).toEqualTypeOf<number>();
89+
expect(data.zombieKills).toBeDefined();
90+
expect(data.zombieKills).toBeGreaterThanOrEqual(0);
91+
expectTypeOf(data.zombieKills).toEqualTypeOf<number>();
92+
expect(data.normal).toBeDefined();
93+
expect(data.normal).toBeInstanceOf(ZombiesMapMode);
94+
expectTypeOf(data.normal).toEqualTypeOf<ZombiesMapMode | undefined>();
95+
expect(data.hard).toBeDefined();
96+
expect(data.hard).toBeInstanceOf(ZombiesMapMode);
97+
expectTypeOf(data.hard).toEqualTypeOf<ZombiesMapMode | undefined>();
98+
expect(data.rip).toBeDefined();
99+
expect(data.rip).toBeInstanceOf(ZombiesMapMode);
100+
expectTypeOf(data.rip).toEqualTypeOf<ZombiesMapMode | undefined>();
42101
});

src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1+
import ZombiesMapMode from './ZombiesMapMode.js';
12
import type { ArcadeZombiesMaps } from '../../../../Types/Player.js';
23

4+
function minPositive(...values: number[]): number {
5+
const positives = values.filter((v) => v > 0);
6+
return positives.length > 0 ? Math.min(...positives) : 0;
7+
}
8+
39
class ZombiesMap {
4-
bestRoundZombies: number;
10+
bestRound: number;
511
deaths: number;
12+
doorsOpened: number;
613
fastestTime10: number;
714
fastestTime20: number;
815
fastestTime30: number;
@@ -12,18 +19,32 @@ class ZombiesMap {
1219
windowsRepaired: number;
1320
wins: number;
1421
zombieKills: number;
15-
constructor(data: Record<string, any>, map: ArcadeZombiesMaps) {
16-
this.bestRoundZombies = data?.[`best_round_zombies_${map}`] || 0;
22+
normal?: ZombiesMapMode;
23+
hard?: ZombiesMapMode;
24+
rip?: ZombiesMapMode;
25+
constructor(data: Record<string, any>, map: ArcadeZombiesMaps, hasModes: boolean = false) {
26+
this.bestRound = data?.[`best_round_zombies_${map}`] || 0;
1727
this.deaths = data?.[`deaths_zombies_${map}`] || 0;
18-
this.fastestTime10 = data?.[`fastest_time_10_zombies_${map}`] || 0;
19-
this.fastestTime20 = data?.[`fastest_time_20_zombies_${map}`] || 0;
20-
this.fastestTime30 = data?.[`fastest_time_30_zombies_${map}`] || 0;
28+
this.doorsOpened = data?.[`doors_opened_zombies_${map}`] || 0;
2129
this.playersRevived = data?.[`players_revived_zombies_${map}`] || 0;
2230
this.timesKnockedDown = data?.[`times_knocked_down_zombies_${map}`] || 0;
2331
this.totalRoundsSurvived = data?.[`total_rounds_survived_zombies_${map}`] || 0;
2432
this.windowsRepaired = data?.[`windows_repaired_zombies_${map}`] || 0;
2533
this.wins = data?.[`wins_zombies_${map}`] || 0;
2634
this.zombieKills = data?.[`zombie_kills_zombies_${map}`] || 0;
35+
36+
if (hasModes) {
37+
this.normal = new ZombiesMapMode(data, map, 'normal');
38+
this.hard = new ZombiesMapMode(data, map, 'hard');
39+
this.rip = new ZombiesMapMode(data, map, 'rip');
40+
this.fastestTime10 = minPositive(this.normal.fastestTime10, this.hard.fastestTime10, this.rip.fastestTime10);
41+
this.fastestTime20 = minPositive(this.normal.fastestTime20, this.hard.fastestTime20, this.rip.fastestTime20);
42+
this.fastestTime30 = minPositive(this.normal.fastestTime30, this.hard.fastestTime30, this.rip.fastestTime30);
43+
} else {
44+
this.fastestTime10 = data?.[`fastest_time_10_zombies_${map}_normal`] || 0;
45+
this.fastestTime20 = data?.[`fastest_time_20_zombies_${map}_normal`] || 0;
46+
this.fastestTime30 = data?.[`fastest_time_30_zombies_${map}_normal`] || 0;
47+
}
2748
}
2849
}
2950

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import ZombiesMapMode from './ZombiesMapMode.js';
2+
import { expect, expectTypeOf, test } from 'vitest';
3+
4+
test('ZombiesMapMode', () => {
5+
const data = new ZombiesMapMode({ stats: 'meow' }, 'deadend', 'normal');
6+
expect(data).toBeDefined();
7+
expect(data).toBeInstanceOf(ZombiesMapMode);
8+
expectTypeOf(data).toEqualTypeOf<ZombiesMapMode>();
9+
expect(data.bestRound).toBeDefined();
10+
expect(data.bestRound).toBeGreaterThanOrEqual(0);
11+
expectTypeOf(data.bestRound).toEqualTypeOf<number>();
12+
expect(data.deaths).toBeDefined();
13+
expect(data.deaths).toBeGreaterThanOrEqual(0);
14+
expectTypeOf(data.deaths).toEqualTypeOf<number>();
15+
expect(data.doorsOpened).toBeDefined();
16+
expect(data.doorsOpened).toBeGreaterThanOrEqual(0);
17+
expectTypeOf(data.doorsOpened).toEqualTypeOf<number>();
18+
expect(data.fastestTime10).toBeDefined();
19+
expect(data.fastestTime10).toBeGreaterThanOrEqual(0);
20+
expectTypeOf(data.fastestTime10).toEqualTypeOf<number>();
21+
expect(data.fastestTime20).toBeDefined();
22+
expect(data.fastestTime20).toBeGreaterThanOrEqual(0);
23+
expectTypeOf(data.fastestTime20).toEqualTypeOf<number>();
24+
expect(data.fastestTime30).toBeDefined();
25+
expect(data.fastestTime30).toBeGreaterThanOrEqual(0);
26+
expectTypeOf(data.fastestTime30).toEqualTypeOf<number>();
27+
expect(data.playersRevived).toBeDefined();
28+
expect(data.playersRevived).toBeGreaterThanOrEqual(0);
29+
expectTypeOf(data.playersRevived).toEqualTypeOf<number>();
30+
expect(data.timesKnockedDown).toBeDefined();
31+
expect(data.timesKnockedDown).toBeGreaterThanOrEqual(0);
32+
expectTypeOf(data.timesKnockedDown).toEqualTypeOf<number>();
33+
expect(data.totalRoundsSurvived).toBeDefined();
34+
expect(data.totalRoundsSurvived).toBeGreaterThanOrEqual(0);
35+
expectTypeOf(data.totalRoundsSurvived).toEqualTypeOf<number>();
36+
expect(data.windowsRepaired).toBeDefined();
37+
expect(data.windowsRepaired).toBeGreaterThanOrEqual(0);
38+
expectTypeOf(data.windowsRepaired).toEqualTypeOf<number>();
39+
expect(data.wins).toBeDefined();
40+
expect(data.wins).toBeGreaterThanOrEqual(0);
41+
expectTypeOf(data.wins).toEqualTypeOf<number>();
42+
expect(data.zombieKills).toBeDefined();
43+
expect(data.zombieKills).toBeGreaterThanOrEqual(0);
44+
expectTypeOf(data.zombieKills).toEqualTypeOf<number>();
45+
});
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import type { ArcadeZombiesDifficulty, ArcadeZombiesMaps } from '../../../../Types/Player.js';
2+
3+
class ZombiesMapMode {
4+
bestRound: number;
5+
deaths: number;
6+
doorsOpened: number;
7+
fastestTime10: number;
8+
fastestTime20: number;
9+
fastestTime30: number;
10+
playersRevived: number;
11+
timesKnockedDown: number;
12+
totalRoundsSurvived: number;
13+
windowsRepaired: number;
14+
wins: number;
15+
zombieKills: number;
16+
constructor(data: Record<string, any>, map: ArcadeZombiesMaps, mode: ArcadeZombiesDifficulty) {
17+
this.bestRound = data?.[`best_round_zombies_${map}_${mode}`] || 0;
18+
this.deaths = data?.[`deaths_zombies_${map}_${mode}`] || 0;
19+
this.doorsOpened = data?.[`doors_opened_zombies_${map}_${mode}`] || 0;
20+
this.fastestTime10 = data?.[`fastest_time_10_zombies_${map}_${mode}`] || 0;
21+
this.fastestTime20 = data?.[`fastest_time_20_zombies_${map}_${mode}`] || 0;
22+
this.fastestTime30 = data?.[`fastest_time_30_zombies_${map}_${mode}`] || 0;
23+
this.playersRevived = data?.[`players_revived_zombies_${map}_${mode}`] || 0;
24+
this.timesKnockedDown = data?.[`times_knocked_down_zombies_${map}_${mode}`] || 0;
25+
this.totalRoundsSurvived = data?.[`total_rounds_survived_zombies_${map}_${mode}`] || 0;
26+
this.windowsRepaired = data?.[`windows_repaired_zombies_${map}_${mode}`] || 0;
27+
this.wins = data?.[`wins_zombies_${map}_${mode}`] || 0;
28+
this.zombieKills = data?.[`zombie_kills_zombies_${map}_${mode}`] || 0;
29+
}
30+
}
31+
32+
export default ZombiesMapMode;

src/Types/Player.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2499,6 +2499,7 @@ export type ArcadePartyGamesGame =
24992499
| 'volcano'
25002500
| 'workshop';
25012501
export type ArcadeZombiesMaps = 'alienarcadium' | 'badblood' | 'deadend' | 'prison';
2502+
export type ArcadeZombiesDifficulty = 'normal' | 'hard' | 'rip';
25022503
export type ArcadeEnderSpleefTrail = 'BLUE' | 'DEFAULT' | 'GREEN' | 'RAINBOW' | 'RED';
25032504
export type ArcadeHoleInTheWallColor = 'CYAN' | 'DEFAULT' | 'FROSTED' | 'GREEN' | 'PUMPKIN' | 'RED' | 'YELLOW';
25042505
export type ArcadeThrowOutDisguise = 'COW' | 'PIG' | 'SHEEP' | 'SNOWMAN' | 'ZOMBIE';

0 commit comments

Comments
 (0)