예제 #1
0
        //this method will be called by when it's character's turn
        public void CharacterAutoTurn(Creature character, Creature target, Score score)
        {
            string message = string.Empty;

            GetNewLoc(character, target);   //will get the character's new location
            Move(character);
            if (!CanHit(character, target)) //check if the character can hit the target
            {
                return;
            }
            bool hit = turn.Attack(character, target);//character attacks the target

            if (hit)
            {
                message = "Character " + character.Name + " attacks " + target.Name;
                Debug.WriteLine(message);

                int damageToDo = turn.DamageToDo(character);    //Damage for the character will be calculated
                int xpToGive   = MC.GiveXP(target, damageToDo); //Experience will be calaculated for the character
                totalXP += xpToGive;
                CC.TestForLevelUp(character, xpToGive);         //Check the Level up
                bool monsterAlive;                              //after the attack it will check if the monster is alive or not
                MC.TakeDamage(target, damageToDo);
                monsterAlive = target.Alive;

                if (monsterAlive == false)//when monsteralive is false that means its dead
                {
                    message = string.Empty;
                    Debug.WriteLine("Monster is dead");
                    score.MonsterSlainNumber++;

                    // Drop Items to item Pool
                    var myItemList = MC.DropItems(target);
                    //Add Items to the Score List
                    message = "Dropped Items";
                    foreach (var item in myItemList)
                    {
                        score.TotalItemsDropped += item.FormatOutput() + "\n";
                        message += "\n" + item.Name;
                    }
                    ItemPool.AddRange(myItemList);//Dropped items will added to the ItemPool

                    Debug.WriteLine(message);

                    //the dead monster will be removed from the turn order, monster's dataset, and the GameBoard
                    TurnOrder.Remove(target);
                    CurrMonsters.Dataset.Remove(target);
                    GameBoardRemove(target);
                    Creature tempMonster = originalMonsters.Where(a => a.Id == target.Id).FirstOrDefault();
                    score.TotalMonstersKilled += tempMonster.FormatOutput(tempMonster) + "\n";//Total monsters killed is calculated

                    message = "Monster Removed :" + target.Name;
                    Debug.WriteLine(message);
                }
            }
        }
        public Score AutoBattle(Score score, int round, int Potions, int miracle)
        {
            //without asking the player for input
            //this will run the turns in a loop until either all the team is dead or all the monsters are
            BattleScreen screen = new BattleScreen();
            string       message;

            message = "Battle Start" + " Characters :" + team.Dataset.Count;
            Debug.WriteLine(message);
            message = "Battle Start" + " Monsters :" + CurrMonsters.Dataset.Count;
            Debug.WriteLine(message);
            while (CurrMonsters.Dataset.Count > 0)
            {
                if (team.Dataset.Count <= 0)
                {
                    break;
                }
                for (int i = 0; i < TurnOrder.Count; i++)
                {
                    //screen.BattleMessages(message);

                    //.WriteLine(Text);

                    //screen.BattleMessages(message);

                    message = "New Turn :" + TurnOrder[i].Name;
                    Debug.WriteLine(message);
                    screen.BattleMessages(message);

                    TurnController turn = new TurnController();
                    turns++;
                    if (TurnOrder[i].Type == 0)
                    {
                        Creature character = TurnOrder[i];
                        //int loc = GetNewLoc(character, GameBoard);
                        //GameBoard = turn.Move(character, loc, GameBoard);

                        Creature target = AutoTarget(character);//get a monster target for the character
                        if (target == null)
                        {
                            break;
                        }
                        if (!CanHit(character, target))
                        {
                            continue;
                        }

                        int hit = turn.Attack(character, target);
                        //Debug.WriteLine(hit.ToString());
                        if (GameGlobals.FocusedAttack == true)
                        {
                            bool          hasItem = false;
                            List <string> ids     = character.GetItemIDs();
                            if (ids.Count > 0)
                            {
                                hasItem = true;
                            }
                            bool wantsTo = false;
                            if (target.CurrHealth > (5 * turn.DamageToDo(character)))//5 must be set to 1 to see in autobattle
                            {
                                wantsTo = true;
                            }
                            if (character.CanFocusAttack && hasItem && wantsTo)
                            {
                                hit = 3;
                                character.CanFocusAttack = false;
                            }
                        }
                        if (GameGlobals.AllowRoundHealing)
                        {
                            if (character.CurrHealth < (character.MaxHealth * .2))
                            {
                                if (Potions > 0)
                                {
                                    character.CurrHealth = character.MaxHealth;
                                    Potions--;
                                    Debug.WriteLine("Potion used, Potions Left " + Potions);
                                    hit = 0;
                                }
                            }
                        }
                        if (hit > 0)
                        {
                            int damageToDo = turn.DamageToDo(character);
                            if (hit == 2)//critical hit
                            {
                                damageToDo = damageToDo * 2;
                                Debug.WriteLine(character.Name + " critical hit " + target.Name);
                            }
                            if (hit == 3)//focused hit
                            {
                                Item          lowValue = null;
                                int           lowest   = 1000;
                                List <string> itemIds  = character.GetItemIDs();
                                var           items    = ItemsViewModel.Instance.Dataset;
                                for (int j = 0; j < itemIds.Count; j++)
                                {
                                    var currItem  = items.Where(a => a.Id == itemIds[j]).FirstOrDefault();
                                    int newLowest = currItem.Value;
                                    if (lowest > newLowest)
                                    {
                                        lowest   = newLowest;
                                        lowValue = currItem;
                                    }
                                }
                                character.DropOneItem(lowValue.Id);
                                damageToDo = damageToDo * 10;
                                bool monsterAliveAfterFocus;
                                MC.TakeDamage(target, damageToDo);
                                Debug.WriteLine(character.Name + " performed a Focused Attack and lost item " + lowValue.Name);
                                monsterAliveAfterFocus = target.Alive;
                                if (monsterAliveAfterFocus == false)
                                {
                                    message = "Monster dead ";
                                    Debug.WriteLine(message);
                                    screen.BattleMessages(message);

                                    TurnOrder.Remove(target);
                                    //score.TotalMonstersKilled.Add(target);
                                    CurrMonsters.Dataset.Remove(target);
                                    GameBoardRemove(target);

                                    message = "Monster Removed :" + target.Name;
                                    Debug.WriteLine(message);
                                    screen.BattleMessages(message);
                                }
                                continue;
                            }
                            int xpToGive = MC.GiveXP(target, damageToDo);
                            totalXP += xpToGive;
                            CC.TestForLevelUp(character, xpToGive);
                            bool monsterAlive;
                            MC.TakeDamage(target, damageToDo);
                            monsterAlive = target.Alive;

                            if (monsterAlive == false)
                            {
                                message = "Monster dead ";
                                Debug.WriteLine(message);
                                screen.BattleMessages(message);

                                ItemPool.AddRange(MC.DropItems(target));
                                message = "Items Dropped :" + ItemPool.Count.ToString();
                                Debug.WriteLine(message);
                                screen.BattleMessages(message);

                                TurnOrder.Remove(target);
                                //score.TotalMonstersKilled.Add(target);
                                CurrMonsters.Dataset.Remove(target);
                                GameBoardRemove(target);

                                message = "Monster Removed :" + target.Name;
                                Debug.WriteLine(message);
                                screen.BattleMessages(message);

                                if (GameGlobals.MonsterHandGrenade == true && GameGlobals.Grenade == true)
                                {
                                    GameGlobals.Grenade = false;
                                    int    dateSeed      = DateTime.Now.Millisecond;
                                    Random rand          = new Random(dateSeed);
                                    int    grenadeDamage = rand.Next(1, 5) * round;
                                    Debug.WriteLine("Grenade!  " + grenadeDamage.ToString() + " damage");
                                    List <Creature> tempList = new List <Creature>();
                                    foreach (Creature tempC in TurnOrder)
                                    {
                                        tempList.Add(tempC);
                                    }
                                    foreach (Creature creature in tempList)
                                    {
                                        int saveMe = creature.Level + rand.Next(1, 21);
                                        if (saveMe >= (rand.Next(1, 21)))
                                        {
                                            Debug.WriteLine(creature.Name + " has been saved");
                                        }
                                        else
                                        {
                                            Debug.WriteLine(creature.Name + " is taking grenade damage, sucks to be them");
                                            if (creature.Type == 0)
                                            {
                                                CC.TakeDamage(creature, grenadeDamage);
                                                bool characterAliveGrenade = creature.Alive;

                                                if (characterAliveGrenade == false)
                                                {
                                                    message = "Character dead ";
                                                    Debug.WriteLine(message);
                                                    screen.BattleMessages(message);

                                                    ItemPool.AddRange(CC.DropItems(creature));
                                                    message = "Items Dropped :" + ItemPool.Count.ToString();
                                                    Debug.WriteLine(message);
                                                    screen.BattleMessages(message);

                                                    TurnOrder.Remove(creature);
                                                    //add dead character to the score list
                                                    team.Dataset.Remove(creature);
                                                    GameBoardRemove(creature);

                                                    message = "Character Removed :" + creature.Name;
                                                    Debug.WriteLine(message);
                                                    screen.BattleMessages(message);
                                                }
                                            }
                                            else
                                            {
                                                MC.TakeDamage(creature, grenadeDamage);
                                                bool monsterAliveGrenade = creature.Alive;

                                                if (monsterAliveGrenade == false)
                                                {
                                                    message = "Monster dead ";
                                                    Debug.WriteLine(message);
                                                    screen.BattleMessages(message);

                                                    ItemPool.AddRange(MC.DropItems(creature));
                                                    message = "Items Dropped :" + ItemPool.Count.ToString();
                                                    Debug.WriteLine(message);
                                                    screen.BattleMessages(message);

                                                    TurnOrder.Remove(creature);
                                                    //score.TotalMonstersKilled.Add(creature);
                                                    CurrMonsters.Dataset.Remove(creature);
                                                    GameBoardRemove(creature);

                                                    message = "Monster Removed :" + creature.Name;
                                                    Debug.WriteLine(message);
                                                    screen.BattleMessages(message);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if (hit == -1)
                        {
                            int    dateSeed = DateTime.Now.Millisecond;
                            Random rand     = new Random(dateSeed);
                            int    roll     = rand.Next(1, 11);
                            if (GameGlobals.DisableRandomNumbers)
                            {
                                roll = 10;
                            }
                            if (roll == 1)
                            {
                                character.RHandItemID = null;
                            }
                            else if (roll >= 2 && roll <= 4)
                            {
                                if (character.RHandItemID != null)
                                {
                                    var items = ItemsViewModel.Instance.Dataset;
                                    var item  = items.Where(a => a.Id == character.RHandItemID).FirstOrDefault();
                                    if (item != null)
                                    {
                                        ItemPool.Add(item);
                                    }
                                    character.RHandItemID = null;
                                }
                            }
                            else if (roll == 5 || roll == 6)
                            {
                                var allItems = character.GetItemIDs();//get all of the character's items' ids
                                if (allItems.Count > 0)
                                {
                                    int index = rand.Next(allItems.Count);//get a random index for getting an item id
                                    if (GameGlobals.DisableRandomNumbers)
                                    {
                                        index = 0;
                                    }
                                    if (allItems.Count > index)//check for a bad index
                                    {
                                        string itemID = allItems[index];
                                        var    items  = ItemsViewModel.Instance.Dataset;
                                        var    item   = items.Where(a => a.Id == itemID).FirstOrDefault();
                                        if (item != null)//find the item and make sure it is safe to add to the item pool
                                        {
                                            ItemPool.Add(item);
                                        }
                                        character.DropOneItem(itemID);
                                    }
                                }
                            }
                            Debug.WriteLine("Critical miss, case " + roll.ToString());
                        }
                    }
                    else
                    {
                        Creature monster = TurnOrder[i];
                        //int loc = GetNewLoc(monster, GameBoard);
                        //GameBoard = turn.Move(monster, loc, GameBoard);
                        Creature target = AutoTarget(monster);//get a character target for the monster
                        if (target == null)
                        {
                            break;
                        }
                        if (!CanHit(monster, target))
                        {
                            continue;
                        }

                        int hit = turn.Attack(monster, target);
                        //Debug.WriteLine(hit.ToString());
                        if (hit > 0)
                        {
                            int damageToDo = turn.DamageToDo(monster);
                            if (hit == 2)
                            {
                                damageToDo = damageToDo * 2;
                                Debug.WriteLine(monster.Name + " critical hit " + target.Name);
                            }
                            bool characterAlive = CC.TakeDamage(target, damageToDo);
                            if (GameGlobals.MiracleMax == true)
                            {
                                if (!characterAlive && miracle > 0)
                                {
                                    target.Alive      = true;
                                    target.CurrHealth = target.MaxHealth;
                                    miracle--;
                                    Debug.WriteLine("Miracle Max has revived " + target.Name);
                                    GameGlobals.MiracleMax = false;
                                    characterAlive         = target.Alive;
                                }
                            }
                            if (!characterAlive)
                            {
                                message = "Character dead ";
                                Debug.WriteLine(message);
                                screen.BattleMessages(message);

                                ItemPool.AddRange(CC.DropItems(target));
                                message = "Items Dropped :" + ItemPool.Count.ToString();
                                Debug.WriteLine(message);
                                screen.BattleMessages(message);

                                TurnOrder.Remove(target);
                                //add dead character to the score list
                                team.Dataset.Remove(target);
                                GameBoardRemove(target);

                                message = "Character Removed :" + target.Name;
                                Debug.WriteLine(message);
                                screen.BattleMessages(message);
                            }
                        }
                        if (hit == -1)
                        {
                            int    dateSeed = DateTime.Now.Millisecond;
                            Random rand     = new Random(dateSeed);
                            int    roll     = rand.Next(1, 11);
                            if (GameGlobals.DisableRandomNumbers)
                            {
                                roll = 10;
                            }
                            if (roll == 1)
                            {
                                monster.RHandItemID = null;
                            }
                            else if (roll >= 2 && roll <= 4)
                            {
                                if (monster.RHandItemID != null)
                                {
                                    var items = ItemsViewModel.Instance.Dataset;
                                    var item  = items.Where(a => a.Id == monster.RHandItemID).FirstOrDefault();
                                    if (item != null)
                                    {
                                        ItemPool.Add(item);
                                    }
                                    monster.RHandItemID = null;
                                }
                                else
                                {
                                    var items    = ItemsViewModel.Instance.Dataset;
                                    int randItem = rand.Next(items.Count);//find the random item to add to the pool
                                    if (GameGlobals.DisableRandomNumbers)
                                    {
                                        randItem = 0;
                                    }
                                    Item item = new Item();
                                    if (items.Count > randItem)
                                    {
                                        item.Update(items[randItem]);
                                    }

                                    if (item != null)
                                    {
                                        ItemPool.Add(item);
                                    }
                                }
                            }
                            else if (roll == 5 || roll == 6)
                            {
                                var allItems = monster.GetItemIDs();//get all of the character's items' ids
                                if (allItems.Count > 0)
                                {
                                    int index = rand.Next(allItems.Count);//get a random index for getting an item id
                                    if (GameGlobals.DisableRandomNumbers)
                                    {
                                        index = 0;
                                    }
                                    if (allItems.Count > index)//check for a bad index
                                    {
                                        string itemID = allItems[index];
                                        var    items  = ItemsViewModel.Instance.Dataset;
                                        var    item   = items.Where(a => a.Id == itemID).FirstOrDefault();
                                        if (item != null)//find the item and make sure it is safe to add to the item pool
                                        {
                                            ItemPool.Add(item);
                                        }
                                        monster.DropOneItem(itemID);
                                    }
                                }
                                if (allItems.Count == 0)
                                {
                                    var items    = ItemsViewModel.Instance.Dataset;
                                    int randItem = rand.Next(items.Count);//find the random item to add to the pool
                                    if (GameGlobals.DisableRandomNumbers)
                                    {
                                        randItem = 0;
                                    }
                                    Item item = new Item();
                                    if (items.Count > randItem)
                                    {
                                        item.Update(items[randItem]);
                                    }

                                    if (item != null)
                                    {
                                        ItemPool.Add(item);
                                    }
                                }
                            }
                            Debug.WriteLine("Critical miss, case " + roll.ToString());
                        }
                    }
                }
            }
            score.Turns   += turns;
            score.TotalXP += totalXP;
            message        =
                "Battle Ended" +
                " Total Experience :" + totalXP +

                " Turns :" + turns +
                " Monster Kills :" + CurrMonsters.Dataset.Count;
            Debug.WriteLine(message);
            screen.BattleMessages(message);

            return(score);
        }