ecs/servers/game/logic/player_battle.go

250 lines
6.8 KiB
Go

package logic
import (
"ecs/proto"
"ecs/proto/pb"
"ecs/servers/game/data"
"github.com/oylshe1314/framework/util"
)
func (this *Player) EnterBattle(sceneTable *data.Scene) {
this.Temp.Fighting = true
this.Temp.RandSeed = util.DefaultRandom.Uint64()
this.enterScene(uint32(sceneTable.Id))
this.copyBattle(sceneTable)
}
func (this *Player) EndBattle() {
this.Temp.Fighting = false
this.Temp.RandSeed = 0
this.enterScene(0)
}
func (this *Player) copyBattle(sceneTable *data.Scene) {
var ack, err = this.virtualBattle(sceneTable)
if err != nil {
_ = this.TipNotice(err)
return
}
if ack.Succeed {
this.PassedCopy(sceneTable, ack.Score)
}
_ = this.Send(uint16(pb.ModId_ModuleBattle), uint16(pb.MsgId_ModBattleEnter), ack)
}
type _BattleBuff struct {
id uint32
}
type _BattleSkill struct {
id uint32
buffs []*_BattleBuff
}
type _BattleUnit struct {
id uint64
attrs Attrs
attackSkills []*_BattleSkill
passiveSkills []*_BattleSkill
}
func (this *Player) virtualBattle(sceneTable *data.Scene) (ack *pb.BattleEnterAck, tip proto.TipError) {
var lineup = util.MapFindValue(this.Lineup, func(lineup *PlayerLineup) bool {
return lineup.Active
})
if lineup == nil {
return nil, proto.TipLineupNotFound
}
var heroes = make([]*_BattleUnit, 6)
for i := range 6 {
if lineup.Heroes[i] != nil {
if hero := this.Hero[lineup.Heroes[i].HeroUid]; hero != nil {
heroes[lineup.Heroes[i].Position-1] = &_BattleUnit{
id: lineup.Heroes[i].HeroUid,
attrs: hero.Attrs(),
}
}
}
}
var enemies []*_BattleUnit
if pb.CopyType(sceneTable.CopyType) == pb.CopyType_CopyArena {
} else {
enemies, tip = this.loadMonsters([]int{sceneTable.Monster1, sceneTable.Monster2, sceneTable.Monster3, sceneTable.Monster4, sceneTable.Monster5, sceneTable.Monster6})
if tip != nil {
return
}
}
ack = &pb.BattleEnterAck{
SceneId: uint32(sceneTable.Id),
RewardList: nil,
}
ack.Heroes = make([]*pb.BattleUnit, 6)
ack.Enemies = make([]*pb.BattleUnit, 6)
for i := range 6 {
if heroes[i] != nil {
ack.Heroes[i] = &pb.BattleUnit{UnitId: heroes[i].id}
}
if enemies[i] != nil {
ack.Enemies[i] = &pb.BattleUnit{UnitId: enemies[i].id}
}
}
ack.Succeed, ack.Score, ack.RoundList = this.calcBattle(heroes, enemies)
ack.BattleRounds = uint32(len(ack.RoundList))
return ack, nil
}
func (this *Player) calcBattle(heroes, enemies []*_BattleUnit) (bool, int32, []*pb.BattleRound) {
return true, 3, []*pb.BattleRound{
{
BattleRound: 1,
ActionList: []*pb.BattleAction{
{
Caster: &pb.BattleTarget{
Type: 1,
Id: heroes[0].id,
HpMax: heroes[0].attrs[pb.AttrType_Hp],
Rage: 0,
Status: nil,
Value: nil,
Hp: nil,
},
Type: 0,
SkillId: 100021,
TargetList: []*pb.BattleTarget{
{
Type: 2,
Id: enemies[0].id,
HpMax: enemies[0].attrs[pb.AttrType_Hp],
Rage: 0,
Status: nil,
Value: []uint64{heroes[0].attrs[pb.AttrType_Attack]},
Hp: []uint64{enemies[0].attrs[pb.AttrType_Hp] - heroes[0].attrs[pb.AttrType_Attack]},
},
},
},
{
Caster: &pb.BattleTarget{
Type: 2,
Id: enemies[1].id,
HpMax: enemies[1].attrs[pb.AttrType_Hp],
Rage: 0,
Status: nil,
Value: nil,
Hp: nil,
},
Type: 0,
SkillId: 100191,
TargetList: []*pb.BattleTarget{
{
Type: 1,
Id: heroes[0].id,
HpMax: heroes[0].attrs[pb.AttrType_Hp],
Rage: 0,
Status: nil,
Value: []uint64{enemies[1].attrs[pb.AttrType_Attack]},
Hp: []uint64{heroes[0].attrs[pb.AttrType_Hp] - enemies[1].attrs[pb.AttrType_Attack]},
},
},
},
},
},
}
}
func (this *Player) loadMonsters(monsterIds []int) (unitList []*_BattleUnit, tip proto.TipError) {
unitList = make([]*_BattleUnit, len(monsterIds))
for i, monsterId := range monsterIds {
if monsterId == 0 {
continue
}
var monsterTable = this.manager.tables.Monster.Find(int(monsterId))
if monsterTable == nil {
return nil, proto.TipDataTablesError
}
var unit = &_BattleUnit{id: uint64(monsterTable.Id)}
unit.attackSkills, tip = this.loadSkills(monsterTable.AttackSkills)
if tip != nil {
return
}
unit.passiveSkills, tip = this.loadSkills(monsterTable.PassiveSkills)
if tip != nil {
return
}
unit.attrs[pb.AttrType_Attack] = uint64(monsterTable.AttrValue1)
unit.attrs[pb.AttrType_Hp] = uint64(monsterTable.AttrValue2)
unit.attrs[pb.AttrType_AttrPhysicalDefense] = uint64(monsterTable.AttrValue3)
unit.attrs[pb.AttrType_AttrMagicDefense] = uint64(monsterTable.AttrValue4)
unit.attrs[pb.AttrType_AttrAttackRatio] = uint64(monsterTable.AttrValue5)
unit.attrs[pb.AttrType_AttrHpRatio] = uint64(monsterTable.AttrValue6)
unit.attrs[pb.AttrType_AttrPhysicalDefenseRatio] = uint64(monsterTable.AttrValue7)
unit.attrs[pb.AttrType_AttrMagicDefenseRatio] = uint64(monsterTable.AttrValue8)
unit.attrs[pb.AttrType_AttrDamageRatio] = uint64(monsterTable.AttrValue9)
unit.attrs[pb.AttrType_AttrDamageRelief] = uint64(monsterTable.AttrValue10)
unit.attrs[pb.AttrType_AttrCriticalRatio] = uint64(monsterTable.AttrValue11)
unit.attrs[pb.AttrType_AttrCriticalResistance] = uint64(monsterTable.AttrValue12)
unit.attrs[pb.AttrType_AttrCriticalDamage] = uint64(monsterTable.AttrValue13)
unit.attrs[pb.AttrType_AttrCriticalDamageRelief] = uint64(monsterTable.AttrValue14)
unit.attrs[pb.AttrType_AttrHitRate] = uint64(monsterTable.AttrValue15)
unit.attrs[pb.AttrType_AttrDodgeRate] = uint64(monsterTable.AttrValue16)
unit.attrs[pb.AttrType_AttrTreatRatio] = uint64(monsterTable.AttrValue17)
unit.attrs[pb.AttrType_AttrByTreatedRatio] = uint64(monsterTable.AttrValue18)
unit.attrs[pb.AttrType_AttrFinalDamageRatio] = uint64(monsterTable.AttrValue19)
unit.attrs[pb.AttrType_AttrFinalDamageRelief] = uint64(monsterTable.AttrValue20)
unitList[i] = unit
}
return
}
func (this *Player) loadSkills(skillIds []int) (skillList []*_BattleSkill, tip proto.TipError) {
skillList = make([]*_BattleSkill, len(skillIds))
for _, skillId := range skillIds {
var skillTable = this.manager.tables.Skill.Find(skillId)
if skillTable == nil {
return nil, proto.TipDataTablesError
}
var skill = &_BattleSkill{
id: uint32(skillId),
}
skill.buffs, tip = this.loadSkillsBuff(skillTable.SkillBuff)
if tip != nil {
return
}
}
return
}
func (this *Player) loadSkillsBuff(buffIds []int) (buffList []*_BattleBuff, tip proto.TipError) {
buffList = make([]*_BattleBuff, len(buffIds))
for i, skillId := range buffIds {
var buff = this.manager.tables.SkillBuff.Find(skillId)
if buff == nil {
return nil, proto.TipDataTablesError
}
var battleBuff = &_BattleBuff{
id: uint32(skillId),
}
buffList[i] = battleBuff
}
return buffList, nil
}