Skip to content

Commit 28f8dd6

Browse files
author
mderbent
committed
Created Characters Saved In File. Experience Increases After Each Enemy Kill
1 parent 5c066e4 commit 28f8dd6

File tree

17 files changed

+198
-89
lines changed

17 files changed

+198
-89
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ You can find the documentation in doc folder.
2727
- Actions have high code complexity. Command pattern may be used for the business logic happens in there.
2828
- Code coverage should be increased.
2929
- Rooms should have descriptions. When you enter a room, you should see room's description. There should be a bunch of them loaded somewhere and while game was built, these should be appended to the rooms randomly.
30-
- Characters should be saved in file. Experiences should be saved to that file, too.
30+
- Characters should be saved in file. Experiences should be saved to that file, too. (DONE)
3131
- There should be a final room (Boss room if you might call).
3232
- After final room, there may be some more dungeons (different levels like 3D array) that player may want to visit. Or exit.
3333
- There may be items in rooms.

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
apply plugin: 'java'
22

33
group = 'mad'
4-
version = '0.1.0-ALPHA'
4+
version = '0.1.1-ALPHA'
55
sourceCompatibility=1.8
66
targetCompatibility=1.8
77

src/main/java/mad/rpg/battle/actions/FightAction.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import mad.rpg.characters.infos.InfoType;
44
import mad.rpg.characters.model.Character;
5+
import mad.rpg.characters.model.CharacterRepository;
56
import mad.rpg.characters.model.HostileCharacter;
67
import mad.rpg.characters.stats.Stat;
78
import mad.rpg.characters.stats.StatType;
@@ -10,6 +11,8 @@
1011
import mad.rpg.game.actions.Action;
1112
import mad.rpg.game.context.Context;
1213
import mad.rpg.game.events.EventType;
14+
import mad.rpg.utils.FileDeserializationException;
15+
import mad.rpg.utils.FileSerializationException;
1316
import mad.rpg.utils.UtilLocator;
1417
import mad.rpg.world.model.World;
1518

@@ -20,10 +23,12 @@
2023

