62 lines
2.6 KiB
Java
62 lines
2.6 KiB
Java
package com.github.dtschust.zork.parser;
|
|
|
|
import com.github.dtschust.zork.ZorkGame;
|
|
import com.github.dtschust.zork.objects.ZorkContainer;
|
|
import com.github.dtschust.zork.objects.ZorkCreature;
|
|
import com.github.dtschust.zork.objects.ZorkItem;
|
|
import com.github.dtschust.zork.objects.ZorkRoom;
|
|
|
|
import java.io.PrintStream;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
public abstract class ZorkParser {
|
|
private final PropertyParseStrategy<ZorkCreature> creatureStrategy;
|
|
private final PropertyParseStrategy<ZorkContainer> containerStrategy;
|
|
private final PropertyParseStrategy<ZorkItem> itemStrategy;
|
|
private final PropertyParseStrategy<ZorkRoom> roomStrategy;
|
|
|
|
protected ZorkParser(final PropertyParseStrategy<ZorkCreature> creatureStrategy,
|
|
final PropertyParseStrategy<ZorkContainer> containerStrategy,
|
|
final PropertyParseStrategy<ZorkItem> itemStrategy,
|
|
final PropertyParseStrategy<ZorkRoom> roomStrategy) {
|
|
this.creatureStrategy = creatureStrategy;
|
|
this.containerStrategy = containerStrategy;
|
|
this.itemStrategy = itemStrategy;
|
|
this.roomStrategy = roomStrategy;
|
|
}
|
|
|
|
|
|
protected abstract Property getRootProperty(final String filename);
|
|
|
|
public ZorkGame parse(final String filename, final PrintStream stream) {
|
|
final List<ZorkCreature> creatureList = new ArrayList<>();
|
|
final List<ZorkContainer> containerList = new ArrayList<>();
|
|
final List<ZorkRoom> roomList = new ArrayList<>();
|
|
final List<ZorkItem> itemList = new ArrayList<>();
|
|
final Property rootElement = getRootProperty(filename);
|
|
|
|
// Every single first generation child is a room, container, creature, or item. So load them in
|
|
for (final Property element : rootElement.subProperties()) {
|
|
switch (element.name()) {
|
|
case "creature":
|
|
creatureList.add(creatureStrategy.parse(element));
|
|
break;
|
|
case "container":
|
|
containerList.add(containerStrategy.parse(element));
|
|
break;
|
|
case "room":
|
|
roomList.add(roomStrategy.parse(element));
|
|
break;
|
|
case "item":
|
|
itemList.add(itemStrategy.parse(element));
|
|
break;
|
|
default:
|
|
throw new IllegalArgumentException(element.name() + " not recognized");
|
|
}
|
|
}
|
|
|
|
return new ZorkGame(roomList, itemList, containerList, creatureList, stream);
|
|
}
|
|
}
|