Files
bl/logic/service/fight/new.go

105 lines
2.9 KiB
Go
Raw Normal View History

package fight
import (
"blazing/common/socket/errorcode"
"blazing/cool"
"blazing/logic/service/common"
"blazing/logic/service/fight/action"
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/player"
"blazing/modules/player/model"
"time"
)
// 创建新战斗,邀请方和被邀请方,或者玩家和野怪方
func NewFight(p1, p2 common.PlayerI, b1, b2 []model.PetInfo, fn func(model.FightOverInfo)) (*FightC, errorcode.ErrorCode) {
// fmt.Println("NewFight", p1.GetInfo().UserID)
f := &FightC{}
f.ownerID = p1.GetInfo().UserID
2026-04-04 04:28:04 +08:00
f.OurPlayers = []common.PlayerI{p1}
f.OppPlayers = []common.PlayerI{p2}
f.Switch = make(map[actionSlotKey]*action.ActiveSwitchAction)
f.callback = fn //战斗结束的回调
f.quit = make(chan struct{})
f.over = make(chan struct{})
f.actionNotify = make(chan struct{}, 1)
f.pendingActions = make([]action.BattleActionI, 0, 4)
f.StartTime = time.Now()
f.Info = p1.Getfightinfo()
//这里应该挪到玩家初始化执行
f.ReadyInfo.Status = f.Info.Status
var err errorcode.ErrorCode
2026-04-04 04:28:04 +08:00
our, err := f.initplayer(p1, b1)
if err > 0 {
return nil, err
}
2026-04-04 04:28:04 +08:00
f.Our = []*input.Input{our}
2026-04-04 04:28:04 +08:00
opp, err := f.initplayer(p2, b2)
if err > 0 {
return nil, err
}
2026-04-04 04:28:04 +08:00
f.Opp = []*input.Input{opp}
2026-04-04 04:28:04 +08:00
f.ReadyInfo.OurInfo, f.ReadyInfo.OurPetList = initfightready(f.Our[0])
f.ReadyInfo.OpponentInfo, f.ReadyInfo.OpponentPetList = initfightready(f.Opp[0])
var loadtime time.Duration = 120 * time.Second
//说明是PVE
f.Broadcast(func(ff *input.Input) {
ff.SetOPP(f.GetInputByPlayer(ff.Player, true))
})
if f.Info.Status == info.BattleMode.FIGHT_WITH_NPC {
2026-04-04 04:28:04 +08:00
f.Opp[0].Finished = true //PVE 默认boss数据直接加载完成
loadtime = 60 * time.Second
//f.handleNPCFightSpecial(&fightStartInfo)
2026-02-14 23:14:43 +08:00
2026-04-04 04:28:04 +08:00
if f.Opp[0].Player.(*player.AI_player).CanCapture > 0 {
f.Opp[0].CanCapture = f.Opp[0].Player.(*player.AI_player).CanCapture
}
2026-04-04 04:28:04 +08:00
f.Opp[0].AttackValue.Prop = f.Opp[0].Player.(*player.AI_player).Prop
}
f.FightStartOutboundInfo = f.buildFightStartInfo()
f.Broadcast(func(ff *input.Input) {
ff.Player.SendPackCmd(2503, &f.ReadyInfo)
2026-02-12 00:49:18 +08:00
// if p, ok := ff.Player.(*player.Player); ok {
// p.Service.Info.Save(*p.Info)
// }
})
cool.Cron.AfterFunc(loadtime, func() {
2026-02-03 20:20:13 +08:00
//fmt.Println(f.Our.UserID, "战斗超时结算")
2026-04-04 04:28:04 +08:00
if !f.Our[0].Finished || !f.Opp[0].Finished { //如果有任一没有加载完成
f.closefight = true //阻止继续添加action
f.Reason = model.BattleOverReason.PlayerOffline
switch {
2026-04-04 04:28:04 +08:00
case !f.Opp[0].Finished: //邀请方没加载完成 先判断邀请方,如果都没加载完成,就算做房主胜利
f.WinnerId = f.Our[0].Player.GetInfo().UserID
case !f.Our[0].Finished: //被邀请方没加载完成
f.WinnerId = f.Opp[0].Player.GetInfo().UserID
}
f.Broadcast(func(ff *input.Input) {
//todo 将血量和技能pp传回enterturn
ff.Player.SendPackCmd(2506, &f.FightOverInfo)
ff.Player.QuitFight()
})
}
})
return f, 0
}