TimeBattle.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. public class TimeBattle : BaseBattle
  4. {
  5. #region fields
  6. private TimeBattleField mTimeBattleField;
  7. private TimeBattleState mState;
  8. private List<ActorData> mOwnActors;
  9. private List<ActorData> mEnemyActors;
  10. private List<ActorData> mOurPlayerActors;
  11. private List<ActorData> mEnemyPlayerActors;
  12. private ReadyPoint mActorReadyPoint;
  13. private SpawnPoint mEnemyReadyPoint;
  14. private string mSceneName;
  15. public int BossLife { get { return mTimeBattleField.BossLife; } }
  16. public int BossSp { get { return mTimeBattleField.BossSp; } }
  17. public TimeBattleScene BattleScene { get; set; }
  18. public TimeBattleStateType CurrentState
  19. {
  20. get { return mState == null ? TimeBattleStateType.None : mState.State; }
  21. set
  22. {
  23. if (CurrentState == value)
  24. return;
  25. int oldState = (int)CurrentState;
  26. if (mState != null)
  27. mState.OnLeave();
  28. mState = TimeBattleState.Create(this, value);
  29. if (mState != null)
  30. mState.OnEnter();
  31. }
  32. }
  33. public string SceneName
  34. {
  35. get { return mSceneName; }
  36. }
  37. private string mBgmMusic;
  38. public string BgMusic
  39. {
  40. get
  41. {
  42. return mBgmMusic;
  43. }
  44. }
  45. public override List<ActorData> TeamActors
  46. {
  47. get { return mOwnActors; }
  48. }
  49. public override List<ActorData> TeamPlayerActors
  50. {
  51. get { return mOurPlayerActors; }
  52. }
  53. public override List<ActorData> EnemyActors
  54. {
  55. get { return mEnemyActors; }
  56. }
  57. public override List<ActorData> EnemyPlayerActors
  58. {
  59. get { return mEnemyPlayerActors; }
  60. }
  61. private BattleSubMode mTimeBattleMode;
  62. public BattleSubMode BattMode
  63. {
  64. get { return mTimeBattleMode; }
  65. }
  66. public override BattleSubMode SubBattleMode
  67. {
  68. get { return mTimeBattleMode; }
  69. }
  70. private ServerFighterParam[] mSrvFighterParams = null;
  71. private GvGMark[] mArrayGvGMark = null;
  72. private GvGMark[] mArrayEnemyGvGMark = null;
  73. private int m_nRestoreSp = 0;
  74. #endregion
  75. public TimeBattle(BattleSubMode mode,ActorData[] ownActors,ActorData[] enemyActors,string sceneName,float maxBattlingTime,string bgmMusic, ServerFighterParam[] paramList,
  76. List<BattleEndCondition> endCondList,int nRestoreSp, GvGMark[] OurMarks, GvGMark[] EnemyMarks)
  77. : base(BattleMode.Time,endCondList)
  78. {
  79. mTimeBattleMode = mode;
  80. IsLogicOnly = true;
  81. mSceneName = sceneName;
  82. mBgmMusic = bgmMusic;
  83. CreateBattleField(ownActors,enemyActors, maxBattlingTime);
  84. SortActors();
  85. if (paramList == null)
  86. {
  87. mSrvFighterParams = null;
  88. }
  89. else
  90. {
  91. mSrvFighterParams = new ServerFighterParam[paramList.Length];
  92. for (int idx = 0; idx < paramList.Length; idx++)
  93. {
  94. mSrvFighterParams[idx] = paramList[idx];
  95. }
  96. }
  97. if(null == OurMarks)
  98. {
  99. mArrayGvGMark = null;
  100. }
  101. else
  102. {
  103. mArrayGvGMark = new GvGMark[OurMarks.Length];
  104. for (int idx = 0; idx < OurMarks.Length; idx++)
  105. {
  106. mArrayGvGMark[idx] = OurMarks[idx];
  107. }
  108. }
  109. if (null == EnemyMarks)
  110. {
  111. mArrayEnemyGvGMark = null;
  112. }
  113. else
  114. {
  115. mArrayEnemyGvGMark = new GvGMark[EnemyMarks.Length];
  116. for (int idx = 0; idx < EnemyMarks.Length; idx++)
  117. {
  118. mArrayEnemyGvGMark[idx] = EnemyMarks[idx];
  119. }
  120. }
  121. m_nRestoreSp = nRestoreSp;
  122. }
  123. public TimeBattle(BattleSubMode mode, string sceneName, float maxBattlingTime, string bgmMusic, BattleRecorder battleRecorder, List<BattleEndCondition> endCondList)
  124. : base(BattleMode.Time, endCondList)
  125. {
  126. mTimeBattleMode = mode;
  127. IsLogicOnly = true;
  128. mSceneName = sceneName;
  129. mBgmMusic = bgmMusic;
  130. Recorder = battleRecorder;
  131. IsPlayRecord = true;
  132. LoadReplayActors();
  133. mTimeBattleField = new TimeBattleField(this, maxBattlingTime);
  134. SetBattleField(mTimeBattleField);
  135. SortActors();
  136. }
  137. private void SortActors()
  138. {
  139. if (mOurPlayerActors == null)
  140. {
  141. mOurPlayerActors = new List<ActorData>();
  142. }
  143. else
  144. {
  145. mOurPlayerActors.Clear();
  146. }
  147. for(int idx =0; idx < mOwnActors.Count;idx++)
  148. {
  149. if(!mOwnActors[idx].IsPet)
  150. {
  151. mOurPlayerActors.Add(mOwnActors[idx]);
  152. }
  153. }
  154. if(mEnemyPlayerActors == null)
  155. {
  156. mEnemyPlayerActors = new List<ActorData>();
  157. }
  158. else
  159. {
  160. mEnemyPlayerActors.Clear();
  161. }
  162. for(int idx =0; idx < mEnemyActors.Count;idx++)
  163. {
  164. if(!mEnemyActors[idx].IsPet)
  165. {
  166. mEnemyPlayerActors.Add(mEnemyActors[idx]);
  167. }
  168. }
  169. }
  170. private void LoadReplayActors()
  171. {
  172. if (mOwnActors == null)
  173. mOwnActors = new List<ActorData>();
  174. else
  175. mOwnActors.Clear();
  176. mOwnActors.AddRange(Recorder.LeftActors);
  177. if (mEnemyActors == null)
  178. mEnemyActors = new List<ActorData>();
  179. else
  180. mEnemyActors.Clear();
  181. mEnemyActors.AddRange(Recorder.RightActors);
  182. }
  183. private void CreateBattleField(ActorData[] ownActors, ActorData[] enemyActors,float maxBattlingTime)
  184. {
  185. if (mOwnActors == null)
  186. mOwnActors = new List<ActorData>();
  187. else
  188. mOwnActors.Clear();
  189. if (mEnemyActors == null)
  190. mEnemyActors = new List<ActorData>();
  191. else
  192. mEnemyActors.Clear();
  193. for(int idx =0; idx < ownActors.Length;idx++)
  194. {
  195. var actor = ownActors[idx];
  196. mOwnActors.Add(actor);
  197. if(actor.HasPet)
  198. {
  199. mOwnActors.Add(actor.PetData);
  200. }
  201. }
  202. mEnemyActors.AddRange(enemyActors);
  203. if (mTimeBattleField != null)
  204. {
  205. if (FighterMgr.AllFighters.Count > 0)
  206. {
  207. for (int idx = FighterMgr.AllFighters.Count - 1; idx >= 0; idx--)
  208. {
  209. Fighter f = FighterMgr.AllFighters[idx];
  210. f.Destroy();
  211. FighterMgr.RemoveFighter(f);
  212. }
  213. }
  214. }
  215. mTimeBattleField = new TimeBattleField(this,maxBattlingTime);
  216. SetBattleField(mTimeBattleField);
  217. }
  218. public override void Start(int randSeed = 0, ValType[] factors = null)
  219. {
  220. base.Start(randSeed,factors);
  221. CurrentState = TimeBattleStateType.Start;
  222. if (mTimeBattleMode == BattleSubMode.ClimbingTower)
  223. {
  224. InitRecorder();
  225. }
  226. }
  227. public void Fight()
  228. {
  229. mTimeBattleField.Start();
  230. }
  231. public override void Update(float deltaTime)
  232. {
  233. base.Update(deltaTime);
  234. if (mState != null)
  235. mState.Update(deltaTime);
  236. }
  237. public override void MoveToNextBattleField(bool setStopDistance)
  238. {
  239. if (mTimeBattleField == null) return;
  240. for (int idx = 0; idx < FighterMgr.AllFighters.Count; idx++)
  241. {
  242. Fighter f = FighterMgr.AllFighters[idx];
  243. f.Ctrl.EnableNavAgent(true);
  244. if (f.IsTeamMember)
  245. {
  246. f.AutoMoveTo(mActorReadyPoint.GetReadyPointPos(f.Actor.Profession, f.ReadyPosOrder).heroPos);
  247. }
  248. else
  249. {
  250. MonsterSpawnLoc loc = mEnemyReadyPoint.spawnLocs[f.Actor.PositionValue-1];
  251. f.AutoMoveTo(loc.pos);
  252. }
  253. }
  254. }
  255. public void SetReadyPoint(ReadyPoint ownPoint, SpawnPoint enemyPoint)
  256. {
  257. mActorReadyPoint = ownPoint;
  258. mEnemyReadyPoint = enemyPoint;
  259. }
  260. public void SpawnActors()
  261. {
  262. if (mActorReadyPoint == null || mEnemyReadyPoint == null) return;
  263. FighterMgr.SortTeamFighters();
  264. if (IsPlayRecord)
  265. {
  266. Recorder.ProcessFrameRecord(BattleRecorder.RecordType.FighterSpawn);
  267. for(int idx =0; idx < FighterMgr.TeamHeroFighters.Count;idx++)
  268. {
  269. Fighter f = FighterMgr.TeamHeroFighters[idx];
  270. if (f.Actor.HasPet)
  271. {
  272. Fighter pet = FighterMgr.GetTeamMemberById(f.Actor.PetData.ID);
  273. pet.OwnerId = f.Id;
  274. f.UsedPetId = pet.Id;
  275. }
  276. }
  277. }
  278. else
  279. {
  280. for (int idx = 0; idx < FighterMgr.TeamHeroFighters.Count; idx++)
  281. {
  282. Fighter f = FighterMgr.TeamHeroFighters[idx];
  283. var pointCfg = mActorReadyPoint.GetBornPointPos(f.Actor.Profession, f.ReadyPosOrder);
  284. f.Spawn(pointCfg.heroPos, Vector3.forward, Quaternion.identity, true);
  285. if(f.Actor.HasPet)
  286. {
  287. Fighter pet = FighterMgr.GetTeamMemberById(f.Actor.PetData.ID);
  288. pet.Spawn(pointCfg.petPos, Vector3.forward, Quaternion.identity, true);
  289. pet.OwnerId = f.Id;
  290. f.UsedPetId = pet.Id;
  291. }
  292. ServerFighterParam srvParam = GetServerParamById(f.Actor.ID);
  293. if(srvParam != null)
  294. {
  295. int life = (int)(srvParam.hpPercent * f.MaxLife);
  296. life = (life == 0 && srvParam.hpPercent > 0.0f) ? 1 : life; //保底1
  297. f.Life = life > srvParam.hp ? life : srvParam.hp;
  298. float sp = srvParam.spPercent * f.MaxSp;
  299. sp = (sp == 0 && srvParam.spPercent > 0.0f) ? 1 : sp; //保底1
  300. f.Sp = sp > srvParam.sp ? sp : srvParam.sp;
  301. f.RefreshLife();
  302. f.RefreshSp();
  303. }
  304. //初始MARK
  305. //if (null != mArrayGvGMark && SubBattleMode == BattleSubMode.GvG)
  306. //{
  307. // for (int i = 0; i < mArrayGvGMark.Length; i++)
  308. // {
  309. // f.AddMark(mArrayGvGMark[i].m_nMarkid, mArrayGvGMark[i].m_nMarkNum);
  310. // }
  311. //}
  312. }
  313. for (int idx = 0; idx < FighterMgr.EnemyFighters.Count; idx++)
  314. {
  315. Fighter f = FighterMgr.EnemyFighters[idx];
  316. MonsterSpawnLoc loc = mEnemyReadyPoint.spawnLocs[f.Actor.PositionValue - 1];
  317. f.Spawn(loc.pos, Vector3.forward, Quaternion.Euler(loc.rot));
  318. ServerFighterParam srvParam = GetServerParamById(f.Actor.ID);
  319. if (srvParam != null)
  320. {
  321. int life = (int)(srvParam.hpPercent * f.MaxLife);
  322. life = (life == 0 && srvParam.hpPercent > 0.0f) ? 1 : life; //保底1
  323. f.Life = life > srvParam.hp ? life : srvParam.hp;
  324. float sp = srvParam.spPercent * f.MaxSp;
  325. sp = (sp == 0 && srvParam.spPercent > 0.0f) ? 1 : sp; //保底1
  326. f.Sp = sp > srvParam.sp ? sp : srvParam.sp;
  327. f.RefreshLife();
  328. f.RefreshSp();
  329. }
  330. //初始MARK
  331. //if(null != mArrayEnemyGvGMark && SubBattleMode == BattleSubMode.GvG)
  332. //{
  333. // for(int i=0;i< mArrayEnemyGvGMark.Length;i++)
  334. // {
  335. // f.AddMark(mArrayEnemyGvGMark[i].m_nMarkid, mArrayEnemyGvGMark[i].m_nMarkNum);
  336. // }
  337. //}
  338. }
  339. }
  340. }
  341. public override void Dispose()
  342. {
  343. base.Dispose();
  344. if (BattleScene != null)
  345. {
  346. BattleScene.Dispose();
  347. BattleScene = null;
  348. }
  349. }
  350. public override void ShutDown()
  351. {
  352. base.ShutDown();
  353. CurrentState = TimeBattleStateType.None;
  354. mTimeBattleField = null;
  355. mActorReadyPoint = null;
  356. mEnemyReadyPoint = null;
  357. if (mOwnActors != null)
  358. mOwnActors.Clear();
  359. if (mEnemyActors != null)
  360. mEnemyActors.Clear();
  361. mOwnActors = null;
  362. mEnemyActors = null;
  363. }
  364. public void CleanAllFighter()
  365. {
  366. if (mTimeBattleField == null) return;
  367. for (int idx = mTimeBattleField.Fighters.Count - 1; idx >= 0; idx--)
  368. {
  369. var f = mTimeBattleField.Fighters[idx];
  370. FighterMgr.RemoveFighter(f);
  371. f.Destroy();
  372. }
  373. }
  374. public float GetRestoreSp()
  375. {
  376. return m_nRestoreSp * 0.01f;
  377. }
  378. private ServerFighterParam GetServerParamById(long uid)
  379. {
  380. if (mSrvFighterParams == null) return null;
  381. for(int idx =0; idx < mSrvFighterParams.Length;idx++)
  382. {
  383. if (mSrvFighterParams[idx].uid == uid)
  384. return mSrvFighterParams[idx];
  385. }
  386. return null;
  387. }
  388. }