wip: start implementing GameLogic.checkRequest

This commit is contained in:
2021-05-02 00:03:03 +02:00
parent 889e4cf233
commit b5a66dcdc6
8 changed files with 207 additions and 1 deletions

View File

@ -1,7 +1,11 @@
package uulm.teamname.marvelous.gamelibrary.gamelogic;
import uulm.teamname.marvelous.gamelibrary.IntVector2;
import uulm.teamname.marvelous.gamelibrary.entities.Entity;
import uulm.teamname.marvelous.gamelibrary.entities.EntityID;
import uulm.teamname.marvelous.gamelibrary.entities.EntityType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
@ -53,6 +57,35 @@ public class EntityManager {
return entities.remove(entity);
}
/**
* Finds an entity with an {@link EntityID}.
* @param id The id to search for
* @return The found {@link Entity} or null if none found
*/
public Entity findEntity(EntityID id) {
for(Entity entity: entities) {
if(entity.id == id) {
return entity;
}
}
return null;
}
/**
* Finds all entities with a position.
* @param pos The position to check on
* @return The found {@link Entity}s matching the position
*/
public ArrayList<Entity> findByPosition(IntVector2 pos) {
ArrayList<Entity> found = new ArrayList<>();
for(Entity entity: entities) {
if(entity.getPosition() == pos) {
found.add(entity);
}
}
return found;
}
/**
* Iterates over all entities inside the list.
* @return An iterator over every {@link Entity}

View File

@ -1,6 +1,8 @@
package uulm.teamname.marvelous.gamelibrary.gamelogic;
import uulm.teamname.marvelous.gamelibrary.Tuple;
import uulm.teamname.marvelous.gamelibrary.entities.Entity;
import uulm.teamname.marvelous.gamelibrary.entities.Character;
import uulm.teamname.marvelous.gamelibrary.events.*;
import uulm.teamname.marvelous.gamelibrary.requests.CharacterRequest;
import uulm.teamname.marvelous.gamelibrary.requests.Request;
@ -84,7 +86,145 @@ class GameLogic {
* @return Whether or not the request is valid
*/
public static boolean checkRequest(GameState state, Request request) {
//TODO: implement GameLogic.checkRequest
//TODO: refactor this using errors
try {
switch(request.type) {
case MeleeAttackRequest, RangedAttackRequest -> {
CharacterRequest data = (CharacterRequest)request;
Entity originEntity = state.entities.findEntity(data.originEntity);
if(originEntity == null || originEntity.getPosition() != data.originField || !(originEntity instanceof Character)) {
return false;
}
Character origin = (Character)originEntity;
Entity targetEntity = state.entities.findEntity(data.targetEntity);
if(targetEntity == null || targetEntity.getPosition() != data.targetField || !(targetEntity instanceof Character)) {
return false;
}
Character target = (Character)targetEntity;
if(origin.hp.getValue() <= 0 || !origin.isActive()) {
return false;
}
if(origin.ap.getValue() < 1) {
return false;
}
if(request.type == RequestType.MeleeAttackRequest && origin.meleeDamage != data.value) {
return false;
}else if(request.type == RequestType.RangedAttackRequest && origin.rangedDamage != data.value) {
return false;
}
if(target.hp.getValue() <= 0 || !target.isActive()) {
return false;
}
if(request.type == RequestType.RangedAttackRequest && origin.getPosition().distance(target.getPosition()) > origin.attackRange) {
return false;
}
//TODO: check line of sight in GameLogic.checkRequest
return true;
}
case MoveRequest -> {
CharacterRequest data = (CharacterRequest)request;
Entity originEntity = state.entities.findEntity(data.originEntity);
if(originEntity == null || originEntity.getPosition() != data.originField || !(originEntity instanceof Character)) {
return false;
}
Character origin = (Character)originEntity;
if(data.targetField.getX() < 0 || data.targetField.getX() >= state.mapSize.getX() || data.targetField.getY() < 0 || data.targetField.getY() >= state.mapSize.getY()) {
return false;
}
for(Entity entity: state.entities.findByPosition(data.targetField)) {
if(entity.blocksMovement()) {
return false;
}
}
if(origin.hp.getValue() <= 0 || !origin.isActive()) {
return false;
}
if(origin.mp.getValue() < 1) {
return false;
}
return true;
}
case ExchangeInfinityStoneRequest -> {
CharacterRequest data = (CharacterRequest)request;
Entity originEntity = state.entities.findEntity(data.originEntity);
if(originEntity == null || originEntity.getPosition() != data.originField || !(originEntity instanceof Character)) {
return false;
}
Character origin = (Character)originEntity;
Entity targetEntity = state.entities.findEntity(data.targetEntity);
if(targetEntity == null || targetEntity.getPosition() != data.targetField || !(targetEntity instanceof Character)) {
return false;
}
Character target = (Character)targetEntity;
if(origin.hp.getValue() <= 0 || !origin.isActive()) {
return false;
}
if(origin.ap.getValue() < 1) {
return false;
}
if(target.hp.getValue() <= 0 || !target.isActive()) {
return false;
}
if(!origin.inventory.hasStone(data.stoneType)) {
return false;
}
return true;
}
case UseInfinityStoneRequest -> {
CharacterRequest data = (CharacterRequest)request;
Entity originEntity = state.entities.findEntity(data.originEntity);
if(originEntity == null || originEntity.getPosition() != data.originField || !(originEntity instanceof Character)) {
return false;
}
Character origin = (Character)originEntity;
Entity targetEntity = state.entities.findEntity(data.targetEntity);
if(targetEntity == null || targetEntity.getPosition() != data.targetField || !(targetEntity instanceof Character)) {
return false;
}
Character target = (Character)targetEntity;
if(origin.hp.getValue() <= 0 || !origin.isActive()) {
return false;
}
if(origin.ap.getValue() < 1) {
return false;
}
if(!target.isActive()) {
return false;
}
if(!origin.inventory.hasStone(data.stoneType)) {
return false;
}
return true;
}
case DisconnectRequest -> {
//TODO: add check for DisconnectRequest in GameLogic.checkRequest
return true;
}
}
}catch(Exception e) {
return false;
}
return false;
}