Beispiel #1
0
        private BattleFightResult CalculateResult()
        {
            /*
             * foreach (var defender in Defenders)
             * {
             *  int ResultDamage = Math.Abs(defender.Defesa - Attacker.Ataque);
             *  defender.Defesa = ResultDamage;
             * }
             *
             * Attacker.Defesa = Attacker.Defesa - Defenders.Sum(d => d.Ataque);
             *
             * return new BattleFightResult(Attacker,Defenders);
             */

            int ResultDamage = 0;

            foreach (var defender in Defenders)
            {
                int ParcialResultDamage = Math.Abs(defender.Defesa - Attacker.Ataque);
                ResultDamage = ParcialResultDamage > ResultDamage ?
                               ParcialResultDamage : ResultDamage;
                defender.Defesa = defender.Defesa - Attacker.Ataque;
            }

            Attacker.Defesa = Attacker.Defesa - Defenders.Sum(d => d.Ataque);

            return(new BattleFightResult(Attacker, Defenders, ResultDamage));
        }
 private void Start()
 {
     buttonArray    = GameObject.FindObjectsOfType <Button>();
     spriteRenderer = GetComponent <SpriteRenderer>();
     defender       = defenderPrefab.GetComponent <Defenders>();
     starDisplay    = FindObjectOfType <StarDisplay>().GetComponent <StarDisplay>();
 }
Beispiel #3
0
    /// <summary>
    /// Spawns the defender.
    /// </summary>
    private void SpawnDefender()
    {
        // Gets static defender and then creates new one parented to Defenders GO
        GameObject selDefender = Button.selectedDefender;

        if (selDefender)
        {
            //Check whether defender already exists there
            Vector2    snappedCoordinates = SnapToGrid(worldCoordinates);
            Collider[] hitColliders       = Physics.OverlapSphere(new Vector3(snappedCoordinates.x, snappedCoordinates.y, 0f), 0.3f);

            foreach (Collider col in hitColliders)
            {
                Defenders def = col.gameObject.GetComponent <Defenders>();
                if (def)
                {
                    return;
                }
            }

            GameObject newDefender = Instantiate(selDefender) as GameObject;
            newDefender.transform.SetParent(defenderSpawner.transform);

            // Set Position of defender
            newDefender.transform.position = snappedCoordinates;
        }
    }
Beispiel #4
0
    internal BattleState GetNextState()
    {
        IEnumerable <BattleStateForces> nextAttackers = Attackers.Select(item => item.GetNextState(Defenders, Attackers)).ToArray();
        IEnumerable <BattleStateForces> nextDefenders = Defenders.Select(item => item.GetNextState(Attackers, Defenders)).ToArray();

        return(new BattleState(nextAttackers, nextDefenders));
    }
Beispiel #5
0
 private void RemoveFromPool(Defender defender)
 {
     if (Defenders.Contains(defender))
     {
         Defenders.Remove(defender);
     }
 }
Beispiel #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="win"></param>
        public override void EndFight(bool win = false)
        {
            base.EndFight(win);

            if (win)
            {
                Guild.AddMessage(() =>
                {
                    if (Guild.IsDeleted)
                    {
                        return;
                    }
                    StartAction(GameActionTypeEnum.MAP);
                    Guild.Dispatch(WorldMessage.GUILD_TAXCOLLECTOR_SURVIVED(Name, Map.X, Map.Y));
                });
            }
            else
            {
                Guild.AddMessage(() =>
                {
                    if (Guild.IsDeleted)
                    {
                        return;
                    }
                    Guild.RemoveTaxCollector(this);
                    Guild.Dispatch(WorldMessage.GUILD_TAXCOLLECTOR_DIED(Name, Map.X, Map.Y));
                });
            }

            Defenders.Clear();
        }
Beispiel #7
0
        public override void Reset()
        {
            base.Reset();

            if (Flag != null)
            {
                Flag.Delete();
                Flag = null;
            }

            if (Attackers != null)
            {
                Attackers.Clear();
            }
            else
            {
                Attackers = new Dictionary <PlayerMobile, int>();
            }

            if (Defenders != null)
            {
                Defenders.Clear();
            }
            else
            {
                Defenders = new Dictionary <PlayerMobile, int>();
            }

            Caps = 0;
        }
