80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
package world
|
|
|
|
import (
|
|
"bd2server/internal/server/gamedata"
|
|
"bd2server/internal/server/player"
|
|
"bd2server/internal/server/stateio"
|
|
"os"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestInstalledAdjacentStoryPartyRetainsHealth(t *testing.T) {
|
|
root := os.Getenv("BD2_REAL_GAMEDATA")
|
|
if root == "" {
|
|
t.Skip("BD2_REAL_GAMEDATA not configured")
|
|
}
|
|
catalog, err := gamedata.LoadStoryCharacterCatalog(root, "20260923193640", []int{21})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
first, second := 0, 0
|
|
for quest := 1; quest < 38; quest++ {
|
|
a, err := catalog.Characters(21, quest)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
b, err := catalog.Characters(21, quest+1)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(a) > 0 && reflect.DeepEqual(a, b) {
|
|
first, second = quest, quest+1
|
|
break
|
|
}
|
|
}
|
|
if first == 0 {
|
|
t.Fatal("no adjacent authored same party fixture")
|
|
}
|
|
storage := stateio.NewMemory()
|
|
inventory, err := player.OpenInventory(storage, &player.Starter{Version: "2.35.10"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
designs, err := catalog.Characters(21, first)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
legacy := player.Character{InvenIndex: 123, ID: designs[0].CharacterID, HP: designs[0].HP, Level: designs[0].Level}
|
|
characters, err := player.OpenCharacterStore(storage, []player.Character{legacy}, inventory, "", "")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := characters.AttachMaxHealth(func(c player.Character) (uint64, error) { return c.HP, nil }); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
s := testService()
|
|
s.characters = characters
|
|
s.storyRoster = catalog
|
|
party, err := s.ResolveStoryParty(21, first)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if party[0].InvenIndex != legacy.InvenIndex {
|
|
t.Fatal("existing seeded temporary identity was not reused")
|
|
}
|
|
if err := characters.SetCurrentHealth(party[0].InvenIndex, 7); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
next, err := s.ResolveStoryParty(21, second)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if next[0].InvenIndex != party[0].InvenIndex || next[0].HP != 7 {
|
|
t.Fatalf("quest%d→%d reset party hp or index: %+v→%+v", first, second, party[0], next[0])
|
|
}
|
|
if len(characters.RawAll()) != len(party) {
|
|
t.Fatal("adjacent quest duplicated temporary instances")
|
|
}
|
|
}
|