export type RainGearItem = 'umbrella' | 'raincoat' | 'hood'; /** Equipment is independent of movement and emotes. */ export function createRainGearState() { const worn = { umbrella: false, raincoat: false, hood: false }; let available = false; let awaitingArrivalWeather = true; return { get available() { return available; }, get umbrella() { return worn.umbrella; }, get raincoat() { return worn.raincoat; }, get hood() { return worn.hood; }, apply(state: { umbrella: boolean; raincoat: boolean; hood: boolean }) { worn.umbrella = state.umbrella; worn.raincoat = state.raincoat; worn.hood = state.raincoat && state.hood; }, updateWeather(rain: number | null, snowfall: number | null) { available = (rain ?? 0) > 0 || (snowfall ?? 0) > 0; if (awaitingArrivalWeather && rain !== null) { if (rain > 0) { worn.raincoat = true; worn.hood = true; } awaitingArrivalWeather = false; } if (!available) { worn.umbrella = false; worn.raincoat = false; worn.hood = false; } }, toggle(item: RainGearItem) { if (!available) return false; if (item === 'hood' && !worn.raincoat) return false; worn[item] = !worn[item]; if (!worn.raincoat) worn.hood = false; return true; }, }; }