Beispiel #8
0
        private void BattleEnded(bool writeReport)
        {
            if (writeReport)
            {
                BattleReport.CompleteBattle();
            }

            AboutToExitBattle(this, Attackers, Defenders);
            ExitBattle(this, Attackers, Defenders);

            foreach (var combatObj in Defenders.AllCombatObjects().Where(combatObj => !combatObj.IsDead))
            {
                combatObj.ExitBattle();
            }

            foreach (var combatObj in Attackers.AllCombatObjects().Where(combatObj => !combatObj.IsDead))
            {
                combatObj.ExitBattle();
            }

            foreach (var group in Attackers)
            {
                WithdrawAttacker(this, group);
            }

            foreach (var group in Defenders)
            {
                WithdrawDefender(this, group);
            }

            // Delete all groups
            Attackers.Clear();
            Defenders.Clear();
        }
Beispiel #9
0
 void Start()
 {
     rend             = GetComponent <Renderer>();
     startColor       = rend.material.color;
     set              = false;
     gamemane         = GameObject.Find("GameManager").GetComponent <GameManager>();
     defenders        = GameObject.Find("GameManager").GetComponent <Defenders>();
     placementManager = PlacementManager.instance;
 }
Beispiel #10
0
        /// <summary>
        ///
        /// </summary>
        public override void Dispose()
        {
            Guild = null;

            Defenders.Clear();
            Defenders = null;

            base.Dispose();
        }
Beispiel #11
0
 public void UpdateDefender()
 {
     SelectedDefender = Button.SelectedDefender.GetComponent <Defenders>();
     UpdateInfo();
     if (!IsVisible)
     {
         TurnVisible();
     }
 }
Beispiel #12
0
        private bool IsBattleValid()
        {
            if (Attackers.Count == 0 || Defenders.Count == 0)
            {
                return(false);
            }

            // Check to see if all units in the defense is dead
            // and make sure units can still see each other
            return(Attackers.AllAliveCombatObjects().Any(combatObj => Defenders.HasInRange(combatObj)));
        }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        Defenders defenders = collision.gameObject.GetComponent <Defenders>();
        Health    health    = collision.gameObject.GetComponent <Health>();

        if (defenders && health)
        {
            health.dealDamage(damage);
            Debug.Log(name + " Dealt " + damage);
            Destroy(gameObject);
        }
    }
Beispiel #14
0
 // Use this for initialization
 void Start()
 {
     if (Button.SelectedDefender)
     {
         SelectedDefender = Button.SelectedDefender.GetComponent <Defenders>();
     }
     gameObject.transform.localScale = new Vector3(0, 0, 0);
     NamePool   = GameObject.Find("NamePool").GetComponent <Text>();
     HealthPool = GameObject.Find("HealthPool").GetComponent <Text>();
     DamagePool = GameObject.Find("DamagePool").GetComponent <Text>();
     CostPool   = GameObject.Find("CostPool").GetComponent <Text>();
 }
