Restore event and mini hubs, current shop and hunt calendars, and regular seasons; preserve all published windows. Implement story/quiz routes, native shop purchases, avatar sets, currencies, rank-change items and permanent buffs with rollback and reward coverage tests. Refresh client buff stats and update Cash Shop to 0.1.1.
88 lines
1.8 KiB
Go
88 lines
1.8 KiB
Go
package gamedata
|
|
|
|
import "fmt"
|
|
|
|
type MiniContentRoute struct {
|
|
UID, ContentType, ContentID uint64
|
|
Start, End int64
|
|
}
|
|
|
|
type MiniContentDesign struct {
|
|
Stories map[uint64]Reward
|
|
Groups map[uint64][]uint64
|
|
}
|
|
|
|
func LoadMiniContentDesign(root, version string) (*MiniContentDesign, error) {
|
|
db, done, err := openStatDatabase(root, version)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer done()
|
|
d := &MiniContentDesign{Stories: map[uint64]Reward{}, Groups: map[uint64][]uint64{}}
|
|
rows, err := db.Query("SELECT ProtoBuf FROM DailyStoryTable")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for rows.Next() {
|
|
var raw []byte
|
|
if err = rows.Scan(&raw); err != nil {
|
|
rows.Close()
|
|
return nil, err
|
|
}
|
|
id, e := optionalScalar(raw, 2)
|
|
if e != nil {
|
|
rows.Close()
|
|
return nil, e
|
|
}
|
|
var r Reward
|
|
for field, target := range map[int]*uint64{10: &r.Type, 9: &r.ID, 8: &r.Count} {
|
|
v, e := optionalScalar(raw, field)
|
|
if e != nil {
|
|
rows.Close()
|
|
return nil, e
|
|
}
|
|
*target = v
|
|
}
|
|
d.Stories[id] = r
|
|
}
|
|
err = rows.Err()
|
|
rows.Close()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
rows, err = db.Query("SELECT ProtoBuf FROM MiniEventStoryTable")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for rows.Next() {
|
|
var raw []byte
|
|
if err = rows.Scan(&raw); err != nil {
|
|
rows.Close()
|
|
return nil, err
|
|
}
|
|
id, e := optionalScalar(raw, 1)
|
|
if e != nil {
|
|
rows.Close()
|
|
return nil, e
|
|
}
|
|
group, e := optionalScalar(raw, 2)
|
|
if e != nil {
|
|
rows.Close()
|
|
return nil, e
|
|
}
|
|
d.Groups[group] = append(d.Groups[group], id)
|
|
}
|
|
err = rows.Err()
|
|
rows.Close()
|
|
if err == nil {
|
|
for group, ids := range d.Groups {
|
|
for _, id := range ids {
|
|
if _, exists := d.Stories[id]; !exists {
|
|
return nil, fmt.Errorf("gamedata: mini story group %d references missing daily story %d", group, id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return d, err
|
|
}
|