PowerManager.cs 5.7 KB

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