From cd4561281f07939b303d409acdde70c2d03f505d Mon Sep 17 00:00:00 2001 From: Rasmus Date: Tue, 14 Nov 2023 11:15:05 +0100 Subject: [PATCH] Critical hit probability, return values and calculations --- .../Monster/BattleMonsterProcessor.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 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 07da6f52..965f63c3 100644 --- a/src/main/java/dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java +++ b/src/main/java/dk/sdu/mmmi/modulemon/Monster/BattleMonsterProcessor.java @@ -4,6 +4,8 @@ import dk.sdu.mmmi.modulemon.CommonMonster.IMonster; import dk.sdu.mmmi.modulemon.CommonMonster.IMonsterMove; +import java.util.Random; + public class BattleMonsterProcessor implements IBattleMonsterProcessor { @Override @@ -32,7 +34,7 @@ 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()) ); + int damage = Math.round( monsterAttackDefence * moveDamage * attack_bonus * calculateTypeAdvantage(move.getType(), target.getMonsterType()) * calculateCriticalHit(source) ); return damage; } @@ -92,4 +94,27 @@ public float calculateTypeAdvantage(MonsterType source, MonsterType target) { } } + public float calculateCriticalHit (Monster monster) { + float baseSpeed = (float) monster.getSpeed(); + + float threshold = (float) (baseSpeed / 0.5); + + // To ensure threshold doesn't go above 255 + if (threshold > 255) { + threshold = 255; + } + + Random random = new Random(); + //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; + + if (criticalHit) { + System.out.println("critical hit"); + return 1.5f; + } else { + return 1f; + } + } }