PowerManager.cs 5.9 KB

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