-
Notifications
You must be signed in to change notification settings - Fork 1
CombatActions
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.
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
- 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.
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;
}
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 ...
}
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);
}
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);
}
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()
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
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);