using UnityEngine; using System.Collections; using System.Collections.Generic; using Sfs2X.Entities.Data; public class PowerHandler { public virtual ISFSObject PackMessage(Power power, ITarget target, BattleController battleController) { ISFSObject data = new SFSObject(); if(power.GetPowerType() == Power.PowerType.Teleport) { if(power.GetTargetRange() == Power.TargetRange.SingleObject) { data.PutInt("i", target.id); } } else if(power.GetPowerType() == Power.PowerType.Summon) { } else if(power.GetPowerType() == Power.PowerType.Dash) { data.PutInt("i", target.id); } else { List list = GetTargetList(power, target, battleController); int[] arr = new int[list.Count]; for(int i=0; i GetTargetList(Power power, ITarget target, BattleController battleController) { List list = new List(); Map map = battleController.GetMap(); TeamUtil.Team team = TeamUtil.Team.None; if(TargetType.IsContainTarget(TargetType.ENEMY, power.targetType)) team = TeamUtil.GetOpponentTeam(power.GetOwner().team); else if(TargetType.IsContainTarget(TargetType.ALLY, power.targetType)) team = power.GetOwner().team; if(power.GetTargetRange() == Power.TargetRange.SingleObject) { if(target is BattleObject) list.Add(target as BattleObject); } else if(power.GetTargetRange() == Power.TargetRange.Self) { //list.Add(power.GetOwner() as BattleObject); } else if(power.GetTargetRange() == Power.TargetRange.Chain) { Vector3 pos = power.GetOwner().position; int count = power.GetTargetLimit(); for(int i=0; i tempList = map.GetBattleObjectByRange(pos, power.GetDistance(), team, list); FilterList(1, power.GetTargetSort(), tempList, power.GetPowerEffect()); if(tempList.Count == 0) { break; } else { BattleObject t = tempList[0]; pos = t.position; list.Add(t); } } } else if(power.GetTargetRange() == Power.TargetRange.Nova) { list = map.GetBattleObjectByRange(power.GetOwner().position, power.GetDistance(), team); FilterList(power.GetTargetLimit(), power.GetTargetSort(), list, power.GetPowerEffect()); } else if(power.GetTargetRange() == Power.TargetRange.Sector) { float originRadian = NumberUtil.getRadianByATan(target.position.x, target.position.z, power.GetOwner().position.x, power.GetOwner().position.z); list = map.GetBattleObjectBySector(power.GetOwner().position, originRadian, power.GetDistance(), team); FilterList(power.GetTargetLimit(), power.GetTargetSort(), list, power.GetPowerEffect()); } else if(power.GetTargetRange() == Power.TargetRange.FrontRect) { float originRadian = NumberUtil.getRadianByATan(target.position.x, target.position.z, power.GetOwner().position.x, power.GetOwner().position.z); list = map.GetBattleObjectByFrontRect(power.GetOwner().position, originRadian, power.GetDistance(), team); FilterList(power.GetTargetLimit(), power.GetTargetSort(), list, power.GetPowerEffect()); } return list; } protected void FilterList(int limit, Power.TargetSort sort, List list, Power.PowerEffect effect) { if(effect == Power.PowerEffect.Heal) { for(int i=list.Count-1; i>=0; i--) { BattleObject bo = list[i]; if(bo is Door) list.RemoveAt(i); } } if(sort == Power.TargetSort.HpLow2High) list.Sort(SortHpLow2High); else if(sort == Power.TargetSort.HpHigh2Low) list.Sort(SortHpHigh2Low); if(list.Count > limit) { list.RemoveRange(limit, list.Count-limit); } } private static int SortHpLow2High(BattleObject obj1, BattleObject obj2) { if ((obj1 == null) && (obj2 == null)) { return 0; } else if ((obj1 != null) && (obj2 == null)) { return 1; } else if ((obj1 == null) && (obj2 != null)) { return -1; } if (obj1.hp > obj2.hp) { return 1; } else if (obj1.hp < obj2.hp) { return -1; } return 0; } private static int SortHpHigh2Low(BattleObject obj1, BattleObject obj2) { if ((obj1 == null) && (obj2 == null)) { return 0; } else if ((obj1 != null) && (obj2 == null)) { return -1; } else if ((obj1 == null) && (obj2 != null)) { return 1; } if (obj1.hp > obj2.hp) { return -1; } else if (obj1.hp < obj2.hp) { return 1; } return 0; } public virtual void ParseMessage(Power power, ISFSObject data, BattleController battleController) { switch(power.GetPowerType()) { case Power.PowerType.Bullet: ParseBullet(power, data, battleController); break; case Power.PowerType.Melee: ParseMelee(power, data, battleController); break; case Power.PowerType.Chain: ParseChain(power, data, battleController); break; case Power.PowerType.Immediately: ParseImmediately(power, data, battleController); break; case Power.PowerType.Teleport: ParseTeleport(power, data, battleController); break; case Power.PowerType.Summon: ParseSummon(power, data, battleController); break; case Power.PowerType.Nova: ParseNova(power, data, battleController); break; case Power.PowerType.Sector: ParseSector(power, data, battleController); break; case Power.PowerType.Dash: ParseDash(power, data, battleController); break; } } private void ParseBullet(Power power, ISFSObject data, BattleController battleController) { int[] arr = data.GetIntArray("l"); if (power.GetTargetRange () == Power.TargetRange.Self) { arr = new int[]{power.GetOwner().id}; } if(arr.Length == 0) return; int numTarget = Mathf.Max(power.GetTargetLimit(), 1); if(numTarget == int.MaxValue) numTarget = arr.Length; for(int i=0; i bulletList = new List(); for(int j=0; j(power.GetGraphicEffect()); bullet.Init(battleController.GetMap(), power.GetOwner().position, battleObj, power); bullet.damage = (power.GetValue()/power.GetNumBullets()) * power.GetOwner().GetPowerManager().GetDamage(); bulletList.Add(bullet); } if(power.GetOwner() is Craft) { Craft craft = power.GetOwner() as Craft; if(craft.GetShotManager() != null) { craft.GetShotManager().Fire(power, bulletList); } } } } } private void ParseNova(Power power, ISFSObject data, BattleController battleController) { int[] arr = data.GetIntArray("l"); NovaBullet novaBullet = BulletFactory.CreateBullet(power.GetGraphicEffect()); novaBullet.Init(battleController.GetMap(), power.GetOwner().position, null, power); novaBullet.targetIds = arr; novaBullet.damage = power.GetValue(); } private void ParseMelee(Power power, ISFSObject data, BattleController battleController) { int[] arr = data.GetIntArray("l"); if (power.GetTargetRange () == Power.TargetRange.Self) { arr = new int[]{power.GetOwner().id}; } for(int i=0; i bulletList = new List(); for(int j=0; j(power.GetGraphicEffect()); bullet.Init(battleController.GetMap(), power.GetOwner().position, battleObj, power); bullet.damage = (power.GetValue()/power.GetNumBullets()) * power.GetOwner().GetPowerManager().GetDamage(); bulletList.Add(bullet); } if(power.GetOwner() is Craft) { Craft craft = power.GetOwner() as Craft; if(craft.GetShotManager() != null) { craft.GetShotManager().Fire(power, bulletList); } } } } } private void ParseImmediately(Power power, ISFSObject data, BattleController battleController) { int[] arr = data.GetIntArray("l"); if (power.GetTargetRange () == Power.TargetRange.Self) { arr = new int[]{power.GetOwner().id}; } for(int i=0; i(power.GetGraphicEffect()); bullet.Init(battleController.GetMap(), power.GetOwner().position, battleObj, power); bullet.damage = power.GetValue() * power.GetOwner().GetPowerManager().GetDamage(); bullet.delayEffect = 0; } } } private void ParseChain(Power power, ISFSObject data, BattleController battleController) { int[] arr = data.GetIntArray("l"); ITarget originTarget = power.GetOwner() as ITarget; for(int i=0; i(power.GetGraphicEffect()); bullet.origin = originTarget; bullet.damage = power.GetValue() * power.GetOwner().GetPowerManager().GetDamage(); bullet.delayEffect += i*0.1f; bullet.Init(battleController.GetMap(), originTarget.position, battleObj, power); originTarget = battleObj; } } } private void ParseTeleport(Power power, ISFSObject data, BattleController battleController) { if(data.ContainsKey("i")) { Map map = battleController.GetMap(); BattleObject battleObj = map.GetBattleObject(data.GetInt("i")); if(battleObj != null) { GameObject disappearObj = EffectUtil.CreateDisappear(); disappearObj.transform.position = power.GetOwner().position; AStarNode astarNode = map.FindNearestEmptyAstarNode(battleObj.col, battleObj.row); power.GetOwner().position = map.GetAstarNodePosition(astarNode.X, astarNode.Y); if(power.GetOwner() is Craft) (power.GetOwner() as Craft).StopMove(); GameObject landingObj = EffectUtil.CreateLanding(); landingObj.transform.position = power.GetOwner().position; Melee bullet = BulletFactory.CreateBullet(power.GetGraphicEffect()); bullet.Init(battleController.GetMap(), power.GetOwner().position, battleObj, power); bullet.damage = power.GetValue() * power.GetOwner().GetPowerManager().GetDamage(); } } else { power.GetOwner().Teleport((int)power.GetDistance()); } } private void ParseSummon(Power power, ISFSObject data, BattleController battleController) { Map map = battleController.GetMap(); Craft owner = power.GetOwner() as Craft; Player.Hero hero = battleController.GetBattleSession ().GetPlayer (owner.userId).GetHero(); if (hero == null) return; int craftId = (int)power.GetValue(); int id = hero.GetAvailableSoldierUid(); if (id < 0) return; CraftData craftData = new CraftData(craftId); craftData.aiType = AI.AIType.Soldier; craftData.id = id; craftData.userId = owner.userId; craftData.nick = owner.nick+Language.GetStr("GameInfo", "attendant"); craftData.team = owner.team; AStarNode node = map.FindNearestEmptyAstarNode(Map.XToColumn(owner.position.x), Map.ZToRow(owner.position.z)); craftData.position = new Vector3(Map.GetCenterX(node.X), 0, Map.GetCenterZ(node.Y)); craftData.isHero = false; battleController.CreateCraft(craftData); } private void ParseSector(Power power, ISFSObject data, BattleController battleController) { Vector3 originPos = new Vector3(data.GetFloat("ox"), 0, data.GetFloat("oy")); ITarget posTarget = new PositionTarget(new Vector3(data.GetFloat("x"), 0, data.GetFloat("y"))); int[] arr = data.GetIntArray("l"); SectorBullet bullet = BulletFactory.CreateBullet(power.GetGraphicEffect()); bullet.Init(battleController.GetMap(), originPos, posTarget, power); bullet.targetIds = arr; bullet.damage = power.GetValue() * power.GetOwner().GetPowerManager().GetDamage(); } private void ParseDash(Power power, ISFSObject data, BattleController battleController) { int id = data.GetInt("i"); BattleObject battleObj = battleController.GetMap().GetBattleObject(id); if(battleObj != null) { (power.GetOwner() as Craft).MoveTo(battleObj.col, battleObj.row); int buffId = power.GetBuff(); BuffManager.GetInstance().AddBuff(buffId, battleObj, power.GetOwner() as BattleObject); } } }