fixed zone reduction sequence

This commit is contained in:
2024-04-17 19:32:56 +00:00
parent 46ce93e84e
commit ddbb71b5f6
2 changed files with 56 additions and 35 deletions

View File

@@ -21,6 +21,9 @@ export default class Game {
}
//The game has started
if(newState == GameState.PLAYING) {
if(!this.zone.ready()) {
return false;
}
this.initLastSentLocations();
this.zone.reset()
this.zone.start()

View File

@@ -38,6 +38,28 @@ export class ZoneManager {
this.onNextZoneUpdate = onNextZoneUpdate
}
/**
* Test if a given configuration object is valid, i.e if all needed values are well defined
* @param {Object} settings Settings object describing a config of a zone manager
* @returns if the config is correct
*/
validateSettings(settings) {
if (settings.reductionCount && (typeof settings.reductionCount != "number" || settings.reductionCount <= 0)) { return false }
if (settings.reductionDuration && (typeof settings.reductionDuration != "number" || settings.reductionDuration < 0)) { return false }
if (settings.reductionInterval && (typeof settings.reductionInterval != "number" || settings.reductionInterval < 0)) { return false }
if (settings.updateIntervalSeconds && (typeof settings.updateIntervalSeconds != "number" || settings.updateIntervalSeconds <= 0)) { return false }
if (settings.max && (typeof settings.max.radius != "number" || typeof settings.max.center.lat != "number" || typeof settings.max.center.lng != "number")) { return false }
if (settings.min && (typeof settings.min.radius != "number" || typeof settings.min.center.lat != "number" || typeof settings.min.center.lng != "number")) { return false }
return true;
}
/**
* Test if the zone manager is ready to start
* @returns true if the zone manager is ready to be started, false otherwise
*/
ready() {
return this.validateSettings(this.zoneSettings);
}
/**
* Update the settings of the zone, this can be done by passing an object containing the settings to change.
* Unless specified, the durations are in minutes
@@ -55,12 +77,6 @@ export class ZoneManager {
*/
udpateSettings(newSettings) {
//validate settings
if(newSettings.reductionCount &&(typeof newSettings.reductionCount != "number" || newSettings.reductionCount <= 0)) {return false}
if(newSettings.reductionDuration &&(typeof newSettings.reductionDuration != "number" || newSettings.reductionDuration <= 0)) {return false}
if(newSettings.reductionInterval &&(typeof newSettings.reductionInterval != "number" || newSettings.reductionInterval <= 0)) {return false}
if(newSettings.updateIntervalSeconds &&(typeof newSettings.updateIntervalSeconds != "number" || newSettings.updateIntervalSeconds <= 0)) {return false}
if(newSettings.max && (typeof newSettings.max.radius != "number" || typeof newSettings.max.center.lat != "number" || typeof newSettings.max.center.lng != "number")) {return false}
if(newSettings.min && (typeof newSettings.min.radius != "number" || typeof newSettings.min.center.lat != "number" || typeof newSettings.min.center.lng != "number")) {return false}
this.zoneSettings = { ...this.zoneSettings, ...newSettings };
this.shrinkFactor = Math.pow(this.zoneSettings.min.radius / this.zoneSettings.max.radius, 1 / this.zoneSettings.reductionCount)
return true;
@@ -121,27 +137,29 @@ export class ZoneManager {
* Wait for the appropriate duration before starting a new zone reduction if needed
*/
setNextZone() {
console.log("Setting next zone",this.currentZoneCount,this.zoneSettings.reductionCount)
console.log("Setting next zone", this.currentZoneCount, this.zoneSettings.reductionCount, this.zoneSettings.reductionInterval)
//At this point, nextZone == currentZone, we need to update the next zone, the raidus decrement, and start a timer before the next shrink
//last zone
if(this.currentZoneCount == this.zoneSettings.reductionCount - 1) {
if (this.currentZoneCount == this.zoneSettings.reductionCount) {
console.log("last zone reached")
this.nextZone = JSON.parse(JSON.stringify(this.zoneSettings.min))
this.currentStartZone = JSON.parse(JSON.stringify(this.zoneSettings.min))
this.nextZoneTimeoutId = setTimeout(() => this.startShrinking(), 1000 * 60 * this.zoneSettings.reductionIntervalMinutes)
} else if (this.currentZoneCount == this.zoneSettings.reductionCount - 1) {
this.nextZone = JSON.parse(JSON.stringify(this.zoneSettings.min))
this.nextZoneTimeoutId = setTimeout(() => this.startShrinking(), 1000 * 60 * this.zoneSettings.reductionInterval)
this.currentZoneCount++;
}else if(this.currentZoneCount < this.zoneSettings.reductionCount - 1){
} else if (this.currentZoneCount < this.zoneSettings.reductionCount) {
console.log("started timer for next zone")
this.nextZone.center = this.getRandomNextCenter(this.nextZone.radius * this.shrinkFactor)
console.log(this.nextZone, this.shrinkFactor)
this.nextZone.radius *= this.shrinkFactor;
console.log(this.nextZone, this.shrinkFactor)
this.currentStartZone = JSON.parse(JSON.stringify(this.currentZone))
this.nextZoneTimeoutId = setTimeout(() => this.startShrinking(), 1000 * 60 * this.zoneSettings.reductionInterval)
this.currentZoneCount++;
}
this.onNextZoneUpdate({
begin: JSON.parse(JSON.stringify(this.currentStartZone)),
end: JSON.parse(JSON.stringify(this.nextZone))
})
this.nextZoneTimeoutId = setTimeout(() => this.startShrinking(), 1000 * 60 * this.zoneSettings.reductionIntervalMinutes)
this.currentZoneCount++;
}
}
/*