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/events/chat/gameMaster/toggleFogCommand.ts b/src/events/chat/gameMaster/toggleFogCommand.ts index d77e306..82df6e0 100644 --- a/src/events/chat/gameMaster/toggleFogCommand.ts +++ b/src/events/chat/gameMaster/toggleFogCommand.ts @@ -20,7 +20,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.toggleFog(Number(args![0])) + } 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..6675f96 100644 --- a/src/events/chat/gameMaster/toggleRainCommand.ts +++ b/src/events/chat/gameMaster/toggleRainCommand.ts @@ -20,7 +20,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.toggleRain(Number(args![0])) + } 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..e272607 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,13 +39,13 @@ class WeatherManager { return { ...this.weatherState } } - public async toggleRain(): Promise { - this.updateWeatherProperty('rain') + public async toggleRain(value? : number): Promise { + this.updateWeatherProperty('rain', value) await this.saveAndEmitWeather() } - public async toggleFog(): Promise { - this.updateWeatherProperty('fog') + public async toggleFog(value? : number): Promise { + this.updateWeatherProperty('fog', value) await this.saveAndEmitWeather() } @@ -63,9 +59,7 @@ class WeatherManager { const world = await worldRepository.getFirst() if (world) { this.weatherState = { - isRainEnabled: world.isRainEnabled, rainPercentage: world.rainPercentage, - isFogEnabled: world.isFogEnabled, fogDensity: world.fogDensity } } @@ -90,15 +84,25 @@ class WeatherManager { } } - 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 + if (value !== undefined) { + this.weatherState.rainPercentage = value + } + else { + this.weatherState.rainPercentage = this.weatherState.rainPercentage > 0 ? 0 : + this.weatherState.rainPercentage = this.getRandomNumber(WeatherManager.CONFIG.RAIN_PERCENTAGE_RANGE.min, WeatherManager.CONFIG.RAIN_PERCENTAGE_RANGE.max) + } } 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 + if (value !== undefined) { + this.weatherState.fogDensity = value + } + else { + this.weatherState.rainPercentage = this.weatherState.fogDensity > 0 ? 0 : + this.weatherState.fogDensity = this.getRandomNumber(WeatherManager.CONFIG.FOG_DENSITY_RANGE.min, WeatherManager.CONFIG.FOG_DENSITY_RANGE.max) + } } } @@ -119,10 +123,10 @@ class WeatherManager { if (!world) world = new World() await world - .setIsRainEnabled(this.weatherState.isRainEnabled) .setRainPercentage(this.weatherState.rainPercentage) - .setIsFogEnabled(this.weatherState.isFogEnabled) + .setIsRainEnabled(this.weatherState.rainPercentage > 0) .setFogDensity(this.weatherState.fogDensity) + .setIsFogEnabled(this.weatherState.fogDensity > 0) .save() } catch (error) { this.logError('save', error)