Beispiel #15
0
        public static void HeroesAction(int turn, Attackers attackers, Defenders defenders)
        {
            bool attackerTurn = IsHeroTurn(turn, attackers.CurrentHeroPower);
            bool defenderTurn = IsHeroTurn(turn, defenders.CurrentHeroPower);
            bool hasDiv = false;

            if (attackerTurn || defenderTurn)
            {
                hasDiv = true;
                Game.Log.Add("<div class='heroesActions'>");
            }

            while (attackerTurn || defenderTurn)
            {
                if (attackerTurn && defenderTurn)
                {
                    int attackerInitiative = DiceRoller.Throw(attackers.CurrentHero.Speed);
                    int defenderInitiative = DiceRoller.Throw(defenders.CurrentHero.Speed);

                    if (attackerInitiative.BiggerThan(defenderInitiative))
                    {
                        HeroCombat(attackers, defenders);
                        if (defenders.CurrentHero.Life > 0 && IsHeroTurn(turn, defenders.CurrentHeroPower))
                            HeroCombat(defenders, attackers);
                    }
                    else
                    {
                        HeroCombat(defenders, attackers);
                        if (attackers.CurrentHero.Life > 0 && IsHeroTurn(turn, attackers.CurrentHeroPower))
                            HeroCombat(attackers, defenders);
                    }

                }
                else
                {
                    if (attackerTurn)
                        HeroCombat(attackers, defenders);
                    else if (defenderTurn)
                        HeroCombat(defenders, attackers);
                }

                if (attackers.Powers.Count > 0 && attackers.CurrentHeroPower.Executed) attackers.Powers.RemoveAt(0);
                if (defenders.Powers.Count > 0 && defenders.CurrentHeroPower.Executed) defenders.Powers.RemoveAt(0);

                Game.Log.Add("<br />");

                attackerTurn = IsHeroTurn(turn, attackers.CurrentHeroPower);
                defenderTurn = IsHeroTurn(turn, defenders.CurrentHeroPower);
              }

            if (hasDiv)
                Game.Log.Add("</div>");
        }
Beispiel #16
0
    private void SetAttackAndDefense()
    {
        Attackers.Clear();
        Defenders.Clear();

        List <Actor> units_within_range = FindObjectsOfType <Actor>().
                                          Where(actor => Vector3.Distance(actor.transform.position, transform.position) < influence_zone_radius).
                                          ToList();

        if (NodeFaction != null)
        {
            // attack and defense is determined by who currently claims the node

            for (int i = 0; i < units_within_range.Count; i++)
            {
                Actor actor = units_within_range[i];

                if (actor != null)
                {
                    if (actor.CurrentFaction.IsHostileTo(NodeFaction))
                    {
                        if (!Attackers.Contains(actor) && actor != null)
                        {
                            Attackers.Add(actor);
                        }
                    }
                    else
                    {
                        if (!Defenders.Contains(actor) && actor != null)
                        {
                            Defenders.Add(actor);
                        }
                    }
                }
            }
        }
        else
        {
            // the attackers are the faction with the most units; everybody else can try to kill them
            // NOTE: the faction that has the most units for the last boost gains the node (of course, then they have to keep it)

            var faction_units = units_within_range
                                .GroupBy(unit => unit.CurrentFaction,
                                         (faction, factions) => new {
                Key   = faction,
                Count = factions.Count()
            })
                                .OrderByDescending(faction => faction.Count);

            Attackers.AddRange(units_within_range.Where(unit => unit.CurrentFaction == faction_units.First().Key));
        }
    }
Beispiel #17
0
        public void Remove(ICombatGroup group, BattleSide side, ReportState state)
        {
            lock (battleLock)
            {
                // Remove from appropriate combat list
                if (side == BattleSide.Attack)
                {
                    if (!Attackers.Remove(group))
                    {
                        return;
                    }

                    group.CombatObjectAdded   -= AttackerGroupOnCombatObjectAdded;
                    group.CombatObjectRemoved -= AttackerGroupOnCombatObjectRemoved;
                }
                else
                {
                    if (!Defenders.Remove(group))
                    {
                        return;
                    }

                    group.CombatObjectAdded   -= DefenderGroupOnCombatObjectAdded;
                    group.CombatObjectRemoved -= DefenderGroupOnCombatObjectRemoved;
                }

                // If battle hasnt started then dont worry about cleaning anything up since nothing has happened to these objects
                if (!BattleStarted)
                {
                    return;
                }

                // Snap a report of exit
                BattleReport.WriteReportGroup(group, side == BattleSide.Attack, state);

                // Tell objects to exit from battle
                foreach (var co in group.Where(co => !co.Disposed))
                {
                    co.ExitBattle();
                }

                // Send exit events
                if (side == BattleSide.Attack)
                {
                    WithdrawAttacker(this, group);
                }
                else
                {
                    WithdrawDefender(this, group);
                }
            }
        }
