wynham-games 1.0.0-beta.10

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.
Files changed (70) hide show
  1. package/README.md +270 -0
  2. package/dist/games/Connect4.d.ts +37 -0
  3. package/dist/games/Connect4.d.ts.map +1 -0
  4. package/dist/games/Connect4.js +279 -0
  5. package/dist/games/Connect4.js.map +1 -0
  6. package/dist/games/Hangman.d.ts +30 -0
  7. package/dist/games/Hangman.d.ts.map +1 -0
  8. package/dist/games/Hangman.js +259 -0
  9. package/dist/games/Hangman.js.map +1 -0
  10. package/dist/games/RPS.d.ts +25 -0
  11. package/dist/games/RPS.d.ts.map +1 -0
  12. package/dist/games/RPS.js +187 -0
  13. package/dist/games/RPS.js.map +1 -0
  14. package/dist/games/Snake.d.ts +33 -0
  15. package/dist/games/Snake.d.ts.map +1 -0
  16. package/dist/games/Snake.js +222 -0
  17. package/dist/games/Snake.js.map +1 -0
  18. package/dist/games/TicTacToe.d.ts +32 -0
  19. package/dist/games/TicTacToe.d.ts.map +1 -0
  20. package/dist/games/TicTacToe.js +293 -0
  21. package/dist/games/TicTacToe.js.map +1 -0
  22. package/dist/games/index.d.ts +6 -0
  23. package/dist/games/index.d.ts.map +1 -0
  24. package/dist/games/index.js +17 -0
  25. package/dist/games/index.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +19 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/locales/en-US.d.ts +103 -0
  31. package/dist/locales/en-US.d.ts.map +1 -0
  32. package/dist/locales/en-US.js +169 -0
  33. package/dist/locales/en-US.js.map +1 -0
  34. package/dist/locales/es.d.ts +103 -0
  35. package/dist/locales/es.d.ts.map +1 -0
  36. package/dist/locales/es.js +169 -0
  37. package/dist/locales/es.js.map +1 -0
  38. package/dist/locales/fr.d.ts +103 -0
  39. package/dist/locales/fr.d.ts.map +1 -0
  40. package/dist/locales/fr.js +169 -0
  41. package/dist/locales/fr.js.map +1 -0
  42. package/dist/locales/index.d.ts +522 -0
  43. package/dist/locales/index.d.ts.map +1 -0
  44. package/dist/locales/index.js +29 -0
  45. package/dist/locales/index.js.map +1 -0
  46. package/dist/locales/it.d.ts +103 -0
  47. package/dist/locales/it.d.ts.map +1 -0
  48. package/dist/locales/it.js +169 -0
  49. package/dist/locales/it.js.map +1 -0
  50. package/dist/structures/GameManager.d.ts +32 -0
  51. package/dist/structures/GameManager.d.ts.map +1 -0
  52. package/dist/structures/GameManager.js +183 -0
  53. package/dist/structures/GameManager.js.map +1 -0
  54. package/dist/structures/Types.d.ts +241 -0
  55. package/dist/structures/Types.d.ts.map +1 -0
  56. package/dist/structures/Types.js +51 -0
  57. package/dist/structures/Types.js.map +1 -0
  58. package/dist/structures/Utils.d.ts +49 -0
  59. package/dist/structures/Utils.d.ts.map +1 -0
  60. package/dist/structures/Utils.js +197 -0
  61. package/dist/structures/Utils.js.map +1 -0
  62. package/dist/variables/Game.d.ts +5 -0
  63. package/dist/variables/Game.d.ts.map +1 -0
  64. package/dist/variables/Game.js +84 -0
  65. package/dist/variables/Game.js.map +1 -0
  66. package/dist/variables/index.d.ts +2 -0
  67. package/dist/variables/index.d.ts.map +1 -0
  68. package/dist/variables/index.js +18 -0
  69. package/dist/variables/index.js.map +1 -0
  70. package/package.json +36 -0
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const Types_1 = require("../structures/Types");
4
+ const discord_js_1 = require("discord.js");
5
+ const DELTAS = {
6
+ up: { x: 0, y: -1 },
7
+ down: { x: 0, y: 1 },
8
+ left: { x: -1, y: 0 },
9
+ right: { x: 1, y: 0 },
10
+ };
11
+ const OPPOSITE = {
12
+ up: "down",
13
+ down: "up",
14
+ left: "right",
15
+ right: "left",
16
+ };
17
+ const clamp = (value, min, max) => Math.max(min, Math.min(max, value));
18
+ class Snake {
19
+ gameName = Types_1.GameNameType.Snake;
20
+ manager;
21
+ interaction;
22
+ player;
23
+ colors;
24
+ emojis;
25
+ title;
26
+ loc;
27
+ width;
28
+ height;
29
+ turnTimeout;
30
+ cooldownKey;
31
+ collector = null;
32
+ // Snake body, head first.
33
+ snake = [];
34
+ direction = "right";
35
+ food = { x: 0, y: 0 };
36
+ score = 0;
37
+ over = false;
38
+ won = false;
39
+ constructor(manager, interaction, options, gameLocale) {
40
+ this.manager = manager;
41
+ this.interaction = interaction;
42
+ this.player = options.player;
43
+ this.cooldownKey = `${this.player.id}-${this.gameName}`;
44
+ this.turnTimeout = (options.turnTimeout ?? 30) * 1000;
45
+ this.loc = gameLocale.snake;
46
+ const theme = options.theme ?? {};
47
+ this.colors = {
48
+ play: theme.colors?.play ?? 0x5865f2,
49
+ win: theme.colors?.win ?? 0xffd700,
50
+ lose: theme.colors?.lose ?? 0x808080,
51
+ };
52
+ this.emojis = {
53
+ head: theme.emojis?.head ?? "🟢",
54
+ body: theme.emojis?.body ?? "🟩",
55
+ food: theme.emojis?.food ?? "🍎",
56
+ empty: theme.emojis?.empty ?? "⬛",
57
+ };
58
+ this.title = options.lang?.title ?? this.loc.title;
59
+ this.width = clamp(options.boardWidth ?? 10, 5, 12);
60
+ this.height = clamp(options.boardHeight ?? 10, 5, 12);
61
+ // Start with a single-cell snake in the middle of the board.
62
+ const start = { x: Math.floor(this.width / 2), y: Math.floor(this.height / 2) };
63
+ this.snake = [start];
64
+ this.spawnFood();
65
+ }
66
+ async launch() {
67
+ this.manager.cooldowns.replace(this.cooldownKey, 600_000);
68
+ const message = await this.interaction.editReply({
69
+ components: [this.buildContainer(this.loc.start, this.colors.play)],
70
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
71
+ });
72
+ this.collector = message.createMessageComponentCollector({
73
+ componentType: discord_js_1.ComponentType.Button,
74
+ time: 600_000,
75
+ idle: this.turnTimeout,
76
+ filter: btn => {
77
+ if (btn.user.id === this.player.id)
78
+ return true;
79
+ btn.reply({
80
+ embeds: [{ description: this.loc.notYourGame, color: discord_js_1.Colors.Red }],
81
+ flags: discord_js_1.MessageFlags.Ephemeral,
82
+ });
83
+ return false;
84
+ },
85
+ });
86
+ this.collector.on("collect", (btn) => this.handleButton(btn));
87
+ this.collector.on("end", async (_, reason) => {
88
+ if (reason === "time" || reason === "idle") {
89
+ await this.interaction
90
+ .editReply({
91
+ components: [this.buildContainer(this.loc.timeout(this.score), this.colors.lose, true)],
92
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
93
+ })
94
+ .catch(() => { });
95
+ }
96
+ });
97
+ }
98
+ async handleButton(btn) {
99
+ await btn.deferUpdate();
100
+ this.interaction = btn;
101
+ const action = btn.customId.split("_")[1];
102
+ if (action === "stop") {
103
+ this.cleanup();
104
+ return void (await this.interaction.editReply({
105
+ components: [this.buildContainer(this.loc.quit(this.score), this.colors.lose, true)],
106
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
107
+ }));
108
+ }
109
+ const direction = action;
110
+ // Ignore a 180° turn into the snake's own neck.
111
+ if (this.snake.length > 1 && OPPOSITE[this.direction] === direction)
112
+ return;
113
+ this.direction = direction;
114
+ this.step();
115
+ if (this.won) {
116
+ this.cleanup();
117
+ return void (await this.interaction.editReply({
118
+ components: [this.buildContainer(this.loc.win(this.score), this.colors.win, true)],
119
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
120
+ }));
121
+ }
122
+ if (this.over) {
123
+ this.cleanup();
124
+ return void (await this.interaction.editReply({
125
+ components: [this.buildContainer(this.loc.gameOver(this.score), this.colors.lose, true)],
126
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
127
+ }));
128
+ }
129
+ this.collector?.resetTimer();
130
+ this.manager.cooldowns.reset(this.cooldownKey, 600_000);
131
+ await this.interaction.editReply({
132
+ components: [this.buildContainer(this.loc.start, this.colors.play)],
133
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
134
+ });
135
+ }
136
+ // Advances the snake one cell in the current direction, resolving collisions and food.
137
+ step() {
138
+ const head = this.snake[0];
139
+ const delta = DELTAS[this.direction];
140
+ const nx = head.x + delta.x;
141
+ const ny = head.y + delta.y;
142
+ // Wall collision.
143
+ if (nx < 0 || ny < 0 || nx >= this.width || ny >= this.height) {
144
+ this.over = true;
145
+ return;
146
+ }
147
+ const ate = nx === this.food.x && ny === this.food.y;
148
+ // When not eating, the tail frees up, so it isn't an obstacle this step.
149
+ const body = ate ? this.snake : this.snake.slice(0, -1);
150
+ if (body.some(s => s.x === nx && s.y === ny)) {
151
+ this.over = true;
152
+ return;
153
+ }
154
+ this.snake.unshift({ x: nx, y: ny });
155
+ if (ate) {
156
+ this.score++;
157
+ if (this.snake.length === this.width * this.height) {
158
+ this.won = true;
159
+ return;
160
+ }
161
+ this.spawnFood();
162
+ }
163
+ else {
164
+ this.snake.pop();
165
+ }
166
+ }
167
+ // Places the food on a random empty cell.
168
+ spawnFood() {
169
+ const empty = [];
170
+ for (let y = 0; y < this.height; y++) {
171
+ for (let x = 0; x < this.width; x++) {
172
+ if (!this.snake.some(s => s.x === x && s.y === y))
173
+ empty.push({ x, y });
174
+ }
175
+ }
176
+ if (empty.length === 0)
177
+ return;
178
+ this.food = empty[Math.floor(Math.random() * empty.length)];
179
+ }
180
+ buildBoard() {
181
+ const rows = [];
182
+ for (let y = 0; y < this.height; y++) {
183
+ let row = "";
184
+ for (let x = 0; x < this.width; x++) {
185
+ const head = this.snake[0];
186
+ if (head.x === x && head.y === y)
187
+ row += this.emojis.head;
188
+ else if (this.snake.some(s => s.x === x && s.y === y))
189
+ row += this.emojis.body;
190
+ else if (this.food.x === x && this.food.y === y)
191
+ row += this.emojis.food;
192
+ else
193
+ row += this.emojis.empty;
194
+ }
195
+ rows.push(row);
196
+ }
197
+ return rows.join("\n");
198
+ }
199
+ buildControls(disabled = false) {
200
+ return new discord_js_1.ActionRowBuilder().addComponents(new discord_js_1.ButtonBuilder().setCustomId("snake_left").setEmoji("⬅️").setStyle(discord_js_1.ButtonStyle.Primary).setDisabled(disabled), new discord_js_1.ButtonBuilder().setCustomId("snake_up").setEmoji("⬆️").setStyle(discord_js_1.ButtonStyle.Primary).setDisabled(disabled), new discord_js_1.ButtonBuilder().setCustomId("snake_down").setEmoji("⬇️").setStyle(discord_js_1.ButtonStyle.Primary).setDisabled(disabled), new discord_js_1.ButtonBuilder().setCustomId("snake_right").setEmoji("➡️").setStyle(discord_js_1.ButtonStyle.Primary).setDisabled(disabled), new discord_js_1.ButtonBuilder().setCustomId("snake_stop").setEmoji("⏹️").setStyle(discord_js_1.ButtonStyle.Danger).setDisabled(disabled));
201
+ }
202
+ buildContainer(status, color, disabled = false) {
203
+ const base = new discord_js_1.ContainerBuilder()
204
+ .setAccentColor(color)
205
+ .addTextDisplayComponents(new discord_js_1.TextDisplayBuilder().setContent(`## 🐍 ${this.title}`))
206
+ .addTextDisplayComponents(new discord_js_1.TextDisplayBuilder().setContent(this.buildBoard()))
207
+ .addSeparatorComponents(new discord_js_1.SeparatorBuilder().setDivider(true).setSpacing(discord_js_1.SeparatorSpacingSize.Small))
208
+ .addTextDisplayComponents(new discord_js_1.TextDisplayBuilder().setContent(`${this.loc.score(this.score)}\n${status}`));
209
+ if (!disabled)
210
+ base.addActionRowComponents(this.buildControls());
211
+ return base;
212
+ }
213
+ cleanup() {
214
+ if (this.collector) {
215
+ this.collector.stop("cleanup");
216
+ this.collector = null;
217
+ }
218
+ this.manager.cooldowns.delete(this.cooldownKey);
219
+ }
220
+ }
221
+ exports.default = Snake;
222
+ //# sourceMappingURL=Snake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Snake.js","sourceRoot":"","sources":["../../src/games/Snake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { GameNameType, type TicTacToeOptions, type IGame, type GameLocale, type GameManagerType } from "../structures/Types";
2
+ import { RepliableInteraction } from "discord.js";
3
+ export default class TicTacToe implements IGame {
4
+ readonly gameName = GameNameType.TicTacToe;
5
+ private readonly manager;
6
+ private interaction;
7
+ private readonly players;
8
+ private readonly colors;
9
+ private readonly emojis;
10
+ private readonly title;
11
+ private readonly loc;
12
+ private readonly difficulty;
13
+ private readonly board;
14
+ private currentPlayer;
15
+ private winLine;
16
+ private collector;
17
+ private readonly turnTimeout;
18
+ private readonly cooldownKey;
19
+ constructor(manager: GameManagerType, interaction: RepliableInteraction, options: TicTacToeOptions, gameLocale: GameLocale);
20
+ private checkWin;
21
+ private isDraw;
22
+ private createButtons;
23
+ private buildContainer;
24
+ launch(): Promise<void>;
25
+ private handleButton;
26
+ private playBotMove;
27
+ private getBotCell;
28
+ private isWinningMove;
29
+ private minimax;
30
+ private cleanup;
31
+ }
32
+ //# sourceMappingURL=TicTacToe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicTacToe.d.ts","sourceRoot":"","sources":["../../src/games/TicTacToe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAwB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEjK,OAAO,EAYH,oBAAoB,EAGvB,MAAM,YAAY,CAAC;AAqBpB,MAAM,CAAC,OAAO,OAAO,SAAU,YAAW,KAAK;IAC3C,SAAgB,QAAQ,0BAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8C;IACrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IACnE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAE3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,aAAa,CAAQ;IAE7B,OAAO,CAAC,OAAO,CAAkD;IACjE,OAAO,CAAC,SAAS,CAAwD;IACzE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU;IAuB1H,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,cAAc;IAWhB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAuCf,YAAY;YAsDZ,WAAW;IAmCzB,OAAO,CAAC,UAAU;IA6BlB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,OAAO;IA+Bf,OAAO,CAAC,OAAO;CAOlB"}
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const Types_1 = require("../structures/Types");
4
+ const discord_js_1 = require("discord.js");
5
+ // Cell indices in the flat 9-cell board:
6
+ // 0 | 1 | 2
7
+ // 3 | 4 | 5
8
+ // 6 | 7 | 8
9
+ const WIN_LINES = [
10
+ [0, 1, 2],
11
+ [3, 4, 5],
12
+ [6, 7, 8], // rows
13
+ [0, 3, 6],
14
+ [1, 4, 7],
15
+ [2, 5, 8], // columns
16
+ [0, 4, 8],
17
+ [2, 4, 6], // diagonals
18
+ ];
19
+ // For each cell, the win lines passing through it, so the minimax only checks
20
+ // the lines affected by the last move instead of all 8.
21
+ const LINES_THROUGH = Array.from({ length: 9 }, (_, cell) => WIN_LINES.filter(line => line[0] === cell || line[1] === cell || line[2] === cell));
22
+ class TicTacToe {
23
+ gameName = Types_1.GameNameType.TicTacToe;
24
+ manager;
25
+ interaction;
26
+ players;
27
+ colors;
28
+ emojis;
29
+ title;
30
+ loc;
31
+ difficulty;
32
+ // 0 — empty, 1 — Player 1, 2 — Player 2.
33
+ board = new Int8Array(9);
34
+ currentPlayer;
35
+ // Set once a win is detected, used to highlight the winning cells.
36
+ winLine = null;
37
+ collector = null;
38
+ turnTimeout;
39
+ cooldownKey;
40
+ constructor(manager, interaction, options, gameLocale) {
41
+ this.manager = manager;
42
+ this.interaction = interaction;
43
+ this.players = options.players;
44
+ this.cooldownKey = `${this.players[0].id}-${this.players[1].id}-${this.gameName}`;
45
+ this.turnTimeout = (options.turnTimeout ?? 30) * 1000;
46
+ this.currentPlayer = Math.random() < 0.5 ? 0 : 1;
47
+ this.difficulty = options.difficulty ?? Types_1.BotDifficulty.Hard;
48
+ this.loc = gameLocale.tictactoe;
49
+ const theme = options.theme;
50
+ this.colors = {
51
+ play: theme?.colors?.play ?? 0x5865f2,
52
+ win: theme?.colors?.win ?? 0xffd700,
53
+ draw: theme?.colors?.draw ?? 0x808080,
54
+ };
55
+ this.emojis = {
56
+ p1: theme?.emojis?.player1 ?? "❌",
57
+ p2: theme?.emojis?.player2 ?? "⭕",
58
+ empty: theme?.emojis?.empty ?? "⬜",
59
+ };
60
+ this.title = options.lang?.title ?? this.loc.title;
61
+ }
62
+ checkWin() {
63
+ for (const line of WIN_LINES) {
64
+ const [a, b, c] = line;
65
+ if (this.board[a] !== 0 && this.board[a] === this.board[b] && this.board[b] === this.board[c]) {
66
+ this.winLine = line;
67
+ return true;
68
+ }
69
+ }
70
+ return false;
71
+ }
72
+ isDraw() {
73
+ return this.board.every(c => c !== 0);
74
+ }
75
+ createButtons(disabled = false) {
76
+ const rows = [];
77
+ for (let r = 0; r < 3; r++) {
78
+ const row = new discord_js_1.ActionRowBuilder();
79
+ for (let c = 0; c < 3; c++) {
80
+ const i = r * 3 + c;
81
+ const cell = this.board[i];
82
+ const win = this.winLine?.includes(i) ?? false;
83
+ const emoji = cell === 1 ? this.emojis.p1 : cell === 2 ? this.emojis.p2 : this.emojis.empty;
84
+ const style = win ? discord_js_1.ButtonStyle.Success : cell === 1 ? discord_js_1.ButtonStyle.Primary : cell === 2 ? discord_js_1.ButtonStyle.Danger : discord_js_1.ButtonStyle.Secondary;
85
+ row.addComponents(new discord_js_1.ButtonBuilder()
86
+ .setCustomId(`ttt_${i}`)
87
+ .setEmoji(emoji)
88
+ .setStyle(style)
89
+ .setDisabled(disabled || cell !== 0));
90
+ }
91
+ rows.push(row);
92
+ }
93
+ return rows;
94
+ }
95
+ buildContainer(status, color, disabled = false) {
96
+ const [p1, p2] = this.players;
97
+ return new discord_js_1.ContainerBuilder()
98
+ .setAccentColor(color)
99
+ .addTextDisplayComponents(new discord_js_1.TextDisplayBuilder().setContent(`## ${this.title}`))
100
+ .addTextDisplayComponents(new discord_js_1.TextDisplayBuilder().setContent(`${this.emojis.p1} **${p1.username}** vs ${this.emojis.p2} **${p2.username}**`))
101
+ .addSeparatorComponents(new discord_js_1.SeparatorBuilder().setDivider(true).setSpacing(discord_js_1.SeparatorSpacingSize.Small))
102
+ .addTextDisplayComponents(new discord_js_1.TextDisplayBuilder().setContent(status))
103
+ .addActionRowComponents(...this.createButtons(disabled));
104
+ }
105
+ async launch() {
106
+ this.manager.cooldowns.replace(this.cooldownKey, 300_000);
107
+ const first = this.players[this.currentPlayer];
108
+ const emoji = this.currentPlayer === 0 ? this.emojis.p1 : this.emojis.p2;
109
+ const status = this.loc.turn(emoji, first.username);
110
+ const message = await this.interaction.editReply({
111
+ components: [this.buildContainer(status, this.colors.play)],
112
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
113
+ });
114
+ this.collector = message.createMessageComponentCollector({
115
+ componentType: discord_js_1.ComponentType.Button,
116
+ time: 300_000,
117
+ idle: this.turnTimeout,
118
+ filter: btn => {
119
+ if (this.players.some(p => p.id === btn.user.id))
120
+ return true;
121
+ btn.reply({
122
+ embeds: [{ description: this.loc.notYourGame, color: discord_js_1.Colors.Red }],
123
+ flags: discord_js_1.MessageFlags.Ephemeral,
124
+ });
125
+ return false;
126
+ },
127
+ });
128
+ this.collector.on("collect", (btn) => this.handleButton(btn));
129
+ this.collector.on("end", async (_, reason) => {
130
+ if (reason === "time" || reason === "idle") {
131
+ await this.interaction.editReply({
132
+ components: [this.buildContainer(this.loc.timeout, this.colors.draw, true)],
133
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
134
+ });
135
+ }
136
+ });
137
+ if (first.bot)
138
+ setTimeout(() => this.playBotMove().catch(() => { }), 800);
139
+ }
140
+ async handleButton(components) {
141
+ const player = this.players[this.currentPlayer];
142
+ await components.deferUpdate();
143
+ this.interaction = components;
144
+ if (components.user.id !== player.id) {
145
+ return void (await components.followUp({
146
+ embeds: [{ description: this.loc.notYourTurn, color: discord_js_1.Colors.Red }],
147
+ flags: discord_js_1.MessageFlags.Ephemeral,
148
+ }));
149
+ }
150
+ const cell = Number(components.customId.replace("ttt_", ""));
151
+ if (this.board[cell] !== 0) {
152
+ return void components.followUp({
153
+ embeds: [{ description: this.loc.cellTaken, color: discord_js_1.Colors.Red }],
154
+ flags: discord_js_1.MessageFlags.Ephemeral,
155
+ });
156
+ }
157
+ this.board[cell] = this.currentPlayer + 1;
158
+ if (this.checkWin()) {
159
+ this.cleanup();
160
+ const emoji = this.currentPlayer === 0 ? this.emojis.p1 : this.emojis.p2;
161
+ return void (await this.interaction.editReply({
162
+ components: [this.buildContainer(this.loc.win(emoji, player.username), this.colors.win, true)],
163
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
164
+ }));
165
+ }
166
+ if (this.isDraw()) {
167
+ this.cleanup();
168
+ return void (await this.interaction.editReply({
169
+ components: [this.buildContainer(this.loc.draw, this.colors.draw, true)],
170
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
171
+ }));
172
+ }
173
+ this.collector?.resetTimer();
174
+ this.manager.cooldowns.reset(this.cooldownKey, 300_000);
175
+ this.currentPlayer = this.currentPlayer === 0 ? 1 : 0;
176
+ const next = this.players[this.currentPlayer];
177
+ const emoji = this.currentPlayer === 0 ? this.emojis.p1 : this.emojis.p2;
178
+ await this.interaction.editReply({
179
+ components: [this.buildContainer(this.loc.turn(emoji, next.username), this.colors.play)],
180
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
181
+ });
182
+ if (next.bot)
183
+ setTimeout(() => this.playBotMove().catch(() => { }), 800);
184
+ }
185
+ async playBotMove() {
186
+ const cell = this.getBotCell();
187
+ this.board[cell] = (this.currentPlayer + 1);
188
+ const player = this.players[this.currentPlayer];
189
+ if (this.checkWin()) {
190
+ this.cleanup();
191
+ const emoji = this.currentPlayer === 0 ? this.emojis.p1 : this.emojis.p2;
192
+ return void (await this.interaction.editReply({
193
+ components: [this.buildContainer(this.loc.win(emoji, player.username), this.colors.win, true)],
194
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
195
+ }));
196
+ }
197
+ if (this.isDraw()) {
198
+ this.cleanup();
199
+ return void (await this.interaction.editReply({
200
+ components: [this.buildContainer(this.loc.draw, this.colors.draw, true)],
201
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
202
+ }));
203
+ }
204
+ this.collector?.resetTimer();
205
+ this.manager.cooldowns.reset(this.cooldownKey, 300_000);
206
+ this.currentPlayer = this.currentPlayer === 0 ? 1 : 0;
207
+ const next = this.players[this.currentPlayer];
208
+ const emoji = this.currentPlayer === 0 ? this.emojis.p1 : this.emojis.p2;
209
+ await this.interaction.editReply({
210
+ components: [this.buildContainer(this.loc.turn(emoji, next.username), this.colors.play)],
211
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
212
+ });
213
+ }
214
+ getBotCell() {
215
+ const empty = [];
216
+ for (let i = 0; i < 9; i++)
217
+ if (this.board[i] === 0)
218
+ empty.push(i);
219
+ const randomCell = () => empty[Math.floor(Math.random() * empty.length)];
220
+ if (this.difficulty === Types_1.BotDifficulty.Easy)
221
+ return randomCell();
222
+ const optimalChance = this.difficulty === Types_1.BotDifficulty.Normal ? 0.5 : this.difficulty === Types_1.BotDifficulty.Hard ? 0.8 : 1;
223
+ if (Math.random() > optimalChance)
224
+ return randomCell();
225
+ // Every opening leads to a draw under perfect play, so skip the full search and take the centre.
226
+ if (empty.length === 9)
227
+ return 4;
228
+ const botPiece = (this.currentPlayer + 1);
229
+ let bestScore = -Infinity;
230
+ let bestCell = empty[0];
231
+ for (const i of empty) {
232
+ this.board[i] = botPiece;
233
+ const s = this.minimax(i, botPiece, false, botPiece, empty.length - 1, 9, -Infinity, Infinity);
234
+ this.board[i] = 0;
235
+ if (s > bestScore) {
236
+ bestScore = s;
237
+ bestCell = i;
238
+ }
239
+ }
240
+ return bestCell;
241
+ }
242
+ isWinningMove(cell, piece) {
243
+ for (const [a, b, c] of LINES_THROUGH[cell]) {
244
+ if (this.board[a] === piece && this.board[b] === piece && this.board[c] === piece)
245
+ return true;
246
+ }
247
+ return false;
248
+ }
249
+ // Depth-weighted minimax with alpha-beta pruning: win → +depth, loss → -depth, draw → 0,
250
+ // so the bot prefers faster wins and slower losses.
251
+ minimax(lastMove, lastPiece, isMax, botPiece, movesLeft, depth, alpha, beta) {
252
+ if (this.isWinningMove(lastMove, lastPiece))
253
+ return lastPiece === botPiece ? depth : -depth;
254
+ if (movesLeft === 0)
255
+ return 0;
256
+ const piece = isMax ? botPiece : (3 - botPiece);
257
+ if (isMax) {
258
+ let best = -Infinity;
259
+ for (let i = 0; i < 9; i++) {
260
+ if (this.board[i] !== 0)
261
+ continue;
262
+ this.board[i] = piece;
263
+ best = Math.max(best, this.minimax(i, piece, false, botPiece, movesLeft - 1, depth - 1, alpha, beta));
264
+ this.board[i] = 0;
265
+ alpha = Math.max(alpha, best);
266
+ if (beta <= alpha)
267
+ break;
268
+ }
269
+ return best;
270
+ }
271
+ let best = Infinity;
272
+ for (let i = 0; i < 9; i++) {
273
+ if (this.board[i] !== 0)
274
+ continue;
275
+ this.board[i] = piece;
276
+ best = Math.min(best, this.minimax(i, piece, true, botPiece, movesLeft - 1, depth - 1, alpha, beta));
277
+ this.board[i] = 0;
278
+ beta = Math.min(beta, best);
279
+ if (beta <= alpha)
280
+ break;
281
+ }
282
+ return best;
283
+ }
284
+ cleanup() {
285
+ if (this.collector) {
286
+ this.collector.stop("cleanup");
287
+ this.collector = null;
288
+ }
289
+ this.manager.cooldowns.delete(this.cooldownKey);
290
+ }
291
+ }
292
+ exports.default = TicTacToe;
293
+ //# sourceMappingURL=TicTacToe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicTacToe.js","sourceRoot":"","sources":["../../src/games/TicTacToe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { default as Connect4 } from "./Connect4";
2
+ export { default as TicTacToe } from "./TicTacToe";
3
+ export { default as RPS } from "./RPS";
4
+ export { default as Hangman } from "./Hangman";
5
+ export { default as Snake } from "./Snake";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/games/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Snake = exports.Hangman = exports.RPS = exports.TicTacToe = exports.Connect4 = void 0;
7
+ var Connect4_1 = require("./Connect4");
8
+ Object.defineProperty(exports, "Connect4", { enumerable: true, get: function () { return __importDefault(Connect4_1).default; } });
9
+ var TicTacToe_1 = require("./TicTacToe");
10
+ Object.defineProperty(exports, "TicTacToe", { enumerable: true, get: function () { return __importDefault(TicTacToe_1).default; } });
11
+ var RPS_1 = require("./RPS");
12
+ Object.defineProperty(exports, "RPS", { enumerable: true, get: function () { return __importDefault(RPS_1).default; } });
13
+ var Hangman_1 = require("./Hangman");
14
+ Object.defineProperty(exports, "Hangman", { enumerable: true, get: function () { return __importDefault(Hangman_1).default; } });
15
+ var Snake_1 = require("./Snake");
16
+ Object.defineProperty(exports, "Snake", { enumerable: true, get: function () { return __importDefault(Snake_1).default; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/games/index.ts"],"names":[],"mappings":";;;;;;AAAA,uCAAiD;AAAxC,qHAAA,OAAO,OAAY;AAC5B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,6BAAuC;AAA9B,2GAAA,OAAO,OAAO;AACvB,qCAA+C;AAAtC,mHAAA,OAAO,OAAW;AAC3B,iCAA2C;AAAlC,+GAAA,OAAO,OAAS"}
@@ -0,0 +1,3 @@
1
+ export * from "./structures/GameManager";
2
+ export * from "./structures/Types";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC"}