Skip to content

Commit

Permalink
fix: 배틀 결과 계산에서 날씨에 의한 기술 무효 조건 추가 (#294)
Browse files Browse the repository at this point in the history
  • Loading branch information
jongmee authored Aug 23, 2024
1 parent 145b06c commit 7b9f309
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,8 @@ public record BattleMove(
Integer generation,
String flags
) {

public boolean isAttackMove() {
return this.category != MoveCategory.STATUS;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,8 @@ public BattleResultResponse calculateBattleResult(
.orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_CATEGORY_NOT_FOUND));
Type moveType = move.type();

double weatherMultiplier = getWeatherMultiplier(moveType, weather);
double typeMatchingMultiplier = getTypeMatchingMultiplier(moveType, rivalPokemon.pokemonTypes());
double sameTypeBonusMultiplier = getSameTypeAttackBonusMultiplier(moveType, myPokemon);
double stringWindMultiplier = getStringWindMultiplier(moveType, rivalPokemon.pokemonTypes(), weather);

double totalMultiplier =
weatherMultiplier * typeMatchingMultiplier * sameTypeBonusMultiplier * stringWindMultiplier;
double finalAccuracy = calculateAccuracy(move, weather);
double totalMultiplier = getTotalMultiplier(move, weather, rivalPokemon, myPokemon);

return new BattleResultResponse(
move.power(),
Expand All @@ -86,20 +80,51 @@ public BattleResultResponse calculateBattleResult(
);
}

private double calculateAccuracy(BattleMove move, Weather weather) {
if (weather == Weather.FOG) {
return (double) move.accuracy() * 0.9;
}

return (double) move.accuracy();
}

private double getTotalMultiplier(
BattleMove move,
Weather weather,
BattlePokemon rivalPokemon,
BattlePokemon myPokemon) {
if (!move.isAttackMove()) {
return 1;
}
Type moveType = move.type();
double weatherMultiplier = getWeatherMultiplier(moveType, weather);
double typeMatchingMultiplier = getTypeMatchingMultiplier(moveType, rivalPokemon.pokemonTypes());
double sameTypeBonusMultiplier = getSameTypeAttackBonusMultiplier(moveType, myPokemon);
double stringWindMultiplier = getStringWindMultiplier(moveType, rivalPokemon.pokemonTypes(), weather);

return weatherMultiplier * typeMatchingMultiplier * sameTypeBonusMultiplier * stringWindMultiplier;
}

private double getWeatherMultiplier(Type moveType, Weather weather) {
if (weather == Weather.SUNNY || weather == Weather.HARSH_SUN) {
if (moveType == Type.FIRE) {
if (moveType == Type.FIRE) {
if (weather == Weather.SUNNY || weather == Weather.HARSH_SUN) {
return 1.5;
}
if (moveType == Type.WATER) {
if (weather == Weather.RAIN) {
return 0.5;
}
if (weather == Weather.HEAVY_RAIN) {
return 0;
}
}
if (weather == Weather.RAIN || weather == Weather.HEAVY_RAIN) {
if (moveType == Type.FIRE) {
if (moveType == Type.WATER) {
if (weather == Weather.SUNNY) {
return 0.5;
}
if (moveType == Type.WATER) {
if (weather == Weather.HARSH_SUN) {
return 0;
}
if (weather == Weather.RAIN || weather == Weather.HEAVY_RAIN) {
return 1.5;
}
}
Expand Down Expand Up @@ -133,12 +158,4 @@ private double getStringWindMultiplier(Type moveType, List<Type> rivalPokemonTyp

return 1;
}

private double calculateAccuracy(BattleMove move, Weather weather) {
if (weather == Weather.FOG) {
return (double) move.accuracy() * 0.9;
}

return (double) move.accuracy();
}
}

0 comments on commit 7b9f309

Please sign in to comment.