From afa9c3c7e939d5aa17aef23fc50b7d7608f39b98 Mon Sep 17 00:00:00 2001 From: VictorABoye Date: Tue, 21 Nov 2023 11:46:30 +0100 Subject: [PATCH 1/3] Add setting to turn off crits and accuracy --- src/main/java/dk/sdu/mmmi/Main.java | 1 + src/main/java/dk/sdu/mmmi/modulemon/Game.java | 3 ++ .../HeadlessBattleView.java | 1 + .../Monster/BattleMonsterProcessor.java | 18 ++++++++-- .../modulemon/common/SettingsRegistry.java | 5 +++ .../mmmi/modulemon/gameviews/MenuView.java | 36 +++++++++++++++---- 6 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/main/java/dk/sdu/mmmi/Main.java b/src/main/java/dk/sdu/mmmi/Main.java index 1736c4f2..5ff8126f 100644 --- a/src/main/java/dk/sdu/mmmi/Main.java +++ b/src/main/java/dk/sdu/mmmi/Main.java @@ -31,6 +31,7 @@ public static void main(String[] args) throws IOException, URISyntaxException { var settings = new Settings(); var monsterRegistry = new MonsterRegistry(); var battleMonsterProcessor = new BattleMonsterProcessor(); + battleMonsterProcessor.setSettings(settings); var battleAI = new dk.sdu.mmmi.modulemon.BattleAI.BattleAIFactory(); battleAI.setSettingsService(settings); diff --git a/src/main/java/dk/sdu/mmmi/modulemon/Game.java b/src/main/java/dk/sdu/mmmi/modulemon/Game.java index 63dd03ad..309b78bf 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/Game.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/Game.java @@ -185,6 +185,9 @@ public void setSettingsService(IGameSettings settings) { if (settings.getSetting(SettingsRegistry.getInstance().getBattleAISetting()) == null){ settings.setSetting(SettingsRegistry.getInstance().getBattleAISetting(), "MCTS"); } + if(settings.getSetting(SettingsRegistry.getInstance().getNonDeterminism()) == null){ + settings.setSetting(SettingsRegistry.getInstance().getNonDeterminism(), true); + } gvm.setSettings(settings); }); } diff --git a/src/main/java/dk/sdu/mmmi/modulemon/HeadlessBattleView/HeadlessBattleView.java b/src/main/java/dk/sdu/mmmi/modulemon/HeadlessBattleView/HeadlessBattleView.java index 480e0241..93c00b2e 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/HeadlessBattleView/HeadlessBattleView.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/HeadlessBattleView/HeadlessBattleView.java @@ -315,6 +315,7 @@ private Future runBattle() { var battleSim = new BattleSimulation(); var processor = new BattleMonsterProcessor(); + processor.setSettings(settings); battleSim.setMonsterProcessor(processor); battleSim.setPlayerAIFactory(teamAAI); battleSim.setOpponentAIFactory(teamBAI); diff --git a/src/main/java/dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java b/src/main/java/dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java index 97142009..0d176cc1 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java @@ -3,11 +3,16 @@ import dk.sdu.mmmi.modulemon.CommonBattleSimulation.IBattleMonsterProcessor; import dk.sdu.mmmi.modulemon.CommonMonster.IMonster; import dk.sdu.mmmi.modulemon.CommonMonster.IMonsterMove; +import dk.sdu.mmmi.modulemon.Settings.Settings; +import dk.sdu.mmmi.modulemon.common.SettingsRegistry; +import dk.sdu.mmmi.modulemon.common.services.IGameSettings; import java.util.Random; public class BattleMonsterProcessor implements IBattleMonsterProcessor { + private IGameSettings settings; + @Override public IMonster whichMonsterStarts(IMonster iMonster1, IMonster iMonster2) { Monster monster1 = (Monster) iMonster1; @@ -24,7 +29,9 @@ public int calculateDamage(IMonster iSource, IMonsterMove iMove, IMonster iTarge float sourceAttack = (float) source.getAttack(); float targetDefence = (float) target.getDefence(); - if (!doAccuracyHit(move.getAccuracy())) { return 0; } + boolean shouldUseNonDeterminism = (Boolean) settings.getSetting(SettingsRegistry.getInstance().getNonDeterminism()); + + if (!doAccuracyHit(move.getAccuracy()) && shouldUseNonDeterminism) { return 0; } // Same type attack bonus. Effectively the same as STAB in that other game boolean same_attack_type = source.getMonsterType() == move.getType(); float attack_bonus = 1; @@ -35,7 +42,10 @@ public int calculateDamage(IMonster iSource, IMonsterMove iMove, IMonster iTarge float monsterAttackDefence = (0.2f * sourceAttack + 3 + 20 ) / (targetDefence + 50); - int damage = Math.round( monsterAttackDefence * moveDamage * attack_bonus * calculateTypeAdvantage(move.getType(), target.getMonsterType()) * calculateCriticalHit(source) ); + int damage = Math.round( monsterAttackDefence * moveDamage * attack_bonus * calculateTypeAdvantage(move.getType(), target.getMonsterType())); + if(shouldUseNonDeterminism){ + damage *= calculateCriticalHit(source); + } return damage; } @@ -126,4 +136,8 @@ public boolean doAccuracyHit(float factor) { return random.nextFloat() <= factor; } + + public void setSettings(IGameSettings settings) { + this.settings = settings; + } } diff --git a/src/main/java/dk/sdu/mmmi/modulemon/common/SettingsRegistry.java b/src/main/java/dk/sdu/mmmi/modulemon/common/SettingsRegistry.java index cab15868..078d06e8 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/common/SettingsRegistry.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/common/SettingsRegistry.java @@ -18,6 +18,7 @@ public class SettingsRegistry { private UUID rectangle_style = UUID.randomUUID(); private UUID battle_theme = UUID.randomUUID(); private UUID battle_AI = UUID.randomUUID(); + private UUID non_determinism = UUID.randomUUID(); private SettingsRegistry(){ settingsMap = new HashMap<>(); @@ -39,6 +40,7 @@ private void populateSettings(){ settingsMap.put(rectangle_style, "personaRectangles"); settingsMap.put(battle_theme, "battleMusicTheme"); settingsMap.put(battle_AI, "AI"); + settingsMap.put(non_determinism, "Nondeterminism"); } /* @@ -74,6 +76,9 @@ public String getBattleMusicThemeSetting(){ public String getBattleAISetting() { return settingsMap.get(battle_AI); } + public String getNonDeterminism() { + return settingsMap.get(non_determinism); + } public static SettingsRegistry getInstance(){ if(instance == null){ diff --git a/src/main/java/dk/sdu/mmmi/modulemon/gameviews/MenuView.java b/src/main/java/dk/sdu/mmmi/modulemon/gameviews/MenuView.java index cf9ffde6..973c7058 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/gameviews/MenuView.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/gameviews/MenuView.java @@ -74,6 +74,7 @@ public class MenuView implements IGameViewService { "Battle Music Theme", "AI", "Use AI knowledge states", + "Nondeterminism" }; private int AIIndex = 0; @@ -213,7 +214,7 @@ public void draw(GameData data) { (Game.HEIGHT - glyphLayout.height) / 1.25f ); - if(!subtitle.isBlank()) { + if (!subtitle.isBlank()) { subtitleFont.setColor(Color.valueOf("ffcb05")); glyphLayout.setText(subtitleFont, subtitle); subtitleFont.draw( @@ -278,6 +279,9 @@ public void draw(GameData data) { @Override public void handleInput(GameData gameData, IGameViewManager gameViewManager) { + if (gameData.getKeys().isPressed(GameKeys.BACK)) { + goBackToMainMenu(); + } // Moves up in the menu if (gameData.getKeys().isPressed(GameKeys.UP)) { if (currentOption > 0) { @@ -316,10 +320,7 @@ public void handleInput(GameData gameData, IGameViewManager gameViewManager) { */ private void selectOption(IGameViewManager gvm) { if (menuOptions[currentOption].equalsIgnoreCase("GO BACK")) { - currentMenuState = MenuStates.DEFAULT; - currentOption = 0; - showSettings = false; - chooseSound.play(getSoundVolumeAsFloat()); + goBackToMainMenu(); return; } @@ -355,6 +356,14 @@ private void selectOption(IGameViewManager gvm) { } } + private void goBackToMainMenu() { + currentMenuState = MenuStates.DEFAULT; + currentOption = 0; + showSettings = false; + chooseSound.play(getSoundVolumeAsFloat()); + return; + } + /** * Method to handle what logic should happen in the Settings menu. It checks the currently selected/hovered setting * and executes the code relevant to that. It takes the parameter keyInput. @@ -408,7 +417,7 @@ private void handleSettings(String keyInput) { break; } - if(menuOptions[currentOption].equalsIgnoreCase("AI")){ + if (menuOptions[currentOption].equalsIgnoreCase("AI")) { AIIndex++; AIIndex = AIIndex % AIOptions.length; @@ -483,7 +492,7 @@ private void handleSettings(String keyInput) { } - if(menuOptions[currentOption].equalsIgnoreCase("AI")){ + if (menuOptions[currentOption].equalsIgnoreCase("AI")) { if (AIIndex == 0) { AIIndex = AIOptions.length - 1; } else { @@ -574,6 +583,18 @@ private void boolean_settings_switch_on_off() { settings.setSetting(settingsRegistry.getAIKnowlegdeStateEnabled(), true); } chooseSound.play(getSoundVolumeAsFloat()); + } else if (menuOptions[currentOption].equalsIgnoreCase("Nondeterminism")) { + /* + If setting for using nondeterminism for battles, + */ + if (((Boolean) settings.getSetting(settingsRegistry.getNonDeterminism()))) { + settingsValueList.set(8, "Off"); + settings.setSetting(settingsRegistry.getNonDeterminism(), false); + } else { + settingsValueList.set(8, "On"); + settings.setSetting(settingsRegistry.getNonDeterminism(), true); + } + chooseSound.play(getSoundVolumeAsFloat()); } } } @@ -604,6 +625,7 @@ private void settingsInitializer() { settingsValueList.add((Boolean) settings.getSetting(settingsRegistry.getAIKnowlegdeStateEnabled()) ? "On" : "Off"); AIIndex = Arrays.asList(AIOptions).indexOf(AI); + settingsValueList.add((Boolean) settings.getSetting(settingsRegistry.getNonDeterminism()) ? "On" : "Off"); } } From f0343f19562fd221480da7464d9c6a297baab09f Mon Sep 17 00:00:00 2001 From: VictorABoye Date: Tue, 21 Nov 2023 12:10:37 +0100 Subject: [PATCH 2/3] Add setting to change how many concurrent battles there can be --- src/main/java/dk/sdu/mmmi/modulemon/Game.java | 3 ++ .../HeadlessBattleView.java | 1 + .../modulemon/common/SettingsRegistry.java | 5 +++ .../mmmi/modulemon/gameviews/MenuView.java | 32 ++++++++++++++++++- 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/dk/sdu/mmmi/modulemon/Game.java b/src/main/java/dk/sdu/mmmi/modulemon/Game.java index 309b78bf..1b36ef9d 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/Game.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/Game.java @@ -188,6 +188,9 @@ public void setSettingsService(IGameSettings settings) { if(settings.getSetting(SettingsRegistry.getInstance().getNonDeterminism()) == null){ settings.setSetting(SettingsRegistry.getInstance().getNonDeterminism(), true); } + if(settings.getSetting(SettingsRegistry.getInstance().getConcurrentBattleAmount()) == null){ + settings.setSetting(SettingsRegistry.getInstance().getConcurrentBattleAmount(), 5); + } gvm.setSettings(settings); }); } diff --git a/src/main/java/dk/sdu/mmmi/modulemon/HeadlessBattleView/HeadlessBattleView.java b/src/main/java/dk/sdu/mmmi/modulemon/HeadlessBattleView/HeadlessBattleView.java index 93c00b2e..22f47486 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/HeadlessBattleView/HeadlessBattleView.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/HeadlessBattleView/HeadlessBattleView.java @@ -77,6 +77,7 @@ public void init(IGameViewManager gameViewManager) { scene = new HeadlessBattleScene(settings); battlingScene = new HeadlessBattlingScene(); + concurrentBattles = (int) settings.getSetting(settingsRegistry.getConcurrentBattleAmount()); } @Override diff --git a/src/main/java/dk/sdu/mmmi/modulemon/common/SettingsRegistry.java b/src/main/java/dk/sdu/mmmi/modulemon/common/SettingsRegistry.java index 078d06e8..d80d700b 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/common/SettingsRegistry.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/common/SettingsRegistry.java @@ -19,6 +19,7 @@ public class SettingsRegistry { private UUID battle_theme = UUID.randomUUID(); private UUID battle_AI = UUID.randomUUID(); private UUID non_determinism = UUID.randomUUID(); + private UUID concurrent_battles = UUID.randomUUID(); private SettingsRegistry(){ settingsMap = new HashMap<>(); @@ -41,6 +42,7 @@ private void populateSettings(){ settingsMap.put(battle_theme, "battleMusicTheme"); settingsMap.put(battle_AI, "AI"); settingsMap.put(non_determinism, "Nondeterminism"); + settingsMap.put(concurrent_battles, "Concurrent Battles"); } /* @@ -79,6 +81,9 @@ public String getBattleMusicThemeSetting(){ public String getNonDeterminism() { return settingsMap.get(non_determinism); } + public String getConcurrentBattleAmount() { + return settingsMap.get(concurrent_battles); + } public static SettingsRegistry getInstance(){ if(instance == null){ diff --git a/src/main/java/dk/sdu/mmmi/modulemon/gameviews/MenuView.java b/src/main/java/dk/sdu/mmmi/modulemon/gameviews/MenuView.java index 973c7058..141c41c2 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/gameviews/MenuView.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/gameviews/MenuView.java @@ -74,7 +74,8 @@ public class MenuView implements IGameViewService { "Battle Music Theme", "AI", "Use AI knowledge states", - "Nondeterminism" + "Nondeterminism", + "Concurrent battle amount" }; private int AIIndex = 0; @@ -445,6 +446,20 @@ private void handleSettings(String keyInput) { chooseSound.play(getSoundVolumeAsFloat()); break; } + + if (menuOptions[currentOption].equalsIgnoreCase("Concurrent battle amount")) { + // Sets the maximum concurrent battles to 10 + if (((int) settings.getSetting(settingsRegistry.getConcurrentBattleAmount()) < 16)) { + // increases the concurrent battles by 1 + int concurrentBattles = (int) settings.getSetting(settingsRegistry.getConcurrentBattleAmount()) + 1; + settings.setSetting(settingsRegistry.getConcurrentBattleAmount(), concurrentBattles); + + settingsValueList.set(9, String.valueOf(concurrentBattles)); + chooseSound.play(getSoundVolumeAsFloat()); + } + break; + } + boolean_settings_switch_on_off(); break; } @@ -526,6 +541,19 @@ private void handleSettings(String keyInput) { break; } + if (menuOptions[currentOption].equalsIgnoreCase("Concurrent battle amount")) { + // Sets the minimum concurrent battles to 1 + if (((int) settings.getSetting(settingsRegistry.getConcurrentBattleAmount()) > 1)) { + // Decreases the concurrent battles by 1 + int concurrentBattles = (int) settings.getSetting(settingsRegistry.getConcurrentBattleAmount()) - 1; + settings.setSetting(settingsRegistry.getConcurrentBattleAmount(), concurrentBattles); + + settingsValueList.set(9, String.valueOf(concurrentBattles)); + chooseSound.play(getSoundVolumeAsFloat()); + } + break; + } + boolean_settings_switch_on_off(); break; @@ -626,6 +654,8 @@ private void settingsInitializer() { settingsValueList.add((Boolean) settings.getSetting(settingsRegistry.getAIKnowlegdeStateEnabled()) ? "On" : "Off"); AIIndex = Arrays.asList(AIOptions).indexOf(AI); settingsValueList.add((Boolean) settings.getSetting(settingsRegistry.getNonDeterminism()) ? "On" : "Off"); + var battleAmount = String.valueOf(settings.getSetting(settingsRegistry.getConcurrentBattleAmount())); + settingsValueList.add(battleAmount); } } From 233c6f11cc84f4c71d4503e67d5da1a9b9675631 Mon Sep 17 00:00:00 2001 From: VictorABoye Date: Tue, 21 Nov 2023 12:19:33 +0100 Subject: [PATCH 3/3] Fix crits being reversed --- .../dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java b/src/main/java/dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java index 0d176cc1..a95d1c59 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java @@ -119,7 +119,7 @@ public float calculateCriticalHit (Monster monster) { //Generate random number between 0-255 float randomVal = random.nextInt(256); //true if the generated number is less than the threshold - boolean criticalHit = randomVal >= threshold; + boolean criticalHit = randomVal < threshold; if (criticalHit) { System.out.println("critical hit");