Beispiel #18
0
        public void DbLoaderAddToCombatList(ICombatGroup group, BattleSide side)
        {
            if (side == BattleSide.Defense)
            {
                Defenders.Add(group, false);
            }
            else
            {
                Attackers.Add(group, false);
            }

            groupIdGen.Set(group.Id);
        }
Beispiel #19
0
    // Use this for initialization
    void Start()
    {
        buttonArray = GameObject.FindObjectsOfType <Button>();
        defenders   = GameObject.FindObjectOfType <Defenders>();

        costText = GetComponentInChildren <Text>();
        if (!costText)
        {
            Debug.LogWarning(name + " has no cost ");
        }

        costText.text = defenderPrefab.GetComponent <Defenders>().starCost.ToString();
    }
Beispiel #20
0
        public void DbFinishedLoading()
        {
            uint maxId =
                Math.Max(
                    Attackers.SelectMany(group => group)
                    .DefaultIfEmpty()
                    .Max(combatObject => combatObject == null ? 0 : combatObject.Id),
                    Defenders.SelectMany(group => group)
                    .DefaultIfEmpty()
                    .Max(combatObject => combatObject == null ? 0 : combatObject.Id));

            idGen.Set(maxId);
        }
Beispiel #21
0
    void OnTriggerEnter2D(Collider2D col)
    {
        Defenders def = col.gameObject.GetComponent <Defenders>();

        if (def && def.GetComponent <Health>())
        {
            this.animator.SetBool("IsAttacking", true);
            this.attacker.Attack(col.gameObject);
        }
        else
        {
            return;
        }
    }
Beispiel #22
0
        private void BringWaitingTroopsIntoBattle()
        {
            foreach (var defender in Defenders.AllCombatObjects().Where(co => co.IsWaitingToJoinBattle))
            {
                defender.JoinBattle(Round);
                dbManager.Save(defender);
            }

            foreach (var attacker in Attackers.AllCombatObjects().Where(co => co.IsWaitingToJoinBattle))
            {
                attacker.JoinBattle(Round);
                dbManager.Save(attacker);
            }
        }
Beispiel #23
0
        public void HeroesPowers(int turns, Attackers attackers, Defenders defenders)
        {
            attackers.Powers = new List<HeroPower>();
            defenders.Powers = new List<HeroPower>();

            foreach (Hero hero in attackers.Heroes)
                PowerList(turns, hero.Powers, attackers.Powers);

            foreach (Hero hero in defenders.Heroes)
                PowerList(turns, hero.Powers, defenders.Powers);

            attackers.Powers = attackers.Powers.OrderBy(x => x.Turn).ToList();
            defenders.Powers = defenders.Powers.OrderBy(x => x.Turn).ToList();
        }
    void OnMouseDown()
    {
        Vector2    rawPos     = CalculateWorldPointOfMouseClick();
        Vector2    roundedPos = SnapToGrid(rawPos);
        GameObject defender   = Button.selectedDefender;
        Defenders  defOjb     = defender.GetComponent <Defenders> ();

        if (StarDisplay.Status.SUCCESS == starDispaly.UseStar(defOjb.starCost))
        {
            SpawnDefender(roundedPos, defender);
        }
        else
        {
            Debug.Log("Insufficient stars");
        }
    }
