Trigger evaluation moved from Zork class

This commit is contained in:
Claudio Maggioni 2022-11-22 15:12:55 +01:00
parent d0d2db70a4
commit 69072097bb
34 changed files with 228 additions and 201 deletions

View File

@ -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;
}
} }

View File

@ -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*/

View File

@ -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 {

View File

@ -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);
}
} }

View File

@ -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;
} }
} }

View 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();
}
}

View File

@ -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;
}
} }

View File

@ -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.*;

View File

@ -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;

View File

@ -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;
}
} }

View File

@ -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();
}
}

View File

@ -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;
} }

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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);

View File

@ -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?

View File

@ -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)) {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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();
} }
} }

View File

@ -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);
}
}

View File

@ -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();
}
}

View File

@ -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;