Exemple #1
0
 /// <summary>
 /// Combine the whole flank with an ally and removes all units from current flank
 /// </summary>
 /// <param name="other"></param>
 public void CombineWithFlank(Flank other)
 {
     other.sideA.UnionWith(sideA);
     sideA.Clear();
     other.sideB.UnionWith(sideB);
     sideB.Clear();
 }
Exemple #2
0
 public Army(int[] v)
 {
     left   = new Flank(v[0], v[3], v[6]);
     centre = new Flank(v[1], v[4], v[7]);
     right  = new Flank(v[2], v[5], v[8]);
     morale = this.GetMorale();
 }
Exemple #3
0
    public HashSet <AbstractCard> GetActiveCardsFromFlank(CurrentPlayer player, Flank flank)
    {
        HashSet <AbstractCard> cards = new HashSet <AbstractCard>();

        foreach (AbstractCard card in fields[player].flanks[flank])
        {
            if (card.active)
            {
                cards.Add(card);
            }
        }
        return(cards);
    }
Exemple #4
0
 public void hitToDeffender(uint hp, Flank flank, SquadCard card)
 {
     foreach (SquadCard _card in deffender[flank])
     {
         if (card == null)
         {
             continue;
         }
         if (card == _card)
         {
             card.stamina -= (int)hp;
         }
     }
 }
Exemple #5
0
        public override bool IsOnFlank(int x, int y, Unit unit, Flank flank)
        {
            var northFacing = AIUtils.VectorFromCenterRotated(unit.RallyPoint, x, y, unit.UnitFacing);

            if (flank == Flank.LEFT)
            {
                return(northFacing.Item1 <= -10);
            }
            else if (flank == Flank.RIGHT)
            {
                return(northFacing.Item1 >= 9);
            }
            else
            {
                throw new NotImplementedException();
            }
        }
Exemple #6
0
 private void applyInspiration(Skills skills, bool isAttacker, Flank flank)
 {
     if (isAttacker)
     {
         foreach (SquadCard card in attacker[flank])
         {
             if (card == null || card.isDeaf)
             {
                 continue;
             }
             if (card.skills != skills)
             {
                 card.addAttack     += card.skills.inspiration;
                 card.addProtection += card.skills.inspiration;
                 if (skills.brotherhood)
                 {
                     card.addAttack     += card.skills.brotherhood ? 1 : 0;
                     card.addProtection += card.skills.brotherhood ? 1 : 0;
                     card.addStamina    += card.skills.brotherhood ? 1 : 0;
                 }
             }
         }
     }
     else
     {
         foreach (SquadCard card in deffender[flank])
         {
             if (card == null || card.isDeaf)
             {
                 continue;
             }
             if (card.skills != skills)
             {
                 card.addAttack     += card.skills.inspiration;
                 card.addProtection += card.skills.inspiration;
                 if (skills.brotherhood)
                 {
                     card.addAttack     += card.skills.brotherhood ? 1 : 0;
                     card.addProtection += card.skills.brotherhood ? 1 : 0;
                     card.addStamina    += card.skills.brotherhood ? 1 : 0;
                 }
             }
         }
     }
 }
Exemple #7
0
        public void DetermineFlank()
        {
            var followedByWhitespace  = this.following?.IsWhitespace() ?? true;
            var followedByPunctuation = this.following?.IsAsciiPunctuation() ?? false;
            var precededByWhitespace  = this.preceding?.IsWhitespace() ?? true;
            var precededByPunctuation = this.preceding?.IsAsciiPunctuation() ?? false;

            var isLeft  = false;
            var isRight = false;

            // A left-flanking delimiter run is a delimiter run that is (1) not followed by Unicode whitespace, and
            // either (2a) not followed by a punctuation character, or (2b) followed by a punctuation character and
            // preceded by Unicode whitespace or a punctuation character. For purposes of this definition, the beginning
            // and the end of the line count as Unicode whitespace.
            if (!followedByWhitespace && (!followedByPunctuation || (followedByPunctuation && (precededByWhitespace || precededByPunctuation))))
            {
                isLeft = true;
            }

            // A right-flanking delimiter run is a delimiter run that is (1) not preceded by Unicode whitespace, and
            // either (2a) not preceded by a punctuation character, or (2b) preceded by a punctuation character and
            // followed by Unicode whitespace or a punctuation character. For purposes of this definition, the beginning
            // and the end of the line count as Unicode whitespace.
            if (!precededByWhitespace && (!precededByPunctuation || (precededByPunctuation && (followedByWhitespace || followedByPunctuation))))
            {
                isRight = true;
            }

            if (isLeft && isRight)
            {
                this.flank = Flank.Both;
            }
            else if (isLeft)
            {
                this.flank = Flank.Left;
            }
            else if (isRight)
            {
                this.flank = Flank.Right;
            }
        }
