Remove rules and create movement rules
This commit is contained in:
@@ -3,7 +3,7 @@ package com.bartlomiejpluta.base.api.map.layer.object;
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.map.layer.base.Layer;
|
||||
import com.bartlomiejpluta.base.api.move.Movement;
|
||||
import com.bartlomiejpluta.base.api.rule.Rule;
|
||||
import com.bartlomiejpluta.base.api.rule.MovementRule;
|
||||
import org.joml.Vector2ic;
|
||||
|
||||
import java.util.List;
|
||||
@@ -17,9 +17,9 @@ public interface ObjectLayer extends Layer {
|
||||
|
||||
List<Entity> getEntities();
|
||||
|
||||
void registerRule(Rule rule);
|
||||
void registerMovementRule(MovementRule rule);
|
||||
|
||||
void unregisterRule(Rule rule);
|
||||
void unregisterMovementRule(MovementRule rule);
|
||||
|
||||
void unregisterRules();
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@ package com.bartlomiejpluta.base.api.move;
|
||||
import org.joml.Vector2ic;
|
||||
|
||||
public interface Movement {
|
||||
Movable getObject();
|
||||
|
||||
boolean perform();
|
||||
|
||||
Movement another();
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.bartlomiejpluta.base.api.rule;
|
||||
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.move.Movement;
|
||||
import org.joml.Vector2ic;
|
||||
|
||||
public interface MovementRule {
|
||||
Vector2ic from();
|
||||
|
||||
Vector2ic to();
|
||||
|
||||
void invoke(Movement movement);
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
package com.bartlomiejpluta.base.api.rule;
|
||||
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
|
||||
public interface Rule {
|
||||
boolean when(Entity entity);
|
||||
|
||||
void then(Entity entity);
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
package com.bartlomiejpluta.base.lib.rule;
|
||||
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.rule.Rule;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public abstract class BaseRule implements Rule {
|
||||
private final Set<Entity> invoked = new HashSet<>();
|
||||
|
||||
protected abstract boolean test(Entity entity);
|
||||
|
||||
protected abstract void invoke(Entity entity);
|
||||
|
||||
@Override
|
||||
public boolean when(Entity entity) {
|
||||
if (test(entity)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
invoked.remove(entity);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void then(Entity entity) {
|
||||
if (!invoked.contains(entity)) {
|
||||
invoke(entity);
|
||||
invoked.add(entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
|
||||
import com.bartlomiejpluta.base.api.map.layer.object.PassageAbility;
|
||||
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
||||
import com.bartlomiejpluta.base.api.move.Movement;
|
||||
import com.bartlomiejpluta.base.api.rule.Rule;
|
||||
import com.bartlomiejpluta.base.api.rule.MovementRule;
|
||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
|
||||
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
||||
@@ -33,12 +33,12 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
|
||||
|
||||
private final Queue<Movement> movements = new LinkedList<>();
|
||||
|
||||
private final List<Rule> rules = new ArrayList<>();
|
||||
private final List<MovementRule> movementRules = new ArrayList<>();
|
||||
|
||||
private final List<Entity> entitiesToAdd = new LinkedList<>();
|
||||
private final List<Rule> rulesToAdd = new LinkedList<>();
|
||||
private final List<MovementRule> movementRulesToAdd = new LinkedList<>();
|
||||
private final List<Entity> entitiesToRemove = new LinkedList<>();
|
||||
private final List<Rule> rulesToRemove = new LinkedList<>();
|
||||
private final List<MovementRule> movementRulesToRemove = new LinkedList<>();
|
||||
|
||||
private final int rows;
|
||||
private final int columns;
|
||||
@@ -52,18 +52,18 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerRule(Rule rule) {
|
||||
rulesToAdd.add(rule);
|
||||
public void registerMovementRule(MovementRule rule) {
|
||||
movementRulesToAdd.add(rule);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregisterRule(Rule rule) {
|
||||
rulesToRemove.add(rule);
|
||||
public void unregisterMovementRule(MovementRule rule) {
|
||||
movementRulesToRemove.add(rule);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregisterRules() {
|
||||
rulesToRemove.addAll(rules);
|
||||
movementRulesToRemove.addAll(movementRules);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -128,18 +128,20 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
|
||||
|
||||
while (!movements.isEmpty()) {
|
||||
var movement = movements.poll();
|
||||
if (isTileReachable(movement.getTo())) {
|
||||
var from = movement.getFrom();
|
||||
var to = movement.getTo();
|
||||
if (isTileReachable(to)) {
|
||||
movement.perform();
|
||||
|
||||
for(var rule : movementRules) {
|
||||
if(((from.equals(rule.from())) || (to.equals(rule.to())))) {
|
||||
rule.invoke(movement);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (var entity : entities) {
|
||||
for (var rule : rules) {
|
||||
if (rule.when(entity)) {
|
||||
rule.then(entity);
|
||||
}
|
||||
}
|
||||
|
||||
entity.update(dt);
|
||||
|
||||
if (entity instanceof NPC) {
|
||||
@@ -159,9 +161,9 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
|
||||
}
|
||||
|
||||
// Insert rules requested to be added
|
||||
if(!rulesToAdd.isEmpty()) {
|
||||
rules.addAll(rulesToAdd);
|
||||
rulesToAdd.clear();
|
||||
if(!movementRulesToAdd.isEmpty()) {
|
||||
movementRules.addAll(movementRulesToAdd);
|
||||
movementRulesToAdd.clear();
|
||||
}
|
||||
|
||||
// Remove entities requested to be removed
|
||||
@@ -175,9 +177,9 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
|
||||
}
|
||||
|
||||
// Remove rules requested to be unregistered
|
||||
if (!rulesToRemove.isEmpty()) {
|
||||
rules.removeAll(rulesToRemove);
|
||||
rulesToRemove.clear();
|
||||
if (!movementRulesToRemove.isEmpty()) {
|
||||
movementRules.removeAll(movementRulesToRemove);
|
||||
movementRulesToRemove.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user