diff --git a/logic/controller/room_set.go b/logic/controller/room_set.go index 7bc126c9..8a87b4ff 100644 --- a/logic/controller/room_set.go +++ b/logic/controller/room_set.go @@ -32,7 +32,7 @@ func (h Controller) SetPet(data *C2S_PET_ROOM_SHOW, c *player.Player) (result *r } c.Service.Room.Show(showPetCatchTimes) result = &room.S2C_PET_ROOM_SHOW{} - result.PetShowList = make([]pet.PetShortInfo, len(showPetCatchTimes)) + result.PetShowList = make([]pet.PetShortInfo, 0, len(showPetCatchTimes)) for _, catchTime := range showPetCatchTimes { petInfo := c.Service.Pet.PetInfoOneByCatchTime(catchTime) if petInfo == nil { diff --git a/logic/service/fight/effect/85.go b/logic/service/fight/effect/85.go index 5e7b39ec..241274da 100644 --- a/logic/service/fight/effect/85.go +++ b/logic/service/fight/effect/85.go @@ -3,6 +3,8 @@ package effect import ( "blazing/logic/service/fight/input" "blazing/logic/service/fight/node" + "fmt" + "runtime" ) // Effect 85: 使对手的能力提升效果转化到自己身上 @@ -14,18 +16,29 @@ type Effect85 struct { // 执行时逻辑 // ---------------------- func (e *Effect85) OnSkill() bool { + fmt.Printf("[Effect85] OnSkill START: Our.Prop=%v, Opp.Prop=%v\n", e.Ctx().Our.Prop, e.Ctx().Opp.Prop) for i, v := range e.Ctx().Opp.Prop[:] { if v > 0 { + fmt.Printf("[Effect85] stealing index=%d, value=%d\n", i, v) e.Ctx().Our.SetProp(e.Ctx().Our, int8(i), v) e.Ctx().Opp.SetProp(e.Ctx().Our, int8(i), 0) } } + fmt.Printf("[Effect85] OnSkill END: Our.Prop=%v, Opp.Prop=%v\n", e.Ctx().Our.Prop, e.Ctx().Opp.Prop) return true } +func init() { + // 打印 SetProp(level==0) 的调用栈,用于追踪 Prop 被重置的时机 + input.OnSetPropReset = func(target *input.Input, index int8) { + _, file, line, _ := runtime.Caller(2) + fmt.Printf("[SetProp RESET] target.Prop=%v, index=%d, caller=%s:%d\n", target.Prop, index, file, line) + } +} + // ---------------------- // 注册所有效果 // ---------------------- diff --git a/logic/service/fight/effect/effect_724_728.go b/logic/service/fight/effect/effect_724_728.go index 16010f17..2128db20 100644 --- a/logic/service/fight/effect/effect_724_728.go +++ b/logic/service/fight/effect/effect_724_728.go @@ -5,6 +5,7 @@ import ( "blazing/logic/service/fight/info" "blazing/logic/service/fight/input" "blazing/logic/service/fight/node" + "fmt" ) // Effect 724: {0}回合内受到攻击{1}%恢复1/{2}体力 @@ -85,6 +86,7 @@ func (e *Effect727) Action_end() bool { return true } + fmt.Printf("[Effect727] Action_end RESET: Our.Prop %v -> LastTurnEndProp %v\n", e.Ctx().Our.Prop, e.Ctx().Our.LastTurnEndProp) e.Ctx().Our.AttackValue.Prop = e.Ctx().Our.LastTurnEndProp return true } diff --git a/logic/service/fight/fightc.go b/logic/service/fight/fightc.go index 5d43ee5e..ab98a679 100644 --- a/logic/service/fight/fightc.go +++ b/logic/service/fight/fightc.go @@ -10,6 +10,7 @@ import ( _ "blazing/logic/service/fight/itemover" _ "blazing/logic/service/fight/rule" "blazing/modules/player/model" + "fmt" "reflect" "github.com/alpacahq/alpacadecimal" @@ -68,12 +69,15 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, skill *info //还原属性 attacker.Prop, defender.Prop = originalProps[0], originalProps[1] attackerPet.Info, defenderPet.Info = originalPetInfo[0], originalPetInfo[1] + fmt.Printf("[processSkillAttack] After restore: attacker.Prop=%v, defender.Prop=%v\n", attacker.Prop, defender.Prop) if attacker.IsCritical == 1 { //命中了才有暴击 //暴击破防 if skill.Category() == info.Category.PHYSICAL && defender.Prop[1] > 0 { + fmt.Printf("[processSkillAttack] Crit break DEF: defender.Prop[1] %d -> 0\n", defender.Prop[1]) defender.Prop[1] = 0 } else if skill.Category() == info.Category.SPECIAL && defender.Prop[3] > 0 { + fmt.Printf("[processSkillAttack] Crit break SPDEF: defender.Prop[3] %d -> 0\n", defender.Prop[3]) defender.Prop[3] = 0 } //暴击翻倍 @@ -101,6 +105,7 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, skill *info effect.OnSkill() //调用伤害计算 return true }) + fmt.Printf("[processSkillAttack] After OnSkill: attacker.Prop=%v, defender.Prop=%v, attacker.SkillID=%d\n", attacker.Prop, defender.Prop, attacker.SkillID) defender.Damage(attacker, &info.DamageZone{ Damage: SumDamage, @@ -445,6 +450,7 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction) return true }) } + fmt.Printf("[enterturn] After Skill_Use: attacker.Prop=%v, defender.Prop=%v\n", attacker.Prop, defender.Prop) //技能使用后 defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //技能使用后的我方效果 f.setEffectSkillContext(effect, currentSkill, defender) @@ -457,6 +463,7 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction) effect.Action_end() return true }) + fmt.Printf("[enterturn] After Action_end: attacker.Prop=%v, defender.Prop=%v\n", attacker.Prop, defender.Prop) if defenderPet != nil && attackerPet != nil && defenderPet.Info.Hp <= 0 && attackerPet.Info.Hp <= 0 { //先手方死亡,触发反同归于尽 attackerPet.Info.Hp = 1 @@ -495,6 +502,7 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction) } attackValueResult := f.buildNoteUseSkillOutboundInfo() + fmt.Printf("[enterturn] Broadcast: First.Prop=%v, Second.Prop=%v\n", attackValueResult.FirstAttackInfo.Prop, attackValueResult.SecondAttackInfo.Prop) //因为切完才能广播,所以必须和回合结束分开结算 f.BroadcastPlayers(func(p common.PlayerI) { for _, switchAction := range f.Switch { diff --git a/logic/service/fight/input/prop.go b/logic/service/fight/input/prop.go index cde7e301..c68203f8 100644 --- a/logic/service/fight/input/prop.go +++ b/logic/service/fight/input/prop.go @@ -1,5 +1,9 @@ package input +// OnSetPropReset 是一个调试钩子,在 SetProp(level==0) 重置 Prop 时被调用。 +// 外部包可设置此变量来追踪 Prop 被重置的时机和调用栈。 +var OnSetPropReset func(target *Input, index int8) + func (our *Input) HasPropADD() bool { for _, v := range our.Prop[:] { if v > 0 { @@ -55,6 +59,9 @@ func (target *Input) SetProp(source *Input, index, level int8) bool { if target.AttackValue.Prop[index] != 0 { target.AttackValue.Prop[index] = 0 + if OnSetPropReset != nil { + OnSetPropReset(target, index) + } return true } else { return false diff --git a/modules/config/service/server.go b/modules/config/service/server.go index ae8b03ed..460a3b1d 100644 --- a/modules/config/service/server.go +++ b/modules/config/service/server.go @@ -146,6 +146,7 @@ func (s *ServerService) GetPort(DepartmentID uint) []ServerShowInfo { items = append(items, item) } } + return items } diff --git a/modules/player/model/pet.go b/modules/player/model/pet.go index 60a5c973..07903a47 100644 --- a/modules/player/model/pet.go +++ b/modules/player/model/pet.go @@ -127,7 +127,7 @@ type PetInfo struct { SkillListLen uint32 `struc:"sizeof=SkillList" json:"-"` - // 技能信息:固定4条,空则赋值0(固定长度List → [4]SkillInfo,零值即符合“赋值0”) + // 技能信息:固定4条,空则赋值0(固定长度List → [4]SkillInfo,零值即符合"赋值0") SkillList []SkillInfo CatchTime uint32 //显式忽略,不参与序列化 @@ -181,7 +181,11 @@ func (pet *PetInfo) ConfigBoss(bm model.PetBaseConfig) { for i := 0; i < 4 && i < len(bm.SKill); i++ { if bm.SKill[i] != 0 { - pet.SkillList[i].ID = bm.SKill[i] + if i < len(pet.SkillList) { + pet.SkillList[i].ID = bm.SKill[i] + } else { + pet.SkillList = append(pet.SkillList, SkillInfo{ID: bm.SKill[i]}) + } } }