Files
bl/logic/service/fight/info/BattlePetEntity.go
昔念 7ef001f1b9 refactor(fight): 重构战斗逻辑
- 新增 AI_player 结构体和相关方法,用于创建和管理 AI 玩家
- 重构 FightC 结构体,增加 Input 结构体用于封装玩家输入
- 优化战斗流程,包括回合处理、技能使用、伤害计算等
- 改进广播机制,使用函数回调替代直接调用方法
- 优化玩家和 AI 的动作处理逻辑
2025-09-08 01:23:12 +08:00

128 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package info
import (
element "blazing/common/data/Element"
"blazing/common/data/xmlres"
"blazing/modules/blazing/model"
"fmt"
"math/rand"
"sync"
"unsafe"
)
// 战斗属性类型
type EnumAttrType int
// 精灵
const Pet_O_Ctx = "PET_O"
const Pet_T_Ctx = "PET_T"
// 这里获得攻击,防御,特工,特防,速度
// * battle_lv: atk(0), def(1), sp_atk(2), sp_def(3), spd(4), accuracy(5)
// * battle_attr: 0:hp, 1:atk, 2:def, 3:sp_atk, 4:sp_def, 5:spd
func (a *BattlePetEntity) Value(tt uint32) uint32 {
offsetAtk := unsafe.Offsetof(a.Info.Attack) // c字段的偏移量通常为4+16=20
// 2. 将结构体指针转换为原始内存地址uintptr
baseAddr := uintptr(unsafe.Pointer(&offsetAtk))
fmt.Println(*(*uint32)(unsafe.Pointer(&baseAddr)))
addrA := unsafe.Pointer(baseAddr + 4*uintptr(tt)) //根据0是攻击
offsetAtkP := unsafe.Offsetof(a.Prop.Attack) // c字段的偏移量通常为4+16=20
// 2. 将结构体指针转换为原始内存地址uintptr
baseAddrp := uintptr(unsafe.Pointer(&offsetAtkP))
fmt.Println(*(*uint32)(unsafe.Pointer(&offsetAtkP)))
addrB := unsafe.Pointer(baseAddrp + 4*uintptr(tt)) //根据0是攻击
fmt.Println(*(*uint32)(addrA))
ret := uint32(calculateRealValue(int64(*(*uint32)(addrA)), int(*(*byte)(addrB))))
return ret
}
func (a *BattlePetEntity) Speed() uint32 {
return uint32(calculateRealValue(int64(a.Info.Speed), int(a.Prop.Speed)))
}
func (a *BattlePetEntity) Attack() uint32 {
return uint32(calculateRealValue(int64(a.Info.Attack), int(a.Prop.Attack)))
}
func (a *BattlePetEntity) Defense() uint32 {
return uint32(calculateRealValue(int64(a.Info.Defence), int(a.Prop.Defence)))
}
func (a *BattlePetEntity) SAttack() uint32 {
return uint32(calculateRealValue(int64(a.Info.SpecialAttack), int(a.Prop.SpecialAttack)))
}
func (a *BattlePetEntity) SDefense() uint32 {
return uint32(calculateRealValue(int64(a.Info.SpecialDefence), int(a.Prop.SpecialDefence)))
}
func (a *BattlePetEntity) Accuracy(b int64) uint32 {
return uint32(calculateRealValue(b, int(a.Prop.Accuracy)))
}
type BattlePetEntity struct {
xmlres.PetInfo
Info model.PetInfo //通过偏移赋值
statusConditions sync.Map // key: StatusCondition, value: int (剩余回合)
Skills [4]*BattleSkillEntity // 技能槽最多4个技能
Status StatusDict //精灵的状态
//能力提升属性
Prop PropDict
}
// 创建精灵实例
func CreateBattlePetEntity(info model.PetInfo, rand *rand.Rand) *BattlePetEntity {
ret := &BattlePetEntity{}
ret.PetInfo = xmlres.PetMAP[int(info.ID)] //注入精灵信息
ret.Info = info
for i := 0; i < 4; i++ {
//todo 技能信息应该每回合进行深拷贝,保证每次的技能效果都是不一样的
ret.Skills[i] = CreateBattleSkillWithInfinity(&info.SkillList[i], rand, ret)
}
return ret
}
// calculateRealValue 计算实际属性值根据状态变化计算实际值
// value 基础属性值
// stat 状态变化值(可正可负)
// 返回// 返回计算后的实际属性值确保结果至少为1
func calculateRealValue(value int64, stat int) int64 {
if stat == 0 {
if value <= 0 {
return 1
}
return value
} else if stat > 0 {
r := int64(float64(value) * (float64(stat+2) / 2.0))
if r <= 0 {
return 1
}
return r
} else {
r := int64(float64(value) * (2.0 / float64(2-stat)))
if r <= 0 {
return 1
}
return r
}
}
func (u *BattlePetEntity) Type() *element.ElementCombination {
var ff *element.ElementCombination
for _, v := range xmlres.PetMAP {
if v.ID == int(u.Info.ID) {
ff, _ = element.NewElementCombination(v.Type)
}
}
//todo 待实现获取精灵的类型
return ff
}