Files
SVSimServer/SVSim.BattleEngine/Engine/NetworkWatchBattleMgr.cs
gamer147 0d9d8acae0 feat(battle-engine): M1 auto-copy closure (782 battle-logic files)
Compile-driven bulk-copy loop (tools/engine-port/m1_copy_loop.py) pulled the precise reference closure of the battle-core roots, stopping at the classify god-object/View-VFX-UI boundary. 782 files; no re-explosion (M0 had estimated ~order 1000). Residual frontier = 52 shim-classified + 80 external (Unity/BCL) types to author next.
2026-06-05 16:57:20 -04:00

602 lines
18 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using Wizard;
using Wizard.Battle.View.Vfx;
using Wizard.BattleMgr;
using Wizard.RoomMatch;
public class NetworkWatchBattleMgr : NetworkBattleManagerBase
{
private class SelectObjectHandCard
{
private const float SELECT_CARD_MOVE_POS_Y = 45f;
private Vector3 _selectedPos;
public BattleCardBase CardBase { get; private set; }
public SelectObjectHandCard(BattleCardBase cardBase, bool isOwner)
{
CardBase = cardBase;
if (isOwner)
{
_selectedPos = new Vector3(0f, 45f, 0f);
}
else
{
_selectedPos = new Vector3(0f, -45f, 0f);
}
}
public VfxBase CreateVfxSelectMove()
{
return CreateVfxMoveHandCard(CardBase.BattleCardView.CardWrapObject, _selectedPos);
}
public VfxBase CreateVfxResetPos()
{
return CreateVfxMoveHandCard(CardBase.BattleCardView.CardWrapObject, Vector3.zero);
}
public void ResetOriginalPosition()
{
iTween.Stop(CardBase.BattleCardView.CardWrapObject);
CardBase.BattleCardView.CardWrapObject.transform.localPosition = Vector3.zero;
}
private VfxBase CreateVfxMoveHandCard(GameObject cardObj, Vector3 position)
{
return InstantVfx.Create(delegate
{
if (!(cardObj == null))
{
iTween.MoveTo(cardObj, iTween.Hash("position", position, "time", 0.2f, "islocal", true, "easetype", iTween.EaseType.easeInOutExpo));
}
});
}
}
public WatcherDisconnectChecker watcherDisconnectChecker;
public WatcherLeaveChecker watcherLeaveChecker;
public DialogBase disconnectDialog;
public bool IsHandCardInvisible;
private SelectObjectHandCard _cardSelectedByOwner;
private SelectObjectHandCard _cardSelectedByGuest;
private bool _isConventionWatch;
private bool _isGathering;
protected bool isResultDone;
private int MyPageReturnIndex
{
get
{
if (!_isConventionWatch)
{
return 2;
}
return 3;
}
}
public NetworkWatchBattleMgr(IBattleMgrContentsCreator contentsCreator)
: base(contentsCreator)
{
TouchControl = new WatchTouchControl(this, _battleCamera, _backGround);
OperateMgr.SetTouchControl(TouchControl);
base.networkBattleData = new NetworkWatchBattleData(this);
networkReceiver = new NetworkWatchBattleReceiver(this);
_networkBattleSetupCardEventBase = new NetworkWatchBattleSetupCardEvent(this, RegisterActionManager, base.networkBattleData);
base.recoveryToDispChecker = new RecoveryToDispChecker();
OperateReceive = (GameMgr.GetIns().IsNewReplayBattle ? new NewReplayOperateReceive(this, RegisterActionManager, OperateMgr, base.networkBattleData) : CreateOperateReceive());
base.disconnectToDispChecker.OnDisp += delegate
{
ControlDisconnectOffTouchAndView(flag: true);
};
base.disconnectToDispChecker.OnErase += delegate
{
ControlDisconnectOffTouchAndView(flag: false);
};
BattleFinishToStopIntervalChecker();
IsHandCardInvisible = GameMgr.GetIns().IsWatchHandInvisible;
GameMgr.GetIns().IsWatchHandInvisible = false;
RoomConnectController connectController = RoomBase.ConnectController;
if (connectController != null)
{
_isConventionWatch = connectController.IsConvention;
_isGathering = connectController.IsGathering;
}
SetUpDisconnectCheck();
}
protected override void OpponentAliveCallback()
{
base.OpponentAliveCallback();
watcherLeaveChecker.FinishChecker();
}
protected override void OpponentDisconnectCallback()
{
base.OpponentDisconnectCallback();
watcherLeaveChecker.StartCheckerIfNotStarted();
}
protected override void ControlDisconnectOffTouchAndView(bool flag)
{
}
public override void DisposeBattleGameObj()
{
base.DisposeBattleGameObj();
BattleCoroutine.GetInstance().StopAllCoroutines();
if (watcherDisconnectChecker != null)
{
watcherDisconnectChecker.FinishChecker();
}
if (watcherLeaveChecker != null)
{
watcherLeaveChecker.FinishChecker();
}
IsHandCardInvisible = false;
}
protected virtual void SetUpDisconnectCheck()
{
watcherDisconnectChecker = new WatcherDisconnectChecker();
watcherDisconnectChecker.OnDisp += delegate
{
StartWatcherDisconnect(flag: true);
};
watcherDisconnectChecker.OnErase += delegate
{
StartWatcherDisconnect(flag: false);
};
watcherLeaveChecker = new WatcherLeaveChecker();
watcherLeaveChecker.SetBattleMgr(this);
watcherLeaveChecker.OnDisp += delegate
{
StartCompetitorLeave(flag: true);
};
watcherLeaveChecker.OnErase += delegate
{
StartCompetitorLeave(flag: false);
};
}
private UIManager.ChangeViewSceneParam GetMyPageReturnParam()
{
UIManager.ChangeViewSceneParam changeViewSceneParam = new UIManager.ChangeViewSceneParam();
changeViewSceneParam.MyPageMenuIndex = MyPageReturnIndex;
changeViewSceneParam.IsCutCardMotion = true;
if (MyPageReturnIndex == 2)
{
changeViewSceneParam.OnFinishChangeView = delegate
{
MyPageMenu.Instance.GoToRoomMatch();
};
}
return changeViewSceneParam;
}
private void StartWatcherDisconnect(bool flag)
{
watcherDisconnectChecker.StopChecker();
if (flag)
{
base.BattleUIContainer.ButtonControl.HideAllMenu(isWithoutSE: true);
disconnectDialog = UIManager.GetInstance().CreateDialogClose(isSystem: true);
disconnectDialog.SetSize(DialogBase.Size.M);
disconnectDialog.SetTitleLabel(Data.SystemText.Get("Common_0021"));
disconnectDialog.SetText(Data.SystemText.Get("RoomBattle_0049"));
disconnectDialog.AddButton(DialogBase.ButtonType.OK);
disconnectDialog.SetPanelDepth(6000);
disconnectDialog.SetFadeButtonEnabled(flag: false);
DialogBase dialogBase = disconnectDialog;
dialogBase.onPushButton1 = (Action)Delegate.Combine(dialogBase.onPushButton1, (Action)delegate
{
UIManager.GetInstance().StartCoroutine(GetBattleControl().BattleEnd(delegate
{
UIManager.ChangeViewSceneParam myPageReturnParam = GetMyPageReturnParam();
if (_isGathering)
{
UIManager.GetInstance().ChangeViewScene(UIManager.ViewScene.Gathering);
}
else
{
UIManager.GetInstance().ChangeViewScene(UIManager.ViewScene.MyPage, myPageReturnParam);
}
}));
RoomBase.DestroyMyRoomInfo();
});
}
else if (disconnectDialog != null)
{
disconnectDialog.Close();
disconnectDialog = null;
}
}
private void StartCompetitorLeave(bool flag)
{
watcherLeaveChecker.StopChecker();
if (flag)
{
base.BattleUIContainer.ButtonControl.HideAllMenu(isWithoutSE: true);
disconnectDialog = UIManager.GetInstance().CreateDialogClose(isSystem: true);
disconnectDialog.SetSize(DialogBase.Size.M);
disconnectDialog.SetTitleLabel(Data.SystemText.Get("Common_0021"));
disconnectDialog.SetText(Data.SystemText.Get("RoomBattle_0098"));
disconnectDialog.AddButton(DialogBase.ButtonType.OK);
disconnectDialog.SetPanelDepth(6000);
disconnectDialog.SetFadeButtonEnabled(flag: false);
DialogBase dialogBase = disconnectDialog;
dialogBase.onPushButton1 = (Action)Delegate.Combine(dialogBase.onPushButton1, (Action)delegate
{
UIManager.GetInstance().StartCoroutine(GetBattleControl().BattleEnd(delegate
{
UIManager.ChangeViewSceneParam myPageReturnParam = GetMyPageReturnParam();
if (_isGathering)
{
UIManager.GetInstance().ChangeViewScene(UIManager.ViewScene.Gathering);
}
else
{
UIManager.GetInstance().ChangeViewScene(UIManager.ViewScene.MyPage, myPageReturnParam);
}
}));
RoomBase.DestroyMyRoomInfo();
});
}
else if (disconnectDialog != null)
{
disconnectDialog.Close();
disconnectDialog = null;
}
}
protected override void FirstRecoverySetting()
{
}
public override void RecoveryRecordSkillTarget(IEnumerable<BattleCardBase> targetCards)
{
}
protected override int CreateBackgroundId()
{
return GameMgr.GetIns().GetNetworkUserInfoData().GetFieldId();
}
public override void SetBattleMenuBtnVisibility()
{
}
public override void StartOpening(int FirstAttack)
{
base.StartOpening(FirstAttack);
ITurnEndButtonUI turnEndButtonUI = BattlePlayer.PlayerBattleView.TurnEndButtonUI;
turnEndButtonUI._isButtonForcedOff = true;
turnEndButtonUI.DisableButton();
turnEndTimeController = new WatchTurnEndTimeController(this, BattlePlayer, turnEndButtonUI);
if (GameMgr.GetIns().IsAdminWatch)
{
ESelectSkillSideLog.SetActive(value: true);
}
}
protected override void SetupEvent()
{
base.SetupEvent();
}
public override void SendTurnEnd()
{
}
public override void SetupCardEvent(BattleCardBase card)
{
base.SetupCardEvent(card);
card.OnPlay += delegate
{
if (card.HasSpellCharge)
{
GameObject child = card.BattleCardView.GetChild("SpellBoostCount");
if (child != null)
{
child.SetActive(value: false);
}
}
ResetPositionHandCard(card);
return NullVfx.GetInstance();
};
card.OnDestroy += CreateVfxResetPositionByCardBase;
card.OnBanish += CreateVfxResetPositionByCardBase;
card.OnReturnCard += CreateVfxResetPositionByCardBase;
card.OnMetamorphose += CreateVfxResetPositionByCardBase;
card.OnGetOn += CreateVfxResetPositionByCardBase;
}
private void ResetPositionHandCard(BattleCardBase card)
{
if (_cardSelectedByOwner != null && card == _cardSelectedByOwner.CardBase)
{
_cardSelectedByOwner.ResetOriginalPosition();
}
if (_cardSelectedByGuest != null && card == _cardSelectedByGuest.CardBase)
{
_cardSelectedByGuest.ResetOriginalPosition();
}
}
public VfxBase CreateVfxResetPositionByCardBase(BattleCardBase card, SkillProcessor skill)
{
ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
if (_cardSelectedByOwner != null && _cardSelectedByOwner.CardBase == card)
{
parallelVfxPlayer.Register(_cardSelectedByOwner.CreateVfxResetPos());
}
else if (_cardSelectedByGuest != null && _cardSelectedByGuest.CardBase == card)
{
parallelVfxPlayer.Register(_cardSelectedByGuest.CreateVfxResetPos());
}
return parallelVfxPlayer;
}
public void ToggleSelectHandCardMove(BattleCardBase selectedCard, bool isOwner)
{
if (selectedCard == null)
{
SelectObjectHandCard selectObjectHandCard = null;
if (isOwner)
{
selectObjectHandCard = _cardSelectedByOwner;
_cardSelectedByOwner = null;
}
else
{
selectObjectHandCard = _cardSelectedByGuest;
_cardSelectedByGuest = null;
}
if (selectObjectHandCard != null)
{
base.VfxMgr.RegisterSequentialVfx(selectObjectHandCard.CreateVfxResetPos());
}
return;
}
if (BattleManagerBase.GetIns().GetBattlePlayer(isOwner).IsSelfTurn)
{
base.SlideObjectReceiveCtrl.CancelSlide();
}
if (isOwner)
{
if (_cardSelectedByOwner != null)
{
if (_cardSelectedByOwner.CardBase == selectedCard)
{
return;
}
base.VfxMgr.RegisterSequentialVfx(_cardSelectedByOwner.CreateVfxResetPos());
}
_cardSelectedByOwner = new SelectObjectHandCard(selectedCard, isOwner);
base.VfxMgr.RegisterSequentialVfx(_cardSelectedByOwner.CreateVfxSelectMove());
return;
}
if (_cardSelectedByGuest != null)
{
if (_cardSelectedByGuest.CardBase == selectedCard)
{
return;
}
base.VfxMgr.RegisterSequentialVfx(_cardSelectedByGuest.CreateVfxResetPos());
}
_cardSelectedByGuest = new SelectObjectHandCard(selectedCard, isOwner);
base.VfxMgr.RegisterSequentialVfx(_cardSelectedByGuest.CreateVfxSelectMove());
}
public override void SetupBattlePlayersEvent()
{
base.SetupBattlePlayersEvent();
SetUpRetireEvent();
}
protected virtual void SetUpRetireEvent()
{
BattlePlayer.PlayerBattleView.OnRetire += delegate
{
base.VfxMgr.Clear();
if (RoomBase.ConnectController.IsGathering)
{
GetBattleControl().BattleEnd(UIManager.ViewScene.Gathering, null, delegate(UIManager.ChangeViewSceneParam param)
{
param.IsUpdateFooterMenuTexture = true;
});
RoomBase.DestroyMyRoomInfo();
}
else
{
GetBattleControl().BattleEnd(UIManager.ViewScene.MyPage, delegate
{
if (MyPageMenu.Instance != null)
{
MyPageMenu.Instance.ChangeMenu(MyPageReturnIndex);
if (MyPageReturnIndex == 2)
{
MyPageMenu.Instance.GoToRoomMatch();
}
}
});
RoomBase.DestroyMyRoomInfo();
}
};
}
public override VfxBase StartBattle()
{
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
sequentialVfxPlayer.Register(ChangePhase(base.PhaseCreator.CreateMainPhase()));
return sequentialVfxPlayer;
}
protected override NetworkOperationCollectionBase CreateNetworkOperationCollection(NetworkBattleReceiver.ReceiveData receivedData, bool isPlayer)
{
return new WatchOperationCollection(this, OperateMgr, receivedData, base.networkBattleData, isPlayer);
}
protected override bool IsOperateReceiveCheck()
{
return true;
}
public override void ReceiveRetire(bool isWin)
{
if (isWin)
{
JudgeResultReceiveCode = NetworkBattleReceiver.RESULT_CODE.RetireWin;
SettingResultUI_SpecialResultTypeText(BATTLE_RESULT_TYPE.WIN);
FinishBattleEffect(classDead: true);
}
else
{
JudgeResultReceiveCode = NetworkBattleReceiver.RESULT_CODE.RetireLose;
SettingResultUI_SpecialResultTypeText(BATTLE_RESULT_TYPE.LOSE);
FinishBattleEffect(classDead: true);
}
}
protected override void FinishBattleSend(NetworkBattleSender.JUDGE_RESULT_STATUS log, bool isWin = false, bool isNotRetry = false)
{
if (isResultDone)
{
return;
}
isResultDone = true;
if (JudgeResultReceiveCode == NetworkBattleReceiver.RESULT_CODE.NotFinish)
{
JudgeResultReceiveCode = JudgeCurrentFinishStatus();
if (JudgeResultReceiveCode == NetworkBattleReceiver.RESULT_CODE.NotFinish)
{
LocalLog.AccumulateLastTraceLog("FinishBattleSend NotStatus" + isWin);
if (isWin)
{
JudgeResultReceiveCode = NetworkBattleReceiver.RESULT_CODE.DisconnectWin;
}
else
{
JudgeResultReceiveCode = NetworkBattleReceiver.RESULT_CODE.DisconnectLose;
}
}
}
switch (JudgeResultReceiveCode)
{
case NetworkBattleReceiver.RESULT_CODE.NoContest:
case NetworkBattleReceiver.RESULT_CODE.Invalid:
SettingResultUI_SpecialResultTypeText(BATTLE_RESULT_TYPE.CONSISTENCY);
FinishBattleEffect(classDead: false);
break;
case NetworkBattleReceiver.RESULT_CODE.LifeLose:
case NetworkBattleReceiver.RESULT_CODE.DeckoutLose:
case NetworkBattleReceiver.RESULT_CODE.SpecialLose:
case NetworkBattleReceiver.RESULT_CODE.MaxTurnLose:
base.VfxMgr.RegisterSequentialVfx(InstantVfx.Create(delegate
{
InitiateGameEndSequence(hasWon: false);
}));
break;
case NetworkBattleReceiver.RESULT_CODE.RetireLose:
case NetworkBattleReceiver.RESULT_CODE.DisconnectLose:
case NetworkBattleReceiver.RESULT_CODE.FirstcardLose:
case NetworkBattleReceiver.RESULT_CODE.TurnendLose:
case NetworkBattleReceiver.RESULT_CODE.TurnstartLose:
RegisterDestryoy(isPlayer: true);
base.VfxMgr.RegisterSequentialVfx(InstantVfx.Create(delegate
{
InitiateGameEndSequence(hasWon: false);
}));
break;
case NetworkBattleReceiver.RESULT_CODE.LifeWin:
case NetworkBattleReceiver.RESULT_CODE.DeckoutWin:
case NetworkBattleReceiver.RESULT_CODE.SpecialWin:
base.VfxMgr.RegisterSequentialVfx(InstantVfx.Create(delegate
{
InitiateGameEndSequence(hasWon: true);
}));
break;
case NetworkBattleReceiver.RESULT_CODE.RetireWin:
case NetworkBattleReceiver.RESULT_CODE.DisconnectWin:
case NetworkBattleReceiver.RESULT_CODE.FirstcardWin:
case NetworkBattleReceiver.RESULT_CODE.TurnendWin:
case NetworkBattleReceiver.RESULT_CODE.TurnstartWin:
RegisterDestryoy(isPlayer: false);
base.VfxMgr.RegisterSequentialVfx(InstantVfx.Create(delegate
{
InitiateGameEndSequence(hasWon: true);
}));
break;
}
}
protected void RegisterDestryoy(bool isPlayer)
{
BattleCardBase battleCardBase = GetBattlePlayer(isPlayer).Class;
if (battleCardBase.Life >= 1)
{
battleCardBase.FlagCardAsDestroyedByKiller();
FINISH_TYPE finishTypeByStatus = GetFinishTypeByStatus();
base.VfxMgr.RegisterSequentialVfx(DeadClass(isPlayer, finishTypeByStatus));
}
}
public void FinishBattleSpecialEffect(BATTLE_RESULT_TYPE battleResult)
{
bool isPlayer = true;
switch (battleResult)
{
case BATTLE_RESULT_TYPE.WIN:
isPlayer = true;
break;
case BATTLE_RESULT_TYPE.LOSE:
isPlayer = false;
break;
case BATTLE_RESULT_TYPE.CONSISTENCY:
BattleResultControl.SetBattleFinishConsistency();
isPlayer = true;
break;
}
base.VfxMgr.RegisterSequentialVfx(InstantVfx.Create(delegate
{
InitiateGameEndSequence(isPlayer);
}));
}
protected virtual OperateReceive CreateOperateReceive()
{
return new WatchOperateReceive(this, RegisterActionManager, OperateMgr, base.networkBattleData);
}
public override bool IsSkillConditionCheckSkill(int cardIdx)
{
if (!base.IsSkillConditionCheckSkill(cardIdx))
{
return base.networkBattleData.GetReceiveData().ActiveSelectSkillIndexList.Count > 0;
}
return true;
}
public override bool IsReceivedSkillConditionCheck(int movement, SkillBase skill)
{
if (base.networkBattleData.GetReceiveData().ActiveSelectSkillIndexList.Count > 0)
{
return base.networkBattleData.GetReceiveData().ActiveSelectSkillIndexList.Contains(skill.SkillPrm.ownerCard.Skills.IndexOf(skill));
}
return base.IsReceivedSkillConditionCheck(movement, skill);
}
}