blueversusraid 0.2.1 → 0.2.3
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/index.js +118 -0
- package/models/players.d.ts +16 -0
- package/models/players.d.ts.map +1 -0
- package/models/players.js +30 -0
- package/models/players.js.map +1 -0
- package/models/roles.d.ts +27 -0
- package/models/roles.d.ts.map +1 -0
- package/models/roles.js +51 -0
- package/models/roles.js.map +1 -0
- package/models/rules.d.ts +12 -0
- package/models/rules.d.ts.map +1 -0
- package/models/rules.js +2 -0
- package/models/rules.js.map +1 -0
- package/package.json +6 -6
- package/types/events.d.ts +9 -0
- package/types/events.d.ts.map +1 -0
- package/types/events.js +2 -0
- package/types/events.js.map +1 -0
- package/types/players.d.ts +16 -0
- package/types/players.d.ts.map +1 -0
- package/types/players.js +30 -0
- package/types/players.js.map +1 -0
- package/types/roles.d.ts +27 -0
- package/types/roles.d.ts.map +1 -0
- package/types/roles.js +51 -0
- package/types/roles.js.map +1 -0
- package/types/rules.d.ts +12 -0
- package/types/rules.d.ts.map +1 -0
- package/types/rules.js +2 -0
- package/types/rules.js.map +1 -0
package/index.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Role } from "./models/roles.js";
|
|
2
|
+
import { Player } from "./models/players.js";
|
|
3
|
+
export class Game {
|
|
4
|
+
id;
|
|
5
|
+
roles = [];
|
|
6
|
+
teams = [
|
|
7
|
+
{
|
|
8
|
+
name: "Rouges",
|
|
9
|
+
description: "Vous êtes les méchants.",
|
|
10
|
+
solo: false,
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: "Bleus",
|
|
14
|
+
description: "Vous êtes les gentils.",
|
|
15
|
+
solo: false,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: "Solitaires",
|
|
19
|
+
description: "Vous jouez seul contre tous.",
|
|
20
|
+
solo: true,
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
cycle = 0;
|
|
24
|
+
iteration = 0;
|
|
25
|
+
phases = [];
|
|
26
|
+
current_phases = [];
|
|
27
|
+
players = [];
|
|
28
|
+
running = false;
|
|
29
|
+
winner = null;
|
|
30
|
+
constructor(id) {
|
|
31
|
+
this.id = id || Math.random();
|
|
32
|
+
}
|
|
33
|
+
async iterate() {
|
|
34
|
+
if (this.iteration > this.phases.length - 1) {
|
|
35
|
+
this.cycle += 1;
|
|
36
|
+
this.iteration = 0;
|
|
37
|
+
}
|
|
38
|
+
const executed = [];
|
|
39
|
+
for (const turn of this.phases[this.iteration]) {
|
|
40
|
+
if (turn.cycle instanceof Array) {
|
|
41
|
+
if (!turn.cycle.includes(this.cycle))
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const { start, end, step } = turn.cycle;
|
|
46
|
+
const notAligned = this.cycle % step !== start;
|
|
47
|
+
const beforeStart = this.cycle < start;
|
|
48
|
+
const afterEnd = end !== -1 && this.cycle > end;
|
|
49
|
+
if (notAligned || beforeStart || afterEnd) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
executed.push(turn);
|
|
54
|
+
}
|
|
55
|
+
this.current_phases = executed;
|
|
56
|
+
for (const turn of executed) {
|
|
57
|
+
await Promise.all(this.players.map(async (player) => {
|
|
58
|
+
const timeout = new Promise((resolve) => {
|
|
59
|
+
setTimeout(() => {
|
|
60
|
+
void player.endCall();
|
|
61
|
+
resolve(null);
|
|
62
|
+
}, turn.duration * 1000);
|
|
63
|
+
});
|
|
64
|
+
const callback = await Promise.race([
|
|
65
|
+
player.call(turn),
|
|
66
|
+
timeout,
|
|
67
|
+
]);
|
|
68
|
+
if (callback) {
|
|
69
|
+
callback();
|
|
70
|
+
}
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
let _teams = new Set();
|
|
74
|
+
for (const player of this.players) {
|
|
75
|
+
if (player.team)
|
|
76
|
+
_teams.add(player.team);
|
|
77
|
+
}
|
|
78
|
+
if (_teams.size === 1) {
|
|
79
|
+
const winner = _teams.values().next().value;
|
|
80
|
+
if (!winner.solo || this.players.length === 1) {
|
|
81
|
+
await this.win(winner);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
this.iteration += 1;
|
|
85
|
+
}
|
|
86
|
+
async startLoop() {
|
|
87
|
+
let sleeps = this.phases.map((phase) => Math.max(...phase.map((turn) => turn.duration)));
|
|
88
|
+
while (this.players.length > 0 && !this.winner) {
|
|
89
|
+
await this.iterate();
|
|
90
|
+
await new Promise((_) => {
|
|
91
|
+
setTimeout(_, sleeps[this.iteration]);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async onEnd(callback) {
|
|
96
|
+
while (!this.winner) {
|
|
97
|
+
await new Promise((_) => setTimeout(_, 50));
|
|
98
|
+
}
|
|
99
|
+
this.running = false;
|
|
100
|
+
callback(this.winner);
|
|
101
|
+
}
|
|
102
|
+
async kill(author, target, phase) {
|
|
103
|
+
await target.die(author, phase);
|
|
104
|
+
for (const player of this.players) {
|
|
105
|
+
await player.triggerEvent({
|
|
106
|
+
type: "death",
|
|
107
|
+
author,
|
|
108
|
+
target,
|
|
109
|
+
phase,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async win(winner) {
|
|
114
|
+
this.winner = winner;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export { Role, Player };
|
|
118
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { GameEvent } from "../types/events.js";
|
|
2
|
+
import { Role, Team } from "./roles.js";
|
|
3
|
+
import { Phase } from "./rules.js";
|
|
4
|
+
export declare class Player {
|
|
5
|
+
id: number;
|
|
6
|
+
role: Role | null;
|
|
7
|
+
team: Team | null;
|
|
8
|
+
dead: boolean;
|
|
9
|
+
state: Record<string, boolean>;
|
|
10
|
+
constructor(id?: number, role?: Role);
|
|
11
|
+
call(phase: Phase): Promise<() => void>;
|
|
12
|
+
endCall(): Promise<void>;
|
|
13
|
+
die(author: Player | null, phase: Phase): Promise<void>;
|
|
14
|
+
triggerEvent(event: GameEvent): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=players.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"players.d.ts","sourceRoot":"","sources":["../../src/models/players.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,qBAAa,MAAM;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB,IAAI,EAAE,OAAO,CAAS;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;gBAE/B,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI;IAMvB,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAIvC,OAAO;IAKP,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK;IAQvC,YAAY,CAAC,KAAK,EAAE,SAAS;CAG1C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class Player {
|
|
2
|
+
id;
|
|
3
|
+
role;
|
|
4
|
+
team; // For an eventual team swap with the same role
|
|
5
|
+
dead = false;
|
|
6
|
+
state = {};
|
|
7
|
+
constructor(id, role) {
|
|
8
|
+
this.id = id || Math.random();
|
|
9
|
+
this.role = role || null;
|
|
10
|
+
this.team = role?.team || null;
|
|
11
|
+
}
|
|
12
|
+
async call(phase) {
|
|
13
|
+
return (await this.role?.call(this, phase)) || (() => { });
|
|
14
|
+
}
|
|
15
|
+
async endCall() {
|
|
16
|
+
// Fonction appelée si le joueur n'a pas répondu à temps, ou juste après la fin de son tour
|
|
17
|
+
await this.role?.endCall(this);
|
|
18
|
+
}
|
|
19
|
+
async die(author, phase) {
|
|
20
|
+
//
|
|
21
|
+
if (this.dead)
|
|
22
|
+
return;
|
|
23
|
+
this.dead = true;
|
|
24
|
+
await this.role?.die(this, author, phase);
|
|
25
|
+
}
|
|
26
|
+
async triggerEvent(event) {
|
|
27
|
+
await this.role?.triggerEvent(this, event);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=players.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"players.js","sourceRoot":"","sources":["../../src/models/players.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,MAAM;IACX,EAAE,CAAS;IACX,IAAI,CAAc;IAClB,IAAI,CAAc,CAAC,+CAA+C;IAElE,IAAI,GAAY,KAAK,CAAC;IACtB,KAAK,GAA4B,EAAE,CAAC;IAE3C,YAAY,EAAW,EAAE,IAAW;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,KAAY;QAC7B,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEM,KAAK,CAAC,OAAO;QACnB,2FAA2F;QAC3F,MAAM,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,MAAqB,EAAE,KAAY;QACnD,EAAE;QACF,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QAEtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,KAAgB;QACzC,MAAM,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;CACD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Phase } from "./rules.js";
|
|
2
|
+
import { Player } from "./players.js";
|
|
3
|
+
import { GameEvent } from "../types/events.js";
|
|
4
|
+
export type Team = {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
solo: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare class Role {
|
|
10
|
+
name: string;
|
|
11
|
+
team: Team;
|
|
12
|
+
depends_on: Role["name"][];
|
|
13
|
+
private exec_death;
|
|
14
|
+
private exec_logic;
|
|
15
|
+
private end_logic;
|
|
16
|
+
private listen_death;
|
|
17
|
+
constructor(name: string, team: Team, depends_on?: Role["name"][]);
|
|
18
|
+
onDeath(callback: (myself: Player, author: Player | null, phase: Phase) => void): void;
|
|
19
|
+
onCall(phase: Phase, callback: (myself: Player, phase: Phase) => Promise<() => void>): void;
|
|
20
|
+
onEndCall(callback: (myself: Player) => void): void;
|
|
21
|
+
on(event: GameEvent["type"], callback: (myself: Player, event: GameEvent) => void): void;
|
|
22
|
+
call(player: Player, phase: Phase): Promise<() => void>;
|
|
23
|
+
endCall(player: Player): Promise<void>;
|
|
24
|
+
die(myself: Player, author: Player | null, phase: Phase): Promise<void>;
|
|
25
|
+
triggerEvent(myself: Player, event: GameEvent): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=roles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/models/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,MAAM,MAAM,IAAI,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACd,CAAC;AAEF,qBAAa,IAAI;IACT,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAM;IAEvC,OAAO,CAAC,UAAU,CAIS;IAE3B,OAAO,CAAC,UAAU,CAGX;IACP,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,YAAY,CACJ;gBAEJ,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,GAAE,IAAI,CAAC,MAAM,CAAC,EAAO;IAM9D,OAAO,CACb,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI;IAKjE,MAAM,CACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,MAAM,IAAI,CAAC;IAMzD,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;IAK5C,EAAE,CACR,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI;IAQxC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAQvD,OAAO,CAAC,MAAM,EAAE,MAAM;IAItB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK;IAKvD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS;CAM1D"}
|
package/models/roles.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export class Role {
|
|
2
|
+
name;
|
|
3
|
+
team;
|
|
4
|
+
depends_on = [];
|
|
5
|
+
exec_death = async () => { };
|
|
6
|
+
exec_logic = {};
|
|
7
|
+
end_logic = async () => { };
|
|
8
|
+
listen_death = async () => { };
|
|
9
|
+
constructor(name, team, depends_on = []) {
|
|
10
|
+
this.name = name;
|
|
11
|
+
this.team = team;
|
|
12
|
+
this.depends_on = depends_on;
|
|
13
|
+
}
|
|
14
|
+
onDeath(callback) {
|
|
15
|
+
this.exec_death = callback;
|
|
16
|
+
}
|
|
17
|
+
onCall(phase, callback) {
|
|
18
|
+
// Fonction appelée quand le joueur doit jouer son tour
|
|
19
|
+
this.exec_logic[phase.name] = callback;
|
|
20
|
+
}
|
|
21
|
+
onEndCall(callback) {
|
|
22
|
+
// Fonction appelée si le joueur n'a pas répondu à temps, ou juste après la fin de son tour
|
|
23
|
+
this.end_logic = callback;
|
|
24
|
+
}
|
|
25
|
+
on(event, callback) {
|
|
26
|
+
switch (event) {
|
|
27
|
+
case "death":
|
|
28
|
+
this.listen_death = callback;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async call(player, phase) {
|
|
32
|
+
if (this.exec_logic[phase.name]) {
|
|
33
|
+
return await this.exec_logic[phase.name](player, phase);
|
|
34
|
+
}
|
|
35
|
+
return () => { };
|
|
36
|
+
}
|
|
37
|
+
async endCall(player) {
|
|
38
|
+
await this.end_logic(player);
|
|
39
|
+
}
|
|
40
|
+
async die(myself, author, phase) {
|
|
41
|
+
// Fonction appelée à la mort du joueur
|
|
42
|
+
await this.exec_death(myself, author, phase);
|
|
43
|
+
}
|
|
44
|
+
async triggerEvent(myself, event) {
|
|
45
|
+
switch (event.type) {
|
|
46
|
+
case "death":
|
|
47
|
+
await this.listen_death(myself, event);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/models/roles.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,IAAI;IACT,IAAI,CAAS;IACb,IAAI,CAAO;IACX,UAAU,GAAmB,EAAE,CAAC;IAE/B,UAAU,GAIN,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IAEnB,UAAU,GAGd,EAAE,CAAC;IACC,SAAS,GAA6B,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IACrD,YAAY,GACnB,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IAEhB,YAAY,IAAY,EAAE,IAAU,EAAE,aAA6B,EAAE;QACpE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9B,CAAC;IAEM,OAAO,CACb,QAAuE;QAEvE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAEM,MAAM,CACZ,KAAY,EACZ,QAA+D;QAE/D,uDAAuD;QACvD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;IACxC,CAAC;IAEM,SAAS,CAAC,QAAkC;QAClD,2FAA2F;QAC3F,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAEM,EAAE,CACR,KAAwB,EACxB,QAAoD;QAEpD,QAAQ,KAAK,EAAE,CAAC;YACf,KAAK,OAAO;gBACX,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC/B,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,KAAY;QAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,MAAc;QAClC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,MAAqB,EAAE,KAAY;QACnE,uCAAuC;QACvC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,KAAgB;QACzD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,OAAO;gBACX,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/models/rules.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,EAAE,CAAC;CAC/B,CAAC"}
|
package/models/rules.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/models/rules.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blueversusraid",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Moteur pour des jeux en 2 équipes du style loup-garou",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"author": "EjNalo",
|
|
7
7
|
"type": "module",
|
|
8
|
-
"main": "
|
|
8
|
+
"main": "index.js",
|
|
9
9
|
"scripts": {
|
|
10
10
|
"build": "tsc"
|
|
11
11
|
},
|
|
12
12
|
"files": [
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
13
|
+
".",
|
|
14
|
+
"./types",
|
|
15
|
+
"./models"
|
|
16
16
|
],
|
|
17
|
-
"types": "
|
|
17
|
+
"types": "./index.d.ts",
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/node": "^25.3.0",
|
|
20
20
|
"tsx": "^4.21.0",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACb,CAAC"}
|
package/types/events.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { GameEvent } from "./events.js";
|
|
2
|
+
import { Role, Team } from "./roles.js";
|
|
3
|
+
import { Phase } from "./rules.js";
|
|
4
|
+
export declare class Player {
|
|
5
|
+
id: number;
|
|
6
|
+
role: Role | null;
|
|
7
|
+
team: Team | null;
|
|
8
|
+
dead: boolean;
|
|
9
|
+
state: Record<string, boolean>;
|
|
10
|
+
constructor(id?: number, role?: Role);
|
|
11
|
+
call(phase: Phase): Promise<() => void>;
|
|
12
|
+
endCall(): Promise<void>;
|
|
13
|
+
die(author: Player | null, phase: Phase): Promise<void>;
|
|
14
|
+
triggerEvent(event: GameEvent): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=players.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"players.d.ts","sourceRoot":"","sources":["../../src/types/players.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,qBAAa,MAAM;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB,IAAI,EAAE,OAAO,CAAS;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;gBAE/B,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI;IAMvB,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAIvC,OAAO;IAKP,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK;IAQvC,YAAY,CAAC,KAAK,EAAE,SAAS;CAG1C"}
|
package/types/players.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class Player {
|
|
2
|
+
id;
|
|
3
|
+
role;
|
|
4
|
+
team; // For an eventual team swap with the same role
|
|
5
|
+
dead = false;
|
|
6
|
+
state = {};
|
|
7
|
+
constructor(id, role) {
|
|
8
|
+
this.id = id || Math.random();
|
|
9
|
+
this.role = role || null;
|
|
10
|
+
this.team = role?.team || null;
|
|
11
|
+
}
|
|
12
|
+
async call(phase) {
|
|
13
|
+
return (await this.role?.call(this, phase)) || (() => { });
|
|
14
|
+
}
|
|
15
|
+
async endCall() {
|
|
16
|
+
// Fonction appelée si le joueur n'a pas répondu à temps, ou juste après la fin de son tour
|
|
17
|
+
await this.role?.endCall(this);
|
|
18
|
+
}
|
|
19
|
+
async die(author, phase) {
|
|
20
|
+
//
|
|
21
|
+
if (this.dead)
|
|
22
|
+
return;
|
|
23
|
+
this.dead = true;
|
|
24
|
+
await this.role?.die(this, author, phase);
|
|
25
|
+
}
|
|
26
|
+
async triggerEvent(event) {
|
|
27
|
+
await this.role?.triggerEvent(this, event);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=players.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"players.js","sourceRoot":"","sources":["../../src/types/players.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,MAAM;IACX,EAAE,CAAS;IACX,IAAI,CAAc;IAClB,IAAI,CAAc,CAAC,+CAA+C;IAElE,IAAI,GAAY,KAAK,CAAC;IACtB,KAAK,GAA4B,EAAE,CAAC;IAE3C,YAAY,EAAW,EAAE,IAAW;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,KAAY;QAC7B,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEM,KAAK,CAAC,OAAO;QACnB,2FAA2F;QAC3F,MAAM,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,MAAqB,EAAE,KAAY;QACnD,EAAE;QACF,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QAEtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,KAAgB;QACzC,MAAM,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;CACD"}
|
package/types/roles.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Phase } from "./rules.js";
|
|
2
|
+
import { Player } from "./players.js";
|
|
3
|
+
import { GameEvent } from "./events.js";
|
|
4
|
+
export type Team = {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
solo: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare class Role {
|
|
10
|
+
name: string;
|
|
11
|
+
team: Team;
|
|
12
|
+
depends_on: Role["name"][];
|
|
13
|
+
private exec_death;
|
|
14
|
+
private exec_logic;
|
|
15
|
+
private end_logic;
|
|
16
|
+
private listen_death;
|
|
17
|
+
constructor(name: string, team: Team, depends_on?: Role["name"][]);
|
|
18
|
+
onDeath(callback: (myself: Player, author: Player | null, phase: Phase) => void): void;
|
|
19
|
+
onCall(phase: Phase, callback: (myself: Player, phase: Phase) => Promise<() => void>): void;
|
|
20
|
+
onEndCall(callback: (myself: Player) => void): void;
|
|
21
|
+
on(event: GameEvent["type"], callback: (myself: Player, event: GameEvent) => void): void;
|
|
22
|
+
call(player: Player, phase: Phase): Promise<() => void>;
|
|
23
|
+
endCall(player: Player): Promise<void>;
|
|
24
|
+
die(myself: Player, author: Player | null, phase: Phase): Promise<void>;
|
|
25
|
+
triggerEvent(myself: Player, event: GameEvent): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=roles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/types/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,MAAM,IAAI,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACd,CAAC;AAEF,qBAAa,IAAI;IACT,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAM;IAEvC,OAAO,CAAC,UAAU,CAIS;IAE3B,OAAO,CAAC,UAAU,CAGX;IACP,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,YAAY,CACJ;gBAEJ,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,GAAE,IAAI,CAAC,MAAM,CAAC,EAAO;IAM9D,OAAO,CACb,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI;IAKjE,MAAM,CACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,MAAM,IAAI,CAAC;IAMzD,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;IAK5C,EAAE,CACR,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI;IAQxC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAQvD,OAAO,CAAC,MAAM,EAAE,MAAM;IAItB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK;IAKvD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS;CAM1D"}
|
package/types/roles.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export class Role {
|
|
2
|
+
name;
|
|
3
|
+
team;
|
|
4
|
+
depends_on = [];
|
|
5
|
+
exec_death = async () => { };
|
|
6
|
+
exec_logic = {};
|
|
7
|
+
end_logic = async () => { };
|
|
8
|
+
listen_death = async () => { };
|
|
9
|
+
constructor(name, team, depends_on = []) {
|
|
10
|
+
this.name = name;
|
|
11
|
+
this.team = team;
|
|
12
|
+
this.depends_on = depends_on;
|
|
13
|
+
}
|
|
14
|
+
onDeath(callback) {
|
|
15
|
+
this.exec_death = callback;
|
|
16
|
+
}
|
|
17
|
+
onCall(phase, callback) {
|
|
18
|
+
// Fonction appelée quand le joueur doit jouer son tour
|
|
19
|
+
this.exec_logic[phase.name] = callback;
|
|
20
|
+
}
|
|
21
|
+
onEndCall(callback) {
|
|
22
|
+
// Fonction appelée si le joueur n'a pas répondu à temps, ou juste après la fin de son tour
|
|
23
|
+
this.end_logic = callback;
|
|
24
|
+
}
|
|
25
|
+
on(event, callback) {
|
|
26
|
+
switch (event) {
|
|
27
|
+
case "death":
|
|
28
|
+
this.listen_death = callback;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async call(player, phase) {
|
|
32
|
+
if (this.exec_logic[phase.name]) {
|
|
33
|
+
return await this.exec_logic[phase.name](player, phase);
|
|
34
|
+
}
|
|
35
|
+
return () => { };
|
|
36
|
+
}
|
|
37
|
+
async endCall(player) {
|
|
38
|
+
await this.end_logic(player);
|
|
39
|
+
}
|
|
40
|
+
async die(myself, author, phase) {
|
|
41
|
+
// Fonction appelée à la mort du joueur
|
|
42
|
+
await this.exec_death(myself, author, phase);
|
|
43
|
+
}
|
|
44
|
+
async triggerEvent(myself, event) {
|
|
45
|
+
switch (event.type) {
|
|
46
|
+
case "death":
|
|
47
|
+
await this.listen_death(myself, event);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/types/roles.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,IAAI;IACT,IAAI,CAAS;IACb,IAAI,CAAO;IACX,UAAU,GAAmB,EAAE,CAAC;IAE/B,UAAU,GAIN,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IAEnB,UAAU,GAGd,EAAE,CAAC;IACC,SAAS,GAA6B,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IACrD,YAAY,GACnB,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IAEhB,YAAY,IAAY,EAAE,IAAU,EAAE,aAA6B,EAAE;QACpE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9B,CAAC;IAEM,OAAO,CACb,QAAuE;QAEvE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAEM,MAAM,CACZ,KAAY,EACZ,QAA+D;QAE/D,uDAAuD;QACvD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;IACxC,CAAC;IAEM,SAAS,CAAC,QAAkC;QAClD,2FAA2F;QAC3F,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAEM,EAAE,CACR,KAAwB,EACxB,QAAoD;QAEpD,QAAQ,KAAK,EAAE,CAAC;YACf,KAAK,OAAO;gBACX,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC/B,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,KAAY;QAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,MAAc;QAClC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,MAAqB,EAAE,KAAY;QACnE,uCAAuC;QACvC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,KAAgB;QACzD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,OAAO;gBACX,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;CACD"}
|
package/types/rules.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/types/rules.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,EAAE,CAAC;CAC/B,CAAC"}
|
package/types/rules.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/types/rules.ts"],"names":[],"mappings":""}
|