Files
bd2/go/internal/server/world/field_buff_damage_test.go
T

69 lines
2.4 KiB
Go

package world
import (
"bd2server/internal/server/deck"
"bd2server/internal/server/gamedata"
"bd2server/internal/server/player"
"bd2server/internal/server/stateio"
"bd2server/internal/server/versionconfig"
"bd2server/internal/server/wire"
"testing"
)
func TestMonsterFieldDamagePartyFractionAndRequestReplay(t *testing.T) {
s := testService()
store := stateio.NewMemory()
starter := &player.Starter{Version: versionconfig.State(), Characters: []player.Character{{InvenIndex: 77, ID: 350, Level: 1, HP: 100}, {InvenIndex: 88, ID: 650, Level: 1, HP: 100}}}
items, e := player.OpenInventory(store, starter)
if e != nil {
t.Fatal(e)
}
chars, e := player.OpenCharacterStore(store, starter.Characters, items, "", "")
if e != nil {
t.Fatal(e)
}
chars.AttachMaxHealth(func(player.Character) (uint64, error) { return 100, nil })
chars.EnsurePersisted()
chars.SetCurrentHealth(77, 70)
chars.SetCurrentHealth(88, 0)
s.characters = chars
s.decks, e = deck.NewStore(deck.Seed{Version: versionconfig.State(), FieldCharControlDeckType: 1, FieldDeck: []deck.FieldEntry{{Slot: 1, CharacterInvenIndex: 77}, {Slot: 2, CharacterInvenIndex: 88}}})
if e != nil {
t.Fatal(e)
}
s.fieldBuffs = map[uint64]gamedata.FieldBuffDesign{4: {ID: 4, Type: 5, TargetType: 1, Value: .25}, 5: {ID: 5, Type: 4, TargetType: 0, Value: 10}}
s.AttachFieldMonsterState(store)
s.BeginSession("login")
s.AttachFieldMonsterDamage(s.applyMonsterFieldDamage)
s.monsterLoader = func(int) ([]gamedata.FieldMonsterDesign, error) {
return []gamedata.FieldMonsterDesign{{ID: 9, GroupID: 7, Type: 3, FieldBuff: 4}}, nil
}
req := wire.AppendVarint(wire.AppendVarint(nil, 1, 1), 2, 9)
_, first, _, e := s.Handle("/FieldMonsterDamage", req)
if e != nil {
t.Fatal(e)
}
hp, _ := chars.CurrentHealth(77)
dead, _ := chars.CurrentHealth(88)
if hp != 45 || dead != 0 {
t.Fatal("wrong party damage", hp, dead)
}
_, again, _, e := s.Handle("/FieldMonsterDamage", req)
if e != nil || string(first) != string(again) {
t.Fatal("damage replay response differs", e)
}
hp, _ = chars.CurrentHealth(77)
if hp != 45 {
t.Fatal("retry damaged again", hp)
}
chars.SetCurrentHealth(77, 0)
rows, e := s.applyMonsterFieldDamage(21, 5, "test")
if e != nil || len(rows) != 1 {
t.Fatal("dead leader should remain the controlled leader", e)
}
hp, _ = chars.CurrentHealth(88)
if hp != 0 {
t.Fatal("dead leader incorrectly switched to another character")
}
}