BaseBattle.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public enum BattleMode
  5. {
  6. None = 0, //非法
  7. Normal = 1, //正常巡游战斗
  8. Versus = 2, //对战
  9. Boss = 3, //挑战boss
  10. Time = 4, //时间模式的战斗
  11. }
  12. public enum PreloadingStep
  13. {
  14. None,
  15. LoadingScene,
  16. LoadingRoleAssets,
  17. LoadingFlywordAssets,
  18. LoadingPrepareAssets,
  19. LoadingInstantiate,
  20. OpeningScreen,
  21. }
  22. public class BattleEndCondition
  23. {
  24. public int endType; //判断结束条件类型: 1: 队伍阵亡; 2: 超时; 3: 达到伤害量
  25. public int endVal; //数值
  26. public int resultType; //结束的结果类型 1:正常流程, 2:特殊情况
  27. public bool win; //结果类型为特殊时:true 胜利,false:失败
  28. public BattleEndCondition()
  29. {
  30. }
  31. public BattleEndCondition(int type,int resultType)
  32. {
  33. this.endType = type;
  34. this.resultType = resultType;
  35. }
  36. public BattleEndCondition(int type,int val,int resultType,bool win)
  37. {
  38. this.endType = type;
  39. this.endVal = val;
  40. this.resultType = resultType;
  41. this.win = win;
  42. }
  43. }
  44. public class BaseBattle
  45. {
  46. #region Rand_Module
  47. protected NPack.MersenneTwister _rand;
  48. // int randCallCount = 0;
  49. /// <summary>
  50. /// Randoms the value
  51. /// </summary>
  52. /// <returns>The value between [0, 1).</returns>
  53. public float RandomValue()
  54. {
  55. return _rand.NextSingle();
  56. }
  57. /// <summary>
  58. /// Randoms the value.
  59. /// </summary>
  60. /// <returns>The value between [0, 1] or [0, 1).</returns>
  61. /// <param name="includeOne">If set to <c>true</c> include one.</param>
  62. public float RandomValue(bool includeOne)
  63. {
  64. return _rand.NextSingle(includeOne);
  65. }
  66. /// <summary>
  67. /// Randoms the value.
  68. /// </summary>
  69. /// <returns>The value between [min, max).</returns>
  70. /// <param name="min">Minimum.</param>
  71. /// <param name="max">Max.</param>
  72. public float RandomValue(float min, float max)
  73. {
  74. return min + _rand.NextSingle() * (max - min);
  75. }
  76. /// <summary>
  77. /// Randoms the value.
  78. /// </summary>
  79. /// <returns>The value between [min, max] or [min, max).</returns>
  80. /// <param name="min">Minimum.</param>
  81. /// <param name="max">Max.</param>
  82. /// <param name="includeMax">If set to <c>true</c> include max.</param>
  83. public float RandomValue(float min, float max, bool includeMax)
  84. {
  85. return min + _rand.NextSingle(includeMax) * (max - min);
  86. }
  87. /// <summary>
  88. /// Randoms the value.
  89. /// </summary>
  90. /// <returns>The value int between [min, max).</returns>
  91. /// <param name="min">Minimum.</param>
  92. /// <param name="max">Max.</param>
  93. public int RandomValue(int min, int max)
  94. {
  95. return max > min ? _rand.Next(min, max) : min;
  96. }
  97. /// <summary>
  98. /// Randoms the value.
  99. /// </summary>
  100. /// <returns>The value int between [min, max] or [min, max).</returns>
  101. /// <param name="min">Minimum.</param>
  102. /// <param name="max">Max.</param>
  103. /// <param name="includeMax">If set to <c>true</c> include max.</param>
  104. public int RandomValue(int min, int max, bool includeMax)
  105. {
  106. return max > min ? _rand.Next(min, includeMax ? max : max - 1) : min;
  107. }
  108. /// <summary>
  109. /// Randoms the int.
  110. /// </summary>
  111. /// <returns>The int.</returns>
  112. public int RandomInt()
  113. {
  114. return _rand.Next(int.MaxValue);
  115. }
  116. #endregion
  117. protected int mFrameCount;
  118. public int FrameCount { get { return mFrameCount; } }
  119. private BattleMode mBattleMode = BattleMode.None;
  120. public BattleMode Mode { get { return mBattleMode; } }
  121. public virtual BattleSubMode SubBattleMode { get { return BattleSubMode.None; } }
  122. public int RandSeed { get; protected set; }
  123. public ValType[] Factors { get; set; }
  124. protected BattleField mBattleField;
  125. public BattleField CurBattleField
  126. {
  127. get { return mBattleField; }
  128. }
  129. public bool IsFighting { get { return mBattleField != null ? mBattleField.IsFightingState : false; } }
  130. public virtual int CurLevelMonsterLv { get { return 1; } }
  131. public virtual List<ActorData> MyFighters { get { return null; } }
  132. public virtual List<ActorData> EnemyFighters { get { return null; } }
  133. public virtual List<ActorData> TeamActors { get { return null; } }
  134. public virtual List<ActorData> EnemyActors { get { return null; } }
  135. public virtual List<ActorData> TeamPlayerActors { get { return null; } }
  136. public virtual List<ActorData> EnemyPlayerActors { get { return null; } }
  137. public virtual LevelItem CurLevelItem { get { return null; } }
  138. public virtual Vector3 BattleBossCamPos { get { return Vector3.zero; } }
  139. public virtual Vector3 BattleBossCamRot { get { return Vector3.zero; } }
  140. public virtual float BattleCamFar { get { return 0; } }
  141. public virtual bool IsKillingBoss { get { return false; } }
  142. public BattleStatistics BattleStatistics { get; private set; }
  143. public BattleOutput BattleOut { get; private set; }
  144. public FighterManager FighterMgr { get; set; }
  145. public GlobalTrigger globalTrigger
  146. {
  147. get;set;
  148. }
  149. public bool ChallengeBoss { get; set; }
  150. public bool IsLogicOnly { get; protected set; }
  151. private bool mIsLoadingActor = false;
  152. public bool IsLoadingActor
  153. {
  154. get { return mIsLoadingActor; }
  155. set { mIsLoadingActor = value; }
  156. }
  157. public bool IsNormalBattle
  158. {
  159. get { return mBattleMode == BattleMode.Normal; }
  160. }
  161. public bool IsVersusBattle
  162. {
  163. get { return mBattleMode == BattleMode.Versus; }
  164. }
  165. public bool IsBossBattle
  166. {
  167. get { return mBattleMode == BattleMode.Boss; }
  168. }
  169. public bool IsTimeBattle
  170. {
  171. get { return mBattleMode == BattleMode.Time; }
  172. }
  173. private bool mServerAckOk = false;
  174. public bool ServerAckOk
  175. {
  176. get { return mServerAckOk; }
  177. set { mServerAckOk = value; }
  178. }
  179. private float mFighterLiftRatio = 1.0f;
  180. public float FighterLifeRatio
  181. {
  182. get { return mFighterLiftRatio; }
  183. set { mFighterLiftRatio = value; }
  184. }
  185. //暫時只在PVP生效
  186. private int mBattleBeginMarkId = -1;
  187. public int BattleBeginMarkId
  188. {
  189. get { return mBattleBeginMarkId; }
  190. set { mBattleBeginMarkId = value; }
  191. }
  192. public virtual Vector3 TeamCenter
  193. {
  194. get
  195. {
  196. Vector3 min = Vector3.zero;
  197. Vector3 max = Vector3.zero;
  198. bool hasSet = false;
  199. if(FighterMgr.TeamHeroFighters!=null)
  200. {
  201. for (int idx = 0; idx < FighterMgr.TeamHeroFighters.Count; idx++)
  202. {
  203. Fighter f = FighterMgr.TeamHeroFighters[idx];
  204. if (!hasSet)
  205. {
  206. min = f.Position;
  207. max = f.Position;
  208. hasSet = true;
  209. }
  210. else
  211. {
  212. min = Vector3.Min(f.Position, min);
  213. max = Vector3.Max(f.Position, max);
  214. }
  215. }
  216. }
  217. return 0.5f * (min + max) + Vector3.up * 1.0f;
  218. }
  219. }
  220. public bool IsPlayRecord { get; protected set; }
  221. public string RecorderStr { get; set; }
  222. public BattleRecorder Recorder { get; protected set; }
  223. private List<BattleEndCondition> mEndCondList;
  224. public List<BattleEndCondition> EndCondList
  225. {
  226. get { return mEndCondList; }
  227. }
  228. private bool m_bIsShutDown = false;
  229. public bool IsShutDown
  230. {
  231. get { return m_bIsShutDown; }
  232. set { m_bIsShutDown = value; }
  233. }
  234. public BaseBattle(BattleMode mode,List<BattleEndCondition> endCondList)
  235. {
  236. mBattleMode = mode;
  237. IsPlayRecord = false;
  238. InitStatistics();
  239. RegisterEvents();
  240. RecorderStr = null;
  241. mEndCondList = endCondList;
  242. IsShutDown = false;
  243. }
  244. public void SetRandSeed(int randSeed = 0)
  245. {
  246. RandSeed = randSeed > 0 ? randSeed : Random.Range(1, int.MaxValue);
  247. _rand = new NPack.MersenneTwister(RandSeed);
  248. }
  249. public void SetBattleField(BattleField battleField)
  250. {
  251. mBattleField = battleField;
  252. }
  253. public virtual void Start(int seed = 0,ValType[] factors = null)
  254. {
  255. if (!IsPlayRecord)
  256. {
  257. SetRandSeed(seed);
  258. Factors = factors;
  259. }
  260. else
  261. {
  262. SetRandSeed(Recorder.Seed);
  263. Factors = Recorder.Factors;
  264. }
  265. mFrameCount = 0;
  266. GameMgr.RandSeed = RandSeed;
  267. }
  268. public virtual void OnLoadComplete()
  269. {
  270. NotifyLoadProgress(1.0f);
  271. EventMgr.DispatchEvent<bool>(new CoreEvent<bool>(ECoreEventType.EID_LOAD_COMPLETE, true));
  272. }
  273. public virtual void Update(float deltaTime)
  274. {
  275. mFrameCount++;
  276. if(BattleStatistics!=null)
  277. {
  278. BattleStatistics.AnalyzeData();
  279. }
  280. }
  281. public virtual void ShutDown()
  282. {
  283. UnregisterEvents();
  284. IsShutDown = true;
  285. }
  286. public virtual void Dispose()
  287. {
  288. //if (BattleStatistics != null)
  289. //{
  290. // BattleStatistics.Dispose();
  291. // BattleStatistics = null;
  292. //}
  293. if(BattleOut != null)
  294. {
  295. BattleOut.Dispose();
  296. BattleOut = null;
  297. }
  298. if (mBattleField != null)
  299. {
  300. mBattleField.Dispose();
  301. mBattleField = null;
  302. }
  303. if (FighterMgr != null)
  304. {
  305. FighterMgr.Dispose();
  306. FighterMgr = null;
  307. }
  308. if(globalTrigger != null)
  309. {
  310. globalTrigger.Dispose();
  311. globalTrigger = null;
  312. }
  313. if(mEndCondList != null)
  314. {
  315. mEndCondList.Clear();
  316. mEndCondList = null;
  317. }
  318. BattlePrepareManager.Instance.Clear();
  319. BattleCamera.Instance.Clear();
  320. ResourceMgr.Instance.ClearAllResource();
  321. MusicMgr.Instance.RemoveAllSound();
  322. MusicMgr.Instance.Clean();
  323. GameMgr.Instance.CleanUnusedAssets();
  324. mBattleMode = BattleMode.None;
  325. }
  326. public virtual void EnterNextBattle()
  327. {
  328. }
  329. public virtual void ContinueCurrentBattle()
  330. {
  331. }
  332. public virtual void AddActor(ActorData actor,eTeamType teamSide = eTeamType.Friend,bool spawn = true)
  333. {
  334. }
  335. public virtual void RemoveActor(long actorId)
  336. {
  337. }
  338. public virtual void SyncActorLife(long actorId,int hp)
  339. {
  340. }
  341. public virtual void SyncBossLife(long life)
  342. {
  343. }
  344. public virtual void SyncFighterPos(Fighter f)
  345. {
  346. }
  347. public virtual void FighterMove2BattleCenter(Fighter f,Vector3 pos)
  348. {
  349. }
  350. public virtual void CalcNextPoint()
  351. { }
  352. public virtual bool AddNewActors(List<ActorData> actors, eTeamType teamside = eTeamType.Friend, bool spawn = true)
  353. {
  354. return false;
  355. }
  356. public virtual void MoveToNextBattleField(bool setStopDistance)
  357. {
  358. }
  359. public virtual void StartStoryScript()
  360. {
  361. }
  362. public void TeamIntoBattlField()
  363. {
  364. if (CurBattleField == null) return;
  365. List<Fighter> Members = FighterMgr.TeamFighters;
  366. for (int idx = 0; idx < Members.Count; idx++)
  367. {
  368. Fighter member = Members[idx];
  369. member.StateData.Clear();
  370. CurBattleField.AddFighter(member);
  371. }
  372. }
  373. public void SetLoadSetting()
  374. {
  375. QualitySettings.asyncUploadBufferSize = 32;
  376. QualitySettings.asyncUploadTimeSlice = 8;
  377. Application.backgroundLoadingPriority = ThreadPriority.High;
  378. }
  379. public void RestoreLoadSetting()
  380. {
  381. QualitySettings.asyncUploadBufferSize = 16;
  382. QualitySettings.asyncUploadTimeSlice = 4;
  383. Application.backgroundLoadingPriority = ThreadPriority.Normal;
  384. }
  385. public virtual bool IsAllFightersReady()
  386. {
  387. List<Fighter> fighters = FighterMgr.AllFighters;
  388. for (int idx = 0; idx < fighters.Count; idx++)
  389. {
  390. if (!fighters[idx].IsIdle)
  391. return false;
  392. }
  393. return true;
  394. }
  395. public void NotifyLoadProgress(float progress)
  396. {
  397. EventMgr.DispatchEvent<float>(new CoreEvent<float>(ECoreEventType.EID_LOAD_PROGRESS, progress));
  398. }
  399. public void GetBattleFactors(out int magicAtkFactor,out int atkFactor,out int hpFactor,out int spFactor)
  400. {
  401. magicAtkFactor = FindBattleFactor(ActorData.Attr_MagicAttack);
  402. atkFactor = FindBattleFactor(ActorData.Attr_Attack);
  403. hpFactor = FindBattleFactor(ActorData.Attr_MaxHp);
  404. spFactor = FindBattleFactor(ActorData.Attr_MaxSp);
  405. }
  406. public int FindBattleFactor(int attrId)
  407. {
  408. if (Factors == null) return 0;
  409. for(int idx =0; idx < Factors.Length;idx++)
  410. {
  411. if (Factors[idx].id == attrId) return Factors[idx].val;
  412. }
  413. return 0;
  414. }
  415. private void RegisterEvents()
  416. {
  417. EventMgr.AddEventListener<object[]>(ECoreEventType.EID_FIGHTER_HEAL, OnFighterHeal);
  418. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_FIGHTER_DO_SKILL, OnFighterDoSkill);
  419. EventMgr.AddEventListener<Fighter, string>(ECoreEventType.EID_NEGATIVE_FUNCTION, OnFighterNegativeFun);
  420. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_Fighter_Attack, OnFighterAttack);
  421. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_Fighter_BeHit, OnFighterBeHit);
  422. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_Fighter_Treatment, OnFighterTreatment);
  423. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_Fighter_Vertigo, OnFighterVertigo);
  424. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_Fighter_Damage_FromCrit, OnFighterDamageFromCrit);
  425. EventMgr.AddEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Damage_WithCrit, OnFighterDamageWithCrit);
  426. EventMgr.AddEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Damage_Avoid, OnFighterDamageAvoid);
  427. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_FIGHTER_DODGE, OnFighterDodge);
  428. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_Fighter_HP_Lower, OnFighterHp);
  429. EventMgr.AddEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Break_Skill, OnFighterBreakSkill);
  430. EventMgr.AddEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Skill_Broken, OnFighterSkillBroken);
  431. EventMgr.AddEventListener<Fighter,int>(ECoreEventType.EID_Fighter_AddSp, OnFighterAddSp);
  432. EventMgr.AddEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Kill, OnFighterKill);
  433. EventMgr.AddEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Disperse_Buff, OnFighterDisperseBuff);
  434. EventMgr.AddEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Purify_Debuff, OnFighterPurifyDebuff);
  435. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_FIGHTER_ADD_SHIELD, OnFighterAddShield);
  436. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_FIGHTER_CLEAR_SHIELD, OnFighterClearShield);
  437. EventMgr.AddEventListener<UIEventParamFighterHurt>(ECoreEventType.EID_FIGHTER_HURT, OnFighterHurt);
  438. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_Fighter_Silence, OnFighterSilence);
  439. EventMgr.AddEventListener<Fighter>(ECoreEventType.EID_Fighter_Curse, OnFighterCurse);
  440. }
  441. private void UnregisterEvents()
  442. {
  443. EventMgr.RemoveEventListener<object[]>(ECoreEventType.EID_FIGHTER_HEAL, OnFighterHeal);
  444. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_FIGHTER_DO_SKILL, OnFighterDoSkill);
  445. EventMgr.RemoveEventListener<Fighter, string>(ECoreEventType.EID_NEGATIVE_FUNCTION, OnFighterNegativeFun);
  446. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_Fighter_Attack, OnFighterAttack);
  447. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_Fighter_BeHit, OnFighterBeHit);
  448. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_Fighter_Treatment, OnFighterTreatment);
  449. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_Fighter_Vertigo, OnFighterVertigo);
  450. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_Fighter_Damage_FromCrit, OnFighterDamageFromCrit);
  451. EventMgr.RemoveEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Damage_WithCrit, OnFighterDamageWithCrit);
  452. EventMgr.RemoveEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Damage_Avoid, OnFighterDamageAvoid);
  453. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_FIGHTER_DODGE, OnFighterDodge);
  454. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_Fighter_HP_Lower, OnFighterHp);
  455. EventMgr.RemoveEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Break_Skill, OnFighterBreakSkill);
  456. EventMgr.RemoveEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Skill_Broken, OnFighterSkillBroken);
  457. EventMgr.RemoveEventListener<Fighter,int>(ECoreEventType.EID_Fighter_AddSp, OnFighterAddSp);
  458. EventMgr.RemoveEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Kill, OnFighterKill);
  459. EventMgr.RemoveEventListener<Fighter,BaseSkill>(ECoreEventType.EID_Fighter_Disperse_Buff, OnFighterDisperseBuff);
  460. EventMgr.RemoveEventListener<Fighter, BaseSkill>(ECoreEventType.EID_Fighter_Purify_Debuff, OnFighterPurifyDebuff);
  461. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_FIGHTER_ADD_SHIELD, OnFighterAddShield);
  462. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_FIGHTER_CLEAR_SHIELD, OnFighterClearShield);
  463. EventMgr.RemoveEventListener<UIEventParamFighterHurt>(ECoreEventType.EID_FIGHTER_HURT, OnFighterHurt);
  464. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_Fighter_Silence, OnFighterSilence);
  465. EventMgr.RemoveEventListener<Fighter>(ECoreEventType.EID_Fighter_Curse, OnFighterCurse);
  466. }
  467. private void OnFighterHurt(CoreEvent<UIEventParamFighterHurt> ce)
  468. {
  469. CheckPassiveBuff(BuffTriggerType.Trigger_Accumulative_TakeDamage, ce.Data.mTarget);
  470. CheckPassiveBuff(BuffTriggerType.Trigger_Multi_Accumulative_TakeDamage, ce.Data.mTarget);
  471. CheckPassiveBuff(BuffTriggerType.Trigger_Accumulative_TakeDamage_Precent, ce.Data.mTarget);
  472. CheckPassiveBuff(BuffTriggerType.Trigger_Multi_Accumulative_TakeDamage_Precent, ce.Data.mTarget);
  473. }
  474. private void OnFighterAddShield(CoreEvent<Fighter> ce)
  475. {
  476. CheckPassiveBuff(BuffTriggerType.Trigger_Add_Shield, ce.Data);
  477. }
  478. private void OnFighterClearShield(CoreEvent<Fighter> ce)
  479. {
  480. CheckPassiveBuff(BuffTriggerType.Trigger_Clear_Shield, ce.Data);
  481. }
  482. private void OnFighterHeal(CoreEvent<object[]> ce)
  483. {
  484. object[] paramList = ce.Data;
  485. Fighter caster = (Fighter)paramList[0];
  486. int addHp = (int)paramList[1];
  487. if(addHp > 0)
  488. {
  489. CheckPassiveBuff(BuffTriggerType.Trigger_Healed, caster);
  490. }
  491. }
  492. private void OnFighterDoSkill(CoreEvent<Fighter> ce)
  493. {
  494. CheckPassiveBuff(BuffTriggerType.Trigger_CastingSkill, ce.Data);
  495. }
  496. private void OnFighterNegativeFun(CoreEvent<Fighter,string> ce)
  497. {
  498. CheckPassiveBuff(BuffTriggerType.Trigger_Negative_Fun, ce.Data);
  499. }
  500. private void OnFighterAttack(CoreEvent<Fighter> ce)
  501. {
  502. CheckPassiveBuff(BuffTriggerType.Trigger_Attack, ce.Data);
  503. }
  504. private void OnFighterBeHit(CoreEvent<Fighter> ce)
  505. {
  506. CheckPassiveBuff(BuffTriggerType.Trigger_Hit, ce.Data);
  507. }
  508. private void OnFighterTreatment(CoreEvent<Fighter> ce)
  509. {
  510. CheckPassiveBuff(BuffTriggerType.Trigger_Heal, ce.Data);
  511. }
  512. private void OnFighterVertigo(CoreEvent<Fighter> ce)
  513. {
  514. CheckPassiveBuff(BuffTriggerType.Trigger_Vertigo, ce.Data);
  515. }
  516. private void OnFighterDamageFromCrit(CoreEvent<Fighter> ce)
  517. {
  518. CheckPassiveBuff(BuffTriggerType.Trigger_Damage_From_Crit, ce.Data);
  519. }
  520. //被沉默
  521. private void OnFighterSilence(CoreEvent<Fighter> ce)
  522. {
  523. CheckPassiveBuff(BuffTriggerType.Trigger_Silence, ce.Data);
  524. }
  525. //被诅咒
  526. private void OnFighterCurse(CoreEvent<Fighter> ce)
  527. {
  528. CheckPassiveBuff(BuffTriggerType.Trigger_Curse, ce.Data);
  529. }
  530. private void OnFighterDamageWithCrit(CoreEvent<Fighter, BaseSkill> ce)
  531. {
  532. CheckPassiveBuff(BuffTriggerType.Trigger_Damage_With_Crit, ce.Data);
  533. CheckSkillTriggerBuff(BuffTriggerType.Trigger_FixedSkill_CritDamage, ce.Data,ce.Data1);
  534. }
  535. private void OnFighterDamageAvoid(CoreEvent<Fighter,BaseSkill> ce)
  536. {
  537. CheckPassiveBuff(BuffTriggerType.Trigger_Damage_Missed, ce.Data);
  538. CheckSkillTriggerBuff(BuffTriggerType.Trigger_FixedSkill_Avoid, ce.Data, ce.Data1);
  539. }
  540. private void OnFighterDodge(CoreEvent<Fighter> ce)
  541. {
  542. CheckPassiveBuff(BuffTriggerType.Trigger_Miss, ce.Data);
  543. }
  544. private void OnFighterHp(CoreEvent<Fighter> ce)
  545. {
  546. CheckPassiveBuff(BuffTriggerType.Trigger_HP_Lower, ce.Data);
  547. }
  548. private void OnFighterBreakSkill(CoreEvent<Fighter,BaseSkill> ce)
  549. {
  550. if (ce.Data1 == null) return;
  551. //if(ce.Data1.CanBreak)//打断不需要判断
  552. //{
  553. // CheckPassiveBuff(BuffTriggerType.Trigger_Break_SingSkill, ce.Data);
  554. //}
  555. CheckPassiveBuff(BuffTriggerType.Trigger_Break_SingSkill, ce.Data);
  556. CheckSkillTriggerBuff(BuffTriggerType.Trigger_FixedSkill_Break_Skill, ce.Data,ce.Data1);
  557. }
  558. private void OnFighterSkillBroken(CoreEvent<Fighter,BaseSkill> ce)
  559. {
  560. if (ce.Data1.CanBreak)
  561. {
  562. CheckPassiveBuff(BuffTriggerType.Trigger_SingSkill_Broken, ce.Data);
  563. }
  564. CheckSkillTriggerBuff(BuffTriggerType.Trigger_FixedSkill_Broken, ce.Data,ce.Data1);
  565. }
  566. private void OnFighterAddSp(CoreEvent<Fighter,int> ce)
  567. {
  568. CheckPassiveBuff(BuffTriggerType.Trigger_AddSp, ce.Data);
  569. }
  570. private void OnFighterKill(CoreEvent<Fighter,BaseSkill> ce)
  571. {
  572. CheckSkillTriggerBuff(BuffTriggerType.Trigger_FixedSkill_KillTarget, ce.Data,ce.Data1);
  573. }
  574. private void OnFighterDisperseBuff(CoreEvent<Fighter,BaseSkill> ce)
  575. {
  576. CheckSkillTriggerBuff(BuffTriggerType.Trigger_FixedSkill_DisperseBuff, ce.Data,ce.Data1);
  577. }
  578. private void OnFighterPurifyDebuff(CoreEvent<Fighter, BaseSkill> ce)
  579. {
  580. CheckSkillTriggerBuff(BuffTriggerType.Trigger_FixedSkill_PurifyDeBuff, ce.Data,ce.Data1);
  581. }
  582. private void CheckPassiveBuff(BuffTriggerType type,Fighter caster)
  583. {
  584. if (CurBattleField == null) return;
  585. List<Fighter> fighters = CurBattleField.Fighters;
  586. for (int idx = 0; idx < fighters.Count; idx++)
  587. {
  588. var f = fighters[idx];
  589. f.ProcessTriggerBuff(caster,type);
  590. }
  591. }
  592. private void CheckSkillTriggerBuff(BuffTriggerType type, Fighter caster,BaseSkill skill)
  593. {
  594. if (skill == null) return;
  595. if (CurBattleField == null) return;
  596. List<Fighter> fighters = CurBattleField.Fighters;
  597. for (int idx = 0; idx < fighters.Count; idx++)
  598. {
  599. var f = fighters[idx];
  600. f.ProcessTriggerSkillBuff(caster,skill,type);
  601. }
  602. }
  603. #region record_methods
  604. public void InitStatistics()
  605. {
  606. BattleStatistics = new BattleStatistics();
  607. BattleOut = new BattleOutput();
  608. }
  609. public void StartStatistics()
  610. {
  611. BattleStatistics.Start();
  612. }
  613. public void EndStatistics()
  614. {
  615. BattleStatistics.End();
  616. }
  617. public void StartOutput()
  618. {
  619. BattleOut.Begin();
  620. }
  621. public void EndOutput()
  622. {
  623. BattleOut.End();
  624. }
  625. public void Output(OutputType type, Fighter caster, Fighter target = null, string skillName = null, object val = null)
  626. {
  627. if (BattleOut == null) return;
  628. BattleOut.Output(type, caster, target, skillName, val);
  629. }
  630. public void InitRecorder()
  631. {
  632. if (IsPlayRecord)
  633. {
  634. Recorder.ResetToPlayRecord(this);
  635. }
  636. else
  637. {
  638. Recorder = new BattleRecorder(this);
  639. }
  640. }
  641. public void CloseRecorder()
  642. {
  643. Recorder = null;
  644. IsPlayRecord = false;
  645. }
  646. public void ReplayRecords(BattleRecorder recorder)
  647. {
  648. this.Recorder = recorder;
  649. IsPlayRecord = true;
  650. SetRandSeed(Recorder.Seed);
  651. Factors = Recorder.Factors;
  652. }
  653. #endregion
  654. public bool CanPrintLog
  655. {
  656. get
  657. {return Constants.printBattleLog &&
  658. (BattleMgr.Instance.Battle.IsPlayRecord ||
  659. BattleMgr.Instance.Battle.IsKillingBoss ||
  660. BattleMgr.Instance.Battle.IsTimeBattle);
  661. }
  662. }
  663. }