Trigger evaluation moved from Zork class
This commit is contained in:
parent
d0d2db70a4
commit
69072097bb
34 changed files with 228 additions and 201 deletions
|
@ -7,13 +7,11 @@ package com.github.dtschust.zork;
|
||||||
|
|
||||||
import com.github.dtschust.zork.parser.ParserIOC;
|
import com.github.dtschust.zork.parser.ParserIOC;
|
||||||
import com.github.dtschust.zork.repl.ActionDispatcher;
|
import com.github.dtschust.zork.repl.ActionDispatcher;
|
||||||
import com.github.dtschust.zork.types.ZorkContainer;
|
import com.github.dtschust.zork.objects.ZorkContainer;
|
||||||
import com.github.dtschust.zork.types.ZorkObject;
|
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.*;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.*;
|
||||||
|
|
||||||
/* And away we go*/
|
/* And away we go*/
|
||||||
public class Zork {
|
public class Zork {
|
||||||
|
@ -34,12 +32,12 @@ public class Zork {
|
||||||
String userInput = source.nextLine();
|
String userInput = source.nextLine();
|
||||||
|
|
||||||
/*Now that we have the user command, check the input*/
|
/*Now that we have the user command, check the input*/
|
||||||
if (!executeTriggers(userInput)) {
|
if (!game.evaluateTriggers(userInput)) {
|
||||||
/* If we haven't skipped, perform the user action*/
|
/* If we haven't skipped, perform the user action*/
|
||||||
d.dispatch(userInput);
|
d.dispatch(userInput);
|
||||||
|
|
||||||
/* Clear the user input, and check the triggers again (various states have changed, gnomes need to be found!*/
|
/* Clear the user input, and check the triggers again (various states have changed, gnomes need to be found!*/
|
||||||
executeTriggers("");
|
game.evaluateTriggers("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,95 +53,4 @@ public class Zork {
|
||||||
}
|
}
|
||||||
new Zork(args[0]);
|
new Zork(args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check triggers */
|
|
||||||
public boolean executeTriggers(String input) {
|
|
||||||
|
|
||||||
/*Variable initialization*/
|
|
||||||
boolean skip;
|
|
||||||
|
|
||||||
/*Check Room triggers*/
|
|
||||||
skip = doTriggersRoom(input);
|
|
||||||
/* Check items in the containers in the room */
|
|
||||||
skip = skip || doTriggersItemsInContainersInRoom(input);
|
|
||||||
/* Check all containers in the room*/
|
|
||||||
skip = skip || doTriggersContainersInRoom(input);
|
|
||||||
/* Check all creatures in the room */
|
|
||||||
skip = skip || doTriggersCreaturesInRoom(input);
|
|
||||||
/* Check items in inventory */
|
|
||||||
skip = skip || doTriggersItemsInInventory(input);
|
|
||||||
/* Check items in room */
|
|
||||||
skip = skip || doTriggersItemsInRoom(input);
|
|
||||||
|
|
||||||
return skip;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean doTriggersContainersInRoom(String input) {
|
|
||||||
boolean skip = false;
|
|
||||||
for (String key : game.getCurrentRoom().getContainer()) {
|
|
||||||
skip = skip || doZorkTriggers(game.get(CONTAINER, key), input);
|
|
||||||
}
|
|
||||||
return skip;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean doTriggersItemsInContainersInRoom(String input) {
|
|
||||||
boolean skip = false;
|
|
||||||
for (String key : game.getCurrentRoom().getContainer()) {
|
|
||||||
ZorkContainer tempContainer = (ZorkContainer) game.get(CONTAINER, key);
|
|
||||||
for (String key2 : tempContainer.items()) {
|
|
||||||
skip = skip || doZorkTriggers(game.get(ITEM, key2), input);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return skip;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean doTriggersItemsInRoom(String input) {
|
|
||||||
boolean skip = false;
|
|
||||||
for (String key : game.getCurrentRoom().getItem()) {
|
|
||||||
skip = skip || doZorkTriggers(game.get(ITEM, key), input);
|
|
||||||
}
|
|
||||||
return skip;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean doTriggersItemsInInventory(String input) {
|
|
||||||
boolean skip = false;
|
|
||||||
for (String key : game.inventory) {
|
|
||||||
skip = skip || doZorkTriggers(game.get(ITEM, key), input);
|
|
||||||
}
|
|
||||||
return skip;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean doTriggersCreaturesInRoom(String input) {
|
|
||||||
boolean skip = false;
|
|
||||||
for (String key : game.getCurrentRoom().getCreature()) {
|
|
||||||
skip = skip || doZorkTriggers(game.get(CREATURE, key), input);
|
|
||||||
}
|
|
||||||
return skip;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean doTriggersRoom(String input) {
|
|
||||||
return doZorkTriggers(game.getCurrentRoom(), input);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean doZorkTriggers(ZorkObject zorkObject, String input) {
|
|
||||||
boolean skip = false;
|
|
||||||
Iterator<ZorkTrigger> iterator = zorkObject.getTrigger().iterator();
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
ZorkTrigger tempTrigger = iterator.next();
|
|
||||||
if (tempTrigger.evaluate(game, input)) {
|
|
||||||
for (String print : tempTrigger.print) {
|
|
||||||
System.out.println(print);
|
|
||||||
}
|
|
||||||
final ActionDispatcher d = new ActionDispatcher(game);
|
|
||||||
for (String action : tempTrigger.action) {
|
|
||||||
d.dispatch(action);
|
|
||||||
}
|
|
||||||
skip = skip || tempTrigger.hasCommand();
|
|
||||||
if (tempTrigger.type.equals("single")) {
|
|
||||||
iterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return skip;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package com.github.dtschust.zork;
|
package com.github.dtschust.zork;
|
||||||
|
|
||||||
import com.github.dtschust.zork.types.ZorkContainer;
|
import com.github.dtschust.zork.objects.ZorkContainer;
|
||||||
import com.github.dtschust.zork.types.ZorkRoom;
|
import com.github.dtschust.zork.objects.ZorkRoom;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.CONTAINER;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.CONTAINER;
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.ROOM;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.ROOM;
|
||||||
|
|
||||||
|
|
||||||
/* Has conditions*/
|
/* Has conditions*/
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package com.github.dtschust.zork;
|
package com.github.dtschust.zork;
|
||||||
|
|
||||||
import com.github.dtschust.zork.types.ZorkObject;
|
import com.github.dtschust.zork.objects.ZorkObject;
|
||||||
|
|
||||||
/* Status conditions*/
|
/* Status conditions*/
|
||||||
public class ZorkConditionStatus extends ZorkCondition {
|
public class ZorkConditionStatus extends ZorkCondition {
|
||||||
|
|
|
@ -1,19 +1,23 @@
|
||||||
package com.github.dtschust.zork;
|
package com.github.dtschust.zork;
|
||||||
|
|
||||||
import com.github.dtschust.zork.types.*;
|
import com.github.dtschust.zork.objects.*;
|
||||||
|
import com.github.dtschust.zork.types.Triggerable;
|
||||||
|
import com.github.dtschust.zork.types.ZorkMap;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class ZorkGame {
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.ITEM;
|
||||||
|
|
||||||
|
public class ZorkGame implements Triggerable {
|
||||||
|
|
||||||
public final Set<String> inventory = new HashSet<>();
|
public final Set<String> inventory = new HashSet<>();
|
||||||
private final ZorkMap<ZorkRoom> rooms = new ZorkMap<>();
|
private final ZorkMap<ZorkRoom> rooms = new ZorkMap<>();
|
||||||
private final ZorkMap<ZorkItem> items = new ZorkMap<>();
|
private final ZorkMap<ZorkItem> items = new ZorkMap<>();
|
||||||
private final ZorkMap<ZorkContainer> containers = new ZorkMap<>();
|
private final ZorkMap<ZorkContainer> containers = new ZorkMap<>();
|
||||||
private final ZorkMap<ZorkCreature> creatures = new ZorkMap<>();
|
private final ZorkMap<ZorkCreature> creatures = new ZorkMap<>();
|
||||||
private final HashMap<String, ZorkGameStatusType> objectLookup = new HashMap<>();
|
private final HashMap<String, ZorkObjectTypes> objectLookup = new HashMap<>();
|
||||||
private boolean running = false;
|
private boolean running = false;
|
||||||
private String currentRoom;
|
private String currentRoom;
|
||||||
|
|
||||||
|
@ -38,11 +42,11 @@ public class ZorkGame {
|
||||||
running = false;
|
running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZorkGameStatusType getTypeFromLookup(String object) {
|
public ZorkObjectTypes getTypeFromLookup(String object) {
|
||||||
return objectLookup.get(object);
|
return objectLookup.get(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addObjectThroughLookup(ZorkGameStatusType type, ZorkObject object) {
|
public void addObjectThroughLookup(ZorkObjectTypes type, ZorkObject object) {
|
||||||
putInMapGivenType(type, object);
|
putInMapGivenType(type, object);
|
||||||
objectLookup.put(object.getName(), type);
|
objectLookup.put(object.getName(), type);
|
||||||
}
|
}
|
||||||
|
@ -51,20 +55,20 @@ public class ZorkGame {
|
||||||
return values(cast, objectLookup.get(name));
|
return values(cast, objectLookup.get(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends ZorkObject> ZorkMap<T> values(Class<T> cast, ZorkGameStatusType type) {
|
public <T extends ZorkObject> ZorkMap<T> values(Class<T> cast, ZorkObjectTypes type) {
|
||||||
return (ZorkMap<T>) getMapFromType(type);
|
return (ZorkMap<T>) getMapFromType(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZorkObject get(ZorkGameStatusType type, String key) {
|
public ZorkObject get(ZorkObjectTypes type, String key) {
|
||||||
return getMapFromType(type).get(key);
|
return getMapFromType(type).get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void put(ZorkGameStatusType type, ZorkObject object) {
|
public void put(ZorkObjectTypes type, ZorkObject object) {
|
||||||
putInMapGivenType(type, object);
|
putInMapGivenType(type, object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private ZorkMap<? extends ZorkObject> getMapFromType(ZorkGameStatusType type) {
|
private ZorkMap<? extends ZorkObject> getMapFromType(ZorkObjectTypes type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ROOM:
|
case ROOM:
|
||||||
return rooms;
|
return rooms;
|
||||||
|
@ -79,7 +83,7 @@ public class ZorkGame {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void putInMapGivenType(ZorkGameStatusType type, ZorkObject object) {
|
private void putInMapGivenType(ZorkObjectTypes type, ZorkObject object) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ROOM:
|
case ROOM:
|
||||||
rooms.put((ZorkRoom) object);
|
rooms.put((ZorkRoom) object);
|
||||||
|
@ -97,4 +101,16 @@ public class ZorkGame {
|
||||||
throw new IllegalStateException("Unexpected value: " + type);
|
throw new IllegalStateException("Unexpected value: " + type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean evaluateTriggers(final ZorkGame game, final String currentCommand) {
|
||||||
|
final boolean currentRoom = getCurrentRoom().evaluateTriggers(game, currentCommand);
|
||||||
|
final boolean itemsInInventory = Triggerable.evaluateTriggerCollection(inventory, ITEM, game, currentCommand);
|
||||||
|
|
||||||
|
return currentRoom || itemsInInventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean evaluateTriggers(final String currentCommand) {
|
||||||
|
return evaluateTriggers(this, currentCommand);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,17 +1,21 @@
|
||||||
package com.github.dtschust.zork;
|
package com.github.dtschust.zork;
|
||||||
|
|
||||||
|
import com.github.dtschust.zork.types.HasPrintsAndActions;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/*Trigger*/
|
public class ZorkTrigger implements HasPrintsAndActions {
|
||||||
public class ZorkTrigger {
|
|
||||||
public final List<String> print;
|
private final List<String> print;
|
||||||
public final List<String> action;
|
private final List<String> action;
|
||||||
|
|
||||||
/* By default, "single" */
|
/* By default, "single" */
|
||||||
public final String type;
|
private final ZorkTriggerType type;
|
||||||
private final List<ZorkCondition> conditions;
|
private final List<ZorkCondition> conditions;
|
||||||
private final List<ZorkCommand> commands;
|
private final List<ZorkCommand> commands;
|
||||||
|
|
||||||
public ZorkTrigger(final String type,
|
public ZorkTrigger(final ZorkTriggerType type,
|
||||||
final List<ZorkCondition> conditions,
|
final List<ZorkCondition> conditions,
|
||||||
final List<ZorkCommand> commands,
|
final List<ZorkCommand> commands,
|
||||||
final List<String> print,
|
final List<String> print,
|
||||||
|
@ -27,10 +31,22 @@ public class ZorkTrigger {
|
||||||
return !this.commands.isEmpty();
|
return !this.commands.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean evaluate(ZorkGame game, String input) {
|
public boolean isTriggered(final ZorkGame game, final String currentCommand) {
|
||||||
if (!commands.stream().allMatch(c -> c.matchesInput(input))) {
|
return commands.stream().allMatch(c -> c.matchesInput(currentCommand)) &&
|
||||||
return false;
|
conditions.stream().allMatch(c -> c.evaluate(game));
|
||||||
}
|
}
|
||||||
return conditions.stream().allMatch(c -> c.evaluate(game));
|
|
||||||
|
@Override
|
||||||
|
public List<String> getPrints() {
|
||||||
|
return Collections.unmodifiableList(print);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getActions() {
|
||||||
|
return Collections.unmodifiableList(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ZorkTriggerType getType() {
|
||||||
|
return type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
19
src/main/java/com/github/dtschust/zork/ZorkTriggerType.java
Normal file
19
src/main/java/com/github/dtschust/zork/ZorkTriggerType.java
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
package com.github.dtschust.zork;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public enum ZorkTriggerType {
|
||||||
|
SINGLE("single"),
|
||||||
|
PERMANENT("permanent");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
ZorkTriggerType(final String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<ZorkTriggerType> fromName(final String name) {
|
||||||
|
return EnumSet.allOf(ZorkTriggerType.class).stream().filter(e -> e.name.equals(name)).findAny();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,13 @@
|
||||||
package com.github.dtschust.zork.types;
|
package com.github.dtschust.zork.objects;
|
||||||
|
|
||||||
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.ZorkTrigger;
|
import com.github.dtschust.zork.ZorkTrigger;
|
||||||
|
import com.github.dtschust.zork.types.HasSetOfCollectable;
|
||||||
|
import com.github.dtschust.zork.types.Triggerable;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.ITEM;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.ITEM;
|
||||||
|
|
||||||
/* Container*/
|
/* Container*/
|
||||||
public class ZorkContainer extends ZorkObject implements HasSetOfCollectable {
|
public class ZorkContainer extends ZorkObject implements HasSetOfCollectable {
|
||||||
|
@ -58,7 +61,7 @@ public class ZorkContainer extends ZorkObject implements HasSetOfCollectable {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<String> getSetFromType(ZorkGameStatusType type) {
|
public Set<String> getSetFromType(ZorkObjectTypes type) {
|
||||||
if (type.equals(ITEM))
|
if (type.equals(ITEM))
|
||||||
return items;
|
return items;
|
||||||
throw new IllegalStateException("Unexpected value: " + type);
|
throw new IllegalStateException("Unexpected value: " + type);
|
||||||
|
@ -67,4 +70,10 @@ public class ZorkContainer extends ZorkObject implements HasSetOfCollectable {
|
||||||
public List<String> getAccepts() {
|
public List<String> getAccepts() {
|
||||||
return Collections.unmodifiableList(accepts);
|
return Collections.unmodifiableList(accepts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean evaluateTriggers(ZorkGame game, String input) {
|
||||||
|
final boolean itemsEvaluation = Triggerable.evaluateTriggerCollection(items, ITEM, game, input);
|
||||||
|
return super.evaluateTriggers(game, input) || itemsEvaluation;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,8 +1,9 @@
|
||||||
package com.github.dtschust.zork.types;
|
package com.github.dtschust.zork.objects;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkCondition;
|
import com.github.dtschust.zork.ZorkCondition;
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.ZorkTrigger;
|
import com.github.dtschust.zork.ZorkTrigger;
|
||||||
|
import com.github.dtschust.zork.types.HasPrintsAndActions;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.github.dtschust.zork.types;
|
package com.github.dtschust.zork.objects;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkTrigger;
|
import com.github.dtschust.zork.ZorkTrigger;
|
||||||
|
import com.github.dtschust.zork.types.HasPrintsAndActions;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
|
@ -1,14 +1,14 @@
|
||||||
package com.github.dtschust.zork.types;
|
package com.github.dtschust.zork.objects;
|
||||||
|
|
||||||
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.ZorkTrigger;
|
import com.github.dtschust.zork.ZorkTrigger;
|
||||||
|
import com.github.dtschust.zork.ZorkTriggerType;
|
||||||
|
import com.github.dtschust.zork.types.Triggerable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/* Generic object, everything inherits from this*/
|
/* Generic object, everything inherits from this*/
|
||||||
public abstract class ZorkObject {
|
public abstract class ZorkObject implements Triggerable {
|
||||||
private final String name;
|
private final String name;
|
||||||
private final String description;
|
private final String description;
|
||||||
private final List<ZorkTrigger> trigger;
|
private final List<ZorkTrigger> trigger;
|
||||||
|
@ -48,4 +48,20 @@ public abstract class ZorkObject {
|
||||||
public List<ZorkTrigger> getTrigger() {
|
public List<ZorkTrigger> getTrigger() {
|
||||||
return trigger;
|
return trigger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean evaluateTriggers(final ZorkGame game, final String input) {
|
||||||
|
boolean skip = false;
|
||||||
|
final Iterator<ZorkTrigger> iterator = trigger.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
final ZorkTrigger t = iterator.next();
|
||||||
|
if (t.isTriggered(game, input)) {
|
||||||
|
t.printAndExecuteActions(game);
|
||||||
|
skip = skip || t.hasCommand();
|
||||||
|
if (t.getType() == ZorkTriggerType.SINGLE) {
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return skip;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.github.dtschust.zork.objects;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public enum ZorkObjectTypes {
|
||||||
|
ROOM("room"),
|
||||||
|
ITEM("item"),
|
||||||
|
CONTAINER("container"),
|
||||||
|
CREATURE("creature");
|
||||||
|
|
||||||
|
private final String propertyName;
|
||||||
|
|
||||||
|
ZorkObjectTypes(final String propertyName) {
|
||||||
|
this.propertyName = propertyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<ZorkObjectTypes> fromPropertyName(final String propertyName) {
|
||||||
|
return EnumSet.allOf(ZorkObjectTypes.class).stream().filter(e -> e.propertyName.equals(propertyName)).findFirst();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,16 @@
|
||||||
package com.github.dtschust.zork.types;
|
package com.github.dtschust.zork.objects;
|
||||||
|
|
||||||
|
|
||||||
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.ZorkTrigger;
|
import com.github.dtschust.zork.ZorkTrigger;
|
||||||
|
import com.github.dtschust.zork.types.HasSetOfCollectable;
|
||||||
|
import com.github.dtschust.zork.types.Triggerable;
|
||||||
|
import com.github.dtschust.zork.types.ZorkDirection;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.*;
|
||||||
|
|
||||||
/* Room*/
|
/* Room*/
|
||||||
public class ZorkRoom extends ZorkObject implements HasSetOfCollectable {
|
public class ZorkRoom extends ZorkObject implements HasSetOfCollectable {
|
||||||
private final String type;
|
private final String type;
|
||||||
|
@ -31,7 +37,7 @@ public class ZorkRoom extends ZorkObject implements HasSetOfCollectable {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<String> getSetFromType(ZorkGameStatusType type) {
|
public Set<String> getSetFromType(ZorkObjectTypes type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case CONTAINER:
|
case CONTAINER:
|
||||||
return getContainer();
|
return getContainer();
|
||||||
|
@ -60,6 +66,14 @@ public class ZorkRoom extends ZorkObject implements HasSetOfCollectable {
|
||||||
return Optional.ofNullable(this.border.get(border));
|
return Optional.ofNullable(this.border.get(border));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean evaluateTriggers(ZorkGame game, String input) {
|
||||||
|
final boolean items = Triggerable.evaluateTriggerCollection(item, ITEM, game, input);
|
||||||
|
final boolean creatures = Triggerable.evaluateTriggerCollection(creature, CREATURE, game, input);
|
||||||
|
final boolean containers = Triggerable.evaluateTriggerCollection(container, CONTAINER, game, input);
|
||||||
|
return super.evaluateTriggers(game, input) || items || creatures || containers;
|
||||||
|
}
|
||||||
|
|
||||||
public Set<String> getContainer() {
|
public Set<String> getContainer() {
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
|
@ -2,10 +2,10 @@ package com.github.dtschust.zork.parser;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkCondition;
|
import com.github.dtschust.zork.ZorkCondition;
|
||||||
import com.github.dtschust.zork.parser.strategies.*;
|
import com.github.dtschust.zork.parser.strategies.*;
|
||||||
import com.github.dtschust.zork.types.ZorkContainer;
|
import com.github.dtschust.zork.objects.ZorkContainer;
|
||||||
import com.github.dtschust.zork.types.ZorkCreature;
|
import com.github.dtschust.zork.objects.ZorkCreature;
|
||||||
import com.github.dtschust.zork.types.ZorkItem;
|
import com.github.dtschust.zork.objects.ZorkItem;
|
||||||
import com.github.dtschust.zork.types.ZorkRoom;
|
import com.github.dtschust.zork.objects.ZorkRoom;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inversion of control for Zork parse strategies
|
* Inversion of control for Zork parse strategies
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
package com.github.dtschust.zork.parser;
|
package com.github.dtschust.zork.parser;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.types.*;
|
import com.github.dtschust.zork.objects.*;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.*;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.*;
|
||||||
|
|
||||||
public abstract class ZorkParser {
|
public abstract class ZorkParser {
|
||||||
private final Map<ZorkGameStatusType, PropertyParseStrategy<? extends ZorkObject>> strategies;
|
private final Map<ZorkObjectTypes, PropertyParseStrategy<? extends ZorkObject>> strategies;
|
||||||
|
|
||||||
public ZorkParser(final PropertyParseStrategy<ZorkCreature> creatureStrategy,
|
public ZorkParser(final PropertyParseStrategy<ZorkCreature> creatureStrategy,
|
||||||
final PropertyParseStrategy<ZorkContainer> containerStrategy,
|
final PropertyParseStrategy<ZorkContainer> containerStrategy,
|
||||||
|
@ -32,7 +32,7 @@ public abstract class ZorkParser {
|
||||||
// Every single first generation child is a room, container, creature, or item. So load them in
|
// Every single first generation child is a room, container, creature, or item. So load them in
|
||||||
for (final Property element : rootElement.subProperties()) {
|
for (final Property element : rootElement.subProperties()) {
|
||||||
final String name = element.name();
|
final String name = element.name();
|
||||||
final ZorkGameStatusType t = ZorkGameStatusType.fromPropertyName(name)
|
final ZorkObjectTypes t = ZorkObjectTypes.fromPropertyName(name)
|
||||||
.orElseThrow(() -> new IllegalStateException("Unexpected value: " + name));
|
.orElseThrow(() -> new IllegalStateException("Unexpected value: " + name));
|
||||||
final ZorkObject built = strategies.get(t).parse(element);
|
final ZorkObject built = strategies.get(t).parse(element);
|
||||||
data.addObjectThroughLookup(t, built);
|
data.addObjectThroughLookup(t, built);
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package com.github.dtschust.zork.parser;
|
package com.github.dtschust.zork.parser;
|
||||||
|
|
||||||
import com.github.dtschust.zork.parser.dom.DOMElement;
|
import com.github.dtschust.zork.parser.dom.DOMElement;
|
||||||
import com.github.dtschust.zork.types.ZorkContainer;
|
import com.github.dtschust.zork.objects.ZorkContainer;
|
||||||
import com.github.dtschust.zork.types.ZorkCreature;
|
import com.github.dtschust.zork.objects.ZorkCreature;
|
||||||
import com.github.dtschust.zork.types.ZorkItem;
|
import com.github.dtschust.zork.objects.ZorkItem;
|
||||||
import com.github.dtschust.zork.types.ZorkRoom;
|
import com.github.dtschust.zork.objects.ZorkRoom;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
|
@ -4,7 +4,7 @@ import com.github.dtschust.zork.ZorkTrigger;
|
||||||
import com.github.dtschust.zork.parser.Property;
|
import com.github.dtschust.zork.parser.Property;
|
||||||
import com.github.dtschust.zork.parser.PropertyParseStrategy;
|
import com.github.dtschust.zork.parser.PropertyParseStrategy;
|
||||||
import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy;
|
import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy;
|
||||||
import com.github.dtschust.zork.types.ZorkContainer;
|
import com.github.dtschust.zork.objects.ZorkContainer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
|
@ -5,7 +5,7 @@ import com.github.dtschust.zork.ZorkTrigger;
|
||||||
import com.github.dtschust.zork.parser.Property;
|
import com.github.dtschust.zork.parser.Property;
|
||||||
import com.github.dtschust.zork.parser.PropertyParseStrategy;
|
import com.github.dtschust.zork.parser.PropertyParseStrategy;
|
||||||
import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy;
|
import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy;
|
||||||
import com.github.dtschust.zork.types.ZorkCreature;
|
import com.github.dtschust.zork.objects.ZorkCreature;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
|
@ -4,7 +4,7 @@ import com.github.dtschust.zork.ZorkTrigger;
|
||||||
import com.github.dtschust.zork.parser.Property;
|
import com.github.dtschust.zork.parser.Property;
|
||||||
import com.github.dtschust.zork.parser.PropertyParseStrategy;
|
import com.github.dtschust.zork.parser.PropertyParseStrategy;
|
||||||
import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy;
|
import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy;
|
||||||
import com.github.dtschust.zork.types.ZorkItem;
|
import com.github.dtschust.zork.objects.ZorkItem;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
|
@ -5,7 +5,7 @@ import com.github.dtschust.zork.parser.Property;
|
||||||
import com.github.dtschust.zork.parser.PropertyParseStrategy;
|
import com.github.dtschust.zork.parser.PropertyParseStrategy;
|
||||||
import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy;
|
import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy;
|
||||||
import com.github.dtschust.zork.types.ZorkDirection;
|
import com.github.dtschust.zork.types.ZorkDirection;
|
||||||
import com.github.dtschust.zork.types.ZorkRoom;
|
import com.github.dtschust.zork.objects.ZorkRoom;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.github.dtschust.zork.parser.strategies;
|
||||||
import com.github.dtschust.zork.ZorkCommand;
|
import com.github.dtschust.zork.ZorkCommand;
|
||||||
import com.github.dtschust.zork.ZorkCondition;
|
import com.github.dtschust.zork.ZorkCondition;
|
||||||
import com.github.dtschust.zork.ZorkTrigger;
|
import com.github.dtschust.zork.ZorkTrigger;
|
||||||
|
import com.github.dtschust.zork.ZorkTriggerType;
|
||||||
import com.github.dtschust.zork.parser.Property;
|
import com.github.dtschust.zork.parser.Property;
|
||||||
import com.github.dtschust.zork.parser.PropertyParseStrategy;
|
import com.github.dtschust.zork.parser.PropertyParseStrategy;
|
||||||
import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy;
|
import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy;
|
||||||
|
@ -20,7 +21,9 @@ public class ZorkTriggerParseStrategy implements TriggerPropertyParseStrategy {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ZorkTrigger parseTrigger(final Property source, final Property parent) {
|
public ZorkTrigger parseTrigger(final Property source, final Property parent) {
|
||||||
final String type = parent.subPropertyValue("type", "single");
|
final String typeString = parent.subPropertyValue("type", "single");
|
||||||
|
final ZorkTriggerType type = ZorkTriggerType.fromName(typeString).orElseThrow(() ->
|
||||||
|
new IllegalArgumentException(typeString + " is not a valid trigger type"));
|
||||||
|
|
||||||
final List<ZorkCommand> commands = source.subPropertiesByName("command").stream()
|
final List<ZorkCommand> commands = source.subPropertiesByName("command").stream()
|
||||||
.map(Property::value)
|
.map(Property::value)
|
||||||
|
|
|
@ -3,8 +3,8 @@ package com.github.dtschust.zork.repl.actions;
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.repl.Action;
|
import com.github.dtschust.zork.repl.Action;
|
||||||
import com.github.dtschust.zork.types.HasSetOfCollectable;
|
import com.github.dtschust.zork.types.HasSetOfCollectable;
|
||||||
import com.github.dtschust.zork.types.ZorkGameStatusType;
|
import com.github.dtschust.zork.objects.ZorkObjectTypes;
|
||||||
import com.github.dtschust.zork.types.ZorkObject;
|
import com.github.dtschust.zork.objects.ZorkObject;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -29,8 +29,8 @@ public class AddAction implements Action {
|
||||||
final String destination = arguments.get(3);
|
final String destination = arguments.get(3);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ZorkGameStatusType destType = game.getTypeFromLookup(destination);
|
ZorkObjectTypes destType = game.getTypeFromLookup(destination);
|
||||||
ZorkGameStatusType objType = game.getTypeFromLookup(object);
|
ZorkObjectTypes objType = game.getTypeFromLookup(object);
|
||||||
ZorkObject tempObject = game.get(destType, destination);
|
ZorkObject tempObject = game.get(destType, destination);
|
||||||
((HasSetOfCollectable) tempObject).getSetFromType(objType).add(object);
|
((HasSetOfCollectable) tempObject).getSetFromType(objType).add(object);
|
||||||
game.put(destType, tempObject);
|
game.put(destType, tempObject);
|
||||||
|
|
|
@ -2,11 +2,11 @@ package com.github.dtschust.zork.repl.actions;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.repl.Action;
|
import com.github.dtschust.zork.repl.Action;
|
||||||
import com.github.dtschust.zork.types.ZorkCreature;
|
import com.github.dtschust.zork.objects.ZorkCreature;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.CREATURE;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.CREATURE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempt an attack, do you feel lucky?
|
* Attempt an attack, do you feel lucky?
|
||||||
|
|
|
@ -3,20 +3,20 @@ package com.github.dtschust.zork.repl.actions;
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.repl.Action;
|
import com.github.dtschust.zork.repl.Action;
|
||||||
import com.github.dtschust.zork.types.HasSetOfCollectable;
|
import com.github.dtschust.zork.types.HasSetOfCollectable;
|
||||||
import com.github.dtschust.zork.types.ZorkGameStatusType;
|
import com.github.dtschust.zork.objects.ZorkObjectTypes;
|
||||||
import com.github.dtschust.zork.types.ZorkObject;
|
import com.github.dtschust.zork.objects.ZorkObject;
|
||||||
import com.github.dtschust.zork.types.ZorkRoom;
|
import com.github.dtschust.zork.objects.ZorkRoom;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.*;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete: figure out what object it is and delete it accordingly. Rooms are especially tricky
|
* Delete: figure out what object it is and delete it accordingly. Rooms are especially tricky
|
||||||
*/
|
*/
|
||||||
public class DeleteAction implements Action {
|
public class DeleteAction implements Action {
|
||||||
private static void deleteElementFromSpace(ZorkGame game, ZorkGameStatusType space, ZorkGameStatusType element, String object) {
|
private static void deleteElementFromSpace(ZorkGame game, ZorkObjectTypes space, ZorkObjectTypes element, String object) {
|
||||||
for (ZorkObject tempObject : game.values(ZorkObject.class, space)) {
|
for (ZorkObject tempObject : game.values(ZorkObject.class, space)) {
|
||||||
Set<String> set = ((HasSetOfCollectable) tempObject).getSetFromType(element);
|
Set<String> set = ((HasSetOfCollectable) tempObject).getSetFromType(element);
|
||||||
if (set.contains(object)) {
|
if (set.contains(object)) {
|
||||||
|
|
|
@ -2,11 +2,11 @@ package com.github.dtschust.zork.repl.actions;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.repl.Action;
|
import com.github.dtschust.zork.repl.Action;
|
||||||
import com.github.dtschust.zork.types.ZorkRoom;
|
import com.github.dtschust.zork.objects.ZorkRoom;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.ROOM;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.ROOM;
|
||||||
|
|
||||||
public class DropItemAction implements Action {
|
public class DropItemAction implements Action {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,11 +2,11 @@ package com.github.dtschust.zork.repl.actions;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.repl.Action;
|
import com.github.dtschust.zork.repl.Action;
|
||||||
import com.github.dtschust.zork.types.ZorkContainer;
|
import com.github.dtschust.zork.objects.ZorkContainer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.CONTAINER;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.CONTAINER;
|
||||||
|
|
||||||
public class OpenAction implements Action {
|
public class OpenAction implements Action {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,11 +2,11 @@ package com.github.dtschust.zork.repl.actions;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.repl.Action;
|
import com.github.dtschust.zork.repl.Action;
|
||||||
import com.github.dtschust.zork.types.ZorkContainer;
|
import com.github.dtschust.zork.objects.ZorkContainer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.CONTAINER;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.CONTAINER;
|
||||||
|
|
||||||
public class PutAction implements Action {
|
public class PutAction implements Action {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,11 +2,11 @@ package com.github.dtschust.zork.repl.actions;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.repl.Action;
|
import com.github.dtschust.zork.repl.Action;
|
||||||
import com.github.dtschust.zork.types.ZorkItem;
|
import com.github.dtschust.zork.objects.ZorkItem;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.ITEM;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.ITEM;
|
||||||
|
|
||||||
public class ReadAction implements Action {
|
public class ReadAction implements Action {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,13 +2,13 @@ package com.github.dtschust.zork.repl.actions;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.repl.Action;
|
import com.github.dtschust.zork.repl.Action;
|
||||||
import com.github.dtschust.zork.types.ZorkContainer;
|
import com.github.dtschust.zork.objects.ZorkContainer;
|
||||||
import com.github.dtschust.zork.types.ZorkRoom;
|
import com.github.dtschust.zork.objects.ZorkRoom;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.CONTAINER;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.CONTAINER;
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.ROOM;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.ROOM;
|
||||||
|
|
||||||
public class TakeAction implements Action {
|
public class TakeAction implements Action {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,11 +2,11 @@ package com.github.dtschust.zork.repl.actions;
|
||||||
|
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.repl.Action;
|
import com.github.dtschust.zork.repl.Action;
|
||||||
import com.github.dtschust.zork.types.ZorkItem;
|
import com.github.dtschust.zork.objects.ZorkItem;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.github.dtschust.zork.types.ZorkGameStatusType.ITEM;
|
import static com.github.dtschust.zork.objects.ZorkObjectTypes.ITEM;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Turn on an item
|
* Turn on an item
|
||||||
|
|
|
@ -3,7 +3,7 @@ package com.github.dtschust.zork.repl.actions;
|
||||||
import com.github.dtschust.zork.ZorkGame;
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
import com.github.dtschust.zork.repl.Action;
|
import com.github.dtschust.zork.repl.Action;
|
||||||
import com.github.dtschust.zork.types.ZorkMap;
|
import com.github.dtschust.zork.types.ZorkMap;
|
||||||
import com.github.dtschust.zork.types.ZorkObject;
|
import com.github.dtschust.zork.objects.ZorkObject;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
package com.github.dtschust.zork.types;
|
package com.github.dtschust.zork.types;
|
||||||
|
|
||||||
|
import com.github.dtschust.zork.objects.ZorkObjectTypes;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public interface HasSetOfCollectable {
|
public interface HasSetOfCollectable {
|
||||||
|
|
||||||
default Set<String> getSetFromType(ZorkGameStatusType type) {
|
default Set<String> getSetFromType(ZorkObjectTypes type) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.github.dtschust.zork.types;
|
||||||
|
|
||||||
|
import com.github.dtschust.zork.ZorkGame;
|
||||||
|
import com.github.dtschust.zork.objects.ZorkObjectTypes;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
public interface Triggerable {
|
||||||
|
|
||||||
|
boolean evaluateTriggers(final ZorkGame game, final String userCommand);
|
||||||
|
|
||||||
|
static boolean evaluateTriggerCollection(final Collection<String> collection,
|
||||||
|
final ZorkObjectTypes type,
|
||||||
|
final ZorkGame game,
|
||||||
|
final String input) {
|
||||||
|
// non short-circuited to execute all side effects of evaluateTriggers
|
||||||
|
return collection.stream()
|
||||||
|
.map(i -> game.get(type, i).evaluateTriggers(game, input))
|
||||||
|
.reduce(false, (a, b) -> a || b);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,21 +0,0 @@
|
||||||
package com.github.dtschust.zork.types;
|
|
||||||
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public enum ZorkGameStatusType {
|
|
||||||
ROOM("room"),
|
|
||||||
ITEM("item"),
|
|
||||||
CONTAINER("container"),
|
|
||||||
CREATURE("creature");
|
|
||||||
|
|
||||||
private final String propertyName;
|
|
||||||
|
|
||||||
ZorkGameStatusType(final String propertyName) {
|
|
||||||
this.propertyName = propertyName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Optional<ZorkGameStatusType> fromPropertyName(final String propertyName) {
|
|
||||||
return EnumSet.allOf(ZorkGameStatusType.class).stream().filter(e -> e.propertyName.equals(propertyName)).findFirst();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,7 @@
|
||||||
package com.github.dtschust.zork.types;
|
package com.github.dtschust.zork.types;
|
||||||
|
|
||||||
|
import com.github.dtschust.zork.objects.ZorkObject;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
|
Reference in a new issue