Skip to content

Commit cef262f

Browse files
authored
Merge pull request #302 from Ido-Barnea/feature/add-secret-rules
Feature/add secret rules
2 parents 1d12293 + 7a2166d commit cef262f

File tree

9 files changed

+163
-16
lines changed

9 files changed

+163
-16
lines changed

chess-but-better/src/controller/events/handlers/PieceKilledEventHandler.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,14 @@ export class PieceKilledEventHandler extends BaseEventHandler {
3838
}
3939

4040
handle(context: Record<string, any>): void {
41-
const attackedPiece: BasePiece = context['piece'];
41+
const killer: BasePiece | undefined = context['killer'];
42+
const victim: BasePiece = context['victim'];
4243
const causeOfDeath: CauseOfDeath = context['causeOfDeath'];
4344

44-
const nextBoard = this.determinePieceNextBoard(attackedPiece, causeOfDeath);
45-
attackedPiece.position.board = nextBoard;
45+
const nextBoard = this.determinePieceNextBoard(victim, causeOfDeath);
46+
victim.position.board = nextBoard;
4647

47-
this.eventEmitter.emit(EventType.PIECE_SPAWNED, {piece: attackedPiece});
48-
this.eventEmitter.emit(EventType.AFTER_PIECE_KILLED);
48+
this.eventEmitter.emit(EventType.PIECE_SPAWNED, {piece: victim});
49+
this.eventEmitter.emit(EventType.AFTER_PIECE_KILLED, {killer, victim});
4950
}
5051
}

chess-but-better/src/controller/events/handlers/PieceMovedEventHandler.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ export class PieceMovedEventHandler extends BaseEventHandler {
4040
piece.stats.kills += 1;
4141
attackedPiece.position = this.boardService.copyPosition(attackedPiece.position); // Trigger component render
4242

43-
this.eventEmitter.emit(EventType.PIECE_KILLED, {piece: attackedPiece, causeOfDeath: CauseOfDeath.PLAYER});
43+
this.eventEmitter.emit(EventType.PIECE_KILLED, {
44+
killer: piece,
45+
victim: attackedPiece,
46+
causeOfDeath: CauseOfDeath.PLAYER,
47+
});
4448
}
4549
}
4650

chess-but-better/src/controller/events/handlers/end-of-move-handlers/TurnCounterHandler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ITurnCounter } from "../../../game-state/counters/turn-counter/abstract
22
import { IEventHandler } from "../../abstract/IEventHandler";
33

