{"push_id":1401253448,"size":5,"distinct_size":5,"ref":"refs/heads/develop","head":"43f7302775d89e54724d8b3c1b2765a17c077f28","before":"9a581d3a85513c3e2aa06c777d94f34a36b6173f","commits":[{"sha":"13377df69ec8dc85dc360bf69bdfea14abc3f2cd","author":{"name":"Aaron Mahan","email":"0ea57831a6aee87faae8cf48eb3fed040f8dc3de@forerunnergames.com"},"message":"Fix SkipFortifyEvent crashes server.\n\nPERIL-842 #Done #time 15m","distinct":true,"url":"https://api.github.com/repos/forerunnergames/peril/commits/13377df69ec8dc85dc360bf69bdfea14abc3f2cd"},{"sha":"672c5568dd8f892966b4acb0bcbba08653ab56db","author":{"name":"Aaron Mahan","email":"0ea57831a6aee87faae8cf48eb3fed040f8dc3de@forerunnergames.com"},"message":"Fix event de-serialization error.\n\nProblem:\n\ncom.esotericsoftware.kryonet.KryoNetException: Incorrect number of bytes (1 remaining) used to deserialize object: EndPlayerTurnRequestEvent\n        at com.esotericsoftware.kryonet.TcpConnection.readObject(TcpConnection.java:146) ~[peril-server-0.1-SNAPSHOT.jar:na]\n        at com.esotericsoftware.kryonet.Server.update(Server.java:205) [peril-server-0.1-SNAPSHOT.jar:na]\n        at com.esotericsoftware.kryonet.Server.run(Server.java:372) [peril-server-0.1-SNAPSHOT.jar:na]\n        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_72]\n\nSolution:\n\nAdd public default constructor to to EndPlayerTurnRequestEvent to\nsatisfy Kryonet.","distinct":true,"url":"https://api.github.com/repos/forerunnergames/peril/commits/672c5568dd8f892966b4acb0bcbba08653ab56db"},{"sha":"aa1fc2939ca3571426b33c52ceaf999d7e4a6c57","author":{"name":"Aaron Mahan","email":"0ea57831a6aee87faae8cf48eb3fed040f8dc3de@forerunnergames.com"},"message":"Notify players of turn order changes.\n\nProblem:\n\n- When a player leaves the game, or is eliminated, the turn order of any\n  players that come after said player changes, but clients are not\n  notified of these changes, which causes problems in the player box,\n  which displays the current set of players sorted by turn order. The\n  player box will become out of sync with the server and have incorrect\n  information displayed, as well as occasionally crashing due to\n  attempting to manipulate stale PlayerPacket's with incorrect turn\n  orders.\n\nSolution:\n\n- Publish PlayerTurnOrderChangedEvent when this occurs.\n- Update PlayerBox in response to PlayerTurnOrderChangedEvent.\n\nDetails:\n\n- Collect & return any player turn order mutations from\n  [Default]PlayerModel for any methods that can affect players' turn\n  order.\n\n- Use this information from PlayerModel in GameModel &\n  InternalCommunicationHandler to publish PlayerTurnOrderChangedEvent's,\n  except when determining player turn order, since those changes are\n  temporary internal placeholders.\n\n- Add / modify tests for PlayerModel & GameModel.\n\n- Also fix PlayerBox which used a TreeSet with a Comparator inconsistent\n  with equals, which failed to remove players with non-existent turn\n  orders because it was supposed to use Id. Use a HashSet instead, which\n  will remove based on equals / Id, and just get a view sorted by turn\n  order when needed.","distinct":true,"url":"https://api.github.com/repos/forerunnergames/peril/commits/aa1fc2939ca3571426b33c52ceaf999d7e4a6c57"},{"sha":"2b1e700fe9ba8d4075b01f9d0e105ad63f6af75b","author":{"name":"Aaron Mahan","email":"0ea57831a6aee87faae8cf48eb3fed040f8dc3de@forerunnergames.com"},"message":"Fix out-of-cards crash on server.\n\nStack trace:\n\njava.lang.IllegalStateException: No cards available!\n      at com.forerunnergames.tools.common.Preconditions.checkIsTrue(Preconditions.java:41) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.forerunnergames.peril.core.model.card.DefaultCardDealer.take(DefaultCardDealer.java:61) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.forerunnergames.peril.core.model.card.DefaultCardModel.giveCard(DefaultCardModel.java:68) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.forerunnergames.peril.core.model.GameModel.endPlayerTurn(GameModel.java:358) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.forerunnergames.peril.core.model.state.GameStateMachineAdvancePlayerTurnState.onEntry(GameStateMachineAdvancePlayerTurnState.java:33) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.forerunnergames.peril.core.model.state.GameStateMachineAdvancePlayerTurnState.onEntry(GameStateMachineAdvancePlayerTurnState.java:6) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.stateforge.statemachine.algorithm.StateOperation.walkTreeEntry(StateOperation.java:63) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.stateforge.statemachine.algorithm.StateOperation.processTransitionEnd(StateOperation.java:144) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.forerunnergames.peril.core.model.state.GameStateMachinePlayerTurnState.onEndPlayerTurnRequestEvent(GameStateMachinePlayerTurnState.java:69) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.forerunnergames.peril.core.model.state.GameStateMachineGameHandlerContext.onEndPlayerTurnRequestEvent(GameStateMachineGameHandlerContext.java:140) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.forerunnergames.peril.core.model.state.GameStateMachineOperatingState.onEndPlayerTurnRequestEvent(GameStateMachineOperatingState.java:171) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at com.forerunnergames.peril.core.model.state.GameStateMachineContext$10.run(GameStateMachineContext.java:231) ~[peril-server-0.1-SNAPSHOT.jar:na]\n      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_72]\n      at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_72]\n      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_72]\n      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_72]\n      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_72]\n      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_72]\n      at java.lang.Thread.run(Thread.java:745) [na:1.8.0_72]\n\n- Caused by having enough players but few enough cards in order to drain\n  the deck and discard pile but still not have enough to trade-in.\n\n- Check to see if a card can be given to a player before actually giving\n  it, logging a warning in that case. The game should still be playable\n  if cards run out.\n\n- The only way to obtain more cards would be to eliminate other players\n  with cards.\n\n- The minimum card count will always be enough to trade-in because there\n  is one card per country + 2 wilds, and the minimum country count is\n  10, making the minimum card count 12.\n\n- 12 cards doesn't go far among the max of 10 players, however...","distinct":true,"url":"https://api.github.com/repos/forerunnergames/peril/commits/2b1e700fe9ba8d4075b01f9d0e105ad63f6af75b"},{"sha":"43f7302775d89e54724d8b3c1b2765a17c077f28","author":{"name":"Aaron Mahan","email":"0ea57831a6aee87faae8cf48eb3fed040f8dc3de@forerunnergames.com"},"message":"Fix wrong trade-in required card count.\n\nProblem:\n\nState machine denies valid attempts to reinforce a country once player\nhas 3 cards, stating that trade in required, regardless of whether the\ncards even form a match.\n\nSolution:\n\n- Use GameRules#getMinCardsInHandToRequireTradeIn (TurnPhase.REINFORCE)\n  instead of #getMinCardsInHandForTradeInReinforcePhase, which does not\n  provide the number of cards required for trade-in.","distinct":true,"url":"https://api.github.com/repos/forerunnergames/peril/commits/43f7302775d89e54724d8b3c1b2765a17c077f28"}]}
{"actor":{"display_login":"3xp0n3nt"}}