Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Added spectacting
  • Loading branch information
AlexanderNorup committed Oct 26, 2023
commit 5de6ffba7b55b0dd766addd61b09e46b2d6dcd00
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package dk.sdu.mmmi.modulemon.BattleScene;

import dk.sdu.mmmi.modulemon.common.drawing.MathUtils;

public class BattleSpeedController {

private static final int incrementAmount = 200;
private int speed = 1000;

public void increaseSpeed(){
speed +=incrementAmount;
}

public void decreaseSpeed(){
speed = Math.max(0, speed - incrementAmount);
}

public void setSpeed(int speed){
this.speed = Math.max(0, speed);
}

public int getSpeed(){
return speed;
}

@Override
public String toString() {
return "Battle delay: " + speed + "ms";
}
}
70 changes: 62 additions & 8 deletions src/main/java/dk/sdu/mmmi/modulemon/BattleScene/BattleView.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public class BattleView implements IGameViewService, IBattleView {
private Sound _winSound;
private Sound _loseSound;
private MenuState menuState = MenuState.DEFAULT;
private BattleSpeedController forcedAIDelay;
private Queue<BaseAnimation> blockingAnimations;
private Queue<BaseAnimation> backgroundAnimations;
private IMonsterRegistry monsterRegistry;
Expand Down Expand Up @@ -134,6 +135,7 @@ public void startBattle(List<IMonster> playerMonsters, List<IMonster> enemyMonst
_battleMusic.play();
_battleMusic.setLooping(true);
menuState = MenuState.DEFAULT;
forcedAIDelay = new BattleSpeedController();
_battleScene.setActionTitle("Your actions:");
_battleScene.setActions(this.defaultActions);

Expand All @@ -147,11 +149,11 @@ public void startBattle(List<IMonster> playerMonsters, List<IMonster> enemyMonst

private void setBattleAIFactory() {
IBattleAIFactory desiredAI;
if(settings.getSetting("AI").equals("MCTS")){
if (settings.getSetting("AI").equals("MCTS")) {
desiredAI = new MCTSBattleAIFactory();
} else if(settings.getSetting("AI").equals("Simple")){
} else if (settings.getSetting("AI").equals("Simple")) {
desiredAI = new dk.sdu.mmmi.modulemon.SimpleAI.BattleAIFactory();
} else {
} else {
desiredAI = new dk.sdu.mmmi.modulemon.BattleAI.BattleAIFactory();
((BattleAIFactory) desiredAI).setSettingsService(settings);
}
Expand Down Expand Up @@ -221,6 +223,11 @@ public void update(GameData gameData, IGameViewManager gameViewManager) {
}
stuckSince = 0; // No longer stuck.

var enemyAi = _battleSimulation.getOpponentAIFactory();
var playerAi = _battleSimulation.getPlayerAIFactory();
_battleScene.setEnemyControllerName(enemyAi == null ? "No AI" : enemyAi.toString());
_battleScene.setPlayerControllerName(playerAi == null ? "Your monster" : playerAi.toString());

if (settings != null) {
if (_battleMusic.getVolume() != (int) settings.getSetting(SettingsRegistry.getInstance().getMusicVolumeSetting()) / 100f) {
_battleMusic.setVolume((int) settings.getSetting(SettingsRegistry.getInstance().getMusicVolumeSetting()) / 100f);
Expand Down Expand Up @@ -286,17 +293,25 @@ public void update(GameData gameData, IGameViewManager gameViewManager) {
if (event.getUsingParticipant().isPlayerControlled()) {
//Player attacked
PlayerBattleAttackAnimation battleAnimation = new PlayerBattleAttackAnimation(_battleScene, getAttackSound(event.getMove()), settings);
battleAnimation.setOnEventDone(() -> {
addEmptyAnimation(1000, true);
_battleScene.setTextToDisplay("...");
});
if (forcedAIDelay.getSpeed() > 0) {
battleAnimation.setOnEventDone(() -> {
addEmptyAnimation(forcedAIDelay.getSpeed(), true);
_battleScene.setTextToDisplay("...");
});
}
battleAnimation.start();
blockingAnimations.add(battleAnimation);
_battleScene.setHealthIndicatorText(String.format("-%d HP", event.getDamage()));
} else {
//Enemy attacked
EnemyBattleAttackAnimation battleAnimation = new EnemyBattleAttackAnimation(_battleScene, getAttackSound(event.getMove()), settings);
battleAnimation.start();
if (_battleSimulation.isPlayerControlledByAI() && forcedAIDelay.getSpeed() > 0) {
battleAnimation.setOnEventDone(() -> {
addEmptyAnimation(forcedAIDelay.getSpeed(), true);
_battleScene.setTextToDisplay("...");
});
}
blockingAnimations.add(battleAnimation);
_battleScene.setHealthIndicatorText(String.format("-%d HP", event.getDamage()));
}
Expand Down Expand Up @@ -420,11 +435,23 @@ public void draw(GameData gameData) {

@Override
public void handleInput(GameData gameData, IGameViewManager gameViewManager) {
if (!blockingAnimations.isEmpty() || !_isInitialized || (_battleSimulation != null && _battleSimulation.getState() != null && !_battleSimulation.getState().isPlayersTurn())) {
if (_battleSimulation != null && _battleSimulation.isPlayerControlledByAI()) {
menuState = MenuState.SPECTATOR;
}

if (
(
!blockingAnimations.isEmpty()
|| !_isInitialized
|| (_battleSimulation != null && _battleSimulation.getState() != null && !_battleSimulation.getState().isPlayersTurn())
)
&& menuState != MenuState.SPECTATOR // Always show the UI when spectating
) {
//If any blocking animations, don't allow any input.
_battleScene.setActionBoxAlpha(0.5f);
return;
}

_battleScene.setActionBoxAlpha(1f);
GameKeys keys = gameData.getKeys();

Expand Down Expand Up @@ -524,6 +551,33 @@ public void handleInput(GameData gameData, IGameViewManager gameViewManager) {
_battleScene.setTextToDisplay("This monster is already in battle.");
}
}
} else if (this.menuState == MenuState.SPECTATOR) {
_battleScene.setActionTitle("Spectating");
IBattleParticipant player = _battleSimulation.getState().getPlayer();
Object[] menuOptions = new Object[]{
forcedAIDelay,
"Quit spectating"
};

_battleScene.setActions(menuOptions);

//Get selected monster
Object selectedAction = menuOptions[this.selectedAction % menuOptions.length];
if (selectedAction instanceof String action) {
if (action.equalsIgnoreCase("Quit spectating")) {
if (keys.isPressed(GameKeys.ACTION)) {
handleBattleEnd(new VictoryBattleEvent("Player runs away", _battleSimulation.getState().getEnemy(), null));
}
}
} else if (selectedAction instanceof BattleSpeedController speed) {
if (keys.isPressed(GameKeys.RIGHT)) {
speed.increaseSpeed();
} else if (keys.isPressed(GameKeys.LEFT)) {
speed.decreaseSpeed();
} else if (keys.isPressed(GameKeys.DELETE)) {
speed.setSpeed(0);
}
}
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ public enum MenuState {
DEFAULT,
FIGHT,
SWITCH,
SPECTATOR,
NONE
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,12 @@ public class BattleScene {
private Rectangle _playerHPBoxFillRect;
private Rectangle _playerHPBoxBorderRect;
private float _actionBoxAlpha = 1;

private String enemyControllerName;
private String enemyMonsterName;
private int enemyHP;
private float intermediateEnemyHP = 0f;
private int maxEnemyHP;
private String playerControllerName;
private String playerMonsterName;
private int playerHP;
private float intermediatePlayerHP = 0f;
Expand Down Expand Up @@ -80,6 +81,8 @@ public BattleScene() {
_enemyHPBoxFillRect = new Rectangle(-100,-100, 0, 0);
spriteBatch = new SpriteBatch();
shapeRenderer = new ShapeRenderer();
playerControllerName = "Your monster";
enemyControllerName = "Opponent";
resetPositions();
}

Expand Down Expand Up @@ -170,10 +173,10 @@ public void draw(float dt, OrthographicCamera camera) {
spriteBatch.begin();

//Health box
textUtils.drawNormalRoboto(spriteBatch, "Opponent: " + this.enemyMonsterName, Color.BLACK, _enemyHealthBoxPosition.getX() + 10, _enemyHealthBoxPosition.getY() + 85);
textUtils.drawNormalRoboto(spriteBatch, this.enemyControllerName+": " + this.enemyMonsterName, Color.BLACK, _enemyHealthBoxPosition.getX() + 10, _enemyHealthBoxPosition.getY() + 85);
textUtils.drawNormalRoboto(spriteBatch, "HP:", Color.BLACK, _enemyHealthBoxPosition.getX() + 10, _enemyHealthBoxPosition.getY() + 55);
textUtils.drawNormalRoboto(spriteBatch, this.enemyHP+"/"+this.maxEnemyHP, Color.BLACK, _enemyHealthBoxPosition.getX() + 52, _enemyHealthBoxPosition.getY() + 28);
textUtils.drawNormalRoboto(spriteBatch, "Your monster: " + this.playerMonsterName, Color.BLACK, _playerHealthBoxPosition.getX() + 10, _playerHealthBoxPosition.getY() + 85);
textUtils.drawNormalRoboto(spriteBatch, this.playerControllerName+": " + this.playerMonsterName, Color.BLACK, _playerHealthBoxPosition.getX() + 10, _playerHealthBoxPosition.getY() + 85);
textUtils.drawNormalRoboto(spriteBatch, "HP:", Color.BLACK, _playerHealthBoxPosition.getX() + 10, _playerHealthBoxPosition.getY() + 55);
textUtils.drawNormalRoboto(spriteBatch, this.playerHP+"/"+this.maxPlayerHP, Color.BLACK, _playerHealthBoxPosition.getX() + 52, _playerHealthBoxPosition.getY() + 28);

Expand Down Expand Up @@ -279,6 +282,14 @@ public void setEnemyMonsterName(String enemyMonsterName) {
this.enemyMonsterName = enemyMonsterName;
}

public void setEnemyControllerName(String enemyControllerName) {
this.enemyControllerName = enemyControllerName;
}

public void setPlayerControllerName(String playerControllerName) {
this.playerControllerName = playerControllerName;
}

public void setEnemyHP(int enemyHP) {
this.enemyHP = enemyHP;
}
Expand Down