[Jrisk-cvs] SF.net SVN: domination-code:[2546] RiskAI
Brought to you by:
yuranet
|
From: <yu...@us...> - 2024-06-03 21:40:59
|
Revision: 2546
http://sourceforge.net/p/domination/code/2546
Author: yuranet
Date: 2024-06-03 21:40:56 +0000 (Mon, 03 Jun 2024)
Log Message:
-----------
gameOver method called on ai cleanup
Modified Paths:
--------------
RiskAI/source/JRiskAI/src/net/yura/domination/engine/ai/framework/AIPlayerFrameworkAbstract.java
RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/Module_Output/O_IG_MissionEstimate.java
RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/T_Game.java
RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/T_TrainingExampleWriter.java
RiskAI/source/JRiskAI/src/risk/AI/Modules/AI_Framework.java
RiskAI/source/JRiskAI/src/risk/AI/Modules/InformationGivers/C_IG_Mission.java
RiskAI/source/JRiskAI/src/risk/AI/Modules/MasterPrioritizer/C_MasterPrioritizer.java
RiskAI/source/TrainingDataConverter/src/trainingdataconverter/trainingdata/TrainingData.java
Property Changed:
----------------
RiskAI/
Index: RiskAI
===================================================================
--- RiskAI 2024-06-03 21:25:29 UTC (rev 2545)
+++ RiskAI 2024-06-03 21:40:56 UTC (rev 2546)
Property changes on: RiskAI
___________________________________________________________________
Added: svn:ignore
## -0,0 +1 ##
+target
Modified: RiskAI/source/JRiskAI/src/net/yura/domination/engine/ai/framework/AIPlayerFrameworkAbstract.java
===================================================================
--- RiskAI/source/JRiskAI/src/net/yura/domination/engine/ai/framework/AIPlayerFrameworkAbstract.java 2024-06-03 21:25:29 UTC (rev 2545)
+++ RiskAI/source/JRiskAI/src/net/yura/domination/engine/ai/framework/AIPlayerFrameworkAbstract.java 2024-06-03 21:40:56 UTC (rev 2546)
@@ -49,12 +49,12 @@
// TODO YURA it seems the AI has been trained on a board with East-Africa - Middle-East connection present
this.aiSettings = new T_AISettings("AIPlayerFrameworkSettings.txt");
- this.trainingExample = new T_TrainingExampleWriter(riskGame, aiSettings, aiSettings.saveTrainingExample, "../ai-data/");
this.past = new T_Past(riskGame.getPlayers(), new java.util.Vector(Arrays.asList(riskGame.getContinents())));
this.board = new T_Board(riskGame);
+
this.game = new T_Game(riskGame, board, aiSettings);
-
+ this.trainingExample = new T_TrainingExampleWriter(riskGame, aiSettings, aiSettings.saveTrainingExample, "../ai-data/");
this.trainingExample.init(riskGame); // this used to be done AFTER player init, but i hope it will work if done before
}
@@ -99,15 +99,14 @@
return this.trainingExample;
}
- // TODO YURA: this needs to be called
- public void gameOver(Player currentPlayer) {
+ public void gameOver(Player winner) {
this.trainingExample.endAllFrameworkTimer();
- this.trainingExample.closeGameAndSave(currentPlayer);
+ this.trainingExample.closeGameAndSave(winner);
if (this.aiSettings.saveWinnerFile) {
- this.trainingExample.saveWinnerFile(currentPlayer, this.winnerStatsDir);
+ this.trainingExample.saveWinnerFile(winner, this.winnerStatsDir);
}
if (this.aiSettings.saveFullGameStats) {
- this.trainingExample.saveGameStats(currentPlayer, aiPlayers);
+ this.trainingExample.saveGameStats(winner, aiPlayers);
}
}
}
@@ -114,9 +113,20 @@
@Override
public void setGame(RiskGame riskGame) {
- Player currentplayer = riskGame.getCurrentPlayer();
- AIPlayerFrameworkGlobal ais = gameGlobal.computeIfAbsent(riskGame, k -> new AIPlayerFrameworkGlobal(riskGame));
- currentFrameworkAI = ais.getFrameworkAI(currentplayer);
+ if (riskGame == null) {
+ for (AIPlayerFrameworkGlobal global : gameGlobal.values()) {
+ if (global.riskGame.getState() == RiskGame.STATE_GAME_OVER) {
+ global.gameOver(global.riskGame.getCurrentPlayer());
+ gameGlobal.remove(global.riskGame);
+ return;
+ }
+ }
+ }
+ else {
+ Player currentplayer = riskGame.getCurrentPlayer();
+ AIPlayerFrameworkGlobal ais = gameGlobal.computeIfAbsent(riskGame, k -> new AIPlayerFrameworkGlobal(riskGame));
+ currentFrameworkAI = ais.getFrameworkAI(currentplayer);
+ }
}
@Override
Modified: RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/Module_Output/O_IG_MissionEstimate.java
===================================================================
--- RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/Module_Output/O_IG_MissionEstimate.java 2024-06-03 21:25:29 UTC (rev 2545)
+++ RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/Module_Output/O_IG_MissionEstimate.java 2024-06-03 21:40:56 UTC (rev 2546)
@@ -30,7 +30,7 @@
return highestEstimateIndex;
}
- public Mission getMostLikelyMission(int player, Vector missionList) {
+ public Mission getMostLikelyMission(int player, List missionList) {
return (Mission)missionList.get(calcHighestEstimateIndex(player));
}
Modified: RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/T_Game.java
===================================================================
--- RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/T_Game.java 2024-06-03 21:25:29 UTC (rev 2545)
+++ RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/T_Game.java 2024-06-03 21:40:56 UTC (rev 2546)
@@ -25,11 +25,41 @@
// TODO YURA why is this here? can it be removed and loaded from the map?
public static final String[] CONTINENT_NAMES = {"North-America", "South-America", "Europe", "Africa", "Asia", "Australia"};
- public static final String[] MISSION_NAMES = {"Asia_SouthAmerica", "Europe_Australia_3rd", "Asia_Africa", "Europe_SouthAmerica_3rd", "NorthAmerica_Australia", "NorthAmerica_Africa", "18_Territories", "24_Territories", "Kill_Player1", "Kill_Player2", "Kill_Player3", "Kill_Player4", "Kill_Player5", "Kill_Player6"};
- public static final String[] MODULE_NAMES = {"ig_mission", "ig_winning", "ig_nextmove", "ig_continent", "master_prioritizer",
- "rp_makeattackplan", "rp_ap_cost", "rp_ap_priority", "rp_discardattackplan",
- "rp_de_cost", "rp_de_priority", "rp_cashcards", "rp_placearmies", "rp_scoreattackplan",
- "rp_fortify", "initialplacement", "rp_scoremergedplan"};
+ public static final String[] MISSION_NAMES = {
+ "Asia_SouthAmerica",
+ "Europe_Australia_3rd",
+ "Asia_Africa",
+ "Europe_SouthAmerica_3rd",
+ "NorthAmerica_Australia",
+ "NorthAmerica_Africa",
+ "18_Territories",
+ "24_Territories",
+ "Kill_Player1",
+ "Kill_Player2",
+ "Kill_Player3",
+ "Kill_Player4",
+ "Kill_Player5",
+ "Kill_Player6"};
+ public static final String[] MODULE_NAMES = { // size: 17
+ "ig_mission", // 0
+ "ig_winning", // 1
+ "ig_nextmove", // 2
+ "ig_continent", // 3
+ "master_prioritizer", // 4
+ "rp_makeattackplan", // 5
+ "rp_ap_cost", // 6
+ "rp_ap_priority", // 7
+ "rp_discardattackplan", // 8
+ "rp_de_cost", // 9
+ "rp_de_priority", // 10
+ "rp_cashcards", // 11
+ "rp_placearmies", // 12
+ "rp_scoreattackplan", // 13
+ "rp_fortify", // 14
+ "initialplacement", // 15
+ "rp_scoremergedplan" // 16
+ };
+
public static final String[][] AI_TECHNIQUES = {{"script", "nn"},
{"script", "nn", "nb", "nn_wo", "bn"},
{"script", "nn_wo"},
@@ -55,7 +85,8 @@
NUMBER_OF_GOALS = 38;
private RiskGame game;
- private T_AISettings aiSettings;
+
+ private T_AISettings aiSettings;
private T_BattleOutcomeProbTable battleOutcomeProbTable = new T_BattleOutcomeProbTable();
private T_Board board;
public static final double[] reinforcementsFromCards = {0.0, 0.0, 0.0, 3.73132, 7.1289, 8.91622, 9.4314, 9.70446, 9.84778, 9.91876, 9.95572};
@@ -234,9 +265,12 @@
case ColorUtil.YELLOW: return "yellow";
default: return null;
}
- }
-
- /** Returns a decent String-version of a mission. If player is null, it is simply a converter. If player is not null, then the players mission is tranformed to the 24-mission when necessary. */
+ }
+
+ /**
+ * Returns a decent String-version of a mission. If player is null, it is simply a converter.
+ * If player is not null, then the players mission is tranformed to the 24-mission when necessary.
+ */
public static String decentMissionToString(Mission m, Player p) {
if (m.getContinent1() != null) {
if (m.getContinent3() == null) {
Modified: RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/T_TrainingExampleWriter.java
===================================================================
--- RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/T_TrainingExampleWriter.java 2024-06-03 21:25:29 UTC (rev 2545)
+++ RiskAI/source/JRiskAI/src/risk/AI/Data_Structures/T_TrainingExampleWriter.java 2024-06-03 21:40:56 UTC (rev 2546)
@@ -17,11 +17,12 @@
import risk.AI.AIPlayerFramework;
public class T_TrainingExampleWriter {
-
+
private final String[] module_names = {"ig_mission","ig_continent","ig_winning",
"master_prioritizer",
"rp_cashcards", "rp_placearmies", "rp_fortify",
"initialplacement", "attack_plan", "defense_plan"};
+
/*{"ig_mission","ig_continent","ig_winning", "ig_nextmove",
"master_prioritizer", "initialplacement",
"rp_ap_cost", "rp_ap_priority", "rp_makeattackplan", "rp_discardplan", "rp_de_cost", "rp_de_priority",
@@ -30,7 +31,8 @@
private Random rand = new Random();
private Vector trainingExamples = new Vector();
private boolean recordTrainingData;
- private RiskGame game;
+ private final RiskGame game;
+
private T_AISettings settings;
private String currentBoardFile;
private T_TrainingExample currentBoardTrainingExample;
Modified: RiskAI/source/JRiskAI/src/risk/AI/Modules/AI_Framework.java
===================================================================
--- RiskAI/source/JRiskAI/src/risk/AI/Modules/AI_Framework.java 2024-06-03 21:25:29 UTC (rev 2545)
+++ RiskAI/source/JRiskAI/src/risk/AI/Modules/AI_Framework.java 2024-06-03 21:40:56 UTC (rev 2546)
@@ -4,23 +4,51 @@
import net.yura.domination.engine.core.Country;
import net.yura.domination.engine.core.Mission;
import net.yura.domination.engine.core.Player;
+import risk.AI.Data_Structures.Module_Input.I_IG_ContinentEstimate;
+import risk.AI.Data_Structures.Module_Input.I_IG_MissionEstimate;
+import risk.AI.Data_Structures.Module_Input.I_IG_NextMoveEstimate;
+import risk.AI.Data_Structures.Module_Input.I_IG_Ownership;
+import risk.AI.Data_Structures.Module_Input.I_IG_WinningEstimate;
+import risk.AI.Data_Structures.Module_Input.I_InitialPlacement;
+import risk.AI.Data_Structures.Module_Input.I_MP_GoalDistribution;
+import risk.AI.Data_Structures.Module_Input.I_RP_ScoreMergedPlans;
import risk.AI.Data_Structures.Module_Output.O_IG_Ownership;
import risk.AI.Data_Structures.Module_Output.O_IG_WinningEstimate;
-import risk.AI.Modules.InformationGivers.*;
-import risk.AI.Modules.RoundPlanner.*;
-import risk.AI.Modules.MasterPrioritizer.*;
-import risk.AI.Techniques.Pathfinding.*;
-import risk.AI.Data_Structures.*;
-import risk.AI.Data_Structures.Module_Input.*;
-import java.util.*;
+import risk.AI.Data_Structures.T_Board;
+import risk.AI.Data_Structures.T_Game;
+import risk.AI.Data_Structures.T_InfluenceMap;
+import risk.AI.Data_Structures.T_Opp_RiskCards;
+import risk.AI.Data_Structures.T_Past;
+import risk.AI.Data_Structures.T_RP_AttackPlanList;
+import risk.AI.Data_Structures.T_RP_AttackPlanListElement;
+import risk.AI.Data_Structures.T_RP_DefenseList;
+import risk.AI.Data_Structures.T_RP_DefenseListElement;
+import risk.AI.Data_Structures.T_RP_MergedPlanElement;
+import risk.AI.Data_Structures.T_RP_MergedPlanList;
+import risk.AI.Data_Structures.T_TrainingExampleWriter;
+import risk.AI.Modules.InformationGivers.C_IG_Continent;
+import risk.AI.Modules.InformationGivers.C_IG_Mission;
+import risk.AI.Modules.InformationGivers.C_IG_NextMove;
+import risk.AI.Modules.InformationGivers.C_IG_Ownership;
+import risk.AI.Modules.InformationGivers.C_IG_Winning;
+import risk.AI.Modules.MasterPrioritizer.C_MasterPrioritizer;
+import risk.AI.Modules.RoundPlanner.C_RP_Attack;
+import risk.AI.Modules.RoundPlanner.C_RP_Fortify;
+import risk.AI.Modules.RoundPlanner.C_RP_InitPlacement;
+import risk.AI.Modules.RoundPlanner.C_RP_Planner;
+import risk.AI.Modules.RoundPlanner.C_RP_Reinforce;
+import risk.AI.Modules.RoundPlanner.C_RP_ScoreMergedPlans;
+import risk.AI.Techniques.Pathfinding.Pathfinder;
+import java.util.Random;
+import java.util.Vector;
public class AI_Framework {
-
+
private Random rand = new Random(); // used in selectCapital only.
-
+
private final boolean debugging = false;
private final boolean outputLog = false;
-
+
protected C_IG_Mission igMission_module;
protected C_IG_Winning igWinning_module;
protected C_IG_NextMove igNextMove_module;
@@ -34,7 +62,7 @@
private C_RP_InitPlacement rpInitPlacement_module;
private C_RP_ScoreMergedPlans rpScoreMergedPlans_module;
//private C_RP_MakeSimpleAttackPlan rpMakeSimpleAttackPlan_module;
-
+
protected T_Past past;
protected T_Board board;
protected T_Opp_RiskCards opp_risk_cards;
@@ -43,25 +71,25 @@
private O_IG_Ownership continentDistribution; // Bruges til at finde ud af om man lige pludselig ejer et continent.
private int lastBattleArmiesLost = 0;
private boolean beginningOfTurn;
-
+
private Pathfinder pathfinder;
protected Player player;
protected Mission ownMission;
protected T_InfluenceMap attackerArmiesLeftMap;
-
+
protected String[] types;
-
+
private Vector frameworkLog = new Vector();
-
+
private boolean newTurn = true;
-
+
private T_RP_MergedPlanList mergedPlanList = null;
private boolean reviseAttackPlanNow = true;
private boolean isFirstRoundEver;
-
+
/** Are we following a simple attack plan just to gain a Risk card? */
//private boolean isAttackingSimple;
-
+
/**
* types[0]: type of igMission<br>
* types[1]: type of igWinning<br>
@@ -84,7 +112,7 @@
*/
public AI_Framework() {
}
-
+
public AI_Framework(String[] types, Player player, Mission ownMission, T_TrainingExampleWriter trainingExample) {
this.types = types;
this.player = player;
@@ -91,7 +119,7 @@
this.ownMission = ownMission; // Overridden by init(). But igNextMove does not call init() and should not call init()!.
this.trainingExample = trainingExample;
}
-
+
public void init(T_Past past, T_Game game, T_Board board) {
this.past = past;
this.board = board;
Modified: RiskAI/source/JRiskAI/src/risk/AI/Modules/InformationGivers/C_IG_Mission.java
===================================================================
--- RiskAI/source/JRiskAI/src/risk/AI/Modules/InformationGivers/C_IG_Mission.java 2024-06-03 21:25:29 UTC (rev 2545)
+++ RiskAI/source/JRiskAI/src/risk/AI/Modules/InformationGivers/C_IG_Mission.java 2024-06-03 21:40:56 UTC (rev 2546)
@@ -105,7 +105,7 @@
private void script_run(T_Past past) {
int numOfPlayers = game.getPlayerCount();
- Vector missions = game.getMissions();
+ List missions = game.getMissions();
output = new O_IG_MissionEstimate();
for (int i = 0; i < numOfPlayers; i++) {
double totalAttacks = (double)past.getTotalAttacksByPlayer(i);
Modified: RiskAI/source/JRiskAI/src/risk/AI/Modules/MasterPrioritizer/C_MasterPrioritizer.java
===================================================================
--- RiskAI/source/JRiskAI/src/risk/AI/Modules/MasterPrioritizer/C_MasterPrioritizer.java 2024-06-03 21:25:29 UTC (rev 2545)
+++ RiskAI/source/JRiskAI/src/risk/AI/Modules/MasterPrioritizer/C_MasterPrioritizer.java 2024-06-03 21:40:56 UTC (rev 2546)
@@ -25,9 +25,9 @@
private O_MP_GoalDistribution output;
private int currentPlayerIndex;
private Mission ownMission;
- private Vector<Mission> missions;
+ private List<Mission> missions;
private List<Continent> continents;
- private Vector<Player> playersInGame;
+ private List<Player> playersInGame;
private risk.AI.Data_Structures.T_Game game;
private T_TrainingExampleWriter trainingExample;
//private O_IG_NextMoveEstimate nextMove;
@@ -38,10 +38,10 @@
this.type = type;
this.currentPlayerIndex = currentPlayerIndex;
this.continents = continents;
- this.missions = (Vector<Mission>)game.getMissions();
+ this.missions = game.getMissions();
this.ownMission = ownMission;
this.game = game;
- this.playersInGame = (Vector<Player>)game.getPlayers();
+ this.playersInGame = game.getPlayers();
this.trainingExample = trainingExample;
loadModel();
}
Modified: RiskAI/source/TrainingDataConverter/src/trainingdataconverter/trainingdata/TrainingData.java
===================================================================
--- RiskAI/source/TrainingDataConverter/src/trainingdataconverter/trainingdata/TrainingData.java 2024-06-03 21:25:29 UTC (rev 2545)
+++ RiskAI/source/TrainingDataConverter/src/trainingdataconverter/trainingdata/TrainingData.java 2024-06-03 21:40:56 UTC (rev 2546)
@@ -9,6 +9,7 @@
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Vector;
+import net.yura.domination.engine.core.RiskGame;
import progressstats.ProgressStats;
import risk.AI.Data_Structures.T_Game;
import trainingdataconverter.trainingdata.gamedata.BeginningOfTurnAttribute;
@@ -24,19 +25,26 @@
import trainingdataconverter.trainingdata.winnerloser.WinnerLoserFileList;
public class TrainingData {
- public static final String[] CONTINENT_NAMES;
- public static final String[] MISSION_NAMES;
- public static final String[] TERRITORY_NAMES;
- public static final String[][] TERRITORIES_IN_CONTINENTS;
- public static final int[] CONTINENTS_VALUE;
- public static final int NUMBER_OF_PLAYERS_MAX = 6;
- public static final int NUMBER_OF_TERRITORIES = 42;
+ public static final String[] CONTINENT_NAMES = T_Game.CONTINENT_NAMES;
+ public static final int[] CONTINENTS_VALUE = new int[]{5, 2, 5, 3, 7, 2};
+ public static final String[][] TERRITORIES_IN_CONTINENTS = new String[][]{{"Alaska", "North-West-Territory", "Alberta", "Western-United-States", "Central-America", "Greenland", "Ontario", "Quebec", "Eastern-United-States"}, {"Venezuela", "Peru", "Brazil", "Argentina"}, {"Iceland", "Scandinavia", "Ukraine", "Great-Britain", "Northern-Europe", "Western-Europe", "Southern-Europe"}, {"North-Africa", "Egypt", "Congo", "East-Africa", "South-Africa", "Madagascar"}, {"Siberia", "Ural", "China", "Afghanistan", "Middle-East", "India", "Siam", "Yakutsk", "Irkutsk", "Mongolia", "Japan", "Kamchatka"}, {"Indonesia", "New-Guinea", "Western-Australia", "Eastern-Australia"}};
+
+ public static final String[] TERRITORY_NAMES = new String[]{"Alaska", "North-West-Territory", "Alberta", "Western-United-States", "Central-America", "Greenland", "Ontario", "Quebec", "Eastern-United-States", "Venezuela", "Peru", "Brazil", "Argentina", "Iceland", "Scandinavia", "Ukraine", "Great-Britain", "Northern-Europe", "Western-Europe", "Southern-Europe", "North-Africa", "Egypt", "Congo", "East-Africa", "South-Africa", "Madagascar", "Siberia", "Ural", "China", "Afghanistan", "Middle-East", "India", "Siam", "Yakutsk", "Irkutsk", "Mongolia", "Japan", "Kamchatka", "Indonesia", "New-Guinea", "Western-Australia", "Eastern-Australia"};
+ public static final int NUMBER_OF_TERRITORIES = TERRITORY_NAMES.length;
+
+ public static final int NUMBER_OF_PLAYERS_MAX = RiskGame.MAX_PLAYERS;
+ public static final String[] MISSION_NAMES = T_Game.MISSION_NAMES;
+
+ public static final double[] REINFORCEMENTS_FROM_CARDS = T_Game.reinforcementsFromCards;
+
+/*
public static final int NUMBER_OF_CONTINENTS = 6;
public static final int NUMBER_OF_MISSIONS = 14;
public static final int NUMBER_OF_GOALS = 38;
public static final int NUMBER_OF_ROUNDS_PREDICTED = 5;
- public static final double[] REINFORCEMENTS_FROM_CARDS;
protected static final int SAVED_GAMEDATA_SET_SIZE = 50;
+*/
+
protected GameData[] gameDataArray;
public TrainingData() {
@@ -997,7 +1005,7 @@
} else if (split[0].equals(CONTINENT_NAMES[0]) && split[1].equals(CONTINENT_NAMES[3])) {
return 5;
} else {
- throw new UnsupportedOperationException("Did not find a matching mission!");
+ throw new IllegalArgumentException("Did not find a matching mission!");
}
}
}
@@ -1008,18 +1016,9 @@
}
if (i == -1) {
- throw new UnsupportedOperationException("Could not find the color of a player in the player-array!");
+ throw new IllegalArgumentException("Could not find the color of a player in the player-array!");
} else {
return i;
}
}
-
- static {
- CONTINENT_NAMES = T_Game.CONTINENT_NAMES;
- MISSION_NAMES = T_Game.MISSION_NAMES;
- TERRITORY_NAMES = new String[]{"Alaska", "North-West-Territory", "Alberta", "Western-United-States", "Central-America", "Greenland", "Ontario", "Quebec", "Eastern-United-States", "Venezuela", "Peru", "Brazil", "Argentina", "Iceland", "Scandinavia", "Ukraine", "Great-Britain", "Northern-Europe", "Western-Europe", "Southern-Europe", "North-Africa", "Egypt", "Congo", "East-Africa", "South-Africa", "Madagascar", "Siberia", "Ural", "China", "Afghanistan", "Middle-East", "India", "Siam", "Yakutsk", "Irkutsk", "Mongolia", "Japan", "Kamchatka", "Indonesia", "New-Guinea", "Western-Australia", "Eastern-Australia"};
- TERRITORIES_IN_CONTINENTS = new String[][]{{"Alaska", "North-West-Territory", "Alberta", "Western-United-States", "Central-America", "Greenland", "Ontario", "Quebec", "Eastern-United-States"}, {"Venezuela", "Peru", "Brazil", "Argentina"}, {"Iceland", "Scandinavia", "Ukraine", "Great-Britain", "Northern-Europe", "Western-Europe", "Southern-Europe"}, {"North-Africa", "Egypt", "Congo", "East-Africa", "South-Africa", "Madagascar"}, {"Siberia", "Ural", "China", "Afghanistan", "Middle-East", "India", "Siam", "Yakutsk", "Irkutsk", "Mongolia", "Japan", "Kamchatka"}, {"Indonesia", "New-Guinea", "Western-Australia", "Eastern-Australia"}};
- CONTINENTS_VALUE = new int[]{5, 2, 5, 3, 7, 2};
- REINFORCEMENTS_FROM_CARDS = T_Game.reinforcementsFromCards;
- }
}
|