|
From: Stefan F. <ste...@us...> - 2012-08-19 20:21:51
|
junit/rails/game/state/ActionChangeSetTest.java | 82 -----
junit/rails/game/state/AutoChangeSetTest.java | 68 ----
junit/rails/game/state/BlockingChangeSetTest.java | 71 +++++
junit/rails/game/state/BooleanStateTest.java | 4
junit/rails/game/state/ChangeStackTest.java | 66 ++--
junit/rails/game/state/GameChangeSetTest.java | 68 ++++
junit/rails/game/state/GenericStateTest.java | 4
junit/rails/game/state/HashMapStateTest.java | 12
junit/rails/game/state/IntegerStateTest.java | 2
junit/rails/game/state/StateTestUtils.java | 2
junit/rails/game/state/StringStateTest.java | 8
src/rails/common/parser/ComponentManager.java | 8
src/rails/common/parser/GameFileParser.java | 71 ++---
src/rails/game/ActionChangeSet.java | 31 ++
src/rails/game/Game.java | 297 ---------------------
src/rails/game/GameRoot.java | 306 ++++++++++++++++++++++
src/rails/game/PlayerManager.java | 4
src/rails/game/state/AbstractItem.java | 10
src/rails/game/state/ActionChangeSet.java | 36 --
src/rails/game/state/AutoChangeSet.java | 26 -
src/rails/game/state/ChangeSet.java | 93 ++++--
src/rails/game/state/ChangeStack.java | 171 ++++++------
src/rails/game/state/Context.java | 23 -
src/rails/game/state/GameRoot.java | 23 +
src/rails/game/state/Item.java | 2
src/rails/game/state/Manager.java | 10
src/rails/game/state/Observable.java | 10
src/rails/game/state/Root.java | 7
src/rails/game/state/StateManager.java | 7
src/rails/ui/swing/GameSetupWindow.java | 8
src/rails/util/GameFileIO.java | 14 -
src/rails/util/RunGame.java | 6
src/test/TestGame.java | 4
src/test/TestGameBuilder.java | 6
34 files changed, 771 insertions(+), 789 deletions(-)
New commits:
commit 0485c9f83aa5a2a1e32be447657e15020f15c088
Author: Stefan Frey <ste...@we...>
Date: Tue Jul 31 19:14:04 2012 +0200
Added StateManagerTest and ModelTest
Refactored StateManager topological sorting
Refactored ChangeSets
Started Rewriting Managers etc.
diff --git a/junit/rails/game/state/ActionChangeSetTest.java b/junit/rails/game/state/ActionChangeSetTest.java
deleted file mode 100644
index dd388ec..0000000
--- a/junit/rails/game/state/ActionChangeSetTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package rails.game.state;
-
-import static org.fest.assertions.api.Assertions.assertThat;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-
-import org.junit.*;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import rails.game.Player;
-import rails.game.action.PossibleAction;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ActionChangeSetTest {
-
- private final static String STATE_ID = "State";
-
- private Root root;
- private BooleanState state;
- @Mock Model model;
- private ChangeStack changeStack;
- @Mock Player player;
- @Mock PossibleAction action;
- private ActionChangeSet changeSet;
-
-
- @Before
- public void setUp() {
- root = Root.create();
- state = BooleanState.create(root, STATE_ID);
- state.addModel(model);
- changeStack = root.getStateManager().getChangeStack();
- changeSet = changeStack.startActionChangeSet(player, action);
- }
-
- @Test
- public void testActionChangeSet() {
- assertNotNull(changeSet);
- }
-
- @Test
- public void testGetPlayer() {
- assertSame(player, changeSet.getPlayer());
- }
-
- @Test
- public void testGetAction() {
- assertSame(action, changeSet.getAction());
- }
-
- @Test
- public void testAddChange() {
- assertTrue(changeSet.isEmpty());
- state.set(true);
- assertFalse(changeSet.isEmpty());
- verify(model).update();
- }
-
- @Test
- public void testClose() {
- assertFalse(changeSet.isClosed());
- state.set(true);
- changeSet.close();
- assertTrue(changeSet.isClosed());
- assertThat(changeSet.getStates()).contains(state);
- }
-
- @Test
- public void testUnAndReexecute() {
- assertFalse(state.value());
- state.set(true);
- assertTrue(state.value());
- changeSet.close();
- changeSet.unexecute();
- assertFalse(state.value());
- changeSet.reexecute();
- assertTrue(state.value());
- }
-
-}
diff --git a/junit/rails/game/state/AutoChangeSetTest.java b/junit/rails/game/state/AutoChangeSetTest.java
deleted file mode 100644
index 83aee84..0000000
--- a/junit/rails/game/state/AutoChangeSetTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package rails.game.state;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-import static org.fest.assertions.api.Assertions.assertThat;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-@RunWith(MockitoJUnitRunner.class)
-public class AutoChangeSetTest {
-
- private final static String STATE_ID = "State";
-
- private Root root;
- private BooleanState state;
- @Mock Model model;
- private ChangeStack changeStack;
- private AutoChangeSet changeSet;
-
-
- @Before
- public void setUp() {
- root = Root.create();
- state = BooleanState.create(root, STATE_ID);
- state.addModel(model);
- changeStack = root.getStateManager().getChangeStack();
- changeSet = changeStack.closeCurrentChangeSet();
- }
-
- @Test
- public void testAutoChangeSet() {
- assertNotNull(changeSet);
- }
-
- @Test
- public void testAddChange() {
- assertTrue(changeSet.isEmpty());
- state.set(true);
- assertFalse(changeSet.isEmpty());
- verify(model).update();
- }
-
- @Test
- public void testClose() {
- assertFalse(changeSet.isClosed());
- state.set(true);
- changeSet.close();
- assertTrue(changeSet.isClosed());
- assertThat(changeSet.getStates()).contains(state);
- }
-
- @Test
- public void testUnAndReexecute() {
- assertFalse(state.value());
- state.set(true);
- assertTrue(state.value());
- changeSet.close();
- changeSet.unexecute();
- assertFalse(state.value());
- changeSet.reexecute();
- assertTrue(state.value());
- }
-}
diff --git a/junit/rails/game/state/BlockingChangeSetTest.java b/junit/rails/game/state/BlockingChangeSetTest.java
new file mode 100644
index 0000000..4c7bc51
--- /dev/null
+++ b/junit/rails/game/state/BlockingChangeSetTest.java
@@ -0,0 +1,71 @@
+package rails.game.state;
+
+import static org.fest.assertions.api.Assertions.assertThat;
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.*;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import rails.game.state.BooleanState;
+import rails.game.state.ChangeStack;
+import rails.game.state.Model;
+import rails.game.state.Root;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BlockingChangeSetTest {
+
+ private final static String STATE_ID = "State";
+
+ private Root root;
+ private BooleanState state;
+ @Mock Model model;
+ private ChangeStack changeStack;
+ private ChangeSet changeSet;
+
+ @Before
+ public void setUp() {
+ root = Root.create();
+ state = BooleanState.create(root, STATE_ID);
+ state.addModel(model);
+ changeStack = root.getStateManager().getChangeStack();
+ changeSet = changeStack.startChangeSet(new ChangeSet(true, false));
+ }
+
+ @Test
+ public void testActionChangeSet() {
+ assertNotNull(changeSet);
+ }
+
+ @Test
+ public void testAddChange() {
+ assertTrue(changeSet.isEmpty());
+ state.set(true);
+ assertFalse(changeSet.isEmpty());
+ verify(model).update();
+ }
+
+ @Test
+ public void testClose() {
+ assertFalse(changeSet.isClosed());
+ state.set(true);
+ changeSet.close();
+ assertTrue(changeSet.isClosed());
+ assertThat(changeSet.getObservableStates()).contains(state);
+ }
+
+ @Test
+ public void testUnAndReexecute() {
+ assertFalse(state.value());
+ state.set(true);
+ assertTrue(state.value());
+ changeSet.close();
+ changeSet.unexecute();
+ assertFalse(state.value());
+ changeSet.reexecute();
+ assertTrue(state.value());
+ }
+
+}
diff --git a/junit/rails/game/state/BooleanStateTest.java b/junit/rails/game/state/BooleanStateTest.java
index d531aa8..7eb25ed 100644
--- a/junit/rails/game/state/BooleanStateTest.java
+++ b/junit/rails/game/state/BooleanStateTest.java
@@ -43,7 +43,7 @@ public class BooleanStateTest {
stateDefault.set(false);
stateInit.set(true);
StateTestUtils.close(root);
- assertThat(StateTestUtils.getLastClosedChangeSet(root).getStates()).doesNotContain(stateDefault, stateInit);
+ assertThat(StateTestUtils.getLastClosedChangeSet(root).getObservableStates()).doesNotContain(stateDefault, stateInit);
}
@Test
@@ -52,7 +52,7 @@ public class BooleanStateTest {
stateDefault.set(true);
assertTrue(stateDefault.value());
StateTestUtils.close(root);
- assertThat(StateTestUtils.getLastClosedChangeSet(root).getStates()).contains(stateDefault);
+ assertThat(StateTestUtils.getLastClosedChangeSet(root).getObservableStates()).contains(stateDefault);
StateTestUtils.undo(root);
assertFalse(stateDefault.value());
StateTestUtils.redo(root);
diff --git a/junit/rails/game/state/ChangeStackTest.java b/junit/rails/game/state/ChangeStackTest.java
index 3b24122..fbd2663 100644
--- a/junit/rails/game/state/ChangeStackTest.java
+++ b/junit/rails/game/state/ChangeStackTest.java
@@ -1,17 +1,14 @@
package rails.game.state;
-import static org.junit.Assert.*;
+import static org.fest.assertions.api.Fail.failBecauseExceptionWasNotThrown;
import static org.fest.assertions.api.Assertions.assertThat;
+import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
-import rails.game.Player;
-import rails.game.action.PossibleAction;
-
@RunWith(MockitoJUnitRunner.class)
public class ChangeStackTest {
@@ -21,24 +18,26 @@ public class ChangeStackTest {
private BooleanState state;
private ChangeStack changeStack;
- private AutoChangeSet auto_1, auto_2, auto_3;
- private ActionChangeSet action_1, action_2, action_3;
- @Mock Player player;
- @Mock PossibleAction action;
+ private ChangeSet auto_1, auto_2, auto_3;
+ private ChangeSet action_1, action_2, action_3;
+ private ChangeSet startActionChangeSet() {
+ return changeStack.startChangeSet(new ChangeSet(true, false));
+ }
+
@Before
public void setUp() {
root = Root.create();
state = BooleanState.create(root, STATE_ID);
changeStack = root.getStateManager().getChangeStack();
- auto_1 = (AutoChangeSet)changeStack.getCurrentChangeSet();
- action_1 = changeStack.startActionChangeSet(player, action);
+ auto_1 = changeStack.getCurrentChangeSet();
+ action_1 = startActionChangeSet();
auto_2 = changeStack.closeCurrentChangeSet();
state.set(true);
auto_3 = changeStack.closeCurrentChangeSet();
- action_2 = changeStack.startActionChangeSet(player, action);
+ action_2 = startActionChangeSet();
state.set(false);
- action_3 = changeStack.startActionChangeSet(player, action);
+ action_3 = startActionChangeSet();
}
@Test
@@ -61,28 +60,33 @@ public class ChangeStackTest {
public void testUndo() {
assertFalse(state.value());
// undo action 3
- assertTrue(changeStack.undo());
+ changeStack.undo();
assertEquals(4, changeStack.sizeUndoStack());
assertSame(action_2, changeStack.getLastClosedChangeSet());
- assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class);
+ assertFalse(changeStack.getCurrentChangeSet().isBlocking());
assertFalse(state.value());
// undo action 2
- assertTrue(changeStack.undo());
+ changeStack.undo();
assertEquals(3, changeStack.sizeUndoStack());
assertSame(auto_2, changeStack.getLastClosedChangeSet());
- assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class);
+ assertFalse(changeStack.getCurrentChangeSet().isBlocking());
assertTrue(state.value());
// undo auto_2 and action 1
- assertTrue(changeStack.undo());
+ changeStack.undo();
assertEquals(1, changeStack.sizeUndoStack());
assertSame(auto_1, changeStack.getLastClosedChangeSet());
- assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class);
+ assertFalse(changeStack.getCurrentChangeSet().isBlocking());
assertFalse(state.value());
- // undo should not do anything now
- assertFalse(changeStack.undo());
+ // undo should fail now
+ try{
+ changeStack.undo();
+ failBecauseExceptionWasNotThrown(IllegalStateException.class);
+ } catch (Exception e){
+ assertThat(e).isInstanceOf(IllegalStateException.class);
+ }
assertEquals(1, changeStack.sizeUndoStack());
assertSame(auto_1, changeStack.getLastClosedChangeSet());
- assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class);
+ assertFalse(changeStack.getCurrentChangeSet().isBlocking());
assertFalse(state.value());
}
@@ -92,30 +96,30 @@ public class ChangeStackTest {
changeStack.undo();
changeStack.undo();
changeStack.undo();
- // the state unitl now was checked in testUndo
+ // the state until now was checked in testUndo
// now redo action_1 and auto_2
- assertTrue(changeStack.redo());
+ changeStack.redo();
assertEquals(3, changeStack.sizeUndoStack());
assertSame(auto_2, changeStack.getLastClosedChangeSet());
- assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class);
+ assertFalse(changeStack.getCurrentChangeSet().isBlocking());
assertTrue(state.value());
// redo action_2
- assertTrue(changeStack.redo());
+ changeStack.redo();
assertEquals(4, changeStack.sizeUndoStack());
assertSame(action_2, changeStack.getLastClosedChangeSet());
- assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class);
+ assertFalse(changeStack.getCurrentChangeSet().isBlocking());
assertFalse(state.value());
// redo action_3
- assertTrue(changeStack.redo());
+ changeStack.redo();
assertEquals(5, changeStack.sizeUndoStack());
assertSame(action_3, changeStack.getLastClosedChangeSet());
- assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class);
+ assertFalse(changeStack.getCurrentChangeSet().isBlocking());
assertFalse(state.value());
// then it should do anything
- assertFalse(changeStack.redo());
+ changeStack.redo();
assertEquals(5, changeStack.sizeUndoStack());
assertSame(action_3, changeStack.getLastClosedChangeSet());
- assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class);
+ assertFalse(changeStack.getCurrentChangeSet().isBlocking());
assertFalse(state.value());
}
diff --git a/junit/rails/game/state/GameChangeSetTest.java b/junit/rails/game/state/GameChangeSetTest.java
new file mode 100644
index 0000000..5ed9c31
--- /dev/null
+++ b/junit/rails/game/state/GameChangeSetTest.java
@@ -0,0 +1,68 @@
+package rails.game.state;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+import static org.fest.assertions.api.Assertions.assertThat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class GameChangeSetTest {
+
+ private final static String STATE_ID = "State";
+
+ private Root root;
+ private BooleanState state;
+ @Mock Model model;
+ private ChangeStack changeStack;
+ private ChangeSet changeSet;
+
+
+ @Before
+ public void setUp() {
+ root = Root.create();
+ state = BooleanState.create(root, STATE_ID);
+ state.addModel(model);
+ changeStack = root.getStateManager().getChangeStack();
+ changeSet = changeStack.closeCurrentChangeSet();
+ }
+
+ @Test
+ public void testAutoChangeSet() {
+ assertNotNull(changeSet);
+ }
+
+ @Test
+ public void testAddChange() {
+ assertTrue(changeSet.isEmpty());
+ state.set(true);
+ assertFalse(changeSet.isEmpty());
+ verify(model).update();
+ }
+
+ @Test
+ public void testClose() {
+ assertFalse(changeSet.isClosed());
+ state.set(true);
+ changeSet.close();
+ assertTrue(changeSet.isClosed());
+ assertThat(changeSet.getObservableStates()).contains(state);
+ }
+
+ @Test
+ public void testUnAndReexecute() {
+ assertFalse(state.value());
+ state.set(true);
+ assertTrue(state.value());
+ changeSet.close();
+ changeSet.unexecute();
+ assertFalse(state.value());
+ changeSet.reexecute();
+ assertTrue(state.value());
+ }
+}
diff --git a/junit/rails/game/state/GenericStateTest.java b/junit/rails/game/state/GenericStateTest.java
index 4222edc..ccfbe49 100644
--- a/junit/rails/game/state/GenericStateTest.java
+++ b/junit/rails/game/state/GenericStateTest.java
@@ -53,7 +53,7 @@ public class GenericStateTest {
stateDefault.set(null);
stateInit.set(item);
StateTestUtils.close(root);
- assertThat(StateTestUtils.getLastClosedChangeSet(root).getStates()).doesNotContain(stateDefault, stateInit);
+ assertThat(StateTestUtils.getLastClosedChangeSet(root).getObservableStates()).doesNotContain(stateDefault, stateInit);
}
@Test
@@ -68,7 +68,7 @@ public class GenericStateTest {
StateTestUtils.close(root);
// remark: stateInit is an internal (isObservable = false)
- assertThat(StateTestUtils.getLastClosedChangeSet(root).getStates()).contains(stateDefault);
+ assertThat(StateTestUtils.getLastClosedChangeSet(root).getObservableStates()).contains(stateDefault);
StateTestUtils.undo(root);
assertNull(stateDefault.value());
diff --git a/junit/rails/game/state/HashMapStateTest.java b/junit/rails/game/state/HashMapStateTest.java
index beff08e..31ceae5 100644
--- a/junit/rails/game/state/HashMapStateTest.java
+++ b/junit/rails/game/state/HashMapStateTest.java
@@ -20,6 +20,7 @@ public class HashMapStateTest {
private final static String INIT_ID = "Init";
private final static String FIRST_ITEM_ID = "FirstItem";
+ private final static String NEW_FIRST_ITEM_ID = "NewFirstItem";
private final static String SECOND_ITEM_ID = "SecondItem";
private final static String THIRD_ITEM_ID = "ThirdItem";
@@ -29,24 +30,25 @@ public class HashMapStateTest {
private HashMapState<String, Item> stateInit;
private Map<String, Item> initMap, testMap;
- private Item firstItem, secondItem, thirdItem;
+ private Item firstItem, newFirstItem, secondItem, thirdItem;
@Before
public void setUp() {
root = StateTestUtils.setUpRoot();
-
firstItem = AbstractItemImpl.create(root, FIRST_ITEM_ID);
+ newFirstItem = AbstractItemImpl.create(root, NEW_FIRST_ITEM_ID);
secondItem = AbstractItemImpl.create(root, SECOND_ITEM_ID);
thirdItem = AbstractItemImpl.create(root, THIRD_ITEM_ID);
state_default = HashMapState.create(root, DEFAULT_ID);
// intialize stateInit with initMap and create testMap
+ initMap = ImmutableMap.of(FIRST_ITEM_ID, firstItem);
+ stateInit = HashMapState.create(root, INIT_ID, initMap);
+
testMap = Maps.newHashMap();
- testMap.put(FIRST_ITEM_ID, firstItem);
- initMap = ImmutableMap.copyOf(testMap);
- stateInit = HashMapState.create(root, INIT_ID, testMap);
+ testMap.put(FIRST_ITEM_ID, newFirstItem);
testMap.put(SECOND_ITEM_ID, secondItem);
}
diff --git a/junit/rails/game/state/IntegerStateTest.java b/junit/rails/game/state/IntegerStateTest.java
index 31b26f8..c8a2c83 100644
--- a/junit/rails/game/state/IntegerStateTest.java
+++ b/junit/rails/game/state/IntegerStateTest.java
@@ -57,7 +57,7 @@ public class IntegerStateTest {
stateDefault.set(0);
stateInit.set((INIT));
StateTestUtils.close(root);
- assertThat(StateTestUtils.getLastClosedChangeSet(root).getStates()).doesNotContain(stateDefault, stateInit);
+ assertThat(StateTestUtils.getLastClosedChangeSet(root).getObservableStates()).doesNotContain(stateDefault, stateInit);
}
@Test
diff --git a/junit/rails/game/state/StateTestUtils.java b/junit/rails/game/state/StateTestUtils.java
index b9b580c..dd2b7f2 100644
--- a/junit/rails/game/state/StateTestUtils.java
+++ b/junit/rails/game/state/StateTestUtils.java
@@ -20,7 +20,7 @@ class StateTestUtils {
}
public static void startActionChangeSet(Root root) {
- root.getStateManager().getChangeStack().startActionChangeSet(player, action);
+ root.getStateManager().getChangeStack().startChangeSet(new ChangeSet(true, false));
}
public static void close(Root root) {
diff --git a/junit/rails/game/state/StringStateTest.java b/junit/rails/game/state/StringStateTest.java
index c302033..d76799c 100644
--- a/junit/rails/game/state/StringStateTest.java
+++ b/junit/rails/game/state/StringStateTest.java
@@ -63,14 +63,14 @@ public class StringStateTest {
stateDefault.set("");
stateInit.set(null);
StateTestUtils.close(root);
- assertThat(StateTestUtils.getLastClosedChangeSet(root).getStates()).doesNotContain(stateDefault);
- assertThat(StateTestUtils.getLastClosedChangeSet(root).getStates()).contains(stateInit);
+ assertThat(StateTestUtils.getLastClosedChangeSet(root).getObservableStates()).doesNotContain(stateDefault);
+ assertThat(StateTestUtils.getLastClosedChangeSet(root).getObservableStates()).contains(stateInit);
stateDefault.set(null);
stateInit.set(null);
StateTestUtils.close(root);
- assertThat(StateTestUtils.getLastClosedChangeSet(root).getStates()).contains(stateDefault);
- assertThat(StateTestUtils.getLastClosedChangeSet(root).getStates()).doesNotContain(stateInit);
+ assertThat(StateTestUtils.getLastClosedChangeSet(root).getObservableStates()).contains(stateDefault);
+ assertThat(StateTestUtils.getLastClosedChangeSet(root).getObservableStates()).doesNotContain(stateInit);
}
@Test
diff --git a/src/rails/common/parser/ComponentManager.java b/src/rails/common/parser/ComponentManager.java
index daa7f30..f2607e0 100644
--- a/src/rails/common/parser/ComponentManager.java
+++ b/src/rails/common/parser/ComponentManager.java
@@ -9,7 +9,7 @@ import org.slf4j.LoggerFactory;
import rails.common.LocalText;
import rails.common.parser.XMLTags;
-import rails.game.state.Context;
+import rails.game.state.GameRoot;
/**
* ComponentManage - an implementation of ComponentManagerI, which handles the
@@ -28,7 +28,7 @@ public class ComponentManager {
private Map<String, ConfigurableComponent> mComponentMap =
new HashMap<String, ConfigurableComponent>();
- public ComponentManager(Context context, String gameName, Tag tag, Map<String, String> gameOptions)
+ public ComponentManager(GameRoot root, String gameName, Tag tag, Map<String, String> gameOptions)
throws ConfigurationException {
this.gameName = gameName;
@@ -36,12 +36,12 @@ public class ComponentManager {
for (Tag component : componentTags) {
String compName = component.getAttributeAsString("name");
log.debug("Found component " + compName);
- configureComponent(context, component);
+ configureComponent(root, component);
component.setGameOptions(gameOptions);
}
}
- private void configureComponent(Context context, Tag componentTag)
+ private void configureComponent(GameRoot root, Tag componentTag)
throws ConfigurationException {
// Extract the attributes of the Component
diff --git a/src/rails/common/parser/GameFileParser.java b/src/rails/common/parser/GameFileParser.java
index c1b6fd5..d59b9aa 100644
--- a/src/rails/common/parser/GameFileParser.java
+++ b/src/rails/common/parser/GameFileParser.java
@@ -3,66 +3,55 @@ package rails.common.parser;
import java.util.Map;
import rails.algorithms.RevenueManager;
-import rails.common.DisplayBuffer;
-import rails.common.LocalText;
import rails.common.parser.ComponentManager;
import rails.game.Bank;
import rails.game.CompanyManager;
import rails.game.GameManager;
+import rails.game.GameRoot;
import rails.game.MapManager;
import rails.game.PhaseManager;
import rails.game.PlayerManager;
import rails.game.StockMarket;
import rails.game.TileManager;
import rails.game.TrainManager;
-import rails.game.state.Root;
public class GameFileParser extends XMLParser {
- private static String GAME_XML_FILE = "Game.xml";
+ public static final String GAME_XML_FILE = "Game.xml";
private Tag componentManagerTag;
- private ComponentManager componentManager;
- private GameManager gameManager;
- private CompanyManager companyManager;
- private PlayerManager playerManager;
- private PhaseManager phaseManager;
- private TrainManager trainManager;
- private StockMarket stockMarket;
- private MapManager mapManager;
- private TileManager tileManager;
- private RevenueManager revenueManager;
- private Bank bank;
+ private final ComponentManager componentManager;
+ private final GameManager gameManager;
+ private final CompanyManager companyManager;
+ private final PlayerManager playerManager;
+ private final PhaseManager phaseManager;
+ private final TrainManager trainManager;
+ private final StockMarket stockMarket;
+ private final MapManager mapManager;
+ private final TileManager tileManager;
+ private final RevenueManager revenueManager;
+ private final Bank bank;
- public GameFileParser(Root context, String name, Map<String, String> gameOptions) {
+ public GameFileParser(GameRoot root, String name, Map<String, String> gameOptions)
+ throws ConfigurationException {
directories.add("data/" + name);
- try {
- componentManagerTag = Tag.findTopTagInFile(GAME_XML_FILE, directories, XMLTags.COMPONENT_MANAGER_ELEMENT_ID);
- componentManagerTag.setGameOptions(gameOptions);
-
- //XXX: Ultimately calls everyone's configureFromXML() methods.
- componentManager = new ComponentManager(context, name, componentManagerTag, gameOptions);
-
- playerManager = (PlayerManager) componentManager.findComponent("PlayerManager");
- bank = (Bank) componentManager.findComponent("Bank");
- companyManager = (CompanyManager) componentManager.findComponent(CompanyManager.COMPONENT_NAME);
- stockMarket = (StockMarket) componentManager.findComponent(StockMarket.COMPONENT_NAME);
- gameManager = (GameManager) componentManager.findComponent("GameManager");
- phaseManager = (PhaseManager) componentManager.findComponent("PhaseManager");
- trainManager = (TrainManager) componentManager.findComponent("TrainManager");
- mapManager = (MapManager) componentManager.findComponent("Map");
- tileManager = (TileManager) componentManager.findComponent("TileManager");
- revenueManager = (RevenueManager) componentManager.findComponent("RevenueManager");
- } catch (Exception e) {
- String message =
- LocalText.getText("GameSetupFailed", GAME_XML_FILE);
- log.error(message, e);
- System.out.println(e.getMessage());
- e.printStackTrace();
- DisplayBuffer.add(message + ":\n " + e.getMessage());
- }
+ componentManagerTag = Tag.findTopTagInFile(GAME_XML_FILE, directories, XMLTags.COMPONENT_MANAGER_ELEMENT_ID);
+ componentManagerTag.setGameOptions(gameOptions);
+
+ componentManager = new ComponentManager(root, name, componentManagerTag, gameOptions);
+
+ playerManager = (PlayerManager) componentManager.findComponent("PlayerManager");
+ bank = (Bank) componentManager.findComponent("Bank");
+ companyManager = (CompanyManager) componentManager.findComponent(CompanyManager.COMPONENT_NAME);
+ stockMarket = (StockMarket) componentManager.findComponent(StockMarket.COMPONENT_NAME);
+ gameManager = (GameManager) componentManager.findComponent("GameManager");
+ phaseManager = (PhaseManager) componentManager.findComponent("PhaseManager");
+ trainManager = (TrainManager) componentManager.findComponent("TrainManager");
+ mapManager = (MapManager) componentManager.findComponent("Map");
+ tileManager = (TileManager) componentManager.findComponent("TileManager");
+ revenueManager = (RevenueManager) componentManager.findComponent("RevenueManager");
}
/**
diff --git a/src/rails/game/ActionChangeSet.java b/src/rails/game/ActionChangeSet.java
new file mode 100644
index 0000000..549e841
--- /dev/null
+++ b/src/rails/game/ActionChangeSet.java
@@ -0,0 +1,31 @@
+package rails.game;
+
+import rails.game.action.PossibleAction;
+import rails.game.state.ChangeSet;
+
+class ActionChangeSet extends ChangeSet {
+
+ // static fields
+ private final Player player;
+ private final PossibleAction action;
+
+ ActionChangeSet(Player player, PossibleAction action) {
+ // it is blocking, but never intitial
+ super(true, false);
+ this.player = player;
+ this.action = action;
+ }
+
+ Player getPlayer() {
+ return player;
+ }
+
+ PossibleAction getAction() {
+ return action;
+ }
+
+ @Override
+ public String toString() {
+ return "ActionChangeSet for player " + player + " and action " + action;
+ }
+}
diff --git a/src/rails/game/Game.java b/src/rails/game/Game.java
deleted file mode 100644
index 3140cb0..0000000
--- a/src/rails/game/Game.java
+++ /dev/null
@@ -1,297 +0,0 @@
-package rails.game;
-
-import java.io.*;
-import java.util.*;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import rails.algorithms.RevenueManager;
-import rails.common.DisplayBuffer;
-import rails.common.LocalText;
-import rails.common.parser.*;
-import rails.game.action.PossibleAction;
-import rails.game.state.Root;
-import rails.util.GameFileIO;
-
-public class Game {
- public static final String version = "1.5";
-
- /** The component Manager */
- protected GameManager gameManager;
- protected CompanyManager companyManager;
- protected PlayerManager playerManager;
- protected PhaseManager phaseManager;
- protected TrainManager trainManager;
- protected StockMarket stockMarket;
- protected MapManager mapManager;
- protected TileManager tileManager;
- protected RevenueManager revenueManager;
- protected Bank bank;
- protected String name;
-
- protected List<String> directories = new ArrayList<String>();
- protected List<String> players;
-
- protected Map<String, String> gameOptions;
-
- protected static Logger log =
- LoggerFactory.getLogger(Game.class.getPackage().getName());
-
- // The new Game entry point
- public Game(String name, List<String> players, Map<String, String> options) {
-
- this.name = name;
- this.gameOptions = options;
-
- gameOptions.put(GameOption.NUMBER_OF_PLAYERS,
- String.valueOf(players.size()));
-
- for (String playerName : players) {
- log.debug("Player: " + playerName);
- }
- for (String optionName : gameOptions.keySet()) {
- log.debug("Option: " + optionName + "="
- + gameOptions.get(optionName));
- }
-
-
- this.players = players;
-
- log.info("========== Start of rails.game " + name + " ==========");
- log.info("Rails version "+version);
- ReportBuffer.add(LocalText.getText("GameIs", name));
- }
-
- public String start() {
-
- if (players.size() < playerManager.minPlayers
- || players.size() > playerManager.maxPlayers) {
- return name+" is not configured to be played with "+players.size()+" players\n"
- + "Please enter a valid number of players, or add a <Players> entry to data/"+name+"/Game.xml";
- }
-
- gameManager.startGame(gameOptions);
- return null;
- }
-
- public boolean setup() {
- // first define root GameContext to be able to define states
- Root root = Root.create();
-
- GameFileParser gfp = new GameFileParser(root, name, gameOptions);
- playerManager = gfp.getPlayerManager();
- companyManager = gfp.getCompanyManager();
- trainManager = gfp.getTrainManager();
- phaseManager = gfp.getPhaseManager();
- stockMarket = gfp.getStockMarket();
- mapManager = gfp.getMapManager();
- tileManager = gfp.getTileManager();
- revenueManager = gfp.getRevenueManager();
- bank = gfp.getBank();
- gameManager = gfp.getGameManager();
-
- /*
- * Initializations that involve relations between components can
- * only be done after all XML has been processed.
- */
- playerManager.setPlayers(players, bank);
- gameManager.init(name, playerManager, companyManager,
- phaseManager, trainManager, stockMarket, mapManager,
- tileManager, revenueManager, bank);
-
- try {
- companyManager.finishConfiguration(gameManager);
- trainManager.finishConfiguration(gameManager);
- phaseManager.finishConfiguration(gameManager);
- tileManager.finishConfiguration(gameManager);
- mapManager.finishConfiguration(gameManager);
- bank.finishConfiguration(gameManager);
- stockMarket.finishConfiguration(gameManager);
-
- if (revenueManager != null)
- revenueManager.finishConfiguration(gameManager);
- } catch (ConfigurationException e) {
- log.error(e.getMessage());
- System.out.println(e.getMessage());
- e.printStackTrace();
- DisplayBuffer.add(e.getMessage());
- return false;
- }
-
- return true;
- }
-
-
- public static Game load(String filepath) {
-
- // use GameLoader object to load game
- GameFileIO gameLoader = new GameFileIO();
- gameLoader.loadGameData(filepath);
- try{
- gameLoader.initGame();
- gameLoader.loadActionsAndComments();
- } catch (ConfigurationException e) {
- log.error("Load failed", e);
- DisplayBuffer.add(LocalText.getText("LoadFailed", e.getMessage()));
- }
- try{
- gameLoader.replayGame();
- } catch (Exception e) {
- log.error("Replay failed", e);
- DisplayBuffer.add(LocalText.getText("LoadFailed", e.getMessage()));
- }
-
- return gameLoader.getGame();
- }
-
- @SuppressWarnings("unchecked")
- public static Game load_old(String filepath) {
-
- Game game = null;
-
- log.debug("Loading game from file " + filepath);
- String filename = filepath.replaceAll(".*[/\\\\]", "");
-
- /*--- Remember to keep GameManager.reload() in sync with this code! ---*/
- try {
- ObjectInputStream ois =
- new ObjectInputStream(new FileInputStream(
- new File(filepath)));
-
- // New in 1.0.7: Rails version & save date/time.
- // Allow for older saved file versions.
- Object object = ois.readObject();
- if (object instanceof String) {
- log.info("Reading Rails "+(String)object+" saved file "+filename);
- object = ois.readObject();
- } else {
- log.info("Reading Rails (pre-1.0.7) saved file "+filename);
- }
- if (object instanceof String) {
- log.info("File was saved at "+(String)object);
- object = ois.readObject();
- }
-
- long versionID = (Long) object;
- log.debug("Saved versionID="+versionID+" (object="+object+")");
- long saveFileVersionID = GameManager.saveFileVersionID;
- if (versionID != saveFileVersionID) {
- throw new Exception("Save version " + versionID
- + " is incompatible with current version "
- + saveFileVersionID);
- }
- String name = (String) ois.readObject();
- log.debug("Saved game="+name);
- Map<String, String> selectedGameOptions =
- (Map<String, String>) ois.readObject();
- List<String> playerNames = (List<String>) ois.readObject();
-
- game = new Game(name, playerNames, selectedGameOptions);
-
- if (!game.setup()) {
- throw new ConfigurationException("Error in setting up " + name);
- }
-
- String startError = game.start();
- if (startError != null) {
- DisplayBuffer.add(startError);
- return null;
- }
- GameManager gameManager = game.getGameManager();
-
- log.debug("Starting to execute loaded actions");
-
- gameManager.setReloading(true);
-
- Object actionObject = null;
- int actionIndex = 0;
-
- while (true) { // Single-pass loop.
- try {
- actionObject = ois.readObject();
- } catch (EOFException e) {
- // Allow saved file at start of game (with no actions).
- break;
- }
- if (actionObject instanceof List) {
- // Old-style: one List of PossibleActions
- List<PossibleAction> executedActions =
- (List<PossibleAction>) actionObject;
- for (PossibleAction action : executedActions) {
- ++actionIndex;
- try {
- if (!gameManager.processOnReload(action)) {
- log.error ("Load interrupted");
- DisplayBuffer.add(LocalText.getText("LoadInterrupted"));
- break;
- }
- } catch (Exception e) {
- log.error("Action "+actionIndex+" '"+action+"' reload exception", e);
- throw new Exception ("Reload exception", e);
- }
- }
- } else if (actionObject instanceof PossibleAction) {
- // New style: separate PossibleActionsObjects, since Rails 1.3.1
- while (actionObject instanceof PossibleAction) {
- ++actionIndex;
- try {
- if (!gameManager.processOnReload((PossibleAction)actionObject)) {
- log.error ("Load interrupted");
- DisplayBuffer.add(LocalText.getText("LoadInterrupted"));
- break;
- }
- } catch (Exception e) {
- log.error("Action "+actionIndex+" '"+((PossibleAction)actionObject).toString()
- +"' reload exception", e);
- throw new Exception ("Reload exception", e);
- }
- try {
- actionObject = ois.readObject();
- } catch (EOFException e) {
- break;
- }
- }
- }
- break;
- }
-
- // load user comments (is the last
- if (actionObject instanceof SortedMap) {
- ReportBuffer.setCommentItems((SortedMap<Integer, String>) actionObject);
- log.debug("Found sorted map");
- } else {
- try {
- object = ois.readObject();
- if (object instanceof SortedMap) {
- ReportBuffer.setCommentItems((SortedMap<Integer, String>) object);
- }
- } catch (IOException e) {
- // continue without comments, if any IOException occurs
- // sometimes not only the EOF Exception is raised
- // but also the java.io.StreamCorruptedException: invalid type code
- }
- }
-
- ois.close();
- ois = null;
-
- gameManager.setReloading(false);
- gameManager.finishLoading();
- return game;
-
- } catch (Exception e) {
- log.error("Load failed", e);
- DisplayBuffer.add(LocalText.getText("LoadFailed", e.getMessage()));
- }
-
- return null;
- }
-
- /*----- Getters -----*/
-
- public GameManager getGameManager() {
- return gameManager;
- }
-
-}
diff --git a/src/rails/game/GameRoot.java b/src/rails/game/GameRoot.java
new file mode 100644
index 0000000..d186dad
--- /dev/null
+++ b/src/rails/game/GameRoot.java
@@ -0,0 +1,306 @@
+package rails.game;
+
+import java.io.*;
+import java.util.*;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import rails.algorithms.RevenueManager;
+import rails.common.DisplayBuffer;
+import rails.common.LocalText;
+import rails.common.parser.*;
+import rails.game.action.PossibleAction;
+import rails.game.state.Root;
+import rails.util.GameFileIO;
+
+public class GameRoot extends Root {
+ public static final String version = "1.5";
+
+ /** The component Manager */
+ protected GameManager gameManager;
+ protected CompanyManager companyManager;
+ protected PlayerManager playerManager;
+ protected PhaseManager phaseManager;
+ protected TrainManager trainManager;
+ protected StockMarket stockMarket;
+ protected MapManager mapManager;
+ protected TileManager tileManager;
+ protected RevenueManager revenueManager;
+ protected Bank bank;
+ protected String name;
+
+ protected List<String> directories = new ArrayList<String>();
+ protected List<String> players;
+
+ protected Map<String, String> gameOptions;
+
+ protected static Logger log =
+ LoggerFactory.getLogger(GameRoot.class.getPackage().getName());
+
+ public GameRoot(String name, List<String> players, Map<String, String> options) {
+ super(); // initialize root
+
+ this.name = name;
+ this.gameOptions = options;
+
+ gameOptions.put(GameOption.NUMBER_OF_PLAYERS,
+ String.valueOf(players.size()));
+
+ for (String playerName : players) {
+ log.debug("Player: " + playerName);
+ }
+ for (String optionName : gameOptions.keySet()) {
+ log.debug("Option: " + optionName + "="
+ + gameOptions.get(optionName));
+ }
+
+
+ this.players = players;
+
+ log.info("========== Start of rails.game " + name + " ==========");
+ log.info("Rails version "+version);
+ ReportBuffer.add(LocalText.getText("GameIs", name));
+ }
+
+ public String start() {
+
+ if (players.size() < playerManager.minPlayers
+ || players.size() > playerManager.maxPlayers) {
+ return name+" is not configured to be played with "+players.size()+" players\n"
+ + "Please enter a valid number of players, or add a <Players> entry to data/"+name+"/Game.xml";
+ }
+
+ gameManager.startGame(gameOptions);
+ return null;
+ }
+
+ public boolean setup() {
+ GameFileParser gfp;
+ try{
+ gfp = new GameFileParser(this, name, gameOptions);
+ } catch (Exception e) {
+ String message =
+ LocalText.getText("GameSetupFailed", GameFileParser.GAME_XML_FILE);
+ log.error(message, e);
+ System.out.println(e.getMessage());
+ e.printStackTrace();
+ DisplayBuffer.add(message + ":\n " + e.getMessage());
+ return false;
+ }
+
+ playerManager = gfp.getPlayerManager();
+ companyManager = gfp.getCompanyManager();
+ trainManager = gfp.getTrainManager();
+ phaseManager = gfp.getPhaseManager();
+ stockMarket = gfp.getStockMarket();
+ mapManager = gfp.getMapManager();
+ tileManager = gfp.getTileManager();
+ revenueManager = gfp.getRevenueManager();
+ bank = gfp.getBank();
+ gameManager = gfp.getGameManager();
+
+ /*
+ * Initializations that involve relations between components can
+ * only be done after all XML has been processed.
+ */
+ playerManager.setPlayers(players, bank);
+ gameManager.init(name, playerManager, companyManager,
+ phaseManager, trainManager, stockMarket, mapManager,
+ tileManager, revenueManager, bank);
+
+ try {
+ companyManager.finishConfiguration(gameManager);
+ trainManager.finishConfiguration(gameManager);
+ phaseManager.finishConfiguration(gameManager);
+ tileManager.finishConfiguration(gameManager);
+ mapManager.finishConfiguration(gameManager);
+ bank.finishConfiguration(gameManager);
+ stockMarket.finishConfiguration(gameManager);
+
+ if (revenueManager != null)
+ revenueManager.finishConfiguration(gameManager);
+ } catch (ConfigurationException e) {
+ log.error(e.getMessage());
+ System.out.println(e.getMessage());
+ e.printStackTrace();
+ DisplayBuffer.add(e.getMessage());
+ return false;
+ }
+
+ return true;
+ }
+
+
+ public static GameRoot load(String filepath) {
+
+ // use GameLoader object to load game
+ GameFileIO gameLoader = new GameFileIO();
+ gameLoader.loadGameData(filepath);
+ try{
+ gameLoader.initGame();
+ gameLoader.loadActionsAndComments();
+ } catch (ConfigurationException e) {
+ log.error("Load failed", e);
+ DisplayBuffer.add(LocalText.getText("LoadFailed", e.getMessage()));
+ }
+ try{
+ gameLoader.replayGame();
+ } catch (Exception e) {
+ log.error("Replay failed", e);
+ DisplayBuffer.add(LocalText.getText("LoadFailed", e.getMessage()));
+ }
+
+ return gameLoader.getGame();
+ }
+
+ @SuppressWarnings("unchecked")
+ public static GameRoot load_old(String filepath) {
+
+ GameRoot game = null;
+
+ log.debug("Loading game from file " + filepath);
+ String filename = filepath.replaceAll(".*[/\\\\]", "");
+
+ /*--- Remember to keep GameManager.reload() in sync with this code! ---*/
+ try {
+ ObjectInputStream ois =
+ new ObjectInputStream(new FileInputStream(
+ new File(filepath)));
+
+ // New in 1.0.7: Rails version & save date/time.
+ // Allow for older saved file versions.
+ Object object = ois.readObject();
+ if (object instanceof String) {
+ log.info("Reading Rails "+(String)object+" saved file "+filename);
+ object = ois.readObject();
+ } else {
+ log.info("Reading Rails (pre-1.0.7) saved file "+filename);
+ }
+ if (object instanceof String) {
+ log.info("File was saved at "+(String)object);
+ object = ois.readObject();
+ }
+
+ long versionID = (Long) object;
+ log.debug("Saved versionID="+versionID+" (object="+object+")");
+ long saveFileVersionID = GameManager.saveFileVersionID;
+ if (versionID != saveFileVersionID) {
+ throw new Exception("Save version " + versionID
+ + " is incompatible with current version "
+ + saveFileVersionID);
+ }
+ String name = (String) ois.readObject();
+ log.debug("Saved game="+name);
+ Map<String, String> selectedGameOptions =
+ (Map<String, String>) ois.readObject();
+ List<String> playerNames = (List<String>) ois.readObject();
+
+ game = new GameRoot(name, playerNames, selectedGameOptions);
+
+ if (!game.setup()) {
+ throw new ConfigurationException("Error in setting up " + name);
+ }
+
+ String startError = game.start();
+ if (startError != null) {
+ DisplayBuffer.add(startError);
+ return null;
+ }
+ GameManager gameManager = game.getGameManager();
+
+ log.debug("Starting to execute loaded actions");
+
+ gameManager.setReloading(true);
+
+ Object actionObject = null;
+ int actionIndex = 0;
+
+ while (true) { // Single-pass loop.
+ try {
+ actionObject = ois.readObject();
+ } catch (EOFException e) {
+ // Allow saved file at start of game (with no actions).
+ break;
+ }
+ if (actionObject instanceof List) {
+ // Old-style: one List of PossibleActions
+ List<PossibleAction> executedActions =
+ (List<PossibleAction>) actionObject;
+ for (PossibleAction action : executedActions) {
+ ++actionIndex;
+ try {
+ if (!gameManager.processOnReload(action)) {
+ log.error ("Load interrupted");
+ DisplayBuffer.add(LocalText.getText("LoadInterrupted"));
+ break;
+ }
+ } catch (Exception e) {
+ log.error("Action "+actionIndex+" '"+action+"' reload exception", e);
+ throw new Exception ("Reload exception", e);
+ }
+ }
+ } else if (actionObject instanceof PossibleAction) {
+ // New style: separate PossibleActionsObjects, since Rails 1.3.1
+ while (actionObject instanceof PossibleAction) {
+ ++actionIndex;
+ try {
+ if (!gameManager.processOnReload((PossibleAction)actionObject)) {
+ log.error ("Load interrupted");
+ DisplayBuffer.add(LocalText.getText("LoadInterrupted"));
+ break;
+ }
+ } catch (Exception e) {
+ log.error("Action "+actionIndex+" '"+((PossibleAction)actionObject).toString()
+ +"' reload exception", e);
+ throw new Exception ("Reload exception", e);
+ }
+ try {
+ actionObject = ois.readObject();
+ } catch (EOFException e) {
+ break;
+ }
+ }
+ }
+ break;
+ }
+
+ // load user comments (is the last
+ if (actionObject instanceof SortedMap) {
+ ReportBuffer.setCommentItems((SortedMap<Integer, String>) actionObject);
+ log.debug("Found sorted map");
+ } else {
+ try {
+ object = ois.readObject();
+ if (object instanceof SortedMap) {
+ ReportBuffer.setCommentItems((SortedMap<Integer, String>) object);
+ }
+ } catch (IOException e) {
+ // continue without comments, if any IOException occurs
+ // sometimes not only the EOF Exception is raised
+ // but also the java.io.StreamCorruptedException: invalid type code
+ }
+ }
+
+ ois.close();
+ ois = null;
+
+ gameManager.setReloading(false);
+ gameManager.finishLoading();
+ return game;
+
+ } catch (Exception e) {
+ log.error("Load failed", e);
+ DisplayBuffer.add(LocalText.getText("LoadFailed", e.getMessage()));
+ }
+
+ return null;
+ }
+
+ /*----- Getters -----*/
+
+ public GameManager getGameManager() {
+ return gameManager;
+ }
+
+}
diff --git a/src/rails/game/PlayerManager.java b/src/rails/game/PlayerManager.java
index d7afb7c..879ee2f 100644
--- a/src/rails/game/PlayerManager.java
+++ b/src/rails/game/PlayerManager.java
@@ -7,10 +7,10 @@ import rails.common.parser.ConfigurableComponent;
import rails.common.parser.ConfigurationException;
import rails.common.parser.Tag;
import rails.game.model.MoneyModel;
-import rails.game.state.AbstractItem;
import rails.game.state.Item;
+import rails.game.state.Manager;
-public class PlayerManager extends AbstractItem implements ConfigurableComponent {
+public class PlayerManager extends Manager implements ConfigurableComponent {
private int numberOfPlayers;
private List<Player> players;
diff --git a/src/rails/game/state/AbstractItem.java b/src/rails/game/state/AbstractItem.java
index 916fa27..da11b21 100644
--- a/src/rails/game/state/AbstractItem.java
+++ b/src/rails/game/state/AbstractItem.java
@@ -9,7 +9,7 @@ public abstract class AbstractItem implements Item {
private final String id;
private final Item parent;
- private final Context context;
+ private final GameRoot context;
protected AbstractItem(Item parent, String id){
checkNotNull(parent, "Parent cannot be null");
@@ -20,8 +20,8 @@ public abstract class AbstractItem implements Item {
this.parent = parent;
this.id = id;
- if (parent instanceof Context) {
- context = (Context)parent;
+ if (parent instanceof GameRoot) {
+ context = (GameRoot)parent;
} else {
// recursive definition
context = parent.getContext();
@@ -39,7 +39,7 @@ public abstract class AbstractItem implements Item {
return parent;
}
- public Context getContext() {
+ public GameRoot getContext() {
return context;
}
@@ -49,7 +49,7 @@ public abstract class AbstractItem implements Item {
}
public String getURI() {
- if (parent instanceof Context) {
+ if (parent instanceof GameRoot) {
return id;
} else {
// recursive definition
diff --git a/src/rails/game/state/ActionChangeSet.java b/src/rails/game/state/ActionChangeSet.java
deleted file mode 100644
index fb05a96..0000000
--- a/src/rails/game/state/ActionChangeSet.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package rails.game.state;
-
-import rails.game.Player;
-import rails.game.action.PossibleAction;
-
-class ActionChangeSet extends ChangeSet {
-
- private final Player player;
-
- private final PossibleAction action;
-
- ActionChangeSet(Player player, PossibleAction action) {
- this.player = player;
- this.action = action;
- }
-
- Player getPlayer() {
- return player;
- }
-
- PossibleAction getAction() {
- return action;
- }
-
- boolean isTerminal() {
- return false;
- }
-
-
- @Override
- public String toString() {
- return "ActionChangeSet for player " + player + " and action " + action;
- }
-
-
-}
diff --git a/src/rails/game/state/AutoChangeSet.java b/src/rails/game/state/AutoChangeSet.java
deleted file mode 100644
index c69abb7..0000000
--- a/src/rails/game/state/AutoChangeSet.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package rails.game.state;
-
-/**
- * AutoChangeSets are ChangeSets that belong to no action directly
- */
-class AutoChangeSet extends ChangeSet {
-
- private final boolean terminal;
-
- /**
- * @param terminal implies that this is the terminal of the stack
- */
- AutoChangeSet(boolean terminal) {
- this.terminal = terminal;
- }
-
- boolean isTerminal() {
- return terminal;
- }
-
- @Override
- public String toString() {
- return "AutoChangeSet";
- }
-
-}
diff --git a/src/rails/game/state/ChangeSet.java b/src/rails/game/state/ChangeSet.java
index 5c4d0c3..2c28504 100644
--- a/src/rails/game/state/ChangeSet.java
+++ b/src/rails/game/state/ChangeSet.java
@@ -1,6 +1,7 @@
package rails.game.state;
-import java.util.ArrayList;
+import static com.google.common.base.Preconditions.checkState;
+
import java.util.List;
import org.slf4j.Logger;
@@ -11,71 +12,91 @@ import com.google.common.collect.Lists;
/**
* A ChangeSet object represents the collection of all changes
- * that belong to the same action.
+ * that belong to the same activity.
*
- * This can be either a player action (ActionChangeSet) or a game induced automatic
- * (AutoChangeSet) action.
+ * In general activities can be
+ * - User triggered: Thus they belong to an action of a player.
+ * - Game triggered: Changes that are mainly triggered by an automated game action (e.g. a scoring phase, end of turn
+ * or round activities)
*
* ChangeSet objects are stored in the ChangeStack.
- *
- * @author freystef
*/
-abstract class ChangeSet {
+public class ChangeSet {
protected static Logger log =
LoggerFactory.getLogger(ChangeSet.class.getPackage().getName());
- private final List<Change> changes = new ArrayList<Change>();
+ // static fields
+ private final List<Change> changes = Lists.newArrayList();
+ private final boolean blocking;
+ private final boolean initial;
+ // dynamic fields
private boolean closed = false;
- private ImmutableSet<State> states = null;
-
- // constructor
- protected ChangeSet() {};
+ protected ChangeSet(boolean blocking, boolean initial) {
+ this.blocking = blocking;
+ this.initial = initial;
+ };
/**
- * adds change to the ChangeSet and executes the change
- * @param change
+ * adds change to the ChangeSet and executes the change (i...
[truncated message content] |