44
export class TurnCounterHandler implements IEventHandler {
5-
turnCounter: ITurnCounter;
5+
private turnCounter: ITurnCounter;
66

77
constructor(turnCounter: ITurnCounter) {
88
this.turnCounter = turnCounter;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { SecretRuleHandler } from "./abstract/SecretRuleHandler";
2+
import { IPlayersStorage } from "../../../../storages/players-storage/abstract/IPlayersStorage";
3+
import { Team } from "../../../../../model/player/team/Team";
4+
5+
export class BeggersHandler extends SecretRuleHandler {
6+
private playersStorage: IPlayersStorage;
7+
8+
constructor(playersStorage: IPlayersStorage) {
9+
super('Beggers');
10+
this.playersStorage = playersStorage;
11+
}
12+
13+
getTeamsInDebt = (): Array<Team> => {
14+
const teamsInDebt = new Set<Team>();
15+
16+
this.playersStorage.getPlayers().forEach((player) => {
17+
if (player.team.gold < 0) {
18+
teamsInDebt.add(player.team);
19+
}
20+
});
21+
22+
return Array.from(teamsInDebt);
23+
};
24+
25+
26+
condition(): boolean {
27+
const teamsInDebt = this.getTeamsInDebt();
28+
return teamsInDebt.length > 0;
29+
}
30+
31+
outcome(): void {
32+
const teamsInDebt = this.getTeamsInDebt();
33+
teamsInDebt.forEach((team) => {
34+
team.experience -= 1;
35+
});
36+
}
37+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { BasePiece } from "../../../../../model/piece/abstract/BasePiece";
2+
import { SecretRuleHandler } from "./abstract/SecretRuleHandler";
3+
4+
export class FirstBloodHandler extends SecretRuleHandler {
5+
private wasClaimed: boolean;
6+
7+
constructor() {
8+
super('First Blood');
9+
this.wasClaimed = false;
10+
}
11+
12+
condition(context: Record<string, any>): boolean {
13+
const killer: BasePiece = context['killer'];
14+
return !this.wasClaimed && !!killer;
15+
}
16+
17+
outcome(context: Record<string, any>): void {
18+
const killer: BasePiece = context['killer'];
19+
killer.team.experience += 1;
20+
21+
this.wasClaimed = true;
22+
}
23+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { isEqual } from "lodash";
2+
import { BasePiece } from "../../../../../model/piece/abstract/BasePiece";
3+
import { SecretRuleHandler } from "./abstract/SecretRuleHandler";
4+
5+
export class FriendlyFireHandler extends SecretRuleHandler {
6+
constructor() {
7+
super('Friendly Fire');
8+
}
9+
10+
isFriendlyFire(killer: BasePiece, victim: BasePiece): boolean {
11+
return isEqual(killer.team, victim.team);
12+
}
13+
14+
condition(context: Record<string, any>): boolean {
15+
const killer: BasePiece = context['killer'];
16+
const victim: BasePiece = context['victim'];
17+
return !!killer && !!victim && this.isFriendlyFire(killer, victim);
18+
}
19+
20+
outcome(context: Record<string, any>): void {
21+
const killer: BasePiece = context['killer'];
22+
23+
killer.team.gold -= 1;
24+
}
25+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { BasePiece } from "../../../../../model/piece/abstract/BasePiece";
2+
import { SecretRuleHandler } from "./abstract/SecretRuleHandler";
3+
4+
export class VeteranHandler extends SecretRuleHandler {
5+
constructor() {
6+
super('Veteran');
7+
}
8+
9+
condition(context: Record<string, any>): boolean {
10+
const killer: BasePiece = context['killer'];
11+
return !!killer;
12+
}
13+
14+
outcome(context: Record<string, any>): void {
15+
const killer: BasePiece = context['killer'];
16+
killer.team.experience += 1;
17+
}
18+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { BaseEventHandler } from "../../../../abstract/BaseEventHandler";
2+
export abstract class SecretRuleHandler implements BaseEventHandler {
3+
private message: string;
4+
5+
constructor(message: string) {
6+
this.message = message;
7+
}
8+
9+
abstract condition(context: Record<string, any>): boolean;
10+
abstract outcome(context: Record<string, any>): void;
11+
12+
displayMessage(message: string): void {
13+
console.log(message);
14+
}
15+
16+
handle = (context: Record<string, any>): void => {
17+
if (this.condition(context)) {
18+
this.displayMessage(this.message);
19+
this.outcome(context);
20+
}
21+
}
22+
}

chess-but-better/src/controller/game-state/Game.ts

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ import { PiecesService } from "./services/pieces/PiecesService";
3232
import { BoardType } from "../../model/board/BoardTypes";
3333
import { VoidBoard } from "../../model/board/boards/VoidBoard";
3434
import { PieceSpawnedEventHandler } from "../events/handlers/PieceSpawnedEventHandler";
35+
import { FirstBloodHandler } from "../events/handlers/end-of-move-handlers/secret-rules/FirstBloodHandler";
36+
import { FriendlyFireHandler } from "../events/handlers/end-of-move-handlers/secret-rules/FriendlyFireHandler";
37+
import { VeteranHandler } from "../events/handlers/end-of-move-handlers/secret-rules/VeteranHandler";
38+
import { BeggersHandler } from "../events/handlers/end-of-move-handlers/secret-rules/Beggers";
3539

3640
export class Game {
3741
// Teams
@@ -126,21 +130,34 @@ export class Game {
126130
this.boardService = new BoardService(this.boards, this.piecesStorage, this.piecesService, this.eventEmitter);
127131

128132
// Event Handlers - End Of Move
129-
const endOfMoveEventHandler = new EndOfMoveEventHandler();
130-
endOfMoveEventHandler.addHandler(new TurnCounterHandler(this.turnCounter));
133+
const endOfMoveHandler = new EndOfMoveEventHandler();
134+
endOfMoveHandler.addHandler(new TurnCounterHandler(this.turnCounter));
131135

132-
this.eventEmitter.on(EventType.END_OF_TURN, endOfMoveEventHandler.handle);
136+
this.eventEmitter.on(EventType.END_OF_TURN, endOfMoveHandler.handle);
133137

134138
// Event Handlers - Piece Moved
135-
const pieceMovedEventHandler = new PieceMovedEventHandler(this.eventEmitter, this.piecesStorage, this.boardService);
136-
this.eventEmitter.on(EventType.PIECE_MOVED, pieceMovedEventHandler.handle);
139+
const pieceMovedHandler = new PieceMovedEventHandler(this.eventEmitter, this.piecesStorage, this.boardService);
140+
this.eventEmitter.on(EventType.PIECE_MOVED, pieceMovedHandler.handle);
137141

138142
// Event Handlers - Piece Killed
139-
const pieceKilledEventHandler = new PieceKilledEventHandler(this.eventEmitter, this.boards);
140-
this.eventEmitter.on(EventType.PIECE_KILLED, pieceKilledEventHandler.handle);
143+
const pieceKilledHandler = new PieceKilledEventHandler(this.eventEmitter, this.boards);
144+
this.eventEmitter.on(EventType.PIECE_KILLED, pieceKilledHandler.handle);
141145

142146
// Event Handlers - Piece Spawned
143-
const pieceSpawnedEventHandler = new PieceSpawnedEventHandler(this.eventEmitter, this.piecesStorage);
144-
this.eventEmitter.on(EventType.PIECE_SPAWNED, pieceSpawnedEventHandler.handle);
147+
const pieceSpawnedHandler = new PieceSpawnedEventHandler(this.eventEmitter, this.piecesStorage);
148+
this.eventEmitter.on(EventType.PIECE_SPAWNED, pieceSpawnedHandler.handle);
149+
150+
// Event Handlers - Secret Rules
151+
const firstBloodHandler = new FirstBloodHandler();
152+
this.eventEmitter.on(EventType.AFTER_PIECE_KILLED, firstBloodHandler.handle);
153+
154+
const veteranHandler = new VeteranHandler();
155+
this.eventEmitter.on(EventType.AFTER_PIECE_KILLED, veteranHandler.handle);
156+
157+
const friendlyFireHandler = new FriendlyFireHandler();
158+
this.eventEmitter.on(EventType.AFTER_PIECE_KILLED, friendlyFireHandler.handle);
159+
160+
const beggersHandler = new BeggersHandler(this.playersStorage);
161+
this.eventEmitter.on(EventType.END_OF_TURN, beggersHandler.handle);
145162
}
146163
}

0 commit comments

Comments
 (0)