2124
public class FightAction implements Action {
2225

23-
Random random;
26+
private Random random;
27+
private CharacterRepository characterRepository;
2428

25-
public FightAction() {
29+
public FightAction(CharacterRepository characterRepository) {
2630
random = new Random();
31+
this.characterRepository = characterRepository;
2732
}
2833

2934
@Override
@@ -82,6 +87,14 @@ public void process(Context context) {
8287
experienceStat.addValue(experienceCoefficient);
8388
String experience = experienceStat.getValue().toString();
8489

90+
try {
91+
characterRepository.updateStat(player, StatType.EXPERIENCE);
92+
} catch (FileDeserializationException e) {
93+
UtilLocator.locate().output().printLine(e.getMessage());
94+
} catch (FileSerializationException e) {
95+
UtilLocator.locate().output().printLine(e.getMessage());
96+
}
97+
8598
UtilLocator.locate().output().printLine(String.format(Messages.YOU_DEFEATED_ENEMY, enemyName));
8699
UtilLocator.locate().output().printLine(String.format(Messages.YOU_GAINED_EXPERIENCE, experienceCoefficient, experience));
87100
UtilLocator.locate().output().printLine(String.format(Messages.YOU_HAVE_HEALTH, playerLastHealth));

src/main/java/mad/rpg/characters/actions/ChooseCharacterAction.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@
44
import mad.rpg.characters.infos.InfoType;
55
import mad.rpg.characters.model.Character;
66
import mad.rpg.characters.model.CharacterRepository;
7+
import mad.rpg.characters.stats.StatType;
78
import mad.rpg.game.Choices;
89
import mad.rpg.game.Commands;
910
import mad.rpg.game.Messages;
1011
import mad.rpg.game.actions.Action;
1112
import mad.rpg.game.context.Context;
1213
import mad.rpg.game.events.EventType;
14+
import mad.rpg.utils.FileDeserializationException;
1315
import mad.rpg.utils.Input;
1416
import mad.rpg.utils.Output;
1517
import mad.rpg.utils.UtilLocator;
1618

19+
import java.util.ArrayList;
1720
import java.util.Arrays;
1821
import java.util.List;
1922
import java.util.Optional;
@@ -32,8 +35,20 @@ public void process(Context context) {
3235
UtilLocator.locate().output().printLine(Messages.CHOOSE_YOUR_CHARACTER);
3336
UtilLocator.locate().output().printLine(Choices.CREATE_A_CHARACTER_CHOICE);
3437

35-
List<Info> names = playerRepository
36-
.characters()
38+
List<Character> characters = new ArrayList<>();
39+
try {
40+
Boolean hasCharacters = playerRepository.hasCharacters();
41+
if(hasCharacters){
42+
characters = playerRepository.characters();
43+
}
44+
} catch (FileDeserializationException e) {
45+
UtilLocator.locate().output().printLine(e.getMessage());
46+
UtilLocator.locate().output().printLine(Messages.UNHANDLED_OPERATION);
47+
context.addEvent(EventType.EXIT_REQUESTED);
48+
return;
49+
}
50+
51+
List<Info> names = characters
3752
.stream()
3853
.map(player -> player.getInfo(InfoType.NAME).get())
3954
.collect(Collectors.toList());
@@ -42,7 +57,7 @@ public void process(Context context) {
4257
UtilLocator.locate().output().printLine((i + 1) + ". " + names.get(i).getValue());
4358
}
4459

45-
String receivedInput = UtilLocator.locate().input().choice(0, playerRepository.characters().size(), Arrays.asList(Commands.CREATE_CHARACTER, Commands.EXIT));
60+
String receivedInput = UtilLocator.locate().input().choice(0, characters.size(), Arrays.asList(Commands.CREATE_CHARACTER, Commands.EXIT));
4661

4762
if(receivedInput.equals(Commands.EXIT)){
4863
context.addEvent(EventType.EXIT_REQUESTED);
@@ -55,15 +70,15 @@ public void process(Context context) {
5570
}
5671

5772
Integer choice = Integer.parseInt(receivedInput);
58-
Optional<Character> player = playerRepository.character(choice);
73+
Character player = characters.get(choice - 1);
5974

60-
if(!player.isPresent()){
75+
if(player == null){
6176
UtilLocator.locate().output().printMessage(Messages.CHARACTER_NOT_FOUND);
6277
return;
6378
}
6479

65-
context.withPlayer(player.get());
66-
UtilLocator.locate().output().printLine(String.format(Messages.CHARACTER_SELECTED, player.get().getInfo(InfoType.NAME).get().getValue()));
80+
context.withPlayer(player);
81+
UtilLocator.locate().output().printLine(String.format(Messages.CHARACTER_SELECTED, player.getInfo(InfoType.NAME).get().getValue(), player.getStat(StatType.HEALTH).get().getValue(), player.getStat(StatType.ATTACK_DAMAGE).get().getValue(), player.getStat(StatType.EXPERIENCE).get().getValue()));
6782
context.addEvent(EventType.CHARACTER_SELECTED);
6883
}
6984

src/main/java/mad/rpg/characters/actions/CreateCharacterAction.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@
1010
import mad.rpg.game.actions.Action;
1111
import mad.rpg.game.context.Context;
1212
import mad.rpg.game.events.EventType;
13-
import mad.rpg.utils.Input;
14-
import mad.rpg.utils.Output;
15-
import mad.rpg.utils.UtilLocator;
13+
import mad.rpg.utils.*;
1614

1715
import java.math.BigDecimal;
1816
import java.util.ArrayList;
@@ -57,7 +55,19 @@ public void process(Context context) {
5755
return;
5856
}
5957

60-
playerRepository.add(new Player(infos, stats));
58+
try {
59+
playerRepository.add(new Player(infos, stats));
60+
} catch (FileDeserializationException e) {
61+
UtilLocator.locate().output().printLine(e.getMessage());
62+
context.addEvent(EventType.CHARACTER_NOT_CREATED);
63+
UtilLocator.locate().output().printLine(Messages.CHARACTER_NOT_ADDED);
64+
return;
65+
} catch (FileSerializationException e) {
66+
UtilLocator.locate().output().printLine(e.getMessage());
67+
context.addEvent(EventType.CHARACTER_NOT_CREATED);
68+
UtilLocator.locate().output().printLine(Messages.CHARACTER_NOT_ADDED);
69+
return;
70+
}
6171

6272
context.addEvent(EventType.CHARACTER_CREATED);
6373
UtilLocator.locate().output().printLine(Messages.CHARACTER_ADDED);

src/main/java/mad/rpg/characters/model/Character.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.io.Serializable;
99
import java.util.List;
1010
import java.util.Optional;
11+
import java.util.UUID;
1112

1213
public interface Character extends Serializable {
1314

@@ -18,4 +19,6 @@ public interface Character extends Serializable {
1819
Optional<Info> getInfo(InfoType infoType);
1920

2021
Optional<Stat> getStat(StatType statType);
22+
23+
UUID id();
2124
}
Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
package mad.rpg.characters.model;
22

3+
import mad.rpg.characters.stats.StatType;
4+
import mad.rpg.utils.FileDeserializationException;
5+
import mad.rpg.utils.FileSerializationException;
6+
37
import java.util.List;
48
import java.util.Optional;
59

610
public interface CharacterRepository {
711

8-
CharacterRepository add(Character player);
12+
CharacterRepository add(Character player) throws FileDeserializationException, FileSerializationException;
13+
14+
Boolean hasCharacters() throws FileDeserializationException;
15+
16+
List<Character> characters() throws FileDeserializationException;
917

10-
List<Character> characters();
18+
CharacterRepository updateStat(Character player, StatType statType) throws FileDeserializationException, FileSerializationException;
1119

12-
Optional<Character> character(Integer index);
1320
}

src/main/java/mad/rpg/characters/model/Enemy.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,18 @@
77

88
import java.util.List;
99
import java.util.Optional;
10+
import java.util.UUID;
1011

1112
public class Enemy implements HostileCharacter {
1213

14+
private UUID id;
1315
private List<Info> infos;
1416
private List<Stat> stats;
1517

1618
public Enemy(List<Info> infos, List<Stat> stats) {
1719
this.infos = infos;
1820
this.stats = stats;
21+
id = UUID.randomUUID();
1922
}
2023

2124
@Override
@@ -48,4 +51,9 @@ public Optional<Stat> getStat(StatType statType) {
4851
.findFirst();
4952
}
5053

54+
@Override
55+
public UUID id() {
56+
return id;
57+
}
58+
5159
}

src/main/java/mad/rpg/characters/model/Player.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,18 @@
77

88
import java.util.List;
99
import java.util.Optional;
10+
import java.util.UUID;
1011

1112
public class Player implements Character {
1213

14+
private UUID id;
1315
private List<Info> infos;
1416
private List<Stat> stats;
1517

1618
public Player(List<Info> infos, List<Stat> stats) {
1719
this.infos = infos;
1820
this.stats = stats;
21+
id = UUID.randomUUID();
1922
}
2023

2124
@Override
@@ -47,4 +50,9 @@ public Optional<Stat> getStat(StatType statType) {
4750
.equals(statType))
4851
.findFirst();
4952
}
53+
54+
@Override
55+
public UUID id() {
56+
return id;
57+
}
5058
}
Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,59 @@
11
package mad.rpg.characters.model;
22

3+
import mad.rpg.characters.stats.Stat;
4+
import mad.rpg.characters.stats.StatType;
5+
import mad.rpg.game.FileNames;
6+
import mad.rpg.game.saves.SaveGame;
7+
import mad.rpg.utils.FileDeserializationException;
8+
import mad.rpg.utils.FileSerializationException;
9+
import mad.rpg.utils.UtilLocator;
10+
311
import java.util.ArrayList;
412
import java.util.List;
513
import java.util.Optional;
614

715
public class PlayerRepository implements CharacterRepository {
816

9-
List<Character> characters;
10-
11-
public PlayerRepository() {
12-
characters = new ArrayList<>();
13-
}
14-
1517
@Override
16-
public CharacterRepository add(Character player) {
18+
public CharacterRepository add(Character player) throws FileDeserializationException, FileSerializationException {
19+
List<Character> characters = new ArrayList<>();
20+
if(hasCharacters()){
21+
characters = characters();
22+
}
1723
characters.add(player);
24+
UtilLocator.locate().fileSerializer().write(characters, FileNames.CHARACTER);
1825
return this;
1926
}
2027

2128
@Override
22-
public List<Character> characters() {
23-
return characters;
29+
public Boolean hasCharacters() throws FileDeserializationException {
30+
Boolean fileExists = UtilLocator.locate().fileUtil().exists(FileNames.CHARACTER);
31+
return fileExists ? UtilLocator.locate().fileDeserializer().read(List.class, FileNames.CHARACTER).size() > 0 : false;
2432
}
2533

2634
@Override
27-
public Optional<Character> character(Integer index) {
28-
return characters.stream().skip(index.longValue() - 1).findFirst();
35+
public List<Character> characters() throws FileDeserializationException {
36+
return UtilLocator.locate().fileDeserializer().read(List.class, FileNames.CHARACTER);
37+
}
38+
39+
@Override
40+
public CharacterRepository updateStat(Character player, StatType statType) throws FileDeserializationException, FileSerializationException {
41+
List<Character> characters = new ArrayList<>();
42+
if(hasCharacters()){
43+
characters = characters();
44+
}
45+
characters
46+
.stream()
47+
.filter(character -> character.id().equals(player.id()))
48+
.forEach(character -> {
49+
Optional<Stat> stat = character.getStat(statType);
50+
if(stat.isPresent()){
51+
stat.get().removeValue(stat.get().getValue());
52+
stat.get().addValue(player.getStat(statType).get().getValue());
53+
}
54+
});
55+
UtilLocator.locate().fileSerializer().write(characters, FileNames.CHARACTER);
56+
return this;
2957
}
3058

3159
}

0 commit comments

Comments
 (0)