wip: start implementing GameLogic.checkRequest
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user