FighterStateData.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. using UnityEngine;
  2. using System;
  3. public class FighterStateData
  4. {
  5. Fighter mFighter;
  6. SLong mLife;
  7. SInt mMana;
  8. SInt mRage;
  9. Fix64 mStarkTime;
  10. float mVertigoTime;
  11. float mDyingTime;
  12. float mStiffTime;
  13. float mAnimTime;
  14. bool mIsGround = true;
  15. float mLastBeHitTime;
  16. bool mIsUnead;
  17. bool mIsAlive;
  18. int mStateFrame;
  19. float mAnimSpeed = 1.0f;
  20. FighterState mState;
  21. FighterSkillStateData mSkillStateData;
  22. FighterBuffManager mBuffMgr;
  23. FighterBuffFunctionMgr mFuncMgr;
  24. MarkMgr mMarkMgr;
  25. bool mIgnoreStateDataChange;
  26. public FighterStateData (Fighter fighter)
  27. {
  28. mFighter = fighter;
  29. mSkillStateData = new FighterSkillStateData (fighter);
  30. mBuffMgr = new FighterBuffManager (fighter);
  31. mFuncMgr = new FighterBuffFunctionMgr(fighter);
  32. mMarkMgr = new MarkMgr(fighter);
  33. }
  34. public bool IsDisposed { get; private set; }
  35. public FighterState State { get { return mState; } }
  36. public FighterStateType StateId { get { return mState != null ? mState.State : FighterStateType.None; } }
  37. public FighterSkillStateData SkillStateData { get { return mSkillStateData; } }
  38. public FighterBuffManager BuffMgr { get { return mBuffMgr; } }
  39. public FighterBuffFunctionMgr FuncMgr { get { return mFuncMgr; } }
  40. public MarkMgr MMarkMgr { get { return mMarkMgr; } }
  41. public BaseSkill CurrentSkill { get { return mSkillStateData.Skill; } }
  42. public bool IsStateDirty { get; private set; }
  43. public bool IsFixLife { get; set; }
  44. public bool IsFixMana { get; set; }
  45. public float AnimSpeed { get { return mAnimSpeed; } }
  46. public SLong Life {
  47. get { return mLife; }
  48. set {
  49. if (IsFixLife)
  50. return;
  51. SLong v = System.Math.Max (value, 0);
  52. if (mLife != v) {
  53. mLife = v;
  54. if (mFighter != null && mFighter.Ctrl != null)
  55. mFighter.RefreshLife();
  56. IsAlive = mLife > 0 || mIsUnead;
  57. //主人死亡时,宠物一并死亡
  58. if (!IsAlive && mFighter !=null&& mFighter.UsedPetId > 0)
  59. {
  60. Fighter pet = mFighter.FighterMgr.GetFighterByID(mFighter.UsedPetId, mFighter.TeamSide);
  61. if (pet != null)
  62. pet.Life = 0;
  63. }
  64. }
  65. }
  66. }
  67. public SInt Mana
  68. {
  69. get { return mMana; }
  70. set
  71. {
  72. if (IsFixMana)
  73. return;
  74. SInt v = Mathf.Max(value, 0);
  75. if (mMana != v)
  76. {
  77. mMana = v;
  78. if (mFighter.Ctrl != null)
  79. mFighter.Ctrl.OnManaChanged();
  80. }
  81. }
  82. }
  83. public SInt Rage
  84. {
  85. get { return mRage; }
  86. set
  87. {
  88. if (IsFixRage)
  89. return;
  90. SInt v = Mathf.Max(value, 0);
  91. if (mRage != v)
  92. {
  93. mRage = v;
  94. if (mFighter.Ctrl != null)
  95. mFighter.Ctrl.OnRageChanged();
  96. }
  97. }
  98. }
  99. public bool IsUnead {
  100. get { return mIsUnead; }
  101. set {
  102. if (mIsUnead != value) {
  103. mIsUnead = value;
  104. IsAlive = mLife > 0 || mIsUnead;
  105. }
  106. }
  107. }
  108. public bool IsAlive {
  109. get { return mIsAlive; }
  110. private set {
  111. if (mIsAlive != value) {
  112. mIsAlive = value;
  113. if (mState != null && !mIgnoreStateDataChange)
  114. mState.OnDataChanged ();
  115. else
  116. IsStateDirty = true;
  117. if (!mIsAlive)
  118. OnDie ();
  119. }
  120. }
  121. }
  122. public bool IsFixRage { get; set; }
  123. public bool IsGround {
  124. get { return mIsGround; }
  125. set {
  126. if (mIsGround != value) {
  127. mIsGround = value;
  128. if (mState != null && !mIgnoreStateDataChange)
  129. mState.OnDataChanged ();
  130. else
  131. IsStateDirty = true;
  132. }
  133. }
  134. }
  135. //免疫状态
  136. public bool IsImmunity { get; set; }
  137. //无敌状态
  138. public bool IsInvincible { get; set; }
  139. private bool mIsVertigo = false;
  140. //眩晕状态
  141. public bool IsVertigo
  142. {
  143. get { return mIsVertigo; }
  144. set
  145. {
  146. if(mIsVertigo != value)
  147. {
  148. mIsVertigo = value;
  149. if (mState != null && !mIgnoreStateDataChange)
  150. mState.OnDataChanged();
  151. else
  152. IsStateDirty = true;
  153. if(mIsVertigo)
  154. {
  155. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_Fighter_Vertigo, mFighter));
  156. }
  157. }
  158. }
  159. }
  160. //沉默状态
  161. public bool IsSilence { get; set; }
  162. //遗忘状态
  163. public bool IsForget { get; set; }
  164. //混乱状态
  165. public bool IsConfused { get; set; }
  166. //狂暴状态
  167. public bool IsRageStatus { get; set; }
  168. //恐惧状态
  169. public bool IsFear { get; set; }
  170. //冰冻状态
  171. public bool IsFrozen { get; set; }
  172. //睡眠状态
  173. private bool mIsSleep = false;
  174. public bool IsSleep {
  175. get { return mIsSleep; }
  176. set
  177. {
  178. if (mIsSleep != value)
  179. {
  180. mIsSleep = value;
  181. if (mState != null && !mIgnoreStateDataChange)
  182. mState.OnDataChanged();
  183. else
  184. IsStateDirty = true;
  185. if (mIsSleep)
  186. {
  187. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_Fighter_Sleep, mFighter));
  188. }
  189. }
  190. }
  191. }
  192. //石化状态
  193. public bool IsStiff { get; set; }
  194. //诅咒状态
  195. public bool IsCurse { get; set; }
  196. //中毒状态
  197. public bool IsPoison { get; set; }
  198. //禁止普攻
  199. public bool IsForbidNormalSkill { get; set; }
  200. //嘲讽状态
  201. public bool IsSneer { get; set; }
  202. //僵持状态
  203. public bool IsStark { get { return mStarkTime > 0; } }
  204. private bool mIsSing = false;
  205. //private float mSingTime = 0; // 吟唱时长
  206. private int mSingTotalFrame = 0; //吟唱总帧数
  207. private int mSingCurFrame = 0;
  208. //public float SingTime
  209. //{
  210. // get { return mSingTime; }
  211. //}
  212. public int SingTotalFrame
  213. {
  214. get { return mSingTotalFrame; }
  215. }
  216. public bool IsSing { get { return mIsSing; } }
  217. public float DyingTime {
  218. get { return mDyingTime; }
  219. set {
  220. if (Math.Abs (mDyingTime - value) > Mathf.Epsilon) {
  221. mDyingTime = value;
  222. if (mState != null && !mIgnoreStateDataChange)
  223. mState.OnDataChanged ();
  224. else
  225. IsStateDirty = true;
  226. }
  227. }
  228. }
  229. public float TimeFromLastBeHit { get { return Time.time - mLastBeHitTime; } }
  230. public FighterStateType GetIdleNext ()
  231. {
  232. if (IsStark)
  233. return FighterStateType.Stark;
  234. else if (!IsAlive)
  235. return IsGround ? FighterStateType.Die : FighterStateType.BeHitDown;
  236. else if (IsVertigo)
  237. return IsGround ? FighterStateType.Vertigo : FighterStateType.BeHitDown;
  238. else if (!IsGround)
  239. return FighterStateType.Down;
  240. else
  241. return FighterStateType.Idle;
  242. }
  243. public void ValidateDirtyState ()
  244. {
  245. if (State != null && IsStateDirty) {
  246. State.OnDataChanged ();
  247. IsStateDirty = false;
  248. }
  249. }
  250. public void Update (float deltaTime, bool fighting)
  251. {
  252. if (IsDisposed)
  253. return;
  254. mStateFrame++;
  255. if(fighting)
  256. UpdateSing(deltaTime);
  257. UpdateStateAnim(deltaTime);
  258. ValidateDirtyState();
  259. if (mStarkTime > Fix64.Zero)
  260. {
  261. mStarkTime -= (Fix64)0.03f;
  262. State.OnDataChanged();
  263. }
  264. if (mStateFrame > 0 && mState != null)
  265. mState.Update(deltaTime);
  266. if (mSkillStateData != null && fighting)
  267. mSkillStateData.Update(deltaTime);
  268. if (mBuffMgr != null && fighting)
  269. mBuffMgr.Update(deltaTime);
  270. if (mFuncMgr != null && fighting)
  271. mFuncMgr.Update(deltaTime);
  272. if (mMarkMgr != null && fighting)
  273. mMarkMgr.Update(deltaTime);
  274. }
  275. public void EndSkill()
  276. {
  277. if (mIsSing)
  278. {
  279. EndSing();
  280. }
  281. if (mSkillStateData != null)
  282. mSkillStateData.EndSkill();
  283. }
  284. public void UpdateStateAnim (float deltaTime)
  285. {
  286. if (mState != null)
  287. mState.CheckAnimState ();
  288. mAnimTime += deltaTime;
  289. }
  290. public void PlayAnim(string animName)
  291. {
  292. if (mState != null)
  293. {
  294. mState.ForcePlayAnim(animName);
  295. }
  296. }
  297. public void SetAnimSpeed(float animSpeed)
  298. {
  299. //if(mAnimSpeed != animSpeed)
  300. {
  301. mAnimSpeed = animSpeed;
  302. if (mState != null)
  303. {
  304. mState.SetAnimatorSpeed(mAnimSpeed);
  305. }
  306. }
  307. }
  308. public void ChangeState (FighterStateType state, object param = null)
  309. {
  310. if (StateId == state && (mState == null || !mState.Reentrant))
  311. return;
  312. FighterStateType oldStateType = StateId;
  313. mIgnoreStateDataChange = true;
  314. if (mState != null)
  315. mState.OnLeave ();
  316. //if (mFighter.IsHero)
  317. // DebugHelper.LogError("----fighter:" + mFighter.Name + " state:" + state);
  318. mState = FighterState.Create (mFighter, state);
  319. if (mState != null) {
  320. mState.OnEnter (oldStateType, param);
  321. mState.PlayAnimState ();
  322. mStateFrame = 0;
  323. mAnimTime = 0;
  324. mState.Update (0);
  325. }
  326. mIgnoreStateDataChange = false;
  327. }
  328. public bool ProcessTrigger (FighterStateTriggerType triggerType, object param = null, int checkVal = 0)
  329. {
  330. if (mState == null)
  331. return false;
  332. FighterStateType nextState = mState.GetTriggerNextState (triggerType, checkVal);
  333. if (nextState == FighterStateType.None)
  334. return false;
  335. if (triggerType == FighterStateTriggerType.BeHit)
  336. mLastBeHitTime = Time.time;
  337. ChangeState (nextState, param);
  338. return true;
  339. }
  340. //开始吟唱
  341. public void BeginSing(string animName)
  342. {
  343. if (CurrentSkill == null)
  344. {
  345. return;
  346. }
  347. //mSingTime = CurrentSkill.SingTotalTime;
  348. mSingTotalFrame = (int)(CurrentSkill.SingTotalTime * Constants.frame_to_time);
  349. mSingCurFrame = mSingTotalFrame;
  350. mIsSing = true;
  351. PlayAnim(animName);
  352. }
  353. public void EndSing()
  354. {
  355. mFighter.EndSing();
  356. mIsSing = false;
  357. //mSingTime = 0;
  358. mSingTotalFrame = 0;
  359. mSingCurFrame = 0;
  360. }
  361. void UpdateSing(float deltaTime)
  362. {
  363. //if (mIsSing)
  364. //{
  365. // mSingTime -= deltaTime;
  366. // mFighter.RefreshSingProgress(CurrentSkill.SingTotalTime,mSingTime);
  367. // if (mSingTime <= 0)
  368. // {
  369. // EndSing();
  370. // }
  371. //}
  372. if (mIsSing)
  373. {
  374. mSingCurFrame--;
  375. mFighter.RefreshSingProgress(mSingTotalFrame, mSingCurFrame);
  376. if (mSingCurFrame <= 0)
  377. {
  378. EndSing();
  379. }
  380. }
  381. }
  382. public void Dispose ()
  383. {
  384. if (IsDisposed)
  385. return;
  386. IsDisposed = true;
  387. mBuffMgr.Dispose ();
  388. mBuffMgr = null;
  389. mFuncMgr.Dispose();
  390. mFuncMgr = null;
  391. mMarkMgr.Dispose();
  392. mMarkMgr = null;
  393. mSkillStateData.Dispose ();
  394. mSkillStateData = null;
  395. mFighter = null;
  396. }
  397. public void Clear()
  398. {
  399. if(mBuffMgr!=null)
  400. mBuffMgr.Clear();
  401. if(mFuncMgr!=null)
  402. mFuncMgr.Clear();
  403. if (mMarkMgr != null)
  404. mMarkMgr.Clear();
  405. if (mSkillStateData != null)
  406. mSkillStateData.Clear();
  407. mFighter.ClearSkillBuffPoints();
  408. mFighter.ClearTriggerBuff();
  409. mStarkTime = Fix64.Zero;
  410. }
  411. void OnDie ()
  412. {
  413. if (mIsSing)
  414. {
  415. EndSing();
  416. }
  417. mBuffMgr.Clear();
  418. mFuncMgr.Clear();
  419. mMarkMgr.Clear();
  420. mFighter.OnDie ();
  421. }
  422. public void SetStarkTime(Fix64 starkTime)
  423. {
  424. mStarkTime = starkTime;
  425. if(mStarkTime <= Fix64.Zero)
  426. State.OnDataChanged();
  427. }
  428. }