Boss Combat Outcomes - UQcsse3200/2024-studio-2 GitHub Wiki

Overview

Handle the event triggers and event listeners after defeating or losing to the bosses in combat.

Implementation

In CombatManager, checking for combat ends to trigger the appropriate event

    /**
     * Checks if combat has ended by evaluating the health of both the player and the enemy.
     * Triggers events based on whether the player has won or lost the combat.
     */
    private void checkCombatEnd() {
        if (playerStats.getHealth() <= 0) {
            if (enemy.getComponent(CombatStatsComponent.class).isBoss()) {
                this.getEntity().getEvents().trigger("bossCombatLoss", enemy);
                GameState.resetState();
                SaveHandler.delete(GameState.class, "saves", FileLoader.Location.LOCAL);
            } else {
                this.getEntity().getEvents().trigger("combatLoss");
                //Clear inventory/other normal death events
            }
            // nullifyCombatDialogueListener(); // remove the listener added for animation syncing
        } else if (enemyStats.getHealth() <= 0) {
            if (enemy.getComponent(CombatStatsComponent.class).isBoss()) {
                entity.getEvents().trigger("bossCombatWin", enemy);
            } else {
                this.getEntity().getEvents().trigger("combatWin", enemy);
            }
            // nullifyCombatDialogueListener(); // remove the listener added for animation syncing
        }
    }

In 'CombatAction', listen to event bossCombatWin and bossCombatLoss

  public void create() {
      entity.getEvents().addListener("bossCombatWin", this::onBossCombatWin);
      entity.getEvents().addListener("bossCombatLoss", this::onBossCombatLoss);
  }

  private void onBossCombatWin(Entity bossEnemy) {
    logger.info("Switching back to main game after defeating kangaroo boss.");

    if (bossEnemy.getEnemyType() == Entity.EnemyType.KANGAROO) {
      entity.getEvents().trigger("landBossDefeated");
    } else if (bossEnemy.getEnemyType() == Entity.EnemyType.WATER_BOSS) {
      entity.getEvents().trigger("waterBossDefeated");
    } else if (bossEnemy.getEnemyType() == Entity.EnemyType.AIR_BOSS) {
      entity.getEvents().trigger("airBossDefeated");
    }

    // Reset player's stamina.
    manager.getPlayer().getComponent(CombatStatsComponent.class).setStamina(100);
    this.manager.getPlayer().getEvents().trigger("defeatedEnemy",this.manager.getEnemy());
    // For CombatStatsDisplay to update
    entity.getEvents().trigger("onCombatWin", manager.getPlayerStats());

    // For CombatButtonDisplay DialogueBox
    entity.getEvents().trigger("endOfBossCombatDialogue", bossEnemy, true);
    int enemyExp = bossEnemy.getComponent(CombatStatsComponent.class).getExperience();
    manager.getPlayer().getComponent(CombatStatsComponent.class).addExperience(enemyExp);
  }

  private void onBossCombatLoss(Entity enemy) {
    logger.info("Returning to main game screen after combat loss.");

    // For CombatButtonDisplay DialogueBox
    entity.getEvents().trigger("endOfBossCombatDialogue", enemy, false);
  }

Testing Plan

Visual testing, with captioning to explain: https://youtu.be/Ny-1nAlynto

https://github.com/user-attachments/assets/8a6d154b-2e65-4957-bd56-997df252fc82