diff --git a/src/application/types.ts b/src/application/types.ts index f6aa12b..9a7bdcf 100644 --- a/src/application/types.ts +++ b/src/application/types.ts @@ -46,8 +46,11 @@ export type AssetData = { export type WorldSettings = { date: Date - isRainEnabled: boolean - isFogEnabled: boolean + weatherState: WeatherState +} + +export type WeatherState = { + rainPercentage: number fogDensity: number } diff --git a/src/entities/base/world.ts b/src/entities/base/world.ts index 50658d1..21476c1 100644 --- a/src/entities/base/world.ts +++ b/src/entities/base/world.ts @@ -6,15 +6,9 @@ export class BaseWorld extends BaseEntity { @PrimaryKey() date = new Date() - @Property() - isRainEnabled = false - @Property() rainPercentage = 0 - @Property() - isFogEnabled = false - @Property() fogDensity = 0 @@ -27,15 +21,6 @@ export class BaseWorld extends BaseEntity { return this.date } - setIsRainEnabled(isRainEnabled: boolean) { - this.isRainEnabled = isRainEnabled - return this - } - - getIsRainEnabled() { - return this.isRainEnabled - } - setRainPercentage(rainPercentage: number) { this.rainPercentage = rainPercentage return this @@ -45,15 +30,6 @@ export class BaseWorld extends BaseEntity { return this.rainPercentage } - setIsFogEnabled(isFogEnabled: boolean) { - this.isFogEnabled = isFogEnabled - return this - } - - getIsFogEnabled() { - return this.isFogEnabled - } - setFogDensity(fogDensity: number) { this.fogDensity = fogDensity return this diff --git a/src/events/chat/gameMaster/toggleFogCommand.ts b/src/events/chat/gameMaster/toggleFogCommand.ts index d77e306..27c2ac3 100644 --- a/src/events/chat/gameMaster/toggleFogCommand.ts +++ b/src/events/chat/gameMaster/toggleFogCommand.ts @@ -1,6 +1,5 @@ import { BaseEvent } from '#application/base/baseEvent' import WeatherManager from '#managers/weatherManager' -import CharacterRepository from '#repositories/characterRepository' import ChatService from '#services/chatService' type TypePayload = { @@ -20,7 +19,10 @@ export default class ToggleFogCommand extends BaseEvent { // Check if character exists and is GM if (!(await this.isCharacterGM())) return - await WeatherManager.toggleFog() + const args = ChatService.getArgs('fog', data.message) + + await WeatherManager.setFogValue(args![0] ? Number(args![0]) : null); + callback(true) } catch (error: any) { this.logger.error('command error', error.message) callback(false) diff --git a/src/events/chat/gameMaster/toggleRainCommand.ts b/src/events/chat/gameMaster/toggleRainCommand.ts index 039a7f3..f8bc3a7 100644 --- a/src/events/chat/gameMaster/toggleRainCommand.ts +++ b/src/events/chat/gameMaster/toggleRainCommand.ts @@ -1,6 +1,5 @@ import { BaseEvent } from '#application/base/baseEvent' import WeatherManager from '#managers/weatherManager' -import CharacterRepository from '#repositories/characterRepository' import ChatService from '#services/chatService' type TypePayload = { @@ -20,7 +19,10 @@ export default class ToggleRainCommand extends BaseEvent { // Check if character exists and is GM if (!(await this.isCharacterGM())) return - await WeatherManager.toggleRain() + let args = ChatService.getArgs('rain', data.message) + + await WeatherManager.setRainValue(args![0] ? Number(args![0]) : null); + callback(true) } catch (error: any) { this.logger.error('command error', error.message) callback(false) diff --git a/src/managers/weatherManager.ts b/src/managers/weatherManager.ts index c6bb63f..e8440bc 100644 --- a/src/managers/weatherManager.ts +++ b/src/managers/weatherManager.ts @@ -6,9 +6,7 @@ import SocketManager from '#managers/socketManager' import WorldRepository from '#repositories/worldRepository' type WeatherState = { - isRainEnabled: boolean rainPercentage: number - isFogEnabled: boolean fogDensity: number } @@ -26,9 +24,7 @@ class WeatherManager { private intervalId: NodeJS.Timeout | null = null private weatherState: WeatherState = { - isRainEnabled: false, rainPercentage: 0, - isFogEnabled: false, fogDensity: 0 } @@ -43,18 +39,31 @@ class WeatherManager { return { ...this.weatherState } } - public async toggleRain(): Promise { - this.updateWeatherProperty('rain') + public randomWeatherValue(type: 'rain' | 'fog' ) { + switch (type) { + case 'rain': + return this.getRandomNumber(WeatherManager.CONFIG.RAIN_PERCENTAGE_RANGE.min, WeatherManager.CONFIG.RAIN_PERCENTAGE_RANGE.max) + case 'fog': + return this.getRandomNumber(WeatherManager.CONFIG.FOG_DENSITY_RANGE.min, WeatherManager.CONFIG.FOG_DENSITY_RANGE.max) + } + } + + public async setRainValue(value : number | null): Promise { + if (value === null) { + value = this.randomWeatherValue('rain') + } + + this.updateWeatherProperty('rain', value) await this.saveAndEmitWeather() } - public async toggleFog(): Promise { - this.updateWeatherProperty('fog') - await this.saveAndEmitWeather() - } + public async setFogValue(value : number | null): Promise { + if (value === null) { + value = this.randomWeatherValue('fog') + } - public cleanup(): void { - this.intervalId && clearInterval(this.intervalId) + this.updateWeatherProperty('fog', value) + await this.saveAndEmitWeather() } private async loadWeather(): Promise { @@ -63,9 +72,7 @@ class WeatherManager { const world = await worldRepository.getFirst() if (world) { this.weatherState = { - isRainEnabled: world.isRainEnabled, rainPercentage: world.rainPercentage, - isFogEnabled: world.isFogEnabled, fogDensity: world.fogDensity } } @@ -83,22 +90,20 @@ class WeatherManager { private updateRandomWeather(): void { if (Math.random() < WeatherManager.CONFIG.RAIN_CHANCE) { - this.updateWeatherProperty('rain') + this.updateWeatherProperty('rain', this.randomWeatherValue('rain') ) } if (Math.random() < WeatherManager.CONFIG.FOG_CHANCE) { - this.updateWeatherProperty('fog') + this.updateWeatherProperty('fog', this.randomWeatherValue('fog')) } } - private updateWeatherProperty(type: 'rain' | 'fog'): void { + private updateWeatherProperty(type: 'rain' | 'fog', value: number): void { if (type === 'rain') { - this.weatherState.isRainEnabled = !this.weatherState.isRainEnabled - this.weatherState.rainPercentage = this.weatherState.isRainEnabled ? this.getRandomNumber(WeatherManager.CONFIG.RAIN_PERCENTAGE_RANGE.min, WeatherManager.CONFIG.RAIN_PERCENTAGE_RANGE.max) : 0 + this.weatherState.rainPercentage = value } if (type === 'fog') { - this.weatherState.isFogEnabled = !this.weatherState.isFogEnabled - this.weatherState.fogDensity = this.weatherState.isFogEnabled ? this.getRandomNumber(WeatherManager.CONFIG.FOG_DENSITY_RANGE.min, WeatherManager.CONFIG.FOG_DENSITY_RANGE.max) : 0 + this.weatherState.fogDensity = value } } @@ -118,10 +123,9 @@ class WeatherManager { let world = await worldRepository.getFirst() if (!world) world = new World() + //the data model still contains the booleans await world - .setIsRainEnabled(this.weatherState.isRainEnabled) .setRainPercentage(this.weatherState.rainPercentage) - .setIsFogEnabled(this.weatherState.isFogEnabled) .setFogDensity(this.weatherState.fogDensity) .save() } catch (error) { diff --git a/src/services/chatService.ts b/src/services/chatService.ts index 32c22b5..02a1f4c 100644 --- a/src/services/chatService.ts +++ b/src/services/chatService.ts @@ -38,7 +38,7 @@ class ChatService extends BaseService { public getArgs(command: string, message: string): string[] | undefined { if (!this.isCommand(message, command)) return - return message.split(`/${command} `)[1].split(' ') + return message.slice(`/${command} `.length).split(' ') } }