Files
bd2/go/internal/server/design/gamedata/field_action_objects.go
T

87 lines
2.3 KiB
Go

package gamedata
import (
"database/sql"
"fmt"
)
type FieldActionObject struct {
ID, GroupID, MapID, QuestID, QuestEnableType, Type, RegenSeconds int
}
func loadFieldActionObjects(db *sql.DB) (map[int]FieldActionObject, error) {
out := map[int]FieldActionObject{}
var tables int
if err := db.QueryRow("SELECT count(*) FROM sqlite_master WHERE type='table' AND name IN ('FieldActionObjectTable','FieldActionObjectGroupTable')").Scan(&tables); err != nil {
return nil, err
}
if tables == 0 {
return out, nil
}
if tables != 2 {
return nil, fmt.Errorf("gamedata: incomplete field action tables")
}
groups := map[int]FieldActionObject{}
rows, err := db.Query("SELECT id,ProtoBuf FROM FieldActionObjectGroupTable")
if err != nil {
return nil, err
}
for rows.Next() {
var id int
var raw []byte
if err = rows.Scan(&id, &raw); err != nil {
_ = rows.Close()
return nil, err
}
group := FieldActionObject{GroupID: id}
for field, dst := range map[int]*int{3: &group.RegenSeconds, 4: &group.Type} {
v, e := optionalScalar(raw, field)
if e != nil || v > 0x7fffffff {
_ = rows.Close()
return nil, fmt.Errorf("gamedata: invalid action group %d", id)
}
*dst = int(v)
}
if id <= 0 {
_ = rows.Close()
return nil, fmt.Errorf("gamedata: invalid action group identity")
}
groups[id] = group
}
err = rows.Err()
_ = rows.Close()
if err != nil {
return nil, err
}
rows, err = db.Query("SELECT id,ProtoBuf FROM FieldActionObjectTable")
if err != nil {
return nil, err
}
defer func() { _ = rows.Close() }()
for rows.Next() {
var id int
var raw []byte
if err = rows.Scan(&id, &raw); err != nil {
return nil, err
}
groupID, e := optionalScalar(raw, 4)
group, found := groups[int(groupID)]
if e != nil || groupID > 0x7fffffff || !found || id <= 0 {
return nil, fmt.Errorf("gamedata: invalid action object group %d", id)
}
group.ID = id
for field, dst := range map[int]*int{8: &group.MapID, 10: &group.QuestEnableType, 11: &group.QuestID} {
v, e := optionalScalar(raw, field)
if e != nil || v > 0x7fffffff {
return nil, fmt.Errorf("gamedata: invalid action object %d", id)
}
*dst = int(v)
}
if group.MapID <= 0 || group.QuestEnableType > 2 {
return nil, fmt.Errorf("gamedata: invalid action object map/quest %d", id)
}
out[id] = group
}
return out, rows.Err()
}