35 lines
1.3 KiB
TypeScript
35 lines
1.3 KiB
TypeScript
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;
|
|
},
|
|
};
|
|
}
|