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}`;
    }
  };
}