Files
lunar-tear/server/internal/masterdata/gimmick.go
T
Ilya Groshev 02f511f40c Initial commit
2026-04-14 09:28:26 +03:00

77 lines
2.2 KiB
Go

package masterdata
import (
"fmt"
"log"
"lunar-tear/server/internal/model"
"lunar-tear/server/internal/store"
"lunar-tear/server/internal/utils"
)
type gimmickScheduleRow struct {
GimmickSequenceScheduleId int32 `json:"GimmickSequenceScheduleId"`
StartDatetime int64 `json:"StartDatetime"`
EndDatetime int64 `json:"EndDatetime"`
FirstGimmickSequenceId int32 `json:"FirstGimmickSequenceId"`
ReleaseEvaluateConditionId int32 `json:"ReleaseEvaluateConditionId"`
}
type gimmickScheduleEntry struct {
ScheduleId int32
StartDatetime int64
EndDatetime int64
FirstSequenceId int32
RequiredQuestId int32 // 0 = always active
}
type GimmickCatalog struct {
schedules []gimmickScheduleEntry
}
func LoadGimmickCatalog(resolver *ConditionResolver) (*GimmickCatalog, error) {
rows, err := utils.ReadJSON[gimmickScheduleRow]("EntityMGimmickSequenceScheduleTable.json")
if err != nil {
return nil, fmt.Errorf("load gimmick sequence schedule table: %w", err)
}
entries := make([]gimmickScheduleEntry, 0, len(rows))
for _, r := range rows {
entry := gimmickScheduleEntry{
ScheduleId: r.GimmickSequenceScheduleId,
StartDatetime: r.StartDatetime,
EndDatetime: r.EndDatetime,
FirstSequenceId: r.FirstGimmickSequenceId,
}
if r.ReleaseEvaluateConditionId != 0 {
if qid, ok := resolver.RequiredQuestId(r.ReleaseEvaluateConditionId); ok {
entry.RequiredQuestId = qid
}
}
entries = append(entries, entry)
}
log.Printf("gimmick catalog loaded: %d schedules", len(entries))
return &GimmickCatalog{schedules: entries}, nil
}
func (c *GimmickCatalog) ActiveScheduleKeys(user store.UserState, nowMillis int64) []store.GimmickSequenceKey {
var keys []store.GimmickSequenceKey
for _, s := range c.schedules {
if nowMillis < s.StartDatetime || nowMillis > s.EndDatetime {
continue
}
if s.RequiredQuestId != 0 {
q, ok := user.Quests[s.RequiredQuestId]
if !ok || q.QuestStateType != model.UserQuestStateTypeCleared {
continue
}
}
keys = append(keys, store.GimmickSequenceKey{
GimmickSequenceScheduleId: s.ScheduleId,
GimmickSequenceId: s.FirstSequenceId,
})
}
return keys
}