Пример #1
0
        public BattleCore(Activity context, View view, IEnemy enemy)
        {
            // Start battle music
            MusicManager.Play(MusicManager.EMusicTrack.Battle);

            // Set view
            mainView = view;

            // Set context
            this.context = context;

            // Companions
            companionButtons = new []
            {
                mainView.FindViewById <ImageButton>(Resource.Id.image_battle_companion_0),
                mainView.FindViewById <ImageButton>(Resource.Id.image_battle_companion_1),
                mainView.FindViewById <ImageButton>(Resource.Id.image_battle_companion_2)
            };

            // Show companion info on click
            for (var i = 0; i < companionButtons.Length; i++)
            {
                // Local copies
                var i2 = i;
                var c  = context;

                companionButtons[i].Click += (sender, args) =>
                                             Alert.ShowCompanionInfo(c, AccountManager.CurrentUser.EquippedCompanions[i2]);
            }

            // Animations
            flashAnimation = AnimationUtils.LoadAnimation(context, Resource.Animation.flash);
            var enemyAttackAnimation  = AnimationUtils.LoadAnimation(context, Resource.Animation.enemy_attack);
            var playerAttackAnimation = AnimationUtils.LoadAnimation(context, Resource.Animation.player_attack);
            var shakeAnimation        = AnimationUtils.LoadAnimation(context, Resource.Animation.shake);

            // Load enemy sprite(s)
            var enemySprite = AssetLoader.GetEnemyBitmap(enemy);

            // Enemy image buttons
            enemyButtons = EnemyButtons.ToArray();

            // Enemy health bars
            enemyHealthBars = EnemyHealthBars.ToArray();

            // Player health bar
            var playerHealthBar = view.FindViewById <ProgressBar>(Resource.Id.progress_battle_health);

            playerHealthBar.Progress = AccountManager.CurrentUser.HealthPercentage;

            // Battle handler
            var battleHandler = new BattleHandler(enemyButtons, enemyHealthBars, enemy);

            // Set bitmaps of enemy buttons
            enemyButtons.SetBitmaps(enemySprite);

            // Enemy overlays
            enemyOverlays = EnemyImages;

            // Set first enemy as default selected
            SelectedEnemyIndex = 0;

            ResetEnemies();

            // Load 'selected enemy' frames
            var selectedAnimations = new Drawable[enemyOverlays.Length];

            // Create 3 copies for each enemy
            for (var i = 0; i < selectedAnimations.Length; i++)
            {
                selectedAnimations[i] = AssetLoader.GetAnimatedDrawable(context.Resources, "selected", 2, 400, true);
            }

            // Load image animators
            enemyOverlays.SetDrawable(selectedAnimations);

            // Load action buttons
            actionButtons = new Dictionary <EBattleAction, Button>
            {
                { EBattleAction.Attack, view.FindViewById <Button>(Resource.Id.button_battle_attack) },
                { EBattleAction.Spare, view.FindViewById <Button>(Resource.Id.button_battle_spare) },
                { EBattleAction.Run, view.FindViewById <Button>(Resource.Id.button_battle_run) }
            };

            // When clicking attack
            actionButtons[EBattleAction.Attack].Click += AttackClickEvent;

            void AttackClickEvent(object sender, EventArgs arg)
            {
                if (enemyHealthBars[selectedEnemyIndex].Progress <= 0)
                {
                    return;
                }

                ToggleButtons(false);
                battleHandler.StartAction(selectedEnemyIndex, BattleHandler.EActionType.Attack);
            }

            battleHandler.BattleEnd += won =>
            {
                switch (won)
                {
                case EBattleEndType.Won:
                    End?.Invoke(EBattleEndType.Won);
                    break;

                case EBattleEndType.Lost:
                    End?.Invoke(EBattleEndType.Lost);
                    break;

                case EBattleEndType.Ran:
                    End?.Invoke(EBattleEndType.Ran);
                    break;
                }

                actionButtons[EBattleAction.Attack].Click -= AttackClickEvent;
                actionButtons[EBattleAction.Spare].Click  -= SpareClickEvent;
                actionButtons[EBattleAction.Run].Click    -= RunClickEvent;
            };

            // Player attacks animation in battle
            battleHandler.Animation += (target, index) =>
            {
                context.RunOnUiThread(() =>
                {
                    foreach (var enemyButton in enemyButtons)
                    {
                        enemyButton.Enabled = false;
                    }
                });

                switch (target)
                {
                case BattleHandler.EAnimationTarget.Player:
                    context.RunOnUiThread(() =>
                    {
                        companionButtons[index].StartAnimation(playerAttackAnimation);
                        enemyButtons[index].StartAnimation(shakeAnimation);
                        enemyButtons[index].Animation.AnimationEnd += CompanionAnimationEnd;
                    });
                    break;

                case BattleHandler.EAnimationTarget.Enemy:
                    context.RunOnUiThread(() =>
                    {
                        enemyButtons[index].StartAnimation(enemyAttackAnimation);
                        companionButtons[index].StartAnimation(shakeAnimation);
                        companionButtons[index].Animation.AnimationEnd += CompanionAnimationEnd;
                    });
                    break;
                }
            };

            // When clicking 'run'
            actionButtons[EBattleAction.Run].Click += RunClickEvent;

            void RunClickEvent(object sender, EventArgs arg)
            {
                // Set health to 98% of before
                AccountManager.CurrentUser.Health = (int)(AccountManager.CurrentUser.Health * 0.98f);

                battleHandler.RunAway();
            }

            // When clicking 'spare'
            actionButtons[EBattleAction.Spare].Click += SpareClickEvent;

            void SpareClickEvent(object sender, EventArgs arg)
            {
                var enemyAverageHp = enemyHealthBars.Average(e => e.Progress);
                var enemyLevel     = enemy.Level;
                var playerLevel    = AccountManager.CurrentUser.Level;
                var success        = playerLevel > enemyLevel ? 0.2f : -0.2f;

                success += enemyAverageHp < 25 ? 0.8f : enemyAverageHp < 50 ? 0.4f : 0f;

                if (success >= new Random().NextDouble())
                {
                    End?.Invoke(EBattleEndType.Won);
                }
                else
                {
                    // Disable buttons
                    ToggleButtons(false);

                    // Show text
                    var spareText = view.FindViewById <TextView>(Resource.Id.progress_battle_spare_message_text_view);
                    spareText.Visibility = ViewStates.Visible;

                    // Hide after 2 seconds
                    Task.Run(() =>
                    {
                        Thread.Sleep(2000);
                        spareText.Visibility = ViewStates.Invisible;
                    });

                    // Do the rest of the spare stuff (enemy attacking you)
                    battleHandler.StartAction(selectedEnemyIndex, BattleHandler.EActionType.Spare);
                }
            }

            // Create events when clicking on enemies
            CreateEnemyEvents(enemyButtons);

            // When a enemy dies the button can no longer be clicked.
            battleHandler.EnemyKilled += index =>
            {
                // Disable clicking of enemy again
                enemyButtons[index].Enabled = enemyButtons[index].Clickable = false;

                // Highlight the next enemy
                context.RunOnUiThread(() =>
                                      SelectedEnemyIndex = (SelectedEnemyIndex + 1) % enemyButtons.Length);
            };

            // Set companion images
            for (var i = 0; i < companionButtons.Length; i++)
            {
                companionButtons[i].SetImageBitmap(AssetLoader.GetCompanionBitmap(AccountManager.CurrentUser.EquippedCompanions[i]));
            }

            AccountManager.CurrentUser.HealthChange += health =>
                                                       playerHealthBar.Progress = AccountManager.CurrentUser.HealthPercentage;
        }
