PetActorData.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class PetActorData : ActorData
  5. {
  6. private int mStep = 0;
  7. public int Step
  8. {
  9. get { return mStep; }
  10. }
  11. protected PetBaseData mBaseData;
  12. public PetBaseData BaseData { get { return mBaseData; } }
  13. protected PetAdvanceData mPetAdvanceData;
  14. protected int[] mAdvanceMaxLevels = null;
  15. #region OVERRIDE_FIELDS
  16. protected string mName;
  17. public override string Name
  18. {
  19. get { return mName; }
  20. }
  21. public override string HeadIcon
  22. {
  23. get { return mBaseData.headIcon; }
  24. set { }
  25. }
  26. public override int PositionValue
  27. {
  28. get { return mBaseData.position; }
  29. }
  30. public override string AnimCtrlName
  31. {
  32. get { return mBaseData.battleCtrl; }
  33. }
  34. public override string ShowAnimCtrlName
  35. {
  36. get { return mBaseData.showCtrl; }
  37. }
  38. public override int NatureId
  39. {
  40. get { return mBaseData.natureId; }
  41. }
  42. public override int AvatarID
  43. {
  44. get
  45. {
  46. return mBaseData.avatarId;
  47. }
  48. }
  49. public override ProfessionType Profession
  50. {
  51. get
  52. {
  53. return (ProfessionType)mBaseData.profession;
  54. }
  55. }
  56. public override bool IsPet
  57. {
  58. get { return true; }
  59. }
  60. public override SFloat LocalLife
  61. {
  62. get
  63. {
  64. SFloat addHpRate = 0;
  65. int addHp = 0;
  66. CalcAdvanceData(Attr_Life, mBaseData.hpRate, out addHpRate, out addHp);
  67. SFloat hp = mBaseData.life * (1 + addHpRate) + addHp;
  68. return (hp + GetAdditionalAttr(Attr_Life)) * (1 + GetAdditionalAttrPercent(Attr_Life + 30));
  69. }
  70. }
  71. public override SFloat Life
  72. {
  73. get
  74. {
  75. SFloat ServerData = GetSeverSecondAttr(Attr_Life);
  76. if (0 <= ServerData)
  77. return ServerData;
  78. return LocalLife;
  79. }
  80. }
  81. public override SFloat LocalSp
  82. {
  83. get
  84. {
  85. SFloat addSpRate = 0;
  86. int addSp = 0;
  87. CalcAdvanceData(Attr_Sp, mBaseData.spRate, out addSpRate, out addSp);
  88. SFloat sp = mBaseData.sp * (1 + addSpRate) + addSp;
  89. return (sp + GetAdditionalAttr(Attr_Sp)) * (1 + GetAdditionalAttrPercent(Attr_Sp + 30));
  90. }
  91. }
  92. public override SFloat Sp
  93. {
  94. get
  95. {
  96. SFloat ServerData = GetSeverSecondAttr(Attr_Sp);
  97. if (0 <= ServerData)
  98. return ServerData;
  99. return LocalSp;
  100. }
  101. }
  102. public override SFloat LocalAttack
  103. {
  104. get
  105. {
  106. SFloat addAtkRate = 0;
  107. int addAtk = 0;
  108. CalcAdvanceData(Attr_Attack, mBaseData.atkRate, out addAtkRate, out addAtk);
  109. SFloat attack = mBaseData.attack * (1 + addAtkRate) + addAtk;
  110. return (attack + GetAdditionalAttr(Attr_Attack)) * (1 + GetAdditionalAttrPercent(Attr_Attack + 30));
  111. }
  112. }
  113. public override SFloat Attack
  114. {
  115. get
  116. {
  117. SFloat ServerData = GetSeverSecondAttr(Attr_Attack);
  118. if (0 <= ServerData)
  119. return ServerData;
  120. return LocalAttack;
  121. }
  122. }
  123. public override SFloat LocalMagicAttack
  124. {
  125. get
  126. {
  127. SFloat addMagicAtkRate = 0;
  128. int addMagicAtk = 0;
  129. CalcAdvanceData(Attr_MagicAttack, mBaseData.matkRate, out addMagicAtkRate, out addMagicAtk);
  130. SFloat magicAttack = mBaseData.magicAttack * (1 + addMagicAtkRate) + addMagicAtk;
  131. return (magicAttack + GetAdditionalAttr(Attr_MagicAttack)) * (1 + GetAdditionalAttrPercent(Attr_MagicAttack + 30));
  132. }
  133. }
  134. public override SFloat MagicAttack
  135. {
  136. get
  137. {
  138. SFloat ServerData = GetSeverSecondAttr(Attr_MagicAttack);
  139. if (0 <= ServerData)
  140. return ServerData;
  141. return LocalMagicAttack;
  142. }
  143. }
  144. public override SFloat LocalDefense
  145. {
  146. get
  147. {
  148. SFloat addDefRate = 0;
  149. int addDef = 0;
  150. CalcAdvanceData(Attr_Defense, mBaseData.defRate, out addDefRate, out addDef);
  151. SFloat def = mBaseData.defense * (1 + addDefRate) + addDef;
  152. return (def + GetAdditionalAttr(Attr_Defense)) * (1 + GetAdditionalAttrPercent(Attr_Defense + 30));
  153. }
  154. }
  155. public override SFloat Defense
  156. {
  157. get
  158. {
  159. SFloat ServerData = GetSeverSecondAttr(Attr_Defense);
  160. if (0 <= ServerData)
  161. return ServerData;
  162. return LocalDefense;
  163. }
  164. }
  165. public override SFloat LocalMagicDefense
  166. {
  167. get
  168. {
  169. SFloat addMagicDefRate = 0;
  170. int addMagicDef = 0;
  171. CalcAdvanceData(Attr_MagicDefense, mBaseData.mdefRate, out addMagicDefRate, out addMagicDef);
  172. SFloat magicDef = mBaseData.magicDefense * (1 + addMagicDefRate) + addMagicDef;
  173. return (magicDef + GetAdditionalAttr(Attr_MagicDefense)) * (1 + GetAdditionalAttrPercent(Attr_MagicDefense + 30));
  174. }
  175. }
  176. public override SFloat MagicDefense
  177. {
  178. get
  179. {
  180. SFloat ServerData = GetSeverSecondAttr(Attr_MagicDefense);
  181. if (0 <= ServerData)
  182. return ServerData;
  183. return LocalMagicDefense;
  184. }
  185. }
  186. public override SFloat LocalCrit
  187. {
  188. get
  189. {
  190. SFloat addCritRate = 0;
  191. int addCrit = 0;
  192. CalcAdvanceData(Attr_Crit, mBaseData.critRate, out addCritRate, out addCrit);
  193. SFloat crit = mBaseData.crit * (1 + addCritRate) + addCrit;
  194. return (crit + GetAdditionalAttr(Attr_Crit)) * (1 + GetAdditionalAttrPercent(Attr_Crit + 30));
  195. }
  196. }
  197. public override SFloat Crit
  198. {
  199. get
  200. {
  201. SFloat ServerData = GetSeverSecondAttr(Attr_Crit);
  202. if (0 <= ServerData)
  203. return ServerData;
  204. return LocalCrit;
  205. }
  206. }
  207. public override SFloat LocalDodge
  208. {
  209. get
  210. {
  211. SFloat addDodgeRate = 0;
  212. int addDodge = 0;
  213. CalcAdvanceData(Attr_Dodge, mBaseData.dodgeRate, out addDodgeRate, out addDodge);
  214. SFloat dodge = mBaseData.dodge * (1 + addDodgeRate) + addDodge;
  215. return (dodge + GetAdditionalAttr(Attr_Dodge)) * (1 + GetAdditionalAttrPercent(Attr_Dodge + 30));
  216. }
  217. }
  218. public override SFloat Dodge
  219. {
  220. get
  221. {
  222. SFloat ServerData = GetSeverSecondAttr(Attr_Dodge);
  223. if (0 <= ServerData)
  224. return ServerData;
  225. return LocalDodge;
  226. }
  227. }
  228. public override SFloat LocalAttackSpeed
  229. {
  230. get { return mBaseData.attackSpeed; }
  231. }
  232. public override SFloat AttackSpeed
  233. {
  234. get
  235. {
  236. SFloat ServerData = GetSeverSecondAttr(Attr_AttackSpeed);
  237. if (0 <= ServerData)
  238. return ServerData;
  239. return LocalAttackSpeed;
  240. }
  241. }
  242. public override SFloat CritDamagePercent
  243. {
  244. get { return 0; }
  245. }
  246. public override SFloat LocalHit
  247. {
  248. get
  249. {
  250. SFloat addHitRate = 0;
  251. int addHit = 0;
  252. CalcAdvanceData(Attr_Hit, mBaseData.hitRate, out addHitRate, out addHit);
  253. SFloat hit = mBaseData.hit * (1 + addHitRate) + addHit;
  254. return (hit + GetAdditionalAttr(Attr_Hit)) * (1 + GetAdditionalAttrPercent(Attr_Hit + 30));
  255. }
  256. }
  257. public override SFloat Hit
  258. {
  259. get
  260. {
  261. SFloat ServerData = GetSeverSecondAttr(Attr_Hit);
  262. if (0 <= ServerData)
  263. return ServerData;
  264. return LocalHit;
  265. }
  266. }
  267. public override SFloat LocalTen
  268. {
  269. get
  270. {
  271. SFloat addTenRate = 0;
  272. int addTen = 0;
  273. CalcAdvanceData(Attr_Ten, mBaseData.tenRate, out addTenRate, out addTen);
  274. SFloat ten = mBaseData.ten * (1 + addTenRate) + addTen;
  275. return (ten + GetAdditionalAttr(Attr_Ten)) * (1 + GetAdditionalAttrPercent(Attr_Ten + 30));
  276. }
  277. }
  278. public override SFloat Ten
  279. {
  280. get
  281. {
  282. SFloat ServerData = GetSeverSecondAttr(Attr_Ten);
  283. if (0 <= ServerData)
  284. return ServerData;
  285. return LocalTen;
  286. }
  287. }
  288. #endregion
  289. public PetActorData(int id):base(id)
  290. {
  291. mActorType = ActorType.Pet;
  292. }
  293. public override void Initialize(int id, int level, SkillParam[] usedSkills)
  294. {
  295. base.Initialize(id, level, usedSkills);
  296. Gender = (int)Role_Gender.Male;
  297. mBaseData = new PetBaseData(id);
  298. mPetAdvanceData = new PetAdvanceData(id);
  299. mAvatarData = new AvatarData(AvatarID);
  300. mName = I18N.T(mBaseData.petName);
  301. mAdvanceMaxLevels = StringUtil.split2Int(GlobalConfig.Instance.GetConfigStrValue(208),';');
  302. if (mSkillMgr == null)
  303. {
  304. mSkillMgr = new SkillManager(this);
  305. }
  306. mSkillMgr.InitNormalSkills(mBaseData.normalSkillIds);
  307. if (usedSkills != null)
  308. {
  309. mSkillMgr.InitRandomSkills(usedSkills);
  310. }
  311. else
  312. {
  313. mSkillMgr.InitRandomSkills(mBaseData.testSkills.ToArray());
  314. }
  315. mSkillMgr.SetReserveSkill(mBaseData.emptySkillId);
  316. ResetFirstSkill();
  317. valid = mBaseData.valid && mAvatarData.valid;
  318. }
  319. public override void RefreshSkills(SkillParam[] usedSkills)
  320. {
  321. SetUsedSkill(usedSkills);
  322. if (usedSkills != null)
  323. {
  324. mSkillMgr.InitRandomSkills(usedSkills);
  325. }
  326. }
  327. public void SetStep(int step)
  328. {
  329. if (mStep == step) return;
  330. mStep = step;
  331. /*ResetAdditionalAttrPercent();
  332. for(int attrId = ActorData.Attr_STR_Percent; attrId <= ActorData.Attr_VariableSingTime_Percent; attrId++)
  333. {
  334. SFloat val = CalcAdditionalAttrPercent(attrId);
  335. SetAdditionalAttrPercent(attrId, val);
  336. }*/
  337. }
  338. private SFloat CalcAdditionalAttrPercent(int attrId)
  339. {
  340. SFloat addTotalAttr = 0;
  341. for (int idx = mStep; idx >= 1; idx--)
  342. {
  343. List<ValType> valList;
  344. List<ValType> valRateList;
  345. mPetAdvanceData.advanceData.TryGetValue(idx, out valList);
  346. mPetAdvanceData.advanceRateData.TryGetValue(idx, out valRateList);
  347. int addVal = TryGetVal(attrId, valList);
  348. addTotalAttr += addVal * 0.0001f;
  349. }
  350. return addTotalAttr;
  351. }
  352. protected override JSONObject BaseToJson()
  353. {
  354. JSONObject json = base.BaseToJson();
  355. json.AddField("advanceLevel", mStep);
  356. return json;
  357. }
  358. public override void Dispose()
  359. {
  360. if (mBaseData != null)
  361. {
  362. mBaseData.Dispose();
  363. mBaseData = null;
  364. }
  365. base.Dispose();
  366. }
  367. private void CalcAdvanceData(int attrId,SFloat baseRate,out SFloat addTotalRate, out int addTotalAttr)
  368. {
  369. addTotalRate = 0;
  370. addTotalAttr = 0;
  371. for(int idx = mStep;idx>=1;idx--)
  372. {
  373. List<ValType> valList;
  374. List<ValType> valRateList;
  375. mPetAdvanceData.advanceData.TryGetValue(idx, out valList);
  376. mPetAdvanceData.advanceRateData.TryGetValue(idx, out valRateList);
  377. int addVal = TryGetVal(attrId, valList);
  378. int addRate = TryGetVal(attrId, valRateList);
  379. if(idx == mStep)
  380. {
  381. addTotalRate += ((mLevel - mAdvanceMaxLevels[idx-1]) * addRate)/10000.0f;
  382. }
  383. else
  384. {
  385. addTotalRate += ((mAdvanceMaxLevels[idx] - mAdvanceMaxLevels[idx - 1]) * addRate) / 10000.0f;
  386. }
  387. // addTotalAttr +=addVal;
  388. }
  389. if (mStep > 0)
  390. {
  391. addTotalRate += (mAdvanceMaxLevels[0] - 1) * baseRate;
  392. }
  393. else
  394. {
  395. addTotalRate += (mLevel - 1) * baseRate;
  396. }
  397. }
  398. private int TryGetVal(int attrId, List<ValType> list)
  399. {
  400. if (list == null) return 0;
  401. for(int idx =0; idx < list.Count;idx++)
  402. {
  403. if(list[idx].id == attrId)
  404. {
  405. return list[idx].val;
  406. }
  407. }
  408. return 0;
  409. }
  410. }