Exemple #8
0
 public void SetAttackerFortificationCard(FortificationCard card, Flank flank)
 {
     attackerFortification[flank] = card;
 }
Exemple #9
0
 // TODO: A more accurate algorithm than "is your position on the flank"
 public static bool IsOnFlank(int x, int y, Unit unit, Flank flank)
 {
     //return AIUtils.FormationDictionary[unit.UnitFormation].IsOnFlank(x, y, unit, flank);
     return(true); // Let's just restrict units to their exact lane
 }
Exemple #10
0
 public abstract bool IsOnFlank(int x, int y, Unit unit, Flank flank);
Exemple #11
0
 public void ApplyFortificationCard(CurrentPlayer player, FortificationCard card, Flank flank)
 {
     attacks[player].SetAttackerFortificationCard(card, flank);
     attacks[player == CurrentPlayer.FIRST ? CurrentPlayer.SECOND : CurrentPlayer.FIRST].SetDeffenderFortificationCard(card, flank);
 }
Exemple #12
0
 public void ApplySkillsDeffender(Flank flank, Skills skills)
 {
     this.deffenderSkills[flank] = skills;
 }
Exemple #13
0
 public void AddDeffenders(List <SquadCard> squad, Flank flank)
 {
     deffender[flank] = squad;
 }
Exemple #14
0
 public FortificationCard GetDeffenderFortificationCard(Flank flank)
 {
     return(deffenderFortification[flank]);
 }
Exemple #15
0
 public void SetDeffenderFortificationCard(FortificationCard card, Flank flank)
 {
     deffenderFortification[flank] = card;
 }
Exemple #16
0
 public void DropFortification(CurrentPlayer player, Flank flank)
 {
     fields[player].DropCard(attacks[player].GetDeffenderFortificationCard(flank));
     attacks[player].SetDeffenderFortificationCard(null, flank);
 }
Exemple #17
0
 public int GetCardsCount(CurrentPlayer player, Flank flank)
 {
     return(fields[player].flanks[flank].Count);
 }
Exemple #18
0
 public void SetDeffenders(CurrentPlayer player, List <SquadCard> cards, Flank flank)
 {
     attacks[player == CurrentPlayer.FIRST ? CurrentPlayer.SECOND : CurrentPlayer.FIRST].AddDeffenders(cards, flank);
 }
Exemple #19
0
 public void SetAttackers(CurrentPlayer player, List <SquadCard> cards, Flank flank)
 {
     attacks[player].AddAttackers(cards, flank);
 }
Exemple #20
0
 public void AddCardsToFlank(CurrentPlayer player, HashSet <SquadCard> cards, Flank flank)
 {
     fields[player].flanks[flank].UnionWith(cards);
 }
Exemple #21
0
 public FortificationCard GetAttackerFortificationCard(Flank flank)
 {
     return(attackerFortification[flank]);
 }
Exemple #22
0
 public bool IsOnFlank(FactionName faction, Flank flank)
 {
     return(true);
 }
Exemple #23
0
 public void AddAttackers(List <SquadCard> squad, Flank flank)
 {
     attacker[flank] = squad;
 }
Exemple #24
0
 public CommandorCard GetCommandor(Flank flank)
 {
     return(flank == Flank.Left ? commandorLeft : commandorRight);
 }
Exemple #25
0
 public void ApplySkillsAttacker(Flank flank, Skills skills)
 {
     this.attackerSkills[flank] = skills;
 }
