feat: make rocks attackable
This commit is contained in:
parent
cff18b088e
commit
adb0a49711
@ -27,7 +27,7 @@ public class GameLogic {
|
|||||||
* Checks a {@link Request} for validity for a {@link GameState}.
|
* Checks a {@link Request} for validity for a {@link GameState}.
|
||||||
* @param state The game state to check on
|
* @param state The game state to check on
|
||||||
* @param request The request to validate
|
* @param request The request to validate
|
||||||
* @return Whether or not the request is valid
|
* @return Whether the request is valid
|
||||||
*/
|
*/
|
||||||
protected static boolean checkRequest(GameState state, Request request) {
|
protected static boolean checkRequest(GameState state, Request request) {
|
||||||
try {
|
try {
|
||||||
@ -36,15 +36,20 @@ public class GameLogic {
|
|||||||
CharacterRequest data = (CharacterRequest)request;
|
CharacterRequest data = (CharacterRequest)request;
|
||||||
|
|
||||||
Character origin = getCharacter(state, data.originField, data.originEntity);
|
Character origin = getCharacter(state, data.originField, data.originEntity);
|
||||||
Character target = getCharacter(state, data.targetField, data.targetEntity);
|
Entity target = getAttackable(state, data.targetField, data.targetEntity);
|
||||||
|
|
||||||
requireTurn(state, origin);
|
requireTurn(state, origin);
|
||||||
requireOppositeTeam(origin, target);
|
|
||||||
|
|
||||||
requireAlive(origin);
|
requireAlive(origin);
|
||||||
requireAlive(target);
|
|
||||||
requireAP(origin, 1);
|
requireAP(origin, 1);
|
||||||
|
|
||||||
|
if(target instanceof Character) {
|
||||||
|
Character targetCharacter = (Character)target;
|
||||||
|
|
||||||
|
requireOppositeTeam(origin, targetCharacter);
|
||||||
|
requireAlive(targetCharacter);
|
||||||
|
}
|
||||||
|
|
||||||
if(request.type == RequestType.MeleeAttackRequest) {
|
if(request.type == RequestType.MeleeAttackRequest) {
|
||||||
if(origin.meleeDamage != data.value) {
|
if(origin.meleeDamage != data.value) {
|
||||||
throw new InvalidRequestException("Invalid melee damage");
|
throw new InvalidRequestException("Invalid melee damage");
|
||||||
@ -183,6 +188,22 @@ public class GameLogic {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves an attack-able Entity ({@link Character} or {@link Rock}) for a {@link Request}.
|
||||||
|
* @param state The game state to use
|
||||||
|
* @param position The requested position
|
||||||
|
* @param entityID The requested {@link EntityID}
|
||||||
|
* @return The found entity
|
||||||
|
* @throws InvalidRequestException if the entity is invalid or not found
|
||||||
|
*/
|
||||||
|
private static Entity getAttackable(GameState state, IntVector2 position, EntityID entityID) throws InvalidRequestException {
|
||||||
|
Entity entity = state.entities.findEntity(entityID);
|
||||||
|
if(entity == null || !entity.getPosition().equals(position) || (!(entity instanceof Character) && !(entity instanceof Rock)) || entity.id.type == EntityType.NPC) {
|
||||||
|
throw new InvalidRequestException("Invalid target character or rock");
|
||||||
|
}
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves a {@link Character} for a {@link Request}.
|
* Retrieves a {@link Character} for a {@link Request}.
|
||||||
* @param state The game state to use
|
* @param state The game state to use
|
||||||
@ -315,23 +336,34 @@ public class GameLogic {
|
|||||||
.withAmount(data.value)
|
.withAmount(data.value)
|
||||||
.buildEntityEvent());
|
.buildEntityEvent());
|
||||||
|
|
||||||
Character target = (Character)state.entities.findEntity(data.targetEntity);
|
Entity targetEntity = state.entities.findEntity(data.targetEntity);
|
||||||
if(target.hp.getValue() <= data.value) {
|
if(targetEntity instanceof Character) {
|
||||||
|
Character target = (Character)targetEntity;
|
||||||
|
if(target.hp.getValue() <= data.value) {
|
||||||
|
|
||||||
List<StoneType> stones = Arrays.asList(target.inventory.getStonesAsArray());
|
List<StoneType> stones = Arrays.asList(target.inventory.getStonesAsArray());
|
||||||
Collections.shuffle(stones); // required by documents
|
Collections.shuffle(stones); // required by documents
|
||||||
|
|
||||||
ArrayList<IntVector2> used = new ArrayList<>();
|
ArrayList<IntVector2> used = new ArrayList<>();
|
||||||
for(StoneType stone: stones) {
|
for(StoneType stone: stones) {
|
||||||
ArrayList<IntVector2> options = getFreeNeighbour(state, target.getPosition(), used);
|
ArrayList<IntVector2> options = getFreeNeighbour(state, target.getPosition(), used);
|
||||||
IntVector2 picked = options.get(rand.nextInt(options.size()));
|
IntVector2 picked = options.get(rand.nextInt(options.size()));
|
||||||
used.add(picked);
|
used.add(picked);
|
||||||
result.add(new EventBuilder(EventType.SpawnEntityEvent)
|
result.add(new EventBuilder(EventType.SpawnEntityEvent)
|
||||||
.withEntity(new InfinityStone(
|
.withEntity(new InfinityStone(
|
||||||
new EntityID(EntityType.InfinityStones, stone.getID()),
|
new EntityID(EntityType.InfinityStones, stone.getID()),
|
||||||
picked,
|
picked,
|
||||||
stone
|
stone
|
||||||
))
|
))
|
||||||
|
.buildEntityEvent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else if(targetEntity instanceof Rock) {
|
||||||
|
Rock target = (Rock)targetEntity;
|
||||||
|
if(target.getHp() <= data.value) {
|
||||||
|
result.add(new EventBuilder(EventType.DestroyedEntityEvent)
|
||||||
|
.withTargetField(data.targetField)
|
||||||
|
.withTargetEntity(target.id)
|
||||||
.buildEntityEvent());
|
.buildEntityEvent());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -526,19 +558,26 @@ public class GameLogic {
|
|||||||
case TakenDamageEvent -> {
|
case TakenDamageEvent -> {
|
||||||
EntityEvent data = (EntityEvent)event;
|
EntityEvent data = (EntityEvent)event;
|
||||||
|
|
||||||
Character target = (Character)state.entities.findEntity(data.targetEntity);
|
Entity targetEntity = state.entities.findEntity(data.targetEntity);
|
||||||
target.hp.decreaseValue(data.amount);
|
|
||||||
|
|
||||||
EntityType opposing = target.id.type == EntityType.P1 ? EntityType.P2 : EntityType.P1;
|
if(targetEntity instanceof Character) {
|
||||||
state.winConditions.increaseValue(opposing, WinCondition.TotalDamage, data.amount);
|
Character target = (Character)targetEntity;
|
||||||
if(!target.isAlive()) {
|
target.hp.decreaseValue(data.amount);
|
||||||
target.inventory.clear();
|
|
||||||
state.winConditions.increaseValue(opposing, WinCondition.TotalKnockouts, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(state.activeCharacter != null && state.activeCharacter.type == EntityType.NPC && state.activeCharacter.id == NPCType.Thanos.getID()) {
|
EntityType opposing = target.id.type == EntityType.P1 ? EntityType.P2 : EntityType.P1;
|
||||||
NPC thanos = (NPC)state.entities.findEntity(state.activeCharacter);
|
state.winConditions.increaseValue(opposing, WinCondition.TotalDamage, data.amount);
|
||||||
target.inventory.transfer(thanos.inventory);
|
if(!target.isAlive()) {
|
||||||
|
target.inventory.clear();
|
||||||
|
state.winConditions.increaseValue(opposing, WinCondition.TotalKnockouts, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(state.activeCharacter != null && state.activeCharacter.type == EntityType.NPC && state.activeCharacter.id == NPCType.Thanos.getID()) {
|
||||||
|
NPC thanos = (NPC)state.entities.findEntity(state.activeCharacter);
|
||||||
|
target.inventory.transfer(thanos.inventory);
|
||||||
|
}
|
||||||
|
}else if(targetEntity instanceof Rock) {
|
||||||
|
Rock target = (Rock)targetEntity;
|
||||||
|
target.decreaseHp(data.amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case ConsumedAPEvent -> {
|
case ConsumedAPEvent -> {
|
||||||
|
Loading…
Reference in New Issue
Block a user