Files
bd2/go/internal/server/gamedata/pack_jam.go
T
Flechazo 5b5a219dc2 feat(server): add special loot and data-driven gameplay rules
Generate equipment loot atomically, grant random boxes and prevent repeat claims.
Read gacha pools, pity, products, tickets, missions, presets, chapter rewards
and inventory costs from GameData; extend both collaboration UR ticket pools.
Sync owned recipes, configure startup state and calendars in versioned seeds,
and validate unlock tickets and revival talents.
2026-10-04 19:15:59 +08:00

77 lines
2.1 KiB
Go

package gamedata
import (
"database/sql"
"fmt"
)
// PackJamDesign is the installed client's insertion animation and reward rule.
type PackJamDesign struct {
InsertMin, InsertMax uint64
Reward Reward
}
func LoadPackJamDesign(root, version string) (*PackJamDesign, error) {
db, closeDB, err := openStatDatabase(root, version)
if err != nil {
return nil, err
}
defer closeDB()
return loadPackJamDesign(db)
}
func loadPackJamDesign(db *sql.DB) (*PackJamDesign, error) {
rows, err := db.Query("SELECT id,ProtoBuf FROM PackJamEventTable ORDER BY id")
if err != nil {
return nil, err
}
defer rows.Close()
var design *PackJamDesign
for rows.Next() {
var id int
var raw []byte
if err := rows.Scan(&id, &raw); err != nil {
return nil, err
}
if id != 0 || design != nil {
return nil, fmt.Errorf("gamedata: unsupported pack jam rule %d", id)
}
values := map[int]uint64{}
for field := 1; field <= 6; field++ {
v, err := packedInts(raw, field)
if err != nil || len(v) > 1 {
return nil, fmt.Errorf("gamedata: invalid pack jam field %d", field)
}
if len(v) == 1 {
values[field] = v[0]
}
}
if values[1] != 0 || values[3] == 0 || values[2] < values[3] || values[2] > uint64(^uint32(0)>>1) || values[4] == 0 || values[4] > uint64(^uint32(0)>>1) || !packJamCurrency(values[6]) || values[5] != 0 {
return nil, fmt.Errorf("gamedata: unsupported pack jam reward or insertion rule")
}
design = &PackJamDesign{InsertMin: values[3], InsertMax: values[2], Reward: Reward{Count: values[4], ID: values[5], Type: values[6]}}
}
if err := rows.Err(); err != nil {
return nil, err
}
if design == nil {
return nil, fmt.Errorf("gamedata: missing pack jam rule")
}
return design, nil
}
func packJamCurrency(typ uint64) bool {
switch typ {
case 2, 3, 4, 12, 20:
return true
}
return false
}
func (d PackJamDesign) ValidateReward() error {
if !packJamCurrency(d.Reward.Type) || d.Reward.ID != 0 || d.Reward.Count == 0 || d.Reward.Count > uint64(^uint32(0)>>1) {
return fmt.Errorf("gamedata: unsupported pack jam reward")
}
return nil
}