Introduced adventures.

This commit is contained in:
marcins78
2014-07-25 13:02:57 +00:00
parent 5730a14759
commit 0da8109a52
13 changed files with 114 additions and 15 deletions

View File

@@ -0,0 +1,9 @@
package com.gempukku.lotro.game;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.game.state.actions.DefaultActionsEnvironment;
import com.gempukku.lotro.logic.modifiers.ModifiersLogic;
public interface Adventure {
public void applyAdventureRules(LotroGame game, DefaultActionsEnvironment actionsEnvironment, ModifiersLogic modifiersLogic);
}

View File

@@ -0,0 +1,5 @@
package com.gempukku.lotro.game;
public interface AdventureLibrary {
public Adventure getAdventure(String adventureType);
}

View File

@@ -0,0 +1,19 @@
package com.gempukku.lotro.game;
import com.gempukku.lotro.game.adventure.DefaultAdventure;
import java.util.HashMap;
import java.util.Map;
public class DefaultAdventureLibrary implements AdventureLibrary {
private Adventure _defaultAdventure = new DefaultAdventure();
private Map<String, Adventure> _customAdventures = new HashMap<String, Adventure>();
@Override
public Adventure getAdventure(String adventureType) {
final Adventure adventure = _customAdventures.get(adventureType);
if (adventure != null)
return adventure;
return _defaultAdventure;
}
}

View File

@@ -37,4 +37,6 @@ public interface LotroFormat {
public String getSurveyUrl(); public String getSurveyUrl();
public int getHandSize(); public int getHandSize();
public Adventure getAdventure();
} }

View File

@@ -0,0 +1,14 @@
package com.gempukku.lotro.game.adventure;
import com.gempukku.lotro.game.Adventure;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.game.state.actions.DefaultActionsEnvironment;
import com.gempukku.lotro.logic.modifiers.ModifiersLogic;
import com.gempukku.lotro.logic.timing.rules.WinConditionRule;
public class DefaultAdventure implements Adventure {
@Override
public void applyAdventureRules(LotroGame game, DefaultActionsEnvironment actionsEnvironment, ModifiersLogic modifiersLogic) {
new WinConditionRule(actionsEnvironment).applyRule();
}
}

View File

