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