|
| 1 | +package warframeapi |
| 2 | + |
| 3 | +import ( |
| 4 | + "github.com/davidscholberg/go-durationfmt" |
| 5 | + "sync" |
| 6 | + "time" |
| 7 | +) |
| 8 | + |
| 9 | +// 游戏时间模拟 |
| 10 | +type gameTime struct { |
| 11 | + rwm sync.RWMutex |
| 12 | + Name string `json:"name"` //时间名称 |
| 13 | + NextTime time.Time `json:"time"` //下次更新时间 |
| 14 | + Status bool `json:"status"` //状态 |
| 15 | + StatusTrueDes string `json:"true_des"` //状态说明 |
| 16 | + StatusFalseDes string `json:"false_des"` //状态说明 |
| 17 | + DayTime int `json:"day"` //白天时长 |
| 18 | + NightTime int `json:"night"` //夜间时长 |
| 19 | +} |
| 20 | + |
| 21 | +var ( |
| 22 | + gameTimes [3]*gameTime |
| 23 | +) |
| 24 | + |
| 25 | +// TimeString 根据传入的世界编号,获取对应的游戏时间文本 |
| 26 | +func (t *gameTime) String() string { |
| 27 | + return "平原时间:" + t.daynight() + "\n" + |
| 28 | + "下次更新:" + t.remaintime() |
| 29 | +} |
| 30 | + |
| 31 | +// 获取当前游戏时间状态(白天/夜晚) |
| 32 | +func (t *gameTime) daynight() string { |
| 33 | + t.rwm.RLock() |
| 34 | + defer t.rwm.RUnlock() |
| 35 | + if t.Status { |
| 36 | + return t.StatusTrueDes |
| 37 | + } |
| 38 | + return t.StatusFalseDes |
| 39 | +} |
| 40 | + |
| 41 | +// 获取下一次时间状态更新的剩余游戏时间(x分x秒) |
| 42 | +func (t *gameTime) remaintime() string { |
| 43 | + t.rwm.RLock() |
| 44 | + d := time.Until(t.NextTime) |
| 45 | + t.rwm.RUnlock() |
| 46 | + durStr, _ := durationfmt.Format(d, "%m分%s秒后") |
| 47 | + return durStr |
| 48 | +} |
| 49 | + |
| 50 | +// 根据API返回内容修正游戏时间 |
| 51 | +func loadTime(api wfAPI) { |
| 52 | + gameTimes = [3]*gameTime{ |
| 53 | + {Name: "地球平原", NextTime: api.CetusCycle.Expiry.Local(), Status: api.CetusCycle.IsDay, StatusTrueDes: "白天", StatusFalseDes: "夜晚", DayTime: 100 * 60, NightTime: 50 * 60}, |
| 54 | + {Name: "金星平原", NextTime: api.VallisCycle.Expiry.Local(), Status: api.VallisCycle.IsWarm, StatusTrueDes: "温暖", StatusFalseDes: "寒冷", DayTime: 400, NightTime: 20 * 60}, |
| 55 | + {Name: "火卫二平原", NextTime: api.CambionCycle.Expiry.Local(), Status: api.CambionCycle.Active == "fass", StatusTrueDes: "fass", StatusFalseDes: "vome", DayTime: 100 * 60, NightTime: 50 * 60}, |
| 56 | + } |
| 57 | +} |
| 58 | + |
| 59 | +// timeDet游戏时间更新 |
| 60 | +func timeDet() { |
| 61 | + for _, v := range gameTimes { |
| 62 | + //当前时间对比下一次游戏状态更新时间,看看还剩多少秒 |
| 63 | + nt := time.Until(v.NextTime).Seconds() |
| 64 | + //已经过了游戏时间状态更新时间 |
| 65 | + if nt < 0 { |
| 66 | + v.rwm.Lock() |
| 67 | + //更新游戏状态,如果是白天就切换到晚上,反之亦然 |
| 68 | + if v.Status { |
| 69 | + //计算下次的晚上更新时间 |
| 70 | + v.NextTime = v.NextTime.Add(time.Duration(v.NightTime) * time.Second) |
| 71 | + } else { |
| 72 | + //计算下次的白天更新时间 |
| 73 | + v.NextTime = v.NextTime.Add(time.Duration(v.DayTime) * time.Second) |
| 74 | + } |
| 75 | + v.rwm.Unlock() |
| 76 | + } |
| 77 | + } |
| 78 | +} |
0 commit comments