feat(player): 添加 UseCoins 方法统一处理玩家金币消耗逻辑

重构购买物品和变更外观功能,使用 UseCoins 方法替代手动操作 Coins 字段,
确保金币扣除的安全性和一致性。同时修复可能因并发导致的金币超扣问题。

此外,调整部分战斗系统接口参数传递方式,将 DamageZone 指
This commit is contained in:
2025-11-13 21:36:18 +08:00
parent 6e01848b04
commit 5e3d558d30
24 changed files with 306 additions and 114 deletions

View File

@@ -123,7 +123,23 @@ func (f *FightC) copypet(t *info.BattlePetEntity) *info.BattlePetEntity {
//回合有先手方和后手方,同时有攻击方和被攻击方
func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
//双方首发精灵登场时,依挑战方机制:房主方先判定,挑战方后判定
//双方非首发精灵登场时,根据切换先后判定(看手速)
// 神罗、圣华登场时魂免“登场时xx”等效果
//阿枫的效果也在这里判断
f.Our.Exec(func(t input.Effect) bool { //回合开始前
//结算状态
t.Turn_Start(fattack, sattack)
return true
})
f.Opp.Exec(func(t input.Effect) bool { //回合开始前
//结算状态
t.Turn_Start(fattack, sattack)
return true
})
// 伤害值
// 根据攻击方归属设置当前战斗的主/次攻击方属性
@@ -141,7 +157,6 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
f.First.ResetAttackValue()
f.Second.ResetAttackValue()
if fattack != nil {
//是否miss都应该施加解析effect
f.First.Parseskill(f.Second, fattack) //解析到临时数据
@@ -182,18 +197,7 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
}
}
var attacker, defender *input.Input
f.First.Exec(func(t input.Effect) bool { //回合开始前
//结算状态
t.Turn_Start()
return true
})
f.Second.Exec(func(t input.Effect) bool { //回合开始前
//结算状态
t.Turn_Start()
return true
})
//开始回合操作
for i := 0; i < 2; i++ {
var oldskill *info.SkillEntity //原始技能
@@ -214,13 +218,16 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
if oldskill != nil {
fmt.Println("开始攻击威力", oldskill.Power)
}
//是否miss都应该施加解析effect
canuseskill := attacker.Exec(func(t input.Effect) bool { //这个是能否使用技能
//结算状态
//然后这里还可以处理自爆类
t.Ctx().SkillEntity = currentskill
return t.Skill_Hit_Pre() //返回本身结算,如果false,说明不能使用技能了
return t.Skill_Hit_Pre(fattack, sattack) //返回本身结算,如果false,说明不能使用技能了
})
// 结算状态
// 然后这里还可以处理自爆类
if canuseskill && //
@@ -260,9 +267,7 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
//技能使用后
defender.Exec(func(t input.Effect) bool {
t.Ctx().SkillEntity = currentskill
t.Ctx().DamageZone = &info.DamageZone{
Damage: attacker.DamageZone.Damage,
}
t.Skill_Use_ex()
return true
@@ -271,9 +276,7 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
//技能使用后
attacker.Exec(func(t input.Effect) bool { //技能使用后的我方效果
t.Ctx().SkillEntity = currentskill
t.Ctx().DamageZone = &info.DamageZone{
Damage: attacker.DamageZone.Damage,
}
t.Skill_Useed()
return true