Пример #2
0
        private void InitializeMenus()
        {
            int count = 0;

            this.Creatables = new ArrayList()
            {
                "Mario", "Block", "Item", "Enemy", "Pipe", "Misc"
            };
            foreach (String c in Creatables)
            {
                Vector2 Location = new Vector2((count * WindowWidth / Creatables.Count) + 8, 50);
                Button  b        = new Button(Location, c, Font, true);
                this.Buttons.Add(b);
                count++;
            }

            int SetCount      = 0;
            int numCreatables = CreatableHolder.Creatables.Count;

            foreach (ArrayList CreatableSet in CreatableHolder.Creatables)
            {
                int OptionCount      = 0;
                int verticalOffset   = 50;
                int horizontalOffset = 0;
                foreach (Creatable Option in CreatableSet)
                {
                    float   Xpos     = (SetCount * (WindowWidth / numCreatables) + 12) + horizontalOffset;
                    float   Ypos     = 50 + verticalOffset;
                    Vector2 Position = new Vector2(Xpos, Ypos);
                    Button  b        = Option.MakeButton(Position);
                    if (CreatableSet == CreatableHolder.Mario)
                    {
                        MarioButtons.Add(b, Option);
                    }
                    else if (CreatableSet == CreatableHolder.Block)
                    {
                        BlockButtons.Add(b, Option);
                    }
                    else if (CreatableSet == CreatableHolder.Item)
                    {
                        ItemButtons.Add(b, Option);
                    }
                    else if (CreatableSet == CreatableHolder.Pipe)
                    {
                        PipeButtons.Add(b, Option);
                    }
                    else if (CreatableSet == CreatableHolder.Enemy)
                    {
                        EnemyButtons.Add(b, Option);
                    }
                    else
                    {
                        MiscButtons.Add(b, Option);
                    }
                    horizontalOffset += 36;
                    OptionCount++;
                    if (OptionCount == 3)
                    {
                        OptionCount      = 0;
                        horizontalOffset = 0;
                        verticalOffset  += 50;
                    }
                }
                SetCount++;
            }
        }