Files
bd2/go/internal/server/eventplay/field_pack_test.go
T
Flechazo 3b08040a0e fix(server): support dynamic hidden event pack purchase and entry
why the f^^kkkkkk does sh^t AI love writing useless tests so much just to clutter up my repo, looks like I’ll have to find some time to clean this s^^t up later.
2026-10-05 20:37:38 +08:00

97 lines
4.0 KiB
Go

package eventplay
import (
"bd2server/internal/server/events"
"bd2server/internal/server/gamedata"
"bd2server/internal/server/readonly"
"bd2server/internal/server/wire"
"os"
"testing"
"time"
)
func TestClientConstantFieldBindingRequiresActiveMatchingEvent(t *testing.T) {
s, _ := makeService(t)
s.design.FieldPacks = map[int]gamedata.EventFieldPack{734: {ID: 734, MapIDs: []int{735}, InitialPosition: "{}"}}
s.fieldBindings = []FieldBinding{{PackID: 734, EventType: 20, ContentOpenType: 20}}
reg := events.NewRegistry()
if err := reg.Replace([]events.Schedule{{UID: 32, Type: 20, ID: 81, Start: 100, End: 200}}); err != nil {
t.Fatal(err)
}
s.registry = reg
p, ok, err := s.ResolveEventFieldPack(734)
if err != nil || !ok || p.ScheduleUID != 32 || p.ContentOpenType != 20 {
t.Fatalf("%+v %v %v", p, ok, err)
}
s.now = func() time.Time { return time.UnixMilli(200) }
if _, ok, err := s.ResolveEventFieldPack(734); err != nil || ok {
t.Fatalf("expired tactics %v %v", ok, err)
}
}
func TestInstalledTacticsFieldBinding(t *testing.T) {
root := os.Getenv("BD2_REAL_GAMEDATA")
if root == "" {
t.Skip("BD2_REAL_GAMEDATA not configured")
}
reg := events.NewRegistry()
if err := reg.Replace([]events.Schedule{{UID: 81, Type: 20, ID: 8, Start: 1, End: 9999999999999}}); err != nil {
t.Fatal(err)
}
// Use the real catalog but an in-memory account and controlled clock.
d, err := gamedata.LoadEventPlayCatalog(root, "20260923193640")
if err != nil {
t.Fatal(err)
}
svc, _ := makeService(t)
svc.design = d
svc.registry = reg
if err = svc.AttachFieldBindingsFile("../../../seed/v2_35_10/event_field_bindings.json"); err != nil {
t.Fatal(err)
}
p, ok, err := svc.ResolveEventFieldPack(20000)
if err != nil || !ok || p.ContentOpenType != 20 || len(p.MapIDs) != 1 || p.MapIDs[0] != 200001 || p.BuyPrice != 0 {
t.Fatalf("%+v %v %v", p, ok, err)
}
}
func TestHiddenHubPackUsesCalendarPlayWindowAndInstalledMaps(t *testing.T) {
s, _ := makeService(t)
s.registry = events.NewRegistry()
s.design.FieldPacks = map[int]gamedata.EventFieldPack{912: gamedata.EventFieldPack{ID: 912, MapIDs: []int{991, 992}, InitialPosition: "{}", BuyType: 4, BuyPrice: 20}}
s.design.Tables["PackEventHubTable"] = [][]byte{wire.AppendVarint(wire.AppendVarint(nil, 14, 55), 20, 912)}
scalar := func(n int, v uint64) readonly.Field { return readonly.Field{Number: n, Varint: v} }
s.AttachHubCalendars(&readonly.Seed{Responses: map[string]readonly.Response{"/EventHubInfo": {PacketCode: 222, Fields: []readonly.Field{{Number: 1, Type: 2, Fields: []readonly.Field{scalar(1, 77), scalar(2, 55), scalar(3, 100), scalar(4, 200), scalar(5, 300)}}}}}})
p, ok, err := s.ResolveEventFieldPack(912)
if err != nil || !ok || p.ScheduleUID != 77 || p.HubID != 55 || p.End != 200 || p.BuyPrice != 20 || p.InitialMapID != 991 || p.InitialPosition != "{}" {
t.Fatalf("pack=%+v ok=%v err=%v", p, ok, err)
}
p.MapIDs[0] = 0
again, _, _ := s.ResolveEventFieldPack(912)
if again.MapIDs[0] != 991 {
t.Fatal("caller changed design maps")
}
s.now = func() time.Time { return time.UnixMilli(200) }
if _, ok, err := s.ResolveEventFieldPack(912); err != nil || ok {
t.Fatalf("post-play purchase ok=%v err=%v", ok, err)
}
}
func TestHiddenMiniGamePackRejectsForeignMapAndInactiveCalendar(t *testing.T) {
s, _ := makeService(t)
s.design.FieldPacks = map[int]gamedata.EventFieldPack{812: {ID: 812, MapIDs: []int{811}}}
s.design.Tables["PackEventMiniGameTable"] = [][]byte{row(map[int]uint64{8: 1, 12: 812, 9: 810, 13: 101})}
if _, _, err := s.ResolveEventFieldPack(812); err == nil {
t.Fatal("foreign map accepted")
}
s.design.Tables["PackEventMiniGameTable"] = [][]byte{row(map[int]uint64{8: 1, 12: 812, 9: 811, 13: 101})}
p, ok, err := s.ResolveEventFieldPack(812)
if err != nil || !ok || p.GameID != 1 || p.PointPositionID != 101 {
t.Fatalf("%+v %v %v", p, ok, err)
}
s.now = func() time.Time { return time.UnixMilli(9999999) }
if _, ok, err := s.ResolveEventFieldPack(812); err != nil || ok {
t.Fatalf("expired game available %v %v", ok, err)
}
}