Spaces:
Running
Running
File size: 1,360 Bytes
8b9f7d9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
import { Ref, ref } from 'vue';
export interface IUseTime {
value: Ref<number>
isDay: Ref<boolean>
set(v: number): void
add(v?: number): void
/** Returns progress percent (from 0 up to 1).
* If `isOfHalfDay` is true, returns progress in 6-18 (day) or 18-6 (night) interval
* else, returns progress in 18-18 (start of night - end of day) interval
*/
getProgress(isOfHalfDay?: boolean): number
getTimeCaption(): string
}
function clampTime(value: number): number {
return value % 24;
}
// TODO: make basing on game minutes instead of hours, to get more flexible logic
export function useTime(startValue = 0): IUseTime {
const value = ref(startValue);
const isDay = ref(false);
function update(newValRaw: number) {
const newVal = clampTime(newValRaw);
value.value = newVal;
isDay.value = newVal >= 6 && newVal <= 18;
}
return {
value,
isDay,
set(val) {
update(val)
},
add(val = 1) {
update(value.value + val)
},
getProgress(isOfHalfDay = false) {
const limiter = isOfHalfDay ? 12 : 24;
return ((value.value + 6) % limiter) / limiter;
},
getTimeCaption() {
const minutes = `${Math.trunc((value.value % 1) * 60)}`.padStart(2, '0');
const hours = `${Math.trunc(value.value)}`.padStart(2, '0');
return `${hours}:${minutes}`;
}
};
} |