diff --git a/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameLogic.java b/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameLogic.java index 41ee4f4..fb04b3c 100644 --- a/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameLogic.java +++ b/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameLogic.java @@ -325,12 +325,15 @@ public class GameLogic { List stones = Arrays.asList(target.inventory.getStonesAsArray()); Collections.shuffle(stones); // required by documents + ArrayList used = new ArrayList<>(); for(StoneType stone: stones) { - ArrayList options = getFreeNeighbour(state, target.getPosition()); + ArrayList options = getFreeNeighbour(state, target.getPosition(), used); + IntVector2 picked = options.get(rand.nextInt(options.size())); + used.add(picked); result.add(new EventBuilder(EventType.SpawnEntityEvent) .withEntity(new InfinityStone( new EntityID(EntityType.InfinityStones, stone.getID()), - options.get(rand.nextInt(options.size())), + picked, stone )) .buildEntityEvent()); @@ -704,6 +707,17 @@ public class GameLogic { * @return A list of free neighbour field options */ public static ArrayList getFreeNeighbour(GameState state, IntVector2 start) { + return getFreeNeighbour(state, start, new ArrayList<>(0)); + } + + /** + * Finds free neighbour options from a starting field. + * @param state The game state to work on + * @param start The starting position + * @param blocked A list of positions to treat as not-free + * @return A list of free neighbour field options + */ + public static ArrayList getFreeNeighbour(GameState state, IntVector2 start, List blocked) { ArrayList options = new ArrayList<>(); if(start.getX() < 0 || start.getX() >= state.mapSize.getX() || start.getY() < 0 || start.getY() >= state.mapSize.getY()) { @@ -717,7 +731,7 @@ public class GameLogic { continue; } allOptions.add(pos); - if(state.entities.findByPosition(pos).isEmpty()) { + if(!blocked.contains(pos) && state.entities.findByPosition(pos).isEmpty()) { options.add(pos); } } @@ -726,7 +740,7 @@ public class GameLogic { if(allOptions.isEmpty()) { return allOptions; } - return getFreeNeighbour(state, allOptions.get(rand.nextInt(allOptions.size()))); + return getFreeNeighbour(state, allOptions.get(rand.nextInt(allOptions.size())), blocked); }else { return options; }