From 6efcedfaca55e0009b64c4933e8498148fd1b7d2 Mon Sep 17 00:00:00 2001 From: Ido-Barnea Date: Fri, 2 Feb 2024 14:34:52 +0200 Subject: [PATCH 1/4] [#112] Initial shop logic --- development/code/LogicAdapter.ts | 10 +++++++--- development/code/logic/PieceLogic.ts | 19 ++++++++++--------- development/code/logic/items/Inventory.ts | 7 +++---- development/code/logic/items/Items.ts | 14 +++++++++++--- development/code/logic/items/PiggyBank.ts | 12 ++++++------ development/code/logic/items/Shop.ts | 17 +++++++++++++++++ development/code/logic/items/Trap.ts | 6 +++--- .../code/logic/pieces/PiecesUtilities.ts | 2 +- development/code/ui/Board.ts | 2 ++ development/code/ui/BoardManager.ts | 1 + 10 files changed, 61 insertions(+), 29 deletions(-) create mode 100644 development/code/logic/items/Shop.ts diff --git a/development/code/LogicAdapter.ts b/development/code/LogicAdapter.ts index ae89055a..c57af6c1 100644 --- a/development/code/LogicAdapter.ts +++ b/development/code/LogicAdapter.ts @@ -71,7 +71,7 @@ export function onActionTriggered( onPlayerAction(draggedPiece, targetPiece); } else if (targetElement.classList.contains('item')) { game.getItems().forEach((item) => { - if (comparePositions(item.position, targetElementPosition)) { + if (item.position && comparePositions(item.position, targetElementPosition)) { onPlayerAction(draggedPiece, item); } }); @@ -92,7 +92,7 @@ export function onFellOffTheBoardTriggered( const draggedElementPosition = getPositionFromSquareId(squareId, boardId); const draggedPiece = findPieceAtPosition(draggedElementPosition); - if (!draggedPiece || !isPlayerAllowedToAct(draggedPiece)) return; + if (!draggedPiece || !isPlayerAllowedToAct(draggedPiece.player)) return; onPieceFellOffTheBoard(draggedPiece); } @@ -124,7 +124,7 @@ export function onPieceSelected( const pieceElementPosition = getPositionFromSquareId(squareId, boardId); const piece = findPieceAtPosition(pieceElementPosition); - if (!piece || !isPlayerAllowedToAct(piece)) return; + if (!piece || !isPlayerAllowedToAct(piece.player)) return; highlightLegalMoves(piece, boardId); } @@ -157,6 +157,8 @@ export function destroyPieceOnBoard(piece: Piece) { } export function destroyItemOnBoard(item: Item) { + if (!item.position) return; + const itemCoordinates = item.position.coordinates; const squareId = itemCoordinates.join(','); @@ -171,6 +173,8 @@ export function spawnPieceOnBoard(piece: Piece) { } export function spawnItemOnBoard(item: Item) { + if (!item.position) return; + const itemCoordinates = item.position.coordinates; const squareId = itemCoordinates.join(','); diff --git a/development/code/logic/PieceLogic.ts b/development/code/logic/PieceLogic.ts index 6996da99..57f0f204 100644 --- a/development/code/logic/PieceLogic.ts +++ b/development/code/logic/PieceLogic.ts @@ -14,17 +14,18 @@ import { King } from './pieces/King'; import { Pawn } from './pieces/Pawn'; import { Piece } from './pieces/Pieces'; import { Position, Square } from './pieces/PiecesUtilities'; +import { Player } from './Players'; function validatePlayerAction( draggedPiece: Piece, target: Piece | Square | Item, ): boolean { - if (!isPlayerAllowedToAct(draggedPiece)) return false; + if (!isPlayerAllowedToAct(draggedPiece.player)) return false; if (draggedPiece === target) return false; - if (draggedPiece.position.boardId !== target.position.boardId) return false; + if (draggedPiece.position.boardId !== target.position?.boardId) return false; const legalMoves = draggedPiece.getLegalMoves(); - return legalMoves.some(position => comparePositions(position, target.position)); + return legalMoves.some(position => target.position && comparePositions(position, target.position)); } function getPathPositions(start: Position, end: Position): Array { @@ -55,7 +56,7 @@ function simulatePath(piece: Piece, targetPosition: Position) { pathPositions.forEach(position => { game.getItems().forEach(item => { - if (comparePositions(item.position, position)) { + if (item.position && comparePositions(item.position, position)) { onActionPieceToItem(piece, item); } }); @@ -68,7 +69,7 @@ export function onPlayerAction( draggedPiece: Piece, target: Piece | Square | Item, ) { - if (!validatePlayerAction(draggedPiece, target)) { + if (!validatePlayerAction(draggedPiece, target) || !target.position) { movePieceOnBoard(draggedPiece, draggedPiece); return; } @@ -170,8 +171,8 @@ function castle( return true; } -export function isPlayerAllowedToAct(draggedPiece: Piece) { - return draggedPiece.player === game.getCurrentPlayer(); +export function isPlayerAllowedToAct(player: Player) { + return player === game.getCurrentPlayer(); } function move( @@ -250,7 +251,7 @@ function handlePieceSpawning(targetPiece: Piece) { }); game.getItems().forEach((item) => { - if (comparePositions(targetPiece.position, item.position)) { + if (item.position && comparePositions(targetPiece.position, item.position)) { onActionPieceToItem(targetPiece, item); } }); @@ -305,7 +306,7 @@ function pieceMovedOnTrap( game.setItems(game.getItems().filter((item) => item !== trap)); destroyItemOnBoard(trap); - if (draggedPiece.position.boardId === OVERWORLD_BOARD_ID) { + if (draggedPiece.position.boardId === OVERWORLD_BOARD_ID && trap.position) { draggedPiece.position.coordinates = trap.position.coordinates; draggedPiece.position.boardId = draggedPiece.hasKilled ? HELL_BOARD_ID diff --git a/development/code/logic/items/Inventory.ts b/development/code/logic/items/Inventory.ts index e1988470..6b95b89a 100644 --- a/development/code/logic/items/Inventory.ts +++ b/development/code/logic/items/Inventory.ts @@ -1,21 +1,20 @@ import { Logger } from '../../ui/Logger'; -import { PlayerColors } from '../Players'; +import { Player } from '../Players'; import { Item } from './Items'; export class Inventory { items: Array = []; - addItem(playerColor: PlayerColors, item: Item) { + addItem(item: Item, player: Player) { this.items.push(item); - Logger.logGeneral(`${playerColor} received a ${item.name}.`); + Logger.logGeneral(`${player.color} received a ${item.name}.`); } removeItem(item: Item) { const index = this.items.indexOf(item); if (index !== -1) { this.items.splice(index, 1); - Logger.logGeneral(`${item.name} was destroyed.`); } } diff --git a/development/code/logic/items/Items.ts b/development/code/logic/items/Items.ts index bd3a7976..a3a10388 100644 --- a/development/code/logic/items/Items.ts +++ b/development/code/logic/items/Items.ts @@ -6,7 +6,8 @@ import { Player } from '../Players'; interface ItemType { name: string, resource: string, - position: Position, + price: number, + position?: Position | undefined, use: (piece: Piece) => void; drop: (player: Player) => void; } @@ -14,15 +15,22 @@ interface ItemType { export class Item implements ItemType { name: string; resource: string; - position: Position; + price: number; + position: Position | undefined; constructor( name: string, resource: string, - position: Position, + price: number, + position?: Position, ) { this.name = name; this.resource = resource; + this.price = price; + this.position = position; + } + + setPosition(position: Position) { this.position = position; } diff --git a/development/code/logic/items/PiggyBank.ts b/development/code/logic/items/PiggyBank.ts index 567acf68..0d481f8a 100644 --- a/development/code/logic/items/PiggyBank.ts +++ b/development/code/logic/items/PiggyBank.ts @@ -2,21 +2,21 @@ import { Item } from './Items'; import { Piece } from '../pieces/Pieces'; import { Logger } from '../../ui/Logger'; import { coinResource } from '../../ui/Resources'; -import { Position } from '../pieces/PiecesUtilities'; import { Player } from '../Players'; +import { Position } from '../pieces/PiecesUtilities'; export class PiggyBank extends Item { - constructor(position: Position) { - super('piggy bank', coinResource, position); + constructor(position?: Position) { + super('piggy bank', coinResource, 1, position); } - getRandomAmountOfCoins(player: Player, max: number | undefined) { + getRandomAmountOfCoins(max?: number) { max = max || 5; return Math.floor(Math.random() * (max - 1)) + 1; } use(piece: Piece): void { - const amountOfCoins = this.getRandomAmountOfCoins(piece.player, undefined); + const amountOfCoins = this.getRandomAmountOfCoins(); piece.player.gold += amountOfCoins; Logger.logGeneral(` ${piece.player.color} ${piece.name} opened a ${this.name} and recieved ${amountOfCoins} gold coins. @@ -24,7 +24,7 @@ export class PiggyBank extends Item { } drop(player: Player): void { - const amountOfCoins = this.getRandomAmountOfCoins(player, player.gold); + const amountOfCoins = this.getRandomAmountOfCoins(player.gold); player.gold -= amountOfCoins; Logger.logGeneral(`${player.color} dropped a ${this.name} and lost ${amountOfCoins} gold coins.`); } diff --git a/development/code/logic/items/Shop.ts b/development/code/logic/items/Shop.ts new file mode 100644 index 00000000..c199757d --- /dev/null +++ b/development/code/logic/items/Shop.ts @@ -0,0 +1,17 @@ +import { isPlayerAllowedToAct } from '../PieceLogic'; +import { Player } from '../Players'; +import { Item } from './Items'; +import { Trap } from './Trap'; + +export class Shop { + items: Array = [ + new Trap(), + ]; + + buy(item: Item, player: Player) { + if (isPlayerAllowedToAct(player) && player.gold >= item.price) { + player.gold -= item.price; + player.inventory.addItem(item, player); + } + } +} diff --git a/development/code/logic/items/Trap.ts b/development/code/logic/items/Trap.ts index 0fd34f91..61267e71 100644 --- a/development/code/logic/items/Trap.ts +++ b/development/code/logic/items/Trap.ts @@ -2,13 +2,13 @@ import { Item } from './Items'; import { Piece } from '../pieces/Pieces'; import { Logger } from '../../ui/Logger'; import { trapResource } from '../../ui/Resources'; -import { Position } from '../pieces/PiecesUtilities'; import { spawnItemOnBoard } from '../../LogicAdapter'; import { game } from '../../Game'; +import { Position } from '../pieces/PiecesUtilities'; export class Trap extends Item { - constructor(position: Position) { - super('trap', trapResource, position); + constructor(position?: Position) { + super('trap', trapResource, 3, position); } use(piece: Piece): void { diff --git a/development/code/logic/pieces/PiecesUtilities.ts b/development/code/logic/pieces/PiecesUtilities.ts index f21e0aa9..25289a14 100644 --- a/development/code/logic/pieces/PiecesUtilities.ts +++ b/development/code/logic/pieces/PiecesUtilities.ts @@ -26,6 +26,6 @@ export interface PieceType { export function getItemByPosition( position: Position, ): Item | undefined { - return game.getItems().find((item) => comparePositions(position, item.position)); + return game.getItems().find((item) => item.position && comparePositions(position, item.position)); } diff --git a/development/code/ui/Board.ts b/development/code/ui/Board.ts index af0badd7..dbd21025 100644 --- a/development/code/ui/Board.ts +++ b/development/code/ui/Board.ts @@ -169,6 +169,8 @@ export class ChessBoard { } spawnItemOnBoard(item: Item) { + if (!item.position) return; + const itemCoordinates = item.position.coordinates; const square = this.boardElement.querySelectorAll(`[square-id="${itemCoordinates}"]`)[0]; diff --git a/development/code/ui/BoardManager.ts b/development/code/ui/BoardManager.ts index 0df61f83..36e8cf51 100644 --- a/development/code/ui/BoardManager.ts +++ b/development/code/ui/BoardManager.ts @@ -161,6 +161,7 @@ export function spawnPieceElementOnBoard(piece: Piece, targetSquareId: string) { } export function spawnItemElementOnBoard(item: Item, targetSquareId: string) { + if (!item.position) return; const board = getBoardbyId(item.position.boardId); const squareElement = board.boardElement.querySelectorAll(`[square-id="${targetSquareId}"]`)[0] as HTMLElement; From ef246fd7c2a11a989f935a53cc26bb5666f76f72 Mon Sep 17 00:00:00 2001 From: Ido-Barnea Date: Fri, 2 Feb 2024 17:13:17 +0200 Subject: [PATCH 2/4] [#112] Removed repetitive code --- development/code/LogicAdapter.ts | 2 +- development/code/logic/PieceLogic.ts | 6 +++--- development/code/logic/Utilities.ts | 6 ++++-- development/code/logic/pieces/PiecesUtilities.ts | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/development/code/LogicAdapter.ts b/development/code/LogicAdapter.ts index c57af6c1..6f9c9105 100644 --- a/development/code/LogicAdapter.ts +++ b/development/code/LogicAdapter.ts @@ -71,7 +71,7 @@ export function onActionTriggered( onPlayerAction(draggedPiece, targetPiece); } else if (targetElement.classList.contains('item')) { game.getItems().forEach((item) => { - if (item.position && comparePositions(item.position, targetElementPosition)) { + if (comparePositions(item.position, targetElementPosition)) { onPlayerAction(draggedPiece, item); } }); diff --git a/development/code/logic/PieceLogic.ts b/development/code/logic/PieceLogic.ts index 57f0f204..44cfba0e 100644 --- a/development/code/logic/PieceLogic.ts +++ b/development/code/logic/PieceLogic.ts @@ -25,7 +25,7 @@ function validatePlayerAction( if (draggedPiece.position.boardId !== target.position?.boardId) return false; const legalMoves = draggedPiece.getLegalMoves(); - return legalMoves.some(position => target.position && comparePositions(position, target.position)); + return legalMoves.some(position => comparePositions(position, target.position)); } function getPathPositions(start: Position, end: Position): Array { @@ -56,7 +56,7 @@ function simulatePath(piece: Piece, targetPosition: Position) { pathPositions.forEach(position => { game.getItems().forEach(item => { - if (item.position && comparePositions(item.position, position)) { + if (comparePositions(item.position, position)) { onActionPieceToItem(piece, item); } }); @@ -251,7 +251,7 @@ function handlePieceSpawning(targetPiece: Piece) { }); game.getItems().forEach((item) => { - if (item.position && comparePositions(targetPiece.position, item.position)) { + if (comparePositions(targetPiece.position, item.position)) { onActionPieceToItem(targetPiece, item); } }); diff --git a/development/code/logic/Utilities.ts b/development/code/logic/Utilities.ts index fa55b376..37d50e67 100644 --- a/development/code/logic/Utilities.ts +++ b/development/code/logic/Utilities.ts @@ -3,9 +3,11 @@ import { Piece } from './pieces/Pieces'; import { Position } from './pieces/PiecesUtilities'; export function comparePositions( - firstPosition: Position, - secondPosition: Position, + firstPosition: Position | undefined, + secondPosition: Position | undefined, ): boolean { + if (!firstPosition|| !secondPosition) return false; + const arePositionsEqual = firstPosition.coordinates[0] === secondPosition.coordinates[0] && firstPosition.coordinates[1] === secondPosition.coordinates[1]; diff --git a/development/code/logic/pieces/PiecesUtilities.ts b/development/code/logic/pieces/PiecesUtilities.ts index 25289a14..f21e0aa9 100644 --- a/development/code/logic/pieces/PiecesUtilities.ts +++ b/development/code/logic/pieces/PiecesUtilities.ts @@ -26,6 +26,6 @@ export interface PieceType { export function getItemByPosition( position: Position, ): Item | undefined { - return game.getItems().find((item) => item.position && comparePositions(position, item.position)); + return game.getItems().find((item) => comparePositions(position, item.position)); } From cd535f631e2eab581e042569f84b68ae89dc906f Mon Sep 17 00:00:00 2001 From: Ido-Barnea Date: Fri, 2 Feb 2024 17:17:14 +0200 Subject: [PATCH 3/4] [trivial] Minor fix --- .eslintrc.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 34078caa..768042bb 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -47,7 +47,7 @@ "caughtErrorsIgnorePattern": "_" } ], - "no-unneeded-ternary": ["error"], + "no-unneeded-ternary": ["warn"], "max-len": [ "warn", { @@ -56,8 +56,8 @@ "ignoreStrings": true } ], - "comma-dangle": ["error", "always-multiline"], - "camelcase": ["error"], + "comma-dangle": ["warn", "always-multiline"], + "camelcase": ["warn"], "no-constant-condition": "off" } } \ No newline at end of file From 46b0ac4f1255b3588076f658a351c7d472652349 Mon Sep 17 00:00:00 2001 From: Ido-Barnea Date: Fri, 2 Feb 2024 17:24:43 +0200 Subject: [PATCH 4/4] [trivial] Formatting --- development/code/logic/Utilities.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/development/code/logic/Utilities.ts b/development/code/logic/Utilities.ts index 37d50e67..2d2b3e82 100644 --- a/development/code/logic/Utilities.ts +++ b/development/code/logic/Utilities.ts @@ -6,7 +6,7 @@ export function comparePositions( firstPosition: Position | undefined, secondPosition: Position | undefined, ): boolean { - if (!firstPosition|| !secondPosition) return false; + if (!firstPosition || !secondPosition) return false; const arePositionsEqual = firstPosition.coordinates[0] === secondPosition.coordinates[0] &&