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 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"}
@@ -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,12 @@
1
+ export type Cycle = {
2
+ start: number;
3
+ end: number;
4
+ step: number;
5
+ };
6
+ export type Phase = {
7
+ name: string;
8
+ duration: number;
9
+ cycle: Cycle | number[];
10
+ conditions?: (() => boolean)[];
11
+ };
12
+ //# sourceMappingURL=rules.d.ts.map
@@ -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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rules.js.map
@@ -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.1",
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": "lib/index.js",
8
+ "main": "index.js",
9
9
  "scripts": {
10
10
  "build": "tsc"
11
11
  },
12
12
  "files": [
13
- "lib",
14
- "lib/types",
15
- "lib/models"
13
+ ".",
14
+ "./types",
15
+ "./models"
16
16
  ],
17
- "types": "lib/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,9 @@
1
+ import { Player } from "../models/players.js";
2
+ import { Phase } from "../models/rules.js";
3
+ export type GameEvent = {
4
+ type: "death";
5
+ author: Player | null;
6
+ target: Player;
7
+ phase: Phase;
8
+ };
9
+ //# sourceMappingURL=events.d.ts.map
@@ -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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=events.js.map
@@ -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"}
@@ -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"}
@@ -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"}
@@ -0,0 +1,12 @@
1
+ export type Cycle = {
2
+ start: number;
3
+ end: number;
4
+ step: number;
5
+ };
6
+ export type Phase = {
7
+ name: string;
8
+ duration: number;
9
+ cycle: Cycle | number[];
10
+ conditions?: (() => boolean)[];
11
+ };
12
+ //# sourceMappingURL=rules.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/types/rules.ts"],"names":[],"mappings":""}