/**
* Copyright (C) 2002-2012 The FreeCol Team
*
* This file is part of FreeCol.
*
* FreeCol is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* FreeCol is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FreeCol. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.freecol;
//import com.erik.repackaged.java.awt.Dimension;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.Thread.UncaughtExceptionHandler;
import java.security.SecureRandom;
import java.util.Locale;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.freecol.client.FreeColClient;
import net.sf.freecol.client.gui.i18n.Messages;
import net.sf.freecol.common.FreeColException;
import net.sf.freecol.common.io.FreeColTcFile;
import net.sf.freecol.common.logging.DefaultHandler;
import android.app.Activity;
import android.content.Context;
//import net.sf.freecol.server.FreeColServer;
//import org.apache.commons.cli.CommandLine;
//import org.apache.commons.cli.CommandLineParser;
//import org.apache.commons.cli.HelpFormatter;
//import org.apache.commons.cli.OptionBuilder;
//import org.apache.commons.cli.Options;
//import org.apache.commons.cli.ParseException;
//import org.apache.commons.cli.PosixParser;
/**
* This class is responsible for handling the command-line arguments
* and starting either the stand-alone server or the client-GUI.
*
* @see net.sf.freecol.client.FreeColClient FreeColClient
* @see net.sf.freecol.server.FreeColServer FreeColServer
*/
public final class FreeCol {
private static final Logger logger = Logger.getLogger(FreeCol.class.getName());
public static final String META_SERVER_ADDRESS = "meta.freecol.org";
public static final int META_SERVER_PORT = 3540;
public static final int DEFAULT_PORT = 3541;
public static final int DEFAULT_TIMEOUT = 60; // 1 minute
public static final int TIMEOUT_MIN = 10; // 10s
public static final String CLIENT_THREAD = "FreeColClient:";
public static final String SERVER_THREAD = "FreeColServer:";
public static final String METASERVER_THREAD = "FreeColMetaServer:";
public static final String DEFAULT_TC = "freecol";
private static final String FREECOL_VERSION = "0.10.5";
private static String FREECOL_REVISION;
private static final String MIN_JDK_VERSION = "1.5";
private static final String DEFAULT_SPLASH_FILE = "splash.jpg";
private static boolean sound = false,
javaCheck = true,
memoryCheck = true,
consoleLogging = true,
introVideo = true;
private static String dataFolder = "data";
private static String logFile = null;
private static FreeColClient freeColClient;
private static boolean standAloneServer = false;
private static boolean publicServer = true;
public static final int DEBUG_OFF = 0;
public static final int DEBUG_LIMITED = 1;
public static final int DEBUG_FULL = 2;
public static final int DEBUG_FULL_COMMS = 3;
private static int debugLevel = DEBUG_LIMITED;
private static int debugRunTurns = -1;
private static String debugRunSave = null;
private static String fontName = null;
private static int serverPort = DEFAULT_PORT;
private static String serverName = null;
private static File mainUserDirectory = null;
private static File saveDirectory;
/** Directory containing automatically created save games.
* At program start, the path of this directory is based on the path
* where to store regular save games. If the value of saveGame is
* changed by the user during the game, then the value of
* autoSaveDirectory will not be effected.
*/
private static File autoSaveDirectory;
private static File tcUserDirectory;
private static File userModsDirectory;
private static String tc = DEFAULT_TC;
private static File savegameFile = null;
private static File clientOptionsFile = null;
private static Level logLevel = Level.FINEST;
private static boolean checkIntegrity = false;
private static String splashFilename = DEFAULT_SPLASH_FILE;
// private static Dimension windowSize;
private static long freeColSeed = 0L;
private static int freeColTimeout = -1;
private FreeCol() {
// Hide constructor
}
/**
* The entrypoint.
*
* @param args The command-line arguments.
*/
public static void main(String[] args, Activity activity) {
System.out.println("FreeCol.main()");
try {
// Manifest manifest = new Manifest(FreeCol.class.getResourceAsStream("/META-INF/MANIFEST.MF"));
// Attributes attribs = manifest.getMainAttributes();
// String revision = attribs.getValue("Revision");
String revision = "Android BETA";
FREECOL_REVISION = FREECOL_VERSION + " (Revision: " + revision + ")";
System.out.println("Rev=" + FREECOL_REVISION);
} catch (Exception e) {
System.out.println("Unable to load Manifest.");
FREECOL_REVISION = FREECOL_VERSION;
}
// Disable opening video
introVideo = false;
// parse command line arguments
handleArgs(args);
createAndSetDirectories(activity);
initLogging();
Locale locale = getLocale();
Locale.setDefault(locale);
Messages.setMessageBundle(locale);
//
// if (javaCheck && !checkJavaVersion()) {
// System.err.println("Java version " + MIN_JDK_VERSION +
// " or better is recommended in order to run FreeCol." +
// " Use --no-java-check to skip this check.");
// System.exit(1);
// }
//
// int minMemory = 128; // million bytes
// if (memoryCheck && Runtime.getRuntime().maxMemory() < minMemory * 1000000) {
// System.out.println("You need to assign more memory to the JVM. Restart FreeCol with:");
// System.out.println("java -Xmx" + minMemory + "M -jar FreeCol.jar");
// System.exit(1);
// }
if (standAloneServer) {
startServer();
} else {
freeColClient = new FreeColClient(savegameFile, null, sound, splashFilename, introVideo, fontName, activity);
}
}
/**
* Initialize loggers.
*/
private static void initLogging() {
System.out.println("FreeCol.initLogging()");
final Logger baseLogger = Logger.getLogger("");
final Handler[] handlers = baseLogger.getHandlers();
for (int i = 0; i < handlers.length; i++) {
baseLogger.removeHandler(handlers[i]);
}
if (logFile == null) {
logFile = mainUserDirectory.getPath() + File.separator
+ "FreeCol.log";
}
try {
baseLogger.addHandler(new DefaultHandler(consoleLogging, logFile));
Logger freecolLogger = Logger.getLogger("net.sf.freecol");
freecolLogger.setLevel(logLevel);
} catch (FreeColException e) {
e.printStackTrace();
}
// Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
// public void uncaughtException(Thread thread, Throwable e) {
// baseLogger.log(Level.WARNING, "Uncaught exception from thread: " + thread, e);
// }
// });
}
/**
* Determines the <code>Locale</code> to be used.
* @return Currently this method returns the locale set by
* the ClientOptions (read directly from "options.xml").
* This behavior will probably be changed.
*/
public static Locale getLocale() {
System.out.println("FreeCol.getLocale()");
// XMLInputFactory xif = XMLInputFactory.newInstance();
// XMLStreamReader in = null;
// File options = getClientOptionsFile();
// if (options.canRead()) {
// try {
// in = xif.createXMLStreamReader(new FileInputStream(options), "UTF-8");
// in.nextTag();
// /**
// * The following code was contributed by armcode to fix
// * bug #[ 2045521 ] "Exception in Freecol.log on starting
// * game". I was never able to reproduce the bug, but the
// * patch did no harm either.
// */
// for(int eventid = in.getEventType();eventid != XMLEvent.END_DOCUMENT; eventid = in.getEventType()) {
//
// //TODO: Is checking for XMLEvent.ATTRIBUTE needed?
// if (eventid == XMLEvent.START_ELEMENT) {
// if (ClientOptions.LANGUAGE.equals(in.getAttributeValue(null, "id"))) {
// return LanguageOption.getLocale(in.getAttributeValue(null, "value"));
// }
// }
// in.nextTag();
// }
// //We don't have a language option in our file, it is either not there or the file is corrupt
// logger.log(Level.WARNING, "Language setting not found in client options file. Using default.");
// } catch (Exception e) {
// logger.log(Level.WARNING, "Exception while loading options.", e);
// } finally {
// try {
// if (in != null) {
// in.close();
// }
// } catch (Exception e) {
// logger.log(Level.WARNING, "Exception while closing stream.", e);
// }
// }
// }
return Locale.getDefault();
}
/**
* Returns the default server network port.
* @return The port number.
*/
public static int getDefaultPort() {
return DEFAULT_PORT;
}
/**
* Returns the file containing the client options.
* @return The file.
*/
public static File getClientOptionsFile() {
return clientOptionsFile;
}
/**
* Gets the <code>FreeColClient</code>.
* @return The <code>FreeColClient</code>, or <code>null</code>
* if the game is run as a standalone server.
*/
public static FreeColClient getFreeColClient() {
return freeColClient;
}
/**
* Try to make a directory.
*
* @param file A <code>File</code> specifying where to make the directory.
* @return True if the directory is there after the call.
*/
private static boolean insistDirectory(File file) {
if (file.exists()) {
if (file.isDirectory()) return true;
System.out.println("Could not create directory " + file.getName()
+ " under " + file.getParentFile().getName()
+ " because a non-directory with that name is already there.");
return false;
}
return file.mkdir();
}
/**
* Creates a freecol dir for the current user.
*
* The directory is created within the current user's
* home directory. This directory will be called "freecol"
* and underneath that directory a "save" directory will
* be created.
*
* For MacOS X the Library/FreeCol is used
* (which is the standard path for application related files).
*
* For os.name beginning with "Windows" JFileChooser() is used to
* find the path to "My Documents" (or localized equivalent)
*/
private static void createAndSetDirectories(Context context) {
// TODO: The location of the save directory should be determined by the installer.;
String freeColDirectoryName = "/".equals(System.getProperty("file.separator")) ?
".freecol" : "freecol";
// File userHome = FileSystemView.getFileSystemView().getDefaultDirectory();
// File userHome = context.getFilesDir();
File userHome = new File("/sdcard/freecol/");
// Checks for OS specific paths, however if the old {home}/.freecol exists
// that overrides OS-specifics for backwards compatibility.
// TODO: remove compatibility code
if (System.getProperty("os.name").equals("Mac OS X")) {
// We are running on a Mac and should use {home}/Library/FreeCol
if (!new File(userHome, freeColDirectoryName).isDirectory()) {
userHome = new File(userHome, "Library");
freeColDirectoryName = "FreeCol";
}
} else if (System.getProperty("os.name").startsWith("Windows")) {
// We are running on Windows and should use "My Documents" (or localized equivalent)
if (!new File(userHome, freeColDirectoryName).isDirectory()) {
freeColDirectoryName = "FreeCol";
}
}
if (mainUserDirectory == null) {
mainUserDirectory = new File(userHome, freeColDirectoryName);
}
if (!insistDirectory(mainUserDirectory)) return;
if (saveDirectory == null) {
saveDirectory = new File(mainUserDirectory, "save");
}
if (!insistDirectory(saveDirectory)) saveDirectory = null;
autoSaveDirectory = new File(saveDirectory, "autosave");
if (!insistDirectory(autoSaveDirectory)) autoSaveDirectory = null;
tcUserDirectory = new File(mainUserDirectory, tc);
if (!insistDirectory(tcUserDirectory)) tcUserDirectory = null;
userModsDirectory = new File(mainUserDirectory, "mods");
if (!insistDirectory(userModsDirectory)) userModsDirectory = null;
clientOptionsFile = (tcUserDirectory == null) ? null
: new File(tcUserDirectory, "options.xml");
}
/**
* Set up the save file and directory
* @param name the name of the save file to use
*/
private static void setSavegame(String name) {
if(name == null){
System.out.println("No savegame given with --load-savegame parameter");
System.exit(1);
}
savegameFile = new File(name);
if (!savegameFile.exists() || !savegameFile.isFile()) {
savegameFile = new File(getSaveDirectory(), name);
if (!savegameFile.exists() || !savegameFile.isFile()) {
System.out.println("Could not find savegame file: " + name);
System.exit(1);
}
} else {
setSaveDirectory(savegameFile.getParentFile());
}
}
/**
* Returns the directory where the savegames should be put.
* @return The directory where the savegames should be put.
*/
public static File getSaveDirectory() {
return saveDirectory;
}
/**
* Set the directory where the savegames should be put.
* @param saveDirectory a <code>File</code> value for the savegame directory
*/
public static void setSaveDirectory(File saveDirectory) {
FreeCol.saveDirectory = saveDirectory;
}
/**
* Returns the data directory.
* @return The directory where the data files are located.
*/
public static File getDataDirectory() {
// if (dataFolder.equals("")) {
// return new File("data");
// } else {
// return new File(dataFolder);
// }
return new File("/sdcard/freecol/data/");
}
/**
* Gets the mods directory.
*
* @return The directory where the standard mods are located.
*/
public static File getStandardModsDirectory() {
return new File(getDataDirectory(), "mods");
}
/**
* Gets the user mods directory.
*
* @return The directory where user mods are located, or null if none.
*/
public static File getUserModsDirectory() {
return userModsDirectory;
}
/**
* Returns the directory where the autogenerated savegames
* should be put.
*
* @return The directory.
*/
public static File getAutosaveDirectory() {
return autoSaveDirectory;
}
/**
* Returns the directory for saving options.
*
* @return The directory.
*/
public static File getOptionsDirectory() {
return tcUserDirectory;
}
public static InputStream getSpecificationInputStream() throws IOException {
final FreeColTcFile tcData = new FreeColTcFile(tc);
return tcData.getSpecificationInputStream();
}
/**
* Ensure that the Java version is good enough. JDK 1.4 or better is
* required.
*
* @return true if Java version is at least 1.5.0.
*/
private static boolean checkJavaVersion() {
// Must use string comparison because some JVM's provide
// versions like "1.4.1"
String version = System.getProperty("java.version");
boolean success = (version.compareTo(MIN_JDK_VERSION) >= 0);
return success;
}
/**
* Checks the command-line arguments and takes appropriate actions
* for each of them.
*
* @param args The command-line arguments.
*/
@SuppressWarnings("static-access")
private static void handleArgs(String[] args) {
// // create the command line parser
// CommandLineParser parser = new PosixParser();
//
// /**
// * Ugly hack: try to determine language first, so that usage,
// * etc. will be localized.
// */
// String localeArg = null;
// String locationArg = null;
// for (int index = 0; index < args.length - 1; index++) {
// if ("--default-locale".equals(args[index])) {
// localeArg = args[++index];
// } else if ("--freecol-data".equals(args[index])) {
// locationArg = args[++index];
// }
// }
// if (locationArg != null) {
// dataFolder = locationArg;
// }
// if (localeArg == null) {
// Messages.setMessageBundle(Locale.getDefault());
// } else {
// Locale locale = LanguageOption.getLocale(localeArg);
// Locale.setDefault(locale);
// Messages.setMessageBundle(locale);
// }
//
// // create the Options
// options.addOption(OptionBuilder.withLongOpt("freecol-data")
// .withDescription(Messages.message("cli.freecol-data"))
// .withArgName(Messages.message("cli.arg.directory"))
// .hasArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("tc")
// .withDescription(Messages.message("cli.tc"))
// .withArgName(Messages.message("cli.arg.name"))
// .hasArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("home-directory")
// .withDescription(Messages.message("cli.home-directory"))
// .withArgName(Messages.message("cli.arg.directory"))
// .withType(new File("dummy"))
// .hasArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("log-console")
// .withDescription(Messages.message("cli.log-console"))
// .create());
// options.addOption(OptionBuilder.withLongOpt("log-file")
// .withDescription(Messages.message("cli.log-file"))
// .withArgName(Messages.message("cli.arg.name"))
// .hasArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("log-level")
// .withDescription(Messages.message("cli.log-level"))
// .withArgName(Messages.message("cli.arg.loglevel"))
// .hasArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("no-java-check")
// .withDescription(Messages.message("cli.no-java-check"))
// .create());
// options.addOption(OptionBuilder.withLongOpt("windowed")
// .withDescription(Messages.message("cli.windowed"))
// .withArgName(Messages.message("cli.arg.dimensions"))
// .hasOptionalArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("default-locale")
// .withDescription(Messages.message("cli.default-locale"))
// .withArgName(Messages.message("cli.arg.locale"))
// .hasArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("no-memory-check")
// .withDescription(Messages.message("cli.no-memory-check"))
// .create());
// options.addOption(OptionBuilder.withLongOpt("no-intro")
// .withDescription(Messages.message("cli.no-intro"))
// .create());
// options.addOption(OptionBuilder.withLongOpt("no-sound")
// .withDescription(Messages.message("cli.no-sound"))
// .create());
// options.addOption(OptionBuilder.withLongOpt("usage")
// .withDescription(Messages.message("cli.help"))
// .create());
// options.addOption(OptionBuilder.withLongOpt("help")
// .withDescription(Messages.message("cli.help"))
// .create());
// options.addOption(OptionBuilder.withLongOpt("version")
// .withDescription(Messages.message("cli.version"))
// .create());
// options.addOption(OptionBuilder.withLongOpt("debug")
// .withDescription(Messages.message("cli.debug"))
// .withArgName(Messages.message("cli.arg.debuglevel"))
// .hasOptionalArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("debug-run")
// .withDescription(Messages.message("cli.debug-run"))
// .withArgName(Messages.message("cli.arg.debugRun"))
// .hasOptionalArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("private")
// .withDescription(Messages.message("cli.private"))
// .create());
// options.addOption(OptionBuilder.withLongOpt("server")
// .withDescription(Messages.message("cli.server"))
// .withArgName(Messages.message("cli.arg.port"))
// .hasOptionalArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("load-savegame")
// .withDescription(Messages.message("cli.load-savegame"))
// .withArgName(Messages.message("cli.arg.file"))
// .hasArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("server-name")
// .withDescription(Messages.message("cli.server-name"))
// .withArgName(Messages.message("cli.arg.name"))
// .hasArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("splash")
// .withDescription(Messages.message("cli.splash"))
// .withArgName(Messages.message("cli.arg.file"))
// .hasOptionalArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("check-savegame")
// .withDescription(Messages.message("cli.check-savegame"))
// .create());
// options.addOption(OptionBuilder.withLongOpt("font")
// .withDescription(Messages.message("cli.font"))
// .withArgName(Messages.message("cli.arg.font"))
// .hasArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("seed")
// .withDescription(Messages.message("cli.seed"))
// .withArgName(Messages.message("cli.arg.seed"))
// .hasArg()
// .create());
// options.addOption(OptionBuilder.withLongOpt("timeout")
// .withDescription(Messages.message("cli.timeout"))
// .withArgName(Messages.message("cli.arg.timeout"))
// .hasArg()
// .create());
//
// try {
// // parse the command line arguments
// CommandLine line = parser.parse(options, args);
// if (line.hasOption("default-locale")) {
// // slightly ugly: strip encoding from LC_MESSAGES
// String languageID = line.getOptionValue("default-locale");
// int index = languageID.indexOf('.');
// if (index > 0) {
// languageID = languageID.substring(0, index);
// }
// Locale newLocale = LanguageOption.getLocale(languageID);
// Locale.setDefault(newLocale);
// Messages.setMessageBundle(newLocale);
// }
// if (line.hasOption("splash")) {
// final String str = line.getOptionValue("splash");
// if (str != null) {
// splashFilename = str;
// }
// }
// if (line.hasOption("freecol-data")) {
// dataFolder = line.getOptionValue("freecol-data");
// }
// if (line.hasOption("tc")) {
// tc = line.getOptionValue("tc");
// }
// if (line.hasOption("home-directory")) {
// String arg = line.getOptionValue("home-directory");
// mainUserDirectory = new File(arg);
// String errMsg = null;
// if(!mainUserDirectory.exists()){
// errMsg = "cli.error.home.notExists";
// }
// if(!mainUserDirectory.canRead()){
// errMsg = "cli.error.home.noRead";
// }
// if(!mainUserDirectory.canWrite()){
// errMsg = "cli.error.home.noWrite";
// }
// if(errMsg != null){
// System.out.println(Messages.message(StringTemplate.template(errMsg)
// .addName("%string%", arg)));
// System.exit(1);
// }
// }
// if (line.hasOption("log-console")) {
// consoleLogging = true;
// }
// if (line.hasOption("log-file")) {
// logFile = line.getOptionValue("log-file");
// }
// if (line.hasOption("log-level")) {
// String logLevelString = line.getOptionValue("log-level").toUpperCase();
// try {
// logLevel = Level.parse(logLevelString);
// } catch (IllegalArgumentException e) {
// printUsage();
// System.exit(1);
// }
// }
// if (line.hasOption("no-java-check")) {
// javaCheck = false;
// }
// if (line.hasOption("windowed")) {
// String dimensions = line.getOptionValue("windowed");
// if (dimensions == null) {
// windowSize = new Dimension(-1, -1);
// } else {
// String[] xy = dimensions.split("[^0-9]");
// if (xy.length == 2) {
// windowSize = new Dimension(Integer.parseInt(xy[0]), Integer.parseInt(xy[1]));
// } else {
// printUsage();
// System.exit(1);
// }
// }
// }
// if (line.hasOption("no-sound")) {
// sound = false;
// }
// if (line.hasOption("no-intro")) {
// introVideo = false;
// }
// if (line.hasOption("no-memory-check")) {
// memoryCheck = false;
// }
// if (line.hasOption("help") || line.hasOption("usage")) {
// printUsage();
// System.exit(0);
// }
// if (line.hasOption("version")) {
// System.out.println("FreeCol " + getVersion());
// System.exit(0);
// }
// if (line.hasOption("debug")) {
// // If the optional argument is supplied use limited mode.
// try {
// debugLevel = Integer.parseInt(line.getOptionValue("debug"));
// debugLevel = Math.min(Math.max(debugLevel, DEBUG_OFF),
// DEBUG_FULL_COMMS);
// } catch (NumberFormatException e) {
// debugLevel = DEBUG_FULL;
// }
// // user set log level has precedence
// if (!line.hasOption("log-level")) {
// logLevel = Level.FINEST;
// }
// if (line.hasOption("debug-run")) {
// String opt = line.getOptionValue("debug-run");
// int comma = opt.indexOf(",");
// String turns = opt.substring(0, (comma < 0) ? opt.length()
// : comma);
// try {
// debugRunTurns = Integer.parseInt(turns);
// } catch (NumberFormatException e) {
// debugRunTurns = -1;
// }
// if (comma > 0) debugRunSave = opt.substring(comma + 1);
// }
// }
// if (line.hasOption("server")) {
// standAloneServer = true;
// String arg = line.getOptionValue("server");
// if (arg != null) {
// try {
// serverPort = Integer.parseInt(arg);
// } catch (NumberFormatException nfe) {
// System.out.println(Messages.message(StringTemplate.template("cli.error.port")
// .addName("%string%", arg)));
// System.exit(1);
// }
// }
// }
// if (line.hasOption("private")) {
// publicServer = false;
// }
// if (line.hasOption("check-savegame")) {
// setSavegame(line.getOptionValue("load-savegame"));
// checkIntegrity = true;
// standAloneServer = true;
// serverPort = DEFAULT_PORT;
// }
// if (line.hasOption("load-savegame")) {
// setSavegame(line.getOptionValue("load-savegame"));
// }
// if (line.hasOption("server-name")) {
// serverName = line.getOptionValue("server-name");
// }
// if (line.hasOption("font")) {
// fontName = line.getOptionValue("font");
// }
// if (line.hasOption("seed")) {
// String seedStr = line.getOptionValue("seed");
// try {
// freeColSeed = Long.parseLong(seedStr);
// } catch (NumberFormatException e) {
// System.err.println("Ignoring bad seed: " + seedStr);
// }
// }
// if (line.hasOption("timeout")) {
// String timeoutStr = line.getOptionValue("timeout");
// int result;
// try {
// result = Integer.parseInt(timeoutStr);
// } catch (NumberFormatException nfe) {
// result = -1;
// }
// if (result < TIMEOUT_MIN) {
// System.err.println("Ignoring bad timeout: " + timeoutStr);
// } else {
// freeColTimeout = result;
// }
// }
// } catch (ParseException e) {
// System.err.println("\n" + e.getMessage() + "\n");
// printUsage();
// System.exit(1);
// }
}
private static void printUsage() {
// HelpFormatter formatter = new HelpFormatter();
// formatter.printHelp("java -Xmx 128M -jar freecol.jar [OPTIONS]", options);
}
/**
* Gets the current version of game.
*
* @return The current version of the game using the format "x.y.z",
* where "x" is major, "y" is minor and "z" is revision.
*/
public static String getVersion() {
return FREECOL_VERSION;
}
/**
* Gets the current revision of game.
*
* @return The current version and SVN Revision of the game.
*/
public static String getRevision() {
return FREECOL_REVISION;
}
/**
* Returns the name of the log file.
*
* @return a <code>String</code> value
*/
public static String getLogFile() {
return logFile;
}
/**
* Checks if the program is in "Debug mode".
* @return <code>true</code> if the program is in debug
* mode and <code>false</code> otherwise.
*/
public static boolean isInDebugMode() {
return debugLevel > DEBUG_OFF;
}
/**
* Gets the debug level.
*
* @return The debug level.
*/
public static int getDebugLevel() {
return debugLevel;
}
/**
* Sets the "debug mode" to be active or not.
* @param debug Should be <code>true</code> in order
* to active debug mode and <code>false</code>
* otherwise.
*/
public static void setInDebugMode(boolean debug) {
debugLevel = (debug) ? DEBUG_FULL : DEBUG_OFF;
}
/**
* Gets the turns to run in debug mode.
*
* @return The turns to run in debug mode.
*/
public static int getDebugRunTurns() {
return debugRunTurns;
}
/**
* Complete debug run.
*/
public static void completeDebugRun() {
debugRunTurns = 0;
}
/**
* Is a debug run complete?
*
* @return True if a debug run is complete.
*/
public static boolean isDebugRunComplete() {
return debugRunTurns == 0;
}
/**
* Gets the name of a file to save to at the end of a debug run.
*
* @return The name of a file to save to at the end of a debug run.
*/
public static String getDebugRunSaveName() {
return debugRunSave;
}
/**
* Gets the seed for the PRNG.
*
* @return The seed.
*/
public static long getFreeColSeed() {
if (freeColSeed == 0L) {
freeColSeed = new SecureRandom().nextLong();
logger.info("Using seed: " + freeColSeed);
}
return freeColSeed;
}
/**
* Increments the seed for the PRNG.
*/
public static void incrementFreeColSeed() {
freeColSeed = getFreeColSeed() + 1;
logger.info("Reseeded with: " + freeColSeed);
}
/**
* Gets the timeout.
* Use the command line specified one if any, otherwise default
* to `infinite' in single player and the DEFAULT_TIMEOUT for
* multiplayer.
*
* @param singleplayer True if this is a single player game.
* @return A suitable timeout value.
*/
public static int getFreeColTimeout(boolean single) {
return (freeColTimeout >= TIMEOUT_MIN) ? freeColTimeout
: (single) ? Integer.MAX_VALUE
: DEFAULT_TIMEOUT;
}
private static void startServer() {
// logger.info("Starting stand-alone server.");
// try {
// final FreeColServer freeColServer;
// if (savegameFile != null) {
// XMLStream xs = null;
// try {
// // Get suggestions for "singleplayer" and "public game" settings from the file:
// final FreeColSavegameFile fis = new FreeColSavegameFile(savegameFile);
// xs = FreeColServer.createXMLStreamReader(fis);
// final XMLStreamReader in = xs.getXMLStreamReader();
// in.nextTag();
// xs.close();
//
// freeColServer = new FreeColServer(fis, serverPort, serverName);
// if (checkIntegrity) {
// String integrityCheckMsg = "";
// boolean integrityOK = freeColServer.getIntegrity();
// if(integrityOK){
// integrityCheckMsg = Messages.message("cli.check-savegame.success");
// }
// else{
// integrityCheckMsg = Messages.message("cli.check-savegame.failure");
// }
// System.out.println(integrityCheckMsg);
// System.exit(integrityOK ? 0 : 1);
// }
// } catch (Exception e) {
// if (checkIntegrity) {
// System.out.println(Messages.message("cli.check-savegame.failure"));
// }
// System.out.println("Could not load savegame.");
// System.exit(1);
// return;
// } finally {
// xs.close();
// }
// } else {
// try {
// FreeColTcFile tcData = new FreeColTcFile(tc);
// Specification specification = tcData.getSpecification();
// freeColServer = new FreeColServer(specification, publicServer, false, serverPort, serverName);
// } catch (NoRouteToServerException e) {
// System.out.println(Messages.message("server.noRouteToServer"));
// System.exit(1);
// return;
// }
// }
//
// Runtime runtime = Runtime.getRuntime();
// runtime.addShutdownHook(new Thread() {
// public void run() {
// freeColServer.getController().shutdown();
// }
// });
// } catch (IOException e) {
// System.err.println("Error while loading server: " + e);
// System.exit(1);
// }
}
}