Beispiel #25
0
        public override void GetHtmlStatistics(Mobile viewer, StringBuilder html)
        {
            base.GetHtmlStatistics(viewer, html);

            html.AppendLine("----------");
            html.AppendLine("Flags Captured: {0:#,0}", GetTotalFlagsCaptured());
            html.AppendLine("Flags Dropped: {0:#,0}", GetTotalFlagsDropped());
            html.AppendLine("Flags Stolen: {0:#,0}", GetTotalFlagsStolen());
            html.AppendLine("Flags Returned: {0:#,0}", GetTotalFlagsReturned());

            html.AppendLine();

            html.Append(String.Empty.WrapUOHtmlColor(System.Drawing.Color.LawnGreen, false));
            html.AppendLine("Defenders:");
            html.AppendLine();

            string t;

            var i = 0;

            foreach (var o in Defenders.OrderBy(kv => kv.Value))
            {
                t = String.Format("{0:#,0}: {1} ({2:#,0} Returns)", ++i, o.Key.RawName, o.Value);
                t = t.WrapUOHtmlColor(viewer.GetNotorietyColor(o.Key), SuperGump.DefaultHtmlColor);

                html.AppendLine(t);
            }

            html.AppendLine();

            html.Append(String.Empty.WrapUOHtmlColor(System.Drawing.Color.OrangeRed, false));
            html.AppendLine("Attackers:");
            html.AppendLine();

            i = 0;

            foreach (var o in Attackers.OrderBy(kv => kv.Value))
            {
                t = String.Format("{0:#,0}: {1} ({2:#,0} Captures)", ++i, o.Key.RawName, o.Value);
                t = t.WrapUOHtmlColor(viewer.GetNotorietyColor(o.Key), SuperGump.DefaultHtmlColor);

                html.AppendLine(t);
            }

            html.Append(String.Empty.WrapUOHtmlColor(SuperGump.DefaultHtmlColor, false));
        }
Beispiel #26
0
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine(Gk.Info);
            sb.AppendLine(string.Join(", ", Defenders.Select(x => x.Info)));
            sb.AppendLine(string.Join(", ", Midfielders.Select(x => x.Info)));
            sb.AppendLine(string.Join(", ", Forwards.Select(x => x.Info)));

            sb.AppendLine("--------------------------");

            sb.AppendLine(SubGk.Info);
            sb.AppendLine(string.Join(", ", SubDefenders.Select(x => x.Info)));
            sb.AppendLine(string.Join(", ", SubMidfielders.Select(x => x.Info)));
            sb.AppendLine(string.Join(", ", SubForwards.Select(x => x.Info)));

            return(sb.ToString());
        }
Beispiel #27
0
        public virtual void OnFlagReturned(PlayerMobile defender)
        {
            if (defender == null || Flag == null || Flag.Deleted || CTFBattle == null || CTFBattle.Deleted)
            {
                return;
            }

            if (Defenders.ContainsKey(defender))
            {
                Defenders[defender]++;
            }
            else
            {
                Defenders.Add(defender, 1);
            }

            Broadcast("[{0}]: {1} has returned your flag!", Name, defender.RawName);
            CTFBattle.OnFlagReturned(Flag, defender);
        }
Beispiel #28
0
    void OnTriggerEnter2D(Collider2D col)
    {
        Defenders def = col.gameObject.GetComponent <Defenders>();

        if (def && def.GetComponent <Health>())
        {
            if (def.GetComponent <Gravestone>())
            {
                this.Jump();
            }
            else
            {
                this.Attack(def);
            }
        }
        else
        {
            return;
        }
    }
Beispiel #29
0
    // private


    private IEnumerator CheckClaim()
    {
        // TODO: we may want to alter the amount units boost or reduce the claim

        while (true)
        {
            SetAttackAndDefense();

            int net_offense = Attackers.Count - Defenders.Count;   // Attackers and Defenders lists are managed by trigger stay/exit

            if (net_offense != 0)
            {
                Faction attacking_faction = Attackers.Any() ? Attackers.First().CurrentFaction : null;
                Faction defending_faction = Defenders.Any() ? Defenders.First().CurrentFaction : null;

                if (net_offense > 0)
                {
                    if (Claimed && NodeFaction != attacking_faction)
                    {
                        ReduceClaim(net_offense);
                    }
                    else if (!Claimed)
                    {
                        BoostClaim(net_offense, attacking_faction);
                    }
                }
                else if (net_offense < 0)
                {
                    if (Claimed && NodeFaction == defending_faction)
                    {
                        BoostClaim(Mathf.Abs(net_offense), defending_faction);
                    }
                }

                UpdateClaimBar();
            }
            yield return(new WaitForSeconds(Turn.ActionThreshold));
        }
    }
