From 2e7bd6fc4ee5be42369b7f7d5100f0411d66a6af Mon Sep 17 00:00:00 2001 From: George Date: Fri, 9 May 2025 17:03:14 +0100 Subject: [PATCH 1/6] Added Parametrs to 7Wonders --- .../games/wonders7/Wonders7ForwardModel.java | 298 +++++++++--------- .../wonders7/Wonders7GameParameters.java | 119 ++++++- .../games/wonders7/cards/Wonder7Card.java | 153 ++++----- src/test/java/games/wonders7/BuildCosts.java | 25 +- .../java/games/wonders7/ScoringTests.java | 102 +++--- .../java/games/wonders7/WonderAbilities.java | 14 +- 6 files changed, 414 insertions(+), 297 deletions(-) diff --git a/src/main/java/games/wonders7/Wonders7ForwardModel.java b/src/main/java/games/wonders7/Wonders7ForwardModel.java index 288a67a64..fe708b88b 100644 --- a/src/main/java/games/wonders7/Wonders7ForwardModel.java +++ b/src/main/java/games/wonders7/Wonders7ForwardModel.java @@ -216,7 +216,7 @@ protected List _computeAvailableActions(AbstractGameState gameSt protected void createWonderDeck(Wonders7GameState wgs, Random rnd) { // Create all the possible wonders a player could be assigned // this takes all seven boards and pre-shuffles them to one side or the other - for (Wonder7Board.Wonder wonder : Wonder7Board.Wonder.values()) { + for (Wonder7Board.Wonder wonder : wgs.getParams().wonders) { wgs.wonderBoardDeck.add(new Wonder7Board(wonder, rnd.nextInt(2))); } wgs.wonderBoardDeck.shuffle(rnd); @@ -274,59 +274,59 @@ protected void createAgeDeck(Wonders7GameState wgs) { case 1: switch (wgs.getNPlayers()) { case 7: - wgs.ageDeck.add(Wonder7Card.factory(Well)); - wgs.ageDeck.add(Wonder7Card.factory(Baths)); - wgs.ageDeck.add(Wonder7Card.factory(Tavern)); - wgs.ageDeck.add(Wonder7Card.factory(EastTradingPost)); - wgs.ageDeck.add(Wonder7Card.factory(WestTradingPost)); - wgs.ageDeck.add(Wonder7Card.factory(Stockade)); - wgs.ageDeck.add(Wonder7Card.factory(Workshop)); + wgs.ageDeck.add(Wonder7Card.factory(Well, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Baths, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Tavern, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(EastTradingPost, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(WestTradingPost, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Stockade, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Workshop, wgs.getParams())); case 6: - wgs.ageDeck.add(Wonder7Card.factory(TreeFarm)); - wgs.ageDeck.add(Wonder7Card.factory(Mine)); - wgs.ageDeck.add(Wonder7Card.factory(Press)); - wgs.ageDeck.add(Wonder7Card.factory(Loom)); - wgs.ageDeck.add(Wonder7Card.factory(Glassworks)); - wgs.ageDeck.add(Wonder7Card.factory(Theatre)); - wgs.ageDeck.add(Wonder7Card.factory(Marketplace)); + wgs.ageDeck.add(Wonder7Card.factory(TreeFarm, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Mine, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Press, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Loom, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Glassworks, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Theatre, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Marketplace, wgs.getParams())); case 5: - wgs.ageDeck.add(Wonder7Card.factory(StonePit)); - wgs.ageDeck.add(Wonder7Card.factory(ClayPool)); - wgs.ageDeck.add(Wonder7Card.factory(ForestCave)); - wgs.ageDeck.add(Wonder7Card.factory(Altar)); - wgs.ageDeck.add(Wonder7Card.factory(Tavern)); - wgs.ageDeck.add(Wonder7Card.factory(Barracks)); - wgs.ageDeck.add(Wonder7Card.factory(Apothecary)); + wgs.ageDeck.add(Wonder7Card.factory(StonePit, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(ClayPool, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(ForestCave, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Altar, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Tavern, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Barracks, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Apothecary, wgs.getParams())); case 4: - wgs.ageDeck.add(Wonder7Card.factory(LumberYard)); - wgs.ageDeck.add(Wonder7Card.factory(OreVein)); - wgs.ageDeck.add(Wonder7Card.factory(Excavation)); - wgs.ageDeck.add(Wonder7Card.factory(Well)); - wgs.ageDeck.add(Wonder7Card.factory(Tavern)); - wgs.ageDeck.add(Wonder7Card.factory(GuardTower)); - wgs.ageDeck.add(Wonder7Card.factory(Scriptorium)); + wgs.ageDeck.add(Wonder7Card.factory(LumberYard, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(OreVein, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Excavation, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Well, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Tavern, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(GuardTower, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Scriptorium, wgs.getParams())); case 3: - wgs.ageDeck.add(Wonder7Card.factory(LumberYard)); - wgs.ageDeck.add(Wonder7Card.factory(StonePit)); - wgs.ageDeck.add(Wonder7Card.factory(ClayPool)); - wgs.ageDeck.add(Wonder7Card.factory(OreVein)); - wgs.ageDeck.add(Wonder7Card.factory(ClayPit)); - wgs.ageDeck.add(Wonder7Card.factory(TimberYard)); - wgs.ageDeck.add(Wonder7Card.factory(Press)); - wgs.ageDeck.add(Wonder7Card.factory(Loom)); - wgs.ageDeck.add(Wonder7Card.factory(Glassworks)); - wgs.ageDeck.add(Wonder7Card.factory(Baths)); - wgs.ageDeck.add(Wonder7Card.factory(Altar)); - wgs.ageDeck.add(Wonder7Card.factory(Theatre)); - wgs.ageDeck.add(Wonder7Card.factory(EastTradingPost)); - wgs.ageDeck.add(Wonder7Card.factory(WestTradingPost)); - wgs.ageDeck.add(Wonder7Card.factory(Marketplace)); - wgs.ageDeck.add(Wonder7Card.factory(Stockade)); - wgs.ageDeck.add(Wonder7Card.factory(Barracks)); - wgs.ageDeck.add(Wonder7Card.factory(GuardTower)); - wgs.ageDeck.add(Wonder7Card.factory(Apothecary)); - wgs.ageDeck.add(Wonder7Card.factory(Workshop)); - wgs.ageDeck.add(Wonder7Card.factory(Scriptorium)); + wgs.ageDeck.add(Wonder7Card.factory(LumberYard, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(StonePit, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(ClayPool, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(OreVein, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(ClayPit, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(TimberYard, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Press, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Loom, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Glassworks, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Baths, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Altar, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Theatre, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(EastTradingPost, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(WestTradingPost, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Marketplace, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Stockade, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Barracks, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(GuardTower, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Apothecary, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Workshop, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Scriptorium, wgs.getParams())); break; default: throw new AssertionError("Number of players not supported: " + wgs.getNPlayers()); @@ -335,59 +335,59 @@ protected void createAgeDeck(Wonders7GameState wgs) { case 2: switch (wgs.getNPlayers()) { case 7: - wgs.ageDeck.add(Wonder7Card.factory(Statue)); - wgs.ageDeck.add(Wonder7Card.factory(Aqueduct)); - wgs.ageDeck.add(Wonder7Card.factory(Walls)); - wgs.ageDeck.add(Wonder7Card.factory(TrainingGround)); - wgs.ageDeck.add(Wonder7Card.factory(School)); - wgs.ageDeck.add(Wonder7Card.factory(Forum)); - wgs.ageDeck.add(Wonder7Card.factory(Bazaar)); + wgs.ageDeck.add(Wonder7Card.factory(Statue, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Aqueduct, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Walls, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(TrainingGround, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(School, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Forum, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Bazaar, wgs.getParams())); case 6: - wgs.ageDeck.add(Wonder7Card.factory(Temple)); - wgs.ageDeck.add(Wonder7Card.factory(ArcheryRange)); - wgs.ageDeck.add(Wonder7Card.factory(TrainingGround)); - wgs.ageDeck.add(Wonder7Card.factory(Library)); - wgs.ageDeck.add(Wonder7Card.factory(Caravansery)); - wgs.ageDeck.add(Wonder7Card.factory(Forum)); - wgs.ageDeck.add(Wonder7Card.factory(Vineyard)); + wgs.ageDeck.add(Wonder7Card.factory(Temple, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(ArcheryRange, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(TrainingGround, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Library, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Caravansery, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Forum, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Vineyard, wgs.getParams())); case 5: - wgs.ageDeck.add(Wonder7Card.factory(LoomAge2)); - wgs.ageDeck.add(Wonder7Card.factory(GlassworksAge2)); - wgs.ageDeck.add(Wonder7Card.factory(PressAge2)); - wgs.ageDeck.add(Wonder7Card.factory(Courthouse)); - wgs.ageDeck.add(Wonder7Card.factory(Stables)); - wgs.ageDeck.add(Wonder7Card.factory(Laboratory)); - wgs.ageDeck.add(Wonder7Card.factory(Caravansery)); + wgs.ageDeck.add(Wonder7Card.factory(LoomAge2, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(GlassworksAge2, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(PressAge2, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Courthouse, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Stables, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Laboratory, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Caravansery, wgs.getParams())); case 4: - wgs.ageDeck.add(Wonder7Card.factory(Sawmill)); - wgs.ageDeck.add(Wonder7Card.factory(Quarry)); - wgs.ageDeck.add(Wonder7Card.factory(Foundry)); - wgs.ageDeck.add(Wonder7Card.factory(Brickyard)); - wgs.ageDeck.add(Wonder7Card.factory(TrainingGround)); - wgs.ageDeck.add(Wonder7Card.factory(Dispensary)); - wgs.ageDeck.add(Wonder7Card.factory(Bazaar)); + wgs.ageDeck.add(Wonder7Card.factory(Sawmill, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Quarry, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Foundry, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Brickyard, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(TrainingGround, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Dispensary, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Bazaar, wgs.getParams())); case 3: - wgs.ageDeck.add(Wonder7Card.factory(Sawmill)); - wgs.ageDeck.add(Wonder7Card.factory(Quarry)); - wgs.ageDeck.add(Wonder7Card.factory(Foundry)); - wgs.ageDeck.add(Wonder7Card.factory(Brickyard)); - wgs.ageDeck.add(Wonder7Card.factory(LoomAge2)); - wgs.ageDeck.add(Wonder7Card.factory(GlassworksAge2)); - wgs.ageDeck.add(Wonder7Card.factory(PressAge2)); - wgs.ageDeck.add(Wonder7Card.factory(Aqueduct)); - wgs.ageDeck.add(Wonder7Card.factory(Temple)); - wgs.ageDeck.add(Wonder7Card.factory(Courthouse)); - wgs.ageDeck.add(Wonder7Card.factory(Statue)); - wgs.ageDeck.add(Wonder7Card.factory(Stables)); - wgs.ageDeck.add(Wonder7Card.factory(ArcheryRange)); - wgs.ageDeck.add(Wonder7Card.factory(Walls)); - wgs.ageDeck.add(Wonder7Card.factory(Library)); - wgs.ageDeck.add(Wonder7Card.factory(Laboratory)); - wgs.ageDeck.add(Wonder7Card.factory(Dispensary)); - wgs.ageDeck.add(Wonder7Card.factory(School)); - wgs.ageDeck.add(Wonder7Card.factory(Caravansery)); - wgs.ageDeck.add(Wonder7Card.factory(Forum)); - wgs.ageDeck.add(Wonder7Card.factory(Vineyard)); + wgs.ageDeck.add(Wonder7Card.factory(Sawmill, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Quarry, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Foundry, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Brickyard, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(LoomAge2, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(GlassworksAge2, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(PressAge2, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Aqueduct, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Temple, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Courthouse, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Statue, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Stables, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(ArcheryRange, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Walls, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Library, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Laboratory, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Dispensary, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(School, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Caravansery, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Forum, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Vineyard, wgs.getParams())); break; default: throw new AssertionError("Number of players not supported: " + wgs.getNPlayers()); @@ -396,63 +396,63 @@ protected void createAgeDeck(Wonders7GameState wgs) { case 3: switch (wgs.getNPlayers()) { case 7: - wgs.ageDeck.add(Wonder7Card.factory(Palace)); - wgs.ageDeck.add(Wonder7Card.factory(Castrum)); - wgs.ageDeck.add(Wonder7Card.factory(Fortifications)); - wgs.ageDeck.add(Wonder7Card.factory(University)); - wgs.ageDeck.add(Wonder7Card.factory(Observatory)); - wgs.ageDeck.add(Wonder7Card.factory(Ludus)); + wgs.ageDeck.add(Wonder7Card.factory(Palace, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Castrum, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Fortifications, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(University, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Observatory, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Ludus, wgs.getParams())); case 6: - wgs.ageDeck.add(Wonder7Card.factory(TownHall)); - wgs.ageDeck.add(Wonder7Card.factory(Pantheon)); - wgs.ageDeck.add(Wonder7Card.factory(Lighthouse)); - wgs.ageDeck.add(Wonder7Card.factory(ChamberOfCommerce)); - wgs.ageDeck.add(Wonder7Card.factory(Circus)); - wgs.ageDeck.add(Wonder7Card.factory(Lodge)); + wgs.ageDeck.add(Wonder7Card.factory(TownHall, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Pantheon, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Lighthouse, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(ChamberOfCommerce, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Circus, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Lodge, wgs.getParams())); case 5: - wgs.ageDeck.add(Wonder7Card.factory(Senate)); - wgs.ageDeck.add(Wonder7Card.factory(Ludus)); - wgs.ageDeck.add(Wonder7Card.factory(Arena)); - wgs.ageDeck.add(Wonder7Card.factory(SiegeWorkshop)); - wgs.ageDeck.add(Wonder7Card.factory(Arsenal)); - wgs.ageDeck.add(Wonder7Card.factory(Study)); + wgs.ageDeck.add(Wonder7Card.factory(Senate, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Ludus, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Arena, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(SiegeWorkshop, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Arsenal, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Study, wgs.getParams())); case 4: - wgs.ageDeck.add(Wonder7Card.factory(Gardens)); - wgs.ageDeck.add(Wonder7Card.factory(ChamberOfCommerce)); - wgs.ageDeck.add(Wonder7Card.factory(Haven)); - wgs.ageDeck.add(Wonder7Card.factory(Circus)); - wgs.ageDeck.add(Wonder7Card.factory(Castrum)); - wgs.ageDeck.add(Wonder7Card.factory(University)); + wgs.ageDeck.add(Wonder7Card.factory(Gardens, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(ChamberOfCommerce, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Haven, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Circus, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Castrum, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(University, wgs.getParams())); case 3: - wgs.ageDeck.add(Wonder7Card.factory(Gardens)); - wgs.ageDeck.add(Wonder7Card.factory(Senate)); - wgs.ageDeck.add(Wonder7Card.factory(TownHall)); - wgs.ageDeck.add(Wonder7Card.factory(Pantheon)); - wgs.ageDeck.add(Wonder7Card.factory(Palace)); - wgs.ageDeck.add(Wonder7Card.factory(University)); - wgs.ageDeck.add(Wonder7Card.factory(Lodge)); - wgs.ageDeck.add(Wonder7Card.factory(Study)); - wgs.ageDeck.add(Wonder7Card.factory(Academy)); - wgs.ageDeck.add(Wonder7Card.factory(Observatory)); - wgs.ageDeck.add(Wonder7Card.factory(SiegeWorkshop)); - wgs.ageDeck.add(Wonder7Card.factory(Arsenal)); - wgs.ageDeck.add(Wonder7Card.factory(Fortifications)); - wgs.ageDeck.add(Wonder7Card.factory(Arena)); - wgs.ageDeck.add(Wonder7Card.factory(Lighthouse)); - wgs.ageDeck.add(Wonder7Card.factory(Haven)); + wgs.ageDeck.add(Wonder7Card.factory(Gardens, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Senate, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(TownHall, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Pantheon, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Palace, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(University, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Lodge, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Study, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Academy, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Observatory, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(SiegeWorkshop, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Arsenal, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Fortifications, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Arena, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Lighthouse, wgs.getParams())); + wgs.ageDeck.add(Wonder7Card.factory(Haven, wgs.getParams())); // We add two Guild cards per player List allGuilds = new ArrayList<>(); - allGuilds.add(Wonder7Card.factory(WorkersGuild)); - allGuilds.add(Wonder7Card.factory(CraftsmenGuild)); - allGuilds.add(Wonder7Card.factory(TradersGuild)); - allGuilds.add(Wonder7Card.factory(PhilosophersGuild)); - allGuilds.add(Wonder7Card.factory(SpiesGuild)); - allGuilds.add(Wonder7Card.factory(DecoratorsGuild)); - allGuilds.add(Wonder7Card.factory(ShipownersGuild)); - allGuilds.add(Wonder7Card.factory(BuildersGuild)); - allGuilds.add(Wonder7Card.factory(MagistratesGuild)); - allGuilds.add(Wonder7Card.factory(ScientistsGuild)); + allGuilds.add(Wonder7Card.factory(WorkersGuild, wgs.getParams())); + allGuilds.add(Wonder7Card.factory(CraftsmenGuild, wgs.getParams())); + allGuilds.add(Wonder7Card.factory(TradersGuild, wgs.getParams())); + allGuilds.add(Wonder7Card.factory(PhilosophersGuild, wgs.getParams())); + allGuilds.add(Wonder7Card.factory(SpiesGuild, wgs.getParams())); + allGuilds.add(Wonder7Card.factory(DecoratorsGuild, wgs.getParams())); + allGuilds.add(Wonder7Card.factory(ShipownersGuild, wgs.getParams())); + allGuilds.add(Wonder7Card.factory(BuildersGuild, wgs.getParams())); + allGuilds.add(Wonder7Card.factory(MagistratesGuild, wgs.getParams())); + allGuilds.add(Wonder7Card.factory(ScientistsGuild, wgs.getParams())); Collections.shuffle(allGuilds, wgs.getRnd()); for (int i = 0; i < wgs.getNPlayers() + 2; i++) { wgs.ageDeck.add(allGuilds.get(i)); diff --git a/src/main/java/games/wonders7/Wonders7GameParameters.java b/src/main/java/games/wonders7/Wonders7GameParameters.java index 3b02b1d27..8002b02de 100644 --- a/src/main/java/games/wonders7/Wonders7GameParameters.java +++ b/src/main/java/games/wonders7/Wonders7GameParameters.java @@ -4,27 +4,103 @@ import core.Game; import evaluation.optimisation.TunableParameters; import games.GameType; +import games.wonders7.cards.Wonder7Board; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class Wonders7GameParameters extends TunableParameters { + public List wonders = new ArrayList<>(); public int nWonderCardsPerPlayer = 7; public int nCostNeighbourResource = 2; public int nCostDiscountedResource = 1; public int nCoinsDiscard = 3; public int startingCoins = 3; + // Card Parameters + public int rawMaterialLow = 1; + public int rawMaterialHigh = 2; + public int manufacturedMaterial = 1; + + public int victoryLow = 3; + public int victoryMed = 4; + public int victoryHigh = 5; + public int victoryVeryHigh = 6; + public int victoryPantheon = 7; + public int victoryPalace = 8; + + public int tavernMoney = 5; + public int wildcardProduction = 1; + public int commercialMultiplierLow = 1; + public int commercialMultiplierMed = 2; + public int commercialMultiplierHigh = 3; + + public int militaryLow = 1; + public int militaryMed = 2; + public int militaryHigh = 3; + + public int scienceCompass = 1; + public int scienceTablet = 1; + public int scienceCog = 1; + + public int guildMultiplierLow = 1; + public int guildMultiplierMed = 2; + public int builderMultiplier = 1; + public int decoratorVictoryPoints = 7; + + public final String[] DEFAULT_WONDERS = new String[]{ + Wonder7Board.Wonder.TheColossusOfRhodes.toString(), + Wonder7Board.Wonder.TheLighthouseOfAlexandria.toString(), + Wonder7Board.Wonder.TheTempleOfArtemisInEphesus.toString(), + Wonder7Board.Wonder.TheHangingGardensOfBabylon.toString(), + Wonder7Board.Wonder.TheStatueOfZeusInOlympia.toString(), + Wonder7Board.Wonder.TheMausoleumOfHalicarnassus.toString(), + Wonder7Board.Wonder.ThePyramidsOfGiza.toString() + }; + // if either wonder or card distribution seeds are set to something other than -1, // then this seed is fixed. The game random seed will be used in all cases where these are -1 (the default) public int wonderShuffleSeed = -1; public int cardShuffleSeed = -1; public Wonders7GameParameters() { - addTunableParameter("nWonderCardsPerPlayer", 7); - addTunableParameter("nCostNeighbourResource", 2); - addTunableParameter("nCostDiscountedResource", 1); - addTunableParameter("nCoinsDiscard", 3); - addTunableParameter("startingCoins", 3); + addTunableParameter("nWonderCardsPerPlayer", 7, Arrays.asList(3, 5, 7, 9, 11)); + addTunableParameter("nCostNeighbourResource", 2, Arrays.asList(0, 1, 2, 3, 4, 5)); + addTunableParameter("nCostDiscountedResource", 1, Arrays.asList(0, 1, 2, 3, 4, 5)); + addTunableParameter("nCoinsDiscard", 3, Arrays.asList(0, 1, 2, 3, 4, 5)); + addTunableParameter("startingCoins", 3, Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7)); addTunableParameter("wonderShuffleSeed", -1); addTunableParameter("cardShuffleSeed", -1); + addStaticParameter("wonders", Arrays.asList(DEFAULT_WONDERS)); + + // Parameters for cards + addTunableParameter("rawMaterialLow", 1, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("rawMaterialHigh", 2, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("manufacturedMaterial", 1, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("victoryLow", 3, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("victoryMed", 4, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("victoryHigh", 5, Arrays.asList(3, 4, 5, 6, 7)); + addTunableParameter("victoryVeryHigh", 6, Arrays.asList(3, 4, 5, 6, 7)); + addTunableParameter("victoryPantheon", 7, Arrays.asList(5, 6, 7, 8, 9)); + addTunableParameter("victoryPalace", 8, Arrays.asList(6, 7, 8, 9, 10)); + addTunableParameter("tavernMoney", 5, Arrays.asList(3, 4, 5, 6, 7)); + addTunableParameter("wildcardProduction", 1, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("commercialMultiplierLow", 1, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("commercialMultiplierMed", 2, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("commercialMultiplierHigh", 3, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("militaryLow", 1, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("militaryMed", 2, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("militaryHigh", 3, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("scienceCompass", 1, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("scienceTablet", 1, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("scienceCog", 1, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("guildMultiplierLow", 1, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("guildMultiplierMed", 2, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("builderMultiplier", 1, Arrays.asList(1, 2, 3, 4, 5)); + addTunableParameter("decoratorVictoryPoints", 7, Arrays.asList(5, 6, 7, 8, 9)); + + _reset(); } @@ -37,6 +113,39 @@ public void _reset() { startingCoins = (int) getParameterValue("startingCoins"); wonderShuffleSeed = (int) getParameterValue("wonderShuffleSeed"); cardShuffleSeed = (int) getParameterValue("cardShuffleSeed"); + + wonders.clear(); + List wondersJSON = (List) getParameterValue("wonders"); + for (Object o: wondersJSON) { + Wonder7Board.Wonder wonder = Wonder7Board.Wonder.valueOf((String) o); + wonders.add(wonder); + } + + rawMaterialLow = (int) getParameterValue("rawMaterialLow"); + rawMaterialHigh = (int) getParameterValue("rawMaterialHigh"); + manufacturedMaterial = (int) getParameterValue("manufacturedMaterial"); + victoryLow = (int) getParameterValue("victoryLow"); + victoryMed = (int) getParameterValue("victoryMed"); + victoryHigh = (int) getParameterValue("victoryHigh"); + victoryVeryHigh = (int) getParameterValue("victoryVeryHigh"); + victoryPantheon = (int) getParameterValue("victoryPantheon"); + victoryPalace = (int) getParameterValue("victoryPalace"); + tavernMoney = (int) getParameterValue("tavernMoney"); + wildcardProduction = (int) getParameterValue("wildcardProduction"); + commercialMultiplierLow = (int) getParameterValue("commercialMultiplierLow"); + commercialMultiplierMed = (int) getParameterValue("commercialMultiplierMed"); + commercialMultiplierHigh = (int) getParameterValue("commercialMultiplierHigh"); + militaryLow = (int) getParameterValue("militaryLow"); + militaryMed = (int) getParameterValue("militaryMed"); + militaryHigh = (int) getParameterValue("militaryHigh"); + scienceCompass = (int) getParameterValue("scienceCompass"); + scienceTablet = (int) getParameterValue("scienceTablet"); + scienceCog = (int) getParameterValue("scienceCog"); + guildMultiplierLow = (int) getParameterValue("guildMultiplierLow"); + guildMultiplierMed = (int) getParameterValue("guildMultiplierMed"); + builderMultiplier = (int) getParameterValue("builderMultiplier"); + decoratorVictoryPoints = (int) getParameterValue("decoratorVictoryPoints"); + } @Override diff --git a/src/main/java/games/wonders7/cards/Wonder7Card.java b/src/main/java/games/wonders7/cards/Wonder7Card.java index 34d360332..749c63ff8 100644 --- a/src/main/java/games/wonders7/cards/Wonder7Card.java +++ b/src/main/java/games/wonders7/cards/Wonder7Card.java @@ -3,6 +3,7 @@ import core.components.Card; import games.wonders7.Wonders7Constants; import games.wonders7.Wonders7Constants.*; +import games.wonders7.Wonders7GameParameters; import games.wonders7.Wonders7GameState; import org.jetbrains.annotations.NotNull; import utilities.Pair; @@ -65,206 +66,206 @@ public enum CardType { protected List instantEffects = emptyList(); protected List endGameEffects = emptyList(); - public static Wonder7Card factory(CardType cardType) { + public static Wonder7Card factory(CardType cardType, Wonders7GameParameters params) { switch (cardType) { case LumberYard: - return new Wonder7Card(cardType, RawMaterials, emptyMap(), Map.of(Wood, 1)); + return new Wonder7Card(cardType, RawMaterials, emptyMap(), Map.of(Wood, params.rawMaterialLow)); case StonePit: - return new Wonder7Card(cardType, RawMaterials, emptyMap(), Map.of(Stone, 1)); + return new Wonder7Card(cardType, RawMaterials, emptyMap(), Map.of(Stone, params.rawMaterialLow)); case ClayPool: - return new Wonder7Card(cardType, RawMaterials, emptyMap(), Map.of(Clay, 1)); + return new Wonder7Card(cardType, RawMaterials, emptyMap(), Map.of(Clay, params.rawMaterialLow)); case OreVein: - return new Wonder7Card(cardType, RawMaterials, emptyMap(), Map.of(Ore, 1)); + return new Wonder7Card(cardType, RawMaterials, emptyMap(), Map.of(Ore, params.rawMaterialLow)); case TreeFarm: - return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Wood_Clay, 1)); + return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Wood_Clay, params.rawMaterialLow)); case Excavation: - return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Stone_Clay, 1)); + return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Stone_Clay, params.rawMaterialLow)); case ClayPit: - return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Ore_Clay, 1)); + return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Ore_Clay, params.rawMaterialLow)); case TimberYard: - return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Wood_Stone, 1)); + return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Wood_Stone, params.rawMaterialLow)); case ForestCave: - return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Wood_Ore, 1)); + return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Wood_Ore, params.rawMaterialLow)); case Mine: - return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Stone_Ore, 1)); + return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Stone_Ore, params.rawMaterialLow)); case Sawmill: - return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Wood, 2)); + return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Wood, params.rawMaterialHigh)); case Quarry: - return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Stone, 2)); + return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Stone, params.rawMaterialHigh)); case Brickyard: - return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Clay, 2)); + return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Clay, params.rawMaterialHigh)); case Foundry: - return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Ore, 2)); + return new Wonder7Card(cardType, RawMaterials, Map.of(Coin, 1), Map.of(Ore, params.rawMaterialHigh)); case Loom, LoomAge2: - return new Wonder7Card(cardType, ManufacturedGoods, emptyMap(), Map.of(Textile, 1)); + return new Wonder7Card(cardType, ManufacturedGoods, emptyMap(), Map.of(Textile, params.manufacturedMaterial)); case Glassworks, GlassworksAge2: - return new Wonder7Card(cardType, ManufacturedGoods, emptyMap(), Map.of(Glass, 1)); + return new Wonder7Card(cardType, ManufacturedGoods, emptyMap(), Map.of(Glass, params.manufacturedMaterial)); case Press, PressAge2: - return new Wonder7Card(cardType, ManufacturedGoods, emptyMap(), Map.of(Papyrus, 1)); + return new Wonder7Card(cardType, ManufacturedGoods, emptyMap(), Map.of(Papyrus, params.manufacturedMaterial)); case Well, Baths, Altar, Theatre: - return new Wonder7Card(cardType, CivilianStructures, emptyMap(), Map.of(Victory, 3)); + return new Wonder7Card(cardType, CivilianStructures, emptyMap(), Map.of(Victory, params.victoryLow)); case Statue: - return new Wonder7Card(cardType, CivilianStructures, Map.of(Ore, 2, Wood, 1), Map.of(Victory, 4), + return new Wonder7Card(cardType, CivilianStructures, Map.of(Ore, 2, Wood, 1), Map.of(Victory, params.victoryMed), List.of(CardType.Well)); case Aqueduct: - return new Wonder7Card(cardType, CivilianStructures, Map.of(Stone, 3), Map.of(Victory, 5), + return new Wonder7Card(cardType, CivilianStructures, Map.of(Stone, 3), Map.of(Victory, params.victoryHigh), List.of(CardType.Baths)); case Courthouse: - return new Wonder7Card(cardType, CivilianStructures, Map.of(Clay, 2, Textile, 1), Map.of(Victory, 4), + return new Wonder7Card(cardType, CivilianStructures, Map.of(Clay, 2, Textile, 1), Map.of(Victory, params.victoryMed), List.of(CardType.Scriptorium)); case Temple: - return new Wonder7Card(cardType, CivilianStructures, Map.of(Wood, 1, Clay, 1, Glass, 1), Map.of(Victory, 4)); + return new Wonder7Card(cardType, CivilianStructures, Map.of(Wood, 1, Clay, 1, Glass, 1), Map.of(Victory, params.victoryMed)); case TownHall: - return new Wonder7Card(cardType, CivilianStructures, Map.of(Stone, 2, Ore, 1, Glass, 1), Map.of(Victory, 6)); + return new Wonder7Card(cardType, CivilianStructures, Map.of(Stone, 2, Ore, 1, Glass, 1), Map.of(Victory, params.victoryVeryHigh)); case Senate: - return new Wonder7Card(cardType, CivilianStructures, Map.of(Wood, 2, Stone, 1, Ore, 1), Map.of(Victory, 6), + return new Wonder7Card(cardType, CivilianStructures, Map.of(Wood, 2, Stone, 1, Ore, 1), Map.of(Victory, params.victoryVeryHigh), List.of(CardType.Library)); case Gardens: - return new Wonder7Card(cardType, CivilianStructures, Map.of(Clay, 2, Wood, 1), Map.of(Victory, 5), + return new Wonder7Card(cardType, CivilianStructures, Map.of(Clay, 2, Wood, 1), Map.of(Victory, params.victoryHigh), List.of(CardType.Theatre)); case Pantheon: return new Wonder7Card(cardType, CivilianStructures, Map.of(Clay, 2, Ore, 1, Glass, 1, Papyrus, 1, Textile, 1), - Map.of(Victory, 7), List.of(CardType.Altar)); + Map.of(Victory, params.victoryPantheon), List.of(CardType.Altar)); case Palace: return new Wonder7Card(cardType, CivilianStructures, Map.of(Wood, 1, Stone, 1, Clay, 1, Ore, 1, Glass, 1, Papyrus, 1, Textile, 1), - Map.of(Victory, 8)); + Map.of(Victory, params.victoryPalace), List.of(CardType.Altar)); case Tavern: - return new Wonder7Card(cardType, CommercialStructures, emptyMap(), Map.of(Coin, 5)); + return new Wonder7Card(cardType, CommercialStructures, emptyMap(), Map.of(Coin, params.tavernMoney)); case EastTradingPost, WestTradingPost, Marketplace: return new Wonder7Card(cardType, CommercialStructures, emptyMap(), emptyMap()); case Caravansery: - return new Wonder7Card(cardType, CommercialStructures, Map.of(Wood, 2), Map.of(BasicWild, 1), + return new Wonder7Card(cardType, CommercialStructures, Map.of(Wood, 2), Map.of(BasicWild, params.wildcardProduction), List.of(CardType.Marketplace)); case Forum: - return new Wonder7Card(cardType, CommercialStructures, Map.of(Clay, 2), Map.of(RareWild, 1), + return new Wonder7Card(cardType, CommercialStructures, Map.of(Clay, 2), Map.of(RareWild, params.wildcardProduction), List.of(CardType.EastTradingPost, CardType.WestTradingPost)); case Bazaar: return new Wonder7Card(cardType, CommercialStructures, emptyMap(), emptyMap(), - List.of(new GainResourceEffect(Coin, ManufacturedGoods, 2, true, true)), + List.of(new GainResourceEffect(Coin, ManufacturedGoods, params.commercialMultiplierMed, true, true)), emptyList(), emptyList()); case Vineyard: return new Wonder7Card(cardType, CommercialStructures, emptyMap(), emptyMap(), - List.of(new GainResourceEffect(Coin, RawMaterials, 1, true, true)), + List.of(new GainResourceEffect(Coin, RawMaterials, params.commercialMultiplierLow, true, true)), emptyList(), emptyList()); case Lighthouse: return new Wonder7Card(cardType, CommercialStructures, Map.of(Glass, 1, Stone, 1), emptyMap(), - List.of(new GainResourceEffect(Coin, CommercialStructures, 1, true, false)), - List.of(new GainResourceEffect(Victory, CommercialStructures, 1, true, false)), + List.of(new GainResourceEffect(Coin, CommercialStructures, params.commercialMultiplierLow, true, false)), + List.of(new GainResourceEffect(Victory, CommercialStructures, params.commercialMultiplierLow, true, false)), List.of(CardType.Caravansery)); case Haven: return new Wonder7Card(cardType, CommercialStructures, Map.of(Clay, 2), emptyMap(), - List.of(new GainResourceEffect(Coin, RawMaterials, 1, true, false)), - List.of(new GainResourceEffect(Victory, RawMaterials, 1, true, false)), + List.of(new GainResourceEffect(Coin, RawMaterials, params.commercialMultiplierLow, true, false)), + List.of(new GainResourceEffect(Victory, RawMaterials, params.commercialMultiplierLow, true, false)), List.of(CardType.Forum)); case Ludus: return new Wonder7Card(cardType, CommercialStructures, Map.of(Stone, 1, Ore, 1), emptyMap(), - List.of(new GainResourceEffect(Coin, MilitaryStructures, 3, true, false)), - List.of(new GainResourceEffect(Victory, MilitaryStructures, 1, true, false)), + List.of(new GainResourceEffect(Coin, MilitaryStructures, params.commercialMultiplierHigh, true, false)), + List.of(new GainResourceEffect(Victory, MilitaryStructures, params.commercialMultiplierLow, true, false)), emptyList()); case ChamberOfCommerce: return new Wonder7Card(cardType, CommercialStructures, Map.of(Clay, 2, Papyrus, 1), emptyMap(), - List.of(new GainResourceEffect(Coin, ManufacturedGoods, 2, true, false)), - List.of(new GainResourceEffect(Victory, ManufacturedGoods, 2, true, false)), + List.of(new GainResourceEffect(Coin, ManufacturedGoods, params.commercialMultiplierMed, true, false)), + List.of(new GainResourceEffect(Victory, ManufacturedGoods, params.commercialMultiplierMed, true, false)), emptyList()); case Arena: return new Wonder7Card(cardType, CommercialStructures, Map.of(Stone, 2, Ore, 1), emptyMap(), List.of(new GainResourceEffect(Coin, - (state, player) -> (state.getPlayerWonderBoard(player).wonderStage - 1) * 3)), + (state, player) -> (state.getPlayerWonderBoard(player).wonderStage - 1) * params.commercialMultiplierHigh)), List.of(new GainResourceEffect(Victory, - (state, player) -> (state.getPlayerWonderBoard(player).wonderStage - 1))), + (state, player) -> (state.getPlayerWonderBoard(player).wonderStage - 1) * params.commercialMultiplierLow)), List.of(CardType.Dispensary)); case Stockade, Barracks, GuardTower: - return new Wonder7Card(cardType, MilitaryStructures, emptyMap(), Map.of(Shield, 1)); + return new Wonder7Card(cardType, MilitaryStructures, emptyMap(), Map.of(Shield, params.militaryLow)); case Walls: - return new Wonder7Card(cardType, MilitaryStructures, Map.of(Stone, 3), Map.of(Shield, 2)); + return new Wonder7Card(cardType, MilitaryStructures, Map.of(Stone, 3), Map.of(Shield, params.militaryMed)); case Stables: return new Wonder7Card(cardType, MilitaryStructures, Map.of(Clay, 1, Wood, 1, Ore, 1), - Map.of(Shield, 2), List.of(CardType.Apothecary)); + Map.of(Shield, params.militaryMed), List.of(CardType.Apothecary)); case ArcheryRange: return new Wonder7Card(cardType, MilitaryStructures, Map.of(Wood, 2, Ore, 1), - Map.of(Shield, 2), List.of(CardType.Workshop)); + Map.of(Shield, params.militaryMed), List.of(CardType.Workshop)); case TrainingGround: return new Wonder7Card(cardType, MilitaryStructures, Map.of(Ore, 2, Wood, 1), - Map.of(Shield, 2)); + Map.of(Shield, params.militaryMed)); case Castrum: return new Wonder7Card(cardType, MilitaryStructures, Map.of(Clay, 2, Wood, 1, Papyrus, 1), - Map.of(Shield, 3)); + Map.of(Shield, params.militaryHigh)); case Fortifications: return new Wonder7Card(cardType, MilitaryStructures, Map.of(Ore, 3, Clay, 1), - Map.of(Shield, 3), List.of(CardType.Walls)); + Map.of(Shield, params.militaryHigh), List.of(CardType.Walls)); case Arsenal: return new Wonder7Card(cardType, MilitaryStructures, Map.of(Wood, 2, Ore, 1, Textile, 1), - Map.of(Shield, 3)); + Map.of(Shield, params.militaryHigh)); case Circus: return new Wonder7Card(cardType, MilitaryStructures, Map.of(Stone, 3, Ore, 1), - Map.of(Shield, 3), List.of(CardType.TrainingGround)); + Map.of(Shield, params.militaryHigh), List.of(CardType.TrainingGround)); case SiegeWorkshop: return new Wonder7Card(cardType, MilitaryStructures, Map.of(Clay, 3, Wood, 1), - Map.of(Shield, 3), List.of(CardType.Laboratory)); + Map.of(Shield, params.militaryHigh), List.of(CardType.Laboratory)); case Apothecary: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Textile, 1), Map.of(Compass, 1)); + return new Wonder7Card(cardType, ScientificStructures, Map.of(Textile, 1), Map.of(Compass, params.scienceCompass)); case Workshop: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Glass, 1), Map.of(Cog, 1)); + return new Wonder7Card(cardType, ScientificStructures, Map.of(Glass, 1), Map.of(Cog, params.scienceCog)); case Scriptorium: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Papyrus, 1), Map.of(Tablet, 1)); + return new Wonder7Card(cardType, ScientificStructures, Map.of(Papyrus, 1), Map.of(Tablet, params.scienceTablet)); case Dispensary: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Ore, 2, Glass, 1), Map.of(Compass, 1), + return new Wonder7Card(cardType, ScientificStructures, Map.of(Ore, 2, Glass, 1), Map.of(Compass, params.scienceCompass), List.of(CardType.Apothecary)); case Laboratory: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Clay, 2, Papyrus, 1), Map.of(Cog, 1), + return new Wonder7Card(cardType, ScientificStructures, Map.of(Clay, 2, Papyrus, 1), Map.of(Cog, params.scienceCog), List.of(CardType.Workshop)); case Library: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Stone, 2, Textile, 1), Map.of(Tablet, 1), + return new Wonder7Card(cardType, ScientificStructures, Map.of(Stone, 2, Textile, 1), Map.of(Tablet, params.scienceTablet), List.of(CardType.Scriptorium)); case School: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Wood, 1, Papyrus, 1), Map.of(Tablet, 1)); + return new Wonder7Card(cardType, ScientificStructures, Map.of(Wood, 1, Papyrus, 1), Map.of(Tablet, params.scienceTablet)); case Observatory: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Ore, 2, Glass, 1, Textile, 1), Map.of(Cog, 1), + return new Wonder7Card(cardType, ScientificStructures, Map.of(Ore, 2, Glass, 1, Textile, 1), Map.of(Cog, params.scienceCog), List.of(CardType.Laboratory)); case University: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Wood, 2, Glass, 1, Papyrus, 1), Map.of(Tablet, 1), + return new Wonder7Card(cardType, ScientificStructures, Map.of(Wood, 2, Glass, 1, Papyrus, 1), Map.of(Tablet, params.scienceTablet), List.of(CardType.Library)); case Academy: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Stone, 3, Glass, 1), Map.of(Compass, 1), + return new Wonder7Card(cardType, ScientificStructures, Map.of(Stone, 3, Glass, 1), Map.of(Compass, params.scienceCompass), List.of(CardType.School)); case Study: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Wood, 1, Papyrus, 1, Textile, 1), Map.of(Cog, 1), + return new Wonder7Card(cardType, ScientificStructures, Map.of(Wood, 1, Papyrus, 1, Textile, 1), Map.of(Cog, params.scienceCog), List.of(CardType.School)); case Lodge: - return new Wonder7Card(cardType, ScientificStructures, Map.of(Clay, 2, Papyrus, 1, Textile, 1), Map.of(Compass, 1), + return new Wonder7Card(cardType, ScientificStructures, Map.of(Clay, 2, Papyrus, 1, Textile, 1), Map.of(Compass, params.scienceCompass), List.of(CardType.Dispensary)); case WorkersGuild: return new Wonder7Card(cardType, Guilds, Map.of(Ore, 2, Clay, 1, Stone, 1, Wood, 1), emptyMap(), emptyList(), - List.of(new GainResourceEffect(Victory, RawMaterials, 1, false, true)), emptyList()); + List.of(new GainResourceEffect(Victory, RawMaterials, params.guildMultiplierLow, false, true)), emptyList()); case CraftsmenGuild: return new Wonder7Card(cardType, Guilds, Map.of(Ore, 2, Stone, 2), emptyMap(), emptyList(), - List.of(new GainResourceEffect(Victory, ManufacturedGoods, 2, false, true)), emptyList()); + List.of(new GainResourceEffect(Victory, ManufacturedGoods, params.guildMultiplierMed, false, true)), emptyList()); case MagistratesGuild: return new Wonder7Card(cardType, Guilds, Map.of(Wood, 3, Stone, 1, Textile, 1), emptyMap(), emptyList(), - List.of(new GainResourceEffect(Victory, CivilianStructures, 1, false, true)), emptyList()); + List.of(new GainResourceEffect(Victory, CivilianStructures, params.guildMultiplierLow, false, true)), emptyList()); case TradersGuild: return new Wonder7Card(cardType, Guilds, Map.of(Ore, 2, Clay, 1, Glass, 1, Papyrus, 1), emptyMap(), emptyList(), - List.of(new GainResourceEffect(Victory, CommercialStructures, 1, false, true)), emptyList()); + List.of(new GainResourceEffect(Victory, CommercialStructures, params.guildMultiplierLow, false, true)), emptyList()); case SpiesGuild: return new Wonder7Card(cardType, Guilds, Map.of(Clay, 2, Glass, 1), emptyMap(), emptyList(), - List.of(new GainResourceEffect(Victory, MilitaryStructures, 1, false, true)), emptyList()); + List.of(new GainResourceEffect(Victory, MilitaryStructures, params.guildMultiplierLow, false, true)), emptyList()); case PhilosophersGuild: return new Wonder7Card(cardType, Guilds, Map.of(Clay, 3, Papyrus, 1, Textile, 1), emptyMap(), emptyList(), - List.of(new GainResourceEffect(Victory, ScientificStructures, 1, false, true)), emptyList()); + List.of(new GainResourceEffect(Victory, ScientificStructures, params.guildMultiplierLow, false, true)), emptyList()); case ShipownersGuild: return new Wonder7Card(cardType, Guilds, Map.of(Wood, 3, Glass, 1, Papyrus, 1), emptyMap(), emptyList(), - List.of(new GainResourceEffect(Victory, ManufacturedGoods, 1, true, false), - new GainResourceEffect(Victory, RawMaterials, 1, true, false), - new GainResourceEffect(Victory, Guilds, 1, true, false)), emptyList()); + List.of(new GainResourceEffect(Victory, ManufacturedGoods, params.guildMultiplierLow, true, false), + new GainResourceEffect(Victory, RawMaterials, params.guildMultiplierLow, true, false), + new GainResourceEffect(Victory, Guilds, params.guildMultiplierLow, true, false)), emptyList()); case BuildersGuild: return new Wonder7Card(cardType, Guilds, Map.of(Stone, 3, Clay, 2, Glass, 1), emptyMap(), emptyList(), @@ -272,7 +273,7 @@ public static Wonder7Card factory(CardType cardType) { (state, player) -> { int retValue = 0; for (int i = -1; i <= 1; i++) { - retValue += state.getPlayerWonderBoard((player + i + state.getNPlayers()) % state.getNPlayers()).wonderStage - 1; + retValue += (state.getPlayerWonderBoard((player + i + state.getNPlayers()) % state.getNPlayers()).wonderStage - 1) * params.builderMultiplier; } return retValue; }) @@ -284,7 +285,7 @@ public static Wonder7Card factory(CardType cardType) { (state, player) -> { int totalStagesOfWonder = state.getPlayerWonderBoard(player).totalWonderStages; int stagesBuilt = state.getPlayerWonderBoard(player).wonderStage - 1; - return (stagesBuilt == totalStagesOfWonder) ? 7 : 0; + return (stagesBuilt == totalStagesOfWonder) ? params.decoratorVictoryPoints : 0; })), emptyList()); case ScientistsGuild: return new Wonder7Card(cardType, Guilds, Map.of(Wood, 2, Ore, 2, Papyrus, 1), diff --git a/src/test/java/games/wonders7/BuildCosts.java b/src/test/java/games/wonders7/BuildCosts.java index 449558e25..a67ed2766 100644 --- a/src/test/java/games/wonders7/BuildCosts.java +++ b/src/test/java/games/wonders7/BuildCosts.java @@ -20,18 +20,25 @@ public class BuildCosts { Wonders7GameParameters params; Wonders7GameState state; - Wonder7Card lumberyard = Wonder7Card.factory(LumberYard); - Wonder7Card timberyard = Wonder7Card.factory(TimberYard); - Wonder7Card apothecary = Wonder7Card.factory(Apothecary); - Wonder7Card library = Wonder7Card.factory(Library); - Wonder7Card scriptorium = Wonder7Card.factory(Scriptorium); - Wonder7Card temple = Wonder7Card.factory(Temple); + Wonder7Card lumberyard; + Wonder7Card timberyard; + Wonder7Card apothecary; + Wonder7Card library; + Wonder7Card scriptorium; + Wonder7Card temple; @Before public void setup() { params = new Wonders7GameParameters(); params.setRandomSeed(4902); state = new Wonders7GameState(params, 4); + + lumberyard = Wonder7Card.factory(LumberYard, state.getParams()); + timberyard = Wonder7Card.factory(TimberYard, state.getParams()); + apothecary = Wonder7Card.factory(Apothecary, state.getParams()); + library = Wonder7Card.factory(Library, state.getParams()); + scriptorium = Wonder7Card.factory(Scriptorium, state.getParams()); + temple = Wonder7Card.factory(Temple, state.getParams()); fm.setup(state); } @@ -102,7 +109,7 @@ public void usesMarketplaceDiscount() { state.getPlayerResources(1).put(Textile, 1); state.getPlayerResources(3).put(Textile, 1); - state.playedCards.get(0).add(Wonder7Card.factory(Marketplace)); + state.playedCards.get(0).add(Wonder7Card.factory(Marketplace, state.getParams())); assertEquals(0, state.getPlayerResources(0).get(Textile).intValue()); Pair> required = apothecary.isPlayable(0, state); @@ -120,7 +127,7 @@ public void usesTradingPostDiscount() { state.getPlayerResources(0).put(Stone, 0); state.getPlayerResources(0).put(Textile, 1); state.getPlayerResources(0).put(Coin, 1); // 1 coin is not enough to buy the card - state.playedCards.get(0).add(Wonder7Card.factory(EastTradingPost)); + state.playedCards.get(0).add(Wonder7Card.factory(EastTradingPost, state.getParams())); // P0 now has 1 Coin, 1 Textile and needs to buy 2 Stone assertEquals(new Pair<>(false, Collections.emptyList()), library.isPlayable(0, state)); @@ -136,7 +143,7 @@ public void usesTradingPostDiscount() { // iii) now flip to the West Trading Post - they should now spend the coin to player 1 state.playedCards.get(0).clear(); - state.playedCards.get(0).add(Wonder7Card.factory(WestTradingPost)); + state.playedCards.get(0).add(Wonder7Card.factory(WestTradingPost, state.getParams())); assertEquals(new Pair<>(true, List.of(new TradeSource(Stone, 1, 1))), library.isPlayable(0, state)); } diff --git a/src/test/java/games/wonders7/ScoringTests.java b/src/test/java/games/wonders7/ScoringTests.java index 0b45646e7..ab6c73113 100644 --- a/src/test/java/games/wonders7/ScoringTests.java +++ b/src/test/java/games/wonders7/ScoringTests.java @@ -58,7 +58,7 @@ public void militaryScoresAtEndOfAge() { for (int i = 0; i < 4; i++) { state.getPlayerHand(i).clear(); - state.getPlayerHand(i).add(Wonder7Card.factory(Wonder7Card.CardType.LumberYard)); + state.getPlayerHand(i).add(Wonder7Card.factory(Wonder7Card.CardType.LumberYard, state.getParams())); } fm.checkAgeEnd(state); @@ -121,50 +121,50 @@ public void scienceScoringWithWilds() { @Test public void workersGuild(){ - state.getPlayedCards(0).add(Wonder7Card.factory(WorkersGuild)); - state.getPlayedCards(0).add(Wonder7Card.factory(LumberYard)); - state.getPlayedCards(1).add(Wonder7Card.factory(LumberYard)); - state.getPlayedCards(1).add(Wonder7Card.factory(Apothecary)); - state.getPlayedCards(2).add(Wonder7Card.factory(LumberYard)); - state.getPlayedCards(3).add(Wonder7Card.factory(LumberYard)); + state.getPlayedCards(0).add(Wonder7Card.factory(WorkersGuild, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(LumberYard, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(LumberYard, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(Apothecary, state.getParams())); + state.getPlayedCards(2).add(Wonder7Card.factory(LumberYard, state.getParams())); + state.getPlayedCards(3).add(Wonder7Card.factory(LumberYard, state.getParams())); assertEquals(3, state.getGameScore(0), 0.001); state.getPlayedCards(2).remove(0); - state.getPlayedCards(3).add(Wonder7Card.factory(LumberYard)); + state.getPlayedCards(3).add(Wonder7Card.factory(LumberYard, state.getParams())); assertEquals(4, state.getGameScore(0), 0.001); } @Test public void craftsmenGuild(){ - state.getPlayedCards(1).add(Wonder7Card.factory(CraftsmenGuild)); - state.getPlayedCards(0).add(Wonder7Card.factory(LumberYard)); - state.getPlayedCards(0).add(Wonder7Card.factory(Loom)); - state.getPlayedCards(1).add(Wonder7Card.factory(Loom)); - state.getPlayedCards(1).add(Wonder7Card.factory(Loom)); + state.getPlayedCards(1).add(Wonder7Card.factory(CraftsmenGuild, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(LumberYard, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(Loom, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(Loom, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(Loom, state.getParams())); assertEquals(3, state.getGameScore(1), 0.001); - state.getPlayedCards(0).add(Wonder7Card.factory(Press)); + state.getPlayedCards(0).add(Wonder7Card.factory(Press, state.getParams())); assertEquals(5, state.getGameScore(1), 0.001); } @Test public void magistratesGuild(){ - state.getPlayedCards(2).add(Wonder7Card.factory(MagistratesGuild)); - state.getPlayedCards(0).add(Wonder7Card.factory(Baths)); - state.getPlayedCards(0).add(Wonder7Card.factory(Baths)); - state.getPlayedCards(1).add(Wonder7Card.factory(Baths)); - state.getPlayedCards(1).add(Wonder7Card.factory(Baths)); - state.getPlayedCards(2).add(Wonder7Card.factory(Baths)); + state.getPlayedCards(2).add(Wonder7Card.factory(MagistratesGuild, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(Baths, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(Baths, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(Baths, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(Baths, state.getParams())); + state.getPlayedCards(2).add(Wonder7Card.factory(Baths, state.getParams())); assertEquals(3, state.getGameScore(2), 0.001); } @Test public void tradersGuild(){ - state.getPlayedCards(3).add(Wonder7Card.factory(TradersGuild)); - state.getPlayedCards(0).add(Wonder7Card.factory(Tavern)); - state.getPlayedCards(1).add(Wonder7Card.factory(Tavern)); - state.getPlayedCards(2).add(Wonder7Card.factory(Tavern)); + state.getPlayedCards(3).add(Wonder7Card.factory(TradersGuild, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(Tavern, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(Tavern, state.getParams())); + state.getPlayedCards(2).add(Wonder7Card.factory(Tavern, state.getParams())); assertEquals(3, state.getGameScore(3), 0.001); state.getPlayedCards(0).remove(0); assertEquals(2, state.getGameScore(3), 0.001); @@ -172,11 +172,11 @@ public void tradersGuild(){ @Test public void philosophersGuild(){ - state.playedCards.get(0).add(Wonder7Card.factory(PhilosophersGuild)); - state.playedCards.get(0).add(Wonder7Card.factory(Apothecary)); + state.playedCards.get(0).add(Wonder7Card.factory(PhilosophersGuild, state.getParams())); + state.playedCards.get(0).add(Wonder7Card.factory(Apothecary, state.getParams())); assertEquals(1, state.getGameScore(0), 0.001); - state.playedCards.get(1).add(Wonder7Card.factory(Apothecary)); + state.playedCards.get(1).add(Wonder7Card.factory(Apothecary, state.getParams())); assertEquals(2, state.getGameScore(0), 0.001); assertEquals(1, state.getGameScore(1), 0.001); assertEquals(1, state.getGameScore(3), 0.001); @@ -184,8 +184,8 @@ public void philosophersGuild(){ @Test public void spiesGuild(){ - state.playedCards.get(0).add(Wonder7Card.factory(SpiesGuild)); - state.playedCards.get(1).add(Wonder7Card.factory(Stockade)); + state.playedCards.get(0).add(Wonder7Card.factory(SpiesGuild, state.getParams())); + state.playedCards.get(1).add(Wonder7Card.factory(Stockade, state.getParams())); assertEquals(2, state.getGameScore(0), 0.001); state.getPlayedCards(0).remove(0); assertEquals(1, state.getGameScore(0), 0.001); @@ -194,7 +194,7 @@ public void spiesGuild(){ @Test public void buildersGuild(){ - state.playedCards.get(0).add(Wonder7Card.factory(BuildersGuild)); + state.playedCards.get(0).add(Wonder7Card.factory(BuildersGuild, state.getParams())); assertEquals(1, state.getGameScore(0), 0.001); state.getPlayerWonderBoard(0).changeStage(); assertEquals(2, state.getGameScore(0), 0.001); @@ -210,22 +210,22 @@ public void buildersGuild(){ @Test public void shipownersGuild(){ assertEquals(1, state.getGameScore(1), 0.001); - state.getPlayedCards(1).add(Wonder7Card.factory(ShipownersGuild)); - state.getPlayedCards(0).add(Wonder7Card.factory(LumberYard)); - state.getPlayedCards(0).add(Wonder7Card.factory(Glassworks)); - state.getPlayedCards(0).add(Wonder7Card.factory(ScientistsGuild)); + state.getPlayedCards(1).add(Wonder7Card.factory(ShipownersGuild, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(LumberYard, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(Glassworks, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(ScientistsGuild, state.getParams())); assertEquals(2, state.getGameScore(1), 0.001); - state.getPlayedCards(1).add(Wonder7Card.factory(StonePit)); - state.getPlayedCards(1).add(Wonder7Card.factory(Loom)); - state.getPlayedCards(1).add(Wonder7Card.factory(PhilosophersGuild)); - state.getPlayedCards(1).add(Wonder7Card.factory(University)); + state.getPlayedCards(1).add(Wonder7Card.factory(StonePit, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(Loom, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(PhilosophersGuild, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(University, state.getParams())); assertEquals(5, state.getGameScore(1), 0.001); } @Test public void decoratorsGuild(){ - state.getPlayedCards(2).add(Wonder7Card.factory(DecoratorsGuild)); + state.getPlayedCards(2).add(Wonder7Card.factory(DecoratorsGuild, state.getParams())); Wonder7Board board = state.getPlayerWonderBoard(2); for (int i = 1; i <= board.totalWonderStages; i++){ assertEquals(1, state.getGameScore(2), 0.001); @@ -241,7 +241,7 @@ public void decoratorsGuild(){ @Test public void scientistsGuild(){ - state.getPlayerHand(3).add(Wonder7Card.factory(ScientistsGuild)); + state.getPlayerHand(3).add(Wonder7Card.factory(ScientistsGuild, state.getParams())); fm.next(state, new PlayCard(3, ScientistsGuild, true)); assertEquals(1, state.getPlayerResources(3).get(ScienceWild), 0.001); assertEquals(2, state.getGameScore(3), 0.001); @@ -251,12 +251,12 @@ public void scientistsGuild(){ @Test public void playingLighthouseGivesCoinAndVPForItself() { assertEquals(3, state.getPlayerResources(1).get(Coin), 0.001); - state.getPlayerHand(1).add(Wonder7Card.factory(Lighthouse)); - state.getPlayedCards(1).add(Wonder7Card.factory(Tavern)); + state.getPlayerHand(1).add(Wonder7Card.factory(Lighthouse, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(Tavern, state.getParams())); fm.next(state, new PlayCard(1, Lighthouse, true)); assertEquals(5, state.getPlayerResources(1).get(Coin), 0.001); assertEquals(3, state.getGameScore(1), 0.001); - state.getPlayedCards(1).add(Wonder7Card.factory(Forum)); + state.getPlayedCards(1).add(Wonder7Card.factory(Forum, state.getParams())); assertEquals(4, state.getGameScore(1), 0.001); assertEquals(5, state.getPlayerResources(1).get(Coin), 0.001); } @@ -264,11 +264,11 @@ public void playingLighthouseGivesCoinAndVPForItself() { @Test public void vineyardGivesMoney() { assertEquals(1, state.getGameScore(1), 0.001); - state.getPlayerHand(1).add(Wonder7Card.factory(Vineyard)); - state.getPlayedCards(0).add(Wonder7Card.factory(LumberYard)); - state.getPlayedCards(1).add(Wonder7Card.factory(LumberYard)); - state.getPlayedCards(2).add(Wonder7Card.factory(LumberYard)); - state.getPlayedCards(0).add(Wonder7Card.factory(Apothecary)); + state.getPlayerHand(1).add(Wonder7Card.factory(Vineyard, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(LumberYard, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(LumberYard, state.getParams())); + state.getPlayedCards(2).add(Wonder7Card.factory(LumberYard, state.getParams())); + state.getPlayedCards(0).add(Wonder7Card.factory(Apothecary, state.getParams())); fm.next(state, new PlayCard(1, Vineyard, true)); assertEquals(2, state.getGameScore(1), 0.001); assertEquals(6, state.getPlayerResources(1).get(Coin), 0.001); @@ -278,15 +278,15 @@ public void vineyardGivesMoney() { public void bazaarDoesNotIncludeResourcesOnWonder() { state.playerWonderBoard[1] = new Wonder7Board(Wonder7Board.Wonder.TheLighthouseOfAlexandria, 0); // Mfg goods state.playerWonderBoard[2] = new Wonder7Board(Wonder7Board.Wonder.TheTempleOfArtemisInEphesus, 0); // Raw materials - state.getPlayerHand(1).add(Wonder7Card.factory(Bazaar)); - state.getPlayedCards(1).add(Wonder7Card.factory(Press)); + state.getPlayerHand(1).add(Wonder7Card.factory(Bazaar, state.getParams())); + state.getPlayedCards(1).add(Wonder7Card.factory(Press, state.getParams())); fm.next(state, new PlayCard(1, Bazaar, true)); assertEquals(5, state.getPlayerResources(1).get(Coin), 0.001); } @Test public void arenaGivesMoneyAndPointsIndependently() { - state.getPlayerHand(2).add(Wonder7Card.factory(Arena)); + state.getPlayerHand(2).add(Wonder7Card.factory(Arena, state.getParams())); state.getPlayerWonderBoard(2).changeStage(); fm.next(state, new PlayCard(2, Arena, true)); assertEquals(6, state.getPlayerResources(2).get(Coin), 0.001); diff --git a/src/test/java/games/wonders7/WonderAbilities.java b/src/test/java/games/wonders7/WonderAbilities.java index 4cc21b361..1eb39174f 100644 --- a/src/test/java/games/wonders7/WonderAbilities.java +++ b/src/test/java/games/wonders7/WonderAbilities.java @@ -35,8 +35,8 @@ public void setup() { @Test public void olympiaLevel2BuildsFirstCardOfColourForFree() { state.playerWonderBoard[0] = new Wonder7Board(Wonder7Board.Wonder.TheStatueOfZeusInOlympia, 0); - state.getPlayerHand(0).add(Wonder7Card.factory(Palace)); - state.getPlayerHand(0).add(Wonder7Card.factory(University)); + state.getPlayerHand(0).add(Wonder7Card.factory(Palace, state.getParams())); + state.getPlayerHand(0).add(Wonder7Card.factory(University, state.getParams())); List actions = fm.computeAvailableActions(state); assertFalse(actions.contains(new ChooseCard(new PlayCard(0, Palace, true)))); assertFalse(actions.contains(new ChooseCard(new PlayCard(0, University, true)))); @@ -55,7 +55,7 @@ public void olympiaLevel2BuildsFirstCardOfColourForFree() { assertFalse(actions.contains(new ChooseCard(new PlayCard(0, Palace, false)))); assertFalse(actions.contains(new ChooseCard(new PlayCard(0, University, false)))); - state.getPlayedCards(0).add(Wonder7Card.factory(Altar)); + state.getPlayedCards(0).add(Wonder7Card.factory(Altar, state.getParams())); actions = fm.computeAvailableActions(state); assertFalse(actions.contains(new ChooseCard(new PlayCard(0, Palace, true)))); assertTrue(actions.contains(new ChooseCard(new PlayCard(0, University, true)))); @@ -67,7 +67,7 @@ public void olympiaLevel2BuildsFirstCardOfColourForFree() { public void halicarnassusLevel2BuildsForFreeFromDiscardPileAtEndOfTurn() { state.playerWonderBoard[1] = new Wonder7Board(Wonder7Board.Wonder.TheMausoleumOfHalicarnassus, 0); // at the end of the Age (and only then), if the second stage is built then the player can build a card from the discard pile for free - state.getDiscardPile().add(Wonder7Card.factory(Arena)); + state.getDiscardPile().add(Wonder7Card.factory(Arena, state.getParams())); for (int i = 0; i < 7; i++) { // take 7 actions (2 turns minus 1) List actions = fm.computeAvailableActions(state); int index = rnd.nextInt(actions.size()); @@ -119,7 +119,7 @@ public void halicarnassusLevel2BuildsForFreeFromDiscardPileAtEndOfTurn() { @Test public void halicarnassusNightSideResetsEffectUsed() { state.playerWonderBoard[1] = new Wonder7Board(Wonder7Board.Wonder.TheMausoleumOfHalicarnassus, 1); - state.getDiscardPile().add(Wonder7Card.factory(Arena)); + state.getDiscardPile().add(Wonder7Card.factory(Arena, state.getParams())); for (int i = 0; i < 7; i++) { // take 7 actions (2 turns minus 1) List actions = fm.computeAvailableActions(state); int index = rnd.nextInt(actions.size()); @@ -178,7 +178,7 @@ public void olympiaNightSideFirstCardOfAge() { assertEquals(7, state.playerHands.get(2).getSize()); for (int p = 0; p < 4; p++) { state.getPlayerHand(p).remove(6); // remove random card, add expensive one - state.getPlayerHand(p).add(Wonder7Card.factory(Palace)); + state.getPlayerHand(p).add(Wonder7Card.factory(Palace, state.getParams())); } } // we build the wonder during the first Age (so we can check it does not apply for the first card) @@ -214,7 +214,7 @@ public void olympiaNightSideLastCardOfAge() { // before the last action of each Age for (int p = 0; p < 4; p++) { state.getPlayerHand(p).remove(1); // remove random card, add expensive one - state.getPlayerHand(p).add(Wonder7Card.factory(Palace)); + state.getPlayerHand(p).add(Wonder7Card.factory(Palace, state.getParams())); } } // we build the wonder during the second Age (so we can check it does not apply for the first card) From 9c51fe0960133e6cf4d3219495562513a77340d7 Mon Sep 17 00:00:00 2001 From: George Date: Thu, 15 May 2025 10:31:18 +0100 Subject: [PATCH 2/6] All 7 Wonders Tests Pass --- src/main/java/games/wonders7/cards/Wonder7Card.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/games/wonders7/cards/Wonder7Card.java b/src/main/java/games/wonders7/cards/Wonder7Card.java index 749c63ff8..af9107bac 100644 --- a/src/main/java/games/wonders7/cards/Wonder7Card.java +++ b/src/main/java/games/wonders7/cards/Wonder7Card.java @@ -130,7 +130,7 @@ public static Wonder7Card factory(CardType cardType, Wonders7GameParameters para case Palace: return new Wonder7Card(cardType, CivilianStructures, Map.of(Wood, 1, Stone, 1, Clay, 1, Ore, 1, Glass, 1, Papyrus, 1, Textile, 1), - Map.of(Victory, params.victoryPalace), List.of(CardType.Altar)); + Map.of(Victory, params.victoryPalace)); case Tavern: return new Wonder7Card(cardType, CommercialStructures, emptyMap(), Map.of(Coin, params.tavernMoney)); case EastTradingPost, WestTradingPost, Marketplace: From 5ec8c08949e0c86e1580147d1b843d3e4cef3f55 Mon Sep 17 00:00:00 2001 From: George Date: Thu, 15 May 2025 11:41:30 +0100 Subject: [PATCH 3/6] Added metric for 7Wonders Params Used --- .../wonders7/Wonders7GameParameters.java | 2 +- .../wonders7/metrics/Wonders7Metrics.java | 98 +++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/src/main/java/games/wonders7/Wonders7GameParameters.java b/src/main/java/games/wonders7/Wonders7GameParameters.java index 8002b02de..0fa91e09c 100644 --- a/src/main/java/games/wonders7/Wonders7GameParameters.java +++ b/src/main/java/games/wonders7/Wonders7GameParameters.java @@ -49,7 +49,7 @@ public class Wonders7GameParameters extends TunableParameters { public int builderMultiplier = 1; public int decoratorVictoryPoints = 7; - public final String[] DEFAULT_WONDERS = new String[]{ + public static final String[] DEFAULT_WONDERS = new String[]{ Wonder7Board.Wonder.TheColossusOfRhodes.toString(), Wonder7Board.Wonder.TheLighthouseOfAlexandria.toString(), Wonder7Board.Wonder.TheTempleOfArtemisInEphesus.toString(), diff --git a/src/main/java/games/wonders7/metrics/Wonders7Metrics.java b/src/main/java/games/wonders7/metrics/Wonders7Metrics.java index 1029dfc8d..91d8f10c0 100644 --- a/src/main/java/games/wonders7/metrics/Wonders7Metrics.java +++ b/src/main/java/games/wonders7/metrics/Wonders7Metrics.java @@ -7,12 +7,110 @@ import evaluation.metrics.IMetricsCollection; import games.wonders7.Wonders7GameParameters; import games.wonders7.Wonders7GameState; +import games.wonders7.cards.Wonder7Board; import java.util.*; public class Wonders7Metrics implements IMetricsCollection { + /** + * Records the parameters chosen for the game that was played + */ + public static class ChosenParams extends AbstractMetric { + + @Override + protected boolean _run(MetricsGameListener listener, Event e, Map records) { + + Wonders7GameState state = (Wonders7GameState) e.state; + Wonders7GameParameters params = (Wonders7GameParameters) state.getGameParameters(); + + records.put("nWonderCardsPerPlayer", params.nWonderCardsPerPlayer); + records.put("nCostNeighbourResource", params.nCostNeighbourResource); + records.put("nCostDiscountedResource", params.nCostDiscountedResource); + records.put("nCoinsDiscard", params.nCoinsDiscard); + records.put("startingCoins", params.startingCoins); + + records.put("rawMaterialLow", params.rawMaterialLow); + records.put("rawMaterialHigh", params.rawMaterialHigh); + records.put("manufacturedMaterial", params.manufacturedMaterial); + records.put("victoryLow", params.victoryLow); + records.put("victoryMed", params.victoryMed); + records.put("victoryHigh", params.victoryHigh); + records.put("victoryVeryHigh", params.victoryVeryHigh); + records.put("victoryPantheon", params.victoryPantheon); + records.put("victoryPalace", params.victoryPalace); + records.put("tavernMoney", params.tavernMoney); + records.put("wildcardProduction", params.wildcardProduction); + records.put("commercialMultiplierLow", params.commercialMultiplierLow); + records.put("commercialMultiplierMed", params.commercialMultiplierMed); + records.put("commercialMultiplierHigh", params.commercialMultiplierHigh); + records.put("militaryLow", params.militaryLow); + records.put("militaryMed", params.militaryMed); + records.put("militaryHigh", params.militaryHigh); + records.put("scienceCompass", params.scienceCompass); + records.put("scienceTablet", params.scienceTablet); + records.put("scienceCog", params.scienceCog); + records.put("guildMultiplierLow", params.guildMultiplierLow); + records.put("guildMultiplierMed", params.guildMultiplierMed); + records.put("builderMultiplier", params.builderMultiplier); + records.put("decoratorVictoryPoints", params.decoratorVictoryPoints); + + for (String name : Wonders7GameParameters.DEFAULT_WONDERS) { + int isIncluded = params.wonders.contains(Wonder7Board.Wonder.valueOf(name)) ? 1 : 0; + records.put(name, isIncluded); + } + + return true; + } + + @Override + public Set getDefaultEventTypes() { + return Collections.singleton(Event.GameEvent.ABOUT_TO_START); + } + + @Override + public Map> getColumns(int nPlayersPerGame, Set playerNames) { + Map> columns = new HashMap<>(); + columns.put("nWonderCardsPerPlayer", Integer.class); + columns.put("nCostNeighbourResource", Integer.class); + columns.put("nCostDiscountedResource", Integer.class); + columns.put("nCoinsDiscard", Integer.class); + columns.put("startingCoins", Integer.class); + + columns.put("rawMaterialLow", Integer.class); + columns.put("rawMaterialHigh", Integer.class); + columns.put("manufacturedMaterial", Integer.class); + columns.put("victoryLow", Integer.class); + columns.put("victoryMed", Integer.class); + columns.put("victoryHigh", Integer.class); + columns.put("victoryVeryHigh", Integer.class); + columns.put("victoryPantheon", Integer.class); + columns.put("victoryPalace", Integer.class); + columns.put("tavernMoney", Integer.class); + columns.put("wildcardProduction", Integer.class); + columns.put("commercialMultiplierLow", Integer.class); + columns.put("commercialMultiplierMed", Integer.class); + columns.put("commercialMultiplierHigh", Integer.class); + columns.put("militaryLow", Integer.class); + columns.put("militaryMed", Integer.class); + columns.put("militaryHigh", Integer.class); + columns.put("scienceCompass", Integer.class); + columns.put("scienceTablet", Integer.class); + columns.put("scienceCog", Integer.class); + columns.put("guildMultiplierLow", Integer.class); + columns.put("guildMultiplierMed", Integer.class); + columns.put("builderMultiplier", Integer.class); + columns.put("decoratorVictoryPoints", Integer.class); + + for (String name : Wonders7GameParameters.DEFAULT_WONDERS) { + columns.put(name, Integer.class); + } + + return columns; + } + } + public static class GameSeeds extends AbstractMetric { @Override public boolean _run(MetricsGameListener listener, Event e, Map records) { From 7aee07eedf0b92b39a23a90fbaab125176bc62e9 Mon Sep 17 00:00:00 2001 From: George Date: Thu, 15 May 2025 17:23:26 +0100 Subject: [PATCH 4/6] Halicarnassus empty discard fix, and corrected values --- src/main/java/games/wonders7/actions/BuildFromDiscard.java | 7 ++++++- src/main/java/games/wonders7/cards/Wonder7Board.java | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/games/wonders7/actions/BuildFromDiscard.java b/src/main/java/games/wonders7/actions/BuildFromDiscard.java index 1c114221d..38e6b60b5 100644 --- a/src/main/java/games/wonders7/actions/BuildFromDiscard.java +++ b/src/main/java/games/wonders7/actions/BuildFromDiscard.java @@ -2,6 +2,7 @@ import core.AbstractGameState; import core.actions.AbstractAction; +import core.actions.DoNothing; import core.actions.OneShotExtendedAction; import games.wonders7.Wonders7ForwardModel; import games.wonders7.Wonders7GameState; @@ -24,7 +25,11 @@ public BuildFromDiscard(int player) { .map(c -> c.cardType) .distinct().toList(); available.removeAll(hasBuilt); - return available.stream().map(c -> new PlayCard(player, c, true, true)).collect(toList()); + List actions = available.stream().map(c -> new PlayCard(player, c, true, true)).collect(toList()); + if (actions.isEmpty()) { + actions.add(new DoNothing()); + } + return actions; } ); } diff --git a/src/main/java/games/wonders7/cards/Wonder7Board.java b/src/main/java/games/wonders7/cards/Wonder7Board.java index efe320b98..5d8db01c3 100644 --- a/src/main/java/games/wonders7/cards/Wonder7Board.java +++ b/src/main/java/games/wonders7/cards/Wonder7Board.java @@ -47,7 +47,7 @@ public enum Wonder { TheMausoleumOfHalicarnassus(Textile, List.of(Map.of(Ore, 2), Map.of(Glass, 1, Papyrus, 1), Map.of(Stone, 3)), List.of(Map.of(Victory, 3), emptyMap(), Map.of(Victory, 7)), - List.of(Map.of(Ore, 2), Map.of(Glass, 1, Papyrus, 1), Map.of(Stone, 3)), + List.of(Map.of(Clay, 2), Map.of(Glass, 1, Papyrus, 1), Map.of(Wood, 3)), List.of(Map.of(Victory, 2), Map.of(Victory, 1), emptyMap()) ), ThePyramidsOfGiza(Clay, From 49f5f4f1eda1acb5950a05693fb8b32eb2b4a804 Mon Sep 17 00:00:00 2001 From: George Date: Fri, 23 May 2025 09:44:20 +0100 Subject: [PATCH 5/6] Converted CantStop to TunableParameters --- .../games/cantstop/CantStopParameters.java | 86 +++++++++++++++---- .../cantstop/metrics/CantStopMetrics.java | 72 ++++++++++++++++ 2 files changed, 141 insertions(+), 17 deletions(-) create mode 100644 src/main/java/games/cantstop/metrics/CantStopMetrics.java diff --git a/src/main/java/games/cantstop/CantStopParameters.java b/src/main/java/games/cantstop/CantStopParameters.java index b8cd32c01..84882bb29 100644 --- a/src/main/java/games/cantstop/CantStopParameters.java +++ b/src/main/java/games/cantstop/CantStopParameters.java @@ -1,8 +1,13 @@ package games.cantstop; import core.AbstractParameters; +import core.Game; +import evaluation.optimisation.TunableParameters; +import games.GameType; -public class CantStopParameters extends AbstractParameters { +import java.util.Arrays; + +public class CantStopParameters extends TunableParameters { /* This could have been implemented as an array, but this more verbose set up makes it easier for @@ -14,22 +19,64 @@ public class CantStopParameters extends AbstractParameters { - Moving onto an occupied space instead means you jump to the next unoccupied one */ - public final int TWO_MAX = 2; - public final int THREE_MAX = 4; - public final int FOUR_MAX = 6; - public final int FIVE_MAX = 8; - public final int SIX_MAX = 10; - public final int SEVEN_MAX = 12; - public final int EIGHT_MAX = 10; - public final int NINE_MAX = 8; - public final int TEN_MAX = 6; - public final int ELEVEN_MAX = 4; - public final int TWELVE_MAX = 2; - - public final int DICE_NUMBER = 4; // If you change this, then you'll need to also update code in ForwardModel._computeAvailableActions() - public final int DICE_SIDES = 6; - public final int COLUMNS_TO_WIN = 3; - public final int MARKERS = 3; // number of temporary markers + public int TWO_MAX = 2; + public int THREE_MAX = 4; + public int FOUR_MAX = 6; + public int FIVE_MAX = 8; + public int SIX_MAX = 10; + public int SEVEN_MAX = 12; + public int EIGHT_MAX = 10; + public int NINE_MAX = 8; + public int TEN_MAX = 6; + public int ELEVEN_MAX = 4; + public int TWELVE_MAX = 2; + + public int DICE_NUMBER = 4; // If you change this, then you'll need to also update code in ForwardModel._computeAvailableActions() + public int DICE_SIDES = 6; + public int COLUMNS_TO_WIN = 3; + public int MARKERS = 3; // number of temporary markers + + public CantStopParameters() { + // Column sizes + addTunableParameter("TWO_MAX", 2, Arrays.asList(1,2,3,4,5)); + addTunableParameter("THREE_MAX", 4, Arrays.asList(2,3,4,5,6)); + addTunableParameter("FOUR_MAX", 6, Arrays.asList(4,5,6,7,8)); + addTunableParameter("FIVE_MAX", 8, Arrays.asList(6,7,8,9,10)); + addTunableParameter("SIX_MAX", 10, Arrays.asList(8,9,10,11,12)); + addTunableParameter("SEVEN_MAX", 12, Arrays.asList(10,11,12,13,14)); + addTunableParameter("EIGHT_MAX", 10, Arrays.asList(8,9,10,11,12)); + addTunableParameter("NINE_MAX", 8, Arrays.asList(6,7,8,9,10)); + addTunableParameter("TEN_MAX", 6, Arrays.asList(4,5,6,7,8)); + addTunableParameter("ELEVEN_MAX", 4, Arrays.asList(2,3,4,5,6)); + addTunableParameter("TWELVE_MAX", 2, Arrays.asList(1,2,3,4,5)); + + addTunableParameter("DICE_NUMBER", 4); + addTunableParameter("DICE_SIDES", 6); + addTunableParameter("COLUMNS_TO_WIN", 3, Arrays.asList(2, 3, 4, 5, 6)); + addTunableParameter("MARKERS", 3, Arrays.asList(2, 3, 4, 5, 6)); + + } + + @Override + public void _reset() { + // Column sizes + TWO_MAX = (int) getParameterValue("TWO_MAX"); + THREE_MAX = (int) getParameterValue("THREE_MAX"); + FOUR_MAX = (int) getParameterValue("FOUR_MAX"); + FIVE_MAX = (int) getParameterValue("FIVE_MAX"); + SIX_MAX = (int) getParameterValue("SIX_MAX"); + SEVEN_MAX = (int) getParameterValue("SEVEN_MAX"); + EIGHT_MAX = (int) getParameterValue("EIGHT_MAX"); + NINE_MAX = (int) getParameterValue("NINE_MAX"); + TEN_MAX = (int) getParameterValue("TEN_MAX"); + ELEVEN_MAX = (int) getParameterValue("ELEVEN_MAX"); + TWELVE_MAX = (int) getParameterValue("TWELVE_MAX"); + + DICE_NUMBER = (int) getParameterValue("DICE_NUMBER"); + DICE_SIDES = (int) getParameterValue("DICE_SIDES"); + COLUMNS_TO_WIN = (int) getParameterValue("COLUMNS_TO_WIN"); + MARKERS = (int) getParameterValue("MARKERS"); + } public int maxValue(int number) { switch (number) { @@ -69,4 +116,9 @@ protected AbstractParameters _copy() { protected boolean _equals(Object o) { return o instanceof CantStopParameters; } + + @Override + public Object instantiate() { + return new Game(GameType.CantStop, new CantStopForwardModel(), new CantStopGameState(this, GameType.CantStop.getMinPlayers())); + } } diff --git a/src/main/java/games/cantstop/metrics/CantStopMetrics.java b/src/main/java/games/cantstop/metrics/CantStopMetrics.java new file mode 100644 index 000000000..636ad004d --- /dev/null +++ b/src/main/java/games/cantstop/metrics/CantStopMetrics.java @@ -0,0 +1,72 @@ +package games.cantstop.metrics; + +import core.interfaces.IGameEvent; +import evaluation.listeners.MetricsGameListener; +import evaluation.metrics.AbstractMetric; +import evaluation.metrics.Event; +import evaluation.metrics.IMetricsCollection; +import games.cantstop.CantStopGameState; +import games.cantstop.CantStopParameters; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class CantStopMetrics implements IMetricsCollection { + + public static class ChosenParams extends AbstractMetric { + + @Override + protected boolean _run(MetricsGameListener listener, Event e, Map records) { + + CantStopGameState state = (CantStopGameState) e.state; + CantStopParameters params = (CantStopParameters) state.getGameParameters(); + + records.put("TWO_MAX", params.TWO_MAX); + records.put("THREE_MAX", params.THREE_MAX); + records.put("FOUR_MAX", params.FOUR_MAX); + records.put("FIVE_MAX", params.FIVE_MAX); + records.put("SIX_MAX", params.SIX_MAX); + records.put("SEVEN_MAX", params.SEVEN_MAX); + records.put("EIGHT_MAX", params.EIGHT_MAX); + records.put("NINE_MAX", params.NINE_MAX); + records.put("TEN_MAX", params.TEN_MAX); + records.put("ELEVEN_MAX", params.ELEVEN_MAX); + records.put("TWELVE_MAX", params.TWELVE_MAX); + + records.put("DICE_NUMBER", params.DICE_NUMBER); + records.put("DICE_SIDES", params.DICE_SIDES); + records.put("COLUMNS_TO_WIN", params.COLUMNS_TO_WIN); + records.put("MARKERS", params.MARKERS); + return true; + } + + @Override + public Set getDefaultEventTypes() { + return Collections.singleton(Event.GameEvent.ABOUT_TO_START); + } + + @Override + public Map> getColumns(int nPlayersPerGame, Set playerNames) { + Map> columns = new HashMap<>(); + columns.put("TWO_MAX", Integer.class); + columns.put("THREE_MAX", Integer.class); + columns.put("FOUR_MAX", Integer.class); + columns.put("FIVE_MAX", Integer.class); + columns.put("SIX_MAX", Integer.class); + columns.put("SEVEN_MAX", Integer.class); + columns.put("EIGHT_MAX", Integer.class); + columns.put("NINE_MAX", Integer.class); + columns.put("TEN_MAX", Integer.class); + columns.put("ELEVEN_MAX", Integer.class); + columns.put("TWELVE_MAX", Integer.class); + + columns.put("DICE_NUMBER", Integer.class); + columns.put("DICE_SIDES", Integer.class); + columns.put("COLUMNS_TO_WIN", Integer.class); + columns.put("MARKERS", Integer.class); + return columns; + } + } +} From e9899670cb0a5509ce8b581fe454b9743824ad55 Mon Sep 17 00:00:00 2001 From: George Date: Wed, 4 Jun 2025 11:35:07 +0100 Subject: [PATCH 6/6] Made DICE_NUMBER & DICE_SIDES untunable --- src/main/java/games/cantstop/CantStopParameters.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/games/cantstop/CantStopParameters.java b/src/main/java/games/cantstop/CantStopParameters.java index 84882bb29..6170aa2bb 100644 --- a/src/main/java/games/cantstop/CantStopParameters.java +++ b/src/main/java/games/cantstop/CantStopParameters.java @@ -32,7 +32,7 @@ public class CantStopParameters extends TunableParameters { public int TWELVE_MAX = 2; public int DICE_NUMBER = 4; // If you change this, then you'll need to also update code in ForwardModel._computeAvailableActions() - public int DICE_SIDES = 6; + public int DICE_SIDES = 6; // Same here (but with scoring) public int COLUMNS_TO_WIN = 3; public int MARKERS = 3; // number of temporary markers @@ -50,8 +50,6 @@ public CantStopParameters() { addTunableParameter("ELEVEN_MAX", 4, Arrays.asList(2,3,4,5,6)); addTunableParameter("TWELVE_MAX", 2, Arrays.asList(1,2,3,4,5)); - addTunableParameter("DICE_NUMBER", 4); - addTunableParameter("DICE_SIDES", 6); addTunableParameter("COLUMNS_TO_WIN", 3, Arrays.asList(2, 3, 4, 5, 6)); addTunableParameter("MARKERS", 3, Arrays.asList(2, 3, 4, 5, 6)); @@ -72,8 +70,6 @@ public void _reset() { ELEVEN_MAX = (int) getParameterValue("ELEVEN_MAX"); TWELVE_MAX = (int) getParameterValue("TWELVE_MAX"); - DICE_NUMBER = (int) getParameterValue("DICE_NUMBER"); - DICE_SIDES = (int) getParameterValue("DICE_SIDES"); COLUMNS_TO_WIN = (int) getParameterValue("COLUMNS_TO_WIN"); MARKERS = (int) getParameterValue("MARKERS"); }