diff --git a/traque-back/admin_socket.js b/traque-back/admin_socket.js index 0888376..212c111 100644 --- a/traque-back/admin_socket.js +++ b/traque-back/admin_socket.js @@ -130,6 +130,7 @@ export function initAdminSocketHandler() { if (game.updateTeam(teamId, newTeam)) { secureAdminBroadcast("teams", game.teams); sendUpdatedTeamInformations(teamId) + sendUpdatedTeamInformations(game.getTeam(teamId).chased) } }) diff --git a/traque-back/game.js b/traque-back/game.js index 2dd7fe7..e5ed0fa 100644 --- a/traque-back/game.js +++ b/traque-back/game.js @@ -27,7 +27,11 @@ export default class Game { } this.initLastSentLocations(); this.zone.reset() - this.zone.start() + //If the zone cannot be setup, reset everything + if(!this.zone.start()) { + this.setState(GameState.SETUP); + return; + } } if (newState != GameState.PLAYING) { this.zone.reset(); @@ -59,6 +63,7 @@ export default class Game { lastSentLocation: null, locationSendDeadline: null, enemyLocation: null, + enemyName: null, captureCode: this.createCaptureCode(), sockets: [], startingArea: null, @@ -91,6 +96,7 @@ export default class Game { if (previousTeam != null) { this.teams[i].chased = previousTeam; this.getTeam(previousTeam).chasing = this.teams[i].id; + this.getTeam(previousTeam).enemyName = this.teams[i].name; } else { firstTeam = this.teams[i].id; } @@ -99,6 +105,7 @@ export default class Game { } this.getTeam(firstTeam).chased = previousTeam; this.getTeam(previousTeam).chasing = firstTeam; + this.getTeam(previousTeam).enemyName = this.getTeam(firstTeam).name; return true; } @@ -179,7 +186,7 @@ export default class Game { */ requestCapture(teamId, captureCode) { let enemyTeam = this.getTeam(this.getTeam(teamId).chasing) - if (enemyTeam.captureCode == captureCode) { + if (enemyTeam && enemyTeam.captureCode == captureCode) { this.capture(enemyTeam); this.updateTeamChasing(); return true; diff --git a/traque-back/team_socket.js b/traque-back/team_socket.js index d0ac95a..8ac1056 100644 --- a/traque-back/team_socket.js +++ b/traque-back/team_socket.js @@ -40,6 +40,7 @@ export function sendUpdatedTeamInformations(teamId) { io.of("player").to(socketId).emit("update_team", { name: team.name, enemyLocation: team.enemyLocation, + enemyName: team.enemyName, currentLocation: team.currentLocation, lastSentLocation: team.lastSentLocation, locationSendDeadline: team.locationSendDeadline, diff --git a/traque-back/zone_manager.js b/traque-back/zone_manager.js index edf68de..31cdb91 100644 --- a/traque-back/zone_manager.js +++ b/traque-back/zone_manager.js @@ -1,5 +1,5 @@ -import randomLocation, { randomCirclePoint } from 'random-location' -import { getDistanceFromLatLon, isInCircle } from './map_utils.js'; +import { randomCirclePoint } from 'random-location' +import { isInCircle } from './map_utils.js'; import { map } from './util.js'; export class ZoneManager { @@ -108,7 +108,8 @@ export class ZoneManager { this.nextZone = JSON.parse(JSON.stringify(this.zoneSettings.max)); this.currentStartZone = JSON.parse(JSON.stringify(this.zoneSettings.max)); this.currentZone = JSON.parse(JSON.stringify(this.zoneSettings.max)); - this.setNextZone(); + return this.setNextZone(); + } /** @@ -121,11 +122,16 @@ export class ZoneManager { getRandomNextCenter(newRadius) { let ok = false; let res = null + let tries = 0; + const MAX_TRIES = 100000 //take a random point satisfying both conditions - while (!ok) { + while (tries++ < MAX_TRIES && !ok) { res = randomCirclePoint({ latitude: this.currentZone.center.lat, longitude: this.currentZone.center.lng }, this.currentZone.radius - newRadius); ok = (isInCircle({ lat: res.latitude, lng: res.longitude }, this.zoneSettings.min.center, newRadius - this.zoneSettings.min.radius)) } + if(tries>=MAX_TRIES) { + return false; + } return { lat: res.latitude, lng: res.longitude @@ -149,6 +155,11 @@ export class ZoneManager { this.currentZoneCount++; } else if (this.currentZoneCount < this.zoneSettings.reductionCount) { this.nextZone.center = this.getRandomNextCenter(this.nextZone.radius - this.nextZoneDecrement) + //Next center cannot be found + if(this.nextZone.center === false) { + console.log("no center") + return false; + } this.nextZone.radius -= this.nextZoneDecrement; this.currentStartZone = JSON.parse(JSON.stringify(this.currentZone)) this.nextZoneTimeoutId = setTimeout(() => this.startShrinking(), 1000 * 60 * this.zoneSettings.reductionInterval) @@ -159,6 +170,7 @@ export class ZoneManager { begin: JSON.parse(JSON.stringify(this.currentStartZone)), end: JSON.parse(JSON.stringify(this.nextZone)) }) + return true; } /*