public void RoundEngine_RoundNextTurn_No_Characters_Should_Return_GameOver()
        {
            Engine.MonsterList.Clear();

            // Arrange
            var Character = new CharacterModel
            {
                Speed           = 20,
                Level           = 1,
                CurrentHealth   = 1,
                ExperienceTotal = 1,
                Name            = "Characer",
                ListOrder       = 1,
            };

            // Add each model here to warm up and load it.
            Game.Helpers.DataSetsHelper.WarmUp();

            Engine.CharacterList.Clear();

            Engine.MonsterList.Add(new PlayerInfoModel(Character));

            // Make the List
            Engine.PlayerList = Engine.MakePlayerList();

            // Act
            var result = Engine.RoundNextTurn();

            // Reset

            // Assert
            Assert.AreEqual(RoundEnum.GameOver, result);
        }
        public void BattleEngine_GameOver_Round_1_Should_Pass()
        {
            /*
             * Test to have character lose battle in first round
             *
             * 1 Character
             *      1 HP
             *
             * 1 Monster
             *
             * Monster continually attacks Character until it dies
             * Game state should be game over
             *
             */

            //Arrange

            // Add Characters

            Engine.MaxNumberCharacters = 1;

            // To See Level UP happening, a character needs to be close to the next level
            var Character = new CharacterModel
            {
                Level         = 20,
                CurrentHealth = 1,
                MaxHealth     = 0
            };

            Engine.CharacterList.Add(Character);

            Engine.MaxNumberMonsters = 1;

            Engine.StartBattle(false);

            var Monster = Engine.EntityList.Where(a => a.EntityType == EntityTypeEnum.Monster).FirstOrDefault();
            var Player  = Engine.EntityList.Where(a => a.Id == Character.Id).FirstOrDefault();

            //Act
            while (Player.Alive)
            {
                Engine.TurnAsAttack(Monster, Player);
            }

            var result = Engine.RoundNextTurn();

            //Reset
            Engine.MonsterList.Clear();
            Engine.CharacterList.Clear();
            Engine.EntityList.Clear();
            Engine.MaxNumberMonsters = 6;

            //Assert
            Assert.AreEqual(RoundEnum.GameOver, result);
        }
        public void RoundEngine_RoundNextTurn_No_Characters_Should_Return_GameOver()
        {
            // Arrange
            var Character = new CharacterModel
            {
                Speed           = 20,
                Level           = 1,
                CurrentHealth   = 1,
                TotalExperience = 1,
                Name            = "Character"
            };

            var Monster = new MonsterModel
            {
                Speed           = 20,
                Level           = 1,
                CurrentHealth   = 1,
                ExperienceGiven = 1,
                Name            = "Monster",
            };

            // Add each model here to warm up and load it.
            Game.Helpers.DataSetsHelper.WarmUp();

            Engine.CharacterList.Clear();

            // Don't add character to battle
            //Engine.CharacterList.Add(Character);

            Engine.MonsterList.Clear();
            Engine.MonsterList.Add(Monster);

            // Make the List
            Engine.EntityList = Engine.MakeEntityList();

            // Act
            var result = Engine.RoundNextTurn();

            // Reset

            // Assert
            Assert.AreEqual(RoundEnum.GameOver, result);
        }
Example #4
0
        private bool _needsRefresh; // boolean for whether data is stale or not

        // Constructor: loads data and listens for broadcast from views
        public BattleViewModel()
        {
            Title = "Battle Begin";

            // Initialize battle engine
            BattleEngine = new BattleEngine();

            // Create observable collections
            SelectedCharacters  = new ObservableCollection <Character>();
            AvailableCharacters = new ObservableCollection <Character>();
            SelectedMonsters    = new ObservableCollection <Monster>();
            availItems          = new ObservableCollection <Item>();

            // Load data command
            LoadDataCommand = new Command(async() => await ExecuteLoadDataCommand());

            // Load the data
            ExecuteLoadDataCommand().GetAwaiter().GetResult();

            // For adding Characters to party
            MessagingCenter.Subscribe <CharactersSelectPage, IList <Character> >(this, "AddData", (obj, data) =>
            {
                SelectedCharacters.Clear();
                BattleEngine.CharacterList = data.ToList <Character>();
                foreach (var c in data)
                {
                    SelectedCharacters.Add(c);
                }
            });

            //Messages for adding a character to party
            MessagingCenter.Subscribe <CharactersSelectPage, Character>(this, "AddSelectedCharacter", async(obj, data) =>
            {
                SelectedListAdd(data);
            });

            // Messages for removing a character from the party
            MessagingCenter.Subscribe <CharactersSelectPage, Character>(this, "RemoveSelectedCharacter", async(obj, data) =>
            {
                SelectedListRemove(data);
            });

            //Messages to start new round
            MessagingCenter.Subscribe <BattleEngine, RoundEnum>(this, "NewRound", async(obj, data) =>
            {
                BattleEngine.NewRound();
            });

            //Messages for round next turn
            MessagingCenter.Subscribe <BattlePage, RoundEnum>(this, "RoundNextTurn", async(obj, data) =>
            {
                ExecuteLoadDataCommand().GetAwaiter().GetResult();
                BattleEngine.RoundNextTurn();
            });

            // Messages to end battle
            MessagingCenter.Subscribe <BattlePage, RoundEnum>(this, "EndBattle", async(obj, data) =>
            {
                BattleEngine.EndBattle();
            });
        }
