trucoshi 0.0.13 → 0.0.14
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/dist/lib/classes/Player.d.ts +1 -0
- package/dist/lib/classes/Player.js +4 -0
- package/dist/lib/classes/Team.d.ts +1 -0
- package/dist/lib/index.d.ts +4 -6
- package/dist/lib/index.js +36 -19
- package/dist/lib/types.d.ts +9 -5
- package/dist/server/classes/MatchTable.d.ts +21 -0
- package/dist/server/classes/MatchTable.js +48 -0
- package/dist/server/classes/user.d.ts +2 -2
- package/dist/server/classes/user.js +2 -2
- package/dist/server/index.js +240 -29
- package/dist/server/types.d.ts +11 -4
- package/dist/server/types.js +11 -2
- package/dist/test/autoplay.js +7 -7
- package/dist/test/play.js +5 -5
- package/package.json +1 -1
|
@@ -4,12 +4,16 @@ exports.Player = void 0;
|
|
|
4
4
|
function Player(id, teamIdx) {
|
|
5
5
|
var player = {
|
|
6
6
|
id: id,
|
|
7
|
+
session: undefined,
|
|
7
8
|
teamIdx: teamIdx,
|
|
8
9
|
hand: [],
|
|
9
10
|
commands: [],
|
|
10
11
|
usedHand: [],
|
|
11
12
|
disabled: false,
|
|
12
13
|
ready: false,
|
|
14
|
+
setSession: function (session) {
|
|
15
|
+
player.session = session;
|
|
16
|
+
},
|
|
13
17
|
enable: function () {
|
|
14
18
|
player.disabled = false;
|
|
15
19
|
},
|
package/dist/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IPlayInstance, ITeam,
|
|
1
|
+
import { IHand, IPlayInstance, ITeam, ILobby } from "./types";
|
|
2
2
|
export type IWinnerCallback = (winner: ITeam, teams: [ITeam, ITeam]) => Promise<void>;
|
|
3
3
|
export type ITurnCallback = (play: IPlayInstance) => Promise<void>;
|
|
4
4
|
export type ITrucoCallback = (play: IPlayInstance) => Promise<void>;
|
|
@@ -6,13 +6,11 @@ export interface IGameLoop {
|
|
|
6
6
|
_onTruco: ITrucoCallback;
|
|
7
7
|
_onTurn: ITurnCallback;
|
|
8
8
|
_onWinner: IWinnerCallback;
|
|
9
|
+
teams: Array<ITeam>;
|
|
10
|
+
hands: Array<IHand>;
|
|
9
11
|
onTurn: (callback: ITurnCallback) => IGameLoop;
|
|
10
12
|
onWinner: (callback: IWinnerCallback) => IGameLoop;
|
|
11
13
|
onTruco: (callback: ITrucoCallback) => IGameLoop;
|
|
12
14
|
begin: () => void;
|
|
13
15
|
}
|
|
14
|
-
export declare function
|
|
15
|
-
addPlayer: (id: string, teamIdx?: 0 | 1 | undefined) => import("./types").IPlayer;
|
|
16
|
-
removePlayer: (id: string) => ITrucoshi;
|
|
17
|
-
startMatch: (matchPoint?: 9 | 12 | 15 | undefined) => IGameLoop;
|
|
18
|
-
};
|
|
16
|
+
export declare function Lobby(teamSize?: 1 | 2 | 3): ILobby;
|
package/dist/lib/index.js
CHANGED
|
@@ -36,7 +36,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
36
36
|
}
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
39
|
+
exports.Lobby = void 0;
|
|
40
40
|
var Match_1 = require("./classes/Match");
|
|
41
41
|
var Player_1 = require("./classes/Player");
|
|
42
42
|
var Table_1 = require("./classes/Table");
|
|
@@ -48,6 +48,8 @@ var GameLoop = function (match) {
|
|
|
48
48
|
_onTruco: function () { return Promise.resolve(); },
|
|
49
49
|
_onTurn: function () { return Promise.resolve(); },
|
|
50
50
|
_onWinner: function () { return Promise.resolve(); },
|
|
51
|
+
teams: [],
|
|
52
|
+
hands: [],
|
|
51
53
|
onTruco: function (callback) {
|
|
52
54
|
gameloop._onTruco = callback;
|
|
53
55
|
return gameloop;
|
|
@@ -66,25 +68,29 @@ var GameLoop = function (match) {
|
|
|
66
68
|
return __generator(this, function (_a) {
|
|
67
69
|
switch (_a.label) {
|
|
68
70
|
case 0:
|
|
69
|
-
|
|
71
|
+
gameloop.teams = match.teams;
|
|
72
|
+
_a.label = 1;
|
|
73
|
+
case 1:
|
|
74
|
+
if (!!match.winner) return [3 /*break*/, 6];
|
|
70
75
|
play = match.play();
|
|
76
|
+
gameloop.hands = match.hands;
|
|
71
77
|
if (!play || !play.player) {
|
|
72
|
-
return [3 /*break*/,
|
|
78
|
+
return [3 /*break*/, 1];
|
|
73
79
|
}
|
|
74
|
-
if (!(play.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER)) return [3 /*break*/,
|
|
80
|
+
if (!(play.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER)) return [3 /*break*/, 3];
|
|
75
81
|
return [4 /*yield*/, gameloop._onTruco(play)];
|
|
76
|
-
case 1:
|
|
77
|
-
_a.sent();
|
|
78
|
-
return [3 /*break*/, 0];
|
|
79
82
|
case 2:
|
|
80
|
-
|
|
81
|
-
return [
|
|
83
|
+
_a.sent();
|
|
84
|
+
return [3 /*break*/, 1];
|
|
82
85
|
case 3:
|
|
86
|
+
if (!(play.state === types_1.EHandState.WAITING_PLAY)) return [3 /*break*/, 5];
|
|
87
|
+
return [4 /*yield*/, gameloop._onTurn(play)];
|
|
88
|
+
case 4:
|
|
83
89
|
_a.sent();
|
|
84
|
-
return [3 /*break*/,
|
|
85
|
-
case
|
|
86
|
-
case
|
|
87
|
-
case
|
|
90
|
+
return [3 /*break*/, 1];
|
|
91
|
+
case 5: return [3 /*break*/, 1];
|
|
92
|
+
case 6: return [4 /*yield*/, gameloop._onWinner(match.winner, match.teams)];
|
|
93
|
+
case 7:
|
|
88
94
|
_a.sent();
|
|
89
95
|
return [2 /*return*/];
|
|
90
96
|
}
|
|
@@ -94,7 +100,7 @@ var GameLoop = function (match) {
|
|
|
94
100
|
};
|
|
95
101
|
return gameloop;
|
|
96
102
|
};
|
|
97
|
-
function
|
|
103
|
+
function Lobby(teamSize) {
|
|
98
104
|
var trucoshi = {
|
|
99
105
|
lastTeamIdx: 1,
|
|
100
106
|
_players: new Map(),
|
|
@@ -106,6 +112,7 @@ function Trucoshi(teamSize) {
|
|
|
106
112
|
maxPlayers: teamSize ? teamSize * 2 : 6,
|
|
107
113
|
full: false,
|
|
108
114
|
ready: false,
|
|
115
|
+
gameLoop: undefined,
|
|
109
116
|
calculateReady: function () {
|
|
110
117
|
trucoshi.ready = trucoshi.players.reduce(function (prev, curr) { return prev && curr.ready; }, true);
|
|
111
118
|
return trucoshi.ready;
|
|
@@ -114,12 +121,13 @@ function Trucoshi(teamSize) {
|
|
|
114
121
|
trucoshi.full = trucoshi._players.size >= trucoshi.maxPlayers;
|
|
115
122
|
return trucoshi.full;
|
|
116
123
|
},
|
|
117
|
-
addPlayer: function (id, teamIdx) {
|
|
124
|
+
addPlayer: function (id, session, teamIdx) {
|
|
118
125
|
var maxSize = teamSize ? teamSize : 3;
|
|
119
126
|
if (trucoshi.full || trucoshi.players.filter(function (p) { return p.teamIdx === teamIdx; }).length > maxSize) {
|
|
120
127
|
throw new Error(constants_1.GAME_ERROR.TEAM_IS_FULL);
|
|
121
128
|
}
|
|
122
129
|
var player = (0, Player_1.Player)(id, teamIdx !== undefined ? teamIdx : Number(!trucoshi.lastTeamIdx));
|
|
130
|
+
player.setSession(session);
|
|
123
131
|
trucoshi.lastTeamIdx = Number(!trucoshi.lastTeamIdx);
|
|
124
132
|
trucoshi._players.set(id, player);
|
|
125
133
|
trucoshi.calculateFull();
|
|
@@ -142,20 +150,29 @@ function Trucoshi(teamSize) {
|
|
|
142
150
|
if (!trucoshi.ready) {
|
|
143
151
|
throw new Error(constants_1.GAME_ERROR.TEAM_NOT_READY);
|
|
144
152
|
}
|
|
145
|
-
trucoshi.teams
|
|
146
|
-
|
|
153
|
+
trucoshi.teams = [
|
|
154
|
+
(0, Team_1.Team)(trucoshi.players.filter(function (p) { return p.teamIdx === 0; })),
|
|
155
|
+
(0, Team_1.Team)(trucoshi.players.filter(function (p) { return p.teamIdx === 1; })),
|
|
156
|
+
];
|
|
147
157
|
if (trucoshi.teams[0].players.length !== teamSize ||
|
|
148
158
|
trucoshi.teams[1].players.length !== teamSize) {
|
|
149
159
|
throw new Error(constants_1.GAME_ERROR.UNEXPECTED_TEAM_SIZE);
|
|
150
160
|
}
|
|
151
161
|
trucoshi.table = (0, Table_1.Table)(trucoshi.players, trucoshi.teams);
|
|
152
|
-
|
|
162
|
+
trucoshi.gameLoop = GameLoop((0, Match_1.Match)(trucoshi.table, trucoshi.teams, matchPoint));
|
|
163
|
+
return trucoshi.gameLoop;
|
|
153
164
|
},
|
|
154
165
|
};
|
|
155
166
|
return {
|
|
156
167
|
addPlayer: trucoshi.addPlayer,
|
|
157
168
|
removePlayer: trucoshi.removePlayer,
|
|
158
169
|
startMatch: trucoshi.startMatch,
|
|
170
|
+
teams: trucoshi.teams,
|
|
171
|
+
get players() {
|
|
172
|
+
return Array.from(trucoshi._players.values());
|
|
173
|
+
},
|
|
174
|
+
full: trucoshi.full,
|
|
175
|
+
ready: trucoshi.ready,
|
|
159
176
|
};
|
|
160
177
|
}
|
|
161
|
-
exports.
|
|
178
|
+
exports.Lobby = Lobby;
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { IGameLoop } from ".";
|
|
2
|
+
import { IPublicPlayer } from "./classes/Player";
|
|
2
3
|
import { CARDS } from "./constants";
|
|
3
4
|
export type ICard = keyof typeof CARDS;
|
|
4
5
|
export interface IDeck {
|
|
@@ -8,17 +9,19 @@ export interface IDeck {
|
|
|
8
9
|
shuffle(): IDeck;
|
|
9
10
|
}
|
|
10
11
|
export interface IPlayedCard {
|
|
11
|
-
player: IPlayer;
|
|
12
|
+
player: IPlayer & IPublicPlayer;
|
|
12
13
|
card: ICard;
|
|
13
14
|
}
|
|
14
15
|
export interface IPlayer {
|
|
15
16
|
teamIdx: number;
|
|
16
17
|
id: string;
|
|
18
|
+
session?: string;
|
|
17
19
|
hand: Array<ICard>;
|
|
18
20
|
commands: Array<ECommand>;
|
|
19
21
|
usedHand: Array<ICard>;
|
|
20
22
|
disabled: boolean;
|
|
21
23
|
ready: boolean;
|
|
24
|
+
setSession(session: string): void;
|
|
22
25
|
enable(): void;
|
|
23
26
|
disable(): void;
|
|
24
27
|
setReady(ready: boolean): void;
|
|
@@ -144,7 +147,8 @@ export interface IHand {
|
|
|
144
147
|
setState(state: EHandState): EHandState;
|
|
145
148
|
getNextPlayer(): IteratorResult<IHand, IHand | void>;
|
|
146
149
|
}
|
|
147
|
-
export interface
|
|
150
|
+
export interface IPrivateLobby {
|
|
151
|
+
gameLoop?: IGameLoop;
|
|
148
152
|
lastTeamIdx: 0 | 1;
|
|
149
153
|
_players: Map<string, IPlayer>;
|
|
150
154
|
get players(): Array<IPlayer>;
|
|
@@ -153,13 +157,13 @@ export interface IPrivateTrucoshi {
|
|
|
153
157
|
table: ITable | null;
|
|
154
158
|
ready: boolean;
|
|
155
159
|
full: boolean;
|
|
156
|
-
addPlayer(id: string, teamIdx?: 0 | 1): IPlayer;
|
|
157
|
-
removePlayer(id: string):
|
|
160
|
+
addPlayer(id: string, session: string, teamIdx?: 0 | 1): IPlayer;
|
|
161
|
+
removePlayer(id: string): ILobby;
|
|
158
162
|
calculateReady(): boolean;
|
|
159
163
|
calculateFull(): boolean;
|
|
160
164
|
startMatch(matchPoint?: 9 | 12 | 15): IGameLoop;
|
|
161
165
|
}
|
|
162
|
-
export interface
|
|
166
|
+
export interface ILobby extends Pick<IPrivateLobby, "addPlayer" | "removePlayer" | "startMatch" | "ready" | "full" | "teams" | "players" | "gameLoop"> {
|
|
163
167
|
}
|
|
164
168
|
export interface ITable {
|
|
165
169
|
forehandIdx: number;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { IPublicPlayer } from "../../lib/classes/Player";
|
|
2
|
+
import { IPublicTeam } from "../../lib/classes/Team";
|
|
3
|
+
import { ILobby, IPlayedCard } from "../../lib/types";
|
|
4
|
+
export interface IPublicMatch {
|
|
5
|
+
teams: Array<IPublicTeam>;
|
|
6
|
+
players: Array<IPublicPlayer>;
|
|
7
|
+
hands: Array<Array<Array<IPlayedCard>>>;
|
|
8
|
+
}
|
|
9
|
+
export interface IMatchTable {
|
|
10
|
+
matchSessionId: string;
|
|
11
|
+
lobby: ILobby;
|
|
12
|
+
state: EMatchTableState;
|
|
13
|
+
setState(state: EMatchTableState): void;
|
|
14
|
+
getPublicMatch(session?: string): IPublicMatch;
|
|
15
|
+
}
|
|
16
|
+
export declare enum EMatchTableState {
|
|
17
|
+
UNREADY = 0,
|
|
18
|
+
STARTED = 1,
|
|
19
|
+
FINISHED = 2
|
|
20
|
+
}
|
|
21
|
+
export declare function MatchTable(matchSessionId: string, teamSize?: 1 | 2 | 3): IMatchTable;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.MatchTable = exports.EMatchTableState = void 0;
|
|
15
|
+
var lib_1 = require("../../lib");
|
|
16
|
+
var EMatchTableState;
|
|
17
|
+
(function (EMatchTableState) {
|
|
18
|
+
EMatchTableState[EMatchTableState["UNREADY"] = 0] = "UNREADY";
|
|
19
|
+
EMatchTableState[EMatchTableState["STARTED"] = 1] = "STARTED";
|
|
20
|
+
EMatchTableState[EMatchTableState["FINISHED"] = 2] = "FINISHED";
|
|
21
|
+
})(EMatchTableState = exports.EMatchTableState || (exports.EMatchTableState = {}));
|
|
22
|
+
function MatchTable(matchSessionId, teamSize) {
|
|
23
|
+
var matchTable = {
|
|
24
|
+
matchSessionId: matchSessionId,
|
|
25
|
+
lobby: (0, lib_1.Lobby)(teamSize),
|
|
26
|
+
state: EMatchTableState.UNREADY,
|
|
27
|
+
setState: function (state) {
|
|
28
|
+
matchTable.state = state;
|
|
29
|
+
},
|
|
30
|
+
getPublicMatch: function (userSession) {
|
|
31
|
+
var _a;
|
|
32
|
+
console.log(matchTable.lobby.gameLoop);
|
|
33
|
+
return {
|
|
34
|
+
matchSessionId: matchSessionId,
|
|
35
|
+
teams: [],
|
|
36
|
+
players: matchTable.lobby.players.map(function (player) {
|
|
37
|
+
return player.session === userSession
|
|
38
|
+
? player
|
|
39
|
+
: __assign(__assign({}, player), { hand: player.hand.map(function () { return "xx"; }) });
|
|
40
|
+
}),
|
|
41
|
+
hands: ((_a = matchTable.lobby.gameLoop) === null || _a === void 0 ? void 0 : _a.hands.map(function (hand) { return hand.rounds.map(function (round) { return round.cards; }); })) ||
|
|
42
|
+
[],
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
return matchTable;
|
|
47
|
+
}
|
|
48
|
+
exports.MatchTable = MatchTable;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.User = void 0;
|
|
4
|
-
function User(id,
|
|
4
|
+
function User(id, socketId) {
|
|
5
5
|
var user = {
|
|
6
6
|
id: id,
|
|
7
|
-
|
|
7
|
+
socketId: socketId,
|
|
8
8
|
};
|
|
9
9
|
return user;
|
|
10
10
|
}
|
package/dist/server/index.js
CHANGED
|
@@ -1,9 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
2
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
39
|
var crypto_1 = require("crypto");
|
|
4
40
|
var http_1 = require("http");
|
|
5
41
|
var socket_io_1 = require("socket.io");
|
|
6
|
-
var
|
|
42
|
+
var MatchTable_1 = require("./classes/MatchTable");
|
|
7
43
|
var user_1 = require("./classes/user");
|
|
8
44
|
var types_1 = require("./types");
|
|
9
45
|
var PORT = 4001;
|
|
@@ -14,48 +50,223 @@ var io = new socket_io_1.Server(httpServer, {
|
|
|
14
50
|
methods: ["GET", "POST"],
|
|
15
51
|
},
|
|
16
52
|
});
|
|
17
|
-
var
|
|
18
|
-
var tables = new Map();
|
|
19
|
-
var
|
|
53
|
+
var users = new Map(); // sessionId, user
|
|
54
|
+
var tables = new Map(); // sessionId, table
|
|
55
|
+
var getUser = function (session) {
|
|
56
|
+
var user = users.get(session);
|
|
57
|
+
if (user) {
|
|
58
|
+
return user;
|
|
59
|
+
}
|
|
60
|
+
throw new Error("User not found");
|
|
61
|
+
};
|
|
62
|
+
var getTable = function (matchSessionId) {
|
|
63
|
+
var table = tables.get(matchSessionId);
|
|
64
|
+
if (table) {
|
|
65
|
+
return table;
|
|
66
|
+
}
|
|
67
|
+
throw new Error("Match Session not found");
|
|
68
|
+
};
|
|
20
69
|
io.on("connection", function (_socket) {
|
|
21
70
|
var socket = _socket;
|
|
71
|
+
console.error("New connection");
|
|
72
|
+
var getTableSockets = function (table, callback) {
|
|
73
|
+
return new Promise(function (resolve) { return __awaiter(void 0, void 0, void 0, function () {
|
|
74
|
+
var sockets, _i, sockets_1, socket_1;
|
|
75
|
+
return __generator(this, function (_a) {
|
|
76
|
+
switch (_a.label) {
|
|
77
|
+
case 0: return [4 /*yield*/, io.sockets.adapter.fetchSockets({
|
|
78
|
+
rooms: new Set([table.matchSessionId]),
|
|
79
|
+
})];
|
|
80
|
+
case 1:
|
|
81
|
+
sockets = _a.sent();
|
|
82
|
+
_i = 0, sockets_1 = sockets;
|
|
83
|
+
_a.label = 2;
|
|
84
|
+
case 2:
|
|
85
|
+
if (!(_i < sockets_1.length)) return [3 /*break*/, 5];
|
|
86
|
+
socket_1 = sockets_1[_i];
|
|
87
|
+
return [4 /*yield*/, callback(socket_1)];
|
|
88
|
+
case 3:
|
|
89
|
+
_a.sent();
|
|
90
|
+
_a.label = 4;
|
|
91
|
+
case 4:
|
|
92
|
+
_i++;
|
|
93
|
+
return [3 /*break*/, 2];
|
|
94
|
+
case 5:
|
|
95
|
+
resolve();
|
|
96
|
+
return [2 /*return*/];
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}); });
|
|
100
|
+
};
|
|
101
|
+
var emitMatchUpdate = function (table) {
|
|
102
|
+
table.lobby.players.map(function (player) {
|
|
103
|
+
var user = users.get(player.session);
|
|
104
|
+
if (user && user.socketId) {
|
|
105
|
+
io.to(user.socketId).emit(types_1.EServerEvent.UPDATE_MATCH, table.getPublicMatch(player.session));
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
};
|
|
22
109
|
socket.on(types_1.EClientEvent.PING, function (msg) {
|
|
23
110
|
socket.emit(types_1.EServerEvent.PONG, msg);
|
|
24
111
|
});
|
|
112
|
+
/**
|
|
113
|
+
* Create Match
|
|
114
|
+
*/
|
|
25
115
|
socket.on(types_1.EClientEvent.CREATE_MATCH, function (callback) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
var
|
|
29
|
-
|
|
30
|
-
|
|
116
|
+
if (socket.session) {
|
|
117
|
+
var user = getUser(socket.session);
|
|
118
|
+
var existingTable = tables.get(socket.session);
|
|
119
|
+
if (existingTable) {
|
|
120
|
+
return callback({
|
|
121
|
+
success: false,
|
|
122
|
+
match: existingTable.getPublicMatch(socket.session),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
var table = (0, MatchTable_1.MatchTable)(socket.session);
|
|
127
|
+
table.lobby.addPlayer(user.id, socket.session);
|
|
128
|
+
tables.set(socket.session, table);
|
|
129
|
+
console.log("creating match", socket.session, table.state);
|
|
130
|
+
return callback({ success: true, match: table.getPublicMatch(user.id) });
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
console.error("ERROR", e);
|
|
134
|
+
return callback({ success: false, error: e });
|
|
135
|
+
}
|
|
31
136
|
}
|
|
32
|
-
callback({ success: false });
|
|
137
|
+
callback({ success: false, error: new Error("Can't create match without an ID") });
|
|
33
138
|
});
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
139
|
+
/**
|
|
140
|
+
* Start Match
|
|
141
|
+
*/
|
|
142
|
+
socket.on(types_1.EClientEvent.START_MATCH, function (callback) {
|
|
143
|
+
if (socket.session && users.has(socket.session)) {
|
|
144
|
+
try {
|
|
145
|
+
var table_1 = getTable(socket.session);
|
|
146
|
+
if (table_1 && !table_1.lobby.gameLoop) {
|
|
147
|
+
table_1.setState(MatchTable_1.EMatchTableState.STARTED);
|
|
148
|
+
var game = table_1.lobby
|
|
149
|
+
.startMatch()
|
|
150
|
+
.onTurn(function (play) { return __awaiter(void 0, void 0, void 0, function () {
|
|
151
|
+
var session, user;
|
|
152
|
+
var _a;
|
|
153
|
+
return __generator(this, function (_b) {
|
|
154
|
+
switch (_b.label) {
|
|
155
|
+
case 0: return [4 /*yield*/, getTableSockets(table_1, function (socket) { return __awaiter(void 0, void 0, void 0, function () {
|
|
156
|
+
return __generator(this, function (_a) {
|
|
157
|
+
socket.emit(types_1.EServerEvent.UPDATE_MATCH, table_1.getPublicMatch(socket.session));
|
|
158
|
+
return [2 /*return*/];
|
|
159
|
+
});
|
|
160
|
+
}); })];
|
|
161
|
+
case 1:
|
|
162
|
+
_b.sent();
|
|
163
|
+
session = (_a = play.player) === null || _a === void 0 ? void 0 : _a.session;
|
|
164
|
+
if (!session) {
|
|
165
|
+
throw new Error("Unexpected Error");
|
|
166
|
+
}
|
|
167
|
+
user = users.get(session);
|
|
168
|
+
if (!user) {
|
|
169
|
+
throw new Error("Unexpected Error");
|
|
170
|
+
}
|
|
171
|
+
return [4 /*yield*/, getTableSockets(table_1, function (socket) {
|
|
172
|
+
return new Promise(function (resolve) {
|
|
173
|
+
if (socket.session === session) {
|
|
174
|
+
socket.emit(types_1.EServerEvent.UPDATE_MATCH, table_1.getPublicMatch(session));
|
|
175
|
+
socket.on(types_1.EClientEvent.PLAY, function () {
|
|
176
|
+
resolve();
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
})];
|
|
181
|
+
case 2:
|
|
182
|
+
_b.sent();
|
|
183
|
+
return [2 /*return*/];
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}); })
|
|
187
|
+
.onTruco(function (play) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
188
|
+
return [2 /*return*/];
|
|
189
|
+
}); }); })
|
|
190
|
+
.onWinner(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
191
|
+
return [2 /*return*/];
|
|
192
|
+
}); }); })
|
|
193
|
+
.begin();
|
|
194
|
+
emitMatchUpdate(table_1);
|
|
195
|
+
return callback({ success: true, match: table_1.getPublicMatch(socket.session) });
|
|
196
|
+
}
|
|
197
|
+
console.error("ASL:KDJALSk");
|
|
198
|
+
callback({ success: false, match: table_1.getPublicMatch(socket.session) });
|
|
199
|
+
}
|
|
200
|
+
catch (e) {
|
|
201
|
+
console.error("ERROR", e);
|
|
202
|
+
callback({ success: false, error: e });
|
|
40
203
|
}
|
|
41
204
|
}
|
|
42
205
|
});
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
206
|
+
/**
|
|
207
|
+
* Join Match
|
|
208
|
+
*/
|
|
209
|
+
socket.on(types_1.EClientEvent.JOIN_MATCH, function (matchSessionId, callback) {
|
|
210
|
+
if (!socket.session) {
|
|
211
|
+
return callback({ success: false });
|
|
212
|
+
}
|
|
213
|
+
var user = getUser(socket.session);
|
|
214
|
+
var table = tables.get(matchSessionId);
|
|
215
|
+
if (table && table.state === MatchTable_1.EMatchTableState.UNREADY) {
|
|
216
|
+
table.lobby.addPlayer(user.id || "satoshi", socket.session);
|
|
217
|
+
emitMatchUpdate(table);
|
|
218
|
+
return callback({ success: true, match: table.getPublicMatch(socket.session) });
|
|
48
219
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
220
|
+
callback({ success: false });
|
|
221
|
+
});
|
|
222
|
+
/**
|
|
223
|
+
* Get Match
|
|
224
|
+
*/
|
|
225
|
+
socket.on(types_1.EClientEvent.GET_MATCH, function (matchSessionId, callback) {
|
|
226
|
+
var table = tables.get(matchSessionId);
|
|
227
|
+
if (table) {
|
|
228
|
+
return callback({ success: true, match: table.getPublicMatch(socket.session) });
|
|
229
|
+
}
|
|
230
|
+
callback({ success: false });
|
|
231
|
+
});
|
|
232
|
+
/**
|
|
233
|
+
* Set Session
|
|
234
|
+
*/
|
|
235
|
+
socket.on(types_1.EClientEvent.SET_SESSION, function (session, id, callback) {
|
|
236
|
+
if (id === void 0) { id = "satoshi"; }
|
|
237
|
+
var user = users.get(session);
|
|
238
|
+
if (user) {
|
|
239
|
+
var updatedUser = {
|
|
240
|
+
id: id,
|
|
241
|
+
socketId: socket.id,
|
|
242
|
+
};
|
|
243
|
+
users.set(session, updatedUser);
|
|
244
|
+
socket.session = session;
|
|
245
|
+
return callback({ success: true, session: session });
|
|
54
246
|
}
|
|
55
247
|
var newSession = (0, crypto_1.randomUUID)();
|
|
56
|
-
socket.
|
|
57
|
-
|
|
58
|
-
|
|
248
|
+
socket.session = newSession;
|
|
249
|
+
users.set(newSession, (0, user_1.User)(id, socket.id));
|
|
250
|
+
callback({ success: true, session: newSession });
|
|
251
|
+
});
|
|
252
|
+
/**
|
|
253
|
+
* Set Player Ready
|
|
254
|
+
*/
|
|
255
|
+
socket.on(types_1.EClientEvent.SET_PLAYER_READY, function (matchSessionId, ready) {
|
|
256
|
+
try {
|
|
257
|
+
var table = getTable(matchSessionId);
|
|
258
|
+
var player = table.lobby.players.find(function (player) { return player.session === socket.session; });
|
|
259
|
+
if (player) {
|
|
260
|
+
player.setReady(ready);
|
|
261
|
+
if (ready) {
|
|
262
|
+
socket.join(matchSessionId);
|
|
263
|
+
}
|
|
264
|
+
emitMatchUpdate(table);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch (e) {
|
|
268
|
+
console.error("ERROR", e);
|
|
269
|
+
}
|
|
59
270
|
});
|
|
60
271
|
});
|
|
61
272
|
httpServer.listen(PORT);
|
package/dist/server/types.d.ts
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import { Socket } from "socket.io";
|
|
2
|
-
import { IUser } from "./classes/user";
|
|
3
2
|
export declare enum EClientEvent {
|
|
4
3
|
PING = "PING",
|
|
4
|
+
PLAY = "PLAY",
|
|
5
5
|
CREATE_MATCH = "CREATE_MATCH",
|
|
6
|
+
GET_MATCH = "GET_MATCH",
|
|
6
7
|
JOIN_MATCH = "JOIN_MATCH",
|
|
7
8
|
START_MATCH = "START_MATCH",
|
|
8
|
-
|
|
9
|
+
SET_PLAYER_READY = "SET_PLAYER_READY",
|
|
9
10
|
SET_SESSION = "SET_SESSION"
|
|
10
11
|
}
|
|
11
12
|
export declare enum EServerEvent {
|
|
12
|
-
PONG = "PONG"
|
|
13
|
+
PONG = "PONG",
|
|
14
|
+
UPDATE_MATCH = "UPDATE_MATCH"
|
|
13
15
|
}
|
|
14
16
|
export interface TrucoshiSocket extends Socket {
|
|
15
|
-
|
|
17
|
+
session?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare enum ETrucoshiMatchState {
|
|
20
|
+
UNREADY = 0,
|
|
21
|
+
STARTED = 1,
|
|
22
|
+
FINISHED = 2
|
|
16
23
|
}
|
package/dist/server/types.js
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EServerEvent = exports.EClientEvent = void 0;
|
|
3
|
+
exports.ETrucoshiMatchState = exports.EServerEvent = exports.EClientEvent = void 0;
|
|
4
4
|
var EClientEvent;
|
|
5
5
|
(function (EClientEvent) {
|
|
6
6
|
EClientEvent["PING"] = "PING";
|
|
7
|
+
EClientEvent["PLAY"] = "PLAY";
|
|
7
8
|
EClientEvent["CREATE_MATCH"] = "CREATE_MATCH";
|
|
9
|
+
EClientEvent["GET_MATCH"] = "GET_MATCH";
|
|
8
10
|
EClientEvent["JOIN_MATCH"] = "JOIN_MATCH";
|
|
9
11
|
EClientEvent["START_MATCH"] = "START_MATCH";
|
|
10
|
-
EClientEvent["
|
|
12
|
+
EClientEvent["SET_PLAYER_READY"] = "SET_PLAYER_READY";
|
|
11
13
|
EClientEvent["SET_SESSION"] = "SET_SESSION";
|
|
12
14
|
})(EClientEvent = exports.EClientEvent || (exports.EClientEvent = {}));
|
|
13
15
|
var EServerEvent;
|
|
14
16
|
(function (EServerEvent) {
|
|
15
17
|
EServerEvent["PONG"] = "PONG";
|
|
18
|
+
EServerEvent["UPDATE_MATCH"] = "UPDATE_MATCH";
|
|
16
19
|
})(EServerEvent = exports.EServerEvent || (exports.EServerEvent = {}));
|
|
20
|
+
var ETrucoshiMatchState;
|
|
21
|
+
(function (ETrucoshiMatchState) {
|
|
22
|
+
ETrucoshiMatchState[ETrucoshiMatchState["UNREADY"] = 0] = "UNREADY";
|
|
23
|
+
ETrucoshiMatchState[ETrucoshiMatchState["STARTED"] = 1] = "STARTED";
|
|
24
|
+
ETrucoshiMatchState[ETrucoshiMatchState["FINISHED"] = 2] = "FINISHED";
|
|
25
|
+
})(ETrucoshiMatchState = exports.ETrucoshiMatchState || (exports.ETrucoshiMatchState = {}));
|
package/dist/test/autoplay.js
CHANGED
|
@@ -40,13 +40,13 @@ var lib_1 = require("../lib");
|
|
|
40
40
|
(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
41
41
|
var trucoshi;
|
|
42
42
|
return __generator(this, function (_a) {
|
|
43
|
-
trucoshi = (0, lib_1.
|
|
44
|
-
trucoshi.addPlayer("lukini").setReady(true);
|
|
45
|
-
trucoshi.addPlayer("denoph").setReady(true);
|
|
46
|
-
trucoshi.addPlayer("guada").setReady(true);
|
|
47
|
-
trucoshi.addPlayer("juli").setReady(true);
|
|
48
|
-
trucoshi.addPlayer("day").setReady(true);
|
|
49
|
-
trucoshi.addPlayer("fran").setReady(true);
|
|
43
|
+
trucoshi = (0, lib_1.Lobby)();
|
|
44
|
+
trucoshi.addPlayer("lukini", "lukini").setReady(true);
|
|
45
|
+
trucoshi.addPlayer("denoph", "denoph").setReady(true);
|
|
46
|
+
trucoshi.addPlayer("guada", "guada").setReady(true);
|
|
47
|
+
trucoshi.addPlayer("juli", "juli").setReady(true);
|
|
48
|
+
trucoshi.addPlayer("day", "day").setReady(true);
|
|
49
|
+
trucoshi.addPlayer("fran", "fran").setReady(true);
|
|
50
50
|
trucoshi
|
|
51
51
|
.startMatch()
|
|
52
52
|
.onTurn(function (play) { return __awaiter(void 0, void 0, void 0, function () {
|
package/dist/test/play.js
CHANGED
|
@@ -158,11 +158,11 @@ var sayCommand = function (play, canPlay) {
|
|
|
158
158
|
(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
159
159
|
var trucoshi;
|
|
160
160
|
return __generator(this, function (_a) {
|
|
161
|
-
trucoshi = (0, lib_1.
|
|
162
|
-
trucoshi.addPlayer("lukini",
|
|
163
|
-
trucoshi.addPlayer("
|
|
164
|
-
trucoshi.addPlayer("
|
|
165
|
-
trucoshi.addPlayer("juli",
|
|
161
|
+
trucoshi = (0, lib_1.Lobby)();
|
|
162
|
+
trucoshi.addPlayer("lukini", "lukini").setReady(true);
|
|
163
|
+
trucoshi.addPlayer("denoph", "denoph").setReady(true);
|
|
164
|
+
trucoshi.addPlayer("guada", "guada").setReady(true);
|
|
165
|
+
trucoshi.addPlayer("juli", "juli").setReady(true);
|
|
166
166
|
trucoshi
|
|
167
167
|
.startMatch()
|
|
168
168
|
.onTruco(function (play) { return __awaiter(void 0, void 0, void 0, function () {
|