2026-01-29 13:59:48 +08:00
|
|
|
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"
|
2026-03-04 22:47:21 +08:00
|
|
|
"blazing/modules/player/model"
|
2026-01-29 13:59:48 +08:00
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// 创建新战斗,邀请方和被邀请方,或者玩家和野怪方
|
2026-03-22 23:41:51 +08:00
|
|
|
func NewFight(p1, p2 common.PlayerI, b1, b2 []model.PetInfo, fn func(model.FightOverInfo)) (*FightC, errorcode.ErrorCode) {
|
2026-01-29 13:59:48 +08:00
|
|
|
|
2026-02-03 23:57:06 +08:00
|
|
|
// fmt.Println("NewFight", p1.GetInfo().UserID)
|
2026-01-29 13:59:48 +08:00
|
|
|
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}
|
2026-01-29 13:59:48 +08:00
|
|
|
|
2026-04-04 05:44:02 +08:00
|
|
|
f.Switch = make(map[actionSlotKey]*action.ActiveSwitchAction)
|
2026-01-29 13:59:48 +08:00
|
|
|
f.callback = fn //战斗结束的回调
|
|
|
|
|
f.quit = make(chan struct{})
|
|
|
|
|
f.over = make(chan struct{})
|
2026-04-02 23:05:18 +08:00
|
|
|
f.actionNotify = make(chan struct{}, 1)
|
|
|
|
|
f.pendingActions = make([]action.BattleActionI, 0, 4)
|
2026-01-29 13:59:48 +08:00
|
|
|
f.StartTime = time.Now()
|
|
|
|
|
f.Info = p1.Getfightinfo()
|
|
|
|
|
|
|
|
|
|
//这里应该挪到玩家初始化执行
|
|
|
|
|
|
|
|
|
|
f.ReadyInfo.Status = f.Info.Status
|
2026-03-22 23:41:51 +08:00
|
|
|
|
2026-01-29 13:59:48 +08:00
|
|
|
var err errorcode.ErrorCode
|
2026-04-04 04:28:04 +08:00
|
|
|
our, err := f.initplayer(p1, b1)
|
2026-01-29 13:59:48 +08:00
|
|
|
if err > 0 {
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
|
|
}
|
2026-04-04 04:28:04 +08:00
|
|
|
f.Our = []*input.Input{our}
|
2026-01-29 13:59:48 +08:00
|
|
|
|
2026-04-04 04:28:04 +08:00
|
|
|
opp, err := f.initplayer(p2, b2)
|
2026-01-29 13:59:48 +08:00
|
|
|
if err > 0 {
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
|
|
}
|
2026-04-04 04:28:04 +08:00
|
|
|
f.Opp = []*input.Input{opp}
|
2026-01-29 13:59:48 +08:00
|
|
|
|
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])
|
2026-01-29 13:59:48 +08:00
|
|
|
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数据直接加载完成
|
2026-01-29 13:59:48 +08:00
|
|
|
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-01-29 13:59:48 +08:00
|
|
|
}
|
2026-04-04 04:28:04 +08:00
|
|
|
f.Opp[0].AttackValue.Prop = f.Opp[0].Player.(*player.AI_player).Prop
|
2026-01-29 13:59:48 +08:00
|
|
|
}
|
2026-04-04 05:44:02 +08:00
|
|
|
f.FightStartOutboundInfo = f.buildFightStartInfo()
|
2026-01-29 13:59:48 +08:00
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
// }
|
2026-01-29 13:59:48 +08:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
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 { //如果有任一没有加载完成
|
2026-01-29 13:59:48 +08:00
|
|
|
f.closefight = true //阻止继续添加action
|
2026-03-04 22:47:21 +08:00
|
|
|
f.Reason = model.BattleOverReason.PlayerOffline
|
2026-01-29 13:59:48 +08:00
|
|
|
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
|
2026-01-29 13:59:48 +08:00
|
|
|
}
|
|
|
|
|
f.Broadcast(func(ff *input.Input) {
|
|
|
|
|
//todo 将血量和技能pp传回enterturn
|
|
|
|
|
|
|
|
|
|
ff.Player.SendPackCmd(2506, &f.FightOverInfo)
|
|
|
|
|
ff.Player.QuitFight()
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return f, 0
|
|
|
|
|
}
|