Example #5
0
        // If UI is enabled, there will be popups that guide you through battle as you click the next turn button
        // If not, it will drop you straight to the result page
        public async void BattleEngineStart_Command(object sender, EventArgs e)
        {
#if !EnableUI
            do
            {
                // If the round is over start a new one...
                if (RoundResult == RoundEnum.NewRound)
                {
                    myBattleEngine.NewRound();
                }

                PlayerInfo currentPlayer = myBattleEngine.GetNextPlayerInList();

                // Check if character or monster
                if (currentPlayer.PlayerType == PlayerTypeEnum.Character)
                {
                    string id = null;
                    RoundResult = myBattleEngine.RoundNextTurn(id);
                }

                // else monster turn
                else
                {
                    RoundResult = myBattleEngine.RoundNextTurn();
                }

                Debug.WriteLine(myBattleEngine.TurnMessage);
            } while (RoundResult != RoundEnum.GameOver);
#endif

#if EnableUI
            if (RoundResult != RoundEnum.GameOver)
            {
                // If the round is over start a new one...
                if (RoundResult == RoundEnum.NewRound)
                {
                    myBattleEngine.NewRound();

                    var answer = await DisplayAlert("New Round", "Begin", "Start", "Cancel");

                    if (answer)
                    {
                        await Navigation.PushAsync(new ManualBattlePage(myBattleEngine, RoundResult));

                        return;
                    }
                }

                PlayerInfo currentPlayer = myBattleEngine.GetNextPlayerInList();

                // Check if character or monster
                if (currentPlayer.PlayerType == PlayerTypeEnum.Character)
                {
                    string id = null;

                    var dataset = myBattleEngine.MonsterList.Where(a => a.Alive).ToList();

                    string[] names = new string[dataset.Count];
                    string[] IDs   = new string[dataset.Count];

                    int ctr = 0;

                    foreach (var data in dataset)
                    {
                        names[ctr] = data.Name;
                        IDs[ctr]   = data.Guid;
                        ctr++;
                    }

                    var action = await DisplayActionSheet("Select Monster", null, null, names);

                    ctr = 0;

                    foreach (var data in dataset)
                    {
                        if (action == data.Name)
                        {
                            id = IDs[ctr];
                            break;
                        }

                        ctr++;
                    }

                    RoundResult = myBattleEngine.RoundNextTurn(id);
                }

                // else monster turn
                else
                {
                    RoundResult = myBattleEngine.RoundNextTurn();
                }


                var response = await DisplayAlert("Turn Result", myBattleEngine.TurnMessage, "Continue", "Quit");

                if (!response)
                {
                    await Navigation.PushAsync(new OpeningPage());
                }
            }
#endif

            if (RoundResult == RoundEnum.GameOver)
            {
                myBattleEngine.EndBattle();

                string result =
                    "Battle Ended" +
                    " Total Experience :" + myBattleEngine.BattleScore.ExperienceGainedTotal +
                    " Rounds :" + myBattleEngine.BattleScore.RoundCount +
                    " Turns :" + myBattleEngine.BattleScore.TurnCount +
                    " Monster Kills :" + myBattleEngine.BattleScore.MonstersKilledList;

                var answer = await DisplayAlert("Game Result", result, "Set Name", "Restart");

                if (answer)
                {
                    // Link to enter name
                    await Navigation.PushAsync(new EditScorePage(new ScoreDetailViewModel(myBattleEngine.BattleScore)));
                }

                else
                {
                    await Navigation.PushAsync(new OpeningPage());
                }
            }
        }
Example #6
0
 /// <summary>
 /// Call to the engine for the NextRound to Happen
 /// </summary>
 public void RoundNextTurn()
 {
     BattleEngine.RoundNextTurn();
 }