feat: Winnable and some minor changes

This commit is contained in:
2024-12-31 15:36:18 +01:00
parent c47df0d609
commit b6596c7303
8 changed files with 67 additions and 5 deletions

View File

@ -81,4 +81,13 @@ public class GameController {
return ResponseEntity.ok(UnifiedResponse.success(TestGameKeyResponse.WORKING));
}
@GetMapping("/winnable")
@CheckUser
public ResponseEntity<UnifiedResponse<Boolean, Error>> winnable(@RequestParam String playerKey) {
var player = playerRepository.findByPlayerKey(playerKey).get();
var game = player.getGame();
return ResponseEntity.ok(UnifiedResponse.success(game.winnable()));
}
}

View File

@ -44,4 +44,33 @@ public class Game {
public void addPlayer(Player player) {
this.players.add(player);
}
@JsonIgnore
public boolean winnable() {
var ownedFragments = 0;
for (Player player : players) {
for (Item item : player.getInventory()) {
if (item.getItemType() == ItemType.KEY_FRAGMENT) {
ownedFragments++;
}
}
}
var roomItems = 0;
var characters = new ArrayList<Character>();
for (Room room : rooms) {
characters.addAll(room.getCharacters());
for (Item item : room.getItems()) {
if (item.getItemType() == ItemType.KEY_FRAGMENT) {
roomItems++;
}
}
}
var unplayedCharacters = characters.stream().filter(character -> !character.isInteractedWith()).toList().size();
return roomItems + unplayedCharacters + ownedFragments >= 5;
}
}

View File

@ -152,7 +152,7 @@ public class Hangman implements InteractionPlayer {
var incorrectGuessesSet = interactionMemory.getIncorrectGuessesSet();
StringBuilder currentProgress = new StringBuilder(interactionMemory.getCurrentProgress());
if (data == null || data.isEmpty()) {
if (data.isEmpty()) {
return new InteractionResponse(false, "invalid_input", new ArrayList<>());
}

View File

@ -7,6 +7,7 @@ import cz.jzitnik.chronos.entities.Player;
import cz.jzitnik.chronos.interactions.InteractionPlayer;
import cz.jzitnik.chronos.payload.responses.InteractionResponse;
import cz.jzitnik.chronos.repository.CharacterRepository;
import cz.jzitnik.chronos.repository.ItemRepository;
import cz.jzitnik.chronos.services.ItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -19,6 +20,8 @@ public class Mayor implements InteractionPlayer {
private ItemService itemService;
@Autowired
private CharacterRepository characterRepository;
@Autowired
private ItemRepository itemRepository;
@Override
public InteractionResponse play(Player player, Character character, String data) {
@ -30,10 +33,12 @@ public class Mayor implements InteractionPlayer {
}
var golderWatch = golderWatches.getFirst();
golderWatch.setOwner(null);
itemRepository.save(golderWatch);
playerItems.remove(golderWatch);
var item = new Item(ItemType.KEY_FRAGMENT, player);
itemService.addItem(player, item); // itemRepository.save is ran by this function so we don't need to save the player when we removed the item from his inv
itemService.addItem(player, item);
character.setInteractedWith(true);
characterRepository.save(character);