@minicode-dev/chat 0.0.0-stage → 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/CHANGELOG.md +24 -0
- package/README.md +123 -2
- package/assets/sounds/battleship_audio_pack/assets/cannon_fire.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/cruiser_damage_alarm.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/defeat.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/ocean_ambient_loop.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/projectile_flyby.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/ship_heavy_hit.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/ship_hit.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/ship_place.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/ship_rotate.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/ship_sinking.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/sonar_ping.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/ui_click.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/victory.ogg +0 -0
- package/assets/sounds/battleship_audio_pack/assets/water_splash.ogg +0 -0
- package/assets/sounds/connect4/close.ogg +0 -0
- package/assets/sounds/connect4/draw.ogg +0 -0
- package/assets/sounds/connect4/drop.ogg +0 -0
- package/assets/sounds/connect4/invite.ogg +0 -0
- package/assets/sounds/connect4/lose.ogg +0 -0
- package/assets/sounds/connect4/start.ogg +0 -0
- package/assets/sounds/connect4/turn.ogg +0 -0
- package/assets/sounds/connect4/win.ogg +0 -0
- package/assets/sounds/notification.mp3 +0 -0
- package/assets/sounds/notification.ogg +0 -0
- package/assets/sounds/ting.mp3 +0 -0
- package/assets/sounds/ting.ogg +0 -0
- package/dist/chunks/BattleshipGameCard-CW_A8Nim.js +958 -0
- package/dist/chunks/BattleshipGameCard-CW_A8Nim.js.map +1 -0
- package/dist/chunks/BattleshipPrototype-Duz-S1JE.js +373 -0
- package/dist/chunks/BattleshipPrototype-Duz-S1JE.js.map +1 -0
- package/dist/chunks/battleship-DXKuIZ1I.js +124 -0
- package/dist/chunks/battleship-DXKuIZ1I.js.map +1 -0
- package/dist/chunks/connect4Sounds-Do3nvVFx.js +1847 -0
- package/dist/chunks/connect4Sounds-Do3nvVFx.js.map +1 -0
- package/dist/chunks/createBattleScene-HIAvjixn.js +1621 -0
- package/dist/chunks/createBattleScene-HIAvjixn.js.map +1 -0
- package/dist/chunks/webglSupport-2WjPEPZ_.js +16 -0
- package/dist/chunks/webglSupport-2WjPEPZ_.js.map +1 -0
- package/dist/index.js +9519 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +2 -0
- package/index.d.ts +470 -0
- package/package.json +66 -4
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
var e = Object.freeze([
|
|
2
|
+
Object.freeze({
|
|
3
|
+
id: "carrier",
|
|
4
|
+
size: 5
|
|
5
|
+
}),
|
|
6
|
+
Object.freeze({
|
|
7
|
+
id: "battleship",
|
|
8
|
+
size: 4
|
|
9
|
+
}),
|
|
10
|
+
Object.freeze({
|
|
11
|
+
id: "cruiser",
|
|
12
|
+
size: 3
|
|
13
|
+
}),
|
|
14
|
+
Object.freeze({
|
|
15
|
+
id: "submarine",
|
|
16
|
+
size: 3
|
|
17
|
+
}),
|
|
18
|
+
Object.freeze({
|
|
19
|
+
id: "destroyer",
|
|
20
|
+
size: 2
|
|
21
|
+
})
|
|
22
|
+
]), t = () => Array.from({ length: 10 }, () => Array(10).fill(null)), n = (e) => ({
|
|
23
|
+
ok: !1,
|
|
24
|
+
reason: e
|
|
25
|
+
});
|
|
26
|
+
function r(e) {
|
|
27
|
+
return e != null && Number.isInteger(e.row) && Number.isInteger(e.col) && e.row >= 0 && e.row < 10 && e.col >= 0 && e.col < 10;
|
|
28
|
+
}
|
|
29
|
+
function i() {
|
|
30
|
+
return {
|
|
31
|
+
grid: t(),
|
|
32
|
+
shots: t(),
|
|
33
|
+
ships: []
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function a(t, i) {
|
|
37
|
+
if (!i || typeof i != "object") return n("invalid_placement");
|
|
38
|
+
let { shipId: a, row: o, col: s, orientation: c } = i, l = e.find((e) => e.id === a);
|
|
39
|
+
if (!l) return n("unknown_ship");
|
|
40
|
+
if (t.ships.some((e) => e.id === a)) return n("already_placed");
|
|
41
|
+
if (c !== "horizontal" && c !== "vertical") return n("invalid_orientation");
|
|
42
|
+
if (!r({
|
|
43
|
+
row: o,
|
|
44
|
+
col: s
|
|
45
|
+
})) return n("out_of_bounds");
|
|
46
|
+
let u = Array.from({ length: l.size }, (e, t) => ({
|
|
47
|
+
row: o + (c === "vertical" ? t : 0),
|
|
48
|
+
col: s + (c === "horizontal" ? t : 0)
|
|
49
|
+
}));
|
|
50
|
+
return u.some((e) => !r(e)) ? n("out_of_bounds") : u.some((e) => t.grid[e.row][e.col] !== null) ? n("overlap") : {
|
|
51
|
+
ok: !0,
|
|
52
|
+
ship: {
|
|
53
|
+
id: a,
|
|
54
|
+
size: l.size,
|
|
55
|
+
orientation: c,
|
|
56
|
+
cells: u
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function o(e, t) {
|
|
61
|
+
let n = a(e, t);
|
|
62
|
+
if (!n.ok) return n;
|
|
63
|
+
let r = e.grid.map((e) => e.slice()), { ship: i } = n;
|
|
64
|
+
for (let e of i.cells) r[e.row][e.col] = i.id;
|
|
65
|
+
return {
|
|
66
|
+
ok: !0,
|
|
67
|
+
board: {
|
|
68
|
+
...e,
|
|
69
|
+
grid: r,
|
|
70
|
+
ships: [...e.ships, i]
|
|
71
|
+
},
|
|
72
|
+
ship: i
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function s(e, t) {
|
|
76
|
+
let r = e.ships.find((e) => e.id === t);
|
|
77
|
+
if (!r) return n("unknown_ship");
|
|
78
|
+
if (e.shots.some((e) => e.some((e) => e !== null))) return n("battle_started");
|
|
79
|
+
let i = e.grid.map((e) => e.slice());
|
|
80
|
+
for (let e of r.cells) i[e.row][e.col] = null;
|
|
81
|
+
return {
|
|
82
|
+
ok: !0,
|
|
83
|
+
board: {
|
|
84
|
+
...e,
|
|
85
|
+
grid: i,
|
|
86
|
+
ships: e.ships.filter((e) => e.id !== t)
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function c(t) {
|
|
91
|
+
return t.ships.length === e.length && e.every((e) => {
|
|
92
|
+
let n = t.ships.find((t) => t.id === e.id);
|
|
93
|
+
return n?.size === e.size && n.cells.length === e.size;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function l(e, t) {
|
|
97
|
+
let n = e.ships.find((e) => e.id === t);
|
|
98
|
+
return !!(n && n.cells.every((t) => e.shots[t.row][t.col] === "hit"));
|
|
99
|
+
}
|
|
100
|
+
function u(e) {
|
|
101
|
+
return c(e) && e.ships.every((t) => l(e, t.id));
|
|
102
|
+
}
|
|
103
|
+
function d(e, t) {
|
|
104
|
+
if (!r(t)) return n("out_of_bounds");
|
|
105
|
+
if (e.shots[t.row][t.col] !== null) return n("repeat_shot");
|
|
106
|
+
if (u(e)) return n("battle_finished");
|
|
107
|
+
let i = e.grid[t.row][t.col], a = i === null ? "miss" : "hit", o = e.shots.map((e) => e.slice());
|
|
108
|
+
o[t.row][t.col] = a;
|
|
109
|
+
let s = {
|
|
110
|
+
...e,
|
|
111
|
+
shots: o
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
114
|
+
ok: !0,
|
|
115
|
+
board: s,
|
|
116
|
+
result: a,
|
|
117
|
+
shipId: i,
|
|
118
|
+
sunk: i !== null && l(s, i),
|
|
119
|
+
defeated: u(s)
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export { c as a, s as c, r as i, a as l, i as n, l as o, d as r, o as s, e as t };
|
|
123
|
+
|
|
124
|
+
//# sourceMappingURL=battleship-DXKuIZ1I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"battleship-DXKuIZ1I.js","names":["FLEET","matrix","fail","isCell","cell","createBoard","validatePlacement","placement","definition","ship","shipId","board","orientation","cells","row","index","col","placeShip","validation","grid","removeShip","item","shot","isFleetComplete","isShipSunk","isFleetSunk","fireShot","result","shots","nextBoard"],"sources":["../../src/games/battleship/logic/board.js"],"sourcesContent":["/** Pure board rules. Coordinates are zero-based { row, col }. Ships may touch. */\nexport const BOARD_SIZE = 10;\nexport const RULES_VERSION = 1;\nexport const FLEET = Object.freeze([\n Object.freeze({ id: 'carrier', size: 5 }),\n Object.freeze({ id: 'battleship', size: 4 }),\n Object.freeze({ id: 'cruiser', size: 3 }),\n Object.freeze({ id: 'submarine', size: 3 }),\n Object.freeze({ id: 'destroyer', size: 2 }),\n]);\nconst matrix = () => Array.from({ length: BOARD_SIZE }, () => Array(BOARD_SIZE).fill(null));\nconst fail = (reason) => ({ ok: false, reason });\n\nexport function isCell(cell) {\n return cell != null && Number.isInteger(cell.row) && Number.isInteger(cell.col)\n && cell.row >= 0 && cell.row < BOARD_SIZE && cell.col >= 0 && cell.col < BOARD_SIZE;\n}\n\nexport function createBoard() {\n return { grid: matrix(), shots: matrix(), ships: [] };\n}\n\nexport function validatePlacement(board, placement) {\n if (!placement || typeof placement !== 'object') return fail('invalid_placement');\n const { shipId, row, col, orientation } = placement;\n const definition = FLEET.find((ship) => ship.id === shipId);\n if (!definition) return fail('unknown_ship');\n if (board.ships.some((ship) => ship.id === shipId)) return fail('already_placed');\n if (orientation !== 'horizontal' && orientation !== 'vertical') return fail('invalid_orientation');\n if (!isCell({ row, col })) return fail('out_of_bounds');\n const cells = Array.from({ length: definition.size }, (_, index) => ({\n row: row + (orientation === 'vertical' ? index : 0),\n col: col + (orientation === 'horizontal' ? index : 0),\n }));\n if (cells.some((cell) => !isCell(cell))) return fail('out_of_bounds');\n if (cells.some((cell) => board.grid[cell.row][cell.col] !== null)) return fail('overlap');\n return { ok: true, ship: { id: shipId, size: definition.size, orientation, cells } };\n}\n\nexport function placeShip(board, placement) {\n const validation = validatePlacement(board, placement);\n if (!validation.ok) return validation;\n const grid = board.grid.map((row) => row.slice());\n const { ship } = validation;\n for (const cell of ship.cells) grid[cell.row][cell.col] = ship.id;\n return { ok: true, board: { ...board, grid, ships: [...board.ships, ship] }, ship };\n}\n\nexport function removeShip(board, shipId) {\n const ship = board.ships.find((item) => item.id === shipId);\n if (!ship) return fail('unknown_ship');\n if (board.shots.some((row) => row.some((shot) => shot !== null))) return fail('battle_started');\n const grid = board.grid.map((row) => row.slice());\n for (const cell of ship.cells) grid[cell.row][cell.col] = null;\n return { ok: true, board: { ...board, grid, ships: board.ships.filter((item) => item.id !== shipId) } };\n}\n\nexport function isFleetComplete(board) {\n return board.ships.length === FLEET.length && FLEET.every((definition) => {\n const ship = board.ships.find((item) => item.id === definition.id);\n return ship?.size === definition.size && ship.cells.length === definition.size;\n });\n}\n\nexport function isShipSunk(board, shipId) {\n const ship = board.ships.find((item) => item.id === shipId);\n return Boolean(ship && ship.cells.every((cell) => board.shots[cell.row][cell.col] === 'hit'));\n}\n\nexport function isFleetSunk(board) {\n return isFleetComplete(board) && board.ships.every((ship) => isShipSunk(board, ship.id));\n}\n\nexport function fireShot(board, cell) {\n if (!isCell(cell)) return fail('out_of_bounds');\n if (board.shots[cell.row][cell.col] !== null) return fail('repeat_shot');\n if (isFleetSunk(board)) return fail('battle_finished');\n const shipId = board.grid[cell.row][cell.col];\n const result = shipId === null ? 'miss' : 'hit';\n const shots = board.shots.map((row) => row.slice());\n shots[cell.row][cell.col] = result;\n const nextBoard = { ...board, shots };\n return {\n ok: true, board: nextBoard, result, shipId,\n sunk: shipId !== null && isShipSunk(nextBoard, shipId),\n defeated: isFleetSunk(nextBoard),\n };\n}\n"],"mappings":"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"}
|