Beispiel #30
0
        public void RoundReport(int turn, Attackers attackers, Defenders defenders)
        {
            Game.Log.Add("<hr>");
            Game.Log.Add(string.Format("<a name='turno{0}'>&nbsp;</a><h2>Obituário do round {0}</h2>", turn));
            Game.Log.Add("<div class='attacker'>Atacantes</div>");
            var attackersDied = (from atk in attackers.cemitery
                                 orderby atk.Type
                                 group atk by atk.Type);

            foreach (var group in attackersDied)
                Game.Log.Add(string.Format("<b>Tipo {1}:</b> {0}", group.Count<Unit>(), group.Key));

            Game.Log.Add("<br />");
            Game.Log.Add("<div class='defender'>Defensores</div>");
            var defendersDied = (from dfr in defenders.cemitery
                                 orderby dfr.Type
                                 group dfr by dfr.Type);

            foreach (var group in defendersDied)
                Game.Log.Add(string.Format("<b>Tipo {1}:</b> {0}", group.Count<Unit>(), group.Key));

            Game.Log.Add("<hr>");
        }
Beispiel #31
0
        public override void GetHtmlStatistics(Mobile viewer, StringBuilder html)
        {
            base.GetHtmlStatistics(viewer, html);

            html.AppendLine("* Flags Captured: {0:#,0} / {1:#,0}", Caps, CTFBattle != null ? CTFBattle.CapsToWin : 0);
            html.AppendLine();

            html.Append("".WrapUOHtmlColor(System.Drawing.Color.LawnGreen, false));
            html.AppendLine("Defenders: ");
            html.AppendLine();

            Defenders.OrderBy(kv => kv.Value)
            .For(
                (i, kv) =>
                html.AppendLine(
                    "{0:#,0}: {1} ({2:#,0} Returns)".WrapUOHtmlColor(viewer.GetNotorietyColor(kv.Key), SuperGump.DefaultHtmlColor),
                    i + 1,
                    kv.Key.RawName,
                    kv.Value));
            html.AppendLine();

            html.Append("".WrapUOHtmlColor(System.Drawing.Color.OrangeRed, false));
            html.AppendLine("Attackers: ");
            html.AppendLine();

            Attackers.OrderBy(kv => kv.Value)
            .For(
                (i, kv) =>
                html.AppendLine(
                    "{0:#,0}: {1} ({2:#,0} Captures)".WrapUOHtmlColor(viewer.GetNotorietyColor(kv.Key), SuperGump.DefaultHtmlColor),
                    i + 1,
                    kv.Key.RawName,
                    kv.Value));
            html.AppendLine();

            html.Append("".WrapUOHtmlColor(SuperGump.DefaultHtmlColor, false));
        }
 void Start()
 {
     anim     = GetComponent <Animator>();
     defender = GetComponent <Defenders>();
 }
Beispiel #33
0
        public static void StartCombat(int turns, Attackers attackers, Defenders defenders)
        {
            attackers.ResetCemitery();
            defenders.ResetCemitery();

            if (defenders.Units.Count > 0 && attackers.Units.Count > 0)
            {
                Unit defender = null;
                Unit attacker = null;

                int i = 1;
                while (i < turns && defenders.Units.Count + defenders.Heroes.Count > 0 && attackers.Units.Count + attackers.Heroes.Count > 0)
                {
                    HeroesAction(i, attackers, defenders);

                    if (defenders.Units.Count > 0 && attackers.Units.Count > 0)
                    {
                        attacker = attackers.CurrentUnit;
                        defender = defenders.CurrentUnit;

                        UnitCombat.Fight(attackers.CurrentUnit, defender);

                        defenders.Units.RemoveAt(0);
                        attackers.Units.RemoveAt(0);

                        if (defender.Life > 0)
                            defenders.Units.Add(defender);
                        else
                            defenders.BuryUnit(defender);

                        if (attacker.Life > 0)
                            attackers.Units.Add(attacker);
                        else
                            attackers.BuryUnit(attacker);

                        Game.Log.Add("<br />");
                    }
                    i++;
                }
            }
        }
