From 075841dc2aba559b6aeb663ec8cbc3b3382445f9 Mon Sep 17 00:00:00 2001 From: jongmee Date: Tue, 24 Sep 2024 20:48:50 +0900 Subject: [PATCH 01/32] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/BattleMoveRepository.java | 1 + .../com/pokerogue/helper/battle/DataInitializer.java | 3 +++ .../helper/battle/TypeMatchingRepository.java | 1 + .../battle/{ => controller}/BattleController.java | 6 +++++- .../helper/battle/{ => data}/BattleMove.java | 3 ++- .../helper/battle/{ => data}/MoveCategory.java | 2 +- .../helper/battle/{ => data}/TypeMatching.java | 2 +- .../pokerogue/helper/battle/{ => data}/Weather.java | 2 +- .../battle/{ => dto}/BattleResultResponse.java | 2 +- .../helper/battle/{ => dto}/MoveResponse.java | 4 +++- .../helper/battle/{ => dto}/WeatherResponse.java | 3 ++- .../helper/battle/{ => service}/BattleService.java | 12 ++++++++++-- .../pokerogue/helper/pokemon/dto/MoveResponse.java | 4 ++-- .../pokerogue/helper/battle/BattleServiceTest.java | 3 +++ 14 files changed, 36 insertions(+), 12 deletions(-) rename backend/pokerogue/src/main/java/com/pokerogue/helper/battle/{ => controller}/BattleController.java (85%) rename backend/pokerogue/src/main/java/com/pokerogue/helper/battle/{ => data}/BattleMove.java (84%) rename backend/pokerogue/src/main/java/com/pokerogue/helper/battle/{ => data}/MoveCategory.java (96%) rename backend/pokerogue/src/main/java/com/pokerogue/helper/battle/{ => data}/TypeMatching.java (74%) rename backend/pokerogue/src/main/java/com/pokerogue/helper/battle/{ => data}/Weather.java (98%) rename backend/pokerogue/src/main/java/com/pokerogue/helper/battle/{ => dto}/BattleResultResponse.java (84%) rename backend/pokerogue/src/main/java/com/pokerogue/helper/battle/{ => dto}/MoveResponse.java (85%) rename backend/pokerogue/src/main/java/com/pokerogue/helper/battle/{ => dto}/WeatherResponse.java (79%) rename backend/pokerogue/src/main/java/com/pokerogue/helper/battle/{ => service}/BattleService.java (94%) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMoveRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMoveRepository.java index 6fb0fe999..41ac62078 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMoveRepository.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMoveRepository.java @@ -1,5 +1,6 @@ package com.pokerogue.helper.battle; +import com.pokerogue.helper.battle.data.BattleMove; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java index c3bea3250..4424271ab 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java @@ -1,5 +1,8 @@ package com.pokerogue.helper.battle; +import com.pokerogue.helper.battle.data.BattleMove; +import com.pokerogue.helper.battle.data.MoveCategory; +import com.pokerogue.helper.battle.data.TypeMatching; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; import com.pokerogue.helper.type.data.Type; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatchingRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatchingRepository.java index 0667327df..6eda2a82a 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatchingRepository.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatchingRepository.java @@ -1,5 +1,6 @@ package com.pokerogue.helper.battle; +import com.pokerogue.helper.battle.data.TypeMatching; import com.pokerogue.helper.type.data.Type; import java.util.HashMap; import java.util.List; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleController.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java similarity index 85% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleController.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java index 43ea7a5c7..803929c01 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleController.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java @@ -1,5 +1,9 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.battle.controller; +import com.pokerogue.helper.battle.dto.BattleResultResponse; +import com.pokerogue.helper.battle.service.BattleService; +import com.pokerogue.helper.battle.dto.MoveResponse; +import com.pokerogue.helper.battle.dto.WeatherResponse; import com.pokerogue.helper.util.dto.ApiResponse; import java.util.List; import lombok.RequiredArgsConstructor; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMove.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java similarity index 84% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMove.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java index 5018c03df..477c05474 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMove.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java @@ -1,5 +1,6 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.battle.data; +import com.pokerogue.helper.battle.data.MoveCategory; import com.pokerogue.helper.type.data.Type; public record BattleMove( diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveCategory.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/MoveCategory.java similarity index 96% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveCategory.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/MoveCategory.java index 41e47f2bf..1c7583516 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveCategory.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/MoveCategory.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.battle.data; import java.util.Arrays; import java.util.Optional; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatching.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java similarity index 74% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatching.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java index 7a3b3f199..4f34ed2f9 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatching.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.battle.data; import com.pokerogue.helper.type.data.Type; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/Weather.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java similarity index 98% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/Weather.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java index c438aa713..6c0f8a9e7 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/Weather.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.battle.data; import java.util.Arrays; import java.util.List; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleResultResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/BattleResultResponse.java similarity index 84% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleResultResponse.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/BattleResultResponse.java index 01bc9f59b..1c606d6ce 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleResultResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/BattleResultResponse.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.battle.dto; public record BattleResultResponse( int power, diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/MoveResponse.java similarity index 85% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveResponse.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/MoveResponse.java index faf209ffb..a15c44f7f 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/MoveResponse.java @@ -1,5 +1,7 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.battle.dto; +import com.pokerogue.helper.battle.data.BattleMove; +import com.pokerogue.helper.battle.data.MoveCategory; import com.pokerogue.helper.type.data.Type; public record MoveResponse( diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/WeatherResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/WeatherResponse.java similarity index 79% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/WeatherResponse.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/WeatherResponse.java index fdb1fa1b9..5a1781469 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/WeatherResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/WeatherResponse.java @@ -1,5 +1,6 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.battle.dto; +import com.pokerogue.helper.battle.data.Weather; import java.util.List; public record WeatherResponse( diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java similarity index 94% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleService.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index 4ad791c48..5b33c807b 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -1,5 +1,13 @@ -package com.pokerogue.helper.battle; - +package com.pokerogue.helper.battle.service; + +import com.pokerogue.helper.battle.data.BattleMove; +import com.pokerogue.helper.battle.BattleMoveRepository; +import com.pokerogue.helper.battle.dto.BattleResultResponse; +import com.pokerogue.helper.battle.dto.MoveResponse; +import com.pokerogue.helper.battle.TypeMatchingRepository; +import com.pokerogue.helper.battle.data.Weather; +import com.pokerogue.helper.battle.dto.WeatherResponse; +import com.pokerogue.helper.battle.data.TypeMatching; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; import com.pokerogue.helper.pokemon.data.InMemoryPokemon; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/MoveResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/MoveResponse.java index 9dc59e100..197fb5017 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/MoveResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/MoveResponse.java @@ -1,7 +1,7 @@ package com.pokerogue.helper.pokemon.dto; -import com.pokerogue.helper.battle.BattleMove; -import com.pokerogue.helper.battle.MoveCategory; +import com.pokerogue.helper.battle.data.BattleMove; +import com.pokerogue.helper.battle.data.MoveCategory; import com.pokerogue.helper.pokemon.data.Type; public record MoveResponse( diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java index 36f982a19..54081af84 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java @@ -4,6 +4,9 @@ import static org.junit.jupiter.api.Assertions.assertAll; import com.pokerogue.environment.service.ServiceTest; +import com.pokerogue.helper.battle.dto.BattleResultResponse; +import com.pokerogue.helper.battle.dto.MoveResponse; +import com.pokerogue.helper.battle.service.BattleService; import com.pokerogue.helper.pokemon.data.InMemoryPokemon; import com.pokerogue.helper.pokemon.repository.InMemoryPokemonRepository; import java.util.List; From 4302c4901be8a0a8a258367bd686e073a3c5741e Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 10:20:56 +0900 Subject: [PATCH 02/32] =?UTF-8?q?feat:=20TypeMatching=20document=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/DataInitializer.java | 12 +++---- .../InMemoryTypeMatchingRepository.java | 32 +++++++++++++++++++ .../helper/battle/TypeMatchingRepository.java | 32 ------------------- .../battle/data/InMemoryTypeMatching.java | 6 ++++ .../helper/battle/data/TypeMatching.java | 23 +++++++++++-- .../repository/TypeMatchingRepository.java | 7 ++++ .../helper/battle/service/BattleService.java | 14 ++++---- .../helper/battle/DataInitializerTest.java | 6 ++-- 8 files changed, 82 insertions(+), 50 deletions(-) create mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/InMemoryTypeMatchingRepository.java delete mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatchingRepository.java create mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/InMemoryTypeMatching.java create mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/repository/TypeMatchingRepository.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java index 4424271ab..53782153a 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java @@ -2,7 +2,7 @@ import com.pokerogue.helper.battle.data.BattleMove; import com.pokerogue.helper.battle.data.MoveCategory; -import com.pokerogue.helper.battle.data.TypeMatching; +import com.pokerogue.helper.battle.data.InMemoryTypeMatching; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; import com.pokerogue.helper.type.data.Type; @@ -29,7 +29,7 @@ public class DataInitializer implements ApplicationRunner { private static final String LIST_DELIMITER = ","; private final BattleMoveRepository battleMoveRepository; - private final TypeMatchingRepository typeMatchingRepository; + private final InMemoryTypeMatchingRepository inMemoryTypeMatchingRepository; @Override public void run(ApplicationArguments args) { @@ -38,8 +38,8 @@ public void run(ApplicationArguments args) { battleMoveRepository.save(battleMove); }); saveData("data/battle/type-matching.txt", fields -> { - TypeMatching typeMatching = createTypeMatching(fields); - typeMatchingRepository.save(typeMatching); + InMemoryTypeMatching inMemoryTypeMatching = createTypeMatching(fields); + inMemoryTypeMatchingRepository.save(inMemoryTypeMatching); }); } @@ -100,14 +100,14 @@ private BattleMove createMove(List fields) { ); } - private TypeMatching createTypeMatching(List fields) { + private InMemoryTypeMatching createTypeMatching(List fields) { Type fromType = Type.findByEngName(fields.get(0)) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)); Type toType = Type.findByEngName(fields.get(1)) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)); double result = convertToDouble(fields.get(2)); - return new TypeMatching(fromType, toType, result); + return new InMemoryTypeMatching(fromType, toType, result); } private double convertToDouble(String data) { diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/InMemoryTypeMatchingRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/InMemoryTypeMatchingRepository.java new file mode 100644 index 000000000..e10275a9b --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/InMemoryTypeMatchingRepository.java @@ -0,0 +1,32 @@ +package com.pokerogue.helper.battle; + +import com.pokerogue.helper.battle.data.InMemoryTypeMatching; +import com.pokerogue.helper.type.data.Type; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.springframework.stereotype.Repository; + +@Repository +public class InMemoryTypeMatchingRepository { + + private final Map typeMatchings = new HashMap<>(); + + public void save(InMemoryTypeMatching inMemoryTypeMatching) { + int id = Objects.hash(inMemoryTypeMatching.fromType(), inMemoryTypeMatching.toType()); + typeMatchings.put(id, inMemoryTypeMatching); + } + + public List findAll() { + return typeMatchings.values() + .stream() + .toList(); + } + + public Optional findByFromTypeAndToType(Type fromType, Type toType) { + int id = Objects.hash(fromType, toType); + return Optional.ofNullable(typeMatchings.get(id)); + } +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatchingRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatchingRepository.java deleted file mode 100644 index 6eda2a82a..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/TypeMatchingRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pokerogue.helper.battle; - -import com.pokerogue.helper.battle.data.TypeMatching; -import com.pokerogue.helper.type.data.Type; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import org.springframework.stereotype.Repository; - -@Repository -public class TypeMatchingRepository { - - private final Map typeMatchings = new HashMap<>(); - - public void save(TypeMatching typeMatching) { - int id = Objects.hash(typeMatching.fromType(), typeMatching.toType()); - typeMatchings.put(id, typeMatching); - } - - public List findAll() { - return typeMatchings.values() - .stream() - .toList(); - } - - public Optional findByFromTypeAndToType(Type fromType, Type toType) { - int id = Objects.hash(fromType, toType); - return Optional.ofNullable(typeMatchings.get(id)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/InMemoryTypeMatching.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/InMemoryTypeMatching.java new file mode 100644 index 000000000..8c08c38f0 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/InMemoryTypeMatching.java @@ -0,0 +1,6 @@ +package com.pokerogue.helper.battle.data; + +import com.pokerogue.helper.type.data.Type; + +public record InMemoryTypeMatching(Type fromType, Type toType, double result) { +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java index 4f34ed2f9..eba79e2e8 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java @@ -1,6 +1,25 @@ package com.pokerogue.helper.battle.data; -import com.pokerogue.helper.type.data.Type; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; -public record TypeMatching(Type fromType, Type toType, double result) { +@Getter +@RequiredArgsConstructor +@Document(collection = "typeMatching") +public class TypeMatching { + + @Id + private final String id; + + @Field("from") + private final String from; // Todo: enum + + @Field("to") + private final String to; // Todo: enum + + @Field("result") + private final double result; } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/repository/TypeMatchingRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/repository/TypeMatchingRepository.java new file mode 100644 index 000000000..2d548a9ba --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/repository/TypeMatchingRepository.java @@ -0,0 +1,7 @@ +package com.pokerogue.helper.battle.repository; + +import com.pokerogue.helper.battle.data.TypeMatching; +import org.springframework.data.mongodb.repository.MongoRepository; + +public interface TypeMatchingRepository extends MongoRepository { +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index 5b33c807b..88ff58f44 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -4,10 +4,10 @@ import com.pokerogue.helper.battle.BattleMoveRepository; import com.pokerogue.helper.battle.dto.BattleResultResponse; import com.pokerogue.helper.battle.dto.MoveResponse; -import com.pokerogue.helper.battle.TypeMatchingRepository; +import com.pokerogue.helper.battle.InMemoryTypeMatchingRepository; import com.pokerogue.helper.battle.data.Weather; import com.pokerogue.helper.battle.dto.WeatherResponse; -import com.pokerogue.helper.battle.data.TypeMatching; +import com.pokerogue.helper.battle.data.InMemoryTypeMatching; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; import com.pokerogue.helper.pokemon.data.InMemoryPokemon; @@ -27,7 +27,7 @@ public class BattleService { private final BattleMoveRepository battleMoveRepository; private final InMemoryPokemonRepository inMemoryPokemonRepository; - private final TypeMatchingRepository typeMatchingRepository; + private final InMemoryTypeMatchingRepository inMemoryTypeMatchingRepository; private Map> findByDexnumberCache = new HashMap<>(); @@ -196,9 +196,9 @@ private double getWeatherMultiplier(Type moveType, Weather weather) { private double getTypeMatchingMultiplier(Type moveType, List rivalPokemonTypes) { return rivalPokemonTypes.stream() - .map(toType -> typeMatchingRepository.findByFromTypeAndToType(moveType, toType) + .map(toType -> inMemoryTypeMatchingRepository.findByFromTypeAndToType(moveType, toType) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TYPE_MATCHING_ERROR))) - .map(TypeMatching::result) + .map(InMemoryTypeMatching::result) .reduce(1d, (a, b) -> a * b); } @@ -211,10 +211,10 @@ private double getSameTypeAttackBonusMultiplier(Type moveType, InMemoryPokemon r } private double getStringWindMultiplier(Type moveType, List rivalPokemonTypes, Weather weather) { - TypeMatching typeMatching = typeMatchingRepository.findByFromTypeAndToType(moveType, Type.FLYING) + InMemoryTypeMatching inMemoryTypeMatching = inMemoryTypeMatchingRepository.findByFromTypeAndToType(moveType, Type.FLYING) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TYPE_MATCHING_ERROR)); - if (weather == Weather.STRONG_WINDS && rivalPokemonTypes.contains(Type.FLYING) && typeMatching.result() == 2) { + if (weather == Weather.STRONG_WINDS && rivalPokemonTypes.contains(Type.FLYING) && inMemoryTypeMatching.result() == 2) { return 0.5; } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java index ca3523020..3f5f8617b 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java @@ -13,16 +13,16 @@ class DataInitializerTest { @DisplayName("날씨, 기술 데이터를 세팅한다.") void setWeathersData() { BattleMoveRepository battleMoveRepository = new BattleMoveRepository(); - TypeMatchingRepository typeMatchingRepository = new TypeMatchingRepository(); + InMemoryTypeMatchingRepository inMemoryTypeMatchingRepository = new InMemoryTypeMatchingRepository(); DataInitializer dataInitializer = new DataInitializer( battleMoveRepository, - typeMatchingRepository + inMemoryTypeMatchingRepository ); dataInitializer.run(new DefaultApplicationArguments()); assertAll(() -> { assertThat(battleMoveRepository.findAll()).hasSize(920); - assertThat(typeMatchingRepository.findAll()).hasSize(361); + assertThat(inMemoryTypeMatchingRepository.findAll()).hasSize(361); }); } } From 1cab3df753ff1d68078308aa2117f2b5d30bb010 Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 12:58:38 +0900 Subject: [PATCH 03/32] =?UTF-8?q?refactor:=20InMemoryTypeMatchingRepositor?= =?UTF-8?q?y=EB=A5=BC=20MongoRepository=EB=A1=9C=20=EB=8C=80=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/DataInitializer.java | 47 ++++--------------- .../InMemoryTypeMatchingRepository.java | 32 ------------- .../battle/data/InMemoryTypeMatching.java | 6 --- .../helper/battle/data/TypeMatching.java | 15 +++--- .../repository/TypeMatchingRepository.java | 3 ++ .../helper/battle/service/BattleService.java | 19 ++++---- .../helper/battle/DataInitializerTest.java | 5 +- .../TypeMatchingRepositoryTest.java | 34 ++++++++++++++ 8 files changed, 65 insertions(+), 96 deletions(-) delete mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/InMemoryTypeMatchingRepository.java delete mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/InMemoryTypeMatching.java create mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/repository/TypeMatchingRepositoryTest.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java index 53782153a..43f473526 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java @@ -2,7 +2,6 @@ import com.pokerogue.helper.battle.data.BattleMove; import com.pokerogue.helper.battle.data.MoveCategory; -import com.pokerogue.helper.battle.data.InMemoryTypeMatching; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; import com.pokerogue.helper.type.data.Type; @@ -29,7 +28,6 @@ public class DataInitializer implements ApplicationRunner { private static final String LIST_DELIMITER = ","; private final BattleMoveRepository battleMoveRepository; - private final InMemoryTypeMatchingRepository inMemoryTypeMatchingRepository; @Override public void run(ApplicationArguments args) { @@ -37,15 +35,12 @@ public void run(ApplicationArguments args) { BattleMove battleMove = createMove(fields); battleMoveRepository.save(battleMove); }); - saveData("data/battle/type-matching.txt", fields -> { - InMemoryTypeMatching inMemoryTypeMatching = createTypeMatching(fields); - inMemoryTypeMatchingRepository.save(inMemoryTypeMatching); - }); } private void saveData(String path, Consumer> createAndSaveOperation) { - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(path); - BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) { + try (InputStream inputStream = getClass().getClassLoader() + .getResourceAsStream(path); BufferedReader br = new BufferedReader( + new InputStreamReader(inputStream))) { int lineCount = 0; String line; while ((line = br.readLine()) != null) { @@ -62,10 +57,7 @@ private void saveData(String path, Consumer> createAndSaveOperation } private List splitFields(String line) { - return Arrays.stream(line.split(FIELD_DELIMITER)) - .map(String::trim) - .map(this::regularizeEmptyField) - .toList(); + return Arrays.stream(line.split(FIELD_DELIMITER)).map(String::trim).map(this::regularizeEmptyField).toList(); } private String regularizeEmptyField(String field) { @@ -81,33 +73,10 @@ private BattleMove createMove(List fields) { MoveCategory moveCategory = MoveCategory.findByEngName(fields.get(6).toLowerCase()) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_CATEGORY_NOT_FOUND)); - return new BattleMove( - fields.get(0), - fields.get(1), - fields.get(2), - fields.get(3), - moveType, - fields.get(5), - moveCategory, - fields.get(7), - convertToInteger(fields.get(8)), - convertToInteger(fields.get(9)), - convertToInteger(fields.get(10)), - convertToInteger(fields.get(11)), - convertToInteger(fields.get(12)), - convertToInteger(fields.get(13)), - fields.get(14) - ); - } - - private InMemoryTypeMatching createTypeMatching(List fields) { - Type fromType = Type.findByEngName(fields.get(0)) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)); - Type toType = Type.findByEngName(fields.get(1)) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)); - double result = convertToDouble(fields.get(2)); - - return new InMemoryTypeMatching(fromType, toType, result); + return new BattleMove(fields.get(0), fields.get(1), fields.get(2), fields.get(3), moveType, fields.get(5), + moveCategory, fields.get(7), convertToInteger(fields.get(8)), convertToInteger(fields.get(9)), + convertToInteger(fields.get(10)), convertToInteger(fields.get(11)), convertToInteger(fields.get(12)), + convertToInteger(fields.get(13)), fields.get(14)); } private double convertToDouble(String data) { diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/InMemoryTypeMatchingRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/InMemoryTypeMatchingRepository.java deleted file mode 100644 index e10275a9b..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/InMemoryTypeMatchingRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pokerogue.helper.battle; - -import com.pokerogue.helper.battle.data.InMemoryTypeMatching; -import com.pokerogue.helper.type.data.Type; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import org.springframework.stereotype.Repository; - -@Repository -public class InMemoryTypeMatchingRepository { - - private final Map typeMatchings = new HashMap<>(); - - public void save(InMemoryTypeMatching inMemoryTypeMatching) { - int id = Objects.hash(inMemoryTypeMatching.fromType(), inMemoryTypeMatching.toType()); - typeMatchings.put(id, inMemoryTypeMatching); - } - - public List findAll() { - return typeMatchings.values() - .stream() - .toList(); - } - - public Optional findByFromTypeAndToType(Type fromType, Type toType) { - int id = Objects.hash(fromType, toType); - return Optional.ofNullable(typeMatchings.get(id)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/InMemoryTypeMatching.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/InMemoryTypeMatching.java deleted file mode 100644 index 8c08c38f0..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/InMemoryTypeMatching.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pokerogue.helper.battle.data; - -import com.pokerogue.helper.type.data.Type; - -public record InMemoryTypeMatching(Type fromType, Type toType, double result) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java index eba79e2e8..03393eebe 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/TypeMatching.java @@ -1,25 +1,28 @@ package com.pokerogue.helper.battle.data; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Getter -@RequiredArgsConstructor +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) @Document(collection = "typeMatching") public class TypeMatching { @Id - private final String id; + private String id; @Field("from") - private final String from; // Todo: enum + private String from; // Todo: enum @Field("to") - private final String to; // Todo: enum + private String to; // Todo: enum @Field("result") - private final double result; + private double result; } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/repository/TypeMatchingRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/repository/TypeMatchingRepository.java index 2d548a9ba..7e57924d7 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/repository/TypeMatchingRepository.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/repository/TypeMatchingRepository.java @@ -1,7 +1,10 @@ package com.pokerogue.helper.battle.repository; import com.pokerogue.helper.battle.data.TypeMatching; +import java.util.Optional; import org.springframework.data.mongodb.repository.MongoRepository; public interface TypeMatchingRepository extends MongoRepository { + + Optional findByFromAndTo(String from, String to); } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index 88ff58f44..e780b2c3b 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -1,13 +1,13 @@ package com.pokerogue.helper.battle.service; -import com.pokerogue.helper.battle.data.BattleMove; import com.pokerogue.helper.battle.BattleMoveRepository; +import com.pokerogue.helper.battle.data.BattleMove; +import com.pokerogue.helper.battle.data.TypeMatching; +import com.pokerogue.helper.battle.data.Weather; import com.pokerogue.helper.battle.dto.BattleResultResponse; import com.pokerogue.helper.battle.dto.MoveResponse; -import com.pokerogue.helper.battle.InMemoryTypeMatchingRepository; -import com.pokerogue.helper.battle.data.Weather; import com.pokerogue.helper.battle.dto.WeatherResponse; -import com.pokerogue.helper.battle.data.InMemoryTypeMatching; +import com.pokerogue.helper.battle.repository.TypeMatchingRepository; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; import com.pokerogue.helper.pokemon.data.InMemoryPokemon; @@ -27,7 +27,7 @@ public class BattleService { private final BattleMoveRepository battleMoveRepository; private final InMemoryPokemonRepository inMemoryPokemonRepository; - private final InMemoryTypeMatchingRepository inMemoryTypeMatchingRepository; + private final TypeMatchingRepository typeMatchingRepository; private Map> findByDexnumberCache = new HashMap<>(); @@ -196,9 +196,9 @@ private double getWeatherMultiplier(Type moveType, Weather weather) { private double getTypeMatchingMultiplier(Type moveType, List rivalPokemonTypes) { return rivalPokemonTypes.stream() - .map(toType -> inMemoryTypeMatchingRepository.findByFromTypeAndToType(moveType, toType) + .map(toType -> typeMatchingRepository.findByFromAndTo(moveType.getName(), toType.getName()) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TYPE_MATCHING_ERROR))) - .map(InMemoryTypeMatching::result) + .map(TypeMatching::getResult) .reduce(1d, (a, b) -> a * b); } @@ -211,10 +211,11 @@ private double getSameTypeAttackBonusMultiplier(Type moveType, InMemoryPokemon r } private double getStringWindMultiplier(Type moveType, List rivalPokemonTypes, Weather weather) { - InMemoryTypeMatching inMemoryTypeMatching = inMemoryTypeMatchingRepository.findByFromTypeAndToType(moveType, Type.FLYING) + TypeMatching typeMatching = typeMatchingRepository.findByFromAndTo(moveType.getName(), Type.FLYING.getName()) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TYPE_MATCHING_ERROR)); - if (weather == Weather.STRONG_WINDS && rivalPokemonTypes.contains(Type.FLYING) && inMemoryTypeMatching.result() == 2) { + if (weather == Weather.STRONG_WINDS && rivalPokemonTypes.contains(Type.FLYING) + && typeMatching.getResult() == 2) { return 0.5; } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java index 3f5f8617b..b270b957c 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java @@ -13,16 +13,13 @@ class DataInitializerTest { @DisplayName("날씨, 기술 데이터를 세팅한다.") void setWeathersData() { BattleMoveRepository battleMoveRepository = new BattleMoveRepository(); - InMemoryTypeMatchingRepository inMemoryTypeMatchingRepository = new InMemoryTypeMatchingRepository(); DataInitializer dataInitializer = new DataInitializer( - battleMoveRepository, - inMemoryTypeMatchingRepository + battleMoveRepository ); dataInitializer.run(new DefaultApplicationArguments()); assertAll(() -> { assertThat(battleMoveRepository.findAll()).hasSize(920); - assertThat(inMemoryTypeMatchingRepository.findAll()).hasSize(361); }); } } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/repository/TypeMatchingRepositoryTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/repository/TypeMatchingRepositoryTest.java new file mode 100644 index 000000000..11a910fac --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/repository/TypeMatchingRepositoryTest.java @@ -0,0 +1,34 @@ +package com.pokerogue.helper.battle.repository; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.pokerogue.helper.battle.data.TypeMatching; +import com.pokerogue.helper.type.data.Type; +import java.util.Optional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.test.context.ActiveProfiles; + +@DataMongoTest +@ActiveProfiles("local") +class TypeMatchingRepositoryTest { + + @Autowired + private TypeMatchingRepository typeMatchingRepository; + + @Test + @DisplayName("타입 간 상성 결과를 조회한다.") + void findByFromAndTo() { + // given + String from = Type.BUG.getName(); + String to = Type.FIRE.getName(); + + // when + Optional typeMatching =typeMatchingRepository.findByFromAndTo(from, to); + + // then + assertThat(typeMatching).isNotEmpty(); + } +} From b61e8bd7c6248836f824fb0a9845003b10f8b4c0 Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 13:00:23 +0900 Subject: [PATCH 04/32] =?UTF-8?q?refactor:=20battle=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=EC=97=90=EC=84=9C=20move=20api=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battle/controller/BattleController.java | 8 +-- .../helper/battle/service/BattleService.java | 67 ------------------- .../helper/battle/BattleServiceTest.java | 21 ------ 3 files changed, 1 insertion(+), 95 deletions(-) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java index 803929c01..3d0f2bd60 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java @@ -1,9 +1,8 @@ package com.pokerogue.helper.battle.controller; import com.pokerogue.helper.battle.dto.BattleResultResponse; -import com.pokerogue.helper.battle.service.BattleService; -import com.pokerogue.helper.battle.dto.MoveResponse; import com.pokerogue.helper.battle.dto.WeatherResponse; +import com.pokerogue.helper.battle.service.BattleService; import com.pokerogue.helper.util.dto.ApiResponse; import java.util.List; import lombok.RequiredArgsConstructor; @@ -24,11 +23,6 @@ public ApiResponse> weatherList() { return new ApiResponse<>("날씨 리스트 불러오기에 성공했습니다.", battleService.findWeathers()); } - @GetMapping("/api/v1/moves") - public ApiResponse> moveByPokemonList(@RequestParam("pokedex-number") Integer pokedexNumber) { - return new ApiResponse<>("포켓몬의 기술 리스트 불러오기에 성공했습니다.", battleService.findMovesByPokemon(pokedexNumber)); - } - @GetMapping("/api/v1/battle") public ApiResponse battleResult(@RequestParam("weather-id") String weatherId, @RequestParam("my-pokemon-id") String myPokemonId, diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index e780b2c3b..93e8c2849 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -37,73 +37,6 @@ public List findWeathers() { .toList(); } - public List findMovesByPokemon(String pokemonId) { - List allMoveIds = new ArrayList<>(); - InMemoryPokemon inMemoryPokemon = inMemoryPokemonRepository.findById(pokemonId) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); - - List moves = new ArrayList<>(); - for (int i = 0; i < inMemoryPokemon.moves().size(); i++) { - if (i % 2 == 0) { - moves.add(inMemoryPokemon.moves().get(i)); - } - } - allMoveIds.addAll(moves); - allMoveIds.addAll(inMemoryPokemon.technicalMachineMoves()); - allMoveIds.addAll(inMemoryPokemon.eggMoves()); - List battleMoves = allMoveIds.stream() - .distinct() - .map(this::findMoveById) - .toList(); - - return battleMoves.stream() - .map(MoveResponse::from) - .toList(); - } - - public List findMovesByPokemon(Integer pokedexNumber) { - if (findByDexnumberCache.isEmpty()) { - initFindByDexnumberCache(); - } - - return findByDexnumberCache.get(pokedexNumber); - } - - private void initFindByDexnumberCache() { - for (InMemoryPokemon inMemoryPokemon : inMemoryPokemonRepository.findAll().values()) { - int pokemonId = Integer.parseInt(inMemoryPokemon.speciesId()); - if (!findByDexnumberCache.containsKey(pokemonId)) { - findByDexnumberCache.put(pokemonId, makeMoveResponse(inMemoryPokemon)); - } - } - } - - private List makeMoveResponse(InMemoryPokemon inMemoryPokemon) { - List allMoveIds = new ArrayList<>(); - List moves = new ArrayList<>(); - for (int i = 0; i < inMemoryPokemon.moves().size(); i++) { - if (i % 2 == 0) { - moves.add(inMemoryPokemon.moves().get(i)); - } - } - allMoveIds.addAll(moves); - allMoveIds.addAll(inMemoryPokemon.technicalMachineMoves()); - allMoveIds.addAll(inMemoryPokemon.eggMoves()); - List battleMoves = allMoveIds.stream() - .distinct() - .map(this::findMoveById) - .toList(); - - return battleMoves.stream() - .map(MoveResponse::from) - .toList(); - } - - private BattleMove findMoveById(String id) { - return battleMoveRepository.findById(id) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)); - } - public BattleResultResponse calculateBattleResult( String weatherId, String myPokemonId, diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java index 54081af84..3e9771c67 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java @@ -5,11 +5,7 @@ import com.pokerogue.environment.service.ServiceTest; import com.pokerogue.helper.battle.dto.BattleResultResponse; -import com.pokerogue.helper.battle.dto.MoveResponse; import com.pokerogue.helper.battle.service.BattleService; -import com.pokerogue.helper.pokemon.data.InMemoryPokemon; -import com.pokerogue.helper.pokemon.repository.InMemoryPokemonRepository; -import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -19,23 +15,6 @@ class BattleServiceTest extends ServiceTest { @Autowired private BattleService battleService; - @Autowired - private InMemoryPokemonRepository inMemoryPokemonRepository; - - @Test - @DisplayName("포켓몬의 기술(자력 기술, 머신 기술, 알 기술) 리스트를 조회한다.") - void findMovesByPokemon() { - List pokemonIds = inMemoryPokemonRepository.findAll().values() - .stream() - .map(InMemoryPokemon::id) - .toList(); - - pokemonIds.forEach(pokemonId -> { - List moveResponses = battleService.findMovesByPokemon(pokemonId); - assertThat(moveResponses).isNotEmpty(); - }); - } - @Test @DisplayName("배틀 예상 결과를 계산한다.") void calculateBattleResult() { From 24215dfd68d8f2ef4b47779e103a2110c42ae61b Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 13:18:34 +0900 Subject: [PATCH 05/32] =?UTF-8?q?refactor:=20BattleService=EC=97=90?= =?UTF-8?q?=EC=84=9C=20InMemoryRepository=20=EB=B0=8F=20InMemory=20data=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/service/BattleService.java | 70 ++++++++----------- .../com/pokerogue/helper/move/data/Move.java | 5 ++ .../move/repository/MoveRepository.java | 7 ++ .../helper/pokemon/data/Pokemon.java | 7 ++ .../helper/pokemon/data/PokemonTest.java | 63 +++++++++++++++++ 5 files changed, 112 insertions(+), 40 deletions(-) create mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/move/repository/MoveRepository.java create mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTest.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index 93e8c2849..cb51c7f61 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -1,23 +1,19 @@ package com.pokerogue.helper.battle.service; -import com.pokerogue.helper.battle.BattleMoveRepository; -import com.pokerogue.helper.battle.data.BattleMove; import com.pokerogue.helper.battle.data.TypeMatching; import com.pokerogue.helper.battle.data.Weather; import com.pokerogue.helper.battle.dto.BattleResultResponse; -import com.pokerogue.helper.battle.dto.MoveResponse; import com.pokerogue.helper.battle.dto.WeatherResponse; import com.pokerogue.helper.battle.repository.TypeMatchingRepository; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; -import com.pokerogue.helper.pokemon.data.InMemoryPokemon; -import com.pokerogue.helper.pokemon.repository.InMemoryPokemonRepository; +import com.pokerogue.helper.move.data.Move; +import com.pokerogue.helper.move.repository.MoveRepository; +import com.pokerogue.helper.pokemon.data.Pokemon; +import com.pokerogue.helper.pokemon.repository.PokemonRepository; import com.pokerogue.helper.type.data.Type; -import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -25,12 +21,10 @@ @RequiredArgsConstructor public class BattleService { - private final BattleMoveRepository battleMoveRepository; - private final InMemoryPokemonRepository inMemoryPokemonRepository; + private final MoveRepository moveRepository; + private final PokemonRepository pokemonRepository; private final TypeMatchingRepository typeMatchingRepository; - private Map> findByDexnumberCache = new HashMap<>(); - public List findWeathers() { return Arrays.stream(Weather.values()) .map(WeatherResponse::from) @@ -44,57 +38,53 @@ public BattleResultResponse calculateBattleResult( String myMoveId) { Weather weather = Weather.findById(weatherId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.WEATHER_NOT_FOUND)); - InMemoryPokemon myInMemoryPokemon = inMemoryPokemonRepository.findById(myPokemonId) + Pokemon myPokemon = pokemonRepository.findById(myPokemonId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); - InMemoryPokemon rivalInMemoryPokemon = inMemoryPokemonRepository.findById(rivalPokemonId) + Pokemon rivalPokemon = pokemonRepository.findById(rivalPokemonId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); - BattleMove move = battleMoveRepository.findById(myMoveId) + Move move = moveRepository.findById(myMoveId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_CATEGORY_NOT_FOUND)); - Type moveType = move.type(); + Type moveType = Type.valueOf(move.getType().toUpperCase()); // Todo double finalAccuracy = calculateAccuracy(move, weather); - double totalMultiplier = getTotalMultiplier(move, weather, rivalInMemoryPokemon, myInMemoryPokemon); + double totalMultiplier = getTotalMultiplier(move, weather, rivalPokemon, myPokemon); return new BattleResultResponse( - move.power(), + move.getPower(), totalMultiplier, finalAccuracy, - move.name(), - move.effect(), + move.getName(), + move.getEffect(), moveType.getKoName(), - move.category().getName() + move.getMoveCategory() ); } - private double calculateAccuracy(BattleMove move, Weather weather) { + private double calculateAccuracy(Move move, Weather weather) { if (weather == Weather.FOG) { - return (double) move.accuracy() * 0.9; + return (double) move.getAccuracy() * 0.9; } - return (double) move.accuracy(); + return (double) move.getAccuracy(); } private double getTotalMultiplier( - BattleMove move, + Move move, Weather weather, - InMemoryPokemon rivalInMemoryPokemon, - InMemoryPokemon myInMemoryPokemon) { + Pokemon rivalPokemon, + Pokemon myPokemon) { if (!move.isAttackMove()) { return 1; } - Type moveType = move.type(); + Type moveType = Type.valueOf(move.getType()); // Todo double weatherMultiplier = getWeatherMultiplier(moveType, weather); - List types = new ArrayList<>(); - if (!rivalInMemoryPokemon.firstType().isEmpty()) { - types.add(Type.findByEngName(rivalInMemoryPokemon.firstType()) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND))); - } - if (!rivalInMemoryPokemon.secondType().isEmpty()) { - types.add(Type.findByEngName(rivalInMemoryPokemon.secondType()) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND))); - } + List types = rivalPokemon.getTypes() + .stream() + .map(String::toUpperCase) // Todo + .map(Type::valueOf) + .toList(); double typeMatchingMultiplier = getTypeMatchingMultiplier(moveType, types); - double sameTypeBonusMultiplier = getSameTypeAttackBonusMultiplier(moveType, myInMemoryPokemon); + double sameTypeBonusMultiplier = getSameTypeAttackBonusMultiplier(moveType, myPokemon); double stringWindMultiplier = getStringWindMultiplier(moveType, types, weather); return weatherMultiplier * typeMatchingMultiplier * sameTypeBonusMultiplier * stringWindMultiplier; @@ -135,8 +125,8 @@ private double getTypeMatchingMultiplier(Type moveType, List rivalPokemonT .reduce(1d, (a, b) -> a * b); } - private double getSameTypeAttackBonusMultiplier(Type moveType, InMemoryPokemon rivalInMemoryPokemon) { - if (rivalInMemoryPokemon.hasSameType(moveType)) { + private double getSameTypeAttackBonusMultiplier(Type moveType, Pokemon rivalPokemon) { + if (rivalPokemon.hasSameType(moveType)) { return 1.5; } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java index 564401b24..8af944a8b 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java @@ -1,5 +1,6 @@ package com.pokerogue.helper.move.data; +import com.pokerogue.helper.battle.data.MoveCategory; import java.util.List; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -60,4 +61,8 @@ public class Move { @Field("pokemonIds") private final List pokemonIds; + + public boolean isAttackMove() { + return MoveCategory.valueOf(this.moveCategory.toUpperCase()) != MoveCategory.STATUS; // Todo + } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/repository/MoveRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/repository/MoveRepository.java new file mode 100644 index 000000000..53564ad90 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/repository/MoveRepository.java @@ -0,0 +1,7 @@ +package com.pokerogue.helper.move.repository; + +import com.pokerogue.helper.move.data.Move; +import org.springframework.data.mongodb.repository.MongoRepository; + +public interface MoveRepository extends MongoRepository { +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java index b7eeaa011..a354415d4 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java @@ -1,5 +1,6 @@ package com.pokerogue.helper.pokemon.data; +import com.pokerogue.helper.type.data.Type; import java.util.List; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -110,4 +111,10 @@ public class Pokemon { @Field("biomeIds") private final List biomeIds; + + public boolean hasSameType(Type type) { + String name = type.getName(); + return this.types.stream() + .anyMatch(name::equals); + } } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTest.java new file mode 100644 index 000000000..3beb6f44d --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTest.java @@ -0,0 +1,63 @@ +package com.pokerogue.helper.pokemon.data; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.pokerogue.helper.type.data.Type; +import java.util.List; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class PokemonTest { + + @ParameterizedTest + @MethodSource(value = "typeAndExpectedResult") + @DisplayName("포켓몬이 가진 타입 일치를 확인한다.") + void hasSameType(Type type, boolean expectedResult) { + Pokemon bulbasaur = new Pokemon( + "1", // id + "bulbasaur-image-id", // imageId + 1, // pokedexNumber + "Bulbasaur", // name + "이상해씨", // koName + "Seed Pokémon", // speciesName + true, // canChangeForm + "Normal", // formName + 64, // baseExp + 70, // friendship + List.of("grass", "poison"), // types + List.of("Overgrow"), // normalAbilityIds + "Chlorophyll", // hiddenAbilityId + "None", // passiveAbilityId + 1, // generation + false, // legendary + false, // subLegendary + false, // mythical + List.of(), // evolutions + List.of(), // formChanges + 318, // baseTotal + 45, // hp + 49, // attack + 49, // defense + 65, // specialAttack + 65, // specialDefense + 45, // speed + 0.7, // height (in meters) + 6.9, // weight (in kilograms) + List.of("Leech Seed"), // eggMoveIds + List.of(), // levelMoves + List.of("TM01", "TM02"), // technicalMachineMoveIds + List.of("Forest", "Grassland") // biomeIds + ); + + boolean result = bulbasaur.hasSameType(type); + + assertThat(result).isEqualTo(expectedResult); + } + + private static Stream typeAndExpectedResult() { + return Stream.of(Arguments.of(Type.GRASS, true), Arguments.of(Type.FIRE, false)); + } +} From be51a180b65e6683f3e08eccbcbf2e17f968faa9 Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 14:28:32 +0900 Subject: [PATCH 06/32] =?UTF-8?q?refactor:=20WeatherMultiplier=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battle/service/WeatherMultiplier.java | 70 +++++++++++++++++++ .../battle/service/WeatherMultiplierTest.java | 40 +++++++++++ 2 files changed, 110 insertions(+) create mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java create mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierTest.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java new file mode 100644 index 000000000..bb9e5cef2 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java @@ -0,0 +1,70 @@ +package com.pokerogue.helper.battle.service; + +import com.pokerogue.helper.battle.data.Weather; +import com.pokerogue.helper.type.data.Type; +import org.springframework.stereotype.Component; + +@Component +public class WeatherMultiplier { + + private static final double STRONG_MULTIPLIER = 1.5; + private static final double WEAK_MULTIPLIER = 0.5; + private static final double ZERO_MULTIPLIER = 0; + private static final double DEFAULT_MULTIPLIER = 1; + + public double getByAttackMoveType(Weather weather, Type attackMoveType) { + if (weather == Weather.SUNNY) { + return getSunnyAttackTypeMultiplier(attackMoveType); + } + if (weather == Weather.HARSH_SUN) { + return getHarshSunAttackTypeMultiplier(attackMoveType); + } + if (weather == Weather.RAIN) { + return getRainAttackTypeMultiplier(attackMoveType); + } + if (weather == Weather.HEAVY_RAIN) { + return getHeavyRainAttackTypeMultiplier(attackMoveType); + } + return 1; + } + + private double getSunnyAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.FIRE) { + return STRONG_MULTIPLIER; + } + if (attackMoveType == Type.WATER) { + return WEAK_MULTIPLIER; + } + return DEFAULT_MULTIPLIER; + } + + private double getHarshSunAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.FIRE) { + return STRONG_MULTIPLIER; + } + if (attackMoveType == Type.WATER) { + return ZERO_MULTIPLIER; + } + return DEFAULT_MULTIPLIER; + } + + private double getRainAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.WATER) { + return STRONG_MULTIPLIER; + } + if (attackMoveType == Type.FIRE) { + return WEAK_MULTIPLIER; + } + return DEFAULT_MULTIPLIER; + } + + private double getHeavyRainAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.WATER) { + return STRONG_MULTIPLIER; + } + if (attackMoveType == Type.FIRE) { + return ZERO_MULTIPLIER; + } + return DEFAULT_MULTIPLIER; + } +} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierTest.java new file mode 100644 index 000000000..6c661c045 --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierTest.java @@ -0,0 +1,40 @@ +package com.pokerogue.helper.battle.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.pokerogue.helper.battle.data.Weather; +import com.pokerogue.helper.type.data.Type; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class WeatherMultiplierTest { + private final WeatherMultiplier weatherMultiplier = new WeatherMultiplier(); + + @ParameterizedTest + @MethodSource(value = "multiplierConditions") + @DisplayName("공격 기술 타입에 따른 배틀 날씨 배수를 구한다.") + void getAttackTypeMultiplier(Weather weather, Type attackMoveType, double expectedMultiplier) { + + double multiplier = weatherMultiplier.getByAttackMoveType(weather, attackMoveType); + + assertThat(multiplier).isEqualTo(expectedMultiplier); + } + + private static Stream multiplierConditions() { + return Stream.of( + Arguments.of(Weather.SUNNY, Type.FIRE, 1.5), + Arguments.of(Weather.HARSH_SUN, Type.FIRE, 1.5), + Arguments.of(Weather.RAIN, Type.FIRE, 0.5), + Arguments.of(Weather.HEAVY_RAIN, Type.FIRE, 0), + Arguments.of(Weather.SUNNY, Type.WATER, 0.5), + Arguments.of(Weather.HARSH_SUN, Type.WATER, 0), + Arguments.of(Weather.RAIN, Type.WATER, 1.5), + Arguments.of(Weather.HEAVY_RAIN, Type.WATER, 1.5), + Arguments.of(Weather.SUNNY, Type.BUG, 1), + Arguments.of(Weather.FOG, Type.FIRE, 1) + ); + } +} From fd4299d45e0f40008b7e4f6e0b4ed666f54a9dcb Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 14:59:17 +0900 Subject: [PATCH 07/32] =?UTF-8?q?refactor:=20BattleMultiplier=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/service/BattleMultiplier.java | 9 +++++++++ .../helper/battle/service/WeatherMultiplier.java | 7 +------ 2 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java new file mode 100644 index 000000000..795fb860a --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java @@ -0,0 +1,9 @@ +package com.pokerogue.helper.battle.service; + +public abstract class BattleMultiplier { + + protected static final double STRONG_MULTIPLIER = 1.5; + protected static final double WEAK_MULTIPLIER = 0.5; + protected static final double ZERO_MULTIPLIER = 0; + protected static final double DEFAULT_MULTIPLIER = 1; +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java index bb9e5cef2..2214896dd 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java @@ -5,12 +5,7 @@ import org.springframework.stereotype.Component; @Component -public class WeatherMultiplier { - - private static final double STRONG_MULTIPLIER = 1.5; - private static final double WEAK_MULTIPLIER = 0.5; - private static final double ZERO_MULTIPLIER = 0; - private static final double DEFAULT_MULTIPLIER = 1; +public class WeatherMultiplier extends BattleMultiplier { public double getByAttackMoveType(Weather weather, Type attackMoveType) { if (weather == Weather.SUNNY) { From 1333e6f4ff15d8d5c8f133251ac7b6a26d140e74 Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 14:59:59 +0900 Subject: [PATCH 08/32] =?UTF-8?q?refactor:=20TypeMultiplier=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/service/TypeMultiplier.java | 52 +++++++++++++++ .../battle/service/TypeMultiplierTest.java | 64 +++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java create mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierTest.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java new file mode 100644 index 000000000..8a46d0b20 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java @@ -0,0 +1,52 @@ +package com.pokerogue.helper.battle.service; + +import com.pokerogue.helper.battle.data.TypeMatching; +import com.pokerogue.helper.battle.repository.TypeMatchingRepository; +import com.pokerogue.helper.global.exception.ErrorMessage; +import com.pokerogue.helper.global.exception.GlobalCustomException; +import com.pokerogue.helper.pokemon.data.Pokemon; +import com.pokerogue.helper.type.data.Type; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class TypeMultiplier extends BattleMultiplier { + + private final TypeMatchingRepository typeMatchingRepository; + + public double getByTypeMatching(Type attackMoveType, List rivalPokemonTypes) { + return rivalPokemonTypes.stream() + .map(toType -> findTypeMatchingByFromAndTo(attackMoveType, toType)) + .map(TypeMatching::getResult) + .reduce(DEFAULT_MULTIPLIER, this::multiply); + } + + private double multiply(double a, double b) { + return a * b; + } + + public double getBySameTypeAttackBonus(Type moveType, Pokemon rivalPokemon) { + if (rivalPokemon.hasSameType(moveType)) { + return STRONG_MULTIPLIER; + } + + return DEFAULT_MULTIPLIER; + } + + public double getByStrongWind(Type moveType, List rivalPokemonTypes) { + TypeMatching typeMatching = findTypeMatchingByFromAndTo(moveType, Type.FLYING); + if (rivalPokemonTypes.contains(Type.FLYING) + && typeMatching.getResult() == 2) { + return WEAK_MULTIPLIER; + } + + return DEFAULT_MULTIPLIER; + } + + private TypeMatching findTypeMatchingByFromAndTo(Type from, Type to) { + return typeMatchingRepository.findByFromAndTo(from.getName(), to.getName()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TYPE_MATCHING_ERROR)); + } +} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierTest.java new file mode 100644 index 000000000..2c2c3dc0e --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierTest.java @@ -0,0 +1,64 @@ +package com.pokerogue.helper.battle.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.pokerogue.environment.service.ServiceTest; +import com.pokerogue.helper.pokemon.data.Pokemon; +import com.pokerogue.helper.pokemon.repository.PokemonRepository; +import com.pokerogue.helper.type.data.Type; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class TypeMultiplierTest extends ServiceTest { + + @Autowired + private TypeMultiplier typeMultiplier; + + @Autowired + private PokemonRepository pokemonRepository; + + @Test + @DisplayName("타입 상성에 따른 배틀 결과 배수를 구한다.") + void getByTypeMatching() { + Pokemon rivalPokemon = pokemonRepository.findById("squirtle").get(); + List rivalPokemonTypes = rivalPokemon.getTypes() + .stream() + .map(String::toUpperCase) // Todo + .map(Type::valueOf) + .toList(); + Type attackMoveType = Type.FIRE; + + double result = typeMultiplier.getByTypeMatching(attackMoveType, rivalPokemonTypes); + + assertThat(result).isEqualTo(2); + } + + @Test + @DisplayName("같은 타입 공격 보너스 배수를 구한다.") + void getBySameTypeAttackBonus() { + Pokemon rivalPokemon = pokemonRepository.findById("squirtle").get(); + Type attackMoveType = Type.WATER; + + double result = typeMultiplier.getBySameTypeAttackBonus(attackMoveType, rivalPokemon); + + assertThat(result).isEqualTo(1.5); + } + + @Test + @DisplayName("강한 바람이 불 때 비행타입 라이벌 포켓몬의 약점을 가려주는 배수를 구한다.") + void getByStrongWind() { + Pokemon rivalPokemon = pokemonRepository.findById("pidgey").get(); + List rivalPokemonTypes = rivalPokemon.getTypes() + .stream() + .map(String::toUpperCase) // Todo + .map(Type::valueOf) + .toList(); + Type attackMoveType = Type.ELECTRIC; + + double result = typeMultiplier.getByStrongWind(attackMoveType, rivalPokemonTypes); + + assertThat(result).isEqualTo(0.5); + } +} From c606cee971c89baf753802153758280a99ba86c0 Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 15:04:34 +0900 Subject: [PATCH 09/32] =?UTF-8?q?refactor:=20BattleService=EC=97=90?= =?UTF-8?q?=EC=84=9C=20WeatherMultiplier,=20TypeMultiplier=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/service/BattleService.java | 89 ++++--------------- 1 file changed, 19 insertions(+), 70 deletions(-) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index cb51c7f61..04b7c49cf 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -1,10 +1,8 @@ package com.pokerogue.helper.battle.service; -import com.pokerogue.helper.battle.data.TypeMatching; import com.pokerogue.helper.battle.data.Weather; import com.pokerogue.helper.battle.dto.BattleResultResponse; import com.pokerogue.helper.battle.dto.WeatherResponse; -import com.pokerogue.helper.battle.repository.TypeMatchingRepository; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; import com.pokerogue.helper.move.data.Move; @@ -21,9 +19,12 @@ @RequiredArgsConstructor public class BattleService { + private static final double FOG_ACCURACY_EFFECT = 0.9; + private final MoveRepository moveRepository; private final PokemonRepository pokemonRepository; - private final TypeMatchingRepository typeMatchingRepository; + private final WeatherMultiplier weatherMultiplier; + private final TypeMultiplier typeMultiplier; public List findWeathers() { return Arrays.stream(Weather.values()) @@ -43,11 +44,11 @@ public BattleResultResponse calculateBattleResult( Pokemon rivalPokemon = pokemonRepository.findById(rivalPokemonId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); Move move = moveRepository.findById(myMoveId) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_CATEGORY_NOT_FOUND)); + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)); Type moveType = Type.valueOf(move.getType().toUpperCase()); // Todo double finalAccuracy = calculateAccuracy(move, weather); - double totalMultiplier = getTotalMultiplier(move, weather, rivalPokemon, myPokemon); + double totalMultiplier = calculateTotalMultiplier(move, weather, rivalPokemon, myPokemon); return new BattleResultResponse( move.getPower(), @@ -62,13 +63,13 @@ public BattleResultResponse calculateBattleResult( private double calculateAccuracy(Move move, Weather weather) { if (weather == Weather.FOG) { - return (double) move.getAccuracy() * 0.9; + return (double) move.getAccuracy() * FOG_ACCURACY_EFFECT; } - return (double) move.getAccuracy(); + return move.getAccuracy(); } - private double getTotalMultiplier( + private double calculateTotalMultiplier( Move move, Weather weather, Pokemon rivalPokemon, @@ -76,72 +77,20 @@ private double getTotalMultiplier( if (!move.isAttackMove()) { return 1; } - Type moveType = Type.valueOf(move.getType()); // Todo - double weatherMultiplier = getWeatherMultiplier(moveType, weather); + Type moveType = Type.valueOf(move.getType().toUpperCase()); // Todo List types = rivalPokemon.getTypes() - .stream() - .map(String::toUpperCase) // Todo + .stream() // Todo + .map(String::toUpperCase) .map(Type::valueOf) .toList(); - double typeMatchingMultiplier = getTypeMatchingMultiplier(moveType, types); - double sameTypeBonusMultiplier = getSameTypeAttackBonusMultiplier(moveType, myPokemon); - double stringWindMultiplier = getStringWindMultiplier(moveType, types, weather); - - return weatherMultiplier * typeMatchingMultiplier * sameTypeBonusMultiplier * stringWindMultiplier; - } - - private double getWeatherMultiplier(Type moveType, Weather weather) { - if (moveType == Type.FIRE) { - if (weather == Weather.SUNNY || weather == Weather.HARSH_SUN) { - return 1.5; - } - if (weather == Weather.RAIN) { - return 0.5; - } - if (weather == Weather.HEAVY_RAIN) { - return 0; - } - } - if (moveType == Type.WATER) { - if (weather == Weather.SUNNY) { - return 0.5; - } - if (weather == Weather.HARSH_SUN) { - return 0; - } - if (weather == Weather.RAIN || weather == Weather.HEAVY_RAIN) { - return 1.5; - } - } - - return 1; - } - - private double getTypeMatchingMultiplier(Type moveType, List rivalPokemonTypes) { - return rivalPokemonTypes.stream() - .map(toType -> typeMatchingRepository.findByFromAndTo(moveType.getName(), toType.getName()) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TYPE_MATCHING_ERROR))) - .map(TypeMatching::getResult) - .reduce(1d, (a, b) -> a * b); - } - - private double getSameTypeAttackBonusMultiplier(Type moveType, Pokemon rivalPokemon) { - if (rivalPokemon.hasSameType(moveType)) { - return 1.5; - } - - return 1; - } - - private double getStringWindMultiplier(Type moveType, List rivalPokemonTypes, Weather weather) { - TypeMatching typeMatching = typeMatchingRepository.findByFromAndTo(moveType.getName(), Type.FLYING.getName()) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TYPE_MATCHING_ERROR)); - - if (weather == Weather.STRONG_WINDS && rivalPokemonTypes.contains(Type.FLYING) - && typeMatching.getResult() == 2) { - return 0.5; + double weatherMultiplierByAttackMoveType = weatherMultiplier.getByAttackMoveType(weather, moveType); + double typeMatchingMultiplier = typeMultiplier.getByTypeMatching(moveType, types); + double sameTypeBonusMultiplier = typeMultiplier.getBySameTypeAttackBonus(moveType, myPokemon); + double totalMultiplier = weatherMultiplierByAttackMoveType * typeMatchingMultiplier * sameTypeBonusMultiplier; + if (weather == Weather.STRONG_WINDS) { + totalMultiplier *= typeMultiplier.getByStrongWind(moveType, types); } - return 1; + return totalMultiplier; } } From b837ea0fffd2e3f24f2b17aecfd0df67c317682c Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 15:12:52 +0900 Subject: [PATCH 10/32] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=ED=99=94?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pokerogue/helper/battle/service/BattleService.java | 1 + .../com/pokerogue/helper/battle/service/TypeMultiplier.java | 4 +++- .../pokerogue/helper/battle/service/WeatherMultiplier.java | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index 04b7c49cf..c7feb0e40 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -20,6 +20,7 @@ public class BattleService { private static final double FOG_ACCURACY_EFFECT = 0.9; + private static final double DEFAULT_MULTIPLIER = 1; private final MoveRepository moveRepository; private final PokemonRepository pokemonRepository; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java index 8a46d0b20..2d1022c82 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java @@ -14,6 +14,8 @@ @RequiredArgsConstructor public class TypeMultiplier extends BattleMultiplier { + private static final double STRONG_TYPE_MATCHING_RESULT = 2; + private final TypeMatchingRepository typeMatchingRepository; public double getByTypeMatching(Type attackMoveType, List rivalPokemonTypes) { @@ -38,7 +40,7 @@ public double getBySameTypeAttackBonus(Type moveType, Pokemon rivalPokemon) { public double getByStrongWind(Type moveType, List rivalPokemonTypes) { TypeMatching typeMatching = findTypeMatchingByFromAndTo(moveType, Type.FLYING); if (rivalPokemonTypes.contains(Type.FLYING) - && typeMatching.getResult() == 2) { + && typeMatching.getResult() == STRONG_TYPE_MATCHING_RESULT) { return WEAK_MULTIPLIER; } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java index 2214896dd..3504b6d2b 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java @@ -20,7 +20,7 @@ public double getByAttackMoveType(Weather weather, Type attackMoveType) { if (weather == Weather.HEAVY_RAIN) { return getHeavyRainAttackTypeMultiplier(attackMoveType); } - return 1; + return DEFAULT_MULTIPLIER; } private double getSunnyAttackTypeMultiplier(Type attackMoveType) { From 10ee21c253a8580932b154e4aa72a13086d93509 Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 21:40:19 +0900 Subject: [PATCH 11/32] =?UTF-8?q?refactor:=20Weather=20enum=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=B0=B0=ED=8B=80=20=EB=82=A0=EC=94=A8=20=EB=B0=B0?= =?UTF-8?q?=EC=88=98=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pokerogue/helper/battle/data/Weather.java | 58 +++++++++++++++++ .../battle/service/WeatherMultiplier.java | 65 ------------------- .../helper/battle/data/WeatherTest.java | 39 +++++++++++ .../battle/service/WeatherMultiplierTest.java | 40 ------------ 4 files changed, 97 insertions(+), 105 deletions(-) delete mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java create mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/data/WeatherTest.java delete mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierTest.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java index 6c0f8a9e7..6b92ae3c3 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java @@ -1,5 +1,7 @@ package com.pokerogue.helper.battle.data; +import com.pokerogue.helper.battle.service.BattleMultiplier; +import com.pokerogue.helper.type.data.Type; import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -40,4 +42,60 @@ public static Optional findById(String id) { .filter(weather -> weather.id.equals(id)) .findAny(); } + + public BattleMultiplier getBattleMultiplierByAttackMoveType(Type attackMoveType) { + if (this == Weather.SUNNY) { + return getSunnyAttackTypeMultiplier(attackMoveType); + } + if (this == Weather.HARSH_SUN) { + return getHarshSunAttackTypeMultiplier(attackMoveType); + } + if (this == Weather.RAIN) { + return getRainAttackTypeMultiplier(attackMoveType); + } + if (this == Weather.HEAVY_RAIN) { + return getHeavyRainAttackTypeMultiplier(attackMoveType); + } + return BattleMultiplier.DEFAULT_MULTIPLIER; + } + + private BattleMultiplier getSunnyAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.FIRE) { + return BattleMultiplier.STRONG_MULTIPLIER; + } + if (attackMoveType == Type.WATER) { + return BattleMultiplier.WEAK_MULTIPLIER; + } + return BattleMultiplier.DEFAULT_MULTIPLIER; + } + + private BattleMultiplier getHarshSunAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.FIRE) { + return BattleMultiplier.STRONG_MULTIPLIER; + } + if (attackMoveType == Type.WATER) { + return BattleMultiplier.ZERO_MULTIPLIER; + } + return BattleMultiplier.DEFAULT_MULTIPLIER; + } + + private BattleMultiplier getRainAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.WATER) { + return BattleMultiplier.STRONG_MULTIPLIER; + } + if (attackMoveType == Type.FIRE) { + return BattleMultiplier.WEAK_MULTIPLIER; + } + return BattleMultiplier.DEFAULT_MULTIPLIER; + } + + private BattleMultiplier getHeavyRainAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.WATER) { + return BattleMultiplier.STRONG_MULTIPLIER; + } + if (attackMoveType == Type.FIRE) { + return BattleMultiplier.ZERO_MULTIPLIER; + } + return BattleMultiplier.DEFAULT_MULTIPLIER; + } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java deleted file mode 100644 index 3504b6d2b..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplier.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.pokerogue.helper.battle.service; - -import com.pokerogue.helper.battle.data.Weather; -import com.pokerogue.helper.type.data.Type; -import org.springframework.stereotype.Component; - -@Component -public class WeatherMultiplier extends BattleMultiplier { - - public double getByAttackMoveType(Weather weather, Type attackMoveType) { - if (weather == Weather.SUNNY) { - return getSunnyAttackTypeMultiplier(attackMoveType); - } - if (weather == Weather.HARSH_SUN) { - return getHarshSunAttackTypeMultiplier(attackMoveType); - } - if (weather == Weather.RAIN) { - return getRainAttackTypeMultiplier(attackMoveType); - } - if (weather == Weather.HEAVY_RAIN) { - return getHeavyRainAttackTypeMultiplier(attackMoveType); - } - return DEFAULT_MULTIPLIER; - } - - private double getSunnyAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.FIRE) { - return STRONG_MULTIPLIER; - } - if (attackMoveType == Type.WATER) { - return WEAK_MULTIPLIER; - } - return DEFAULT_MULTIPLIER; - } - - private double getHarshSunAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.FIRE) { - return STRONG_MULTIPLIER; - } - if (attackMoveType == Type.WATER) { - return ZERO_MULTIPLIER; - } - return DEFAULT_MULTIPLIER; - } - - private double getRainAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.WATER) { - return STRONG_MULTIPLIER; - } - if (attackMoveType == Type.FIRE) { - return WEAK_MULTIPLIER; - } - return DEFAULT_MULTIPLIER; - } - - private double getHeavyRainAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.WATER) { - return STRONG_MULTIPLIER; - } - if (attackMoveType == Type.FIRE) { - return ZERO_MULTIPLIER; - } - return DEFAULT_MULTIPLIER; - } -} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/data/WeatherTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/data/WeatherTest.java new file mode 100644 index 000000000..b76703454 --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/data/WeatherTest.java @@ -0,0 +1,39 @@ +package com.pokerogue.helper.battle.data; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.pokerogue.helper.battle.service.BattleMultiplier; +import com.pokerogue.helper.type.data.Type; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class WeatherTest { + + @ParameterizedTest + @MethodSource(value = "multiplierConditions") + @DisplayName("공격 기술 타입에 따른 배틀 날씨 배수를 구한다.") + void getAttackTypeMultiplier(Weather weather, Type attackMoveType, BattleMultiplier expectedMultiplier) { + + BattleMultiplier multiplier = weather.getBattleMultiplierByAttackMoveType(attackMoveType); + + assertThat(multiplier).isEqualTo(expectedMultiplier); + } + + private static Stream multiplierConditions() { + return Stream.of( + Arguments.of(Weather.SUNNY, Type.FIRE, BattleMultiplier.STRONG_MULTIPLIER), + Arguments.of(Weather.HARSH_SUN, Type.FIRE, BattleMultiplier.STRONG_MULTIPLIER), + Arguments.of(Weather.RAIN, Type.FIRE, BattleMultiplier.WEAK_MULTIPLIER), + Arguments.of(Weather.HEAVY_RAIN, Type.FIRE, BattleMultiplier.ZERO_MULTIPLIER), + Arguments.of(Weather.SUNNY, Type.WATER, BattleMultiplier.WEAK_MULTIPLIER), + Arguments.of(Weather.HARSH_SUN, Type.WATER, BattleMultiplier.ZERO_MULTIPLIER), + Arguments.of(Weather.RAIN, Type.WATER, BattleMultiplier.STRONG_MULTIPLIER), + Arguments.of(Weather.HEAVY_RAIN, Type.WATER, BattleMultiplier.STRONG_MULTIPLIER), + Arguments.of(Weather.SUNNY, Type.BUG, BattleMultiplier.DEFAULT_MULTIPLIER), + Arguments.of(Weather.FOG, Type.FIRE, BattleMultiplier.DEFAULT_MULTIPLIER) + ); + } +} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierTest.java deleted file mode 100644 index 6c661c045..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pokerogue.helper.battle.service; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.pokerogue.helper.battle.data.Weather; -import com.pokerogue.helper.type.data.Type; -import java.util.stream.Stream; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -class WeatherMultiplierTest { - private final WeatherMultiplier weatherMultiplier = new WeatherMultiplier(); - - @ParameterizedTest - @MethodSource(value = "multiplierConditions") - @DisplayName("공격 기술 타입에 따른 배틀 날씨 배수를 구한다.") - void getAttackTypeMultiplier(Weather weather, Type attackMoveType, double expectedMultiplier) { - - double multiplier = weatherMultiplier.getByAttackMoveType(weather, attackMoveType); - - assertThat(multiplier).isEqualTo(expectedMultiplier); - } - - private static Stream multiplierConditions() { - return Stream.of( - Arguments.of(Weather.SUNNY, Type.FIRE, 1.5), - Arguments.of(Weather.HARSH_SUN, Type.FIRE, 1.5), - Arguments.of(Weather.RAIN, Type.FIRE, 0.5), - Arguments.of(Weather.HEAVY_RAIN, Type.FIRE, 0), - Arguments.of(Weather.SUNNY, Type.WATER, 0.5), - Arguments.of(Weather.HARSH_SUN, Type.WATER, 0), - Arguments.of(Weather.RAIN, Type.WATER, 1.5), - Arguments.of(Weather.HEAVY_RAIN, Type.WATER, 1.5), - Arguments.of(Weather.SUNNY, Type.BUG, 1), - Arguments.of(Weather.FOG, Type.FIRE, 1) - ); - } -} From 4a9c9f0ab6093323e803d3613e7e05457d20ac6b Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 21:43:04 +0900 Subject: [PATCH 12/32] =?UTF-8?q?refactor:=20WeatherService=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battle/controller/BattleController.java | 4 ++- .../helper/battle/service/WeatherService.java | 17 +++++++++++ .../battle/service/WeatherServiceTest.java | 29 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherService.java create mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherServiceTest.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java index 3d0f2bd60..09c9dcc16 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/controller/BattleController.java @@ -3,6 +3,7 @@ import com.pokerogue.helper.battle.dto.BattleResultResponse; import com.pokerogue.helper.battle.dto.WeatherResponse; import com.pokerogue.helper.battle.service.BattleService; +import com.pokerogue.helper.battle.service.WeatherService; import com.pokerogue.helper.util.dto.ApiResponse; import java.util.List; import lombok.RequiredArgsConstructor; @@ -16,11 +17,12 @@ @RequiredArgsConstructor public class BattleController { + private final WeatherService weatherService; private final BattleService battleService; @GetMapping("/api/v1/weathers") public ApiResponse> weatherList() { - return new ApiResponse<>("날씨 리스트 불러오기에 성공했습니다.", battleService.findWeathers()); + return new ApiResponse<>("날씨 리스트 불러오기에 성공했습니다.", weatherService.findWeathers()); } @GetMapping("/api/v1/battle") diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherService.java new file mode 100644 index 000000000..4bba1ec56 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherService.java @@ -0,0 +1,17 @@ +package com.pokerogue.helper.battle.service; + +import com.pokerogue.helper.battle.data.Weather; +import com.pokerogue.helper.battle.dto.WeatherResponse; +import java.util.Arrays; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class WeatherService { + + public List findWeathers() { + return Arrays.stream(Weather.values()) + .map(WeatherResponse::from) + .toList(); + } +} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherServiceTest.java new file mode 100644 index 000000000..7fa25f301 --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherServiceTest.java @@ -0,0 +1,29 @@ +package com.pokerogue.helper.battle.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import com.pokerogue.environment.service.ServiceTest; +import com.pokerogue.helper.battle.data.Weather; +import com.pokerogue.helper.battle.dto.WeatherResponse; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class WeatherServiceTest extends ServiceTest { + + @Autowired + private WeatherService weatherService; + + @Test + @DisplayName("모든 날씨 목록을 조회한다.") + void findWeathers() { + List weatherResponses = weatherService.findWeathers(); + + List allWeathers = Arrays.stream(Weather.values()) + .toList(); + assertThat(weatherResponses).hasSize(allWeathers.size()); + } +} From d9f2ec5bdac8eae0acfd15bb9e80686cb4e1e1a0 Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 21:43:49 +0900 Subject: [PATCH 13/32] =?UTF-8?q?refactor:=20BattleMultiplier=20VO=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battle/service/BattleMultiplier.java | 64 +++++++++++++++++-- .../battle/service/BattleMultiplierTest.java | 63 ++++++++++++++++++ 2 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java index 795fb860a..601ec4aad 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java @@ -1,9 +1,63 @@ package com.pokerogue.helper.battle.service; -public abstract class BattleMultiplier { +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import lombok.Getter; - protected static final double STRONG_MULTIPLIER = 1.5; - protected static final double WEAK_MULTIPLIER = 0.5; - protected static final double ZERO_MULTIPLIER = 0; - protected static final double DEFAULT_MULTIPLIER = 1; +@Getter +public final class BattleMultiplier { + + public static final BattleMultiplier STRONG_MULTIPLIER = new BattleMultiplier(1.5); + public static final BattleMultiplier WEAK_MULTIPLIER = new BattleMultiplier(0.5); + public static final BattleMultiplier ZERO_MULTIPLIER = new BattleMultiplier(0); + public static final BattleMultiplier DEFAULT_MULTIPLIER = new BattleMultiplier(1); + private static final Map CACHE = new HashMap<>(); + + static { + CACHE.put(STRONG_MULTIPLIER.value, STRONG_MULTIPLIER); + CACHE.put(WEAK_MULTIPLIER.value, WEAK_MULTIPLIER); + CACHE.put(ZERO_MULTIPLIER.value, ZERO_MULTIPLIER); + CACHE.put(DEFAULT_MULTIPLIER.value, DEFAULT_MULTIPLIER); // Todo: 캐싱 추가 + } + + private final double value; + + private BattleMultiplier(double value) { + this.value = value; + } + + public static BattleMultiplier valueOf(double value) { + return CACHE.getOrDefault(value, new BattleMultiplier(value)); + } + + public static BattleMultiplier multiply(BattleMultiplier... others) { + double result = Arrays.stream(others) + .map(BattleMultiplier::getValue) + .reduce(1d, (a, b) -> a * b); + return BattleMultiplier.valueOf(result); + } + + public BattleMultiplier multiply(BattleMultiplier other) { + double result = this.value * other.value; + return BattleMultiplier.valueOf(result); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + BattleMultiplier that = (BattleMultiplier) o; + return Double.compare(that.value, value) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java new file mode 100644 index 000000000..ba3f6a7a9 --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java @@ -0,0 +1,63 @@ +package com.pokerogue.helper.battle.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +class BattleMultiplierTest { + + @Test + @DisplayName("배틀배수끼리 동등하다.") + void hasSemanticEquality() { + BattleMultiplier multiplier = BattleMultiplier.valueOf(3); + BattleMultiplier otherMultiplier = BattleMultiplier.valueOf(3); + + assertThat(multiplier).isEqualTo(otherMultiplier); + } + + @ParameterizedTest + @MethodSource(value = "constantBattleMultipliers") + @DisplayName("배틀 배수 상수는 캐싱한다.") + void cacheConstants(BattleMultiplier constantBattleMultiplier) { + double constantValue = constantBattleMultiplier.getValue(); + + BattleMultiplier sameValueMultiplier = BattleMultiplier.valueOf(constantValue); + + assertThat(sameValueMultiplier).isSameAs(constantBattleMultiplier); + } + + private static Stream constantBattleMultipliers() { + return Stream.of( + BattleMultiplier.ZERO_MULTIPLIER, + BattleMultiplier.WEAK_MULTIPLIER, + BattleMultiplier.STRONG_MULTIPLIER, + BattleMultiplier.DEFAULT_MULTIPLIER + ); + } + + @Test + @DisplayName("배틀 배수 두 개를 곱한다.") + void multiply() { + BattleMultiplier multiplier = BattleMultiplier.valueOf(2); + + BattleMultiplier multipliedResult = multiplier.multiply(BattleMultiplier.valueOf(1.5)); + + assertThat(multipliedResult).isEqualTo(BattleMultiplier.valueOf(3)); + } + + @Test + @DisplayName("배틀 배수 여러개를 곱한다.") + void multiplyMultiple() { + BattleMultiplier alpha = BattleMultiplier.valueOf(2); + BattleMultiplier beta = BattleMultiplier.valueOf(1.5); + BattleMultiplier gamma = BattleMultiplier.valueOf(0.5); + + BattleMultiplier multipliedResult = BattleMultiplier.multiply(alpha, beta, gamma); + + assertThat(multipliedResult).isEqualTo(BattleMultiplier.valueOf(1.5)); + } +} From f1508121943c28d8bcb2e4636e9ee9ef0c05733e Mon Sep 17 00:00:00 2001 From: jongmee Date: Wed, 25 Sep 2024 21:46:51 +0900 Subject: [PATCH 14/32] =?UTF-8?q?refactor:=20TypeMultiplierProvider=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/service/BattleService.java | 32 ++++++++----------- ...plier.java => TypeMultiplierProvider.java} | 23 ++++++------- ...t.java => TypeMultiplierProviderTest.java} | 17 +++++----- 3 files changed, 33 insertions(+), 39 deletions(-) rename backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/{TypeMultiplier.java => TypeMultiplierProvider.java} (69%) rename backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/{TypeMultiplierTest.java => TypeMultiplierProviderTest.java} (71%) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index c7feb0e40..52ae556b4 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -2,7 +2,6 @@ import com.pokerogue.helper.battle.data.Weather; import com.pokerogue.helper.battle.dto.BattleResultResponse; -import com.pokerogue.helper.battle.dto.WeatherResponse; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; import com.pokerogue.helper.move.data.Move; @@ -10,7 +9,6 @@ import com.pokerogue.helper.pokemon.data.Pokemon; import com.pokerogue.helper.pokemon.repository.PokemonRepository; import com.pokerogue.helper.type.data.Type; -import java.util.Arrays; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -20,18 +18,10 @@ public class BattleService { private static final double FOG_ACCURACY_EFFECT = 0.9; - private static final double DEFAULT_MULTIPLIER = 1; private final MoveRepository moveRepository; private final PokemonRepository pokemonRepository; - private final WeatherMultiplier weatherMultiplier; - private final TypeMultiplier typeMultiplier; - - public List findWeathers() { - return Arrays.stream(Weather.values()) - .map(WeatherResponse::from) - .toList(); - } + private final TypeMultiplierProvider typeMultiplierProvider; public BattleResultResponse calculateBattleResult( String weatherId, @@ -76,22 +66,28 @@ private double calculateTotalMultiplier( Pokemon rivalPokemon, Pokemon myPokemon) { if (!move.isAttackMove()) { - return 1; + return BattleMultiplier.DEFAULT_MULTIPLIER.getValue(); } + Type moveType = Type.valueOf(move.getType().toUpperCase()); // Todo List types = rivalPokemon.getTypes() .stream() // Todo .map(String::toUpperCase) .map(Type::valueOf) .toList(); - double weatherMultiplierByAttackMoveType = weatherMultiplier.getByAttackMoveType(weather, moveType); - double typeMatchingMultiplier = typeMultiplier.getByTypeMatching(moveType, types); - double sameTypeBonusMultiplier = typeMultiplier.getBySameTypeAttackBonus(moveType, myPokemon); - double totalMultiplier = weatherMultiplierByAttackMoveType * typeMatchingMultiplier * sameTypeBonusMultiplier; + BattleMultiplier weatherMultiplier = weather.getBattleMultiplierByAttackMoveType(moveType); + BattleMultiplier sameTypeBonusMultiplier = typeMultiplierProvider.getBySameTypeAttackBonus(moveType, myPokemon); + List typeMatchingMultipliers = typeMultiplierProvider.getAllByTypeMatchings(moveType, types); + + BattleMultiplier typeMatchingMultiplier = BattleMultiplier.multiply( + typeMatchingMultipliers.toArray(new BattleMultiplier[0])); + BattleMultiplier totalMultiplier = BattleMultiplier.multiply(weatherMultiplier, sameTypeBonusMultiplier, + typeMatchingMultiplier); if (weather == Weather.STRONG_WINDS) { - totalMultiplier *= typeMultiplier.getByStrongWind(moveType, types); + BattleMultiplier strongWindMultiplier = typeMultiplierProvider.getByStrongWind(moveType, types); + totalMultiplier.multiply(strongWindMultiplier); } - return totalMultiplier; + return totalMultiplier.getValue(); } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java similarity index 69% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java index 2d1022c82..72717a170 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplier.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java @@ -12,39 +12,36 @@ @Component @RequiredArgsConstructor -public class TypeMultiplier extends BattleMultiplier { +public class TypeMultiplierProvider { private static final double STRONG_TYPE_MATCHING_RESULT = 2; private final TypeMatchingRepository typeMatchingRepository; - public double getByTypeMatching(Type attackMoveType, List rivalPokemonTypes) { + public List getAllByTypeMatchings(Type attackMoveType, List rivalPokemonTypes) { return rivalPokemonTypes.stream() .map(toType -> findTypeMatchingByFromAndTo(attackMoveType, toType)) .map(TypeMatching::getResult) - .reduce(DEFAULT_MULTIPLIER, this::multiply); + .map(BattleMultiplier::valueOf) + .toList(); } - private double multiply(double a, double b) { - return a * b; - } - - public double getBySameTypeAttackBonus(Type moveType, Pokemon rivalPokemon) { + public BattleMultiplier getBySameTypeAttackBonus(Type moveType, Pokemon rivalPokemon) { if (rivalPokemon.hasSameType(moveType)) { - return STRONG_MULTIPLIER; + return BattleMultiplier.STRONG_MULTIPLIER; } - return DEFAULT_MULTIPLIER; + return BattleMultiplier.DEFAULT_MULTIPLIER; } - public double getByStrongWind(Type moveType, List rivalPokemonTypes) { + public BattleMultiplier getByStrongWind(Type moveType, List rivalPokemonTypes) { TypeMatching typeMatching = findTypeMatchingByFromAndTo(moveType, Type.FLYING); if (rivalPokemonTypes.contains(Type.FLYING) && typeMatching.getResult() == STRONG_TYPE_MATCHING_RESULT) { - return WEAK_MULTIPLIER; + return BattleMultiplier.WEAK_MULTIPLIER; } - return DEFAULT_MULTIPLIER; + return BattleMultiplier.DEFAULT_MULTIPLIER; } private TypeMatching findTypeMatchingByFromAndTo(Type from, Type to) { diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierProviderTest.java similarity index 71% rename from backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierTest.java rename to backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierProviderTest.java index 2c2c3dc0e..6415e92b0 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierProviderTest.java @@ -11,10 +11,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -class TypeMultiplierTest extends ServiceTest { +class TypeMultiplierProviderTest extends ServiceTest { @Autowired - private TypeMultiplier typeMultiplier; + private TypeMultiplierProvider typeMultiplierProvider; @Autowired private PokemonRepository pokemonRepository; @@ -30,9 +30,10 @@ void getByTypeMatching() { .toList(); Type attackMoveType = Type.FIRE; - double result = typeMultiplier.getByTypeMatching(attackMoveType, rivalPokemonTypes); + List multipliers = typeMultiplierProvider.getAllByTypeMatchings(attackMoveType, + rivalPokemonTypes); - assertThat(result).isEqualTo(2); + assertThat(multipliers).contains(BattleMultiplier.valueOf(2)); } @Test @@ -41,9 +42,9 @@ void getBySameTypeAttackBonus() { Pokemon rivalPokemon = pokemonRepository.findById("squirtle").get(); Type attackMoveType = Type.WATER; - double result = typeMultiplier.getBySameTypeAttackBonus(attackMoveType, rivalPokemon); + BattleMultiplier multiplier = typeMultiplierProvider.getBySameTypeAttackBonus(attackMoveType, rivalPokemon); - assertThat(result).isEqualTo(1.5); + assertThat(multiplier).isEqualTo(BattleMultiplier.STRONG_MULTIPLIER); } @Test @@ -57,8 +58,8 @@ void getByStrongWind() { .toList(); Type attackMoveType = Type.ELECTRIC; - double result = typeMultiplier.getByStrongWind(attackMoveType, rivalPokemonTypes); + BattleMultiplier multiplier = typeMultiplierProvider.getByStrongWind(attackMoveType, rivalPokemonTypes); - assertThat(result).isEqualTo(0.5); + assertThat(multiplier).isEqualTo(BattleMultiplier.WEAK_MULTIPLIER); } } From 8ebc136325f9278169dd6156cc8978dc0e0ff72e Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 26 Sep 2024 01:04:16 +0900 Subject: [PATCH 15/32] =?UTF-8?q?fix:=20Mongo=20Document=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pokerogue/helper/move/data/Move.java | 39 +++++----- .../helper/pokemon/data/Evolution.java | 16 +++-- .../helper/pokemon/data/FormChange.java | 14 ++-- .../helper/pokemon/data/LevelMove.java | 9 ++- .../helper/pokemon/data/Pokemon.java | 72 ++++++++++--------- 5 files changed, 80 insertions(+), 70 deletions(-) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java index 8af944a8b..1f9c9f3c6 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java @@ -2,65 +2,66 @@ import com.pokerogue.helper.battle.data.MoveCategory; import java.util.List; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; -import software.amazon.awssdk.services.s3.endpoints.internal.Value.Str; @Getter -@RequiredArgsConstructor +@AllArgsConstructor +@NoArgsConstructor @Document(collection = "move") public class Move { @Id - private final String id; + private String id; @Field("name") - private final String name; + private String name; @Field("koName") - private final String koName; + private String koName; @Field("type") - private final String type; // Todo enum 사용 + private String type; // Todo enum 사용 @Field("moveCategory") - private final String moveCategory; // Todo + private String moveCategory; // Todo @Field("moveTarget") - private final String moveTarget; // Todo enum 만들기 + private String moveTarget; // Todo enum 만들기 @Field("power") - private final int power; + private int power; @Field("accuracy") - private final int accuracy; + private int accuracy; @Field("powerPoint") - private final int powerPoint; + private int powerPoint; @Field("effect") - private final String effect; + private String effect; @Field("effectChance") - private final int effectChance; + private int effectChance; @Field("priority") - private final int priority; + private int priority; @Field("generation") - private final int generation; + private int generation; @Field("released") - private final String released; + private String released; @Field("flags") - private final List flags; // Todo enum 사용 + private List flags; // Todo enum 사용 @Field("pokemonIds") - private final List pokemonIds; + private List pokemonIds; public boolean isAttackMove() { return MoveCategory.valueOf(this.moveCategory.toUpperCase()) != MoveCategory.STATUS; // Todo diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Evolution.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Evolution.java index f8f92a77c..3b0036935 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Evolution.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Evolution.java @@ -1,17 +1,19 @@ package com.pokerogue.helper.pokemon.data; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.NoArgsConstructor; @Getter -@RequiredArgsConstructor +@AllArgsConstructor +@NoArgsConstructor public final class Evolution { - private final String from; - private final String level; - private final String to; - private final String item; - private final String condition; + private String from; + private String level; + private String to; + private String item; + private String condition; public String from() { // Todo: 이 메소드들 지우기 return from; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/FormChange.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/FormChange.java index 123e7a733..d8f005d80 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/FormChange.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/FormChange.java @@ -1,14 +1,16 @@ package com.pokerogue.helper.pokemon.data; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.NoArgsConstructor; @Getter -@RequiredArgsConstructor +@AllArgsConstructor +@NoArgsConstructor public class FormChange { - private final String from; - private final String previousForm; - private final String currentForm; - private final String item; // Todo: enum + private String from; + private String previousForm; + private String currentForm; + private String item; // Todo: enum } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/LevelMove.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/LevelMove.java index 086ee4440..56a606f2c 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/LevelMove.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/LevelMove.java @@ -1,12 +1,15 @@ package com.pokerogue.helper.pokemon.data; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; @Getter -@RequiredArgsConstructor +@AllArgsConstructor +@NoArgsConstructor public class LevelMove { - private final int level; - private final String moveId; + private int level; + private String moveId; } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java index a354415d4..e1517117d 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java @@ -2,115 +2,117 @@ import com.pokerogue.helper.type.data.Type; import java.util.List; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Getter -@RequiredArgsConstructor +@AllArgsConstructor +@NoArgsConstructor @Document(collection = "pokemon") public class Pokemon { @Id - private final String id; + private String id; @Field("imageId") - private final String imageId; + private String imageId; @Field("pokedexNumber") - private final int pokedexNumber; + private int pokedexNumber; @Field("name") - private final String name; + private String name; @Field("koName") - private final String koName; + private String koName; @Field("speciesName") - private final String speciesName; + private String speciesName; @Field("canChangeForm") - private final boolean canChangeForm; + private boolean canChangeForm; @Field("formName") - private final String formName; + private String formName; @Field("baseExp") - private final int baseExp; + private int baseExp; @Field("friendship") - private final int friendship; + private int friendship; @Field("types") - private final List types; // Todo enum + private List types; // Todo enum @Field("normalAbilityIds") - private final List normalAbilityIds; + private List normalAbilityIds; @Field("hiddenAbilityId") - private final String hiddenAbilityId; + private String hiddenAbilityId; @Field("passiveAbilityId") - private final String passiveAbilityId; + private String passiveAbilityId; @Field("generation") - private final int generation; + private int generation; @Field("legendary") - private final boolean legendary; + private boolean legendary; @Field("subLegendary") - private final boolean subLegendary; + private boolean subLegendary; @Field("mythical") - private final boolean mythical; + private boolean mythical; @Field("evolutions") - private final List evolutions; + private List evolutions; @Field("formChanges") - private final List formChanges; + private List formChanges; @Field("baseTotal") - private final int baseTotal; + private int baseTotal; @Field("hp") - private final int hp; + private int hp; @Field("attack") - private final int attack; + private int attack; @Field("defense") - private final int defense; + private int defense; @Field("specialAttack") - private final int specialAttack; + private int specialAttack; @Field("specialDefense") - private final int specialDefense; + private int specialDefense; @Field("speed") - private final int speed; + private int speed; @Field("height") - private final double height; + private double height; @Field("weight") - private final double weight; + private double weight; @Field("eggMoveIds") - private final List eggMoveIds; + private List eggMoveIds; @Field("levelMoves") - private final List levelMoves; + private List levelMoves; @Field("technicalMachineMoveIds") - private final List technicalMachineMoveIds; + private List technicalMachineMoveIds; @Field("biomeIds") - private final List biomeIds; + private List biomeIds; public boolean hasSameType(Type type) { String name = type.getName(); From 701cf9bcac93a5b261dd90e2ad37dae8cda192a0 Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 26 Sep 2024 14:22:21 +0900 Subject: [PATCH 16/32] =?UTF-8?q?style:=20return=20=EB=AC=B8=20=EC=A0=84?= =?UTF-8?q?=EC=97=90=20=EA=B0=9C=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/pokerogue/helper/battle/data/BattleMove.java | 5 ----- .../main/java/com/pokerogue/helper/battle/data/Weather.java | 5 +++++ .../pokerogue/helper/battle/service/BattleMultiplier.java | 3 +++ 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java index 477c05474..276a095e0 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java @@ -1,6 +1,5 @@ package com.pokerogue.helper.battle.data; -import com.pokerogue.helper.battle.data.MoveCategory; import com.pokerogue.helper.type.data.Type; public record BattleMove( @@ -20,8 +19,4 @@ public record BattleMove( Integer generation, String flags ) { - - public boolean isAttackMove() { - return this.category != MoveCategory.STATUS; - } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java index 6b92ae3c3..33cf5cbae 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java @@ -56,6 +56,7 @@ public BattleMultiplier getBattleMultiplierByAttackMoveType(Type attackMoveType) if (this == Weather.HEAVY_RAIN) { return getHeavyRainAttackTypeMultiplier(attackMoveType); } + return BattleMultiplier.DEFAULT_MULTIPLIER; } @@ -66,6 +67,7 @@ private BattleMultiplier getSunnyAttackTypeMultiplier(Type attackMoveType) { if (attackMoveType == Type.WATER) { return BattleMultiplier.WEAK_MULTIPLIER; } + return BattleMultiplier.DEFAULT_MULTIPLIER; } @@ -76,6 +78,7 @@ private BattleMultiplier getHarshSunAttackTypeMultiplier(Type attackMoveType) { if (attackMoveType == Type.WATER) { return BattleMultiplier.ZERO_MULTIPLIER; } + return BattleMultiplier.DEFAULT_MULTIPLIER; } @@ -86,6 +89,7 @@ private BattleMultiplier getRainAttackTypeMultiplier(Type attackMoveType) { if (attackMoveType == Type.FIRE) { return BattleMultiplier.WEAK_MULTIPLIER; } + return BattleMultiplier.DEFAULT_MULTIPLIER; } @@ -96,6 +100,7 @@ private BattleMultiplier getHeavyRainAttackTypeMultiplier(Type attackMoveType) { if (attackMoveType == Type.FIRE) { return BattleMultiplier.ZERO_MULTIPLIER; } + return BattleMultiplier.DEFAULT_MULTIPLIER; } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java index 601ec4aad..e69f6fc08 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java @@ -36,11 +36,13 @@ public static BattleMultiplier multiply(BattleMultiplier... others) { double result = Arrays.stream(others) .map(BattleMultiplier::getValue) .reduce(1d, (a, b) -> a * b); + return BattleMultiplier.valueOf(result); } public BattleMultiplier multiply(BattleMultiplier other) { double result = this.value * other.value; + return BattleMultiplier.valueOf(result); } @@ -53,6 +55,7 @@ public boolean equals(Object o) { return false; } BattleMultiplier that = (BattleMultiplier) o; + return Double.compare(that.value, value) == 0; } From 49b5cf41ef306b3587bcc8937b8bb80e638dd9af Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 26 Sep 2024 14:26:39 +0900 Subject: [PATCH 17/32] rm: TypeMatchingRepositoryTest --- .../TypeMatchingRepositoryTest.java | 34 ------------------- 1 file changed, 34 deletions(-) delete mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/repository/TypeMatchingRepositoryTest.java diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/repository/TypeMatchingRepositoryTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/repository/TypeMatchingRepositoryTest.java deleted file mode 100644 index 11a910fac..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/repository/TypeMatchingRepositoryTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.pokerogue.helper.battle.repository; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.pokerogue.helper.battle.data.TypeMatching; -import com.pokerogue.helper.type.data.Type; -import java.util.Optional; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; -import org.springframework.test.context.ActiveProfiles; - -@DataMongoTest -@ActiveProfiles("local") -class TypeMatchingRepositoryTest { - - @Autowired - private TypeMatchingRepository typeMatchingRepository; - - @Test - @DisplayName("타입 간 상성 결과를 조회한다.") - void findByFromAndTo() { - // given - String from = Type.BUG.getName(); - String to = Type.FIRE.getName(); - - // when - Optional typeMatching =typeMatchingRepository.findByFromAndTo(from, to); - - // then - assertThat(typeMatching).isNotEmpty(); - } -} From f95072f7dfeca2d814e81fd562ac03732d0178f7 Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 26 Sep 2024 14:28:00 +0900 Subject: [PATCH 18/32] =?UTF-8?q?refactor:=20BattleServiceTest=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/{ => service}/BattleServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename backend/pokerogue/src/test/java/com/pokerogue/helper/battle/{ => service}/BattleServiceTest.java (96%) diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleServiceTest.java similarity index 96% rename from backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java rename to backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleServiceTest.java index 3e9771c67..57564a4bd 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleServiceTest.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.battle.service; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; From e09fa380c5f014220fc4a917122524999e02a080 Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 26 Sep 2024 14:32:08 +0900 Subject: [PATCH 19/32] remove: DataInitializer --- .../helper/battle/DataInitializer.java | 97 ------------------- .../helper/battle/DataInitializerTest.java | 25 ----- 2 files changed, 122 deletions(-) delete mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java delete mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java deleted file mode 100644 index 43f473526..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.pokerogue.helper.battle; - -import com.pokerogue.helper.battle.data.BattleMove; -import com.pokerogue.helper.battle.data.MoveCategory; -import com.pokerogue.helper.global.exception.ErrorMessage; -import com.pokerogue.helper.global.exception.GlobalCustomException; -import com.pokerogue.helper.type.data.Type; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class DataInitializer implements ApplicationRunner { - - private static final int FIRST_LINE_NUMBER = 3; - private static final String FIELD_DELIMITER = "/"; - private static final String LIST_DELIMITER = ","; - - private final BattleMoveRepository battleMoveRepository; - - @Override - public void run(ApplicationArguments args) { - saveData("data/battle/battle-move.txt", fields -> { - BattleMove battleMove = createMove(fields); - battleMoveRepository.save(battleMove); - }); - } - - private void saveData(String path, Consumer> createAndSaveOperation) { - try (InputStream inputStream = getClass().getClassLoader() - .getResourceAsStream(path); BufferedReader br = new BufferedReader( - new InputStreamReader(inputStream))) { - int lineCount = 0; - String line; - while ((line = br.readLine()) != null) { - lineCount++; - if (lineCount < FIRST_LINE_NUMBER) { - continue; - } - List fields = splitFields(line); - createAndSaveOperation.accept(fields); - } - } catch (IOException e) { - log.error("error message : {}", e.getMessage(), e); - } - } - - private List splitFields(String line) { - return Arrays.stream(line.split(FIELD_DELIMITER)).map(String::trim).map(this::regularizeEmptyField).toList(); - } - - private String regularizeEmptyField(String field) { - if (field.equals("EMPTY")) { - return ""; - } - return field; - } - - private BattleMove createMove(List fields) { - Type moveType = Type.findByName(fields.get(4)) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)); - MoveCategory moveCategory = MoveCategory.findByEngName(fields.get(6).toLowerCase()) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_CATEGORY_NOT_FOUND)); - - return new BattleMove(fields.get(0), fields.get(1), fields.get(2), fields.get(3), moveType, fields.get(5), - moveCategory, fields.get(7), convertToInteger(fields.get(8)), convertToInteger(fields.get(9)), - convertToInteger(fields.get(10)), convertToInteger(fields.get(11)), convertToInteger(fields.get(12)), - convertToInteger(fields.get(13)), fields.get(14)); - } - - private double convertToDouble(String data) { - try { - return Double.parseDouble(data); - } catch (NumberFormatException e) { - throw new GlobalCustomException(ErrorMessage.PARSE_ERROR); - } - } - - private Integer convertToInteger(String data) { - try { - return Integer.valueOf(data); - } catch (NumberFormatException e) { - return null; - } - } -} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java deleted file mode 100644 index b270b957c..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.pokerogue.helper.battle; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.boot.DefaultApplicationArguments; - -class DataInitializerTest { - - @Test - @DisplayName("날씨, 기술 데이터를 세팅한다.") - void setWeathersData() { - BattleMoveRepository battleMoveRepository = new BattleMoveRepository(); - DataInitializer dataInitializer = new DataInitializer( - battleMoveRepository - ); - dataInitializer.run(new DefaultApplicationArguments()); - - assertAll(() -> { - assertThat(battleMoveRepository.findAll()).hasSize(920); - }); - } -} From 7cbf5b2e6098e48a2dd05eea487b0b051616093a Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 26 Sep 2024 14:42:15 +0900 Subject: [PATCH 20/32] =?UTF-8?q?refactor:=20=EB=B0=B0=ED=8B=80=20?= =?UTF-8?q?=EB=B0=B0=EC=88=98=20=EB=B0=B0=EC=97=B4=20=EC=83=81=EC=88=98?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pokerogue/helper/battle/service/BattleService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index 52ae556b4..f08b049f8 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -18,6 +18,7 @@ public class BattleService { private static final double FOG_ACCURACY_EFFECT = 0.9; + private static final BattleMultiplier[] EMPTY_BATTLE_MULTIPLIER_ARRAY = new BattleMultiplier[0]; private final MoveRepository moveRepository; private final PokemonRepository pokemonRepository; @@ -80,7 +81,7 @@ private double calculateTotalMultiplier( List typeMatchingMultipliers = typeMultiplierProvider.getAllByTypeMatchings(moveType, types); BattleMultiplier typeMatchingMultiplier = BattleMultiplier.multiply( - typeMatchingMultipliers.toArray(new BattleMultiplier[0])); + typeMatchingMultipliers.toArray(EMPTY_BATTLE_MULTIPLIER_ARRAY)); BattleMultiplier totalMultiplier = BattleMultiplier.multiply(weatherMultiplier, sameTypeBonusMultiplier, typeMatchingMultiplier); if (weather == Weather.STRONG_WINDS) { From c88c0bb5d7829f46eb2ec1c1000147af87812695 Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 26 Sep 2024 14:47:37 +0900 Subject: [PATCH 21/32] =?UTF-8?q?refactor:=20=EA=B0=95=ED=95=9C=20?= =?UTF-8?q?=EB=B0=94=EB=9E=8C=EC=97=90=20=EC=9D=98=ED=95=9C=20=EB=B0=B0?= =?UTF-8?q?=ED=8B=80=20=EB=B0=B0=EC=88=98=20=EA=B3=84=EC=82=B0=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=EB=AC=B8=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=A1=9C=20?= =?UTF-8?q?=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/service/TypeMultiplierProvider.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java index 72717a170..8955005e2 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java @@ -35,15 +35,19 @@ public BattleMultiplier getBySameTypeAttackBonus(Type moveType, Pokemon rivalPok } public BattleMultiplier getByStrongWind(Type moveType, List rivalPokemonTypes) { - TypeMatching typeMatching = findTypeMatchingByFromAndTo(moveType, Type.FLYING); - if (rivalPokemonTypes.contains(Type.FLYING) - && typeMatching.getResult() == STRONG_TYPE_MATCHING_RESULT) { + if (isStrongWindConditionMet(moveType, rivalPokemonTypes)) { return BattleMultiplier.WEAK_MULTIPLIER; } return BattleMultiplier.DEFAULT_MULTIPLIER; } + private boolean isStrongWindConditionMet(Type moveType, List rivalPokemonTypes) { + TypeMatching typeMatching = findTypeMatchingByFromAndTo(moveType, Type.FLYING); + return rivalPokemonTypes.contains(Type.FLYING) + && typeMatching.getResult() == STRONG_TYPE_MATCHING_RESULT; + } + private TypeMatching findTypeMatchingByFromAndTo(Type from, Type to) { return typeMatchingRepository.findByFromAndTo(from.getName(), to.getName()) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TYPE_MATCHING_ERROR)); From 64324405976766d54b4e1c768dd4caa64b20b6c4 Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 26 Sep 2024 14:53:42 +0900 Subject: [PATCH 22/32] =?UTF-8?q?refactor:=20WeatherMultiplierProvider=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pokerogue/helper/battle/data/Weather.java | 63 ----------------- .../helper/battle/service/BattleService.java | 3 +- .../service/WeatherMultiplierProvider.java | 70 +++++++++++++++++++ .../WeatherMultiplierProviderTest.java} | 11 +-- 4 files changed, 79 insertions(+), 68 deletions(-) create mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplierProvider.java rename backend/pokerogue/src/test/java/com/pokerogue/helper/battle/{data/WeatherTest.java => service/WeatherMultiplierProviderTest.java} (81%) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java index 33cf5cbae..6c0f8a9e7 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/Weather.java @@ -1,7 +1,5 @@ package com.pokerogue.helper.battle.data; -import com.pokerogue.helper.battle.service.BattleMultiplier; -import com.pokerogue.helper.type.data.Type; import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -42,65 +40,4 @@ public static Optional findById(String id) { .filter(weather -> weather.id.equals(id)) .findAny(); } - - public BattleMultiplier getBattleMultiplierByAttackMoveType(Type attackMoveType) { - if (this == Weather.SUNNY) { - return getSunnyAttackTypeMultiplier(attackMoveType); - } - if (this == Weather.HARSH_SUN) { - return getHarshSunAttackTypeMultiplier(attackMoveType); - } - if (this == Weather.RAIN) { - return getRainAttackTypeMultiplier(attackMoveType); - } - if (this == Weather.HEAVY_RAIN) { - return getHeavyRainAttackTypeMultiplier(attackMoveType); - } - - return BattleMultiplier.DEFAULT_MULTIPLIER; - } - - private BattleMultiplier getSunnyAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.FIRE) { - return BattleMultiplier.STRONG_MULTIPLIER; - } - if (attackMoveType == Type.WATER) { - return BattleMultiplier.WEAK_MULTIPLIER; - } - - return BattleMultiplier.DEFAULT_MULTIPLIER; - } - - private BattleMultiplier getHarshSunAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.FIRE) { - return BattleMultiplier.STRONG_MULTIPLIER; - } - if (attackMoveType == Type.WATER) { - return BattleMultiplier.ZERO_MULTIPLIER; - } - - return BattleMultiplier.DEFAULT_MULTIPLIER; - } - - private BattleMultiplier getRainAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.WATER) { - return BattleMultiplier.STRONG_MULTIPLIER; - } - if (attackMoveType == Type.FIRE) { - return BattleMultiplier.WEAK_MULTIPLIER; - } - - return BattleMultiplier.DEFAULT_MULTIPLIER; - } - - private BattleMultiplier getHeavyRainAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.WATER) { - return BattleMultiplier.STRONG_MULTIPLIER; - } - if (attackMoveType == Type.FIRE) { - return BattleMultiplier.ZERO_MULTIPLIER; - } - - return BattleMultiplier.DEFAULT_MULTIPLIER; - } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index f08b049f8..e40adc0ad 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -23,6 +23,7 @@ public class BattleService { private final MoveRepository moveRepository; private final PokemonRepository pokemonRepository; private final TypeMultiplierProvider typeMultiplierProvider; + private final WeatherMultiplierProvider weatherMultiplierProvider; public BattleResultResponse calculateBattleResult( String weatherId, @@ -76,7 +77,7 @@ private double calculateTotalMultiplier( .map(String::toUpperCase) .map(Type::valueOf) .toList(); - BattleMultiplier weatherMultiplier = weather.getBattleMultiplierByAttackMoveType(moveType); + BattleMultiplier weatherMultiplier = weatherMultiplierProvider.getByAttackMoveType(weather, moveType); BattleMultiplier sameTypeBonusMultiplier = typeMultiplierProvider.getBySameTypeAttackBonus(moveType, myPokemon); List typeMatchingMultipliers = typeMultiplierProvider.getAllByTypeMatchings(moveType, types); diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplierProvider.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplierProvider.java new file mode 100644 index 000000000..e093b4253 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplierProvider.java @@ -0,0 +1,70 @@ +package com.pokerogue.helper.battle.service; + +import com.pokerogue.helper.battle.data.Weather; +import com.pokerogue.helper.type.data.Type; +import org.springframework.stereotype.Component; + +@Component +public class WeatherMultiplierProvider { + + public BattleMultiplier getByAttackMoveType(Weather weather, Type attackMoveType) { + if (weather == Weather.SUNNY) { + return getSunnyAttackTypeMultiplier(attackMoveType); + } + if (weather == Weather.HARSH_SUN) { + return getHarshSunAttackTypeMultiplier(attackMoveType); + } + if (weather == Weather.RAIN) { + return getRainAttackTypeMultiplier(attackMoveType); + } + if (weather == Weather.HEAVY_RAIN) { + return getHeavyRainAttackTypeMultiplier(attackMoveType); + } + + return BattleMultiplier.DEFAULT_MULTIPLIER; + } + + private BattleMultiplier getSunnyAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.FIRE) { + return BattleMultiplier.STRONG_MULTIPLIER; + } + if (attackMoveType == Type.WATER) { + return BattleMultiplier.WEAK_MULTIPLIER; + } + + return BattleMultiplier.DEFAULT_MULTIPLIER; + } + + private BattleMultiplier getHarshSunAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.FIRE) { + return BattleMultiplier.STRONG_MULTIPLIER; + } + if (attackMoveType == Type.WATER) { + return BattleMultiplier.ZERO_MULTIPLIER; + } + + return BattleMultiplier.DEFAULT_MULTIPLIER; + } + + private BattleMultiplier getRainAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.WATER) { + return BattleMultiplier.STRONG_MULTIPLIER; + } + if (attackMoveType == Type.FIRE) { + return BattleMultiplier.WEAK_MULTIPLIER; + } + + return BattleMultiplier.DEFAULT_MULTIPLIER; + } + + private BattleMultiplier getHeavyRainAttackTypeMultiplier(Type attackMoveType) { + if (attackMoveType == Type.WATER) { + return BattleMultiplier.STRONG_MULTIPLIER; + } + if (attackMoveType == Type.FIRE) { + return BattleMultiplier.ZERO_MULTIPLIER; + } + + return BattleMultiplier.DEFAULT_MULTIPLIER; + } +} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/data/WeatherTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierProviderTest.java similarity index 81% rename from backend/pokerogue/src/test/java/com/pokerogue/helper/battle/data/WeatherTest.java rename to backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierProviderTest.java index b76703454..c760263d6 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/data/WeatherTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierProviderTest.java @@ -1,8 +1,9 @@ -package com.pokerogue.helper.battle.data; +package com.pokerogue.helper.battle.service; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; -import com.pokerogue.helper.battle.service.BattleMultiplier; +import com.pokerogue.helper.battle.data.Weather; import com.pokerogue.helper.type.data.Type; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; @@ -10,14 +11,16 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -class WeatherTest { +class WeatherMultiplierProviderTest { + + private final WeatherMultiplierProvider weatherMultiplierProvider = new WeatherMultiplierProvider(); @ParameterizedTest @MethodSource(value = "multiplierConditions") @DisplayName("공격 기술 타입에 따른 배틀 날씨 배수를 구한다.") void getAttackTypeMultiplier(Weather weather, Type attackMoveType, BattleMultiplier expectedMultiplier) { - BattleMultiplier multiplier = weather.getBattleMultiplierByAttackMoveType(attackMoveType); + BattleMultiplier multiplier = weatherMultiplierProvider.getByAttackMoveType(weather, attackMoveType); assertThat(multiplier).isEqualTo(expectedMultiplier); } From 3ad4e1710dbfede64dda7016cb48966a609fb047 Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 26 Sep 2024 20:16:14 +0900 Subject: [PATCH 23/32] =?UTF-8?q?refactor:=20BattleCalculator=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battle/service/BattleCalculator.java | 74 +++++++++++++++++++ .../helper/battle/service/BattleService.java | 50 +------------ .../battle/service/BattleCalculatorTest.java | 49 ++++++++++++ .../battle/service/BattleServiceTest.java | 50 +++++++++---- 4 files changed, 163 insertions(+), 60 deletions(-) create mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java create mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleCalculatorTest.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java new file mode 100644 index 000000000..2e9cbcd36 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java @@ -0,0 +1,74 @@ +package com.pokerogue.helper.battle.service; + +import com.pokerogue.helper.battle.data.Weather; +import com.pokerogue.helper.move.data.Move; +import com.pokerogue.helper.pokemon.data.Pokemon; +import com.pokerogue.helper.type.data.Type; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class BattleCalculator { + + private static final double FOG_ACCURACY_EFFECT = 0.9; + private static final BattleMultiplier[] EMPTY_BATTLE_MULTIPLIER_ARRAY = new BattleMultiplier[0]; + + private final TypeMultiplierProvider typeMultiplierProvider; + private final WeatherMultiplierProvider weatherMultiplierProvider; + + public double calculateAccuracy(Move move, Weather weather) { + if (weather == Weather.FOG) { + return (double) move.getAccuracy() * FOG_ACCURACY_EFFECT; + } + + return move.getAccuracy(); + } + + public double calculateTotalMultiplier( + Move move, + Weather weather, + Pokemon rivalPokemon, + Pokemon myPokemon) { + if (!move.isAttackMove()) { + return BattleMultiplier.DEFAULT_MULTIPLIER.getValue(); + } + + Type moveType = Type.valueOf(move.getType().toUpperCase()); // Todo + List rivalPokemonTypes = rivalPokemon.getTypes() + .stream() // Todo + .map(String::toUpperCase) + .map(Type::valueOf) + .toList(); + BattleMultiplier weatherMultiplier = getWeatherMultiplier(weather, moveType); + BattleMultiplier sameTypeBonusMultiplier = getSameTypeBonusMultiplier(moveType, myPokemon); + BattleMultiplier typeMatchingMultiplier = getTypeMatchingMultiplier(moveType, rivalPokemonTypes); + + BattleMultiplier totalMultiplier = BattleMultiplier.multiply( + weatherMultiplier, sameTypeBonusMultiplier, typeMatchingMultiplier); + if (weather == Weather.STRONG_WINDS) { + totalMultiplier = applyStrongWindMultiplier(totalMultiplier, moveType, rivalPokemonTypes); + } + + return totalMultiplier.getValue(); + } + + private BattleMultiplier getWeatherMultiplier(Weather weather, Type moveType) { + return weatherMultiplierProvider.getByAttackMoveType(weather, moveType); + } + + private BattleMultiplier getSameTypeBonusMultiplier(Type moveType, Pokemon myPokemon) { + return typeMultiplierProvider.getBySameTypeAttackBonus(moveType, myPokemon); + } + + private BattleMultiplier getTypeMatchingMultiplier(Type moveType, List rivalPokemonTypes) { + List typeMatchingMultipliers = typeMultiplierProvider.getAllByTypeMatchings(moveType, rivalPokemonTypes); + return BattleMultiplier.multiply(typeMatchingMultipliers.toArray(EMPTY_BATTLE_MULTIPLIER_ARRAY)); + } + + private BattleMultiplier applyStrongWindMultiplier(BattleMultiplier totalMultiplier, Type moveType, List rivalPokemonTypes) { + BattleMultiplier strongWindMultiplier = typeMultiplierProvider.getByStrongWind(moveType, rivalPokemonTypes); + return BattleMultiplier.multiply(totalMultiplier, strongWindMultiplier); + } +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index e40adc0ad..a70f52587 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -9,7 +9,6 @@ import com.pokerogue.helper.pokemon.data.Pokemon; import com.pokerogue.helper.pokemon.repository.PokemonRepository; import com.pokerogue.helper.type.data.Type; -import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -17,13 +16,9 @@ @RequiredArgsConstructor public class BattleService { - private static final double FOG_ACCURACY_EFFECT = 0.9; - private static final BattleMultiplier[] EMPTY_BATTLE_MULTIPLIER_ARRAY = new BattleMultiplier[0]; - private final MoveRepository moveRepository; private final PokemonRepository pokemonRepository; - private final TypeMultiplierProvider typeMultiplierProvider; - private final WeatherMultiplierProvider weatherMultiplierProvider; + private final BattleCalculator battleCalculator; public BattleResultResponse calculateBattleResult( String weatherId, @@ -40,8 +35,8 @@ public BattleResultResponse calculateBattleResult( .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)); Type moveType = Type.valueOf(move.getType().toUpperCase()); // Todo - double finalAccuracy = calculateAccuracy(move, weather); - double totalMultiplier = calculateTotalMultiplier(move, weather, rivalPokemon, myPokemon); + double finalAccuracy = battleCalculator.calculateAccuracy(move, weather); + double totalMultiplier = battleCalculator.calculateTotalMultiplier(move, weather, rivalPokemon, myPokemon); return new BattleResultResponse( move.getPower(), @@ -53,43 +48,4 @@ public BattleResultResponse calculateBattleResult( move.getMoveCategory() ); } - - private double calculateAccuracy(Move move, Weather weather) { - if (weather == Weather.FOG) { - return (double) move.getAccuracy() * FOG_ACCURACY_EFFECT; - } - - return move.getAccuracy(); - } - - private double calculateTotalMultiplier( - Move move, - Weather weather, - Pokemon rivalPokemon, - Pokemon myPokemon) { - if (!move.isAttackMove()) { - return BattleMultiplier.DEFAULT_MULTIPLIER.getValue(); - } - - Type moveType = Type.valueOf(move.getType().toUpperCase()); // Todo - List types = rivalPokemon.getTypes() - .stream() // Todo - .map(String::toUpperCase) - .map(Type::valueOf) - .toList(); - BattleMultiplier weatherMultiplier = weatherMultiplierProvider.getByAttackMoveType(weather, moveType); - BattleMultiplier sameTypeBonusMultiplier = typeMultiplierProvider.getBySameTypeAttackBonus(moveType, myPokemon); - List typeMatchingMultipliers = typeMultiplierProvider.getAllByTypeMatchings(moveType, types); - - BattleMultiplier typeMatchingMultiplier = BattleMultiplier.multiply( - typeMatchingMultipliers.toArray(EMPTY_BATTLE_MULTIPLIER_ARRAY)); - BattleMultiplier totalMultiplier = BattleMultiplier.multiply(weatherMultiplier, sameTypeBonusMultiplier, - typeMatchingMultiplier); - if (weather == Weather.STRONG_WINDS) { - BattleMultiplier strongWindMultiplier = typeMultiplierProvider.getByStrongWind(moveType, types); - totalMultiplier.multiply(strongWindMultiplier); - } - - return totalMultiplier.getValue(); - } } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleCalculatorTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleCalculatorTest.java new file mode 100644 index 000000000..55c9fcc5c --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleCalculatorTest.java @@ -0,0 +1,49 @@ +package com.pokerogue.helper.battle.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.pokerogue.environment.service.ServiceTest; +import com.pokerogue.helper.battle.data.Weather; +import com.pokerogue.helper.move.data.Move; +import com.pokerogue.helper.move.repository.MoveRepository; +import com.pokerogue.helper.pokemon.data.Pokemon; +import com.pokerogue.helper.pokemon.repository.PokemonRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class BattleCalculatorTest extends ServiceTest { + + @Autowired + private BattleCalculator battleCalculator; + + @Autowired + private MoveRepository moveRepository; + + @Autowired + private PokemonRepository pokemonRepository; + + @Test + @DisplayName("배틀에서 공격 기술의 정확도를 계산한다.") + void calculateAccuracy() { + Move move = moveRepository.findById("ember").get(); + Weather weather = Weather.FOG; + + double accuracy = battleCalculator.calculateAccuracy(move, weather); + + assertThat(accuracy).isEqualTo(90); + } + + @Test + @DisplayName("배틀에서 공격 기술의 배수를 계산한다.") + void calculateBattleResult() { + Move move = moveRepository.findById("ember").get(); + Weather weather = Weather.SUNNY; + Pokemon rivalPokemon = pokemonRepository.findById("bulbasaur").get(); + Pokemon myPokemon = pokemonRepository.findById("charmander").get(); + + double multiplier = battleCalculator.calculateTotalMultiplier(move, weather, rivalPokemon, myPokemon); + + assertThat(multiplier).isEqualTo(4.5); + } +} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleServiceTest.java index 57564a4bd..9db55accc 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleServiceTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleServiceTest.java @@ -1,11 +1,10 @@ package com.pokerogue.helper.battle.service; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.pokerogue.environment.service.ServiceTest; -import com.pokerogue.helper.battle.dto.BattleResultResponse; -import com.pokerogue.helper.battle.service.BattleService; +import com.pokerogue.helper.global.exception.ErrorMessage; +import com.pokerogue.helper.global.exception.GlobalCustomException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -16,19 +15,44 @@ class BattleServiceTest extends ServiceTest { private BattleService battleService; @Test - @DisplayName("배틀 예상 결과를 계산한다.") - void calculateBattleResult() { - String weatherId = "sunny"; + @DisplayName("배틀 결과 계산에서 id로 날씨를 찾지 못하면 예외가 발생한다.") + void findWeatherByIdWhenCalculateBattleResult() { + String wrongWeatherId = "cloud"; String myPokemonId = "charmander"; String rivalPokemonId = "bulbasaur"; String myMoveId = "ember"; - BattleResultResponse battleResultResponse = battleService.calculateBattleResult(weatherId, myPokemonId, - rivalPokemonId, myMoveId); + assertThatThrownBy( + () -> battleService.calculateBattleResult(wrongWeatherId, myPokemonId, rivalPokemonId, myMoveId)) + .isInstanceOf(GlobalCustomException.class) + .hasMessage(ErrorMessage.WEATHER_NOT_FOUND.getMessage()); + } + + @Test + @DisplayName("배틀 결과 계산에서 id로 포켓몬을 찾지 못하면 예외가 발생한다.") + void findPokemonByIdWhenCalculateBattleResult() { + String weatherId = "sunny"; + String wrongMyPokemonId = "mia"; + String rivalPokemonId = "bulbasaur"; + String myMoveId = "ember"; + + assertThatThrownBy( + () -> battleService.calculateBattleResult(weatherId, wrongMyPokemonId, rivalPokemonId, myMoveId)) + .isInstanceOf(GlobalCustomException.class) + .hasMessage(ErrorMessage.POKEMON_NOT_FOUND.getMessage()); + } + + @Test + @DisplayName("배틀 결과 계산에서 id로 기술을 찾지 못하면 예외가 발생한다.") + void findMoveByIdWhenCalculateBattleResult() { + String weatherId = "sunny"; + String myPokemonId = "charmander"; + String rivalPokemonId = "bulbasaur"; + String wrongMyMoveId = "punch"; - assertAll(() -> { - assertThat(battleResultResponse.multiplier()).isEqualTo(4.5); - assertThat(battleResultResponse.accuracy()).isEqualTo(100); - }); + assertThatThrownBy( + () -> battleService.calculateBattleResult(weatherId, myPokemonId, rivalPokemonId, wrongMyMoveId)) + .isInstanceOf(GlobalCustomException.class) + .hasMessage(ErrorMessage.MOVE_NOT_FOUND.getMessage()); } } From aad6ea449f642942270b840c5d43c4487c910dec Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 26 Sep 2024 21:02:11 +0900 Subject: [PATCH 24/32] =?UTF-8?q?refactor:=20return=20=EB=AC=B8=20?= =?UTF-8?q?=EC=A0=84=EC=97=90=20=EA=B0=9C=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pokerogue/helper/battle/service/TypeMultiplierProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java index 8955005e2..0fd09d0cb 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java @@ -44,6 +44,7 @@ public BattleMultiplier getByStrongWind(Type moveType, List rivalPokemonTy private boolean isStrongWindConditionMet(Type moveType, List rivalPokemonTypes) { TypeMatching typeMatching = findTypeMatchingByFromAndTo(moveType, Type.FLYING); + return rivalPokemonTypes.contains(Type.FLYING) && typeMatching.getResult() == STRONG_TYPE_MATCHING_RESULT; } From be47f7e4294bda82d480d88c808a4ef21225cee6 Mon Sep 17 00:00:00 2001 From: jongmee Date: Fri, 27 Sep 2024 07:16:29 +0900 Subject: [PATCH 25/32] remove: WeatherServiceTest --- .../battle/service/WeatherServiceTest.java | 29 ------------------- 1 file changed, 29 deletions(-) delete mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherServiceTest.java diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherServiceTest.java deleted file mode 100644 index 7fa25f301..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherServiceTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pokerogue.helper.battle.service; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - -import com.pokerogue.environment.service.ServiceTest; -import com.pokerogue.helper.battle.data.Weather; -import com.pokerogue.helper.battle.dto.WeatherResponse; -import java.util.Arrays; -import java.util.List; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -class WeatherServiceTest extends ServiceTest { - - @Autowired - private WeatherService weatherService; - - @Test - @DisplayName("모든 날씨 목록을 조회한다.") - void findWeathers() { - List weatherResponses = weatherService.findWeathers(); - - List allWeathers = Arrays.stream(Weather.values()) - .toList(); - assertThat(weatherResponses).hasSize(allWeathers.size()); - } -} From 7c565cc0acd56442d168c457999bffe24089dc81 Mon Sep 17 00:00:00 2001 From: jongmee Date: Fri, 27 Sep 2024 07:40:50 +0900 Subject: [PATCH 26/32] =?UTF-8?q?fix:=20BattleMultiplier=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EB=82=B4=EB=B6=80=20=EA=B0=92=EC=9D=84=20doouble=EC=97=90?= =?UTF-8?q?=EC=84=9C=20BigDecimal=EB=A1=9C=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battle/service/BattleCalculator.java | 6 ++-- .../battle/service/BattleMultiplier.java | 32 +++++++++++-------- .../service/TypeMultiplierProvider.java | 2 ++ .../battle/service/BattleMultiplierTest.java | 26 +++++++++------ .../service/TypeMultiplierProviderTest.java | 3 +- 5 files changed, 41 insertions(+), 28 deletions(-) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java index 2e9cbcd36..6ceedfc53 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java @@ -20,7 +20,7 @@ public class BattleCalculator { public double calculateAccuracy(Move move, Weather weather) { if (weather == Weather.FOG) { - return (double) move.getAccuracy() * FOG_ACCURACY_EFFECT; + return move.getAccuracy() * FOG_ACCURACY_EFFECT; } return move.getAccuracy(); @@ -32,7 +32,7 @@ public double calculateTotalMultiplier( Pokemon rivalPokemon, Pokemon myPokemon) { if (!move.isAttackMove()) { - return BattleMultiplier.DEFAULT_MULTIPLIER.getValue(); + return BattleMultiplier.DEFAULT_MULTIPLIER.getDoubleValue(); } Type moveType = Type.valueOf(move.getType().toUpperCase()); // Todo @@ -51,7 +51,7 @@ public double calculateTotalMultiplier( totalMultiplier = applyStrongWindMultiplier(totalMultiplier, moveType, rivalPokemonTypes); } - return totalMultiplier.getValue(); + return totalMultiplier.getDoubleValue(); } private BattleMultiplier getWeatherMultiplier(Weather weather, Type moveType) { diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java index e69f6fc08..03606f76a 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleMultiplier.java @@ -1,19 +1,19 @@ package com.pokerogue.helper.battle.service; +import java.math.BigDecimal; import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import java.util.Objects; import lombok.Getter; @Getter public final class BattleMultiplier { - public static final BattleMultiplier STRONG_MULTIPLIER = new BattleMultiplier(1.5); - public static final BattleMultiplier WEAK_MULTIPLIER = new BattleMultiplier(0.5); - public static final BattleMultiplier ZERO_MULTIPLIER = new BattleMultiplier(0); - public static final BattleMultiplier DEFAULT_MULTIPLIER = new BattleMultiplier(1); - private static final Map CACHE = new HashMap<>(); + public static final BattleMultiplier STRONG_MULTIPLIER = new BattleMultiplier(BigDecimal.valueOf(1.5)); + public static final BattleMultiplier WEAK_MULTIPLIER = new BattleMultiplier(BigDecimal.valueOf(0.5)); + public static final BattleMultiplier ZERO_MULTIPLIER = new BattleMultiplier(BigDecimal.valueOf(0)); + public static final BattleMultiplier DEFAULT_MULTIPLIER = new BattleMultiplier(BigDecimal.valueOf(1)); + private static final Map CACHE = new HashMap<>(); static { CACHE.put(STRONG_MULTIPLIER.value, STRONG_MULTIPLIER); @@ -22,30 +22,34 @@ public final class BattleMultiplier { CACHE.put(DEFAULT_MULTIPLIER.value, DEFAULT_MULTIPLIER); // Todo: 캐싱 추가 } - private final double value; + private final BigDecimal value; - private BattleMultiplier(double value) { + private BattleMultiplier(BigDecimal value) { this.value = value; } - public static BattleMultiplier valueOf(double value) { + public static BattleMultiplier valueOf(BigDecimal value) { return CACHE.getOrDefault(value, new BattleMultiplier(value)); } public static BattleMultiplier multiply(BattleMultiplier... others) { - double result = Arrays.stream(others) + BigDecimal result = Arrays.stream(others) .map(BattleMultiplier::getValue) - .reduce(1d, (a, b) -> a * b); + .reduce(DEFAULT_MULTIPLIER.value, (a, b) -> a.multiply(b)); return BattleMultiplier.valueOf(result); } public BattleMultiplier multiply(BattleMultiplier other) { - double result = this.value * other.value; + BigDecimal result = this.value.multiply(other.value); return BattleMultiplier.valueOf(result); } + public double getDoubleValue() { + return this.value.doubleValue(); + } + @Override public boolean equals(Object o) { if (this == o) { @@ -56,11 +60,11 @@ public boolean equals(Object o) { } BattleMultiplier that = (BattleMultiplier) o; - return Double.compare(that.value, value) == 0; + return this.value.compareTo(that.value) == 0; } @Override public int hashCode() { - return Objects.hash(value); + return this.value.stripTrailingZeros().hashCode(); } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java index 0fd09d0cb..a4c7183a3 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java @@ -6,6 +6,7 @@ import com.pokerogue.helper.global.exception.GlobalCustomException; import com.pokerogue.helper.pokemon.data.Pokemon; import com.pokerogue.helper.type.data.Type; +import java.math.BigDecimal; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -22,6 +23,7 @@ public List getAllByTypeMatchings(Type attackMoveType, List findTypeMatchingByFromAndTo(attackMoveType, toType)) .map(TypeMatching::getResult) + .map(BigDecimal::valueOf) .map(BattleMultiplier::valueOf) .toList(); } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java index ba3f6a7a9..4b1a13090 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.math.BigDecimal; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -13,8 +14,10 @@ class BattleMultiplierTest { @Test @DisplayName("배틀배수끼리 동등하다.") void hasSemanticEquality() { - BattleMultiplier multiplier = BattleMultiplier.valueOf(3); - BattleMultiplier otherMultiplier = BattleMultiplier.valueOf(3); + BigDecimal multiplierValue = BigDecimal.valueOf(0.3).add(BigDecimal.valueOf(0.3).add(BigDecimal.valueOf(0.3))); + BattleMultiplier multiplier = BattleMultiplier.valueOf(multiplierValue); + BigDecimal otherMultiplierValue = BigDecimal.valueOf(0.9); + BattleMultiplier otherMultiplier = BattleMultiplier.valueOf(otherMultiplierValue); assertThat(multiplier).isEqualTo(otherMultiplier); } @@ -23,7 +26,7 @@ void hasSemanticEquality() { @MethodSource(value = "constantBattleMultipliers") @DisplayName("배틀 배수 상수는 캐싱한다.") void cacheConstants(BattleMultiplier constantBattleMultiplier) { - double constantValue = constantBattleMultiplier.getValue(); + BigDecimal constantValue = constantBattleMultiplier.getValue(); BattleMultiplier sameValueMultiplier = BattleMultiplier.valueOf(constantValue); @@ -42,22 +45,25 @@ private static Stream constantBattleMultipliers() { @Test @DisplayName("배틀 배수 두 개를 곱한다.") void multiply() { - BattleMultiplier multiplier = BattleMultiplier.valueOf(2); + BattleMultiplier multiplier = BattleMultiplier.valueOf(BigDecimal.valueOf(2)); + BattleMultiplier otherMultiplier = BattleMultiplier.valueOf(BigDecimal.valueOf(1.5)); - BattleMultiplier multipliedResult = multiplier.multiply(BattleMultiplier.valueOf(1.5)); + BattleMultiplier multipliedResult = multiplier.multiply(otherMultiplier); - assertThat(multipliedResult).isEqualTo(BattleMultiplier.valueOf(3)); + BigDecimal expectedResultValue = BigDecimal.valueOf(3); + assertThat(multipliedResult).isEqualTo(BattleMultiplier.valueOf(expectedResultValue)); } @Test @DisplayName("배틀 배수 여러개를 곱한다.") void multiplyMultiple() { - BattleMultiplier alpha = BattleMultiplier.valueOf(2); - BattleMultiplier beta = BattleMultiplier.valueOf(1.5); - BattleMultiplier gamma = BattleMultiplier.valueOf(0.5); + BattleMultiplier alpha = BattleMultiplier.valueOf(BigDecimal.valueOf(2)); + BattleMultiplier beta = BattleMultiplier.valueOf(BigDecimal.valueOf(1.5)); + BattleMultiplier gamma = BattleMultiplier.valueOf(BigDecimal.valueOf(0.5)); BattleMultiplier multipliedResult = BattleMultiplier.multiply(alpha, beta, gamma); - assertThat(multipliedResult).isEqualTo(BattleMultiplier.valueOf(1.5)); + BigDecimal expectedResultValue = BigDecimal.valueOf(1.5); + assertThat(multipliedResult).isEqualTo(BattleMultiplier.valueOf(expectedResultValue)); } } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierProviderTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierProviderTest.java index 6415e92b0..10aa4e368 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierProviderTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/TypeMultiplierProviderTest.java @@ -6,6 +6,7 @@ import com.pokerogue.helper.pokemon.data.Pokemon; import com.pokerogue.helper.pokemon.repository.PokemonRepository; import com.pokerogue.helper.type.data.Type; +import java.math.BigDecimal; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -33,7 +34,7 @@ void getByTypeMatching() { List multipliers = typeMultiplierProvider.getAllByTypeMatchings(attackMoveType, rivalPokemonTypes); - assertThat(multipliers).contains(BattleMultiplier.valueOf(2)); + assertThat(multipliers).contains(BattleMultiplier.valueOf(BigDecimal.valueOf(2))); } @Test From 02b69045e13b49ca30f5babdc2c01fdfea7cc476 Mon Sep 17 00:00:00 2001 From: jongmee Date: Fri, 27 Sep 2024 07:47:35 +0900 Subject: [PATCH 27/32] =?UTF-8?q?refactor:=20TypeMultiplierProvider.getAll?= =?UTF-8?q?ByTypeMatchings=20=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/service/TypeMultiplierProvider.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java index a4c7183a3..f50e95f9e 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/TypeMultiplierProvider.java @@ -19,9 +19,9 @@ public class TypeMultiplierProvider { private final TypeMatchingRepository typeMatchingRepository; - public List getAllByTypeMatchings(Type attackMoveType, List rivalPokemonTypes) { - return rivalPokemonTypes.stream() - .map(toType -> findTypeMatchingByFromAndTo(attackMoveType, toType)) + public List getAllByTypeMatchings(Type fromType, List toTypes) { + return toTypes.stream() + .map(toType -> findTypeMatchingByFromAndTo(fromType, toType)) .map(TypeMatching::getResult) .map(BigDecimal::valueOf) .map(BattleMultiplier::valueOf) From 2faed53a8376c86d7116dfc5acf17c39acad9ec4 Mon Sep 17 00:00:00 2001 From: jongmee Date: Fri, 27 Sep 2024 07:54:47 +0900 Subject: [PATCH 28/32] refactor: BattleMultiplierTest --- .../pokerogue/helper/battle/service/BattleMultiplierTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java index 4b1a13090..65dab6fa1 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/BattleMultiplierTest.java @@ -15,8 +15,9 @@ class BattleMultiplierTest { @DisplayName("배틀배수끼리 동등하다.") void hasSemanticEquality() { BigDecimal multiplierValue = BigDecimal.valueOf(0.3).add(BigDecimal.valueOf(0.3).add(BigDecimal.valueOf(0.3))); - BattleMultiplier multiplier = BattleMultiplier.valueOf(multiplierValue); BigDecimal otherMultiplierValue = BigDecimal.valueOf(0.9); + + BattleMultiplier multiplier = BattleMultiplier.valueOf(multiplierValue); BattleMultiplier otherMultiplier = BattleMultiplier.valueOf(otherMultiplierValue); assertThat(multiplier).isEqualTo(otherMultiplier); From 9c9f3e0c1b14a0d2da651f2bab2d39274fed1370 Mon Sep 17 00:00:00 2001 From: jongmee Date: Fri, 27 Sep 2024 10:43:10 +0900 Subject: [PATCH 29/32] =?UTF-8?q?refactor:=20WeatherMultiplierProvider=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/WeatherMultiplierProvider.java | 73 +++++-------------- .../WeatherMultiplierProviderTest.java | 1 - 2 files changed, 17 insertions(+), 57 deletions(-) diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplierProvider.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplierProvider.java index e093b4253..d8b59a81b 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplierProvider.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/WeatherMultiplierProvider.java @@ -2,69 +2,30 @@ import com.pokerogue.helper.battle.data.Weather; import com.pokerogue.helper.type.data.Type; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; import org.springframework.stereotype.Component; @Component public class WeatherMultiplierProvider { - public BattleMultiplier getByAttackMoveType(Weather weather, Type attackMoveType) { - if (weather == Weather.SUNNY) { - return getSunnyAttackTypeMultiplier(attackMoveType); - } - if (weather == Weather.HARSH_SUN) { - return getHarshSunAttackTypeMultiplier(attackMoveType); - } - if (weather == Weather.RAIN) { - return getRainAttackTypeMultiplier(attackMoveType); - } - if (weather == Weather.HEAVY_RAIN) { - return getHeavyRainAttackTypeMultiplier(attackMoveType); - } - - return BattleMultiplier.DEFAULT_MULTIPLIER; - } - - private BattleMultiplier getSunnyAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.FIRE) { - return BattleMultiplier.STRONG_MULTIPLIER; - } - if (attackMoveType == Type.WATER) { - return BattleMultiplier.WEAK_MULTIPLIER; - } - - return BattleMultiplier.DEFAULT_MULTIPLIER; - } - - private BattleMultiplier getHarshSunAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.FIRE) { - return BattleMultiplier.STRONG_MULTIPLIER; - } - if (attackMoveType == Type.WATER) { - return BattleMultiplier.ZERO_MULTIPLIER; - } - - return BattleMultiplier.DEFAULT_MULTIPLIER; - } - - private BattleMultiplier getRainAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.WATER) { - return BattleMultiplier.STRONG_MULTIPLIER; - } - if (attackMoveType == Type.FIRE) { - return BattleMultiplier.WEAK_MULTIPLIER; - } - - return BattleMultiplier.DEFAULT_MULTIPLIER; + private static final Map WEATHER_MULTIPLIERS = new HashMap<>(); + + static { + WEATHER_MULTIPLIERS.put(Objects.hash(Weather.SUNNY, Type.FIRE), BattleMultiplier.STRONG_MULTIPLIER); + WEATHER_MULTIPLIERS.put(Objects.hash(Weather.SUNNY, Type.WATER), BattleMultiplier.WEAK_MULTIPLIER); + WEATHER_MULTIPLIERS.put(Objects.hash(Weather.HARSH_SUN, Type.FIRE), BattleMultiplier.STRONG_MULTIPLIER); + WEATHER_MULTIPLIERS.put(Objects.hash(Weather.HARSH_SUN, Type.WATER), BattleMultiplier.ZERO_MULTIPLIER); + WEATHER_MULTIPLIERS.put(Objects.hash(Weather.RAIN, Type.WATER), BattleMultiplier.STRONG_MULTIPLIER); + WEATHER_MULTIPLIERS.put(Objects.hash(Weather.RAIN, Type.FIRE), BattleMultiplier.WEAK_MULTIPLIER); + WEATHER_MULTIPLIERS.put(Objects.hash(Weather.HEAVY_RAIN, Type.WATER), BattleMultiplier.STRONG_MULTIPLIER); + WEATHER_MULTIPLIERS.put(Objects.hash(Weather.HEAVY_RAIN, Type.FIRE), BattleMultiplier.ZERO_MULTIPLIER); } - private BattleMultiplier getHeavyRainAttackTypeMultiplier(Type attackMoveType) { - if (attackMoveType == Type.WATER) { - return BattleMultiplier.STRONG_MULTIPLIER; - } - if (attackMoveType == Type.FIRE) { - return BattleMultiplier.ZERO_MULTIPLIER; - } + public BattleMultiplier getByAttackMoveType(Weather weather, Type attackMoveType) { + int hashCode = Objects.hash(weather, attackMoveType); - return BattleMultiplier.DEFAULT_MULTIPLIER; + return WEATHER_MULTIPLIERS.getOrDefault(hashCode, BattleMultiplier.DEFAULT_MULTIPLIER); } } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierProviderTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierProviderTest.java index c760263d6..973e8b345 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierProviderTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/service/WeatherMultiplierProviderTest.java @@ -1,7 +1,6 @@ package com.pokerogue.helper.battle.service; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import com.pokerogue.helper.battle.data.Weather; import com.pokerogue.helper.type.data.Type; From 4e14758297cf5657aa1452c06b3d6e3739d07366 Mon Sep 17 00:00:00 2001 From: jongmee Date: Thu, 10 Oct 2024 17:53:25 +0900 Subject: [PATCH 30/32] =?UTF-8?q?feat:=20=EB=B0=B0=ED=8B=80=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EA=B3=84=EC=82=B0=EC=97=90=EC=84=9C=20=EC=84=A0?= =?UTF-8?q?=EC=A0=9C=20=EA=B3=B5=EA=B2=A9=20=EC=97=AC=EB=B6=80=20=ED=95=A8?= =?UTF-8?q?=EA=BB=98=20=EA=B2=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battle/dto/BattleResultResponse.java | 3 +- .../battle/service/BattleCalculator.java | 4 + .../helper/battle/service/BattleService.java | 4 +- .../helper/pokemon/data/Pokemon.java | 4 + .../helper/pokemon/data/PokemonTest.java | 49 ++---- .../pokemon/data/PokemonTestFixture.java | 140 ++++++++++++++++++ 6 files changed, 165 insertions(+), 39 deletions(-) create mode 100644 backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTestFixture.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/BattleResultResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/BattleResultResponse.java index 1c606d6ce..363670088 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/BattleResultResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/dto/BattleResultResponse.java @@ -7,6 +7,7 @@ public record BattleResultResponse( String moveName, String moveDescription, String moveType, - String moveCategory + String moveCategory, + boolean isPreemptive ) { } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java index 6ceedfc53..ea8150b81 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleCalculator.java @@ -71,4 +71,8 @@ private BattleMultiplier applyStrongWindMultiplier(BattleMultiplier totalMultipl BattleMultiplier strongWindMultiplier = typeMultiplierProvider.getByStrongWind(moveType, rivalPokemonTypes); return BattleMultiplier.multiply(totalMultiplier, strongWindMultiplier); } + + public boolean decidePreemptiveAttack(Pokemon rivalPokemon, Pokemon myPokemon) { + return myPokemon.isFasterThan(rivalPokemon); + } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java index a70f52587..1b3ffe789 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/service/BattleService.java @@ -37,6 +37,7 @@ public BattleResultResponse calculateBattleResult( double finalAccuracy = battleCalculator.calculateAccuracy(move, weather); double totalMultiplier = battleCalculator.calculateTotalMultiplier(move, weather, rivalPokemon, myPokemon); + boolean isPreemptive = battleCalculator.decidePreemptiveAttack(rivalPokemon, myPokemon); return new BattleResultResponse( move.getPower(), @@ -45,7 +46,8 @@ public BattleResultResponse calculateBattleResult( move.getName(), move.getEffect(), moveType.getKoName(), - move.getMoveCategory() + move.getMoveCategory(), + isPreemptive ); } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java index e1517117d..bee2a3560 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java @@ -119,4 +119,8 @@ public boolean hasSameType(Type type) { return this.types.stream() .anyMatch(name::equals); } + + public boolean isFasterThan(Pokemon other) { + return this.speed > other.speed; + } } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTest.java index 3beb6f44d..bf862cfb1 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTest.java @@ -1,11 +1,14 @@ package com.pokerogue.helper.pokemon.data; +import static com.pokerogue.helper.pokemon.data.PokemonTestFixture.BULBASAUR; +import static com.pokerogue.helper.pokemon.data.PokemonTestFixture.CHARMANDER; import static org.assertj.core.api.Assertions.assertThat; import com.pokerogue.helper.type.data.Type; import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -16,43 +19,7 @@ class PokemonTest { @MethodSource(value = "typeAndExpectedResult") @DisplayName("포켓몬이 가진 타입 일치를 확인한다.") void hasSameType(Type type, boolean expectedResult) { - Pokemon bulbasaur = new Pokemon( - "1", // id - "bulbasaur-image-id", // imageId - 1, // pokedexNumber - "Bulbasaur", // name - "이상해씨", // koName - "Seed Pokémon", // speciesName - true, // canChangeForm - "Normal", // formName - 64, // baseExp - 70, // friendship - List.of("grass", "poison"), // types - List.of("Overgrow"), // normalAbilityIds - "Chlorophyll", // hiddenAbilityId - "None", // passiveAbilityId - 1, // generation - false, // legendary - false, // subLegendary - false, // mythical - List.of(), // evolutions - List.of(), // formChanges - 318, // baseTotal - 45, // hp - 49, // attack - 49, // defense - 65, // specialAttack - 65, // specialDefense - 45, // speed - 0.7, // height (in meters) - 6.9, // weight (in kilograms) - List.of("Leech Seed"), // eggMoveIds - List.of(), // levelMoves - List.of("TM01", "TM02"), // technicalMachineMoveIds - List.of("Forest", "Grassland") // biomeIds - ); - - boolean result = bulbasaur.hasSameType(type); + boolean result = BULBASAUR.hasSameType(type); assertThat(result).isEqualTo(expectedResult); } @@ -60,4 +27,12 @@ void hasSameType(Type type, boolean expectedResult) { private static Stream typeAndExpectedResult() { return Stream.of(Arguments.of(Type.GRASS, true), Arguments.of(Type.FIRE, false)); } + + @Test + @DisplayName("포켓몬의 스피드를 비교한다.") + void isFasterThan() { + boolean result = BULBASAUR.isFasterThan(CHARMANDER); + + assertThat(result).isFalse(); + } } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTestFixture.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTestFixture.java new file mode 100644 index 000000000..91d39297d --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonTestFixture.java @@ -0,0 +1,140 @@ +package com.pokerogue.helper.pokemon.data; + +import java.util.Arrays; +import java.util.List; + +public class PokemonTestFixture { + public static List BULBASAUR_EVOLUTIONS = Arrays.asList( + new Evolution("bulbasaur", "16", "ivysaur", null, null), + new Evolution("ivysaur", "32", "venusaur", null, null) + ); + + public static List BULBASAUR_LEVEL_MOVES = Arrays.asList( + new LevelMove(1, "tackle"), + new LevelMove(1, "growl"), + new LevelMove(3, "vine_whip"), + new LevelMove(6, "growth"), + new LevelMove(9, "leech_seed"), + new LevelMove(12, "razor_leaf"), + new LevelMove(15, "poison_powder"), + new LevelMove(15, "sleep_powder"), + new LevelMove(18, "seed_bomb"), + new LevelMove(21, "take_down"), + new LevelMove(24, "sweet_scent"), + new LevelMove(27, "synthesis"), + new LevelMove(30, "worry_seed"), + new LevelMove(33, "power_whip"), + new LevelMove(36, "solar_beam") + ); + + public static Pokemon BULBASAUR = new Pokemon( + "bulbasaur", // id + "bulbasaur", // imageId + 1, // pokedexNumber + "bulbasaur", // name + "이상해씨", // koName + "bulbasaur", // speciesName + false, // canChangeForm + "", // formName + 64, // baseExp + 50, // friendship + Arrays.asList("grass", "poison"), // types + Arrays.asList("overgrow"), // normalAbilityIds + "chlorophyll", // hiddenAbilityId + "grassy_surge", // passiveAbilityId + 1, // generation + false, // legendary + false, // subLegendary + false, // mythical + BULBASAUR_EVOLUTIONS, // evolutions + Arrays.asList(), // formChanges + 318, // baseTotal + 45, // hp + 49, // attack + 49, // defense + 65, // specialAttack + 65, // specialDefense + 45, // speed + 0.7, // height + 6.9, // weight + Arrays.asList("sappy_seed", "sludge_wave", "earth_power", "matcha_gotcha"), // eggMoveIds + BULBASAUR_LEVEL_MOVES, // levelMoves + Arrays.asList( + "swords_dance", "cut", "body_slam", "take_down", "double_edge", "strength", "solar_beam", + "toxic", "double_team", "light_screen", "reflect", "amnesia", "flash", "rest", "substitute", + "snore", "curse", "protect", "sludge_bomb", "mud_slap", "outrage", "giga_drain", "endure", + "charm", "false_swipe", "swagger", "attract", "sleep_talk", "return", "frustration", "safeguard", + "synthesis", "hidden_power", "sunny_day", "rock_smash", "facade", "nature_power", "helping_hand", + "knock_off", "weather_ball", "bullet_seed", "magical_leaf", "worry_seed", "seed_bomb", "energy_ball", + "leaf_storm", "power_whip", "grass_knot", "venoshock", "acid_spray", "round", "echoed_voice", + "grass_pledge", "work_up", "grassy_terrain", "confide", "grassy_glide", "tera_blast", "trailblaze" + ), // technicalMachineMoveIds + Arrays.asList("grass") // biomeIds + ); + + public static List CHARMANDER_EVOLUTIONS = List.of( + new Evolution("charmander", "16", "charmeleon", null, null), + new Evolution("charmeleon", "36", "charizard", null, null) + ); + + public static List CHARMANDER_LEVEL_MOVES = List.of( + new LevelMove(1, "scratch"), + new LevelMove(1, "growl"), + new LevelMove(4, "ember"), + new LevelMove(8, "smokescreen"), + new LevelMove(12, "dragon_breath"), + new LevelMove(17, "fire_fang"), + new LevelMove(20, "slash"), + new LevelMove(24, "flamethrower"), + new LevelMove(28, "scary_face"), + new LevelMove(32, "fire_spin"), + new LevelMove(36, "inferno"), + new LevelMove(40, "flare_blitz") + ); + + public static Pokemon CHARMANDER = new Pokemon( + "charmander", // id + "charmander", // imageId + 4, // pokedexNumber + "charmander", // name + "파이리", // koName + "charmander", // speciesName + false, // canChangeForm + "", // formName + 62, // baseExp + 50, // friendship + List.of("fire"), // types + List.of("blaze"), // normalAbilityIds + "solar_power", // hiddenAbilityId + "beast_boost", // passiveAbilityId + 1, // generation + false, // legendary + false, // subLegendary + false, // mythical + CHARMANDER_EVOLUTIONS, // evolutions + List.of(), // formChanges + 309, // baseTotal + 39, // hp + 52, // attack + 43, // defense + 60, // specialAttack + 50, // specialDefense + 65, // speed + 0.6, // height + 8.5, // weight + List.of("dragon_dance", "bitter_blade", "earth_power", "oblivion_wing"), // eggMoveIds + CHARMANDER_LEVEL_MOVES, // levelMoves + List.of( + "mega_punch", "fire_punch", "thunder_punch", "swords_dance", "cut", "mega_kick", "body_slam", "take_down", "double_edge", + "roar", "flamethrower", "counter", "strength", "fire_spin", "dig", "toxic", "double_team", "reflect", "fire_blast", + "swift", "rest", "rock_slide", "substitute", "snore", "curse", "protect", "scary_face", "mud_slap", "outrage", + "endure", "false_swipe", "swagger", "attract", "sleep_talk", "return", "frustration", "iron_tail", "metal_claw", + "hidden_power", "sunny_day", "crunch", "rock_smash", "beat_up", "heat_wave", "will_o_wisp", "facade", "focus_punch", + "helping_hand", "brick_break", "weather_ball", "air_cutter", "overheat", "rock_tomb", "aerial_ace", "dragon_claw", + "dragon_dance", "fling", "flare_blitz", "dragon_pulse", "focus_blast", "shadow_claw", "fire_fang", "hone_claws", + "flame_charge", "round", "echoed_voice", "incinerate", "acrobatics", "fire_pledge", "dragon_tail", "work_up", + "confide", "power_up_punch", "breaking_swipe", "tera_blast", "temper_flare" + ), // technicalMachineMoveIds + List.of("volcano") // biomeIds + ); +} From 849c9be39bf8c3d5447f6c3354014e73d085e490 Mon Sep 17 00:00:00 2001 From: jongmee Date: Fri, 11 Oct 2024 15:51:05 +0900 Subject: [PATCH 31/32] =?UTF-8?q?remove:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/battle/BattleMoveRepository.java | 28 ------------------- .../helper/battle/data/BattleMove.java | 23 --------------- .../com/pokerogue/helper/move/data/Move.java | 2 -- .../helper/move/dto/MoveResponse.java | 1 - 4 files changed, 54 deletions(-) delete mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMoveRepository.java delete mode 100644 backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMoveRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMoveRepository.java deleted file mode 100644 index 41ac62078..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMoveRepository.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pokerogue.helper.battle; - -import com.pokerogue.helper.battle.data.BattleMove; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import org.springframework.stereotype.Repository; - -@Repository -public class BattleMoveRepository { - - private final Map moves = new HashMap<>(); - - public void save(BattleMove battleMove) { - moves.put(battleMove.id(), battleMove); - } - - public List findAll() { - return moves.values() - .stream() - .toList(); - } - - public Optional findById(String id) { - return Optional.ofNullable(moves.get(id)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java deleted file mode 100644 index 44beac667..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/data/BattleMove.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.pokerogue.helper.battle.data; - -import com.pokerogue.helper.move.data.MoveCategory; -import com.pokerogue.helper.type.data.Type; - -public record BattleMove( - String id, - String name, - String nameAppend, - String effect, - Type type, - String defaultTypeId, - MoveCategory category, - String moveTarget, - Integer power, - Integer accuracy, - Integer pp, - Integer chance, - Integer priority, - Integer generation, - String flags -) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java index c9fcf259d..a131583a8 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java @@ -3,7 +3,6 @@ import com.pokerogue.helper.type.data.Type; import java.util.List; import lombok.AccessLevel; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; @@ -11,7 +10,6 @@ import org.springframework.data.mongodb.core.mapping.Field; @Getter -@AllArgsConstructor @Document(collection = "move") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Move { diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/dto/MoveResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/dto/MoveResponse.java index 8d2154c42..fff97254f 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/dto/MoveResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/dto/MoveResponse.java @@ -1,4 +1,3 @@ - package com.pokerogue.helper.move.dto; import com.pokerogue.helper.move.data.Move; From 0e0d110535da1a3590c88a47722f653fa76f6a77 Mon Sep 17 00:00:00 2001 From: jongmee Date: Fri, 11 Oct 2024 15:54:13 +0900 Subject: [PATCH 32/32] =?UTF-8?q?chore:=20=EC=84=9C=EB=B8=8C=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=B5=9C=EC=8B=A0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pokerogue/src/main/resources | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/pokerogue/src/main/resources b/backend/pokerogue/src/main/resources index 985453eef..8d0ded1d3 160000 --- a/backend/pokerogue/src/main/resources +++ b/backend/pokerogue/src/main/resources @@ -1 +1 @@ -Subproject commit 985453eefb017232bc289886acea1f0eb756d80f +Subproject commit 8d0ded1d3b1d34ca75fb46c924b96bc6da71deb0