Exemple #26
0
    /// <summary>
    /// Runs a full combat turn between two squads
    /// </summary>
    /// <param name="attacker"></param>
    /// <param name="defender"></param>
    public static void CombatTurn(Squad attacker, Squad defender)
    {
        //Squads make initial formation
        //TODO: FRONTLINE AND BACKLINE DIFFERENCIATION
        //FOR NOW: Seperate in 3 groups as equal as possible
        Flank[] flanks;
        FormInitialFlanks(attacker, defender, out flanks);

        //BEGIN LOOP
        //Initiative is rolled
        while (!CombatIsOver(attacker, defender))
        {
            Debug.Log("NEW TURN");
            List <IUnit> turnOrder = TurnOrder(attacker, defender);
            //Units attack from possible targets depending on formation
            for (int i = 0; i < turnOrder.Count; i++)
            {
                IUnit unit = turnOrder[i];
                //Skip if unit is dead
                if (!unit.isAlive || unit.isHarmless)
                {
                    continue;
                }

                //Find in which flank the unit is
                Flank current = null;
                bool  isSideA = false;
                for (int j = 0; j < 3 && current == null; j++)
                {
                    if (flanks[j].FindUnit(unit, out isSideA))
                    {
                        current = flanks[j];
                    }
                }
                //Error case?
                if (current == null)
                {
                    Debug.LogWarning("Current could not be found");
                    continue;
                }

                //Acquire random target
                IUnit target = current.RandomTarget(isSideA);
                //Skip if flank was defeated
                if (target == null)
                {
                    continue;
                }

                //Resolve attack
                if (ResolveAttack(unit, target))
                {
                    //Remove dead soldiers
                    current.FlankMemberDied(target);
                    //turnOrder.Remove(target);
                }
            }

            //Flanks with no more targets join another flank for next round
            RearrangeFlanks(flanks);
        }

        Debug.Log("BATTLE OVER");
    }
Exemple #27
0
    static void FormInitialFlanks(Squad squadA, Squad squadB, out Flank[] flanks)
    {
        flanks = new Flank[3];
        for (int i = 0; i < 3; i++)
        {
            flanks[i] = new Flank();
        }

        //////////////////////////
        //First squad
        //////////////////////////
        List <IUnit> remaining = new List <IUnit>();

        remaining.AddRange(squadA.members);
        Debug.Log(squadA.members[0] + " - " + remaining[0]);

        //Leaders in the middle
        flanks[1].AddMember(squadA.leader, true);
        remaining.Remove(squadA.leader);

        //Flanks are chosen by preferences if present, else by combat skill
        //TODO: Preferences
        remaining = remaining.OrderByDescending(x => x.s_combat).ToList();

        //Add units in this following order: Left, right, middle
        while (true)
        {
            flanks[0].AddMember(remaining[0], true);
            remaining.RemoveAt(0);
            if (remaining.Count == 0)
            {
                break;
            }

            flanks[2].AddMember(remaining[0], true);
            remaining.RemoveAt(0);
            if (remaining.Count == 0)
            {
                break;
            }

            flanks[1].AddMember(remaining[0], true);
            remaining.RemoveAt(0);
            if (remaining.Count == 0)
            {
                break;
            }
        }

        //////////////////////////
        //Second squad
        //////////////////////////
        remaining.Clear();
        remaining.AddRange(squadB.members);

        //Leaders in the middle
        flanks[1].AddMember(squadB.leader, false);
        remaining.Remove(squadB.leader);

        //Flanks are chosen by preferences if present, else by combat skill
        //TODO: Preferences
        remaining = remaining.OrderByDescending(x => x.s_combat).ToList();

        //Add units in this following order: Left, right, middle
        while (true)
        {
            flanks[0].AddMember(remaining[0], false);
            remaining.RemoveAt(0);
            if (remaining.Count == 0)
            {
                break;
            }

            flanks[2].AddMember(remaining[0], false);
            remaining.RemoveAt(0);
            if (remaining.Count == 0)
            {
                break;
            }

            flanks[1].AddMember(remaining[0], false);
            remaining.RemoveAt(0);
            if (remaining.Count == 0)
            {
                break;
            }
        }

        Debug.Log("Final flank size " +
                  flanks[0].sideA.Count + " - " + flanks[0].sideB.Count +
                  flanks[1].sideA.Count + " - " + flanks[1].sideB.Count +
                  flanks[2].sideA.Count + " - " + flanks[2].sideB.Count);
    }
Exemple #28
0
 public FortificationCard GetFortificationCard(CurrentPlayer player, Flank flank)
 {
     return(attacks[player].GetAttackerFortificationCard(flank));
 }