using System; using UnityEngine; using Sfs2X.Entities.Data; public class PowerManager { private IPowerOwner owner; private Power[] powers; private Power[] crystalPowers; // private Power activePower; public PowerManager (IPowerOwner owner, int attackId, int[] powerIds, int[] crystalPowerIds) { this.owner = owner; UpdatePower(attackId, powerIds); int length = crystalPowerIds.Length; crystalPowers = new Power[length]; for(int i=0; i= 0 && index < powers.Length) { return powers[index]; } return null; } public Power[] GetPowers() { return powers; } public Power GetCrystalPowerByIndex(int index) { if(index >= 0 && index < crystalPowers.Length) { return crystalPowers[index]; } return null; } public Power[] GetCrystalPowers() { return crystalPowers; } public bool AttempUserPower(int powerId, BattleController battleController) { if(!owner.enablePower || owner.holdAction) { return false; } Power power = GetPowerById(powerId); if(power == null) { return false; } if(owner.userId == battleController.GetMyPlayer().userId && power.crystalNeed > 0) { if(Session.GetInstance().myUserData.coin < power.crystalNeed) { battleController.coinNotEnough(); return false; } } if(!power.IsCoolDown()) { return false; } if(power.GetTargetRange() == Power.TargetRange.Self) { UsePower(power, owner.target, battleController); } else if(power.GetTargetRange() == Power.TargetRange.Nova) { TeamUtil.Team team = TeamUtil.Team.Yellow; if(TargetType.IsContainTarget(TargetType.ENEMY, power.targetType)) team = TeamUtil.GetOpponentTeam(owner.team); else if(TargetType.IsContainTarget(TargetType.ALLY, power.targetType)) team = owner.team; if(battleController.GetMap().GetBattleObjectByRange(owner.position, power.GetDistance(), team).Count == 0) { if(owner == battleController.GetCtrlCraft() && !IsAttack(power)) { battleController.battleUI.ShowBottomTip(Language.GetStr("PowerTip", "noTargetInRange")); } return false; } UsePower(power, owner.target, battleController); } else if(power.GetPowerType() == Power.PowerType.Summon) { Player player = battleController.GetBattleSession().GetPlayer(owner.userId); if(player != null && player.SoldierCount() < power.GetTargetLimit()) { UsePower(power, owner.target, battleController); } } else if(owner.target == null) { if(owner == battleController.GetCtrlCraft() && !IsAttack(power)) { battleController.battleUI.ShowBottomTip(Language.GetStr("PowerTip", "needTarget")); } return false; } else if(power.IsInRange(owner.target)) { UsePower(power, owner.target, battleController); } else { if(owner == battleController.GetCtrlCraft() && !IsAttack(power)) { battleController.battleUI.ShowBottomTip(Language.GetStr("PowerTip", "needCloser")); } return false; } return true; } private void UsePower(Power power, ITarget target, BattleController battleController) { if (power.crystalNeed > 0) { if (battleController.GetMyPlayer ().userId == power.GetOwner ().userId) { Player player = battleController.GetBattleSession ().GetPlayer (power.GetOwner ().userId); power.RenewLastLaunchTime (); player.CrystalPowerLaunched (power.GetId (), power.GetLastLaunchTime ()); } } else { power.RenewLastLaunchTime (); } battleController.GetMessageManager().Power(power, target); } public void ParsePower(int powerId, ISFSObject powerData, BattleController battleController) { Power power = GetPowerById(powerId); if(power != null) { if(owner is Craft) { (owner as Craft).OnUserPower(); } power.ParseMessage(powerData, battleController); if(owner is Craft) { Craft craft = owner as Craft; craft.GetSwapManager().AbortSwap(); if(power == GetAttack()) { craft.SetState(Craft.State.Attack); } else { craft.SetState(Craft.State.Attack); } } } else { Debuger.LogError("parsePower::can not find power("+powerId+") owner("+owner.ToString()+")"); } } }