PowerManager.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. using System;
  2. using UnityEngine;
  3. using Sfs2X.Entities.Data;
  4. public class PowerManager
  5. {
  6. private IPowerOwner owner;
  7. private Power[] powers;
  8. private Power[] crystalPowers;
  9. // private Power activePower;
  10. public PowerManager (IPowerOwner owner, int attackId, int[] powerIds, int[] crystalPowerIds)
  11. {
  12. this.owner = owner;
  13. UpdatePower(attackId, powerIds);
  14. int length = crystalPowerIds.Length;
  15. crystalPowers = new Power[length];
  16. for(int i=0; i<crystalPowerIds.Length; i++)
  17. {
  18. crystalPowers[i] = PowerDataManager.GetInstance().CreatePower(i, crystalPowerIds[i], owner);
  19. }
  20. }
  21. public void UpdatePower(int attackId, int[] powerIds)
  22. {
  23. int length = powerIds.Length+1;
  24. powers = new Power[length];
  25. powers[0] = PowerDataManager.GetInstance().CreatePower(0, attackId, owner, true);
  26. for(int i=0; i<powerIds.Length; i++)
  27. {
  28. int index = i+1;
  29. powers[index] = PowerDataManager.GetInstance().CreatePower(index, powerIds[i], owner);
  30. }
  31. }
  32. public Power GetAttack()
  33. {
  34. return powers[0];
  35. }
  36. public bool IsAttack(Power power)
  37. {
  38. return powers[0] == power;
  39. }
  40. // public void SetActivePowerByIndex(int index)
  41. // {
  42. // if(index == 0)
  43. // activePower = null;
  44. // else
  45. // activePower = GetPowerByIndex (index);
  46. // }
  47. //
  48. // public void SetActivePower(Power power)
  49. // {
  50. // if(activePower != null)
  51. // {
  52. // activePower.isActivating = false;
  53. // }
  54. // if(activePower == power)
  55. // {
  56. // activePower = null;
  57. // }
  58. // else
  59. // {
  60. // activePower = power;
  61. // if(activePower != null)
  62. // {
  63. // activePower.isActivating = true;
  64. // }
  65. // }
  66. // }
  67. //
  68. // public Power GetActivePower()
  69. // {
  70. // return activePower;
  71. // }
  72. public Power GetPowerById(int powerId)
  73. {
  74. for(int i=0; i<powers.Length; i++)
  75. {
  76. Power power = powers[i];
  77. if(power.GetId() == powerId)
  78. {
  79. return power;
  80. }
  81. }
  82. for(int i=0; i<crystalPowers.Length; i++)
  83. {
  84. Power power = crystalPowers[i];
  85. if(power.GetId() == powerId)
  86. {
  87. return power;
  88. }
  89. }
  90. return null;
  91. }
  92. public Power GetPowerByIndex(int index)
  93. {
  94. if(index >= 0 && index < powers.Length)
  95. {
  96. return powers[index];
  97. }
  98. return null;
  99. }
  100. public Power[] GetPowers()
  101. {
  102. return powers;
  103. }
  104. public Power GetCrystalPowerByIndex(int index)
  105. {
  106. if(index >= 0 && index < crystalPowers.Length)
  107. {
  108. return crystalPowers[index];
  109. }
  110. return null;
  111. }
  112. public Power[] GetCrystalPowers()
  113. {
  114. return crystalPowers;
  115. }
  116. public bool AttempUserPower(int powerId, BattleController battleController)
  117. {
  118. if(!owner.enablePower || owner.holdAction)
  119. {
  120. return false;
  121. }
  122. Power power = GetPowerById(powerId);
  123. if(power == null)
  124. {
  125. return false;
  126. }
  127. if(owner.userId == battleController.GetMyPlayer().userId && power.crystalNeed > 0)
  128. {
  129. if(Session.GetInstance().myUserData.coin < power.crystalNeed)
  130. {
  131. battleController.coinNotEnough();
  132. return false;
  133. }
  134. }
  135. if(!power.IsCoolDown())
  136. {
  137. return false;
  138. }
  139. if(power.GetTargetRange() == Power.TargetRange.Self)
  140. {
  141. UsePower(power, owner.target, battleController);
  142. }
  143. else if(power.GetTargetRange() == Power.TargetRange.Nova)
  144. {
  145. TeamUtil.Team team = TeamUtil.Team.Yellow;
  146. if(TargetType.IsContainTarget(TargetType.ENEMY, power.targetType))
  147. team = TeamUtil.GetOpponentTeam(owner.team);
  148. else if(TargetType.IsContainTarget(TargetType.ALLY, power.targetType))
  149. team = owner.team;
  150. if(battleController.GetMap().GetBattleObjectByRange(owner.position, power.GetDistance(), team).Count == 0)
  151. {
  152. if(owner == battleController.GetCtrlCraft() && !IsAttack(power))
  153. {
  154. battleController.battleUI.ShowBottomTip(Language.GetStr("PowerTip", "noTargetInRange"));
  155. }
  156. return false;
  157. }
  158. UsePower(power, owner.target, battleController);
  159. }
  160. else if(power.GetPowerType() == Power.PowerType.Summon)
  161. {
  162. Player player = battleController.GetBattleSession().GetPlayer(owner.userId);
  163. if(player != null && player.SoldierCount() < power.GetTargetLimit())
  164. {
  165. UsePower(power, owner.target, battleController);
  166. }
  167. }
  168. else if(owner.target == null)
  169. {
  170. if(owner == battleController.GetCtrlCraft() && !IsAttack(power))
  171. {
  172. battleController.battleUI.ShowBottomTip(Language.GetStr("PowerTip", "needTarget"));
  173. }
  174. return false;
  175. }
  176. else if(power.IsInRange(owner.target))
  177. {
  178. UsePower(power, owner.target, battleController);
  179. }
  180. else
  181. {
  182. if(owner == battleController.GetCtrlCraft() && !IsAttack(power))
  183. {
  184. battleController.battleUI.ShowBottomTip(Language.GetStr("PowerTip", "needCloser"));
  185. }
  186. return false;
  187. }
  188. return true;
  189. }
  190. private void UsePower(Power power, ITarget target, BattleController battleController)
  191. {
  192. if (power.crystalNeed > 0) {
  193. if (battleController.GetMyPlayer ().userId == power.GetOwner ().userId)
  194. {
  195. Player player = battleController.GetBattleSession ().GetPlayer (power.GetOwner ().userId);
  196. power.RenewLastLaunchTime ();
  197. player.CrystalPowerLaunched (power.GetId (), power.GetLastLaunchTime ());
  198. }
  199. } else {
  200. power.RenewLastLaunchTime ();
  201. }
  202. battleController.GetMessageManager().Power(power, target);
  203. }
  204. public void ParsePower(int powerId, ISFSObject powerData, BattleController battleController)
  205. {
  206. Power power = GetPowerById(powerId);
  207. if(power != null)
  208. {
  209. if(owner is Craft)
  210. {
  211. (owner as Craft).OnUserPower();
  212. }
  213. power.ParseMessage(powerData, battleController);
  214. if(owner is Craft)
  215. {
  216. Craft craft = owner as Craft;
  217. craft.GetSwapManager().AbortSwap();
  218. if(power == GetAttack())
  219. {
  220. craft.SetState(Craft.State.Attack);
  221. }
  222. else
  223. {
  224. craft.SetState(Craft.State.Attack);
  225. }
  226. }
  227. }
  228. else
  229. {
  230. Debuger.LogError("parsePower::can not find power("+powerId+") owner("+owner.ToString()+")");
  231. }
  232. }
  233. }