Ejemplo n.º 1
0
        public Battle(Person attacker, Person defender, Region region)
        {
            PersonArrayList attackers = new PersonArrayList();

            attackers.Add(attacker);
            Init(attackers, defender, region);
        }
Ejemplo n.º 2
0
        public new PersonArrayList Clone()
        {
            PersonArrayList res = new PersonArrayList();

            foreach (Person p in this)
            {
                res.Add(p);
            }
            return(res);
        }
Ejemplo n.º 3
0
        public PersonArrayList GetTeamAndLeader()
        {
            PersonArrayList list = new PersonArrayList();

            list.Add(this);
            foreach (Person p in Team)
            {
                list.Add(p);
            }
            return(list);
        }
Ejemplo n.º 4
0
        private void Init(PersonArrayList attackers, Person defender, Region region)
        {
            Soldiers = new ArrayList();
            ArrayList check_persons = new ArrayList();

            this.region = region;

            // Add attackers and their teams
            foreach (Person attacker in attackers)
            {
                foreach (Person atk in attacker.GetTeamAndLeader())
                {
                    if (check_persons.Contains(atk))
                    {
                        throw new Exception("Soldier already added");
                    }
                    check_persons.Add(atk);

                    Soldiers.Add(new Soldier(this, atk, Side.Attacker));
                    FirstDefender++;
                }
            }

            // Add target person and his team
            if (defender.Leader != null)
            {
                foreach (Person def in defender.Leader.GetTeamAndLeader())
                {
                    if (check_persons.Contains(def))
                    {
                        throw new Exception("Soldier already added");
                    }
                    check_persons.Add(def);

                    Soldiers.Add(new Soldier(this, def, Side.Defender));
                }
            }
            else
            {
                foreach (Person def in defender.GetTeamAndLeader())
                {
                    if (check_persons.Contains(def))
                    {
                        throw new Exception("Soldier already added");
                    }
                    check_persons.Add(def);

                    Soldiers.Add(new Soldier(this, def, Side.Defender));
                }
            }

            // Add region patrol
            foreach (Person patrol in defender.Region.Persons)
            {
                if (patrol.Leader == null && patrol.Patrolling &&
                    patrol.AttitudeTo(defender) == Attitude.Ally &&
                    !defender.GetTeamAndLeader().Contains(patrol))
                {
                    foreach (Person soldier in patrol.GetTeamAndLeader())
                    {
                        if (check_persons.Contains(soldier))
                        {
                            throw new Exception("Soldier already added");
                        }
                        check_persons.Add(soldier);

                        Soldiers.Add(new Soldier(this, soldier, Side.Defender));
                    }
                }
            }

            // Remove from attackers all further ATTACK orders directed on defenders
            for (int i = 0; i < FirstDefender; i++)
            {
                Person p = ((Soldier)Soldiers[i]).Person;
                foreach (Order ord in p.Orders)
                {
                    if (ord.GetType() == typeof(AttackOrder))
                    {
                        AttackOrder aord = (AttackOrder)ord;
                        for (int k = FirstDefender; k < Soldiers.Count; k++)
                        {
                            if (aord.PersonNum == ((Soldier)Soldiers[k]).Person.Num)
                            {
                                aord.PersonNum = -1;
                                break;
                            }
                        }
                    }
                }
            }

            BattleReport.Add(
                String.Format("{0} attacks {1} in {2}!",
                              attackers[0].ToString(Lang.En),
                              defender.ToString(Lang.En),
                              region.ToString(Lang.En)) +
                String.Format("|{2}: {0} и {1} вступили в бой!",
                              attackers[0].ToString(Lang.Ru),
                              defender.ToString(Lang.Ru),
                              region.ToString(Lang.Ru)));

            region.BattleReports.Add(BattleReport);

            BattleReport.Add("");
            BattleReport.Add("Attackers:|Атакующие:");
            for (int i = 0; i < FirstDefender; i++)
            {
                PrintSoldier((Soldier)Soldiers[i]);
            }
            BattleReport.Add("");
            BattleReport.Add("Defenders:|Защитники:");
            for (int i = FirstDefender; i < Soldiers.Count; i++)
            {
                PrintSoldier((Soldier)Soldiers[i]);
            }

            this.Run();

            // Promote skills
            foreach (Soldier s in Soldiers)
            {
                if (!s.Person.Killed && s.Person.Leader == null)
                {
                    s.PromoteSkill();
                }
            }

            BattleReport.Add("");
            if (AttackersOOA == FirstDefender)
            {
                BattleReport.Add(String.Format("{0} wins.|{1} побеждает.",
                                               defender.ToString(Lang.En), defender.ToString(Lang.Ru)));
                CollectSpoils(region, false, Side.Defender);
                DefendersWin = true;
            }
            else if (DefendersOOA == Soldiers.Count - FirstDefender)
            {
                BattleReport.Add(String.Format("{0} wins.|{1} побеждает.",
                                               attackers[0].ToString(Lang.En), attackers[0].ToString(Lang.Ru)));
                CollectSpoils(region, false, Side.Attacker);
                AttackersWin = true;
            }
            else
            {
                BattleReport.Add("The battle is a draw.|Бой закончен вничью.");
                CollectSpoils(region, true, Side.Attacker);
            }
        }
Ejemplo n.º 5
0
 public Battle(PersonArrayList attackers, Person defender, Region region)
 {
     Init(attackers, defender, region);
 }