feat: add thanos' ai
This commit is contained in:
parent
2f45e2b772
commit
850c46c6e1
@ -80,7 +80,10 @@ public class Inventory implements Iterable<StoneType> {
|
|||||||
content.remove(stone);
|
content.remove(stone);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the stones inside of the Inventory as Array of {@link StoneType StoneTypes} */
|
/**
|
||||||
|
* Returns the stones inside of the Inventory as Array of {@link StoneType StoneTypes}.
|
||||||
|
* @return The array of stones the inventory has
|
||||||
|
*/
|
||||||
public StoneType[] getStonesAsArray() {
|
public StoneType[] getStonesAsArray() {
|
||||||
var toReturn = new StoneType[content.size()];
|
var toReturn = new StoneType[content.size()];
|
||||||
var iterator = content.iterator();
|
var iterator = content.iterator();
|
||||||
@ -90,6 +93,17 @@ public class Inventory implements Iterable<StoneType> {
|
|||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfers the stones inside of the Inventory to a different Inventory.
|
||||||
|
* @param to The {@link Inventory} to transfer to
|
||||||
|
*/
|
||||||
|
public void transfer(Inventory to) {
|
||||||
|
for(StoneType stone: content) {
|
||||||
|
to.addStone(stone);
|
||||||
|
}
|
||||||
|
content.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/** Iterates over the inventory. */
|
/** Iterates over the inventory. */
|
||||||
@Override
|
@Override
|
||||||
public Iterator<StoneType> iterator() {
|
public Iterator<StoneType> iterator() {
|
||||||
|
@ -20,7 +20,7 @@ public class NPC extends Entity {
|
|||||||
*/
|
*/
|
||||||
public NPC(EntityID id, IntVector2 position, int maxMP, ArrayList<StoneType> inventory) {
|
public NPC(EntityID id, IntVector2 position, int maxMP, ArrayList<StoneType> inventory) {
|
||||||
super(id, position);
|
super(id, position);
|
||||||
solid = false;
|
solid = true;
|
||||||
opaque = true;
|
opaque = true;
|
||||||
this.inventory = new Inventory(inventory);
|
this.inventory = new Inventory(inventory);
|
||||||
this.mp = new Stat(StatType.MP, maxMP);
|
this.mp = new Stat(StatType.MP, maxMP);
|
||||||
|
@ -14,6 +14,7 @@ import java.awt.*;
|
|||||||
import java.awt.geom.Line2D;
|
import java.awt.geom.Line2D;
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
import java.sql.ResultSetMetaData;
|
import java.sql.ResultSetMetaData;
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -424,7 +425,7 @@ class GameLogic {
|
|||||||
* Verifies that a {@link Character} is alive.
|
* Verifies that a {@link Character} is alive.
|
||||||
*/
|
*/
|
||||||
private static void requireAlive(Character entity) throws InvalidRequestException {
|
private static void requireAlive(Character entity) throws InvalidRequestException {
|
||||||
if(entity.hp.getValue() <= 0 || !entity.isActive()) {
|
if(!entity.isAlive() || !entity.isActive()) {
|
||||||
throw new InvalidRequestException();
|
throw new InvalidRequestException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -560,7 +561,7 @@ class GameLogic {
|
|||||||
((Character)state.entities.findEntity(((CharacterEvent)event).targetEntity)).ap.decreaseValue(((CharacterEvent)event).amount);
|
((Character)state.entities.findEntity(((CharacterEvent)event).targetEntity)).ap.decreaseValue(((CharacterEvent)event).amount);
|
||||||
}
|
}
|
||||||
case ConsumedMPEvent -> {
|
case ConsumedMPEvent -> {
|
||||||
((Character)state.entities.findEntity(((CharacterEvent)event).targetEntity)).mp.decreaseValue(((CharacterEvent)event).amount);
|
((NPC)state.entities.findEntity(((CharacterEvent)event).targetEntity)).mp.decreaseValue(((CharacterEvent)event).amount);
|
||||||
}
|
}
|
||||||
case SpawnEntityEvent -> {
|
case SpawnEntityEvent -> {
|
||||||
state.entities.addEntity(((EntityEvent)event).entity);
|
state.entities.addEntity(((EntityEvent)event).entity);
|
||||||
@ -569,7 +570,7 @@ class GameLogic {
|
|||||||
((Character)state.entities.findEntity(((CharacterEvent)event).targetEntity)).hp.increaseValue(((CharacterEvent)event).amount);
|
((Character)state.entities.findEntity(((CharacterEvent)event).targetEntity)).hp.increaseValue(((CharacterEvent)event).amount);
|
||||||
}
|
}
|
||||||
case MoveEvent -> {
|
case MoveEvent -> {
|
||||||
Character target = (Character)state.entities.findEntity(((CharacterEvent)event).originEntity);
|
NPC target = (NPC)state.entities.findEntity(((CharacterEvent)event).originEntity);
|
||||||
for(Entity entity: state.entities.findByPosition(((CharacterEvent)event).targetField)) {
|
for(Entity entity: state.entities.findByPosition(((CharacterEvent)event).targetField)) {
|
||||||
if(entity instanceof InfinityStone) {
|
if(entity instanceof InfinityStone) {
|
||||||
target.inventory.addStone(((InfinityStone)entity).type);
|
target.inventory.addStone(((InfinityStone)entity).type);
|
||||||
@ -912,7 +913,83 @@ class GameLogic {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//TODO: implement thanos ai
|
|
||||||
|
if(picked == null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<IntVector2> path = GameLogic.Bresenham4Connected(thanos.getPosition(), picked);
|
||||||
|
|
||||||
|
int mp = thanos.mp.getValue();
|
||||||
|
IntVector2 current = thanos.getPosition();
|
||||||
|
for(IntVector2 pos: path) {
|
||||||
|
if(pos.equals(thanos.getPosition())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!pos.equals(picked)) {
|
||||||
|
for(Entity entity: state.entities.findByPosition(pos)) {
|
||||||
|
if(entity instanceof Rock) {
|
||||||
|
result.add(new EventBuilder(EventType.DestroyedEntityEvent)
|
||||||
|
.withTargetEntity(entity.id)
|
||||||
|
.withTargetField(entity.getPosition())
|
||||||
|
.buildEntityEvent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.add(new EventBuilder(EventType.MoveEvent)
|
||||||
|
.withOriginEntity(thanos.id)
|
||||||
|
.withOriginField(current)
|
||||||
|
.withTargetField(pos)
|
||||||
|
.buildCharacterEvent());
|
||||||
|
result.add(new EventBuilder(EventType.ConsumedMPEvent)
|
||||||
|
.withTargetEntity(thanos.id)
|
||||||
|
.withTargetField(pos)
|
||||||
|
.withAmount(1)
|
||||||
|
.buildCharacterEvent());
|
||||||
|
|
||||||
|
if(pos.equals(picked)) {
|
||||||
|
for(Entity entity: state.entities.findByPosition(pos)) {
|
||||||
|
if(entity instanceof Character) {
|
||||||
|
result.add(new EventBuilder(EventType.MoveEvent)
|
||||||
|
.withOriginEntity(entity.id)
|
||||||
|
.withOriginField(pos)
|
||||||
|
.withTargetField(current)
|
||||||
|
.buildCharacterEvent());
|
||||||
|
result.add(new EventBuilder(EventType.TakenDamageEvent)
|
||||||
|
.withTargetEntity(entity.id)
|
||||||
|
.withTargetField(current)
|
||||||
|
.withAmount(((Character)entity).hp.getValue())
|
||||||
|
.buildEntityEvent());
|
||||||
|
((Character)entity).inventory.transfer(thanos.inventory);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(entity instanceof InfinityStone) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
current = pos;
|
||||||
|
if(--mp == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}else {
|
||||||
|
|
||||||
|
for(EntityID id: state.turnOrder) {
|
||||||
|
if(id.equals(thanos.id)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(rand.nextBoolean()) {
|
||||||
|
result.add(new EventBuilder(EventType.DestroyedEntityEvent)
|
||||||
|
.withTargetEntity(id)
|
||||||
|
.withTargetField(state.entities.findEntity(id).getPosition())
|
||||||
|
.buildEntityEvent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -942,6 +1019,7 @@ class GameLogic {
|
|||||||
.withTargetField(thanos.getPosition())
|
.withTargetField(thanos.getPosition())
|
||||||
.withAmount(thanos.mp.getValue() - thanos.mp.getMax())
|
.withAmount(thanos.mp.getValue() - thanos.mp.getMax())
|
||||||
.buildGameEvent());
|
.buildGameEvent());
|
||||||
|
thanos.mp.setValue(thanos.mp.getMax());
|
||||||
}
|
}
|
||||||
result.add(new EventBuilder(EventType.TurnEvent)
|
result.add(new EventBuilder(EventType.TurnEvent)
|
||||||
.withTurnCount(state.turnOrder.size())
|
.withTurnCount(state.turnOrder.size())
|
||||||
|
Loading…
Reference in New Issue
Block a user