LogicFighter.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace YLBattle
  5. {
  6. /// <summary>
  7. /// 角色(逻辑层)
  8. /// </summary>
  9. public partial class LogicFighter
  10. {
  11. #region 基础属性
  12. /// <summary>
  13. /// 对象唯一标识符
  14. /// </summary>
  15. private string mID = string.Empty;
  16. /// <summary>
  17. /// 模板ID
  18. /// </summary>
  19. private string mTID = string.Empty;
  20. /// <summary>
  21. /// 数据适配器
  22. /// </summary>
  23. private IFighterAdapter mAdapter = null;
  24. /// <summary>
  25. /// 战斗环境
  26. /// </summary>
  27. private BattleParam mEnv = null;
  28. /// <summary>
  29. /// 隶属分组
  30. /// </summary>
  31. private EBattleTeam mTeam = EBattleTeam.NONE;
  32. /// <summary>
  33. /// 状态机
  34. /// </summary>
  35. private LogicFighterFSM mFighterFSM = null;
  36. /// <summary>
  37. ///
  38. /// </summary>
  39. private int mSeat = 0;
  40. /// <summary>
  41. ///
  42. /// </summary>
  43. private int mRoleType = 0;
  44. /// <summary>
  45. /// 对象属性
  46. /// </summary>
  47. private LogicFighterProperty[] mProperty = new LogicFighterProperty[(int)EBattleProperty.MAX];
  48. /// <summary>
  49. /// 当前锁定目标
  50. /// </summary>
  51. private string mLockedTarget = string.Empty;
  52. /// <summary>
  53. /// 释放技能时的当前回合数
  54. /// </summary>
  55. private int mCurtRound = 0;
  56. /// <summary>
  57. /// 上次出手时间(受攻击暂停影响)
  58. /// </summary>
  59. private long mLastAttackTime = 0;
  60. #endregion
  61. #region 外部调用
  62. /// <summary>
  63. /// 获取对象唯一标识符
  64. /// </summary>
  65. /// <returns>对象id</returns>
  66. public string ID()
  67. {
  68. return this.mID;
  69. }
  70. /// <summary>
  71. /// 获取模板数据ID
  72. /// </summary>
  73. /// <returns>对象模板id</returns>
  74. public string TID()
  75. {
  76. return this.mTID;
  77. }
  78. /// <summary>
  79. /// 获取状态机
  80. /// </summary>
  81. /// <returns>状态机管理器对象</returns>
  82. public LogicFighterFSM GetState()
  83. {
  84. return this.mFighterFSM;
  85. }
  86. /// <summary>
  87. /// 对象隶属分组
  88. /// </summary>
  89. /// <returns>详见EBattleTeam定义</returns>
  90. public EBattleTeam Team()
  91. {
  92. return this.mTeam;
  93. }
  94. /// <summary>
  95. /// 占位
  96. /// </summary>
  97. /// <returns></returns>
  98. public int Seat()
  99. {
  100. return mSeat;
  101. }
  102. /// <summary>
  103. /// 角色类型 0=小怪 1=英雄 (战斗中英雄使用公共技能槽)
  104. /// </summary>
  105. /// <returns></returns>
  106. public int RoleType()
  107. {
  108. return mRoleType;
  109. }
  110. /// <summary>
  111. /// 获取数据适配器
  112. /// </summary>
  113. /// <returns>适配器</returns>
  114. public IFighterAdapter Adapter()
  115. {
  116. return this.mAdapter;
  117. }
  118. /// <summary>
  119. /// 当前锁定的目标
  120. /// </summary>
  121. public string LockedTarget
  122. {
  123. get { return this.mLockedTarget; }
  124. set { this.mLockedTarget = value; }
  125. }
  126. /// <summary>
  127. /// 当前出手时间
  128. /// </summary>
  129. public long LastAttackTime
  130. {
  131. get { return this.mLastAttackTime; }
  132. set { this.mLastAttackTime = value; }
  133. }
  134. #endregion
  135. #region 外部排序调用
  136. /// <summary>
  137. /// 等级
  138. /// </summary>
  139. /// <returns></returns>
  140. public int Level
  141. {
  142. get { return this.mAdapter.Level(); }
  143. }
  144. /// <summary>
  145. /// 攻击速度
  146. /// </summary>
  147. public int AttackSpeed
  148. {
  149. get { return this.mAdapter.Agile(); }
  150. }
  151. /// <summary>
  152. /// 剩余攻击时间
  153. /// </summary>
  154. public long LeftAttackTime
  155. {
  156. get { return this.mAdapter.Agile(); }
  157. }
  158. /// <summary>
  159. /// 等阶
  160. /// </summary>
  161. public int StrengthLevel
  162. {
  163. get { return this.mAdapter.StrengthLevel(); }
  164. }
  165. #endregion
  166. /// <summary>
  167. /// 初始化(赋值)
  168. /// </summary>
  169. /// <param name="_adp"></param>
  170. /// <param name="_intTeam"></param>
  171. /// <param name="strId"></param>
  172. public void SetData(string strId, BattleParam _param, IFighterAdapter _adp, EBattleTeam _eTeam, int _seat)
  173. {
  174. this.mID = strId;
  175. this.mTID = _adp.TID();
  176. this.mAdapter = _adp;
  177. this.mTeam = _eTeam;
  178. this.mEnv = _param;
  179. this.mSeat = _seat;
  180. this.mRoleType = _adp.RoleType();
  181. /// 从属性适配器加载角色属性
  182. float val = 0;
  183. LogicFighterProperty property = null;
  184. ///初始化属性
  185. for (int i = (int)EBattleProperty.NONE; i < (int)EBattleProperty.MAX; ++i)
  186. {
  187. val = (float)_adp.GetProperty((EBattleProperty)i);
  188. property = new LogicFighterProperty(val);
  189. this.mProperty[i] = property;
  190. }
  191. /// 加载技能
  192. this.mNormalSkill = _adp.NormalSkill();
  193. this.mManuSkill1 = _adp.ManuSkill1();
  194. this.mManuSkill2 = _adp.ManuSkill2();
  195. this.mPassiveSkill = _adp.PassiveSkill();
  196. this.mLeaderSkill = _adp.LeaderSkill();
  197. this.mLastAttackTime = 0;
  198. /// 初始化状态机
  199. this.mFighterFSM = new LogicFighterFSM();
  200. this.mFighterFSM.Initialize(_param, this);
  201. }
  202. /// <summary>
  203. ///
  204. /// </summary>
  205. /// <param name="now"></param>
  206. public void OnUpdateSkillPower(long span)
  207. {
  208. if (this.mManuSkill1 == null)
  209. {
  210. return;
  211. }
  212. if (IsPowerFull())
  213. {
  214. return;
  215. }
  216. this.ModifyProperty(EBattleProperty.NPOWER, span);
  217. }
  218. /// <summary>
  219. /// red=Boss/blue=Header
  220. /// </summary>
  221. /// <returns></returns>
  222. public bool IsLeader()
  223. {
  224. return mAdapter.IsLeader();
  225. }
  226. /// <summary>
  227. /// 是否死亡
  228. /// </summary>
  229. /// <returns>true已死亡, false未死亡</returns>
  230. public bool IsDead()
  231. {
  232. float hp = this.GetProperty(EBattleProperty.HP);
  233. if (hp < 0.1)
  234. {
  235. return true;
  236. }
  237. return false;
  238. }
  239. /// <summary>
  240. /// 检测能量是否已满
  241. /// </summary>
  242. /// <returns>true已满,false未满</returns>
  243. public bool IsPowerFull()
  244. {
  245. float power = this.GetProperty(EBattleProperty.NPOWER);
  246. float maxPower = this.GetProperty(EBattleProperty.NMAXPOWER);
  247. if (maxPower - power < 0.1)
  248. {
  249. return true;
  250. }
  251. return false;
  252. }
  253. /// <summary>
  254. /// 获取指定技能实际等级
  255. /// </summary>
  256. /// <param name="id">技能id</param>
  257. /// <returns>等级,失败0</returns>
  258. public int GetSkillLevel(string tid)
  259. {
  260. return this.Adapter().SkillLevel(tid);
  261. }
  262. /// <summary>
  263. /// 检测是否为友方
  264. /// </summary>
  265. /// <param name="who">目标对象</param>
  266. /// <returns>友方true,否则为敌方</returns>
  267. public EBattleRelation Relation(LogicFighter who)
  268. {
  269. return ((int)(this.mTeam) & (int)(who.Team())) == 0 ? EBattleRelation.EBATTLE_RELATION_ENEMY : EBattleRelation.EBATTLE_RELATION_FRIEND;
  270. }
  271. #region 属性操作
  272. /// <summary>
  273. /// 获取战斗人员指定属性
  274. /// </summary>
  275. /// <param name="indx">属性索引</param>
  276. /// <returns>属性值</returns>
  277. public float GetProperty(EBattleProperty indx)
  278. {
  279. return this.mProperty[(int)indx].GetValue();
  280. }
  281. /// <summary>
  282. /// 获取属性基础值
  283. /// </summary>
  284. /// <param name="indx">属性索引</param>
  285. /// <returns>基础值</returns>
  286. public float GetPropertyBase(EBattleProperty indx)
  287. {
  288. return this.mProperty[(int)indx].GetBaseValue();
  289. }
  290. /// <summary>
  291. /// 获取属性修正值
  292. /// </summary>
  293. /// <param name="indx">属性索引</param>
  294. /// <returns>修正值</returns>
  295. public float GetPropertyCorrected(EBattleProperty indx)
  296. {
  297. return this.mProperty[(int)indx].GetCorrectedValue();
  298. }
  299. /// <summary>
  300. /// 设置指定属性为指定值
  301. /// </summary>
  302. /// <param name="indx">属性索引</param>
  303. /// <param name="val">设置的值</param>
  304. /// <returns>设置后的值</returns>
  305. public float SetProperty(EBattleProperty indx, float val)
  306. {
  307. this.mProperty[(int)indx].SetCorrectedValue(val);
  308. return this.mProperty[(int)indx].GetValue();
  309. }
  310. /// <summary>
  311. /// 修改指定属性
  312. /// </summary>
  313. /// <param name="indx">属性索引</param>
  314. /// <param name="val">修改值</param>
  315. /// <returns>返回修改以后的值</returns>
  316. public float ModifyProperty(EBattleProperty indx, float val)
  317. {
  318. float org = this.mProperty[(int)indx].GetValue();
  319. this.mProperty[(int)indx].ModifyCorrectedValue(val);
  320. switch (indx)
  321. {
  322. case EBattleProperty.HP:
  323. float hpMax = this.mProperty[(int)EBattleProperty.HPMAX].GetValue();
  324. if (this.mProperty[(int)EBattleProperty.HP].GetValue() > hpMax)
  325. {
  326. this.mProperty[(int)indx].SetCorrectedValue(0);
  327. }
  328. break;
  329. case EBattleProperty.NPOWER:
  330. float powerMax = this.mProperty[(int)EBattleProperty.NMAXPOWER].GetValue();
  331. if (this.mProperty[(int)EBattleProperty.NPOWER].GetValue() > powerMax)
  332. {
  333. this.mProperty[(int)indx].SetCorrectedValue(powerMax);
  334. }
  335. break;
  336. }
  337. //float crt = this.mProperty[(int)indx].GetValue();
  338. //if ((int)crt != (int)org)
  339. //{
  340. // Debug.Log("【" + mID + "】 Pro:" + this.mTempProName[indx] + " Val:" + (val <= 0 ? "减少" : "增加") + val
  341. // + " Org:" + org + " Crt:" + crt
  342. // );
  343. //}
  344. return this.mProperty[(int)indx].GetValue();
  345. }
  346. /// <summary>
  347. /// 临时属性输出参照表
  348. /// </summary>
  349. Dictionary<EBattleProperty, string> mTempProName = new Dictionary<EBattleProperty, string>()
  350. {
  351. {EBattleProperty.HP,"血量"} ,
  352. {EBattleProperty.HPMAX,"最大血量"} ,
  353. {EBattleProperty.ATTACK,"攻击力"} ,
  354. {EBattleProperty.ATTACKSPEED,"敏捷"} ,
  355. {EBattleProperty.CRITICALPROB,"暴击"} ,
  356. {EBattleProperty.DEFENSE,"防御"} ,
  357. {EBattleProperty.NPOWER,"当前能量"} ,
  358. {EBattleProperty.NMAXPOWER,"最大能量"} ,
  359. {EBattleProperty.POSX,"X"} ,
  360. {EBattleProperty.POSY,"Y"} ,
  361. };
  362. #endregion
  363. #region(技能)
  364. /// <summary>
  365. /// 普通攻击
  366. /// </summary>
  367. private string mNormalSkill = string.Empty;
  368. /// <summary>
  369. /// 主动技能1
  370. /// </summary>
  371. private string mManuSkill1 = string.Empty;
  372. /// <summary>
  373. /// 主动技能2
  374. /// </summary>
  375. private string mManuSkill2 = string.Empty;
  376. /// <summary>
  377. /// 被动技能
  378. /// </summary>
  379. private string mPassiveSkill = string.Empty;
  380. /// <summary>
  381. /// 队长技能
  382. /// </summary>
  383. private string mLeaderSkill = string.Empty;
  384. /// <summary>
  385. /// 主动技能1的冷冻回合数
  386. /// </summary>
  387. private int mManuSkill1Round = 0;
  388. /// <summary>
  389. /// 必杀所需power
  390. /// </summary>
  391. private int mCriticalNeedPower = 0;
  392. /// <summary>
  393. /// 普通攻击
  394. /// </summary>
  395. /// <returns>技能模板id</returns>
  396. public string NormalSkill()
  397. {
  398. return this.mNormalSkill;
  399. }
  400. /// <summary>
  401. /// 主动技能1
  402. /// </summary>
  403. /// <returns>技能模板id</returns>
  404. public string ManuSkill1()
  405. {
  406. return this.mManuSkill1;
  407. }
  408. /// <summary>
  409. /// 主动技能2
  410. /// </summary>
  411. /// <returns>技能模板id</returns>
  412. public string ManuSkill2()
  413. {
  414. return this.mManuSkill2;
  415. }
  416. /// <summary>
  417. /// 被动技能
  418. /// </summary>
  419. /// <returns>技能模板id</returns>
  420. public string PassiveSkill()
  421. {
  422. return this.mPassiveSkill;
  423. }
  424. /// <summary>
  425. /// 被动技能
  426. /// </summary>
  427. /// <returns>技能模板id</returns>
  428. public string LeaderSkill()
  429. {
  430. return this.mLeaderSkill;
  431. }
  432. /// <summary>
  433. /// 暴击需要的TeamPowerRate
  434. /// </summary>
  435. /// <returns>技能模板id</returns>
  436. public int CriticalNeedPower()
  437. {
  438. return this.mCriticalNeedPower;
  439. }
  440. #endregion
  441. }
  442. }