Files
GaCy-GO/internal/gameserver/aha_target_test.go
T

135 lines
3.9 KiB
Go

package gameserver
import (
"sort"
"testing"
"gac-hkrpg-go/internal/common"
"gac-hkrpg-go/internal/testutil"
pb "gac-hkrpg-go/protocol/proto"
)
func TestAhaBuffTargetsSceneAttacker(t *testing.T) {
temporary := t.TempDir()
if err := testutil.CopyRuntime(testWorkspaceRoot, temporary); err != nil {
t.Fatal(err)
}
t.Chdir(temporary)
t.Setenv("GAC_CONFIG", "server.json")
rules, err := loadBattleRules()
if err != nil {
t.Fatal(err)
}
resources, err := common.GameRes()
if err != nil {
t.Fatal(err)
}
world, err := loadWorldBattleResources()
if err != nil {
t.Fatal(err)
}
levels, err := common.LoadAhaHelpLevels()
if err != nil {
t.Fatal(err)
}
if err := common.SaveAhaHelpLevel(&levels[0].BuffLevel); err != nil {
t.Fatal(err)
}
// Pick valid characters and a battle source from the checked-in resources;
// neither the user's live roster nor their persistent settings are changed.
var ids []uint32
for id, config := range resources.AvatarConfigs {
if id != 8001 && id != 1001 && rules.EntryAttackBuffs[config.DamageType] != 0 {
ids = append(ids, id)
}
}
sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] })
if len(ids) < 4 || len(world.Cocoons) == 0 || len(world.NPCMonsters) == 0 {
t.Fatal("battle fixture data incomplete")
}
player := &common.FreesrData{Avatars: map[uint32]*common.AvatarJson{}, Lineups: map[uint32]uint32{}}
for i, id := range ids[:4] {
player.Avatars[id] = &common.AvatarJson{AvatarID: id, Level: 1}
player.Lineups[uint32(i)] = id
}
enabled := true
player.EnableAhaGlobal, player.EnableSWGlobal, player.EnableCastoriceGlobal = &enabled, &enabled, &enabled
var monster, corruption, ahaID uint32
for id := range world.NPCMonsters {
monster = id
break
}
for _, id := range rules.InvasionBuffs {
corruption = id
break
}
for _, rule := range rules.GlobalPassives {
if rule.Setting == "enable_aha_global" {
ahaID = rule.BuffID
}
}
if monster == 0 || corruption == 0 || ahaID == 0 {
t.Fatal("battle fixture rule missing")
}
source := &common.BattleConfig{StageID: world.Cocoons[0].StageID, Monsters: [][]common.Monster{{{MonsterID: monster, Level: 1}}}, Blessings: []common.BattleBuffJson{{ID: corruption, Level: 1}}}
session := &Session{MonsterEntities: map[uint32]uint32{777777: monster}}
session.SetJSON(player)
cases := []struct {
name string
caster, want uint32
}{
{"first slot", 1, 0}, {"second slot", 2, 1}, {"third slot", 3, 2}, {"fourth slot", 4, 3},
{"avatar entity namespace", techniqueAvatarEntityOffset + ids[2], 2},
{"direct entry has no caster", 0, 0}, {"unknown actor", 12345, 0}, {"monster ambush", 777777, 0},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
battle, err := createBattleInfo(session, tc.caster, 0, source)
if err != nil {
t.Fatal(err)
}
var aha, help *pb.BattleBuff
for _, buff := range battle.BuffList {
switch buff.Id {
case ahaID:
aha = buff
case levels[0].BuffID:
help = buff
default:
for _, rule := range rules.GlobalPassives {
if rule.Setting != "enable_aha_global" && buff.Id == rule.BuffID && (len(buff.TargetIndexList) != 1 || buff.TargetIndexList[0] != 0) {
t.Fatal("unrelated passive target changed")
}
}
}
}
for name, buff := range map[string]*pb.BattleBuff{"Aha Global": aha, "Aha Help": help} {
if buff == nil || len(buff.TargetIndexList) != 1 || buff.TargetIndexList[0] != tc.want {
t.Fatalf("%s target: got %v, want slot %d", name, buff, tc.want)
}
}
// Source ownership and unrelated corruption are unchanged.
if help.OwnerId != battle.BattleAvatarList[0].Index {
t.Fatal("Aha Help owner changed")
}
})
}
off := uint32(0)
if err := common.SaveAhaHelpLevel(&off); err != nil {
t.Fatal(err)
}
battle, err := createBattleInfo(session, 2, 0, source)
if err != nil {
t.Fatal(err)
}
for _, buff := range battle.BuffList {
if buff.Id == levels[0].BuffID {
t.Fatal("disabled Aha Help was added")
}
}
}