package uulm.teamname.marvelous.gamelibrary.ai; import uulm.teamname.marvelous.gamelibrary.ArrayTools; import uulm.teamname.marvelous.gamelibrary.IntVector2; import uulm.teamname.marvelous.gamelibrary.config.CharacterConfig; import uulm.teamname.marvelous.gamelibrary.config.PartyConfig; import uulm.teamname.marvelous.gamelibrary.config.ScenarioConfig; import uulm.teamname.marvelous.gamelibrary.entities.Character; import uulm.teamname.marvelous.gamelibrary.entities.EntityID; import uulm.teamname.marvelous.gamelibrary.entities.EntityType; import uulm.teamname.marvelous.gamelibrary.events.Event; import uulm.teamname.marvelous.gamelibrary.events.EventType; import uulm.teamname.marvelous.gamelibrary.gamelogic.*; import uulm.teamname.marvelous.gamelibrary.requests.Request; import uulm.teamname.marvelous.gamelibrary.requests.RequestBuilder; import uulm.teamname.marvelous.gamelibrary.requests.RequestType; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; public class AI { private final GameInstance game; private final EntityType player; public AI(EntityType player, PartyConfig partyConfig, CharacterConfig characterConfig, ScenarioConfig scenarioConfig) { this.game = new GameInstance(partyConfig, characterConfig, scenarioConfig); this.player = player; } public Optional> handle(Event... events) { ArrayList result = new ArrayList<>(); game.applyEvents(events); boolean containsTurn = false; for(Event event: events) { if(event.type == EventType.TurnEvent) { containsTurn = true; break; } } if(containsTurn && game.state.getActiveCharacter() != null && game.state.getActiveCharacter().type == player) { result.addAll(handleTurn(game.state.getActiveCharacter())); } if(!result.isEmpty()) { return Optional.of(result); }else { return Optional.empty(); } } private ArrayList handleTurn(EntityID turn) { ArrayList result = new ArrayList<>(); Character character = (Character)game.state.getEntities().findEntity(turn); ArrayList options = ArrayTools.toArrayList(IntVector2.CardinalDirections.clone()); Collections.shuffle(options); for(IntVector2 dir: options) { IntVector2 target = character.getPosition().add(dir); if( target.getX() < 0 || target.getX() >= game.state.getMapSize().getX() || target.getY() < 0 || target.getY() >= game.state.getMapSize().getY() ) { continue; } if(game.state.getEntities().findByPosition(target).isEmpty()) { result.add(new RequestBuilder(RequestType.MoveRequest) .withOriginEntity(turn) .withOriginField(character.getPosition()) .withTargetField(character.getPosition().add(dir)) .buildCharacterRequest()); break; } } result.add(new RequestBuilder(RequestType.EndRoundRequest) .buildGameRequest()); return result; } }