match page (initial) i18n
This commit is contained in:
@ -1,8 +1,8 @@
|
||||
import { Application, Assets, Container, EventEmitter, Sprite, Text, Ticker } from 'pixi.js'
|
||||
import { Application, Container, EventEmitter, Text, Ticker } from 'pixi.js'
|
||||
import { Scale, type ScaleFunction } from '@/game/utilities/scale'
|
||||
import type { AnimationOptions, Movement, PlayerDto, TileDto } from '@/common/interfaces'
|
||||
import { Tile } from '@/game/Tile'
|
||||
import { DIRECTIONS, createContainer, createCrosshair, isTilePair } from '@/common/helpers'
|
||||
import { DIRECTIONS, createContainer, isTilePair } from '@/common/helpers'
|
||||
import { createText } from '@/game/utilities/fonts'
|
||||
import { LoggingService } from '@/services/LoggingService'
|
||||
import { GlowFilter } from 'pixi-filters'
|
||||
@ -85,19 +85,12 @@ export class Board extends EventEmitter {
|
||||
visible: false,
|
||||
})
|
||||
|
||||
createCrosshair(this.tilesContainer, 0xff0000, {
|
||||
width: this.width,
|
||||
height: this.height,
|
||||
x: this.scaleX(0),
|
||||
y: this.scaleY(0),
|
||||
})
|
||||
|
||||
createCrosshair(this.interactionContainer, 0xffff00, {
|
||||
width: this.width,
|
||||
height: this.height,
|
||||
x: this.scaleX(0),
|
||||
y: this.scaleY(0),
|
||||
})
|
||||
// createCrosshair(this.tilesContainer, 0xff0000, {
|
||||
// width: this.width,
|
||||
// height: this.height,
|
||||
// x: this.scaleX(0),
|
||||
// y: this.scaleY(0),
|
||||
// })
|
||||
|
||||
this.textContainer = createContainer({
|
||||
width: this.width,
|
||||
@ -105,7 +98,7 @@ export class Board extends EventEmitter {
|
||||
parent: this.container,
|
||||
})
|
||||
|
||||
this.showText(t('starting_game'))
|
||||
this.showText(t('game.starting_game'))
|
||||
}
|
||||
|
||||
private calculateScale() {
|
||||
@ -144,11 +137,11 @@ export class Board extends EventEmitter {
|
||||
}
|
||||
|
||||
async setPlayerTurn(player: PlayerDto) {
|
||||
this.showText('Your turn!')
|
||||
this.showText(t('game.your-turn'))
|
||||
}
|
||||
|
||||
async setServerPlayerTurn(currentPlayer: PlayerDto) {
|
||||
this.showText(`${currentPlayer.name}'s turn!\n Please wait...`)
|
||||
this.showText(t('game.player-turn', [currentPlayer.name]))
|
||||
}
|
||||
|
||||
async playerMove(move: any, playerId: string) {
|
||||
@ -599,8 +592,7 @@ export class Board extends EventEmitter {
|
||||
return [canPlayNorth, canPlayEast, canPlaySouth, canPlayWest]
|
||||
}
|
||||
|
||||
gameFinished(data: any) {
|
||||
const { lastGame, gameState } = data
|
||||
clean() {
|
||||
this.tiles = []
|
||||
this.boneyard = []
|
||||
this.movements = []
|
||||
@ -614,10 +606,13 @@ export class Board extends EventEmitter {
|
||||
this.firstTile = undefined
|
||||
this.tilesContainer.removeChildren()
|
||||
this.interactionContainer.removeChildren()
|
||||
this.showText(`Game finished \n Winner ${lastGame?.winner?.name ?? 'No winner'}`)
|
||||
}
|
||||
|
||||
matchFinished(data: any) {
|
||||
// this.showText(`Game finished \n Winner ${lastGame?.winner?.name ?? 'No winner'}`)
|
||||
gameFinished() {
|
||||
this.showText(t('game.round-finished'))
|
||||
}
|
||||
|
||||
matchFinished() {
|
||||
this.showText(t('game.match-finished'))
|
||||
}
|
||||
}
|
||||
|
8
src/game/Config.ts
Normal file
8
src/game/Config.ts
Normal file
@ -0,0 +1,8 @@
|
||||
import type { Config } from '@/common/interfaces'
|
||||
|
||||
const config: Config = {
|
||||
waitMillisToShowSummary: 1000,
|
||||
activeHandStrokeColor: 0xb39c4d,
|
||||
}
|
||||
|
||||
export default config
|
@ -1,4 +1,4 @@
|
||||
import { Application, Assets, Container, Sprite } from 'pixi.js'
|
||||
import { Application, Assets, Container, EventEmitter, Sprite } from 'pixi.js'
|
||||
import { Board } from '@/game/Board'
|
||||
import { assets } from '@/game/utilities/assets'
|
||||
import { Tile } from '@/game/Tile'
|
||||
@ -9,6 +9,7 @@ import { wait } from '@/common/helpers'
|
||||
import { Actions } from 'pixi-actions'
|
||||
import { OtherHand } from './OtherHand'
|
||||
import { GameSummayView } from './GameSummayView'
|
||||
import Config from './Config'
|
||||
|
||||
interface GameOptions {
|
||||
boardScale: number
|
||||
@ -18,7 +19,7 @@ interface GameOptions {
|
||||
background: string
|
||||
}
|
||||
|
||||
export class Game {
|
||||
export class Game extends EventEmitter {
|
||||
public board!: Board
|
||||
public hand!: Hand
|
||||
private app: Application = new Application()
|
||||
@ -27,6 +28,7 @@ export class Game {
|
||||
private otherHands: OtherHand[] = []
|
||||
private backgroundLayer: Container = new Container()
|
||||
private gameSummaryView!: GameSummayView
|
||||
private players: PlayerDto[] = []
|
||||
|
||||
constructor(
|
||||
private options: GameOptions = {
|
||||
@ -39,7 +41,9 @@ export class Game {
|
||||
private socketService: SocketIoClientService,
|
||||
private playerId: string,
|
||||
private sessionId: string,
|
||||
) {}
|
||||
) {
|
||||
super()
|
||||
}
|
||||
|
||||
async setup(): Promise<HTMLCanvasElement> {
|
||||
const width = this.options.width || 1200
|
||||
@ -59,7 +63,8 @@ export class Game {
|
||||
new OtherHand(this.app, 'top'),
|
||||
new OtherHand(this.app, 'right'),
|
||||
]
|
||||
this.initOtherHands(players)
|
||||
this.initPlayers(players)
|
||||
this.players = players
|
||||
this.gameSummaryView = new GameSummayView(this.app)
|
||||
this.hand.scale = this.options.handScale
|
||||
this.board.scale = this.options.boardScale
|
||||
@ -81,23 +86,23 @@ export class Game {
|
||||
this.backgroundLayer.addChild(background)
|
||||
}
|
||||
|
||||
initOtherHands(players: PlayerDto[]) {
|
||||
initPlayers(players: PlayerDto[]) {
|
||||
const myIndex = players.findIndex((player) => player.id === this.playerId)
|
||||
const copy = [...players]
|
||||
const cut = copy.splice(myIndex)
|
||||
cut.shift()
|
||||
const player = cut.shift()
|
||||
const final = cut.concat(copy)
|
||||
|
||||
for (let i = 0; i < final.length; i++) {
|
||||
const hand = this.otherHands[i]
|
||||
hand.setPlayer(final[i])
|
||||
}
|
||||
this.hand.setPlayer(player)
|
||||
|
||||
this.board.otherPlayerHands = this.otherHands
|
||||
}
|
||||
|
||||
updateOtherHands(gameState: GameDto) {
|
||||
const players = gameState.players
|
||||
updateOtherHands(players: PlayerDto[]) {
|
||||
players.forEach((player) => {
|
||||
const hand = this.otherHands.find((hand) => hand.player?.id === player.id)
|
||||
if (hand) {
|
||||
@ -115,6 +120,7 @@ export class Game {
|
||||
|
||||
setPlayersInactive() {
|
||||
this.otherHands.forEach((hand) => hand.setActive(false))
|
||||
this.hand.setActive(false)
|
||||
}
|
||||
|
||||
async preload() {
|
||||
@ -148,7 +154,12 @@ export class Game {
|
||||
await this.board.updateBoard(move, undefined)
|
||||
})
|
||||
|
||||
this.gameSummaryView.on('finishClick', (data) => {
|
||||
this.emit('game:finish-click', data)
|
||||
})
|
||||
|
||||
this.gameSummaryView.on('nextClick', (data) => {
|
||||
this.board.clean()
|
||||
this.updateScoreboard(data.sessionState)
|
||||
this.socketService.sendMessage('client:set-client-ready-for-next-game', {
|
||||
userId: this.playerId,
|
||||
@ -161,11 +172,13 @@ export class Game {
|
||||
|
||||
private updateScoreboard(sessionState: MatchSessionDto) {
|
||||
const scoreboard = sessionState.scoreboard
|
||||
this.otherHands.forEach((hand) => {
|
||||
const player: PlayerDto | undefined = hand.player
|
||||
const myScore = scoreboard.find((d) => d.id === this.playerId)?.score || 0
|
||||
this.hand.setScore(myScore)
|
||||
this.otherHands.forEach((otherHand) => {
|
||||
const player: PlayerDto | undefined = otherHand.player
|
||||
const name: string = player?.name || ''
|
||||
const score = scoreboard.find((d) => d.name === name)?.score || 0
|
||||
hand.setScore(score)
|
||||
otherHand.setScore(score)
|
||||
})
|
||||
}
|
||||
|
||||
@ -198,6 +211,7 @@ export class Game {
|
||||
const currentPlayer = state?.currentPlayer!
|
||||
this.setPlayersInactive()
|
||||
if (currentPlayer.id === this.playerId) {
|
||||
this.hand.setActive(true)
|
||||
this.hand.prepareForMove(this.board.count === 0, this.board.freeEnds)
|
||||
this.board.setPlayerTurn(currentPlayer)
|
||||
} else {
|
||||
@ -248,15 +262,19 @@ export class Game {
|
||||
})
|
||||
}
|
||||
|
||||
gameFinished(data: any) {
|
||||
async gameFinished(data: any) {
|
||||
await wait(Config.waitMillisToShowSummary)
|
||||
this.updateOtherHands(data.lastGame.players)
|
||||
this.hand.gameFinished()
|
||||
this.board.gameFinished(data)
|
||||
this.board.gameFinished()
|
||||
this.setPlayersInactive()
|
||||
this.gameSummaryView.setGameSummary(data, 'round')
|
||||
}
|
||||
|
||||
matchFinished(data: any) {
|
||||
// this.hand.matchFinished()
|
||||
this.board.matchFinished(data)
|
||||
async matchFinished(data: any) {
|
||||
await wait(Config.waitMillisToShowSummary)
|
||||
this.updateOtherHands(data.lastGame.players)
|
||||
this.board.matchFinished()
|
||||
this.gameSummaryView.setGameSummary(data, 'match')
|
||||
}
|
||||
|
||||
|
@ -30,8 +30,6 @@ export class GameSummayView extends EventEmitter {
|
||||
height: this.height,
|
||||
parent: this.container,
|
||||
})
|
||||
console.log('GameSummaryView created!')
|
||||
|
||||
this.container.visible = false
|
||||
}
|
||||
|
||||
@ -67,7 +65,7 @@ export class GameSummayView extends EventEmitter {
|
||||
|
||||
if (this.gameSummary.isBlocked) {
|
||||
line += 30
|
||||
this.container.addChild(
|
||||
this.layer.addChild(
|
||||
createText({
|
||||
text: '(Blocked)',
|
||||
x: this.width / 2,
|
||||
|
@ -1,16 +1,19 @@
|
||||
import { Application, Container, EventEmitter, Sprite, Texture, Ticker } from 'pixi.js'
|
||||
import { Application, Container, EventEmitter, Graphics, Sprite, Texture, Ticker } from 'pixi.js'
|
||||
import { Tile } from '@/game/Tile'
|
||||
import type { PlayerDto, TileDto } from '@/common/interfaces'
|
||||
import { GlowFilter } from 'pixi-filters'
|
||||
import { Scale, type ScaleFunction } from './utilities/scale'
|
||||
import { LoggingService } from '@/services/LoggingService'
|
||||
import { createButton, createContainer } from '@/common/helpers'
|
||||
import { Action, Actions } from 'pixi-actions'
|
||||
import { createText, playerNameText, whiteStyle } from './utilities/fonts'
|
||||
import Config from '@/game/Config'
|
||||
|
||||
export class Hand extends EventEmitter {
|
||||
tiles: Tile[] = []
|
||||
container: Container = new Container()
|
||||
buttonPass: Container = new Container()
|
||||
scoreLayer: Container = new Container()
|
||||
activeLayer: Container = new Container()
|
||||
height: number
|
||||
width: number
|
||||
ticker: Ticker
|
||||
@ -27,18 +30,22 @@ export class Hand extends EventEmitter {
|
||||
tilesLayer!: Container
|
||||
interactionsLayer!: Container
|
||||
score: number = 0
|
||||
active: boolean = false
|
||||
private player!: PlayerDto
|
||||
|
||||
constructor(app: Application) {
|
||||
super()
|
||||
app.stage.addChild(this.container)
|
||||
this.ticker = app.ticker
|
||||
this.height = 130 * this.scale
|
||||
this.width = app.canvas.width
|
||||
this.width = 800 // app.canvas.width
|
||||
this.container.y = app.canvas.height - this.height
|
||||
this.container.x = app.canvas.width / 2 - this.width / 2
|
||||
this.container.width = this.width
|
||||
this.container.height = this.height
|
||||
this.calculateScale()
|
||||
this.initLayers()
|
||||
this.render()
|
||||
}
|
||||
|
||||
initLayers() {
|
||||
@ -58,12 +65,12 @@ export class Hand extends EventEmitter {
|
||||
y: 0,
|
||||
parent: this.container,
|
||||
})
|
||||
this.container.addChild(this.scoreLayer)
|
||||
this.container.addChild(this.activeLayer)
|
||||
}
|
||||
|
||||
gameFinished() {
|
||||
this.logger.debug('gameFinished')
|
||||
this.tiles = []
|
||||
|
||||
this.initialized = false
|
||||
}
|
||||
|
||||
@ -205,6 +212,22 @@ export class Hand extends EventEmitter {
|
||||
this.render()
|
||||
}
|
||||
|
||||
setPlayer(player: PlayerDto | undefined) {
|
||||
if (!player) return
|
||||
this.player = player
|
||||
this.render()
|
||||
}
|
||||
|
||||
setScore(score: number) {
|
||||
this.score = score
|
||||
this.render()
|
||||
}
|
||||
|
||||
setActive(active: boolean) {
|
||||
this.active = active
|
||||
this.render()
|
||||
}
|
||||
|
||||
private createTiles(playerState: PlayerDto) {
|
||||
return playerState.hand.map((tile: TileDto) => {
|
||||
const newTile: Tile = new Tile(tile.id, this.ticker, tile.pips, this.scale, tile.playerId)
|
||||
@ -244,11 +267,38 @@ export class Hand extends EventEmitter {
|
||||
}
|
||||
|
||||
renderScore() {
|
||||
//this.scoreLayer.removeChildren()
|
||||
this.scoreLayer.removeChildren()
|
||||
const name = createText({
|
||||
text: this.player?.name ?? '-',
|
||||
x: 100,
|
||||
y: 50,
|
||||
style: playerNameText,
|
||||
})
|
||||
const text = createText({
|
||||
text: `${this.score}`,
|
||||
x: 100,
|
||||
// x: this.width - 5,
|
||||
y: 80,
|
||||
style: whiteStyle(36, 'bold'),
|
||||
})
|
||||
text.anchor.set(1, 0.5)
|
||||
this.scoreLayer.addChild(name)
|
||||
this.scoreLayer.addChild(text)
|
||||
}
|
||||
|
||||
renderActive() {
|
||||
this.activeLayer.removeChildren()
|
||||
if (this.active) {
|
||||
const rectangle = new Graphics()
|
||||
.roundRect(0, 0, this.width, this.height - 1, 5)
|
||||
.stroke(Config.activeHandStrokeColor)
|
||||
this.activeLayer.addChild(rectangle)
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
this.renderTiles()
|
||||
this.renderScore()
|
||||
this.renderActive()
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,8 @@ import { Scale, type ScaleFunction } from './utilities/scale'
|
||||
import { Tile } from './Tile'
|
||||
import type { Movement, PlayerDto, TileDto } from '@/common/interfaces'
|
||||
import { createContainer } from '@/common/helpers'
|
||||
import { createText, playerNameText, scoreText } from './utilities/fonts'
|
||||
import { createText, playerNameText, whiteStyle } from './utilities/fonts'
|
||||
import Config from '@/game/Config'
|
||||
|
||||
export class OtherHand {
|
||||
tilesInitialNumber: number = 7
|
||||
@ -62,10 +63,11 @@ export class OtherHand {
|
||||
|
||||
setScore(score: number) {
|
||||
this.score = score
|
||||
this.render()
|
||||
}
|
||||
|
||||
setHand(tiles: TileDto[]) {
|
||||
this.hand = tiles.map((tile) => new Tile(tile.id, this.app.ticker, undefined, this.scale))
|
||||
this.hand = tiles.map((tile) => new Tile(tile.id, this.app.ticker, tile.pips, this.scale))
|
||||
this.render()
|
||||
}
|
||||
|
||||
@ -80,7 +82,7 @@ export class OtherHand {
|
||||
text: `${this.score}`,
|
||||
x: this.width - 5,
|
||||
y: 50,
|
||||
style: scoreText,
|
||||
style: whiteStyle(36, 'bold'),
|
||||
})
|
||||
text.anchor.set(1, 0.5)
|
||||
this.scoreLayer.addChild(text)
|
||||
@ -90,7 +92,7 @@ export class OtherHand {
|
||||
this.tilesLayer.removeChildren()
|
||||
const x = -9
|
||||
this.hand.forEach((tile, index) => {
|
||||
tile.setPosition(this.scaleX(x + index * 2), this.height / 2)
|
||||
tile.setPosition(this.scaleX(x + index * 2), this.height / 2 + 10)
|
||||
this.tilesLayer.addChild(tile.getSprite())
|
||||
})
|
||||
}
|
||||
@ -98,7 +100,9 @@ export class OtherHand {
|
||||
private renderActive() {
|
||||
this.interactionsLayer.removeChildren()
|
||||
if (this.active) {
|
||||
const rectangle = new Graphics().roundRect(0, 0, this.width, this.height, 5).stroke(0xffff00)
|
||||
const rectangle = new Graphics()
|
||||
.roundRect(0, 0, this.width, this.height, 5)
|
||||
.stroke(Config.activeHandStrokeColor)
|
||||
this.interactionsLayer.addChild(rectangle)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user