Beispiel #34
0
 void Attack(Defenders def)
 {
     //Debug.Log (this.name + " is attacking " + def.gameObject.name);
     this.animator.SetBool("IsAttacking", true);
     this.attacker.Attack(def.gameObject);
 }
Beispiel #35
0
        //private static void round_OnRoundExecution()
        //{
        //    Round.IsRunning = true;
        //    System.Threading.Thread.Sleep(20000);
        //    Round.IsRunning = false;
        //}
        private void round_OnRoundExecution()
        {
            Round.IsRunning = true;

            Game.Log.Clear();
            World davi = World.Load(1);
            World golias = World.Load(2);

            Attackers attackers = new Attackers();
            Defenders defenders = new Defenders();

            int number = 1;
            attackers.Units = new List<Unit>();
            Unit unit = null;
            Unit baseUnit = null;
            foreach (WorldUnits worldUnit in davi.Units)
            {
                baseUnit = Unit.Find(worldUnit.UnitId);
                if (baseUnit != null)
                {
                    for (int j = 0; j < worldUnit.Quantity; j++)
                    {
                        unit = (Unit)baseUnit.Clone();
                        unit.Number = number;
                        unit.PositionInCombat = Unit.CombatPosition.attacker;
                        attackers.Units.Add(unit);
                        number += 1;
                    }
                }
            }

            number = 1;
            defenders.Units = new List<Unit>();
            unit = null;
            baseUnit = null;
            foreach (WorldUnits worldUnit in golias.Units)
            {
                baseUnit = Unit.Find(worldUnit.UnitId);
                if (baseUnit != null)
                {
                    for (int j = 0; j < worldUnit.Quantity; j++)
                    {
                        unit = (Unit)baseUnit.Clone();
                        unit.Number = number;
                        unit.PositionInCombat = Unit.CombatPosition.defender;
                        defenders.Units.Add(unit);
                        number += 1;
                    }
                }
            }

            attackers.Units = Util.ScrambleList<Unit>(attackers.Units);
            defenders.Units = Util.ScrambleList<Unit>(defenders.Units);

            Hero hero = null;
            attackers.Heroes = new List<Hero>();
            hero = Hero.Find(davi.HeroId);
            hero.SetPowers();
            attackers.Heroes.Add(hero);
            defenders.Heroes = new List<Hero>();
            hero = Hero.Find(golias.HeroId);
            hero.SetPowers();
            defenders.Heroes.Add(hero);

            int turns = attackers.Units.Count.BiggerThan(defenders.Units.Count) ? attackers.Units.Count : defenders.Units.Count;
            int rounds = 1; //round will be always one! refactor later

            HeroesPowers(turns, attackers, defenders);

            int i = 1;
            while (i <= rounds && defenders.Units.Count + defenders.Heroes.Count > 0 && attackers.Units.Count + attackers.Heroes.Count > 0)
            {
                Game.Log.Add(string.Format("<h2>Round {0}</h2><p>Atacando: {1} unidades</p><p>Defendendo: {2} unidades</p>", i, attackers.Units.Count, defenders.Units.Count));
                Game.StartCombat(turns, attackers, defenders);

                #region LOG
                Game.Log.Add(attackers.PV());
                Game.Log.Add(defenders.PV());
                RoundReport(i, attackers, defenders);
                #endregion

                //#region RESET
                //generate.RoundResetUnitLives(attackers.Units);
                //generate.RoundResetUnitLives(defenders.Units);
                //attackers.ResetHeroes();
                //defenders.ResetHeroes();
                //#endregion

                turns = attackers.Units.Count.BiggerThan(defenders.Units.Count) ? attackers.Units.Count : defenders.Units.Count;
                HeroesPowers(turns, attackers, defenders);
                i++;
            }
            Round.IsRunning = false;
            CombatLog l = new CombatLog() { Log = string.Join("<br/>", Game.Log.ToArray()), CombatId = 1 };
            l.Save();
        }