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; }
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++; } }