88 lines
3.3 KiB
Java
88 lines
3.3 KiB
Java
|
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<List<Request>> handle(Event... events) {
|
||
|
ArrayList<Request> 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<Request> handleTurn(EntityID turn) {
|
||
|
ArrayList<Request> result = new ArrayList<>();
|
||
|
|
||
|
Character character = (Character)game.state.getEntities().findEntity(turn);
|
||
|
|
||
|
ArrayList<IntVector2> 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;
|
||
|
}
|
||
|
}
|