fixes
This commit is contained in:
parent
d999bb3479
commit
d862f94f74
@ -11,11 +11,11 @@ import {
|
||||
import { Scale, type ScaleFunction } from '@/game/utilities/scale'
|
||||
import type { GameState, Movement, TileDto } from '@/common/interfaces'
|
||||
import { Tile } from '@/game/Tile'
|
||||
import { DIRECTIONS, createContainer, isTilePair } from '@/common/helpers'
|
||||
import { DIRECTIONS, createContainer, isTilePair, isTileVertical } from '@/common/helpers'
|
||||
import { createText } from '@/game/utilities/fonts'
|
||||
import { Dot } from '@/game/Dot'
|
||||
import { LoggingService } from '@/services/LoggingService'
|
||||
import { inject } from 'vue'
|
||||
import { GlowFilter } from 'pixi-filters'
|
||||
|
||||
export class Board extends EventEmitter {
|
||||
private _scale: number = 1
|
||||
@ -182,71 +182,6 @@ export class Board extends EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
getOrientationII(tile: TileDto, side: string) {
|
||||
let orientation = ''
|
||||
const isPair = isTilePair(tile)
|
||||
if (side === 'left') {
|
||||
if (this.freeEnds !== undefined && tile.pips !== undefined) {
|
||||
const isInverted = this.freeEnds[0] === tile.pips[1]
|
||||
if (this.leftDirection === 'east') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'east' : 'west'
|
||||
} else {
|
||||
orientation = 'north'
|
||||
}
|
||||
} else if (this.leftDirection === 'west') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'west' : 'east'
|
||||
} else {
|
||||
orientation = 'north'
|
||||
}
|
||||
} else if (this.leftDirection === 'north') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'north' : 'south'
|
||||
} else {
|
||||
orientation = 'west'
|
||||
}
|
||||
} else if (this.leftDirection === 'south') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'south' : 'north'
|
||||
} else {
|
||||
orientation = 'west'
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (side === 'right') {
|
||||
if (this.freeEnds !== undefined && tile.pips !== undefined) {
|
||||
const isInverted = this.freeEnds[1] === tile.pips[0]
|
||||
if (this.rightDirection === 'east') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'west' : 'east'
|
||||
} else {
|
||||
orientation = 'north'
|
||||
}
|
||||
} else if (this.rightDirection === 'west') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'east' : 'west'
|
||||
} else {
|
||||
orientation = 'north'
|
||||
}
|
||||
} else if (this.rightDirection === 'north') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'south' : 'north'
|
||||
} else {
|
||||
orientation = 'west'
|
||||
}
|
||||
} else if (this.rightDirection === 'south') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'north' : 'south'
|
||||
} else {
|
||||
orientation = 'west'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return orientation
|
||||
}
|
||||
|
||||
addTile(tile: Tile, move: Movement) {
|
||||
let orientation = ''
|
||||
let x: number =
|
||||
@ -277,7 +212,7 @@ export class Board extends EventEmitter {
|
||||
const directionIndex = DIRECTIONS.indexOf(direction)
|
||||
isLeft ? (this.leftDirection = direction) : (this.rightDirection = direction)
|
||||
const availablePosition: [number, number] | undefined = availablePositions[directionIndex]
|
||||
orientation = this.getOrientationII(tileDto, move.type)
|
||||
orientation = this.getOrientation(tileDto, move.type)
|
||||
availablePosition && ([x, y] = availablePosition)
|
||||
} else {
|
||||
if (this.tiles.length === 0) {
|
||||
@ -305,25 +240,13 @@ export class Board extends EventEmitter {
|
||||
}
|
||||
direction = DIRECTIONS[directionIndex]
|
||||
isLeft ? (this.leftDirection = direction) : (this.rightDirection = direction)
|
||||
orientation = this.getOrientationII(tileDto, move.type)
|
||||
orientation = this.getOrientation(tileDto, move.type)
|
||||
availablePosition && ([x, y] = availablePosition)
|
||||
}
|
||||
}
|
||||
const endTile = isLeft ? this.leftTile : this.rightTile
|
||||
const isEndVertical = endTile?.isVertical() ?? false
|
||||
const isNextVertical = orientation === 'north' || orientation === 'south'
|
||||
if (this.tiles.length > 0 && endTile !== undefined) {
|
||||
//!tile.equals(endTile)
|
||||
if (direction === 'east') {
|
||||
x += !isEndVertical && isNextVertical ? 0 : 1
|
||||
} else if (direction === 'west') {
|
||||
x -= !isEndVertical && isNextVertical ? 0 : 1
|
||||
} else if (direction === 'north') {
|
||||
y -= isEndVertical && !isNextVertical ? 0 : 1
|
||||
} else if (direction === 'south') {
|
||||
y += isEndVertical && !isNextVertical ? 0 : 1
|
||||
}
|
||||
}
|
||||
tile.setPosition(this.scaleX(x), this.scaleY(y))
|
||||
tile.setOrientation(orientation)
|
||||
tile.reScale(this.scale)
|
||||
@ -400,7 +323,7 @@ export class Board extends EventEmitter {
|
||||
|
||||
setValidEnds(values: boolean[], tile: TileDto) {
|
||||
if (this.count === 0) {
|
||||
this.createInteractionsII('right', [[0, 0], undefined, undefined, undefined])
|
||||
this.createInteractions('right', [[0, 0], undefined, undefined, undefined])
|
||||
return
|
||||
}
|
||||
|
||||
@ -408,13 +331,13 @@ export class Board extends EventEmitter {
|
||||
const side = 'left'
|
||||
const validInteractions = this.nextTileValidMoves(tile, side)
|
||||
const validPoints = this.nextTileValidPoints(tile, side, validInteractions)
|
||||
this.createInteractionsII(side, validPoints)
|
||||
this.createInteractions(side, validPoints)
|
||||
}
|
||||
if (values[1]) {
|
||||
const side = 'right'
|
||||
const validInteractions = this.nextTileValidMoves(tile, side)
|
||||
const validPoints = this.nextTileValidPoints(tile, side, validInteractions)
|
||||
this.createInteractionsII(side, validPoints)
|
||||
this.createInteractions(side, validPoints)
|
||||
}
|
||||
}
|
||||
|
||||
@ -439,37 +362,39 @@ export class Board extends EventEmitter {
|
||||
let pointEast: [number, number] | undefined = undefined
|
||||
let pointWest: [number, number] | undefined = undefined
|
||||
|
||||
const incX = isTilePair(tile) ? 3 : 4
|
||||
|
||||
if (this.count !== 0) {
|
||||
if (validMoves[0]) {
|
||||
// north
|
||||
if (isEndVertical) {
|
||||
pointNorth = [x, y - 3]
|
||||
pointNorth = [x, y - incX]
|
||||
} else {
|
||||
pointNorth = isEndPair ? [x, y - 2] : [x + 1 * signX, y - 2]
|
||||
pointNorth = isEndPair ? [x, y - 3] : [x + 1 * signX, y - 3]
|
||||
}
|
||||
}
|
||||
if (validMoves[2]) {
|
||||
// south
|
||||
if (isEndVertical) {
|
||||
pointSouth = [x, y + 3]
|
||||
pointSouth = [x, y + incX]
|
||||
} else {
|
||||
pointSouth = isEndPair ? [x, y + 2] : [x + 1 * signX, y + 2]
|
||||
pointSouth = isEndPair ? [x, y + 3] : [x + 1 * signX, y + 3]
|
||||
}
|
||||
}
|
||||
if (validMoves[1]) {
|
||||
// east
|
||||
if (isEndVertical) {
|
||||
pointEast = isEndPair ? [x + 2, y] : [x + 2, y + 1 * signY]
|
||||
pointEast = isEndPair ? [x + 3, y] : [x + 3, y + 1 * signY]
|
||||
} else {
|
||||
pointEast = [x + 3, y]
|
||||
pointEast = [x + incX, y]
|
||||
}
|
||||
}
|
||||
if (validMoves[3]) {
|
||||
// west
|
||||
if (isEndVertical) {
|
||||
pointWest = isEndPair ? [x - 2, y] : [x - 2, y + 1 * signY]
|
||||
pointWest = isEndPair ? [x - 3, y] : [x - 3, y + 1 * signY]
|
||||
} else {
|
||||
pointWest = [x - 3, y]
|
||||
pointWest = [x - incX, y]
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -477,7 +402,7 @@ export class Board extends EventEmitter {
|
||||
return [pointNorth, pointEast, pointSouth, pointWest]
|
||||
}
|
||||
|
||||
createInteractionsII(side: string, validInteractions: ([number, number] | undefined)[]) {
|
||||
createInteractions(side: string, validInteractions: ([number, number] | undefined)[]) {
|
||||
if (validInteractions[0] !== undefined) {
|
||||
this.addInteraction(validInteractions[0][0], validInteractions[0][1], side, 'north')
|
||||
}
|
||||
@ -497,23 +422,102 @@ export class Board extends EventEmitter {
|
||||
}
|
||||
|
||||
addInteraction(x: number, y: number, side: string, direction?: string) {
|
||||
const dot = new Dot(this.ticker, this.scale)
|
||||
dot.alpha = 0.5
|
||||
const dot = new Tile('ghost', this.ticker, undefined, this.scale)
|
||||
dot.setFilters([
|
||||
new GlowFilter({
|
||||
distance: 5,
|
||||
outerStrength: 1,
|
||||
innerStrength: 0,
|
||||
color: 0xffffff,
|
||||
quality: 0.5
|
||||
})
|
||||
])
|
||||
dot.setOrientation(direction ?? 'north')
|
||||
// const dot = new Dot(this.ticker, this.scale)
|
||||
dot.alpha = 0.1
|
||||
dot.interactive = true
|
||||
dot.on('pointerdown', () => {
|
||||
this.emit(`${side}Click`, direction && { direction, x, y })
|
||||
this.cleanInteractions()
|
||||
})
|
||||
dot.on('pointerover', () => {
|
||||
dot.alpha = 1
|
||||
dot.alpha = 0.2
|
||||
})
|
||||
dot.on('pointerout', () => {
|
||||
dot.alpha = 0.5
|
||||
dot.alpha = 0.1
|
||||
})
|
||||
dot.setPosition(this.scaleX(x), this.scaleY(y))
|
||||
dot.addTo(this.interactionContainer)
|
||||
}
|
||||
|
||||
getOrientation(tile: TileDto, side: string) {
|
||||
let orientation = ''
|
||||
const isPair = isTilePair(tile)
|
||||
const isLeft = side === 'left'
|
||||
const endTile = isLeft ? this.leftTile : this.rightTile
|
||||
|
||||
if (side === 'left') {
|
||||
if (this.freeEnds !== undefined && tile.pips !== undefined) {
|
||||
const isInverted = this.freeEnds[0] === tile.pips[1]
|
||||
if (this.leftDirection === 'east') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'east' : 'west'
|
||||
} else {
|
||||
endTile?.isVertical() ? (orientation = 'west') : (orientation = 'north')
|
||||
}
|
||||
} else if (this.leftDirection === 'west') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'west' : 'east'
|
||||
} else {
|
||||
endTile?.isVertical() ? (orientation = 'west') : (orientation = 'north')
|
||||
}
|
||||
} else if (this.leftDirection === 'north') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'north' : 'south'
|
||||
} else {
|
||||
endTile?.isVertical() ? (orientation = 'west') : (orientation = 'north')
|
||||
}
|
||||
} else if (this.leftDirection === 'south') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'south' : 'north'
|
||||
} else {
|
||||
endTile?.isVertical() ? (orientation = 'west') : (orientation = 'north')
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (side === 'right') {
|
||||
if (this.freeEnds !== undefined && tile.pips !== undefined) {
|
||||
const isInverted = this.freeEnds[1] === tile.pips[0]
|
||||
if (this.rightDirection === 'east') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'west' : 'east'
|
||||
} else {
|
||||
endTile?.isVertical() ? (orientation = 'west') : (orientation = 'north')
|
||||
}
|
||||
} else if (this.rightDirection === 'west') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'east' : 'west'
|
||||
} else {
|
||||
endTile?.isVertical() ? (orientation = 'west') : (orientation = 'north')
|
||||
}
|
||||
} else if (this.rightDirection === 'north') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'south' : 'north'
|
||||
} else {
|
||||
endTile?.isVertical() ? (orientation = 'west') : (orientation = 'north')
|
||||
}
|
||||
} else if (this.rightDirection === 'south') {
|
||||
if (!isPair) {
|
||||
orientation = isInverted ? 'north' : 'south'
|
||||
} else {
|
||||
endTile?.isVertical() ? (orientation = 'west') : (orientation = 'north')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return orientation
|
||||
}
|
||||
|
||||
nextTileValidMoves(tile: TileDto, side: string): boolean[] {
|
||||
if (tile === undefined || this.freeEnds === undefined) return [false, false, false, false]
|
||||
if (this.count === 0) return [false, true, false, true] // depends on game mode
|
||||
@ -532,6 +536,10 @@ export class Board extends EventEmitter {
|
||||
const spaceNeeded = tileHeight / 2 + tileHeight + margin
|
||||
const isSecond = this.count === 1
|
||||
const isPair = isTilePair(tile)
|
||||
const hasSpaceEast = endX + signX * spaceNeeded < this.width
|
||||
const hasSpaceWest = endX + signX * spaceNeeded > 0
|
||||
const hasSpaceNorth = endY + signY * spaceNeeded > 0
|
||||
const hasSpaceSouth = endY + signY * spaceNeeded < this.height
|
||||
|
||||
let canPlayNorth = false
|
||||
let canPlaySouth = false
|
||||
@ -539,10 +547,10 @@ export class Board extends EventEmitter {
|
||||
let canPlayWest = false
|
||||
|
||||
if (validMove) {
|
||||
canPlayEast = direction !== 'west' && endX + signX * spaceNeeded < this.width
|
||||
canPlayWest = direction !== 'east' && endX + signX * spaceNeeded > 0
|
||||
canPlayNorth = direction !== 'south' && endY + signY * spaceNeeded > 0
|
||||
canPlaySouth = direction !== 'north' && endY + signY * spaceNeeded < this.height
|
||||
canPlayEast = direction !== 'west' && hasSpaceEast
|
||||
canPlayWest = direction !== 'east' && hasSpaceWest
|
||||
canPlayNorth = direction !== 'south' && hasSpaceNorth
|
||||
canPlaySouth = direction !== 'north' && hasSpaceSouth
|
||||
}
|
||||
|
||||
if (isSecond) {
|
||||
@ -550,20 +558,11 @@ export class Board extends EventEmitter {
|
||||
}
|
||||
|
||||
if (isPair && !endTile?.isVertical()) {
|
||||
if ((direction === 'east' && hasSpaceEast) || (direction === 'west' && hasSpaceWest)) {
|
||||
canPlayNorth = canPlaySouth = false
|
||||
}
|
||||
}
|
||||
|
||||
if (isPair && endTile?.isVertical()) {
|
||||
if (direction === 'north') {
|
||||
canPlaySouth = false
|
||||
} else if (direction === 'south') {
|
||||
canPlayNorth = false
|
||||
} else if (direction === 'east') {
|
||||
canPlayWest = false
|
||||
} else if (direction === 'west') {
|
||||
canPlayEast = false
|
||||
}
|
||||
}
|
||||
return [canPlayNorth, canPlayEast, canPlaySouth, canPlayWest]
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user