Skip to content

Commit 963523e

Browse files
authored
feature : 스킬 추가, 스킬 뽑기, 캐릭터 스킬 장착, 스텟창 확인 업데이트 (#60)
* feature : 스킬 추가, 스킬 뽑기, 캐릭터 스킬 장착, 스텟창 확인 업데이트 * chore : 예외처리 추가, 오타수정 * chore : 예외처리 추가, 오타수정
1 parent 9c93a71 commit 963523e

File tree

56 files changed

+932
-331
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+932
-331
lines changed

src/main/java/org/ezcode/codetest/application/game/dto/mapper/GameMapper.java

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
package org.ezcode.codetest.application.game.dto.mapper;
2+
3+
import java.util.List;
4+
25
import org.ezcode.codetest.application.game.dto.response.AccessoryResponse;
6+
import org.ezcode.codetest.application.game.dto.response.CharacterStatusResponse;
37
import org.ezcode.codetest.application.game.dto.response.DefenceResponse;
48
import org.ezcode.codetest.application.game.dto.response.ItemResponse;
9+
import org.ezcode.codetest.application.game.dto.response.SkillResponse;
510
import org.ezcode.codetest.application.game.dto.response.WeaponResponse;
611
import org.ezcode.codetest.domain.game.model.entity.Accessory;
12+
import org.ezcode.codetest.domain.game.model.entity.CharacterRealStat;
713
import org.ezcode.codetest.domain.game.model.entity.Defence;
14+
import org.ezcode.codetest.domain.game.model.entity.GameCharacter;
815
import org.ezcode.codetest.domain.game.model.entity.Item;
16+
import org.ezcode.codetest.domain.game.model.entity.Skill;
917
import org.ezcode.codetest.domain.game.model.entity.Weapon;
18+
import org.mapstruct.AfterMapping;
1019
import org.mapstruct.Mapper;
20+
import org.mapstruct.Mapping;
21+
import org.mapstruct.MappingTarget;
1122
import org.mapstruct.SubclassExhaustiveStrategy;
1223
import org.mapstruct.SubclassMapping;
1324

@@ -22,7 +33,34 @@ public interface GameMapper {
2233
@SubclassMapping(target = AccessoryResponse.class, source = Accessory.class)
2334
ItemResponse toItemResponse(Item item);
2435

25-
WeaponResponse toItemResponse(Weapon weapon);
26-
DefenceResponse toItemResponse(Defence defence);
36+
WeaponResponse toItemResponse(Weapon weapon);
37+
DefenceResponse toItemResponse(Defence defence);
2738
AccessoryResponse toItemResponse(Accessory accessory);
39+
40+
@Mapping(target = "realStat", ignore = true)
41+
@Mapping(target = "items", ignore = true)
42+
@Mapping(target = "skills", ignore = true)
43+
CharacterStatusResponse toCharacterStatusResponse(GameCharacter character, List<Item> items, List<Skill> skills);
44+
45+
@AfterMapping
46+
default void applyItemStatsToRealStat(
47+
GameCharacter character,
48+
List<Item> items,
49+
List<Skill> skills,
50+
@MappingTarget CharacterStatusResponse.CharacterStatusResponseBuilder builder
51+
) {
52+
CharacterRealStat sum = new CharacterRealStat(character.getRealStat());
53+
54+
sum.applyItemRealStat(items);
55+
56+
List<ItemResponse> itemResponses = items.stream()
57+
.map(this::toItemResponse)
58+
.toList();
59+
60+
List<SkillResponse> skillResponses = skills.stream()
61+
.map(SkillResponse::from)
62+
.toList();
63+
64+
builder.realStat(sum).items(itemResponses).skills(skillResponses);
65+
}
2866
}

src/main/java/org/ezcode/codetest/application/game/dto/request/AccessorySaveRequest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,26 @@
33
import org.ezcode.codetest.domain.game.model.entity.Accessory;
44
import org.ezcode.codetest.domain.game.model.entity.Item;
55
import org.ezcode.codetest.domain.game.model.enums.AccessoryType;
6+
import org.ezcode.codetest.domain.game.model.enums.Grade;
67

78
import com.fasterxml.jackson.annotation.JsonTypeName;
89

910
import jakarta.validation.constraints.Min;
1011
import jakarta.validation.constraints.NotBlank;
1112
import jakarta.validation.constraints.NotNull;
13+
import jakarta.validation.constraints.Pattern;
1214
import lombok.Getter;
1315

1416
@JsonTypeName("accessory")
1517
@Getter
1618
public class AccessorySaveRequest extends ItemSaveRequest {
1719

1820
@NotBlank
21+
@Pattern(
22+
regexp = "GRAPHIC_CARD|USB|KEYBOARD|MOUSE|CPU|MEMORY|DISK",
23+
flags = Pattern.Flag.CASE_INSENSITIVE,
24+
message = "악세서리 타입은 GRAPHIC_CARD, USB, KEYBOARD, MOUSE, CPU, MEMORY, DISK 중 하나여야 합니다."
25+
)
1926
private final String accessoryType;
2027

2128
@NotNull
@@ -57,10 +64,11 @@ public AccessorySaveRequest(
5764
@Override
5865
public Item toItem() {
5966
AccessoryType at = AccessoryType.valueOf(accessoryType.trim().toUpperCase());
67+
Grade grade = Grade.valueOf(getGrade().trim().toUpperCase());
6068
return Accessory.builder()
6169
.id(null)
6270
.type(at)
63-
.grade(getGrade())
71+
.grade(grade)
6472
.name(getName())
6573
.description(getDescription())
6674
.speed(getSpeed())

src/main/java/org/ezcode/codetest/application/game/dto/request/DefenceSaveRequest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,26 @@
33
import org.ezcode.codetest.domain.game.model.entity.Defence;
44
import org.ezcode.codetest.domain.game.model.entity.Item;
55
import org.ezcode.codetest.domain.game.model.enums.DefenceType;
6+
import org.ezcode.codetest.domain.game.model.enums.Grade;
67

78
import com.fasterxml.jackson.annotation.JsonTypeName;
89

910
import jakarta.validation.constraints.Min;
1011
import jakarta.validation.constraints.NotBlank;
1112
import jakarta.validation.constraints.NotNull;
13+
import jakarta.validation.constraints.Pattern;
1214
import lombok.Getter;
1315

1416
@JsonTypeName("defence")
1517
@Getter
1618
public class DefenceSaveRequest extends ItemSaveRequest {
1719

1820
@NotBlank
21+
@Pattern(
22+
regexp = "ARMOR|SHIELD",
23+
flags = Pattern.Flag.CASE_INSENSITIVE,
24+
message = "방어구 타입은 ARMOR 또는 SHIELD 여야 합니다."
25+
)
1926
private final String defenceType;
2027

2128
@NotNull
@@ -49,10 +56,11 @@ public DefenceSaveRequest(
4956
@Override
5057
public Item toItem() {
5158
DefenceType dt = DefenceType.valueOf(defenceType.trim().toUpperCase());
59+
Grade grade = Grade.valueOf(getGrade().trim().toUpperCase());
5260
return Defence.builder()
5361
.id(null)
5462
.type(dt)
55-
.grade(getGrade())
63+
.grade(grade)
5664
.name(getName())
5765
.description(getDescription())
5866
.def(getDef())
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.ezcode.codetest.application.game.dto.request;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
5+
public record ItemDeleteRequest(
6+
7+
@NotBlank(message = "삭제하려는 아이템 이름을 입력해주세요.")
8+
String name
9+
10+
) {
11+
}

src/main/java/org/ezcode/codetest/application/game/dto/request/ItemEquipRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
public record ItemEquipRequest(
66

77
@NotBlank(message = "장착할 아이템 이름을 입력해주십시오.")
8-
String itemName
8+
String name
99

1010
) {
1111
}

src/main/java/org/ezcode/codetest/application/game/dto/request/ItemSaveRequest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.fasterxml.jackson.annotation.JsonTypeInfo;
77

88
import jakarta.validation.constraints.NotBlank;
9+
import jakarta.validation.constraints.Pattern;
910
import lombok.Getter;
1011

1112
@JsonTypeInfo(
@@ -22,6 +23,11 @@
2223
public abstract class ItemSaveRequest {
2324

2425
@NotBlank
26+
@Pattern(
27+
regexp = "LEGENDARY|UNIQUE|RARE|UNCOMMON|COMMON|TRASH",
28+
flags = Pattern.Flag.CASE_INSENSITIVE,
29+
message = "아이템 등급은 LEGENDARY, UNIQUE, RARE, UNCOMMON, COMMON, TRASH 중 하나여야 합니다."
30+
)
2531
private final String grade;
2632

2733
@NotBlank
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.ezcode.codetest.application.game.dto.request;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
5+
public record SkillDeleteRequest(
6+
7+
@NotBlank(message = "삭제하려는 스킬의 이름이 필요합니다.")
8+
String name
9+
) {
10+
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.ezcode.codetest.application.game.dto.request;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
5+
public record SkillEquipRequest(
6+
7+
@NotBlank(message = "장착할 스킬 이름을 입력해주십시오.")
8+
String name
9+
10+
) {
11+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.ezcode.codetest.application.game.dto.request;
2+
3+
import org.ezcode.codetest.domain.game.model.entity.Skill;
4+
import org.ezcode.codetest.domain.game.model.enums.Grade;
5+
import org.ezcode.codetest.domain.game.model.enums.SkillEffect;
6+
7+
import jakarta.validation.constraints.NotBlank;
8+
import jakarta.validation.constraints.Pattern;
9+
10+
public record SkillSaveRequest(
11+
12+
@NotBlank(message = "스킬 이펙트를 입력해주세요.")
13+
@Pattern(
14+
regexp = "LIFE_STEAL|COUNTER_ATTACK|REFLEX_DAMAGE|HEAL|BURST_ATTACK|INSTANT_KILL|BLOODY_MESS|DEFENCE|ILLUSION",
15+
flags = Pattern.Flag.CASE_INSENSITIVE,
16+
message = "스킬 이펙트는 LIFE_STEAL, COUNTER_ATTACK, REFLEX_DAMAGE, HEAL, BURST_ATTACK, INSTANT_KILL, BLOODY_MESS, DEFENCE, ILLUSION 중 하나여야 합니다."
17+
)
18+
String skillEffect,
19+
20+
@NotBlank(message = "등급을 입력해주세요.")
21+
@Pattern(
22+
regexp = "LEGENDARY|UNIQUE|RARE|UNCOMMON|COMMON|TRASH",
23+
flags = Pattern.Flag.CASE_INSENSITIVE,
24+
message = "아이템 등급은 LEGENDARY, UNIQUE, RARE, UNCOMMON, COMMON, TRASH 중 하나여야 합니다."
25+
)
26+
String grade,
27+
28+
@NotBlank(message = "스킬 이름을 입력해주세요.")
29+
String name,
30+
31+
@NotBlank(message = "스킬 설명을 입력해주세요.")
32+
String skillDetails
33+
) {
34+
35+
public Skill toSkill() {
36+
37+
return Skill.builder()
38+
.skillEffect(SkillEffect.valueOf(skillEffect.trim().toUpperCase()))
39+
.grade(Grade.valueOf(grade.trim().toUpperCase()))
40+
.name(name)
41+
.skillDetails(skillDetails)
42+
.build();
43+
}
44+
}

src/main/java/org/ezcode/codetest/application/game/dto/request/WeaponSaveRequest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,27 @@
22

33
import org.ezcode.codetest.domain.game.model.entity.Item;
44
import org.ezcode.codetest.domain.game.model.entity.Weapon;
5+
import org.ezcode.codetest.domain.game.model.enums.Grade;
56
import org.ezcode.codetest.domain.game.model.enums.WeaponType;
67

78
import com.fasterxml.jackson.annotation.JsonTypeName;
89

910
import jakarta.validation.constraints.Min;
1011
import jakarta.validation.constraints.NotBlank;
1112
import jakarta.validation.constraints.NotNull;
13+
import jakarta.validation.constraints.Pattern;
1214
import lombok.Getter;
1315

1416
@JsonTypeName("weapon")
1517
@Getter
1618
public class WeaponSaveRequest extends ItemSaveRequest {
1719

1820
@NotBlank
21+
@Pattern(
22+
regexp = "SHOT_GUN|RIFLE|PISTOL|LONG_SWORD|SHORT_SWORD|SPEAR|BOW",
23+
flags = Pattern.Flag.CASE_INSENSITIVE,
24+
message = "무기 타입은 SHOT_GUN, RIFLE, PISTOL, LONG_SWORD, SHORT_SWORD, SPEAR, BOW 중 하나여야 합니다."
25+
)
1926
private final String weaponType;
2027

2128
@NotNull
@@ -60,10 +67,11 @@ public WeaponSaveRequest(
6067

6168
public Item toItem() {
6269
WeaponType wt = WeaponType.valueOf(weaponType.trim().toUpperCase());
70+
Grade grade = Grade.valueOf(getGrade().trim().toUpperCase());
6371
return Weapon.builder()
6472
.id(null)
6573
.type(wt)
66-
.grade(getGrade())
74+
.grade(grade)
6775
.name(getName())
6876
.description(getDescription())
6977
.atk(atk)

0 commit comments

Comments
 (0)