CombatActions - UQcsse3200/2024-studio-2 GitHub Wiki
Overview
The CombatActions
class is a crucial component in managing combat-related events and interactions within the game. It extends the Component
class and is responsible for listening to various combat events, triggering appropriate responses, and managing transitions between different game states during and after combat.
Class Diagram
classDiagram
class Component {
+create()
+dispose()
}
class CombatActions {
-GdxGame game
-CombatManager manager
-Screen previousScreen
-ServiceContainer previousServices
+CombatActions(GdxGame, CombatManager, Screen, ServiceContainer)
+create()
-onCombatWin(Entity)
-onCombatLoss(Entity)
-onBossCombatWin(Entity)
-onBossCombatLoss(Entity)
-onAttack(Screen, ServiceContainer)
-onGuard(Screen, ServiceContainer)
-onSleep(Screen, ServiceContainer)
-onItems(Screen, ServiceContainer)
+dispose()
}
Component <|-- CombatActions
Key Components
- GdxGame: Represents the main game instance, used for screen transitions.
- CombatManager: Manages the combat logic and state.
- Screen: Represents the previous screen to return to after combat.
- ServiceContainer: Contains services used in the main game screen.
Initialization
The CombatActions
class is initialized with the following parameters:
public CombatActions(GdxGame game, CombatManager manager, Screen previousScreen, ServiceContainer previousServices) {
this.game = game;
this.manager = manager;
this.previousServices = previousServices;
this.previousScreen = previousScreen;
}
Event Listeners
The create()
method sets up various event listeners:
@Override
public void create() {
entity.getEvents().addListener("combatWin", this::onCombatWin);
entity.getEvents().addListener("combatLoss", this::onCombatLoss);
entity.getEvents().addListener("bossCombatWin", this::onBossCombatWin);
entity.getEvents().addListener("bossCombatLoss", this::onBossCombatLoss);
entity.getEvents().addListener("Attack", this::onAttack);
entity.getEvents().addListener("Guard", this::onGuard);
entity.getEvents().addListener("Sleep", this::onSleep);
entity.getEvents().addListener("Items", this::onItems);
// ... other listeners ...
}
Key Methods
onCombatWin(Entity enemy)
Handles the event when the player wins a combat sequence:
private void onCombatWin(Entity enemy) {
game.setEnemyWasBeaten(true);
this.manager.getPlayer().getEvents().trigger("defeatedEnemy", this.manager.getEnemy());
int enemyExp = enemy.getComponent(CombatStatsComponent.class).getExperience();
manager.getPlayer().getComponent(CombatStatsComponent.class).addExperience(enemyExp);
entity.getEvents().trigger("onCombatWin", manager.getPlayerStats());
entity.getEvents().trigger("endOfCombatDialogue", enemy, true);
}
onCombatLoss(Entity enemy)
Handles the event when the player loses a combat sequence:
private void onCombatLoss(Entity enemy) {
int lossExp = 0;
int maxPlayerHealth = manager.getPlayerStats().getMaxHealth();
int maxPlayerHunger = manager.getPlayerStats().getMaxHunger();
int statusRestoreMult = 2;
manager.getPlayerStats().setExperience(lossExp);
this.manager.getPlayer().getComponent(PlayerInventoryDisplay.class).clearInventory();
manager.getPlayerStats().setHealth(maxPlayerHealth/statusRestoreMult);
manager.getPlayerStats().setHunger(maxPlayerHunger/statusRestoreMult);
entity.getEvents().trigger("onCombatLoss", manager.getPlayerStats());
entity.getEvents().trigger("endOfCombatDialogue", enemy, false);
}
Combat Action Methods
Methods like onAttack()
, onGuard()
, onSleep()
, and onItems()
handle specific combat actions:
private void onAttack(Screen screen, ServiceContainer container) {
manager.onPlayerActionSelected("ATTACK");
entity.getEvents().trigger("onAttack", manager.getPlayerStats(), manager.getEnemyStats());
}
private void onGuard(Screen screen, ServiceContainer container) {
manager.onPlayerActionSelected("GUARD");
entity.getEvents().trigger("onGuard", manager.getPlayerStats(), manager.getEnemyStats());
}
// Similar implementations for onSleep() and onItems()
Sequence Diagram
The following sequence diagram illustrates the flow of a typical combat action:
sequenceDiagram
participant U as User
participant CB as CombatButtonDisplay
participant CA as CombatActions
participant CM as CombatManager
participant E as Entity
participant CSD as CombatStatsDisplay
U->>CB: Click Attack Button
CB->>CA: Trigger "Attack" event
CA->>CM: onPlayerActionSelected("ATTACK")
CA->>E: Trigger "onAttack" event
E->>CSD: Update display
CM->>CA: Return combat result
CA->>E: Trigger appropriate event (win/loss)
E->>CSD: Update final stats
Usage
To use the CombatActions
class:
- Create an instance of
CombatActions
with the required parameters. - Add it as a component to the UI entity of the CombatScreen.
- The class will automatically handle combat-related events and transitions.
Example:
CombatActions combatActions = new CombatActions(game, combatManager, previousScreen, previousServices);
uiEntity.addComponent(combatActions);