@@ -5,6 +5,7 @@ import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.communication.GameStateListener; import com.gempukku.lotro.communication.GameStateListener;
import com.gempukku.lotro.communication.UserFeedback; import com.gempukku.lotro.communication.UserFeedback;
import com.gempukku.lotro.game.ActionsEnvironment; import com.gempukku.lotro.game.ActionsEnvironment;
import com.gempukku.lotro.game.Adventure;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary; import com.gempukku.lotro.game.LotroCardBlueprintLibrary;
import com.gempukku.lotro.game.LotroFormat; import com.gempukku.lotro.game.LotroFormat;
import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.PhysicalCard;
@@ -19,7 +20,12 @@ import com.gempukku.lotro.logic.timing.rules.CharacterDeathRule;
import com.gempukku.lotro.logic.vo.LotroDeck; import com.gempukku.lotro.logic.vo.LotroDeck;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import java.util.*; import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class DefaultLotroGame implements LotroGame { public class DefaultLotroGame implements LotroGame {
private static final Logger log = Logger.getLogger(DefaultLotroGame.class); private static final Logger log = Logger.getLogger(DefaultLotroGame.class);
@@ -33,6 +39,7 @@ public class DefaultLotroGame implements LotroGame {
private boolean _cancelled; private boolean _cancelled;
private boolean _finished; private boolean _finished;
private Adventure _adventure;
private LotroFormat _format; private LotroFormat _format;
private Set<String> _allPlayers; private Set<String> _allPlayers;
@@ -46,6 +53,7 @@ public class DefaultLotroGame implements LotroGame {
private Set<String> _requestedCancel = new HashSet<String>(); private Set<String> _requestedCancel = new HashSet<String>();
public DefaultLotroGame(LotroFormat format, Map<String, LotroDeck> decks, UserFeedback userFeedback, final LotroCardBlueprintLibrary library) { public DefaultLotroGame(LotroFormat format, Map<String, LotroDeck> decks, UserFeedback userFeedback, final LotroCardBlueprintLibrary library) {
_adventure = format.getAdventure();
_format = format; _format = format;
_actionStack = new ActionStack(); _actionStack = new ActionStack();
@@ -85,6 +93,8 @@ public class DefaultLotroGame implements LotroGame {
RuleSet ruleSet = new RuleSet(this, _actionsEnvironment, _modifiersLogic); RuleSet ruleSet = new RuleSet(this, _actionsEnvironment, _modifiersLogic);
ruleSet.applyRuleSet(); ruleSet.applyRuleSet();
_adventure.applyAdventureRules(this, _actionsEnvironment, _modifiersLogic);
} }
@Override @Override

View File

@@ -3,7 +3,19 @@ package com.gempukku.lotro.logic.timing;
import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.game.state.actions.DefaultActionsEnvironment; import com.gempukku.lotro.game.state.actions.DefaultActionsEnvironment;
import com.gempukku.lotro.logic.modifiers.ModifiersLogic; import com.gempukku.lotro.logic.modifiers.ModifiersLogic;
import com.gempukku.lotro.logic.timing.rules.*; import com.gempukku.lotro.logic.timing.rules.AmbushRule;
import com.gempukku.lotro.logic.timing.rules.CunningRule;
import com.gempukku.lotro.logic.timing.rules.DiscardedCardRule;
import com.gempukku.lotro.logic.timing.rules.EnduringRule;
import com.gempukku.lotro.logic.timing.rules.FrodoAndSamRule;
import com.gempukku.lotro.logic.timing.rules.HunterRule;
import com.gempukku.lotro.logic.timing.rules.KilledCardRule;
import com.gempukku.lotro.logic.timing.rules.MusterRule;
import com.gempukku.lotro.logic.timing.rules.ResolveSkirmishRule;
import com.gempukku.lotro.logic.timing.rules.RingBearerRule;
import com.gempukku.lotro.logic.timing.rules.RoamingRule;
import com.gempukku.lotro.logic.timing.rules.SanctuaryRule;
import com.gempukku.lotro.logic.timing.rules.ThreatRule;
public class RuleSet { public class RuleSet {
private LotroGame _game; private LotroGame _game;
@@ -29,8 +41,6 @@ public class RuleSet {
new SanctuaryRule(_actionsEnvironment, _modifiersLogic).applyRule(); new SanctuaryRule(_actionsEnvironment, _modifiersLogic).applyRule();
new WinConditionRule(_actionsEnvironment).applyRule();
new DiscardedCardRule(_actionsEnvironment).applyRule(); new DiscardedCardRule(_actionsEnvironment).applyRule();
new KilledCardRule(_actionsEnvironment).applyRule(); new KilledCardRule(_actionsEnvironment).applyRule();

View File

@@ -12,6 +12,8 @@ import com.gempukku.lotro.db.LeagueDAO;
import com.gempukku.lotro.db.LeagueMatchDAO; import com.gempukku.lotro.db.LeagueMatchDAO;
import com.gempukku.lotro.db.LeagueParticipationDAO; import com.gempukku.lotro.db.LeagueParticipationDAO;
import com.gempukku.lotro.db.PlayerDAO; import com.gempukku.lotro.db.PlayerDAO;
import com.gempukku.lotro.game.AdventureLibrary;
import com.gempukku.lotro.game.DefaultAdventureLibrary;
import com.gempukku.lotro.game.GameHistoryService; import com.gempukku.lotro.game.GameHistoryService;
import com.gempukku.lotro.game.GameRecorder; import com.gempukku.lotro.game.GameRecorder;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary; import com.gempukku.lotro.game.LotroCardBlueprintLibrary;
@@ -36,8 +38,12 @@ import java.util.Map;
public class ServerBuilder { public class ServerBuilder {
public static void fillObjectMap(Map<Type, Object> objectMap) { public static void fillObjectMap(Map<Type, Object> objectMap) {
objectMap.put(AdventureLibrary.class,
new DefaultAdventureLibrary());
objectMap.put(LotroFormatLibrary.class, objectMap.put(LotroFormatLibrary.class,
new LotroFormatLibrary( new LotroFormatLibrary(
extract(objectMap, AdventureLibrary.class),
extract(objectMap, LotroCardBlueprintLibrary.class))); extract(objectMap, LotroCardBlueprintLibrary.class)));
objectMap.put(GameHistoryService.class, objectMap.put(GameHistoryService.class,

View File

@@ -4,6 +4,7 @@ import com.gempukku.lotro.common.Block;
import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Keyword; import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Side; import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.game.Adventure;
import com.gempukku.lotro.game.CardNotFoundException; import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.DeckInvalidException; import com.gempukku.lotro.game.DeckInvalidException;
import com.gempukku.lotro.game.LotroCardBlueprint; import com.gempukku.lotro.game.LotroCardBlueprint;
@@ -21,6 +22,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
public class DefaultLotroFormat implements LotroFormat { public class DefaultLotroFormat implements LotroFormat {
private Adventure _adventure;
private LotroCardBlueprintLibrary _library; private LotroCardBlueprintLibrary _library;
private String _name; private String _name;
private Block _siteBlock; private Block _siteBlock;
@@ -38,10 +40,12 @@ public class DefaultLotroFormat implements LotroFormat {
private List<Integer> _validSets = new ArrayList<Integer>(); private List<Integer> _validSets = new ArrayList<Integer>();
private String _surveyUrl; private String _surveyUrl;
public DefaultLotroFormat(LotroCardBlueprintLibrary library, String name, String surveyUrl, public DefaultLotroFormat(Adventure adventure,
LotroCardBlueprintLibrary library, String name, String surveyUrl,
Block siteBlock, Block siteBlock,
boolean validateShadowFPCount, int minimumDeckSize, int maximumSameName, boolean mulliganRule, boolean validateShadowFPCount, int minimumDeckSize, int maximumSameName, boolean mulliganRule,
boolean canCancelRingBearerSkirmish, boolean hasRuleOfFour, boolean winAtEndOfRegroup, boolean winOnControlling5Sites) { boolean canCancelRingBearerSkirmish, boolean hasRuleOfFour, boolean winAtEndOfRegroup, boolean winOnControlling5Sites) {
_adventure = adventure;
_library = library; _library = library;
_name = name; _name = name;
_surveyUrl = surveyUrl; _surveyUrl = surveyUrl;
@@ -56,6 +60,11 @@ public class DefaultLotroFormat implements LotroFormat {
_winOnControlling5Sites = winOnControlling5Sites; _winOnControlling5Sites = winOnControlling5Sites;
} }
@Override
public Adventure getAdventure() {
return _adventure;
}
@Override @Override
public final boolean isOrderedSites() { public final boolean isOrderedSites() {
return _siteBlock != Block.SHADOWS; return _siteBlock != Block.SHADOWS;
@@ -233,7 +242,7 @@ public class DefaultLotroFormat implements LotroFormat {
for (Map.Entry<String, Integer> count : cardCountByName.entrySet()) { for (Map.Entry<String, Integer> count : cardCountByName.entrySet()) {
if (count.getValue() > _maximumSameName) if (count.getValue() > _maximumSameName)
throw new DeckInvalidException("Deck contains more of the same card than allowed ("+count.getValue()+">"+_maximumSameName+"): " + count.getKey()); throw new DeckInvalidException("Deck contains more of the same card than allowed (" + count.getValue() + ">" + _maximumSameName + "): " + count.getKey());
} }
// Restricted cards // Restricted cards

View File

@@ -1,6 +1,8 @@
package com.gempukku.lotro.game.formats; package com.gempukku.lotro.game.formats;
import com.gempukku.lotro.common.Block; import com.gempukku.lotro.common.Block;
import com.gempukku.lotro.game.Adventure;
import com.gempukku.lotro.game.AdventureLibrary;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary; import com.gempukku.lotro.game.LotroCardBlueprintLibrary;
import com.gempukku.lotro.game.LotroFormat; import com.gempukku.lotro.game.LotroFormat;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
@@ -19,7 +21,7 @@ public class LotroFormatLibrary {
private Map<String, LotroFormat> _allFormats = new HashMap<String, LotroFormat>(); private Map<String, LotroFormat> _allFormats = new HashMap<String, LotroFormat>();
private Map<String, LotroFormat> _hallFormats = new LinkedHashMap<String, LotroFormat>(); private Map<String, LotroFormat> _hallFormats = new LinkedHashMap<String, LotroFormat>();
public LotroFormatLibrary(LotroCardBlueprintLibrary library) { public LotroFormatLibrary(AdventureLibrary adventureLibrary, LotroCardBlueprintLibrary library) {
try { try {
final InputStreamReader reader = new InputStreamReader(LotroFormatLibrary.class.getResourceAsStream("/lotrFormats.json"), "UTF-8"); final InputStreamReader reader = new InputStreamReader(LotroFormatLibrary.class.getResourceAsStream("/lotrFormats.json"), "UTF-8");
try { try {
@@ -27,6 +29,7 @@ public class LotroFormatLibrary {
JSONArray object = (JSONArray) parser.parse(reader); JSONArray object = (JSONArray) parser.parse(reader);
for (Object formatDefObj : object) { for (Object formatDefObj : object) {
JSONObject formatDef = (JSONObject) formatDefObj; JSONObject formatDef = (JSONObject) formatDefObj;
final Adventure adventure = adventureLibrary.getAdventure((String) formatDef.get("adventure"));
String formatCode = (String) formatDef.get("code"); String formatCode = (String) formatDef.get("code");
String name = (String) formatDef.get("name"); String name = (String) formatDef.get("name");
String surveyUrl = (String) formatDef.get("surveyUrl"); String surveyUrl = (String) formatDef.get("surveyUrl");
@@ -44,7 +47,7 @@ public class LotroFormatLibrary {
if (winOnControlling5Sites == null) if (winOnControlling5Sites == null)
winOnControlling5Sites = false; winOnControlling5Sites = false;
final DefaultLotroFormat format = new DefaultLotroFormat(library, name, surveyUrl, block, true, 60, 4, true, final DefaultLotroFormat format = new DefaultLotroFormat(adventure, library, name, surveyUrl, block, true, 60, 4, true,
cancelRingBearerSkirmish, hasRuleOfFour, winAtEndOfRegroup, winOnControlling5Sites); cancelRingBearerSkirmish, hasRuleOfFour, winAtEndOfRegroup, winOnControlling5Sites);
JSONArray sets = (JSONArray) formatDef.get("set"); JSONArray sets = (JSONArray) formatDef.get("set");

View File

@@ -1,5 +1,6 @@
package com.gempukku.lotro.at; package com.gempukku.lotro.at;
import com.gempukku.lotro.game.DefaultAdventureLibrary;
import com.gempukku.lotro.game.DefaultUserFeedback; import com.gempukku.lotro.game.DefaultUserFeedback;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary; import com.gempukku.lotro.game.LotroCardBlueprintLibrary;
import com.gempukku.lotro.game.LotroFormat; import com.gempukku.lotro.game.LotroFormat;
@@ -15,7 +16,12 @@ import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.vo.LotroDeck; import com.gempukku.lotro.logic.vo.LotroDeck;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import java.util.*; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
@@ -57,7 +63,7 @@ public abstract class AbstractAtTest {
protected void initializeGameWithDecks(Map<String, LotroDeck> decks) throws DecisionResultInvalidException { protected void initializeGameWithDecks(Map<String, LotroDeck> decks) throws DecisionResultInvalidException {
_userFeedback = new DefaultUserFeedback(); _userFeedback = new DefaultUserFeedback();
LotroFormatLibrary formatLibrary = new LotroFormatLibrary(_library); LotroFormatLibrary formatLibrary = new LotroFormatLibrary(new DefaultAdventureLibrary(), _library);
LotroFormat format = formatLibrary.getFormat("movie"); LotroFormat format = formatLibrary.getFormat("movie");
_game = new DefaultLotroGame(format, decks, _userFeedback, _library); _game = new DefaultLotroGame(format, decks, _userFeedback, _library);

View File

@@ -3,7 +3,12 @@ package com.gempukku.lotro.at;
import com.gempukku.lotro.common.Phase; import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Token; import com.gempukku.lotro.common.Token;
import com.gempukku.lotro.common.Zone; import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.game.*; import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.DefaultAdventureLibrary;
import com.gempukku.lotro.game.DefaultUserFeedback;
import com.gempukku.lotro.game.LotroFormat;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.game.formats.LotroFormatLibrary; import com.gempukku.lotro.game.formats.LotroFormatLibrary;
import com.gempukku.lotro.logic.decisions.AwaitingDecision; import com.gempukku.lotro.logic.decisions.AwaitingDecision;
import com.gempukku.lotro.logic.decisions.AwaitingDecisionType; import com.gempukku.lotro.logic.decisions.AwaitingDecisionType;
@@ -838,7 +843,7 @@ public class IndividualCardAtTest extends AbstractAtTest {
_userFeedback = new DefaultUserFeedback(); _userFeedback = new DefaultUserFeedback();
LotroFormatLibrary formatLibrary = new LotroFormatLibrary(_library); LotroFormatLibrary formatLibrary = new LotroFormatLibrary(new DefaultAdventureLibrary(), _library);
LotroFormat format = formatLibrary.getFormat("movie"); LotroFormat format = formatLibrary.getFormat("movie");
_game = new DefaultLotroGame(format, decks, _userFeedback, _library); _game = new DefaultLotroGame(format, decks, _userFeedback, _library);
@@ -879,7 +884,7 @@ public class IndividualCardAtTest extends AbstractAtTest {
_userFeedback = new DefaultUserFeedback(); _userFeedback = new DefaultUserFeedback();
LotroFormatLibrary formatLibrary = new LotroFormatLibrary(_library); LotroFormatLibrary formatLibrary = new LotroFormatLibrary(new DefaultAdventureLibrary(), _library);
LotroFormat format = formatLibrary.getFormat("movie"); LotroFormat format = formatLibrary.getFormat("movie");
_game = new DefaultLotroGame(format, decks, _userFeedback, _library); _game = new DefaultLotroGame(format, decks, _userFeedback, _library);

View File

@@ -1,6 +1,7 @@
package com.gempukku.lotro.game.formats; package com.gempukku.lotro.game.formats;
import com.gempukku.lotro.game.DeckInvalidException; import com.gempukku.lotro.game.DeckInvalidException;
import com.gempukku.lotro.game.DefaultAdventureLibrary;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary; import com.gempukku.lotro.game.LotroCardBlueprintLibrary;
import com.gempukku.lotro.game.LotroFormat; import com.gempukku.lotro.game.LotroFormat;
import org.junit.Test; import org.junit.Test;
@@ -8,12 +9,12 @@ import org.junit.Test;
public class LotroFormatLibraryTest { public class LotroFormatLibraryTest {
@Test @Test
public void testLoad() { public void testLoad() {
LotroFormatLibrary library = new LotroFormatLibrary(null); LotroFormatLibrary library = new LotroFormatLibrary(new DefaultAdventureLibrary(), null);
} }
@Test(expected = DeckInvalidException.class) @Test(expected = DeckInvalidException.class)
public void legolasGreenleafNotLegalInStandard() throws DeckInvalidException { public void legolasGreenleafNotLegalInStandard() throws DeckInvalidException {
LotroFormatLibrary library = new LotroFormatLibrary(new LotroCardBlueprintLibrary()); LotroFormatLibrary library = new LotroFormatLibrary(new DefaultAdventureLibrary(), new LotroCardBlueprintLibrary());
LotroFormat standard = library.getFormat("standard"); LotroFormat standard = library.getFormat("standard");
standard.validateCard("1_50"); standard.validateCard("1_50");
} }