chore(release): 0.2.1
[risinglegends.git] / src / shared / time.ts
1 export type TimeDay = 'dawn' | 'morning' | 'afternoon';
2 export type TimeNight = 'evening' | 'night';
3 export type TimePeriod = TimeDay | TimeNight | 'any';
4
5 export class TimeManager {
6   dayLengthAsMS: number;
7   scaleFactor: number;
8
9   /**
10    * @param dayLength the number of minutes a day lasts
11    */
12   constructor(public dayLength: number = 60) {
13     this.scaleFactor = 30;  // this is because we only have 30 gradients
14     this.dayLengthAsMS = dayLength * 60 * 1000;
15   }
16
17   dayScaleFactor(): number {
18     return this.dayLength / 30;
19   }
20
21   getTimePeriod(): TimePeriod {
22     if(this.isDawn()) {
23       return 'dawn';
24     }
25     else if(this.isMorning()) {
26       return 'morning';
27     }
28     else if(this.isAfternoon()) {
29       return 'afternoon';
30     }
31     else if(this.isEvening()) {
32       return 'evening';
33     }
34     else if(this.isNight()) {
35       return 'night';
36     }
37   }
38   /**
39    * @returns The current minutes scaled
40    */
41   now() {
42     return Math.floor((new Date()).getMinutes() / this.dayScaleFactor());
43   }
44
45   gradientName(): string {
46     const num = this.now();
47     return `sky-gradient-${num < 10 ? '0': ''}${num}`;
48   }
49
50   isNight(): boolean {
51     const min = this.now();
52     return (
53       min >= 0 && min <= 5 ||
54         min >= 26 && min <= 29
55     );
56   }
57
58   isDawn(): boolean {
59     const min = this.now();
60     return min >= 6 && min <= 10;
61   }
62
63   isMorning(): boolean {
64     const min = this.now();
65     return min >= 11 && min <= 15;
66   }
67
68   isAfternoon(): boolean {
69     const min = this.now();
70     return min >= 16 && min <= 20;
71   }
72
73   isEvening(): boolean {
74     const min = this.now();
75     return min >= 21 && min <= 25;
76   }
77 }