You can subscribe to this list here.
| 2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(23) |
Aug
(6) |
Sep
(15) |
Oct
(31) |
Nov
(22) |
Dec
(47) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2008 |
Jan
(21) |
Feb
(19) |
Mar
(10) |
Apr
(15) |
May
(25) |
Jun
|
Jul
(6) |
Aug
(91) |
Sep
(85) |
Oct
(192) |
Nov
(14) |
Dec
(11) |
| 2009 |
Jan
(19) |
Feb
(8) |
Mar
(14) |
Apr
(1) |
May
(5) |
Jun
(6) |
Jul
(54) |
Aug
(115) |
Sep
(56) |
Oct
(21) |
Nov
(39) |
Dec
(7) |
| 2010 |
Jan
(54) |
Feb
(15) |
Mar
(15) |
Apr
(14) |
May
(4) |
Jun
(10) |
Jul
(6) |
Aug
(6) |
Sep
(10) |
Oct
(3) |
Nov
(1) |
Dec
(16) |
| 2011 |
Jan
(13) |
Feb
(92) |
Mar
(11) |
Apr
(9) |
May
(5) |
Jun
|
Jul
(5) |
Aug
(7) |
Sep
(2) |
Oct
(3) |
Nov
(10) |
Dec
(5) |
| 2012 |
Jan
(4) |
Feb
(19) |
Mar
(5) |
Apr
(6) |
May
(10) |
Jun
(2) |
Jul
(1) |
Aug
(8) |
Sep
(2) |
Oct
(2) |
Nov
(5) |
Dec
(3) |
| 2013 |
Jan
|
Feb
(32) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: SourceForge.net <no...@so...> - 2011-02-10 18:43:28
|
Bugs item #3177305, was opened at 2011-02-10 14:40 Message generated for change (Comment added) made by cleka You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- >Comment By: Clemens Katzer (cleka) Date: 2011-02-10 20:43 Message: BTW, are you "well familiar with Titan, just new to use Colossus, or need to learn also "how game works, rules, strategy, etc." first? Once you are familar with the game and the usage, you could even try the public game server (by clicking the "WebClient" button), where you could find other "real people" to play against. (in contrast to the AI ("Artificial Intelligence") i.e. Robot players... However to notice is, people are usually online in afternoon/evening for US time. At other time you might log in there and be alone 30 or 60 mins before any other drop by. However, that's anyway more recommded only a) it does not hang for you any more and b) once you are "fluent" in playing. It's annoying for others when you need, let's say, 1.5 minutes for each individual move, split, recruit etc.... => Practicing to get faster better with AI players.They are all in all rather dump, but for first few weeks ok. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 20:35 Message: okay (or not okay), but that's something. In worst case I have to make you a special version which prints something to screen for every line of code before and around where it calls that "Pick Recruiter" dialog :)) That's what I meant, you might run into a "block" somewhat later with some other dialog. But the recruit dialog itself worked?? Strange; they are very similarly programmed. Some more "smalltalk" :o) > Made me green in fact. > I guess I can always play green. :p :) You can try: Window => Preferences => "Color" tab. Click on "Select" and choose another color. Next time you START a game it would choose that color for you automatically. (all those "Autoplay" options do certain things for you. So in fact you could enable "Auto Pick Recruiter", since that one is rather unimportant, as long as you can choose an actual Recruit. (so we can circumvent THIS cliff for now). But there might be other dialogs later to block you as well. And/or, in fact that's an interesting thing to try, whether that color chooser dialog would work??? If not, can you close it with the "x" shaped icon in upper right corner? (the initial color pick dialog CAN'T be closed that way, or rather, if one does, it reappears immediately.) So, sure, I'd like to continue troubleshoot this. Let's try that above for now, have to bring kids to bed now. -Cle. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 20:17 Message: So I've been running through this... moving, recruiting, etc... then I came to a point where it won't let me pick again. :/ Says: kevinnew: Pick Recruiter in Brush hex17 There is more than one way you can recruit this. Current content of legion Gr05: There is a Titan, Cyclops, Gargoyle, Gargoyle, Centaur, Centaur Pick the creature type you want to reveal: There is a Cyclops, Gargoyle I can't pick anything. Tried clicking on it numerous times. Nothing will select and it is stuck on this dialog box. Not sure why this happening... but thank you for sticking it out with me. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 20:12 Message: You are correct. I typed the name in, it found it and ran fine. Well.. I can play now. yay! ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 20:08 Message: K so, I opened the default kevin.cfg and added those lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green And it worked. The game started. Made me green in fact. So far so good to, I was able to split a stack. Move the unit. Recruit. And watched the computer take it's move as well. So not sure why it wasn't working but it is now. Want to continue to troubleshoot? I guess I can always play green. :p ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 20:06 Message: No, you cannot "pick" the name kevinnew - it does not offer all "names that may exist". You choose the name on "Players" tab, On left side, Choose HUman, on right side type the name. 2nd Line, choose e.g. "SimpleAI", it fills right side with <byColor> or something, thats ok, Type there in first line the name kevinnew, and when game starts, it goes looking for a file Colossus-kewvinnew.cfg [and if it wouldn't exist, create it, sooner or later, after GUI / preferences changes]. Now we pre-create that file, so that it skips the color picking dialog because it would find a value to say "auto pick" from the file. -Cle. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 19:59 Message: btw, I did try and run the Colossus.jnlp stand alone and brings up the welcome screen, I hit ok, and the Game setup screen appears. I still can't choose newkevin and when I run it, once again I can not pick any of the colors. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 19:57 Message: I'll start from the beginning: • I open a folder I extracted all the files to from the .zip • I double click on run.bat A cmd window pops up with: C:\Documents and Settings\kevin\Desktop\collossus>cd "c:\Documents and Settings\kevin\Desktop\collossus\" C:\Documents and Settings\kevin\Desktop\collossus>java -Djava.util.logging.config.file=logging.properties -XMx256M -jar Colossus.jar Then what looks like the main program appears. It is the game setup screen. I make player one a human player and choose Kevin as the type. I make the 2nd player a SimpleAI and choose <By color> for the type. I leave everything else as is. (btw the top says Running Colossus Version 0.12.0-beta1 (revision 4970) on etc...) • I pick New game. The game appears to start, I can see the grid in the background with all the hills, deserts, etc. A small box with Pick a Color appears. I can move this box around. But I can not pick a color. I've tried clicking on every single one. I've tried pressing G, e, o, etc. I've tried Ctrl/Alt combinations, nothing. I can not close it either. I have to force it to shutdown. In Task Manager it shows that it is still running... so I don't THINK it is locked up. I do NOT see any other windows anywhere that I might need to click. I've even tried Alt+Tab and Ctrl+Tab to check. • I went ahead and did a search for the .colossus folder. I found it. It has 5 files in it. Colossus-netclient.cfg Colossus-red.cfg Colossus-server.cfg Colossus-kevin.cfg Colossus-kevin1.cfg • I went ahead and created a new .cfg file. I named it Colossus-kevinnew.cfg. I added these lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Interestingly here, when I started the program, I could not choose kevinnew. I could only still see kevin. I searched my entire computer to see if the .cfg files might also be somewhere else but I could only find them under \\documents and settings\kevin\desktop\collossus • Ok so I tried your command prompt idea. I even ran the command from within the path and I kept getting this error... Unable to access jarfile Colossus.jar I can't imagine it being a graphical error... the program still seems to be running fine, I just can't select any color. In Task Manager it doesn't say "not responding". So I will wait for your reply. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 19:06 Message: ok, XP with SP3 and Sun Java 6 ( 1.6.x ). All right, that should work. ( I may have in use SP2 but still). E.g. "Windows Vista" or "Windows 7" are more "exotic" for me. Sun Java is good also. Did you get the "Welcome to Release 0.12.0" dialog and click it away? (if not, it might have lurked around in the background hidden behind some other window and block the mouse/keyboard input or whatever ("modal dialog"). Should technically not happen/be possible, but one has seen stranger things happen.... The History.java is one of the source files, not relevant. > The only .cf files I could find are WebServer.cf, WebServer_unix.cf, > and WebServer_win.cf. Do you want me to add a line into one of these? No. They are part of the "sources" as well, in some sense. Once started, Colossus will create a directory ".colossus" (and 2 files in it) "somewhere on your computer" - in what it considers to be "your home directory". What that exactly is, might vary... The home directory is under Windows _often_ something like: C:\Documents and Settings\Mike if you logged in to the computer with username Mike. Often you get there with right-click on Start button => Explore => opens an explorer e.g. to C:\Documents and Settings\katzer\Start Menu for me as user katzer. So katzer would be my home dir. However on my computer it's configured differently, so my home directory is D:\katzer You can take an explorer (the Start => right-click => Explore thing) and type in the "path"/adress line in the top "%HOME%" and press return. (you may need to make it visible first with View => Toolbars => Address bar ). Inside there should be .colossus. Once you found that we are much further :) (normally, once masterboardboard is open, Help => About would tell the location but you don't even get there yet :-/ ) Inside there will be eventually several .cfg files (and perhaps a "saves" directory). Directory of D:\katzer\.colossus 07.02.2011 10:06 <DIR> . 07.02.2011 10:06 <DIR> .. 07.02.2011 15:12 1 997 Colossus-clemens.cfg 08.02.2011 19:49 4 425 Colossus-katzer.cfg 08.02.2011 19:49 2 069 Colossus-katzer1.cfg 28.07.2010 17:18 276 Colossus-netclient.cfg 08.02.2011 19:49 900 Colossus-server.cfg 07.02.2011 15:12 2 059 Colossus-test1.cfg 07.02.2011 22:00 586 Colossus-webclient.cfg 07.02.2011 10:56 <DIR> saves 7 File(s) 12 312 bytes 3 Dir(s) 21 313 040 384 bytes free D:\katzer\.colossus> You can ignore the "-server", -webclient and -netclient files for now - they are "internal". -katzer and -clemens etc. are "client preferences" files. Like, I played once a game as clemens, and when changed preferences such as the various auto-<do something>, position and size of windows etc., Colossus would save those to a file with that name. (some other, like Variant, type and names of players, Options in Startup dialog, are stored to the Colossus-server.cfg file). Usually when you get the Game Setup dialog (where you choose variant, count and type of players etc), first of them you make "Human" and name is initialized with the name you are logged on to the computer. Thus created with some text editor (notepad, if necessary), a textfile named Colossus-Mike.cfg (replace your name, of course). (if necessaary, right click in the right side of explorer, where the files are shown => New => Text Document => then there exists a file "New File.txt" (or similar). Click it, or F2 on it, change name to above. Put into that file the following three lines: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Note the "backslash" ( \ ) in front of the space. Now if you start a game with your player name set to "Mike" the Pick... dialogs should not appear. So question is, what will get stuck then :) The other interesting thing to try is, if you can run from commandline (by typing that command, which will make the java command shown): java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar While Colossus runs, eventually happening warnings etc. would be printed to that Command window. But if it's a total "Graphics stuff somehow freezes" (like it sounds, that it does not accept click or key on any of the colors) ... hm. Tricky. Might be no warning/exception, just the graphics thread (EDT, Event Dispatcher Thread, techno babble... ;-) hangs. Let's see so far, how far we get with above. If we get that, I've already some ideas how to proceed. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:15 Message: Not sure if this will help... I found a file called History.java under my recent documents. It's pretty lengthy but it is listed below: package net.sf.colossus.server; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.colossus.common.Constants; import net.sf.colossus.game.Creature; import net.sf.colossus.game.EntrySide; import net.sf.colossus.game.Legion; import net.sf.colossus.game.Player; import net.sf.colossus.game.actions.AddCreatureAction; import net.sf.colossus.game.actions.Recruitment; import net.sf.colossus.util.Glob; import net.sf.colossus.variant.CreatureType; import net.sf.colossus.variant.MasterHex; import org.jdom.Element; /** * Stores game history as XML. * * @author David Ripton */ public class History { private static final Logger LOGGER = Logger.getLogger(History.class .getName()); /** * History: events that happened before last commit point */ private final Element root; /** * History elements/events that happened since the last commit/"snapshot". */ private final List<Element> recentEvents = new LinkedList<Element>(); /** * Set to true during the processing of {@link #fireEventsFromXML(Server)} * to avoid triggering events we just restored again. */ private boolean loading = false; /** * */ private final Element loadedRedoLog; private boolean isRedo = false; /** * Stores the surviving legions (this variable is not needed any more) * * While the history should contain all information to reproduce the game * state, the last set of legions is currently still loaded upfront since * they contain the battle-specific information. This collides with * replaying the game from history... * Now, since 08/2008, they are not stored as "survivorlegions" any more. * Instead, they are backed up internally (done inside PlayerServerSide), * all the history is replayed. This creates proper split prediction data * in all clients. After that, backup data is compared with result of * replay. * E.g. Legion count, their content, players eliminated must be in sync. * Then the replayed ones are discarded and the backedup ones restored * - which have the right legion state (moved, donor, summoned, ...) * * TODO align the history replay more with the original gameplay so we * don't need this anymore; * 08/2008:==> this is now to some part done. Still replay * events could be closer to original events (split, summon, * acquire, teleport, ...) , not just the "result" of that * event (reveal,add,remove effects). * * TODO instead: model the actual events instead of just result, * or at least add relevant info to history elements, so that all * replayed events carry all needed data so that they could also be * processed by event viewer (currently EV does not process anything * during replay). */ public History() { root = new Element("History"); // Dummy: loadedRedoLog = new Element("LoadedRedoLog"); } /** * Constructor used by "LoadGame" */ public History(Element loadGameRoot) { // Get the history elements and store them to "root" root = (Element)loadGameRoot.getChild("History").clone(); // Get the redo log content loadedRedoLog = (Element)loadGameRoot.getChild("Redo").clone(); } /** * All events before last commit */ Element getCopy() { return (Element)root.clone(); } /** * Reached a commit point: append all recent events to the history, * clear list of recent events; caller should do this together with creating * the next snapshot. */ void flushRecentToRoot() { for (Element el : recentEvents) { el.detach(); String name = el.getName(); // TODO later, when this are proper events (not XML elements), // ask rather from the Event whether it belongs copied to // history or not. // TODO At some point in future, put also those Move events // that reveal something to history, and make either the history // replay only send the relevant reveal messages, or make the // Clients during replay (but not redo part) ignore the "move" // and just process the revealing part. // Preferrably the latter, so that proper events show up in the // EventViewer. if (name.equals("Move") || name.equals("UndoMove")) { LOGGER.finest("Flush Redo to History: skipping " + name); } else if (name.equals("Recruit") || name.equals("UndoRecruit")) { // Skipping for now, because there are also the addCreature, // removeCreature and reveal Events still in history. // TODO make the Recruit/UndoRecruit history events during // replay properly, get rid of the "side effect" type of // entries in save game. LOGGER.finest("Flush Redo to History: skipping " + name); } else { root.addContent(el); } } recentEvents.clear(); } /** * @return A Redo Element, containing all events since last commit * i.e. which need to be REDOne on top of last commit point/snapshot */ Element getNewRedoLogElement() { Element redoLogElement = new Element("Redo"); for (Element el : recentEvents) { el.detach(); redoLogElement.addContent(el); } return redoLogElement; } /** * TODO reconsider name * TODO decide if we should move it all into one big handleEvent(GameEvent) method */ void addCreatureEvent(AddCreatureAction event, int turn, String reason) { if (loading) { return; } Element element = new Element("AddCreature"); element.setAttribute("markerId", event.getLegion().getMarkerId()); element.setAttribute("creatureName", event.getAddedCreatureType() .getName()); element.setAttribute("turn", "" + turn); element.setAttribute("reason", reason); recentEvents.add(element); } void removeCreatureEvent(Legion legion, CreatureType creature, int turn, String reason) { if (loading) { return; } Element event = new Element("RemoveCreature"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("creatureName", creature.getName()); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); recentEvents.add(event); } void splitEvent(Legion parent, Legion child, List<CreatureType> splitoffs, int turn) { if (loading) { return; } Element event = new Element("Split"); event.setAttribute("parentId", parent.getMarkerId()); event.setAttribute("childId", child.getMarkerId()); event.setAttribute("turn", "" + turn); Element creatures = new Element("splitoffs"); event.addContent(creatures); for (CreatureType creatureType : splitoffs) { Element cr = new Element("creature"); cr.addContent(creatureType.getName()); creatures.addContent(cr); } recentEvents.add(event); } void mergeEvent(String splitoffId, String survivorId, int turn) { if (loading) { return; } Element event = new Element("Merge"); event.setAttribute("splitoffId", splitoffId); event.setAttribute("survivorId", survivorId); event.setAttribute("turn", "" + turn); recentEvents.add(event); } void revealEvent(boolean allPlayers, List<Player> players, Legion legion, List<CreatureType> creatures, int turn, String reason) { if (loading) { return; } if (creatures.isEmpty()) { // this happens e.g. when in final battle (titan vs. titan) // angel was called out of legion which was then empty, // and in the final updateAllLegionContents there is then // this empty legion... // TODO if this case can happen in a regular game no warning // should be logged LOGGER.log(Level.WARNING, "Called revealEvent(" + allPlayers + ", " + (players != null ? players.toString() : "-null-") + ", " + legion + ", " + creatures.toString() + ", " + turn + ") with empty creatureNames"); return; } Element event = new Element("Reveal"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("allPlayers", "" + allPlayers); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); if (!allPlayers) { Element viewers = new Element("viewers"); event.addContent(viewers); Iterator<Player> it = players.iterator(); while (it.hasNext()) { String playerName = it.next().getName(); Element viewer = new Element("viewer"); viewer.addContent(playerName); viewers.addContent(viewer); } } Element creaturesElem = new Element("creatures"); event.addContent(creaturesElem); for (CreatureType creatureType : creatures) { Element creatureElem = new Element("creature"); creatureElem.addContent(creatureType.getName()); creaturesElem.addContent(creatureElem); } recentEvents.add(event); } void playerElimEvent(Player player, Player slayer, int turn) { if (loading) { return; } Element event = new Element("PlayerElim"); event.setAttribute("name", player.getName()); if (slayer != null) { event.setAttribute("slayer", slayer.getName()); } event.setAttribute("turn", "" + turn); recentEvents.add(event); } void movementRollEvent(Player player, int roll) { if (loading) { return; } Element event = new Element("MovementRoll"); event.setAttribute("playerName", player.getName()); event.setAttribute("roll", "" + roll); recentEvents.add(event); } void legionMoveEvent(Legion legion, MasterHex newHex, EntrySide entrySide, boolean teleport, CreatureType lord) { if (loading) { return; } Element event = new Element("Move"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("newHex", newHex.getLabel()); event.setAttribute("entrySide", entrySide.getLabel()); event.setAttribute("teleport", "" + teleport); String creNameOrTextNull = lord == null ? "null" : lord.getName(); event.setAttribute("revealedLord", creNameOrTextNull); recentEvents.add(event); } void legionUndoMoveEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoMove"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } void recruitEvent(Legion legion, CreatureType recruit, CreatureType recruiter) { if (loading) { return; } Element event = new Element("Recruit"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("recruit", recruit.getName()); event.setAttribute("recruiter", recruiter == null ? "null" : recruiter .getName()); recentEvents.add(event); } void undoRecruitEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoRecruit"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } /** * Fire all events from redoLog. * Elements from RedoLog are processed one by one and the corresponding * method is called on the Server object, pretty much as if a * ClientHandler would call it when receiving such a request from Client. * Note that in some cases overriding the processingCH is necessary * (because technically, this all currently happens while still the * connecting of last joining player is processed, so processingCH is * set to his ClientHandler). * * Note that "loading" is not set to true, so they DO GET ADDED to the * recentEvents list again. * * @param server The server on which to call all the actions to be redone */ void processRedoLog(Server server) { assert loadedRedoLog != null : "Loaded RedoLog should always " + "have a JDOM root element as backing store"; LOGGER.info("History: Start processing redo log"); isRedo = true; for (Object obj : loadedRedoLog.getChildren()) { Element el = (Element)obj; LOGGER.info("processing redo event " + el.getName()); fireEventFromElement(server, el); } isRedo = false; // TODO clear loadedRedoLog? LOGGER.info("Completed processing redo log"); } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventsFromXML(Server server) { this.loading = true; assert root != null : "History should always have a " + " JDOM root element as backing store"; List<Element> kids = root.getChildren(); Iterator<Element> it = kids.iterator(); while (it.hasNext()) { Element el = it.next(); fireEventFromElement(server, el); } this.loading = false; } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventFromElement(Server server, Element el) { GameServerSide game = server.getGame(); String eventName = el.getName(); String reasonPerhaps = el.getAttributeValue("reason"); String reason = (reasonPerhaps != null && !reasonPerhaps .equals("null")) ? reasonPerhaps : "<undefinedReason>"; if (eventName.equals("Reveal") && isRedo && reason.equals(Constants.reasonRecruiter)) { // Skip this because we redo the full recruit event // TODO LOGGER.finest("Skipping Reveal event (reason " + reason + ") during redo."); } else if (eventName.equals("AddCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping AddCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("RemoveCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping RemoveCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("Reveal")) { String allPlayers = el.getAttributeValue("allPlayers"); boolean all = allPlayers != null && allPlayers.equals("true"); String markerId = el.getAttributeValue("markerId"); List<String> playerNames = new ArrayList<String>(); Element viewEl = el.getChild("viewers"); int turn = Integer.parseInt(el.getAttributeValue("turn")); String playerName = null; if (viewEl != null) { List<Element> viewers = viewEl.getChildren(); Iterator<Element> it = viewers.iterator(); while (it.hasNext()) { Element viewer = it.next(); playerName = viewer.getTextNormalize(); playerNames.add(playerName); } } List<Element> creatureElements = el.getChild("creatures") .getChildren(); List<CreatureType> creatures = new ArrayList<CreatureType>(); for (Element creature : creatureElements) { String creatureName = creature.getTextNormalize(); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } Player player = game.getPlayerByMarkerId(markerId); Legion legion; if (turn == 1 && player.getLegionByMarkerId(markerId) == null) { // there is no create event for the startup legions, // so we might need to create them for the reveal event legion = new LegionServerSide(markerId, null, player .getStartingTower(), player.getStartingTower(), player, game, creatures .toArray(new CreatureType[creatures.size()])); player.addLegion(legion); } else { legion = player.getLegionByMarkerId(markerId); } // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; if (((PlayerServerSide)player).getDeadBeforeSave()) { // Skip for players that will be dead by end of replay } else if (all) { server.allRevealCreatures(legion, creatures, reason); } else { server.oneRevealLegion(game.getPlayerByName(playerName), legion, creatures, reason); } } else if (eventName.equals("Split")) { String parentId = el.getAttributeValue("parentId"); String childId = el.getAttributeValue("childId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); List<String> creatureNames = new ArrayList<String>(); List<CreatureType> creatures = new ArrayList<CreatureType>(); List<Element> splitoffs = el.getChild("splitoffs").getChildren(); Iterator<Element> it = splitoffs.iterator(); while (it.hasNext()) { Element creature = it.next(); String creatureName = creature.getTextNormalize(); creatureNames.add(creatureName); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } LegionServerSide parentLegion = game.getLegionByMarkerId(parentId); if (isRedo) { server.overrideProcessingCH(parentLegion.getPlayer()); server.doSplit(parentLegion, childId, creatures); server.overrideProcessingCH(parentLegion.getPlayer()); return; } // LegionServerSide.split(..) doesn't like us here since the parent // legion can't remove creatures (not there?) -- create child directly // instead PlayerServerSide player = parentLegion.getPlayer(); LegionServerSide childLegion; if (player.hasLegion(childId)) { childLegion = game.getLegionByMarkerId(childId); LOGGER.severe("During replay of history: child legion " + childId + " should not " + "exist yet (turn=" + turn + ")!!\n" + "Exists already with: " + Glob.glob(",", childLegion.getCreatureTypes()) + " but " + "should now be created with creatures: " + creatures); childLegion.remove(); } childLegion = new LegionServerSide(childId, null, parentLegion .getCurrentHex(), parentLegion.getCurrentHex(), player, game, creatures.toArray(new CreatureType[creatures.size()])); player.addLegion(childLegion); for (CreatureType creature : creatures) { parentLegion.removeCreature(creature, false, false); } // Skip for players that will be dead by end of replay if (!player.getDeadBeforeSave()) { server.allTellDidSplit(parentLegion, childLegion, turn, false); } } else if (eventName.equals("Merge")) { String splitoffId = el.getAttributeValue("splitoffId"); String survivorId = el.getAttributeValue("survivorId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); LegionServerSide splitoff = game.getLegionByMarkerId(splitoffId); LegionServerSide survivor = game.getLegionByMarkerId(survivorId); // Skip for players that will be dead by end of replay if (!survivor.getPlayer().getDeadBeforeSave()) { server.undidSplit(splitoff, survivor, false, turn); } // Add them back to parent: while (splitoff.getHeight() > 0) { CreatureType type = splitoff.removeCreature(0, false, false); survivor.addCreature(type, false); } splitoff.remove(false, false); } else if (eventName.equals("AddCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Adding creature '" + creatureName + "' to legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType creatureType = game.getVariant().getCreatureByName( creatureName); legion.addCreature(creatureType, false); // Skip for players that will be dead by end of replay if (!legion.getPlayer().getDeadBeforeSave()) { server.allTellAddCreature(new AddCreatureAction(legion, creatureType), false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); } else if (eventName.equals("RemoveCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Removing creature '" + creatureName + "' from legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); if (legion == null) { LOGGER.warning("removeCreature " + creatureName + " from legion " + markerId + ", legion is null"); return; } else { List<? extends Creature> cres = legion.getCreatures(); List<String> crenames = new ArrayList<String>(); for (Creature c : cres) { crenames.add(c.getName()); } } // don't use disbandIfEmpty parameter since that'll fire another history event CreatureType removedCritter = legion.removeCreature(game .getVariant().getCreatureByName(creatureName), false, false); // Skip for players that will be dead by end of replay // Skip if removedCritter is null => removeCreature did not find it, // so there is something wrong with the save game. No use to bother // all the clients with it. if (removedCritter != null && !legion.getPlayer().getDeadBeforeSave()) { server.allTellRemoveCreature(legion, removedCritter, false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); if (legion.getHeight() == 0) { legion.remove(false, false); LOGGER.finer("Legion '" + markerId + "' removed"); } } else if (eventName.equals("PlayerElim")) { String playerName = el.getAttributeValue("name"); String slayerName = el.getAttributeValue("slayer"); Player player = game.getPlayerByName(playerName); Player slayer = game.getPlayerByNameIgnoreNull(slayerName); // Record the slayer and give him this player's legion markers. if (slayer != null) { ((PlayerServerSide)player).handleSlaying(slayer); } player.setDead(true); server.allUpdatePlayerInfo(); server.allTellPlayerElim(player, slayer, false); } else if (eventName.equals("MovementRoll")) { String playerName = el.getAttributeValue("playerName"); Player player = game.getPlayerByName(playerName); int roll = Integer.parseInt(el.getAttributeValue("roll")); ((PlayerServerSide)player).setMovementRoll(roll); game.movementRollEvent(player, roll); server.allTellMovementRoll(roll); } else if (eventName.equals("Move")) { String markerId = el.getAttributeValue("markerId"); String lordName = el.getAttributeValue("revealedLord"); String tele = el.getAttributeValue("teleport"); String newHexLabel = el.getAttributeValue("newHex"); String entrySideName = el.getAttributeValue("entrySide"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType revealedLord = lordName.equals("null") ? null : game .getVariant().getCreatureByName(lordName); MasterHex newHex = server.getGame().getVariant().getMasterBoard() .getHexByLabel(newHexLabel); EntrySide entrySide = EntrySide.fromLabel(entrySideName); boolean teleport = tele != null && tele.equals("true"); LOGGER.finest("Legion Move redo event: \n" + " marker " + markerId + ", lordName " + revealedLord + " teleported " + teleport + " to hex " + newHex.getLabel() + " entrySide " + entrySide.toString()); server.overrideProcessingCH(legion.getPlayer()); server.doMove(legion, newHex, entrySide, teleport, revealedLord); server.restoreProcessingCH(); } else if (eventName.equals("UndoMove")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER.finest("Legion Undo Move redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoMove(legion); server.restoreProcessingCH(); } else if (eventName.equals("Recruit")) { String markerId = el.getAttributeValue("markerId"); String recruitName = el.getAttributeValue("recruit"); String recruiterName = el.getAttributeValue("recruiter"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType recruit = game.getVariant().getCreatureByName( recruitName); CreatureType recruiter = recruiterName.equals("null") ? null : game.getVariant().getCreatureByName(recruiterName); LOGGER.finest("Recruit redo event: \n" + " marker " + markerId + " recruit " + recruit + " recruiter " + recruiter); server.overrideProcessingCH(legion.getPlayer()); server.doRecruit(new Recruitment(legion, recruit, recruiter)); server.restoreProcessingCH(); } else if (eventName.equals("UndoRecruit")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER .finest("UndoRecruit redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoRecruit(legion); server.restoreProcessingCH(); } else { LOGGER.warning("Unknown Redo element " + eventName); } } } ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:10 Message: Btw, it says Sun Java ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 16:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 15:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 18:17:54
|
Bugs item #3177305, was opened at 2011-02-10 12:40 Message generated for change (Comment added) made by You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 18:17 Message: So I've been running through this... moving, recruiting, etc... then I came to a point where it won't let me pick again. :/ Says: kevinnew: Pick Recruiter in Brush hex17 There is more than one way you can recruit this. Current content of legion Gr05: There is a Titan, Cyclops, Gargoyle, Gargoyle, Centaur, Centaur Pick the creature type you want to reveal: There is a Cyclops, Gargoyle I can't pick anything. Tried clicking on it numerous times. Nothing will select and it is stuck on this dialog box. Not sure why this happening... but thank you for sticking it out with me. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 18:12 Message: You are correct. I typed the name in, it found it and ran fine. Well.. I can play now. yay! ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 18:08 Message: K so, I opened the default kevin.cfg and added those lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green And it worked. The game started. Made me green in fact. So far so good to, I was able to split a stack. Move the unit. Recruit. And watched the computer take it's move as well. So not sure why it wasn't working but it is now. Want to continue to troubleshoot? I guess I can always play green. :p ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 18:06 Message: No, you cannot "pick" the name kevinnew - it does not offer all "names that may exist". You choose the name on "Players" tab, On left side, Choose HUman, on right side type the name. 2nd Line, choose e.g. "SimpleAI", it fills right side with <byColor> or something, thats ok, Type there in first line the name kevinnew, and when game starts, it goes looking for a file Colossus-kewvinnew.cfg [and if it wouldn't exist, create it, sooner or later, after GUI / preferences changes]. Now we pre-create that file, so that it skips the color picking dialog because it would find a value to say "auto pick" from the file. -Cle. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:59 Message: btw, I did try and run the Colossus.jnlp stand alone and brings up the welcome screen, I hit ok, and the Game setup screen appears. I still can't choose newkevin and when I run it, once again I can not pick any of the colors. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:57 Message: I'll start from the beginning: • I open a folder I extracted all the files to from the .zip • I double click on run.bat A cmd window pops up with: C:\Documents and Settings\kevin\Desktop\collossus>cd "c:\Documents and Settings\kevin\Desktop\collossus\" C:\Documents and Settings\kevin\Desktop\collossus>java -Djava.util.logging.config.file=logging.properties -XMx256M -jar Colossus.jar Then what looks like the main program appears. It is the game setup screen. I make player one a human player and choose Kevin as the type. I make the 2nd player a SimpleAI and choose <By color> for the type. I leave everything else as is. (btw the top says Running Colossus Version 0.12.0-beta1 (revision 4970) on etc...) • I pick New game. The game appears to start, I can see the grid in the background with all the hills, deserts, etc. A small box with Pick a Color appears. I can move this box around. But I can not pick a color. I've tried clicking on every single one. I've tried pressing G, e, o, etc. I've tried Ctrl/Alt combinations, nothing. I can not close it either. I have to force it to shutdown. In Task Manager it shows that it is still running... so I don't THINK it is locked up. I do NOT see any other windows anywhere that I might need to click. I've even tried Alt+Tab and Ctrl+Tab to check. • I went ahead and did a search for the .colossus folder. I found it. It has 5 files in it. Colossus-netclient.cfg Colossus-red.cfg Colossus-server.cfg Colossus-kevin.cfg Colossus-kevin1.cfg • I went ahead and created a new .cfg file. I named it Colossus-kevinnew.cfg. I added these lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Interestingly here, when I started the program, I could not choose kevinnew. I could only still see kevin. I searched my entire computer to see if the .cfg files might also be somewhere else but I could only find them under \\documents and settings\kevin\desktop\collossus • Ok so I tried your command prompt idea. I even ran the command from within the path and I kept getting this error... Unable to access jarfile Colossus.jar I can't imagine it being a graphical error... the program still seems to be running fine, I just can't select any color. In Task Manager it doesn't say "not responding". So I will wait for your reply. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 17:06 Message: ok, XP with SP3 and Sun Java 6 ( 1.6.x ). All right, that should work. ( I may have in use SP2 but still). E.g. "Windows Vista" or "Windows 7" are more "exotic" for me. Sun Java is good also. Did you get the "Welcome to Release 0.12.0" dialog and click it away? (if not, it might have lurked around in the background hidden behind some other window and block the mouse/keyboard input or whatever ("modal dialog"). Should technically not happen/be possible, but one has seen stranger things happen.... The History.java is one of the source files, not relevant. > The only .cf files I could find are WebServer.cf, WebServer_unix.cf, > and WebServer_win.cf. Do you want me to add a line into one of these? No. They are part of the "sources" as well, in some sense. Once started, Colossus will create a directory ".colossus" (and 2 files in it) "somewhere on your computer" - in what it considers to be "your home directory". What that exactly is, might vary... The home directory is under Windows _often_ something like: C:\Documents and Settings\Mike if you logged in to the computer with username Mike. Often you get there with right-click on Start button => Explore => opens an explorer e.g. to C:\Documents and Settings\katzer\Start Menu for me as user katzer. So katzer would be my home dir. However on my computer it's configured differently, so my home directory is D:\katzer You can take an explorer (the Start => right-click => Explore thing) and type in the "path"/adress line in the top "%HOME%" and press return. (you may need to make it visible first with View => Toolbars => Address bar ). Inside there should be .colossus. Once you found that we are much further :) (normally, once masterboardboard is open, Help => About would tell the location but you don't even get there yet :-/ ) Inside there will be eventually several .cfg files (and perhaps a "saves" directory). Directory of D:\katzer\.colossus 07.02.2011 10:06 <DIR> . 07.02.2011 10:06 <DIR> .. 07.02.2011 15:12 1 997 Colossus-clemens.cfg 08.02.2011 19:49 4 425 Colossus-katzer.cfg 08.02.2011 19:49 2 069 Colossus-katzer1.cfg 28.07.2010 17:18 276 Colossus-netclient.cfg 08.02.2011 19:49 900 Colossus-server.cfg 07.02.2011 15:12 2 059 Colossus-test1.cfg 07.02.2011 22:00 586 Colossus-webclient.cfg 07.02.2011 10:56 <DIR> saves 7 File(s) 12 312 bytes 3 Dir(s) 21 313 040 384 bytes free D:\katzer\.colossus> You can ignore the "-server", -webclient and -netclient files for now - they are "internal". -katzer and -clemens etc. are "client preferences" files. Like, I played once a game as clemens, and when changed preferences such as the various auto-<do something>, position and size of windows etc., Colossus would save those to a file with that name. (some other, like Variant, type and names of players, Options in Startup dialog, are stored to the Colossus-server.cfg file). Usually when you get the Game Setup dialog (where you choose variant, count and type of players etc), first of them you make "Human" and name is initialized with the name you are logged on to the computer. Thus created with some text editor (notepad, if necessary), a textfile named Colossus-Mike.cfg (replace your name, of course). (if necessaary, right click in the right side of explorer, where the files are shown => New => Text Document => then there exists a file "New File.txt" (or similar). Click it, or F2 on it, change name to above. Put into that file the following three lines: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Note the "backslash" ( \ ) in front of the space. Now if you start a game with your player name set to "Mike" the Pick... dialogs should not appear. So question is, what will get stuck then :) The other interesting thing to try is, if you can run from commandline (by typing that command, which will make the java command shown): java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar While Colossus runs, eventually happening warnings etc. would be printed to that Command window. But if it's a total "Graphics stuff somehow freezes" (like it sounds, that it does not accept click or key on any of the colors) ... hm. Tricky. Might be no warning/exception, just the graphics thread (EDT, Event Dispatcher Thread, techno babble... ;-) hangs. Let's see so far, how far we get with above. If we get that, I've already some ideas how to proceed. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:15 Message: Not sure if this will help... I found a file called History.java under my recent documents. It's pretty lengthy but it is listed below: package net.sf.colossus.server; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.colossus.common.Constants; import net.sf.colossus.game.Creature; import net.sf.colossus.game.EntrySide; import net.sf.colossus.game.Legion; import net.sf.colossus.game.Player; import net.sf.colossus.game.actions.AddCreatureAction; import net.sf.colossus.game.actions.Recruitment; import net.sf.colossus.util.Glob; import net.sf.colossus.variant.CreatureType; import net.sf.colossus.variant.MasterHex; import org.jdom.Element; /** * Stores game history as XML. * * @author David Ripton */ public class History { private static final Logger LOGGER = Logger.getLogger(History.class .getName()); /** * History: events that happened before last commit point */ private final Element root; /** * History elements/events that happened since the last commit/"snapshot". */ private final List<Element> recentEvents = new LinkedList<Element>(); /** * Set to true during the processing of {@link #fireEventsFromXML(Server)} * to avoid triggering events we just restored again. */ private boolean loading = false; /** * */ private final Element loadedRedoLog; private boolean isRedo = false; /** * Stores the surviving legions (this variable is not needed any more) * * While the history should contain all information to reproduce the game * state, the last set of legions is currently still loaded upfront since * they contain the battle-specific information. This collides with * replaying the game from history... * Now, since 08/2008, they are not stored as "survivorlegions" any more. * Instead, they are backed up internally (done inside PlayerServerSide), * all the history is replayed. This creates proper split prediction data * in all clients. After that, backup data is compared with result of * replay. * E.g. Legion count, their content, players eliminated must be in sync. * Then the replayed ones are discarded and the backedup ones restored * - which have the right legion state (moved, donor, summoned, ...) * * TODO align the history replay more with the original gameplay so we * don't need this anymore; * 08/2008:==> this is now to some part done. Still replay * events could be closer to original events (split, summon, * acquire, teleport, ...) , not just the "result" of that * event (reveal,add,remove effects). * * TODO instead: model the actual events instead of just result, * or at least add relevant info to history elements, so that all * replayed events carry all needed data so that they could also be * processed by event viewer (currently EV does not process anything * during replay). */ public History() { root = new Element("History"); // Dummy: loadedRedoLog = new Element("LoadedRedoLog"); } /** * Constructor used by "LoadGame" */ public History(Element loadGameRoot) { // Get the history elements and store them to "root" root = (Element)loadGameRoot.getChild("History").clone(); // Get the redo log content loadedRedoLog = (Element)loadGameRoot.getChild("Redo").clone(); } /** * All events before last commit */ Element getCopy() { return (Element)root.clone(); } /** * Reached a commit point: append all recent events to the history, * clear list of recent events; caller should do this together with creating * the next snapshot. */ void flushRecentToRoot() { for (Element el : recentEvents) { el.detach(); String name = el.getName(); // TODO later, when this are proper events (not XML elements), // ask rather from the Event whether it belongs copied to // history or not. // TODO At some point in future, put also those Move events // that reveal something to history, and make either the history // replay only send the relevant reveal messages, or make the // Clients during replay (but not redo part) ignore the "move" // and just process the revealing part. // Preferrably the latter, so that proper events show up in the // EventViewer. if (name.equals("Move") || name.equals("UndoMove")) { LOGGER.finest("Flush Redo to History: skipping " + name); } else if (name.equals("Recruit") || name.equals("UndoRecruit")) { // Skipping for now, because there are also the addCreature, // removeCreature and reveal Events still in history. // TODO make the Recruit/UndoRecruit history events during // replay properly, get rid of the "side effect" type of // entries in save game. LOGGER.finest("Flush Redo to History: skipping " + name); } else { root.addContent(el); } } recentEvents.clear(); } /** * @return A Redo Element, containing all events since last commit * i.e. which need to be REDOne on top of last commit point/snapshot */ Element getNewRedoLogElement() { Element redoLogElement = new Element("Redo"); for (Element el : recentEvents) { el.detach(); redoLogElement.addContent(el); } return redoLogElement; } /** * TODO reconsider name * TODO decide if we should move it all into one big handleEvent(GameEvent) method */ void addCreatureEvent(AddCreatureAction event, int turn, String reason) { if (loading) { return; } Element element = new Element("AddCreature"); element.setAttribute("markerId", event.getLegion().getMarkerId()); element.setAttribute("creatureName", event.getAddedCreatureType() .getName()); element.setAttribute("turn", "" + turn); element.setAttribute("reason", reason); recentEvents.add(element); } void removeCreatureEvent(Legion legion, CreatureType creature, int turn, String reason) { if (loading) { return; } Element event = new Element("RemoveCreature"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("creatureName", creature.getName()); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); recentEvents.add(event); } void splitEvent(Legion parent, Legion child, List<CreatureType> splitoffs, int turn) { if (loading) { return; } Element event = new Element("Split"); event.setAttribute("parentId", parent.getMarkerId()); event.setAttribute("childId", child.getMarkerId()); event.setAttribute("turn", "" + turn); Element creatures = new Element("splitoffs"); event.addContent(creatures); for (CreatureType creatureType : splitoffs) { Element cr = new Element("creature"); cr.addContent(creatureType.getName()); creatures.addContent(cr); } recentEvents.add(event); } void mergeEvent(String splitoffId, String survivorId, int turn) { if (loading) { return; } Element event = new Element("Merge"); event.setAttribute("splitoffId", splitoffId); event.setAttribute("survivorId", survivorId); event.setAttribute("turn", "" + turn); recentEvents.add(event); } void revealEvent(boolean allPlayers, List<Player> players, Legion legion, List<CreatureType> creatures, int turn, String reason) { if (loading) { return; } if (creatures.isEmpty()) { // this happens e.g. when in final battle (titan vs. titan) // angel was called out of legion which was then empty, // and in the final updateAllLegionContents there is then // this empty legion... // TODO if this case can happen in a regular game no warning // should be logged LOGGER.log(Level.WARNING, "Called revealEvent(" + allPlayers + ", " + (players != null ? players.toString() : "-null-") + ", " + legion + ", " + creatures.toString() + ", " + turn + ") with empty creatureNames"); return; } Element event = new Element("Reveal"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("allPlayers", "" + allPlayers); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); if (!allPlayers) { Element viewers = new Element("viewers"); event.addContent(viewers); Iterator<Player> it = players.iterator(); while (it.hasNext()) { String playerName = it.next().getName(); Element viewer = new Element("viewer"); viewer.addContent(playerName); viewers.addContent(viewer); } } Element creaturesElem = new Element("creatures"); event.addContent(creaturesElem); for (CreatureType creatureType : creatures) { Element creatureElem = new Element("creature"); creatureElem.addContent(creatureType.getName()); creaturesElem.addContent(creatureElem); } recentEvents.add(event); } void playerElimEvent(Player player, Player slayer, int turn) { if (loading) { return; } Element event = new Element("PlayerElim"); event.setAttribute("name", player.getName()); if (slayer != null) { event.setAttribute("slayer", slayer.getName()); } event.setAttribute("turn", "" + turn); recentEvents.add(event); } void movementRollEvent(Player player, int roll) { if (loading) { return; } Element event = new Element("MovementRoll"); event.setAttribute("playerName", player.getName()); event.setAttribute("roll", "" + roll); recentEvents.add(event); } void legionMoveEvent(Legion legion, MasterHex newHex, EntrySide entrySide, boolean teleport, CreatureType lord) { if (loading) { return; } Element event = new Element("Move"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("newHex", newHex.getLabel()); event.setAttribute("entrySide", entrySide.getLabel()); event.setAttribute("teleport", "" + teleport); String creNameOrTextNull = lord == null ? "null" : lord.getName(); event.setAttribute("revealedLord", creNameOrTextNull); recentEvents.add(event); } void legionUndoMoveEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoMove"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } void recruitEvent(Legion legion, CreatureType recruit, CreatureType recruiter) { if (loading) { return; } Element event = new Element("Recruit"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("recruit", recruit.getName()); event.setAttribute("recruiter", recruiter == null ? "null" : recruiter .getName()); recentEvents.add(event); } void undoRecruitEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoRecruit"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } /** * Fire all events from redoLog. * Elements from RedoLog are processed one by one and the corresponding * method is called on the Server object, pretty much as if a * ClientHandler would call it when receiving such a request from Client. * Note that in some cases overriding the processingCH is necessary * (because technically, this all currently happens while still the * connecting of last joining player is processed, so processingCH is * set to his ClientHandler). * * Note that "loading" is not set to true, so they DO GET ADDED to the * recentEvents list again. * * @param server The server on which to call all the actions to be redone */ void processRedoLog(Server server) { assert loadedRedoLog != null : "Loaded RedoLog should always " + "have a JDOM root element as backing store"; LOGGER.info("History: Start processing redo log"); isRedo = true; for (Object obj : loadedRedoLog.getChildren()) { Element el = (Element)obj; LOGGER.info("processing redo event " + el.getName()); fireEventFromElement(server, el); } isRedo = false; // TODO clear loadedRedoLog? LOGGER.info("Completed processing redo log"); } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventsFromXML(Server server) { this.loading = true; assert root != null : "History should always have a " + " JDOM root element as backing store"; List<Element> kids = root.getChildren(); Iterator<Element> it = kids.iterator(); while (it.hasNext()) { Element el = it.next(); fireEventFromElement(server, el); } this.loading = false; } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventFromElement(Server server, Element el) { GameServerSide game = server.getGame(); String eventName = el.getName(); String reasonPerhaps = el.getAttributeValue("reason"); String reason = (reasonPerhaps != null && !reasonPerhaps .equals("null")) ? reasonPerhaps : "<undefinedReason>"; if (eventName.equals("Reveal") && isRedo && reason.equals(Constants.reasonRecruiter)) { // Skip this because we redo the full recruit event // TODO LOGGER.finest("Skipping Reveal event (reason " + reason + ") during redo."); } else if (eventName.equals("AddCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping AddCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("RemoveCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping RemoveCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("Reveal")) { String allPlayers = el.getAttributeValue("allPlayers"); boolean all = allPlayers != null && allPlayers.equals("true"); String markerId = el.getAttributeValue("markerId"); List<String> playerNames = new ArrayList<String>(); Element viewEl = el.getChild("viewers"); int turn = Integer.parseInt(el.getAttributeValue("turn")); String playerName = null; if (viewEl != null) { List<Element> viewers = viewEl.getChildren(); Iterator<Element> it = viewers.iterator(); while (it.hasNext()) { Element viewer = it.next(); playerName = viewer.getTextNormalize(); playerNames.add(playerName); } } List<Element> creatureElements = el.getChild("creatures") .getChildren(); List<CreatureType> creatures = new ArrayList<CreatureType>(); for (Element creature : creatureElements) { String creatureName = creature.getTextNormalize(); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } Player player = game.getPlayerByMarkerId(markerId); Legion legion; if (turn == 1 && player.getLegionByMarkerId(markerId) == null) { // there is no create event for the startup legions, // so we might need to create them for the reveal event legion = new LegionServerSide(markerId, null, player .getStartingTower(), player.getStartingTower(), player, game, creatures .toArray(new CreatureType[creatures.size()])); player.addLegion(legion); } else { legion = player.getLegionByMarkerId(markerId); } // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; if (((PlayerServerSide)player).getDeadBeforeSave()) { // Skip for players that will be dead by end of replay } else if (all) { server.allRevealCreatures(legion, creatures, reason); } else { server.oneRevealLegion(game.getPlayerByName(playerName), legion, creatures, reason); } } else if (eventName.equals("Split")) { String parentId = el.getAttributeValue("parentId"); String childId = el.getAttributeValue("childId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); List<String> creatureNames = new ArrayList<String>(); List<CreatureType> creatures = new ArrayList<CreatureType>(); List<Element> splitoffs = el.getChild("splitoffs").getChildren(); Iterator<Element> it = splitoffs.iterator(); while (it.hasNext()) { Element creature = it.next(); String creatureName = creature.getTextNormalize(); creatureNames.add(creatureName); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } LegionServerSide parentLegion = game.getLegionByMarkerId(parentId); if (isRedo) { server.overrideProcessingCH(parentLegion.getPlayer()); server.doSplit(parentLegion, childId, creatures); server.overrideProcessingCH(parentLegion.getPlayer()); return; } // LegionServerSide.split(..) doesn't like us here since the parent // legion can't remove creatures (not there?) -- create child directly // instead PlayerServerSide player = parentLegion.getPlayer(); LegionServerSide childLegion; if (player.hasLegion(childId)) { childLegion = game.getLegionByMarkerId(childId); LOGGER.severe("During replay of history: child legion " + childId + " should not " + "exist yet (turn=" + turn + ")!!\n" + "Exists already with: " + Glob.glob(",", childLegion.getCreatureTypes()) + " but " + "should now be created with creatures: " + creatures); childLegion.remove(); } childLegion = new LegionServerSide(childId, null, parentLegion .getCurrentHex(), parentLegion.getCurrentHex(), player, game, creatures.toArray(new CreatureType[creatures.size()])); player.addLegion(childLegion); for (CreatureType creature : creatures) { parentLegion.removeCreature(creature, false, false); } // Skip for players that will be dead by end of replay if (!player.getDeadBeforeSave()) { server.allTellDidSplit(parentLegion, childLegion, turn, false); } } else if (eventName.equals("Merge")) { String splitoffId = el.getAttributeValue("splitoffId"); String survivorId = el.getAttributeValue("survivorId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); LegionServerSide splitoff = game.getLegionByMarkerId(splitoffId); LegionServerSide survivor = game.getLegionByMarkerId(survivorId); // Skip for players that will be dead by end of replay if (!survivor.getPlayer().getDeadBeforeSave()) { server.undidSplit(splitoff, survivor, false, turn); } // Add them back to parent: while (splitoff.getHeight() > 0) { CreatureType type = splitoff.removeCreature(0, false, false); survivor.addCreature(type, false); } splitoff.remove(false, false); } else if (eventName.equals("AddCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Adding creature '" + creatureName + "' to legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType creatureType = game.getVariant().getCreatureByName( creatureName); legion.addCreature(creatureType, false); // Skip for players that will be dead by end of replay if (!legion.getPlayer().getDeadBeforeSave()) { server.allTellAddCreature(new AddCreatureAction(legion, creatureType), false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); } else if (eventName.equals("RemoveCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Removing creature '" + creatureName + "' from legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); if (legion == null) { LOGGER.warning("removeCreature " + creatureName + " from legion " + markerId + ", legion is null"); return; } else { List<? extends Creature> cres = legion.getCreatures(); List<String> crenames = new ArrayList<String>(); for (Creature c : cres) { crenames.add(c.getName()); } } // don't use disbandIfEmpty parameter since that'll fire another history event CreatureType removedCritter = legion.removeCreature(game .getVariant().getCreatureByName(creatureName), false, false); // Skip for players that will be dead by end of replay // Skip if removedCritter is null => removeCreature did not find it, // so there is something wrong with the save game. No use to bother // all the clients with it. if (removedCritter != null && !legion.getPlayer().getDeadBeforeSave()) { server.allTellRemoveCreature(legion, removedCritter, false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); if (legion.getHeight() == 0) { legion.remove(false, false); LOGGER.finer("Legion '" + markerId + "' removed"); } } else if (eventName.equals("PlayerElim")) { String playerName = el.getAttributeValue("name"); String slayerName = el.getAttributeValue("slayer"); Player player = game.getPlayerByName(playerName); Player slayer = game.getPlayerByNameIgnoreNull(slayerName); // Record the slayer and give him this player's legion markers. if (slayer != null) { ((PlayerServerSide)player).handleSlaying(slayer); } player.setDead(true); server.allUpdatePlayerInfo(); server.allTellPlayerElim(player, slayer, false); } else if (eventName.equals("MovementRoll")) { String playerName = el.getAttributeValue("playerName"); Player player = game.getPlayerByName(playerName); int roll = Integer.parseInt(el.getAttributeValue("roll")); ((PlayerServerSide)player).setMovementRoll(roll); game.movementRollEvent(player, roll); server.allTellMovementRoll(roll); } else if (eventName.equals("Move")) { String markerId = el.getAttributeValue("markerId"); String lordName = el.getAttributeValue("revealedLord"); String tele = el.getAttributeValue("teleport"); String newHexLabel = el.getAttributeValue("newHex"); String entrySideName = el.getAttributeValue("entrySide"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType revealedLord = lordName.equals("null") ? null : game .getVariant().getCreatureByName(lordName); MasterHex newHex = server.getGame().getVariant().getMasterBoard() .getHexByLabel(newHexLabel); EntrySide entrySide = EntrySide.fromLabel(entrySideName); boolean teleport = tele != null && tele.equals("true"); LOGGER.finest("Legion Move redo event: \n" + " marker " + markerId + ", lordName " + revealedLord + " teleported " + teleport + " to hex " + newHex.getLabel() + " entrySide " + entrySide.toString()); server.overrideProcessingCH(legion.getPlayer()); server.doMove(legion, newHex, entrySide, teleport, revealedLord); server.restoreProcessingCH(); } else if (eventName.equals("UndoMove")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER.finest("Legion Undo Move redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoMove(legion); server.restoreProcessingCH(); } else if (eventName.equals("Recruit")) { String markerId = el.getAttributeValue("markerId"); String recruitName = el.getAttributeValue("recruit"); String recruiterName = el.getAttributeValue("recruiter"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType recruit = game.getVariant().getCreatureByName( recruitName); CreatureType recruiter = recruiterName.equals("null") ? null : game.getVariant().getCreatureByName(recruiterName); LOGGER.finest("Recruit redo event: \n" + " marker " + markerId + " recruit " + recruit + " recruiter " + recruiter); server.overrideProcessingCH(legion.getPlayer()); server.doRecruit(new Recruitment(legion, recruit, recruiter)); server.restoreProcessingCH(); } else if (eventName.equals("UndoRecruit")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER .finest("UndoRecruit redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoRecruit(legion); server.restoreProcessingCH(); } else { LOGGER.warning("Unknown Redo element " + eventName); } } } ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:10 Message: Btw, it says Sun Java ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 13:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 12:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 18:12:12
|
Bugs item #3177305, was opened at 2011-02-10 12:40 Message generated for change (Comment added) made by You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 18:12 Message: You are correct. I typed the name in, it found it and ran fine. Well.. I can play now. yay! ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 18:08 Message: K so, I opened the default kevin.cfg and added those lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green And it worked. The game started. Made me green in fact. So far so good to, I was able to split a stack. Move the unit. Recruit. And watched the computer take it's move as well. So not sure why it wasn't working but it is now. Want to continue to troubleshoot? I guess I can always play green. :p ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 18:06 Message: No, you cannot "pick" the name kevinnew - it does not offer all "names that may exist". You choose the name on "Players" tab, On left side, Choose HUman, on right side type the name. 2nd Line, choose e.g. "SimpleAI", it fills right side with <byColor> or something, thats ok, Type there in first line the name kevinnew, and when game starts, it goes looking for a file Colossus-kewvinnew.cfg [and if it wouldn't exist, create it, sooner or later, after GUI / preferences changes]. Now we pre-create that file, so that it skips the color picking dialog because it would find a value to say "auto pick" from the file. -Cle. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:59 Message: btw, I did try and run the Colossus.jnlp stand alone and brings up the welcome screen, I hit ok, and the Game setup screen appears. I still can't choose newkevin and when I run it, once again I can not pick any of the colors. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:57 Message: I'll start from the beginning: • I open a folder I extracted all the files to from the .zip • I double click on run.bat A cmd window pops up with: C:\Documents and Settings\kevin\Desktop\collossus>cd "c:\Documents and Settings\kevin\Desktop\collossus\" C:\Documents and Settings\kevin\Desktop\collossus>java -Djava.util.logging.config.file=logging.properties -XMx256M -jar Colossus.jar Then what looks like the main program appears. It is the game setup screen. I make player one a human player and choose Kevin as the type. I make the 2nd player a SimpleAI and choose <By color> for the type. I leave everything else as is. (btw the top says Running Colossus Version 0.12.0-beta1 (revision 4970) on etc...) • I pick New game. The game appears to start, I can see the grid in the background with all the hills, deserts, etc. A small box with Pick a Color appears. I can move this box around. But I can not pick a color. I've tried clicking on every single one. I've tried pressing G, e, o, etc. I've tried Ctrl/Alt combinations, nothing. I can not close it either. I have to force it to shutdown. In Task Manager it shows that it is still running... so I don't THINK it is locked up. I do NOT see any other windows anywhere that I might need to click. I've even tried Alt+Tab and Ctrl+Tab to check. • I went ahead and did a search for the .colossus folder. I found it. It has 5 files in it. Colossus-netclient.cfg Colossus-red.cfg Colossus-server.cfg Colossus-kevin.cfg Colossus-kevin1.cfg • I went ahead and created a new .cfg file. I named it Colossus-kevinnew.cfg. I added these lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Interestingly here, when I started the program, I could not choose kevinnew. I could only still see kevin. I searched my entire computer to see if the .cfg files might also be somewhere else but I could only find them under \\documents and settings\kevin\desktop\collossus • Ok so I tried your command prompt idea. I even ran the command from within the path and I kept getting this error... Unable to access jarfile Colossus.jar I can't imagine it being a graphical error... the program still seems to be running fine, I just can't select any color. In Task Manager it doesn't say "not responding". So I will wait for your reply. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 17:06 Message: ok, XP with SP3 and Sun Java 6 ( 1.6.x ). All right, that should work. ( I may have in use SP2 but still). E.g. "Windows Vista" or "Windows 7" are more "exotic" for me. Sun Java is good also. Did you get the "Welcome to Release 0.12.0" dialog and click it away? (if not, it might have lurked around in the background hidden behind some other window and block the mouse/keyboard input or whatever ("modal dialog"). Should technically not happen/be possible, but one has seen stranger things happen.... The History.java is one of the source files, not relevant. > The only .cf files I could find are WebServer.cf, WebServer_unix.cf, > and WebServer_win.cf. Do you want me to add a line into one of these? No. They are part of the "sources" as well, in some sense. Once started, Colossus will create a directory ".colossus" (and 2 files in it) "somewhere on your computer" - in what it considers to be "your home directory". What that exactly is, might vary... The home directory is under Windows _often_ something like: C:\Documents and Settings\Mike if you logged in to the computer with username Mike. Often you get there with right-click on Start button => Explore => opens an explorer e.g. to C:\Documents and Settings\katzer\Start Menu for me as user katzer. So katzer would be my home dir. However on my computer it's configured differently, so my home directory is D:\katzer You can take an explorer (the Start => right-click => Explore thing) and type in the "path"/adress line in the top "%HOME%" and press return. (you may need to make it visible first with View => Toolbars => Address bar ). Inside there should be .colossus. Once you found that we are much further :) (normally, once masterboardboard is open, Help => About would tell the location but you don't even get there yet :-/ ) Inside there will be eventually several .cfg files (and perhaps a "saves" directory). Directory of D:\katzer\.colossus 07.02.2011 10:06 <DIR> . 07.02.2011 10:06 <DIR> .. 07.02.2011 15:12 1 997 Colossus-clemens.cfg 08.02.2011 19:49 4 425 Colossus-katzer.cfg 08.02.2011 19:49 2 069 Colossus-katzer1.cfg 28.07.2010 17:18 276 Colossus-netclient.cfg 08.02.2011 19:49 900 Colossus-server.cfg 07.02.2011 15:12 2 059 Colossus-test1.cfg 07.02.2011 22:00 586 Colossus-webclient.cfg 07.02.2011 10:56 <DIR> saves 7 File(s) 12 312 bytes 3 Dir(s) 21 313 040 384 bytes free D:\katzer\.colossus> You can ignore the "-server", -webclient and -netclient files for now - they are "internal". -katzer and -clemens etc. are "client preferences" files. Like, I played once a game as clemens, and when changed preferences such as the various auto-<do something>, position and size of windows etc., Colossus would save those to a file with that name. (some other, like Variant, type and names of players, Options in Startup dialog, are stored to the Colossus-server.cfg file). Usually when you get the Game Setup dialog (where you choose variant, count and type of players etc), first of them you make "Human" and name is initialized with the name you are logged on to the computer. Thus created with some text editor (notepad, if necessary), a textfile named Colossus-Mike.cfg (replace your name, of course). (if necessaary, right click in the right side of explorer, where the files are shown => New => Text Document => then there exists a file "New File.txt" (or similar). Click it, or F2 on it, change name to above. Put into that file the following three lines: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Note the "backslash" ( \ ) in front of the space. Now if you start a game with your player name set to "Mike" the Pick... dialogs should not appear. So question is, what will get stuck then :) The other interesting thing to try is, if you can run from commandline (by typing that command, which will make the java command shown): java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar While Colossus runs, eventually happening warnings etc. would be printed to that Command window. But if it's a total "Graphics stuff somehow freezes" (like it sounds, that it does not accept click or key on any of the colors) ... hm. Tricky. Might be no warning/exception, just the graphics thread (EDT, Event Dispatcher Thread, techno babble... ;-) hangs. Let's see so far, how far we get with above. If we get that, I've already some ideas how to proceed. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:15 Message: Not sure if this will help... I found a file called History.java under my recent documents. It's pretty lengthy but it is listed below: package net.sf.colossus.server; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.colossus.common.Constants; import net.sf.colossus.game.Creature; import net.sf.colossus.game.EntrySide; import net.sf.colossus.game.Legion; import net.sf.colossus.game.Player; import net.sf.colossus.game.actions.AddCreatureAction; import net.sf.colossus.game.actions.Recruitment; import net.sf.colossus.util.Glob; import net.sf.colossus.variant.CreatureType; import net.sf.colossus.variant.MasterHex; import org.jdom.Element; /** * Stores game history as XML. * * @author David Ripton */ public class History { private static final Logger LOGGER = Logger.getLogger(History.class .getName()); /** * History: events that happened before last commit point */ private final Element root; /** * History elements/events that happened since the last commit/"snapshot". */ private final List<Element> recentEvents = new LinkedList<Element>(); /** * Set to true during the processing of {@link #fireEventsFromXML(Server)} * to avoid triggering events we just restored again. */ private boolean loading = false; /** * */ private final Element loadedRedoLog; private boolean isRedo = false; /** * Stores the surviving legions (this variable is not needed any more) * * While the history should contain all information to reproduce the game * state, the last set of legions is currently still loaded upfront since * they contain the battle-specific information. This collides with * replaying the game from history... * Now, since 08/2008, they are not stored as "survivorlegions" any more. * Instead, they are backed up internally (done inside PlayerServerSide), * all the history is replayed. This creates proper split prediction data * in all clients. After that, backup data is compared with result of * replay. * E.g. Legion count, their content, players eliminated must be in sync. * Then the replayed ones are discarded and the backedup ones restored * - which have the right legion state (moved, donor, summoned, ...) * * TODO align the history replay more with the original gameplay so we * don't need this anymore; * 08/2008:==> this is now to some part done. Still replay * events could be closer to original events (split, summon, * acquire, teleport, ...) , not just the "result" of that * event (reveal,add,remove effects). * * TODO instead: model the actual events instead of just result, * or at least add relevant info to history elements, so that all * replayed events carry all needed data so that they could also be * processed by event viewer (currently EV does not process anything * during replay). */ public History() { root = new Element("History"); // Dummy: loadedRedoLog = new Element("LoadedRedoLog"); } /** * Constructor used by "LoadGame" */ public History(Element loadGameRoot) { // Get the history elements and store them to "root" root = (Element)loadGameRoot.getChild("History").clone(); // Get the redo log content loadedRedoLog = (Element)loadGameRoot.getChild("Redo").clone(); } /** * All events before last commit */ Element getCopy() { return (Element)root.clone(); } /** * Reached a commit point: append all recent events to the history, * clear list of recent events; caller should do this together with creating * the next snapshot. */ void flushRecentToRoot() { for (Element el : recentEvents) { el.detach(); String name = el.getName(); // TODO later, when this are proper events (not XML elements), // ask rather from the Event whether it belongs copied to // history or not. // TODO At some point in future, put also those Move events // that reveal something to history, and make either the history // replay only send the relevant reveal messages, or make the // Clients during replay (but not redo part) ignore the "move" // and just process the revealing part. // Preferrably the latter, so that proper events show up in the // EventViewer. if (name.equals("Move") || name.equals("UndoMove")) { LOGGER.finest("Flush Redo to History: skipping " + name); } else if (name.equals("Recruit") || name.equals("UndoRecruit")) { // Skipping for now, because there are also the addCreature, // removeCreature and reveal Events still in history. // TODO make the Recruit/UndoRecruit history events during // replay properly, get rid of the "side effect" type of // entries in save game. LOGGER.finest("Flush Redo to History: skipping " + name); } else { root.addContent(el); } } recentEvents.clear(); } /** * @return A Redo Element, containing all events since last commit * i.e. which need to be REDOne on top of last commit point/snapshot */ Element getNewRedoLogElement() { Element redoLogElement = new Element("Redo"); for (Element el : recentEvents) { el.detach(); redoLogElement.addContent(el); } return redoLogElement; } /** * TODO reconsider name * TODO decide if we should move it all into one big handleEvent(GameEvent) method */ void addCreatureEvent(AddCreatureAction event, int turn, String reason) { if (loading) { return; } Element element = new Element("AddCreature"); element.setAttribute("markerId", event.getLegion().getMarkerId()); element.setAttribute("creatureName", event.getAddedCreatureType() .getName()); element.setAttribute("turn", "" + turn); element.setAttribute("reason", reason); recentEvents.add(element); } void removeCreatureEvent(Legion legion, CreatureType creature, int turn, String reason) { if (loading) { return; } Element event = new Element("RemoveCreature"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("creatureName", creature.getName()); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); recentEvents.add(event); } void splitEvent(Legion parent, Legion child, List<CreatureType> splitoffs, int turn) { if (loading) { return; } Element event = new Element("Split"); event.setAttribute("parentId", parent.getMarkerId()); event.setAttribute("childId", child.getMarkerId()); event.setAttribute("turn", "" + turn); Element creatures = new Element("splitoffs"); event.addContent(creatures); for (CreatureType creatureType : splitoffs) { Element cr = new Element("creature"); cr.addContent(creatureType.getName()); creatures.addContent(cr); } recentEvents.add(event); } void mergeEvent(String splitoffId, String survivorId, int turn) { if (loading) { return; } Element event = new Element("Merge"); event.setAttribute("splitoffId", splitoffId); event.setAttribute("survivorId", survivorId); event.setAttribute("turn", "" + turn); recentEvents.add(event); } void revealEvent(boolean allPlayers, List<Player> players, Legion legion, List<CreatureType> creatures, int turn, String reason) { if (loading) { return; } if (creatures.isEmpty()) { // this happens e.g. when in final battle (titan vs. titan) // angel was called out of legion which was then empty, // and in the final updateAllLegionContents there is then // this empty legion... // TODO if this case can happen in a regular game no warning // should be logged LOGGER.log(Level.WARNING, "Called revealEvent(" + allPlayers + ", " + (players != null ? players.toString() : "-null-") + ", " + legion + ", " + creatures.toString() + ", " + turn + ") with empty creatureNames"); return; } Element event = new Element("Reveal"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("allPlayers", "" + allPlayers); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); if (!allPlayers) { Element viewers = new Element("viewers"); event.addContent(viewers); Iterator<Player> it = players.iterator(); while (it.hasNext()) { String playerName = it.next().getName(); Element viewer = new Element("viewer"); viewer.addContent(playerName); viewers.addContent(viewer); } } Element creaturesElem = new Element("creatures"); event.addContent(creaturesElem); for (CreatureType creatureType : creatures) { Element creatureElem = new Element("creature"); creatureElem.addContent(creatureType.getName()); creaturesElem.addContent(creatureElem); } recentEvents.add(event); } void playerElimEvent(Player player, Player slayer, int turn) { if (loading) { return; } Element event = new Element("PlayerElim"); event.setAttribute("name", player.getName()); if (slayer != null) { event.setAttribute("slayer", slayer.getName()); } event.setAttribute("turn", "" + turn); recentEvents.add(event); } void movementRollEvent(Player player, int roll) { if (loading) { return; } Element event = new Element("MovementRoll"); event.setAttribute("playerName", player.getName()); event.setAttribute("roll", "" + roll); recentEvents.add(event); } void legionMoveEvent(Legion legion, MasterHex newHex, EntrySide entrySide, boolean teleport, CreatureType lord) { if (loading) { return; } Element event = new Element("Move"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("newHex", newHex.getLabel()); event.setAttribute("entrySide", entrySide.getLabel()); event.setAttribute("teleport", "" + teleport); String creNameOrTextNull = lord == null ? "null" : lord.getName(); event.setAttribute("revealedLord", creNameOrTextNull); recentEvents.add(event); } void legionUndoMoveEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoMove"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } void recruitEvent(Legion legion, CreatureType recruit, CreatureType recruiter) { if (loading) { return; } Element event = new Element("Recruit"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("recruit", recruit.getName()); event.setAttribute("recruiter", recruiter == null ? "null" : recruiter .getName()); recentEvents.add(event); } void undoRecruitEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoRecruit"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } /** * Fire all events from redoLog. * Elements from RedoLog are processed one by one and the corresponding * method is called on the Server object, pretty much as if a * ClientHandler would call it when receiving such a request from Client. * Note that in some cases overriding the processingCH is necessary * (because technically, this all currently happens while still the * connecting of last joining player is processed, so processingCH is * set to his ClientHandler). * * Note that "loading" is not set to true, so they DO GET ADDED to the * recentEvents list again. * * @param server The server on which to call all the actions to be redone */ void processRedoLog(Server server) { assert loadedRedoLog != null : "Loaded RedoLog should always " + "have a JDOM root element as backing store"; LOGGER.info("History: Start processing redo log"); isRedo = true; for (Object obj : loadedRedoLog.getChildren()) { Element el = (Element)obj; LOGGER.info("processing redo event " + el.getName()); fireEventFromElement(server, el); } isRedo = false; // TODO clear loadedRedoLog? LOGGER.info("Completed processing redo log"); } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventsFromXML(Server server) { this.loading = true; assert root != null : "History should always have a " + " JDOM root element as backing store"; List<Element> kids = root.getChildren(); Iterator<Element> it = kids.iterator(); while (it.hasNext()) { Element el = it.next(); fireEventFromElement(server, el); } this.loading = false; } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventFromElement(Server server, Element el) { GameServerSide game = server.getGame(); String eventName = el.getName(); String reasonPerhaps = el.getAttributeValue("reason"); String reason = (reasonPerhaps != null && !reasonPerhaps .equals("null")) ? reasonPerhaps : "<undefinedReason>"; if (eventName.equals("Reveal") && isRedo && reason.equals(Constants.reasonRecruiter)) { // Skip this because we redo the full recruit event // TODO LOGGER.finest("Skipping Reveal event (reason " + reason + ") during redo."); } else if (eventName.equals("AddCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping AddCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("RemoveCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping RemoveCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("Reveal")) { String allPlayers = el.getAttributeValue("allPlayers"); boolean all = allPlayers != null && allPlayers.equals("true"); String markerId = el.getAttributeValue("markerId"); List<String> playerNames = new ArrayList<String>(); Element viewEl = el.getChild("viewers"); int turn = Integer.parseInt(el.getAttributeValue("turn")); String playerName = null; if (viewEl != null) { List<Element> viewers = viewEl.getChildren(); Iterator<Element> it = viewers.iterator(); while (it.hasNext()) { Element viewer = it.next(); playerName = viewer.getTextNormalize(); playerNames.add(playerName); } } List<Element> creatureElements = el.getChild("creatures") .getChildren(); List<CreatureType> creatures = new ArrayList<CreatureType>(); for (Element creature : creatureElements) { String creatureName = creature.getTextNormalize(); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } Player player = game.getPlayerByMarkerId(markerId); Legion legion; if (turn == 1 && player.getLegionByMarkerId(markerId) == null) { // there is no create event for the startup legions, // so we might need to create them for the reveal event legion = new LegionServerSide(markerId, null, player .getStartingTower(), player.getStartingTower(), player, game, creatures .toArray(new CreatureType[creatures.size()])); player.addLegion(legion); } else { legion = player.getLegionByMarkerId(markerId); } // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; if (((PlayerServerSide)player).getDeadBeforeSave()) { // Skip for players that will be dead by end of replay } else if (all) { server.allRevealCreatures(legion, creatures, reason); } else { server.oneRevealLegion(game.getPlayerByName(playerName), legion, creatures, reason); } } else if (eventName.equals("Split")) { String parentId = el.getAttributeValue("parentId"); String childId = el.getAttributeValue("childId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); List<String> creatureNames = new ArrayList<String>(); List<CreatureType> creatures = new ArrayList<CreatureType>(); List<Element> splitoffs = el.getChild("splitoffs").getChildren(); Iterator<Element> it = splitoffs.iterator(); while (it.hasNext()) { Element creature = it.next(); String creatureName = creature.getTextNormalize(); creatureNames.add(creatureName); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } LegionServerSide parentLegion = game.getLegionByMarkerId(parentId); if (isRedo) { server.overrideProcessingCH(parentLegion.getPlayer()); server.doSplit(parentLegion, childId, creatures); server.overrideProcessingCH(parentLegion.getPlayer()); return; } // LegionServerSide.split(..) doesn't like us here since the parent // legion can't remove creatures (not there?) -- create child directly // instead PlayerServerSide player = parentLegion.getPlayer(); LegionServerSide childLegion; if (player.hasLegion(childId)) { childLegion = game.getLegionByMarkerId(childId); LOGGER.severe("During replay of history: child legion " + childId + " should not " + "exist yet (turn=" + turn + ")!!\n" + "Exists already with: " + Glob.glob(",", childLegion.getCreatureTypes()) + " but " + "should now be created with creatures: " + creatures); childLegion.remove(); } childLegion = new LegionServerSide(childId, null, parentLegion .getCurrentHex(), parentLegion.getCurrentHex(), player, game, creatures.toArray(new CreatureType[creatures.size()])); player.addLegion(childLegion); for (CreatureType creature : creatures) { parentLegion.removeCreature(creature, false, false); } // Skip for players that will be dead by end of replay if (!player.getDeadBeforeSave()) { server.allTellDidSplit(parentLegion, childLegion, turn, false); } } else if (eventName.equals("Merge")) { String splitoffId = el.getAttributeValue("splitoffId"); String survivorId = el.getAttributeValue("survivorId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); LegionServerSide splitoff = game.getLegionByMarkerId(splitoffId); LegionServerSide survivor = game.getLegionByMarkerId(survivorId); // Skip for players that will be dead by end of replay if (!survivor.getPlayer().getDeadBeforeSave()) { server.undidSplit(splitoff, survivor, false, turn); } // Add them back to parent: while (splitoff.getHeight() > 0) { CreatureType type = splitoff.removeCreature(0, false, false); survivor.addCreature(type, false); } splitoff.remove(false, false); } else if (eventName.equals("AddCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Adding creature '" + creatureName + "' to legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType creatureType = game.getVariant().getCreatureByName( creatureName); legion.addCreature(creatureType, false); // Skip for players that will be dead by end of replay if (!legion.getPlayer().getDeadBeforeSave()) { server.allTellAddCreature(new AddCreatureAction(legion, creatureType), false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); } else if (eventName.equals("RemoveCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Removing creature '" + creatureName + "' from legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); if (legion == null) { LOGGER.warning("removeCreature " + creatureName + " from legion " + markerId + ", legion is null"); return; } else { List<? extends Creature> cres = legion.getCreatures(); List<String> crenames = new ArrayList<String>(); for (Creature c : cres) { crenames.add(c.getName()); } } // don't use disbandIfEmpty parameter since that'll fire another history event CreatureType removedCritter = legion.removeCreature(game .getVariant().getCreatureByName(creatureName), false, false); // Skip for players that will be dead by end of replay // Skip if removedCritter is null => removeCreature did not find it, // so there is something wrong with the save game. No use to bother // all the clients with it. if (removedCritter != null && !legion.getPlayer().getDeadBeforeSave()) { server.allTellRemoveCreature(legion, removedCritter, false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); if (legion.getHeight() == 0) { legion.remove(false, false); LOGGER.finer("Legion '" + markerId + "' removed"); } } else if (eventName.equals("PlayerElim")) { String playerName = el.getAttributeValue("name"); String slayerName = el.getAttributeValue("slayer"); Player player = game.getPlayerByName(playerName); Player slayer = game.getPlayerByNameIgnoreNull(slayerName); // Record the slayer and give him this player's legion markers. if (slayer != null) { ((PlayerServerSide)player).handleSlaying(slayer); } player.setDead(true); server.allUpdatePlayerInfo(); server.allTellPlayerElim(player, slayer, false); } else if (eventName.equals("MovementRoll")) { String playerName = el.getAttributeValue("playerName"); Player player = game.getPlayerByName(playerName); int roll = Integer.parseInt(el.getAttributeValue("roll")); ((PlayerServerSide)player).setMovementRoll(roll); game.movementRollEvent(player, roll); server.allTellMovementRoll(roll); } else if (eventName.equals("Move")) { String markerId = el.getAttributeValue("markerId"); String lordName = el.getAttributeValue("revealedLord"); String tele = el.getAttributeValue("teleport"); String newHexLabel = el.getAttributeValue("newHex"); String entrySideName = el.getAttributeValue("entrySide"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType revealedLord = lordName.equals("null") ? null : game .getVariant().getCreatureByName(lordName); MasterHex newHex = server.getGame().getVariant().getMasterBoard() .getHexByLabel(newHexLabel); EntrySide entrySide = EntrySide.fromLabel(entrySideName); boolean teleport = tele != null && tele.equals("true"); LOGGER.finest("Legion Move redo event: \n" + " marker " + markerId + ", lordName " + revealedLord + " teleported " + teleport + " to hex " + newHex.getLabel() + " entrySide " + entrySide.toString()); server.overrideProcessingCH(legion.getPlayer()); server.doMove(legion, newHex, entrySide, teleport, revealedLord); server.restoreProcessingCH(); } else if (eventName.equals("UndoMove")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER.finest("Legion Undo Move redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoMove(legion); server.restoreProcessingCH(); } else if (eventName.equals("Recruit")) { String markerId = el.getAttributeValue("markerId"); String recruitName = el.getAttributeValue("recruit"); String recruiterName = el.getAttributeValue("recruiter"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType recruit = game.getVariant().getCreatureByName( recruitName); CreatureType recruiter = recruiterName.equals("null") ? null : game.getVariant().getCreatureByName(recruiterName); LOGGER.finest("Recruit redo event: \n" + " marker " + markerId + " recruit " + recruit + " recruiter " + recruiter); server.overrideProcessingCH(legion.getPlayer()); server.doRecruit(new Recruitment(legion, recruit, recruiter)); server.restoreProcessingCH(); } else if (eventName.equals("UndoRecruit")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER .finest("UndoRecruit redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoRecruit(legion); server.restoreProcessingCH(); } else { LOGGER.warning("Unknown Redo element " + eventName); } } } ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:10 Message: Btw, it says Sun Java ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 13:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 12:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 18:08:44
|
Bugs item #3177305, was opened at 2011-02-10 12:40 Message generated for change (Comment added) made by You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 18:08 Message: K so, I opened the default kevin.cfg and added those lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green And it worked. The game started. Made me green in fact. So far so good to, I was able to split a stack. Move the unit. Recruit. And watched the computer take it's move as well. So not sure why it wasn't working but it is now. Want to continue to troubleshoot? I guess I can always play green. :p ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 18:06 Message: No, you cannot "pick" the name kevinnew - it does not offer all "names that may exist". You choose the name on "Players" tab, On left side, Choose HUman, on right side type the name. 2nd Line, choose e.g. "SimpleAI", it fills right side with <byColor> or something, thats ok, Type there in first line the name kevinnew, and when game starts, it goes looking for a file Colossus-kewvinnew.cfg [and if it wouldn't exist, create it, sooner or later, after GUI / preferences changes]. Now we pre-create that file, so that it skips the color picking dialog because it would find a value to say "auto pick" from the file. -Cle. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:59 Message: btw, I did try and run the Colossus.jnlp stand alone and brings up the welcome screen, I hit ok, and the Game setup screen appears. I still can't choose newkevin and when I run it, once again I can not pick any of the colors. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:57 Message: I'll start from the beginning: • I open a folder I extracted all the files to from the .zip • I double click on run.bat A cmd window pops up with: C:\Documents and Settings\kevin\Desktop\collossus>cd "c:\Documents and Settings\kevin\Desktop\collossus\" C:\Documents and Settings\kevin\Desktop\collossus>java -Djava.util.logging.config.file=logging.properties -XMx256M -jar Colossus.jar Then what looks like the main program appears. It is the game setup screen. I make player one a human player and choose Kevin as the type. I make the 2nd player a SimpleAI and choose <By color> for the type. I leave everything else as is. (btw the top says Running Colossus Version 0.12.0-beta1 (revision 4970) on etc...) • I pick New game. The game appears to start, I can see the grid in the background with all the hills, deserts, etc. A small box with Pick a Color appears. I can move this box around. But I can not pick a color. I've tried clicking on every single one. I've tried pressing G, e, o, etc. I've tried Ctrl/Alt combinations, nothing. I can not close it either. I have to force it to shutdown. In Task Manager it shows that it is still running... so I don't THINK it is locked up. I do NOT see any other windows anywhere that I might need to click. I've even tried Alt+Tab and Ctrl+Tab to check. • I went ahead and did a search for the .colossus folder. I found it. It has 5 files in it. Colossus-netclient.cfg Colossus-red.cfg Colossus-server.cfg Colossus-kevin.cfg Colossus-kevin1.cfg • I went ahead and created a new .cfg file. I named it Colossus-kevinnew.cfg. I added these lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Interestingly here, when I started the program, I could not choose kevinnew. I could only still see kevin. I searched my entire computer to see if the .cfg files might also be somewhere else but I could only find them under \\documents and settings\kevin\desktop\collossus • Ok so I tried your command prompt idea. I even ran the command from within the path and I kept getting this error... Unable to access jarfile Colossus.jar I can't imagine it being a graphical error... the program still seems to be running fine, I just can't select any color. In Task Manager it doesn't say "not responding". So I will wait for your reply. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 17:06 Message: ok, XP with SP3 and Sun Java 6 ( 1.6.x ). All right, that should work. ( I may have in use SP2 but still). E.g. "Windows Vista" or "Windows 7" are more "exotic" for me. Sun Java is good also. Did you get the "Welcome to Release 0.12.0" dialog and click it away? (if not, it might have lurked around in the background hidden behind some other window and block the mouse/keyboard input or whatever ("modal dialog"). Should technically not happen/be possible, but one has seen stranger things happen.... The History.java is one of the source files, not relevant. > The only .cf files I could find are WebServer.cf, WebServer_unix.cf, > and WebServer_win.cf. Do you want me to add a line into one of these? No. They are part of the "sources" as well, in some sense. Once started, Colossus will create a directory ".colossus" (and 2 files in it) "somewhere on your computer" - in what it considers to be "your home directory". What that exactly is, might vary... The home directory is under Windows _often_ something like: C:\Documents and Settings\Mike if you logged in to the computer with username Mike. Often you get there with right-click on Start button => Explore => opens an explorer e.g. to C:\Documents and Settings\katzer\Start Menu for me as user katzer. So katzer would be my home dir. However on my computer it's configured differently, so my home directory is D:\katzer You can take an explorer (the Start => right-click => Explore thing) and type in the "path"/adress line in the top "%HOME%" and press return. (you may need to make it visible first with View => Toolbars => Address bar ). Inside there should be .colossus. Once you found that we are much further :) (normally, once masterboardboard is open, Help => About would tell the location but you don't even get there yet :-/ ) Inside there will be eventually several .cfg files (and perhaps a "saves" directory). Directory of D:\katzer\.colossus 07.02.2011 10:06 <DIR> . 07.02.2011 10:06 <DIR> .. 07.02.2011 15:12 1 997 Colossus-clemens.cfg 08.02.2011 19:49 4 425 Colossus-katzer.cfg 08.02.2011 19:49 2 069 Colossus-katzer1.cfg 28.07.2010 17:18 276 Colossus-netclient.cfg 08.02.2011 19:49 900 Colossus-server.cfg 07.02.2011 15:12 2 059 Colossus-test1.cfg 07.02.2011 22:00 586 Colossus-webclient.cfg 07.02.2011 10:56 <DIR> saves 7 File(s) 12 312 bytes 3 Dir(s) 21 313 040 384 bytes free D:\katzer\.colossus> You can ignore the "-server", -webclient and -netclient files for now - they are "internal". -katzer and -clemens etc. are "client preferences" files. Like, I played once a game as clemens, and when changed preferences such as the various auto-<do something>, position and size of windows etc., Colossus would save those to a file with that name. (some other, like Variant, type and names of players, Options in Startup dialog, are stored to the Colossus-server.cfg file). Usually when you get the Game Setup dialog (where you choose variant, count and type of players etc), first of them you make "Human" and name is initialized with the name you are logged on to the computer. Thus created with some text editor (notepad, if necessary), a textfile named Colossus-Mike.cfg (replace your name, of course). (if necessaary, right click in the right side of explorer, where the files are shown => New => Text Document => then there exists a file "New File.txt" (or similar). Click it, or F2 on it, change name to above. Put into that file the following three lines: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Note the "backslash" ( \ ) in front of the space. Now if you start a game with your player name set to "Mike" the Pick... dialogs should not appear. So question is, what will get stuck then :) The other interesting thing to try is, if you can run from commandline (by typing that command, which will make the java command shown): java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar While Colossus runs, eventually happening warnings etc. would be printed to that Command window. But if it's a total "Graphics stuff somehow freezes" (like it sounds, that it does not accept click or key on any of the colors) ... hm. Tricky. Might be no warning/exception, just the graphics thread (EDT, Event Dispatcher Thread, techno babble... ;-) hangs. Let's see so far, how far we get with above. If we get that, I've already some ideas how to proceed. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:15 Message: Not sure if this will help... I found a file called History.java under my recent documents. It's pretty lengthy but it is listed below: package net.sf.colossus.server; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.colossus.common.Constants; import net.sf.colossus.game.Creature; import net.sf.colossus.game.EntrySide; import net.sf.colossus.game.Legion; import net.sf.colossus.game.Player; import net.sf.colossus.game.actions.AddCreatureAction; import net.sf.colossus.game.actions.Recruitment; import net.sf.colossus.util.Glob; import net.sf.colossus.variant.CreatureType; import net.sf.colossus.variant.MasterHex; import org.jdom.Element; /** * Stores game history as XML. * * @author David Ripton */ public class History { private static final Logger LOGGER = Logger.getLogger(History.class .getName()); /** * History: events that happened before last commit point */ private final Element root; /** * History elements/events that happened since the last commit/"snapshot". */ private final List<Element> recentEvents = new LinkedList<Element>(); /** * Set to true during the processing of {@link #fireEventsFromXML(Server)} * to avoid triggering events we just restored again. */ private boolean loading = false; /** * */ private final Element loadedRedoLog; private boolean isRedo = false; /** * Stores the surviving legions (this variable is not needed any more) * * While the history should contain all information to reproduce the game * state, the last set of legions is currently still loaded upfront since * they contain the battle-specific information. This collides with * replaying the game from history... * Now, since 08/2008, they are not stored as "survivorlegions" any more. * Instead, they are backed up internally (done inside PlayerServerSide), * all the history is replayed. This creates proper split prediction data * in all clients. After that, backup data is compared with result of * replay. * E.g. Legion count, their content, players eliminated must be in sync. * Then the replayed ones are discarded and the backedup ones restored * - which have the right legion state (moved, donor, summoned, ...) * * TODO align the history replay more with the original gameplay so we * don't need this anymore; * 08/2008:==> this is now to some part done. Still replay * events could be closer to original events (split, summon, * acquire, teleport, ...) , not just the "result" of that * event (reveal,add,remove effects). * * TODO instead: model the actual events instead of just result, * or at least add relevant info to history elements, so that all * replayed events carry all needed data so that they could also be * processed by event viewer (currently EV does not process anything * during replay). */ public History() { root = new Element("History"); // Dummy: loadedRedoLog = new Element("LoadedRedoLog"); } /** * Constructor used by "LoadGame" */ public History(Element loadGameRoot) { // Get the history elements and store them to "root" root = (Element)loadGameRoot.getChild("History").clone(); // Get the redo log content loadedRedoLog = (Element)loadGameRoot.getChild("Redo").clone(); } /** * All events before last commit */ Element getCopy() { return (Element)root.clone(); } /** * Reached a commit point: append all recent events to the history, * clear list of recent events; caller should do this together with creating * the next snapshot. */ void flushRecentToRoot() { for (Element el : recentEvents) { el.detach(); String name = el.getName(); // TODO later, when this are proper events (not XML elements), // ask rather from the Event whether it belongs copied to // history or not. // TODO At some point in future, put also those Move events // that reveal something to history, and make either the history // replay only send the relevant reveal messages, or make the // Clients during replay (but not redo part) ignore the "move" // and just process the revealing part. // Preferrably the latter, so that proper events show up in the // EventViewer. if (name.equals("Move") || name.equals("UndoMove")) { LOGGER.finest("Flush Redo to History: skipping " + name); } else if (name.equals("Recruit") || name.equals("UndoRecruit")) { // Skipping for now, because there are also the addCreature, // removeCreature and reveal Events still in history. // TODO make the Recruit/UndoRecruit history events during // replay properly, get rid of the "side effect" type of // entries in save game. LOGGER.finest("Flush Redo to History: skipping " + name); } else { root.addContent(el); } } recentEvents.clear(); } /** * @return A Redo Element, containing all events since last commit * i.e. which need to be REDOne on top of last commit point/snapshot */ Element getNewRedoLogElement() { Element redoLogElement = new Element("Redo"); for (Element el : recentEvents) { el.detach(); redoLogElement.addContent(el); } return redoLogElement; } /** * TODO reconsider name * TODO decide if we should move it all into one big handleEvent(GameEvent) method */ void addCreatureEvent(AddCreatureAction event, int turn, String reason) { if (loading) { return; } Element element = new Element("AddCreature"); element.setAttribute("markerId", event.getLegion().getMarkerId()); element.setAttribute("creatureName", event.getAddedCreatureType() .getName()); element.setAttribute("turn", "" + turn); element.setAttribute("reason", reason); recentEvents.add(element); } void removeCreatureEvent(Legion legion, CreatureType creature, int turn, String reason) { if (loading) { return; } Element event = new Element("RemoveCreature"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("creatureName", creature.getName()); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); recentEvents.add(event); } void splitEvent(Legion parent, Legion child, List<CreatureType> splitoffs, int turn) { if (loading) { return; } Element event = new Element("Split"); event.setAttribute("parentId", parent.getMarkerId()); event.setAttribute("childId", child.getMarkerId()); event.setAttribute("turn", "" + turn); Element creatures = new Element("splitoffs"); event.addContent(creatures); for (CreatureType creatureType : splitoffs) { Element cr = new Element("creature"); cr.addContent(creatureType.getName()); creatures.addContent(cr); } recentEvents.add(event); } void mergeEvent(String splitoffId, String survivorId, int turn) { if (loading) { return; } Element event = new Element("Merge"); event.setAttribute("splitoffId", splitoffId); event.setAttribute("survivorId", survivorId); event.setAttribute("turn", "" + turn); recentEvents.add(event); } void revealEvent(boolean allPlayers, List<Player> players, Legion legion, List<CreatureType> creatures, int turn, String reason) { if (loading) { return; } if (creatures.isEmpty()) { // this happens e.g. when in final battle (titan vs. titan) // angel was called out of legion which was then empty, // and in the final updateAllLegionContents there is then // this empty legion... // TODO if this case can happen in a regular game no warning // should be logged LOGGER.log(Level.WARNING, "Called revealEvent(" + allPlayers + ", " + (players != null ? players.toString() : "-null-") + ", " + legion + ", " + creatures.toString() + ", " + turn + ") with empty creatureNames"); return; } Element event = new Element("Reveal"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("allPlayers", "" + allPlayers); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); if (!allPlayers) { Element viewers = new Element("viewers"); event.addContent(viewers); Iterator<Player> it = players.iterator(); while (it.hasNext()) { String playerName = it.next().getName(); Element viewer = new Element("viewer"); viewer.addContent(playerName); viewers.addContent(viewer); } } Element creaturesElem = new Element("creatures"); event.addContent(creaturesElem); for (CreatureType creatureType : creatures) { Element creatureElem = new Element("creature"); creatureElem.addContent(creatureType.getName()); creaturesElem.addContent(creatureElem); } recentEvents.add(event); } void playerElimEvent(Player player, Player slayer, int turn) { if (loading) { return; } Element event = new Element("PlayerElim"); event.setAttribute("name", player.getName()); if (slayer != null) { event.setAttribute("slayer", slayer.getName()); } event.setAttribute("turn", "" + turn); recentEvents.add(event); } void movementRollEvent(Player player, int roll) { if (loading) { return; } Element event = new Element("MovementRoll"); event.setAttribute("playerName", player.getName()); event.setAttribute("roll", "" + roll); recentEvents.add(event); } void legionMoveEvent(Legion legion, MasterHex newHex, EntrySide entrySide, boolean teleport, CreatureType lord) { if (loading) { return; } Element event = new Element("Move"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("newHex", newHex.getLabel()); event.setAttribute("entrySide", entrySide.getLabel()); event.setAttribute("teleport", "" + teleport); String creNameOrTextNull = lord == null ? "null" : lord.getName(); event.setAttribute("revealedLord", creNameOrTextNull); recentEvents.add(event); } void legionUndoMoveEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoMove"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } void recruitEvent(Legion legion, CreatureType recruit, CreatureType recruiter) { if (loading) { return; } Element event = new Element("Recruit"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("recruit", recruit.getName()); event.setAttribute("recruiter", recruiter == null ? "null" : recruiter .getName()); recentEvents.add(event); } void undoRecruitEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoRecruit"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } /** * Fire all events from redoLog. * Elements from RedoLog are processed one by one and the corresponding * method is called on the Server object, pretty much as if a * ClientHandler would call it when receiving such a request from Client. * Note that in some cases overriding the processingCH is necessary * (because technically, this all currently happens while still the * connecting of last joining player is processed, so processingCH is * set to his ClientHandler). * * Note that "loading" is not set to true, so they DO GET ADDED to the * recentEvents list again. * * @param server The server on which to call all the actions to be redone */ void processRedoLog(Server server) { assert loadedRedoLog != null : "Loaded RedoLog should always " + "have a JDOM root element as backing store"; LOGGER.info("History: Start processing redo log"); isRedo = true; for (Object obj : loadedRedoLog.getChildren()) { Element el = (Element)obj; LOGGER.info("processing redo event " + el.getName()); fireEventFromElement(server, el); } isRedo = false; // TODO clear loadedRedoLog? LOGGER.info("Completed processing redo log"); } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventsFromXML(Server server) { this.loading = true; assert root != null : "History should always have a " + " JDOM root element as backing store"; List<Element> kids = root.getChildren(); Iterator<Element> it = kids.iterator(); while (it.hasNext()) { Element el = it.next(); fireEventFromElement(server, el); } this.loading = false; } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventFromElement(Server server, Element el) { GameServerSide game = server.getGame(); String eventName = el.getName(); String reasonPerhaps = el.getAttributeValue("reason"); String reason = (reasonPerhaps != null && !reasonPerhaps .equals("null")) ? reasonPerhaps : "<undefinedReason>"; if (eventName.equals("Reveal") && isRedo && reason.equals(Constants.reasonRecruiter)) { // Skip this because we redo the full recruit event // TODO LOGGER.finest("Skipping Reveal event (reason " + reason + ") during redo."); } else if (eventName.equals("AddCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping AddCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("RemoveCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping RemoveCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("Reveal")) { String allPlayers = el.getAttributeValue("allPlayers"); boolean all = allPlayers != null && allPlayers.equals("true"); String markerId = el.getAttributeValue("markerId"); List<String> playerNames = new ArrayList<String>(); Element viewEl = el.getChild("viewers"); int turn = Integer.parseInt(el.getAttributeValue("turn")); String playerName = null; if (viewEl != null) { List<Element> viewers = viewEl.getChildren(); Iterator<Element> it = viewers.iterator(); while (it.hasNext()) { Element viewer = it.next(); playerName = viewer.getTextNormalize(); playerNames.add(playerName); } } List<Element> creatureElements = el.getChild("creatures") .getChildren(); List<CreatureType> creatures = new ArrayList<CreatureType>(); for (Element creature : creatureElements) { String creatureName = creature.getTextNormalize(); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } Player player = game.getPlayerByMarkerId(markerId); Legion legion; if (turn == 1 && player.getLegionByMarkerId(markerId) == null) { // there is no create event for the startup legions, // so we might need to create them for the reveal event legion = new LegionServerSide(markerId, null, player .getStartingTower(), player.getStartingTower(), player, game, creatures .toArray(new CreatureType[creatures.size()])); player.addLegion(legion); } else { legion = player.getLegionByMarkerId(markerId); } // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; if (((PlayerServerSide)player).getDeadBeforeSave()) { // Skip for players that will be dead by end of replay } else if (all) { server.allRevealCreatures(legion, creatures, reason); } else { server.oneRevealLegion(game.getPlayerByName(playerName), legion, creatures, reason); } } else if (eventName.equals("Split")) { String parentId = el.getAttributeValue("parentId"); String childId = el.getAttributeValue("childId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); List<String> creatureNames = new ArrayList<String>(); List<CreatureType> creatures = new ArrayList<CreatureType>(); List<Element> splitoffs = el.getChild("splitoffs").getChildren(); Iterator<Element> it = splitoffs.iterator(); while (it.hasNext()) { Element creature = it.next(); String creatureName = creature.getTextNormalize(); creatureNames.add(creatureName); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } LegionServerSide parentLegion = game.getLegionByMarkerId(parentId); if (isRedo) { server.overrideProcessingCH(parentLegion.getPlayer()); server.doSplit(parentLegion, childId, creatures); server.overrideProcessingCH(parentLegion.getPlayer()); return; } // LegionServerSide.split(..) doesn't like us here since the parent // legion can't remove creatures (not there?) -- create child directly // instead PlayerServerSide player = parentLegion.getPlayer(); LegionServerSide childLegion; if (player.hasLegion(childId)) { childLegion = game.getLegionByMarkerId(childId); LOGGER.severe("During replay of history: child legion " + childId + " should not " + "exist yet (turn=" + turn + ")!!\n" + "Exists already with: " + Glob.glob(",", childLegion.getCreatureTypes()) + " but " + "should now be created with creatures: " + creatures); childLegion.remove(); } childLegion = new LegionServerSide(childId, null, parentLegion .getCurrentHex(), parentLegion.getCurrentHex(), player, game, creatures.toArray(new CreatureType[creatures.size()])); player.addLegion(childLegion); for (CreatureType creature : creatures) { parentLegion.removeCreature(creature, false, false); } // Skip for players that will be dead by end of replay if (!player.getDeadBeforeSave()) { server.allTellDidSplit(parentLegion, childLegion, turn, false); } } else if (eventName.equals("Merge")) { String splitoffId = el.getAttributeValue("splitoffId"); String survivorId = el.getAttributeValue("survivorId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); LegionServerSide splitoff = game.getLegionByMarkerId(splitoffId); LegionServerSide survivor = game.getLegionByMarkerId(survivorId); // Skip for players that will be dead by end of replay if (!survivor.getPlayer().getDeadBeforeSave()) { server.undidSplit(splitoff, survivor, false, turn); } // Add them back to parent: while (splitoff.getHeight() > 0) { CreatureType type = splitoff.removeCreature(0, false, false); survivor.addCreature(type, false); } splitoff.remove(false, false); } else if (eventName.equals("AddCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Adding creature '" + creatureName + "' to legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType creatureType = game.getVariant().getCreatureByName( creatureName); legion.addCreature(creatureType, false); // Skip for players that will be dead by end of replay if (!legion.getPlayer().getDeadBeforeSave()) { server.allTellAddCreature(new AddCreatureAction(legion, creatureType), false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); } else if (eventName.equals("RemoveCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Removing creature '" + creatureName + "' from legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); if (legion == null) { LOGGER.warning("removeCreature " + creatureName + " from legion " + markerId + ", legion is null"); return; } else { List<? extends Creature> cres = legion.getCreatures(); List<String> crenames = new ArrayList<String>(); for (Creature c : cres) { crenames.add(c.getName()); } } // don't use disbandIfEmpty parameter since that'll fire another history event CreatureType removedCritter = legion.removeCreature(game .getVariant().getCreatureByName(creatureName), false, false); // Skip for players that will be dead by end of replay // Skip if removedCritter is null => removeCreature did not find it, // so there is something wrong with the save game. No use to bother // all the clients with it. if (removedCritter != null && !legion.getPlayer().getDeadBeforeSave()) { server.allTellRemoveCreature(legion, removedCritter, false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); if (legion.getHeight() == 0) { legion.remove(false, false); LOGGER.finer("Legion '" + markerId + "' removed"); } } else if (eventName.equals("PlayerElim")) { String playerName = el.getAttributeValue("name"); String slayerName = el.getAttributeValue("slayer"); Player player = game.getPlayerByName(playerName); Player slayer = game.getPlayerByNameIgnoreNull(slayerName); // Record the slayer and give him this player's legion markers. if (slayer != null) { ((PlayerServerSide)player).handleSlaying(slayer); } player.setDead(true); server.allUpdatePlayerInfo(); server.allTellPlayerElim(player, slayer, false); } else if (eventName.equals("MovementRoll")) { String playerName = el.getAttributeValue("playerName"); Player player = game.getPlayerByName(playerName); int roll = Integer.parseInt(el.getAttributeValue("roll")); ((PlayerServerSide)player).setMovementRoll(roll); game.movementRollEvent(player, roll); server.allTellMovementRoll(roll); } else if (eventName.equals("Move")) { String markerId = el.getAttributeValue("markerId"); String lordName = el.getAttributeValue("revealedLord"); String tele = el.getAttributeValue("teleport"); String newHexLabel = el.getAttributeValue("newHex"); String entrySideName = el.getAttributeValue("entrySide"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType revealedLord = lordName.equals("null") ? null : game .getVariant().getCreatureByName(lordName); MasterHex newHex = server.getGame().getVariant().getMasterBoard() .getHexByLabel(newHexLabel); EntrySide entrySide = EntrySide.fromLabel(entrySideName); boolean teleport = tele != null && tele.equals("true"); LOGGER.finest("Legion Move redo event: \n" + " marker " + markerId + ", lordName " + revealedLord + " teleported " + teleport + " to hex " + newHex.getLabel() + " entrySide " + entrySide.toString()); server.overrideProcessingCH(legion.getPlayer()); server.doMove(legion, newHex, entrySide, teleport, revealedLord); server.restoreProcessingCH(); } else if (eventName.equals("UndoMove")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER.finest("Legion Undo Move redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoMove(legion); server.restoreProcessingCH(); } else if (eventName.equals("Recruit")) { String markerId = el.getAttributeValue("markerId"); String recruitName = el.getAttributeValue("recruit"); String recruiterName = el.getAttributeValue("recruiter"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType recruit = game.getVariant().getCreatureByName( recruitName); CreatureType recruiter = recruiterName.equals("null") ? null : game.getVariant().getCreatureByName(recruiterName); LOGGER.finest("Recruit redo event: \n" + " marker " + markerId + " recruit " + recruit + " recruiter " + recruiter); server.overrideProcessingCH(legion.getPlayer()); server.doRecruit(new Recruitment(legion, recruit, recruiter)); server.restoreProcessingCH(); } else if (eventName.equals("UndoRecruit")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER .finest("UndoRecruit redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoRecruit(legion); server.restoreProcessingCH(); } else { LOGGER.warning("Unknown Redo element " + eventName); } } } ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:10 Message: Btw, it says Sun Java ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 13:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 12:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 18:06:17
|
Bugs item #3177305, was opened at 2011-02-10 14:40 Message generated for change (Comment added) made by cleka You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- >Comment By: Clemens Katzer (cleka) Date: 2011-02-10 20:06 Message: No, you cannot "pick" the name kevinnew - it does not offer all "names that may exist". You choose the name on "Players" tab, On left side, Choose HUman, on right side type the name. 2nd Line, choose e.g. "SimpleAI", it fills right side with <byColor> or something, thats ok, Type there in first line the name kevinnew, and when game starts, it goes looking for a file Colossus-kewvinnew.cfg [and if it wouldn't exist, create it, sooner or later, after GUI / preferences changes]. Now we pre-create that file, so that it skips the color picking dialog because it would find a value to say "auto pick" from the file. -Cle. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 19:59 Message: btw, I did try and run the Colossus.jnlp stand alone and brings up the welcome screen, I hit ok, and the Game setup screen appears. I still can't choose newkevin and when I run it, once again I can not pick any of the colors. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 19:57 Message: I'll start from the beginning: • I open a folder I extracted all the files to from the .zip • I double click on run.bat A cmd window pops up with: C:\Documents and Settings\kevin\Desktop\collossus>cd "c:\Documents and Settings\kevin\Desktop\collossus\" C:\Documents and Settings\kevin\Desktop\collossus>java -Djava.util.logging.config.file=logging.properties -XMx256M -jar Colossus.jar Then what looks like the main program appears. It is the game setup screen. I make player one a human player and choose Kevin as the type. I make the 2nd player a SimpleAI and choose <By color> for the type. I leave everything else as is. (btw the top says Running Colossus Version 0.12.0-beta1 (revision 4970) on etc...) • I pick New game. The game appears to start, I can see the grid in the background with all the hills, deserts, etc. A small box with Pick a Color appears. I can move this box around. But I can not pick a color. I've tried clicking on every single one. I've tried pressing G, e, o, etc. I've tried Ctrl/Alt combinations, nothing. I can not close it either. I have to force it to shutdown. In Task Manager it shows that it is still running... so I don't THINK it is locked up. I do NOT see any other windows anywhere that I might need to click. I've even tried Alt+Tab and Ctrl+Tab to check. • I went ahead and did a search for the .colossus folder. I found it. It has 5 files in it. Colossus-netclient.cfg Colossus-red.cfg Colossus-server.cfg Colossus-kevin.cfg Colossus-kevin1.cfg • I went ahead and created a new .cfg file. I named it Colossus-kevinnew.cfg. I added these lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Interestingly here, when I started the program, I could not choose kevinnew. I could only still see kevin. I searched my entire computer to see if the .cfg files might also be somewhere else but I could only find them under \\documents and settings\kevin\desktop\collossus • Ok so I tried your command prompt idea. I even ran the command from within the path and I kept getting this error... Unable to access jarfile Colossus.jar I can't imagine it being a graphical error... the program still seems to be running fine, I just can't select any color. In Task Manager it doesn't say "not responding". So I will wait for your reply. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 19:06 Message: ok, XP with SP3 and Sun Java 6 ( 1.6.x ). All right, that should work. ( I may have in use SP2 but still). E.g. "Windows Vista" or "Windows 7" are more "exotic" for me. Sun Java is good also. Did you get the "Welcome to Release 0.12.0" dialog and click it away? (if not, it might have lurked around in the background hidden behind some other window and block the mouse/keyboard input or whatever ("modal dialog"). Should technically not happen/be possible, but one has seen stranger things happen.... The History.java is one of the source files, not relevant. > The only .cf files I could find are WebServer.cf, WebServer_unix.cf, > and WebServer_win.cf. Do you want me to add a line into one of these? No. They are part of the "sources" as well, in some sense. Once started, Colossus will create a directory ".colossus" (and 2 files in it) "somewhere on your computer" - in what it considers to be "your home directory". What that exactly is, might vary... The home directory is under Windows _often_ something like: C:\Documents and Settings\Mike if you logged in to the computer with username Mike. Often you get there with right-click on Start button => Explore => opens an explorer e.g. to C:\Documents and Settings\katzer\Start Menu for me as user katzer. So katzer would be my home dir. However on my computer it's configured differently, so my home directory is D:\katzer You can take an explorer (the Start => right-click => Explore thing) and type in the "path"/adress line in the top "%HOME%" and press return. (you may need to make it visible first with View => Toolbars => Address bar ). Inside there should be .colossus. Once you found that we are much further :) (normally, once masterboardboard is open, Help => About would tell the location but you don't even get there yet :-/ ) Inside there will be eventually several .cfg files (and perhaps a "saves" directory). Directory of D:\katzer\.colossus 07.02.2011 10:06 <DIR> . 07.02.2011 10:06 <DIR> .. 07.02.2011 15:12 1 997 Colossus-clemens.cfg 08.02.2011 19:49 4 425 Colossus-katzer.cfg 08.02.2011 19:49 2 069 Colossus-katzer1.cfg 28.07.2010 17:18 276 Colossus-netclient.cfg 08.02.2011 19:49 900 Colossus-server.cfg 07.02.2011 15:12 2 059 Colossus-test1.cfg 07.02.2011 22:00 586 Colossus-webclient.cfg 07.02.2011 10:56 <DIR> saves 7 File(s) 12 312 bytes 3 Dir(s) 21 313 040 384 bytes free D:\katzer\.colossus> You can ignore the "-server", -webclient and -netclient files for now - they are "internal". -katzer and -clemens etc. are "client preferences" files. Like, I played once a game as clemens, and when changed preferences such as the various auto-<do something>, position and size of windows etc., Colossus would save those to a file with that name. (some other, like Variant, type and names of players, Options in Startup dialog, are stored to the Colossus-server.cfg file). Usually when you get the Game Setup dialog (where you choose variant, count and type of players etc), first of them you make "Human" and name is initialized with the name you are logged on to the computer. Thus created with some text editor (notepad, if necessary), a textfile named Colossus-Mike.cfg (replace your name, of course). (if necessaary, right click in the right side of explorer, where the files are shown => New => Text Document => then there exists a file "New File.txt" (or similar). Click it, or F2 on it, change name to above. Put into that file the following three lines: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Note the "backslash" ( \ ) in front of the space. Now if you start a game with your player name set to "Mike" the Pick... dialogs should not appear. So question is, what will get stuck then :) The other interesting thing to try is, if you can run from commandline (by typing that command, which will make the java command shown): java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar While Colossus runs, eventually happening warnings etc. would be printed to that Command window. But if it's a total "Graphics stuff somehow freezes" (like it sounds, that it does not accept click or key on any of the colors) ... hm. Tricky. Might be no warning/exception, just the graphics thread (EDT, Event Dispatcher Thread, techno babble... ;-) hangs. Let's see so far, how far we get with above. If we get that, I've already some ideas how to proceed. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:15 Message: Not sure if this will help... I found a file called History.java under my recent documents. It's pretty lengthy but it is listed below: package net.sf.colossus.server; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.colossus.common.Constants; import net.sf.colossus.game.Creature; import net.sf.colossus.game.EntrySide; import net.sf.colossus.game.Legion; import net.sf.colossus.game.Player; import net.sf.colossus.game.actions.AddCreatureAction; import net.sf.colossus.game.actions.Recruitment; import net.sf.colossus.util.Glob; import net.sf.colossus.variant.CreatureType; import net.sf.colossus.variant.MasterHex; import org.jdom.Element; /** * Stores game history as XML. * * @author David Ripton */ public class History { private static final Logger LOGGER = Logger.getLogger(History.class .getName()); /** * History: events that happened before last commit point */ private final Element root; /** * History elements/events that happened since the last commit/"snapshot". */ private final List<Element> recentEvents = new LinkedList<Element>(); /** * Set to true during the processing of {@link #fireEventsFromXML(Server)} * to avoid triggering events we just restored again. */ private boolean loading = false; /** * */ private final Element loadedRedoLog; private boolean isRedo = false; /** * Stores the surviving legions (this variable is not needed any more) * * While the history should contain all information to reproduce the game * state, the last set of legions is currently still loaded upfront since * they contain the battle-specific information. This collides with * replaying the game from history... * Now, since 08/2008, they are not stored as "survivorlegions" any more. * Instead, they are backed up internally (done inside PlayerServerSide), * all the history is replayed. This creates proper split prediction data * in all clients. After that, backup data is compared with result of * replay. * E.g. Legion count, their content, players eliminated must be in sync. * Then the replayed ones are discarded and the backedup ones restored * - which have the right legion state (moved, donor, summoned, ...) * * TODO align the history replay more with the original gameplay so we * don't need this anymore; * 08/2008:==> this is now to some part done. Still replay * events could be closer to original events (split, summon, * acquire, teleport, ...) , not just the "result" of that * event (reveal,add,remove effects). * * TODO instead: model the actual events instead of just result, * or at least add relevant info to history elements, so that all * replayed events carry all needed data so that they could also be * processed by event viewer (currently EV does not process anything * during replay). */ public History() { root = new Element("History"); // Dummy: loadedRedoLog = new Element("LoadedRedoLog"); } /** * Constructor used by "LoadGame" */ public History(Element loadGameRoot) { // Get the history elements and store them to "root" root = (Element)loadGameRoot.getChild("History").clone(); // Get the redo log content loadedRedoLog = (Element)loadGameRoot.getChild("Redo").clone(); } /** * All events before last commit */ Element getCopy() { return (Element)root.clone(); } /** * Reached a commit point: append all recent events to the history, * clear list of recent events; caller should do this together with creating * the next snapshot. */ void flushRecentToRoot() { for (Element el : recentEvents) { el.detach(); String name = el.getName(); // TODO later, when this are proper events (not XML elements), // ask rather from the Event whether it belongs copied to // history or not. // TODO At some point in future, put also those Move events // that reveal something to history, and make either the history // replay only send the relevant reveal messages, or make the // Clients during replay (but not redo part) ignore the "move" // and just process the revealing part. // Preferrably the latter, so that proper events show up in the // EventViewer. if (name.equals("Move") || name.equals("UndoMove")) { LOGGER.finest("Flush Redo to History: skipping " + name); } else if (name.equals("Recruit") || name.equals("UndoRecruit")) { // Skipping for now, because there are also the addCreature, // removeCreature and reveal Events still in history. // TODO make the Recruit/UndoRecruit history events during // replay properly, get rid of the "side effect" type of // entries in save game. LOGGER.finest("Flush Redo to History: skipping " + name); } else { root.addContent(el); } } recentEvents.clear(); } /** * @return A Redo Element, containing all events since last commit * i.e. which need to be REDOne on top of last commit point/snapshot */ Element getNewRedoLogElement() { Element redoLogElement = new Element("Redo"); for (Element el : recentEvents) { el.detach(); redoLogElement.addContent(el); } return redoLogElement; } /** * TODO reconsider name * TODO decide if we should move it all into one big handleEvent(GameEvent) method */ void addCreatureEvent(AddCreatureAction event, int turn, String reason) { if (loading) { return; } Element element = new Element("AddCreature"); element.setAttribute("markerId", event.getLegion().getMarkerId()); element.setAttribute("creatureName", event.getAddedCreatureType() .getName()); element.setAttribute("turn", "" + turn); element.setAttribute("reason", reason); recentEvents.add(element); } void removeCreatureEvent(Legion legion, CreatureType creature, int turn, String reason) { if (loading) { return; } Element event = new Element("RemoveCreature"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("creatureName", creature.getName()); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); recentEvents.add(event); } void splitEvent(Legion parent, Legion child, List<CreatureType> splitoffs, int turn) { if (loading) { return; } Element event = new Element("Split"); event.setAttribute("parentId", parent.getMarkerId()); event.setAttribute("childId", child.getMarkerId()); event.setAttribute("turn", "" + turn); Element creatures = new Element("splitoffs"); event.addContent(creatures); for (CreatureType creatureType : splitoffs) { Element cr = new Element("creature"); cr.addContent(creatureType.getName()); creatures.addContent(cr); } recentEvents.add(event); } void mergeEvent(String splitoffId, String survivorId, int turn) { if (loading) { return; } Element event = new Element("Merge"); event.setAttribute("splitoffId", splitoffId); event.setAttribute("survivorId", survivorId); event.setAttribute("turn", "" + turn); recentEvents.add(event); } void revealEvent(boolean allPlayers, List<Player> players, Legion legion, List<CreatureType> creatures, int turn, String reason) { if (loading) { return; } if (creatures.isEmpty()) { // this happens e.g. when in final battle (titan vs. titan) // angel was called out of legion which was then empty, // and in the final updateAllLegionContents there is then // this empty legion... // TODO if this case can happen in a regular game no warning // should be logged LOGGER.log(Level.WARNING, "Called revealEvent(" + allPlayers + ", " + (players != null ? players.toString() : "-null-") + ", " + legion + ", " + creatures.toString() + ", " + turn + ") with empty creatureNames"); return; } Element event = new Element("Reveal"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("allPlayers", "" + allPlayers); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); if (!allPlayers) { Element viewers = new Element("viewers"); event.addContent(viewers); Iterator<Player> it = players.iterator(); while (it.hasNext()) { String playerName = it.next().getName(); Element viewer = new Element("viewer"); viewer.addContent(playerName); viewers.addContent(viewer); } } Element creaturesElem = new Element("creatures"); event.addContent(creaturesElem); for (CreatureType creatureType : creatures) { Element creatureElem = new Element("creature"); creatureElem.addContent(creatureType.getName()); creaturesElem.addContent(creatureElem); } recentEvents.add(event); } void playerElimEvent(Player player, Player slayer, int turn) { if (loading) { return; } Element event = new Element("PlayerElim"); event.setAttribute("name", player.getName()); if (slayer != null) { event.setAttribute("slayer", slayer.getName()); } event.setAttribute("turn", "" + turn); recentEvents.add(event); } void movementRollEvent(Player player, int roll) { if (loading) { return; } Element event = new Element("MovementRoll"); event.setAttribute("playerName", player.getName()); event.setAttribute("roll", "" + roll); recentEvents.add(event); } void legionMoveEvent(Legion legion, MasterHex newHex, EntrySide entrySide, boolean teleport, CreatureType lord) { if (loading) { return; } Element event = new Element("Move"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("newHex", newHex.getLabel()); event.setAttribute("entrySide", entrySide.getLabel()); event.setAttribute("teleport", "" + teleport); String creNameOrTextNull = lord == null ? "null" : lord.getName(); event.setAttribute("revealedLord", creNameOrTextNull); recentEvents.add(event); } void legionUndoMoveEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoMove"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } void recruitEvent(Legion legion, CreatureType recruit, CreatureType recruiter) { if (loading) { return; } Element event = new Element("Recruit"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("recruit", recruit.getName()); event.setAttribute("recruiter", recruiter == null ? "null" : recruiter .getName()); recentEvents.add(event); } void undoRecruitEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoRecruit"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } /** * Fire all events from redoLog. * Elements from RedoLog are processed one by one and the corresponding * method is called on the Server object, pretty much as if a * ClientHandler would call it when receiving such a request from Client. * Note that in some cases overriding the processingCH is necessary * (because technically, this all currently happens while still the * connecting of last joining player is processed, so processingCH is * set to his ClientHandler). * * Note that "loading" is not set to true, so they DO GET ADDED to the * recentEvents list again. * * @param server The server on which to call all the actions to be redone */ void processRedoLog(Server server) { assert loadedRedoLog != null : "Loaded RedoLog should always " + "have a JDOM root element as backing store"; LOGGER.info("History: Start processing redo log"); isRedo = true; for (Object obj : loadedRedoLog.getChildren()) { Element el = (Element)obj; LOGGER.info("processing redo event " + el.getName()); fireEventFromElement(server, el); } isRedo = false; // TODO clear loadedRedoLog? LOGGER.info("Completed processing redo log"); } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventsFromXML(Server server) { this.loading = true; assert root != null : "History should always have a " + " JDOM root element as backing store"; List<Element> kids = root.getChildren(); Iterator<Element> it = kids.iterator(); while (it.hasNext()) { Element el = it.next(); fireEventFromElement(server, el); } this.loading = false; } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventFromElement(Server server, Element el) { GameServerSide game = server.getGame(); String eventName = el.getName(); String reasonPerhaps = el.getAttributeValue("reason"); String reason = (reasonPerhaps != null && !reasonPerhaps .equals("null")) ? reasonPerhaps : "<undefinedReason>"; if (eventName.equals("Reveal") && isRedo && reason.equals(Constants.reasonRecruiter)) { // Skip this because we redo the full recruit event // TODO LOGGER.finest("Skipping Reveal event (reason " + reason + ") during redo."); } else if (eventName.equals("AddCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping AddCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("RemoveCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping RemoveCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("Reveal")) { String allPlayers = el.getAttributeValue("allPlayers"); boolean all = allPlayers != null && allPlayers.equals("true"); String markerId = el.getAttributeValue("markerId"); List<String> playerNames = new ArrayList<String>(); Element viewEl = el.getChild("viewers"); int turn = Integer.parseInt(el.getAttributeValue("turn")); String playerName = null; if (viewEl != null) { List<Element> viewers = viewEl.getChildren(); Iterator<Element> it = viewers.iterator(); while (it.hasNext()) { Element viewer = it.next(); playerName = viewer.getTextNormalize(); playerNames.add(playerName); } } List<Element> creatureElements = el.getChild("creatures") .getChildren(); List<CreatureType> creatures = new ArrayList<CreatureType>(); for (Element creature : creatureElements) { String creatureName = creature.getTextNormalize(); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } Player player = game.getPlayerByMarkerId(markerId); Legion legion; if (turn == 1 && player.getLegionByMarkerId(markerId) == null) { // there is no create event for the startup legions, // so we might need to create them for the reveal event legion = new LegionServerSide(markerId, null, player .getStartingTower(), player.getStartingTower(), player, game, creatures .toArray(new CreatureType[creatures.size()])); player.addLegion(legion); } else { legion = player.getLegionByMarkerId(markerId); } // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; if (((PlayerServerSide)player).getDeadBeforeSave()) { // Skip for players that will be dead by end of replay } else if (all) { server.allRevealCreatures(legion, creatures, reason); } else { server.oneRevealLegion(game.getPlayerByName(playerName), legion, creatures, reason); } } else if (eventName.equals("Split")) { String parentId = el.getAttributeValue("parentId"); String childId = el.getAttributeValue("childId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); List<String> creatureNames = new ArrayList<String>(); List<CreatureType> creatures = new ArrayList<CreatureType>(); List<Element> splitoffs = el.getChild("splitoffs").getChildren(); Iterator<Element> it = splitoffs.iterator(); while (it.hasNext()) { Element creature = it.next(); String creatureName = creature.getTextNormalize(); creatureNames.add(creatureName); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } LegionServerSide parentLegion = game.getLegionByMarkerId(parentId); if (isRedo) { server.overrideProcessingCH(parentLegion.getPlayer()); server.doSplit(parentLegion, childId, creatures); server.overrideProcessingCH(parentLegion.getPlayer()); return; } // LegionServerSide.split(..) doesn't like us here since the parent // legion can't remove creatures (not there?) -- create child directly // instead PlayerServerSide player = parentLegion.getPlayer(); LegionServerSide childLegion; if (player.hasLegion(childId)) { childLegion = game.getLegionByMarkerId(childId); LOGGER.severe("During replay of history: child legion " + childId + " should not " + "exist yet (turn=" + turn + ")!!\n" + "Exists already with: " + Glob.glob(",", childLegion.getCreatureTypes()) + " but " + "should now be created with creatures: " + creatures); childLegion.remove(); } childLegion = new LegionServerSide(childId, null, parentLegion .getCurrentHex(), parentLegion.getCurrentHex(), player, game, creatures.toArray(new CreatureType[creatures.size()])); player.addLegion(childLegion); for (CreatureType creature : creatures) { parentLegion.removeCreature(creature, false, false); } // Skip for players that will be dead by end of replay if (!player.getDeadBeforeSave()) { server.allTellDidSplit(parentLegion, childLegion, turn, false); } } else if (eventName.equals("Merge")) { String splitoffId = el.getAttributeValue("splitoffId"); String survivorId = el.getAttributeValue("survivorId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); LegionServerSide splitoff = game.getLegionByMarkerId(splitoffId); LegionServerSide survivor = game.getLegionByMarkerId(survivorId); // Skip for players that will be dead by end of replay if (!survivor.getPlayer().getDeadBeforeSave()) { server.undidSplit(splitoff, survivor, false, turn); } // Add them back to parent: while (splitoff.getHeight() > 0) { CreatureType type = splitoff.removeCreature(0, false, false); survivor.addCreature(type, false); } splitoff.remove(false, false); } else if (eventName.equals("AddCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Adding creature '" + creatureName + "' to legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType creatureType = game.getVariant().getCreatureByName( creatureName); legion.addCreature(creatureType, false); // Skip for players that will be dead by end of replay if (!legion.getPlayer().getDeadBeforeSave()) { server.allTellAddCreature(new AddCreatureAction(legion, creatureType), false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); } else if (eventName.equals("RemoveCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Removing creature '" + creatureName + "' from legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); if (legion == null) { LOGGER.warning("removeCreature " + creatureName + " from legion " + markerId + ", legion is null"); return; } else { List<? extends Creature> cres = legion.getCreatures(); List<String> crenames = new ArrayList<String>(); for (Creature c : cres) { crenames.add(c.getName()); } } // don't use disbandIfEmpty parameter since that'll fire another history event CreatureType removedCritter = legion.removeCreature(game .getVariant().getCreatureByName(creatureName), false, false); // Skip for players that will be dead by end of replay // Skip if removedCritter is null => removeCreature did not find it, // so there is something wrong with the save game. No use to bother // all the clients with it. if (removedCritter != null && !legion.getPlayer().getDeadBeforeSave()) { server.allTellRemoveCreature(legion, removedCritter, false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); if (legion.getHeight() == 0) { legion.remove(false, false); LOGGER.finer("Legion '" + markerId + "' removed"); } } else if (eventName.equals("PlayerElim")) { String playerName = el.getAttributeValue("name"); String slayerName = el.getAttributeValue("slayer"); Player player = game.getPlayerByName(playerName); Player slayer = game.getPlayerByNameIgnoreNull(slayerName); // Record the slayer and give him this player's legion markers. if (slayer != null) { ((PlayerServerSide)player).handleSlaying(slayer); } player.setDead(true); server.allUpdatePlayerInfo(); server.allTellPlayerElim(player, slayer, false); } else if (eventName.equals("MovementRoll")) { String playerName = el.getAttributeValue("playerName"); Player player = game.getPlayerByName(playerName); int roll = Integer.parseInt(el.getAttributeValue("roll")); ((PlayerServerSide)player).setMovementRoll(roll); game.movementRollEvent(player, roll); server.allTellMovementRoll(roll); } else if (eventName.equals("Move")) { String markerId = el.getAttributeValue("markerId"); String lordName = el.getAttributeValue("revealedLord"); String tele = el.getAttributeValue("teleport"); String newHexLabel = el.getAttributeValue("newHex"); String entrySideName = el.getAttributeValue("entrySide"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType revealedLord = lordName.equals("null") ? null : game .getVariant().getCreatureByName(lordName); MasterHex newHex = server.getGame().getVariant().getMasterBoard() .getHexByLabel(newHexLabel); EntrySide entrySide = EntrySide.fromLabel(entrySideName); boolean teleport = tele != null && tele.equals("true"); LOGGER.finest("Legion Move redo event: \n" + " marker " + markerId + ", lordName " + revealedLord + " teleported " + teleport + " to hex " + newHex.getLabel() + " entrySide " + entrySide.toString()); server.overrideProcessingCH(legion.getPlayer()); server.doMove(legion, newHex, entrySide, teleport, revealedLord); server.restoreProcessingCH(); } else if (eventName.equals("UndoMove")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER.finest("Legion Undo Move redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoMove(legion); server.restoreProcessingCH(); } else if (eventName.equals("Recruit")) { String markerId = el.getAttributeValue("markerId"); String recruitName = el.getAttributeValue("recruit"); String recruiterName = el.getAttributeValue("recruiter"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType recruit = game.getVariant().getCreatureByName( recruitName); CreatureType recruiter = recruiterName.equals("null") ? null : game.getVariant().getCreatureByName(recruiterName); LOGGER.finest("Recruit redo event: \n" + " marker " + markerId + " recruit " + recruit + " recruiter " + recruiter); server.overrideProcessingCH(legion.getPlayer()); server.doRecruit(new Recruitment(legion, recruit, recruiter)); server.restoreProcessingCH(); } else if (eventName.equals("UndoRecruit")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER .finest("UndoRecruit redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoRecruit(legion); server.restoreProcessingCH(); } else { LOGGER.warning("Unknown Redo element " + eventName); } } } ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:10 Message: Btw, it says Sun Java ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 16:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 15:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 17:59:43
|
Bugs item #3177305, was opened at 2011-02-10 12:40 Message generated for change (Comment added) made by You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:59 Message: btw, I did try and run the Colossus.jnlp stand alone and brings up the welcome screen, I hit ok, and the Game setup screen appears. I still can't choose newkevin and when I run it, once again I can not pick any of the colors. ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:57 Message: I'll start from the beginning: • I open a folder I extracted all the files to from the .zip • I double click on run.bat A cmd window pops up with: C:\Documents and Settings\kevin\Desktop\collossus>cd "c:\Documents and Settings\kevin\Desktop\collossus\" C:\Documents and Settings\kevin\Desktop\collossus>java -Djava.util.logging.config.file=logging.properties -XMx256M -jar Colossus.jar Then what looks like the main program appears. It is the game setup screen. I make player one a human player and choose Kevin as the type. I make the 2nd player a SimpleAI and choose <By color> for the type. I leave everything else as is. (btw the top says Running Colossus Version 0.12.0-beta1 (revision 4970) on etc...) • I pick New game. The game appears to start, I can see the grid in the background with all the hills, deserts, etc. A small box with Pick a Color appears. I can move this box around. But I can not pick a color. I've tried clicking on every single one. I've tried pressing G, e, o, etc. I've tried Ctrl/Alt combinations, nothing. I can not close it either. I have to force it to shutdown. In Task Manager it shows that it is still running... so I don't THINK it is locked up. I do NOT see any other windows anywhere that I might need to click. I've even tried Alt+Tab and Ctrl+Tab to check. • I went ahead and did a search for the .colossus folder. I found it. It has 5 files in it. Colossus-netclient.cfg Colossus-red.cfg Colossus-server.cfg Colossus-kevin.cfg Colossus-kevin1.cfg • I went ahead and created a new .cfg file. I named it Colossus-kevinnew.cfg. I added these lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Interestingly here, when I started the program, I could not choose kevinnew. I could only still see kevin. I searched my entire computer to see if the .cfg files might also be somewhere else but I could only find them under \\documents and settings\kevin\desktop\collossus • Ok so I tried your command prompt idea. I even ran the command from within the path and I kept getting this error... Unable to access jarfile Colossus.jar I can't imagine it being a graphical error... the program still seems to be running fine, I just can't select any color. In Task Manager it doesn't say "not responding". So I will wait for your reply. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 17:06 Message: ok, XP with SP3 and Sun Java 6 ( 1.6.x ). All right, that should work. ( I may have in use SP2 but still). E.g. "Windows Vista" or "Windows 7" are more "exotic" for me. Sun Java is good also. Did you get the "Welcome to Release 0.12.0" dialog and click it away? (if not, it might have lurked around in the background hidden behind some other window and block the mouse/keyboard input or whatever ("modal dialog"). Should technically not happen/be possible, but one has seen stranger things happen.... The History.java is one of the source files, not relevant. > The only .cf files I could find are WebServer.cf, WebServer_unix.cf, > and WebServer_win.cf. Do you want me to add a line into one of these? No. They are part of the "sources" as well, in some sense. Once started, Colossus will create a directory ".colossus" (and 2 files in it) "somewhere on your computer" - in what it considers to be "your home directory". What that exactly is, might vary... The home directory is under Windows _often_ something like: C:\Documents and Settings\Mike if you logged in to the computer with username Mike. Often you get there with right-click on Start button => Explore => opens an explorer e.g. to C:\Documents and Settings\katzer\Start Menu for me as user katzer. So katzer would be my home dir. However on my computer it's configured differently, so my home directory is D:\katzer You can take an explorer (the Start => right-click => Explore thing) and type in the "path"/adress line in the top "%HOME%" and press return. (you may need to make it visible first with View => Toolbars => Address bar ). Inside there should be .colossus. Once you found that we are much further :) (normally, once masterboardboard is open, Help => About would tell the location but you don't even get there yet :-/ ) Inside there will be eventually several .cfg files (and perhaps a "saves" directory). Directory of D:\katzer\.colossus 07.02.2011 10:06 <DIR> . 07.02.2011 10:06 <DIR> .. 07.02.2011 15:12 1 997 Colossus-clemens.cfg 08.02.2011 19:49 4 425 Colossus-katzer.cfg 08.02.2011 19:49 2 069 Colossus-katzer1.cfg 28.07.2010 17:18 276 Colossus-netclient.cfg 08.02.2011 19:49 900 Colossus-server.cfg 07.02.2011 15:12 2 059 Colossus-test1.cfg 07.02.2011 22:00 586 Colossus-webclient.cfg 07.02.2011 10:56 <DIR> saves 7 File(s) 12 312 bytes 3 Dir(s) 21 313 040 384 bytes free D:\katzer\.colossus> You can ignore the "-server", -webclient and -netclient files for now - they are "internal". -katzer and -clemens etc. are "client preferences" files. Like, I played once a game as clemens, and when changed preferences such as the various auto-<do something>, position and size of windows etc., Colossus would save those to a file with that name. (some other, like Variant, type and names of players, Options in Startup dialog, are stored to the Colossus-server.cfg file). Usually when you get the Game Setup dialog (where you choose variant, count and type of players etc), first of them you make "Human" and name is initialized with the name you are logged on to the computer. Thus created with some text editor (notepad, if necessary), a textfile named Colossus-Mike.cfg (replace your name, of course). (if necessaary, right click in the right side of explorer, where the files are shown => New => Text Document => then there exists a file "New File.txt" (or similar). Click it, or F2 on it, change name to above. Put into that file the following three lines: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Note the "backslash" ( \ ) in front of the space. Now if you start a game with your player name set to "Mike" the Pick... dialogs should not appear. So question is, what will get stuck then :) The other interesting thing to try is, if you can run from commandline (by typing that command, which will make the java command shown): java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar While Colossus runs, eventually happening warnings etc. would be printed to that Command window. But if it's a total "Graphics stuff somehow freezes" (like it sounds, that it does not accept click or key on any of the colors) ... hm. Tricky. Might be no warning/exception, just the graphics thread (EDT, Event Dispatcher Thread, techno babble... ;-) hangs. Let's see so far, how far we get with above. If we get that, I've already some ideas how to proceed. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:15 Message: Not sure if this will help... I found a file called History.java under my recent documents. It's pretty lengthy but it is listed below: package net.sf.colossus.server; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.colossus.common.Constants; import net.sf.colossus.game.Creature; import net.sf.colossus.game.EntrySide; import net.sf.colossus.game.Legion; import net.sf.colossus.game.Player; import net.sf.colossus.game.actions.AddCreatureAction; import net.sf.colossus.game.actions.Recruitment; import net.sf.colossus.util.Glob; import net.sf.colossus.variant.CreatureType; import net.sf.colossus.variant.MasterHex; import org.jdom.Element; /** * Stores game history as XML. * * @author David Ripton */ public class History { private static final Logger LOGGER = Logger.getLogger(History.class .getName()); /** * History: events that happened before last commit point */ private final Element root; /** * History elements/events that happened since the last commit/"snapshot". */ private final List<Element> recentEvents = new LinkedList<Element>(); /** * Set to true during the processing of {@link #fireEventsFromXML(Server)} * to avoid triggering events we just restored again. */ private boolean loading = false; /** * */ private final Element loadedRedoLog; private boolean isRedo = false; /** * Stores the surviving legions (this variable is not needed any more) * * While the history should contain all information to reproduce the game * state, the last set of legions is currently still loaded upfront since * they contain the battle-specific information. This collides with * replaying the game from history... * Now, since 08/2008, they are not stored as "survivorlegions" any more. * Instead, they are backed up internally (done inside PlayerServerSide), * all the history is replayed. This creates proper split prediction data * in all clients. After that, backup data is compared with result of * replay. * E.g. Legion count, their content, players eliminated must be in sync. * Then the replayed ones are discarded and the backedup ones restored * - which have the right legion state (moved, donor, summoned, ...) * * TODO align the history replay more with the original gameplay so we * don't need this anymore; * 08/2008:==> this is now to some part done. Still replay * events could be closer to original events (split, summon, * acquire, teleport, ...) , not just the "result" of that * event (reveal,add,remove effects). * * TODO instead: model the actual events instead of just result, * or at least add relevant info to history elements, so that all * replayed events carry all needed data so that they could also be * processed by event viewer (currently EV does not process anything * during replay). */ public History() { root = new Element("History"); // Dummy: loadedRedoLog = new Element("LoadedRedoLog"); } /** * Constructor used by "LoadGame" */ public History(Element loadGameRoot) { // Get the history elements and store them to "root" root = (Element)loadGameRoot.getChild("History").clone(); // Get the redo log content loadedRedoLog = (Element)loadGameRoot.getChild("Redo").clone(); } /** * All events before last commit */ Element getCopy() { return (Element)root.clone(); } /** * Reached a commit point: append all recent events to the history, * clear list of recent events; caller should do this together with creating * the next snapshot. */ void flushRecentToRoot() { for (Element el : recentEvents) { el.detach(); String name = el.getName(); // TODO later, when this are proper events (not XML elements), // ask rather from the Event whether it belongs copied to // history or not. // TODO At some point in future, put also those Move events // that reveal something to history, and make either the history // replay only send the relevant reveal messages, or make the // Clients during replay (but not redo part) ignore the "move" // and just process the revealing part. // Preferrably the latter, so that proper events show up in the // EventViewer. if (name.equals("Move") || name.equals("UndoMove")) { LOGGER.finest("Flush Redo to History: skipping " + name); } else if (name.equals("Recruit") || name.equals("UndoRecruit")) { // Skipping for now, because there are also the addCreature, // removeCreature and reveal Events still in history. // TODO make the Recruit/UndoRecruit history events during // replay properly, get rid of the "side effect" type of // entries in save game. LOGGER.finest("Flush Redo to History: skipping " + name); } else { root.addContent(el); } } recentEvents.clear(); } /** * @return A Redo Element, containing all events since last commit * i.e. which need to be REDOne on top of last commit point/snapshot */ Element getNewRedoLogElement() { Element redoLogElement = new Element("Redo"); for (Element el : recentEvents) { el.detach(); redoLogElement.addContent(el); } return redoLogElement; } /** * TODO reconsider name * TODO decide if we should move it all into one big handleEvent(GameEvent) method */ void addCreatureEvent(AddCreatureAction event, int turn, String reason) { if (loading) { return; } Element element = new Element("AddCreature"); element.setAttribute("markerId", event.getLegion().getMarkerId()); element.setAttribute("creatureName", event.getAddedCreatureType() .getName()); element.setAttribute("turn", "" + turn); element.setAttribute("reason", reason); recentEvents.add(element); } void removeCreatureEvent(Legion legion, CreatureType creature, int turn, String reason) { if (loading) { return; } Element event = new Element("RemoveCreature"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("creatureName", creature.getName()); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); recentEvents.add(event); } void splitEvent(Legion parent, Legion child, List<CreatureType> splitoffs, int turn) { if (loading) { return; } Element event = new Element("Split"); event.setAttribute("parentId", parent.getMarkerId()); event.setAttribute("childId", child.getMarkerId()); event.setAttribute("turn", "" + turn); Element creatures = new Element("splitoffs"); event.addContent(creatures); for (CreatureType creatureType : splitoffs) { Element cr = new Element("creature"); cr.addContent(creatureType.getName()); creatures.addContent(cr); } recentEvents.add(event); } void mergeEvent(String splitoffId, String survivorId, int turn) { if (loading) { return; } Element event = new Element("Merge"); event.setAttribute("splitoffId", splitoffId); event.setAttribute("survivorId", survivorId); event.setAttribute("turn", "" + turn); recentEvents.add(event); } void revealEvent(boolean allPlayers, List<Player> players, Legion legion, List<CreatureType> creatures, int turn, String reason) { if (loading) { return; } if (creatures.isEmpty()) { // this happens e.g. when in final battle (titan vs. titan) // angel was called out of legion which was then empty, // and in the final updateAllLegionContents there is then // this empty legion... // TODO if this case can happen in a regular game no warning // should be logged LOGGER.log(Level.WARNING, "Called revealEvent(" + allPlayers + ", " + (players != null ? players.toString() : "-null-") + ", " + legion + ", " + creatures.toString() + ", " + turn + ") with empty creatureNames"); return; } Element event = new Element("Reveal"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("allPlayers", "" + allPlayers); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); if (!allPlayers) { Element viewers = new Element("viewers"); event.addContent(viewers); Iterator<Player> it = players.iterator(); while (it.hasNext()) { String playerName = it.next().getName(); Element viewer = new Element("viewer"); viewer.addContent(playerName); viewers.addContent(viewer); } } Element creaturesElem = new Element("creatures"); event.addContent(creaturesElem); for (CreatureType creatureType : creatures) { Element creatureElem = new Element("creature"); creatureElem.addContent(creatureType.getName()); creaturesElem.addContent(creatureElem); } recentEvents.add(event); } void playerElimEvent(Player player, Player slayer, int turn) { if (loading) { return; } Element event = new Element("PlayerElim"); event.setAttribute("name", player.getName()); if (slayer != null) { event.setAttribute("slayer", slayer.getName()); } event.setAttribute("turn", "" + turn); recentEvents.add(event); } void movementRollEvent(Player player, int roll) { if (loading) { return; } Element event = new Element("MovementRoll"); event.setAttribute("playerName", player.getName()); event.setAttribute("roll", "" + roll); recentEvents.add(event); } void legionMoveEvent(Legion legion, MasterHex newHex, EntrySide entrySide, boolean teleport, CreatureType lord) { if (loading) { return; } Element event = new Element("Move"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("newHex", newHex.getLabel()); event.setAttribute("entrySide", entrySide.getLabel()); event.setAttribute("teleport", "" + teleport); String creNameOrTextNull = lord == null ? "null" : lord.getName(); event.setAttribute("revealedLord", creNameOrTextNull); recentEvents.add(event); } void legionUndoMoveEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoMove"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } void recruitEvent(Legion legion, CreatureType recruit, CreatureType recruiter) { if (loading) { return; } Element event = new Element("Recruit"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("recruit", recruit.getName()); event.setAttribute("recruiter", recruiter == null ? "null" : recruiter .getName()); recentEvents.add(event); } void undoRecruitEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoRecruit"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } /** * Fire all events from redoLog. * Elements from RedoLog are processed one by one and the corresponding * method is called on the Server object, pretty much as if a * ClientHandler would call it when receiving such a request from Client. * Note that in some cases overriding the processingCH is necessary * (because technically, this all currently happens while still the * connecting of last joining player is processed, so processingCH is * set to his ClientHandler). * * Note that "loading" is not set to true, so they DO GET ADDED to the * recentEvents list again. * * @param server The server on which to call all the actions to be redone */ void processRedoLog(Server server) { assert loadedRedoLog != null : "Loaded RedoLog should always " + "have a JDOM root element as backing store"; LOGGER.info("History: Start processing redo log"); isRedo = true; for (Object obj : loadedRedoLog.getChildren()) { Element el = (Element)obj; LOGGER.info("processing redo event " + el.getName()); fireEventFromElement(server, el); } isRedo = false; // TODO clear loadedRedoLog? LOGGER.info("Completed processing redo log"); } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventsFromXML(Server server) { this.loading = true; assert root != null : "History should always have a " + " JDOM root element as backing store"; List<Element> kids = root.getChildren(); Iterator<Element> it = kids.iterator(); while (it.hasNext()) { Element el = it.next(); fireEventFromElement(server, el); } this.loading = false; } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventFromElement(Server server, Element el) { GameServerSide game = server.getGame(); String eventName = el.getName(); String reasonPerhaps = el.getAttributeValue("reason"); String reason = (reasonPerhaps != null && !reasonPerhaps .equals("null")) ? reasonPerhaps : "<undefinedReason>"; if (eventName.equals("Reveal") && isRedo && reason.equals(Constants.reasonRecruiter)) { // Skip this because we redo the full recruit event // TODO LOGGER.finest("Skipping Reveal event (reason " + reason + ") during redo."); } else if (eventName.equals("AddCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping AddCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("RemoveCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping RemoveCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("Reveal")) { String allPlayers = el.getAttributeValue("allPlayers"); boolean all = allPlayers != null && allPlayers.equals("true"); String markerId = el.getAttributeValue("markerId"); List<String> playerNames = new ArrayList<String>(); Element viewEl = el.getChild("viewers"); int turn = Integer.parseInt(el.getAttributeValue("turn")); String playerName = null; if (viewEl != null) { List<Element> viewers = viewEl.getChildren(); Iterator<Element> it = viewers.iterator(); while (it.hasNext()) { Element viewer = it.next(); playerName = viewer.getTextNormalize(); playerNames.add(playerName); } } List<Element> creatureElements = el.getChild("creatures") .getChildren(); List<CreatureType> creatures = new ArrayList<CreatureType>(); for (Element creature : creatureElements) { String creatureName = creature.getTextNormalize(); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } Player player = game.getPlayerByMarkerId(markerId); Legion legion; if (turn == 1 && player.getLegionByMarkerId(markerId) == null) { // there is no create event for the startup legions, // so we might need to create them for the reveal event legion = new LegionServerSide(markerId, null, player .getStartingTower(), player.getStartingTower(), player, game, creatures .toArray(new CreatureType[creatures.size()])); player.addLegion(legion); } else { legion = player.getLegionByMarkerId(markerId); } // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; if (((PlayerServerSide)player).getDeadBeforeSave()) { // Skip for players that will be dead by end of replay } else if (all) { server.allRevealCreatures(legion, creatures, reason); } else { server.oneRevealLegion(game.getPlayerByName(playerName), legion, creatures, reason); } } else if (eventName.equals("Split")) { String parentId = el.getAttributeValue("parentId"); String childId = el.getAttributeValue("childId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); List<String> creatureNames = new ArrayList<String>(); List<CreatureType> creatures = new ArrayList<CreatureType>(); List<Element> splitoffs = el.getChild("splitoffs").getChildren(); Iterator<Element> it = splitoffs.iterator(); while (it.hasNext()) { Element creature = it.next(); String creatureName = creature.getTextNormalize(); creatureNames.add(creatureName); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } LegionServerSide parentLegion = game.getLegionByMarkerId(parentId); if (isRedo) { server.overrideProcessingCH(parentLegion.getPlayer()); server.doSplit(parentLegion, childId, creatures); server.overrideProcessingCH(parentLegion.getPlayer()); return; } // LegionServerSide.split(..) doesn't like us here since the parent // legion can't remove creatures (not there?) -- create child directly // instead PlayerServerSide player = parentLegion.getPlayer(); LegionServerSide childLegion; if (player.hasLegion(childId)) { childLegion = game.getLegionByMarkerId(childId); LOGGER.severe("During replay of history: child legion " + childId + " should not " + "exist yet (turn=" + turn + ")!!\n" + "Exists already with: " + Glob.glob(",", childLegion.getCreatureTypes()) + " but " + "should now be created with creatures: " + creatures); childLegion.remove(); } childLegion = new LegionServerSide(childId, null, parentLegion .getCurrentHex(), parentLegion.getCurrentHex(), player, game, creatures.toArray(new CreatureType[creatures.size()])); player.addLegion(childLegion); for (CreatureType creature : creatures) { parentLegion.removeCreature(creature, false, false); } // Skip for players that will be dead by end of replay if (!player.getDeadBeforeSave()) { server.allTellDidSplit(parentLegion, childLegion, turn, false); } } else if (eventName.equals("Merge")) { String splitoffId = el.getAttributeValue("splitoffId"); String survivorId = el.getAttributeValue("survivorId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); LegionServerSide splitoff = game.getLegionByMarkerId(splitoffId); LegionServerSide survivor = game.getLegionByMarkerId(survivorId); // Skip for players that will be dead by end of replay if (!survivor.getPlayer().getDeadBeforeSave()) { server.undidSplit(splitoff, survivor, false, turn); } // Add them back to parent: while (splitoff.getHeight() > 0) { CreatureType type = splitoff.removeCreature(0, false, false); survivor.addCreature(type, false); } splitoff.remove(false, false); } else if (eventName.equals("AddCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Adding creature '" + creatureName + "' to legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType creatureType = game.getVariant().getCreatureByName( creatureName); legion.addCreature(creatureType, false); // Skip for players that will be dead by end of replay if (!legion.getPlayer().getDeadBeforeSave()) { server.allTellAddCreature(new AddCreatureAction(legion, creatureType), false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); } else if (eventName.equals("RemoveCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Removing creature '" + creatureName + "' from legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); if (legion == null) { LOGGER.warning("removeCreature " + creatureName + " from legion " + markerId + ", legion is null"); return; } else { List<? extends Creature> cres = legion.getCreatures(); List<String> crenames = new ArrayList<String>(); for (Creature c : cres) { crenames.add(c.getName()); } } // don't use disbandIfEmpty parameter since that'll fire another history event CreatureType removedCritter = legion.removeCreature(game .getVariant().getCreatureByName(creatureName), false, false); // Skip for players that will be dead by end of replay // Skip if removedCritter is null => removeCreature did not find it, // so there is something wrong with the save game. No use to bother // all the clients with it. if (removedCritter != null && !legion.getPlayer().getDeadBeforeSave()) { server.allTellRemoveCreature(legion, removedCritter, false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); if (legion.getHeight() == 0) { legion.remove(false, false); LOGGER.finer("Legion '" + markerId + "' removed"); } } else if (eventName.equals("PlayerElim")) { String playerName = el.getAttributeValue("name"); String slayerName = el.getAttributeValue("slayer"); Player player = game.getPlayerByName(playerName); Player slayer = game.getPlayerByNameIgnoreNull(slayerName); // Record the slayer and give him this player's legion markers. if (slayer != null) { ((PlayerServerSide)player).handleSlaying(slayer); } player.setDead(true); server.allUpdatePlayerInfo(); server.allTellPlayerElim(player, slayer, false); } else if (eventName.equals("MovementRoll")) { String playerName = el.getAttributeValue("playerName"); Player player = game.getPlayerByName(playerName); int roll = Integer.parseInt(el.getAttributeValue("roll")); ((PlayerServerSide)player).setMovementRoll(roll); game.movementRollEvent(player, roll); server.allTellMovementRoll(roll); } else if (eventName.equals("Move")) { String markerId = el.getAttributeValue("markerId"); String lordName = el.getAttributeValue("revealedLord"); String tele = el.getAttributeValue("teleport"); String newHexLabel = el.getAttributeValue("newHex"); String entrySideName = el.getAttributeValue("entrySide"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType revealedLord = lordName.equals("null") ? null : game .getVariant().getCreatureByName(lordName); MasterHex newHex = server.getGame().getVariant().getMasterBoard() .getHexByLabel(newHexLabel); EntrySide entrySide = EntrySide.fromLabel(entrySideName); boolean teleport = tele != null && tele.equals("true"); LOGGER.finest("Legion Move redo event: \n" + " marker " + markerId + ", lordName " + revealedLord + " teleported " + teleport + " to hex " + newHex.getLabel() + " entrySide " + entrySide.toString()); server.overrideProcessingCH(legion.getPlayer()); server.doMove(legion, newHex, entrySide, teleport, revealedLord); server.restoreProcessingCH(); } else if (eventName.equals("UndoMove")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER.finest("Legion Undo Move redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoMove(legion); server.restoreProcessingCH(); } else if (eventName.equals("Recruit")) { String markerId = el.getAttributeValue("markerId"); String recruitName = el.getAttributeValue("recruit"); String recruiterName = el.getAttributeValue("recruiter"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType recruit = game.getVariant().getCreatureByName( recruitName); CreatureType recruiter = recruiterName.equals("null") ? null : game.getVariant().getCreatureByName(recruiterName); LOGGER.finest("Recruit redo event: \n" + " marker " + markerId + " recruit " + recruit + " recruiter " + recruiter); server.overrideProcessingCH(legion.getPlayer()); server.doRecruit(new Recruitment(legion, recruit, recruiter)); server.restoreProcessingCH(); } else if (eventName.equals("UndoRecruit")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER .finest("UndoRecruit redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoRecruit(legion); server.restoreProcessingCH(); } else { LOGGER.warning("Unknown Redo element " + eventName); } } } ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:10 Message: Btw, it says Sun Java ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 13:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 12:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 17:57:41
|
Bugs item #3177305, was opened at 2011-02-10 12:40 Message generated for change (Comment added) made by You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:57 Message: I'll start from the beginning: • I open a folder I extracted all the files to from the .zip • I double click on run.bat A cmd window pops up with: C:\Documents and Settings\kevin\Desktop\collossus>cd "c:\Documents and Settings\kevin\Desktop\collossus\" C:\Documents and Settings\kevin\Desktop\collossus>java -Djava.util.logging.config.file=logging.properties -XMx256M -jar Colossus.jar Then what looks like the main program appears. It is the game setup screen. I make player one a human player and choose Kevin as the type. I make the 2nd player a SimpleAI and choose <By color> for the type. I leave everything else as is. (btw the top says Running Colossus Version 0.12.0-beta1 (revision 4970) on etc...) • I pick New game. The game appears to start, I can see the grid in the background with all the hills, deserts, etc. A small box with Pick a Color appears. I can move this box around. But I can not pick a color. I've tried clicking on every single one. I've tried pressing G, e, o, etc. I've tried Ctrl/Alt combinations, nothing. I can not close it either. I have to force it to shutdown. In Task Manager it shows that it is still running... so I don't THINK it is locked up. I do NOT see any other windows anywhere that I might need to click. I've even tried Alt+Tab and Ctrl+Tab to check. • I went ahead and did a search for the .colossus folder. I found it. It has 5 files in it. Colossus-netclient.cfg Colossus-red.cfg Colossus-server.cfg Colossus-kevin.cfg Colossus-kevin1.cfg • I went ahead and created a new .cfg file. I named it Colossus-kevinnew.cfg. I added these lines to it: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Interestingly here, when I started the program, I could not choose kevinnew. I could only still see kevin. I searched my entire computer to see if the .cfg files might also be somewhere else but I could only find them under \\documents and settings\kevin\desktop\collossus • Ok so I tried your command prompt idea. I even ran the command from within the path and I kept getting this error... Unable to access jarfile Colossus.jar I can't imagine it being a graphical error... the program still seems to be running fine, I just can't select any color. In Task Manager it doesn't say "not responding". So I will wait for your reply. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 17:06 Message: ok, XP with SP3 and Sun Java 6 ( 1.6.x ). All right, that should work. ( I may have in use SP2 but still). E.g. "Windows Vista" or "Windows 7" are more "exotic" for me. Sun Java is good also. Did you get the "Welcome to Release 0.12.0" dialog and click it away? (if not, it might have lurked around in the background hidden behind some other window and block the mouse/keyboard input or whatever ("modal dialog"). Should technically not happen/be possible, but one has seen stranger things happen.... The History.java is one of the source files, not relevant. > The only .cf files I could find are WebServer.cf, WebServer_unix.cf, > and WebServer_win.cf. Do you want me to add a line into one of these? No. They are part of the "sources" as well, in some sense. Once started, Colossus will create a directory ".colossus" (and 2 files in it) "somewhere on your computer" - in what it considers to be "your home directory". What that exactly is, might vary... The home directory is under Windows _often_ something like: C:\Documents and Settings\Mike if you logged in to the computer with username Mike. Often you get there with right-click on Start button => Explore => opens an explorer e.g. to C:\Documents and Settings\katzer\Start Menu for me as user katzer. So katzer would be my home dir. However on my computer it's configured differently, so my home directory is D:\katzer You can take an explorer (the Start => right-click => Explore thing) and type in the "path"/adress line in the top "%HOME%" and press return. (you may need to make it visible first with View => Toolbars => Address bar ). Inside there should be .colossus. Once you found that we are much further :) (normally, once masterboardboard is open, Help => About would tell the location but you don't even get there yet :-/ ) Inside there will be eventually several .cfg files (and perhaps a "saves" directory). Directory of D:\katzer\.colossus 07.02.2011 10:06 <DIR> . 07.02.2011 10:06 <DIR> .. 07.02.2011 15:12 1 997 Colossus-clemens.cfg 08.02.2011 19:49 4 425 Colossus-katzer.cfg 08.02.2011 19:49 2 069 Colossus-katzer1.cfg 28.07.2010 17:18 276 Colossus-netclient.cfg 08.02.2011 19:49 900 Colossus-server.cfg 07.02.2011 15:12 2 059 Colossus-test1.cfg 07.02.2011 22:00 586 Colossus-webclient.cfg 07.02.2011 10:56 <DIR> saves 7 File(s) 12 312 bytes 3 Dir(s) 21 313 040 384 bytes free D:\katzer\.colossus> You can ignore the "-server", -webclient and -netclient files for now - they are "internal". -katzer and -clemens etc. are "client preferences" files. Like, I played once a game as clemens, and when changed preferences such as the various auto-<do something>, position and size of windows etc., Colossus would save those to a file with that name. (some other, like Variant, type and names of players, Options in Startup dialog, are stored to the Colossus-server.cfg file). Usually when you get the Game Setup dialog (where you choose variant, count and type of players etc), first of them you make "Human" and name is initialized with the name you are logged on to the computer. Thus created with some text editor (notepad, if necessary), a textfile named Colossus-Mike.cfg (replace your name, of course). (if necessaary, right click in the right side of explorer, where the files are shown => New => Text Document => then there exists a file "New File.txt" (or similar). Click it, or F2 on it, change name to above. Put into that file the following three lines: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Note the "backslash" ( \ ) in front of the space. Now if you start a game with your player name set to "Mike" the Pick... dialogs should not appear. So question is, what will get stuck then :) The other interesting thing to try is, if you can run from commandline (by typing that command, which will make the java command shown): java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar While Colossus runs, eventually happening warnings etc. would be printed to that Command window. But if it's a total "Graphics stuff somehow freezes" (like it sounds, that it does not accept click or key on any of the colors) ... hm. Tricky. Might be no warning/exception, just the graphics thread (EDT, Event Dispatcher Thread, techno babble... ;-) hangs. Let's see so far, how far we get with above. If we get that, I've already some ideas how to proceed. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:15 Message: Not sure if this will help... I found a file called History.java under my recent documents. It's pretty lengthy but it is listed below: package net.sf.colossus.server; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.colossus.common.Constants; import net.sf.colossus.game.Creature; import net.sf.colossus.game.EntrySide; import net.sf.colossus.game.Legion; import net.sf.colossus.game.Player; import net.sf.colossus.game.actions.AddCreatureAction; import net.sf.colossus.game.actions.Recruitment; import net.sf.colossus.util.Glob; import net.sf.colossus.variant.CreatureType; import net.sf.colossus.variant.MasterHex; import org.jdom.Element; /** * Stores game history as XML. * * @author David Ripton */ public class History { private static final Logger LOGGER = Logger.getLogger(History.class .getName()); /** * History: events that happened before last commit point */ private final Element root; /** * History elements/events that happened since the last commit/"snapshot". */ private final List<Element> recentEvents = new LinkedList<Element>(); /** * Set to true during the processing of {@link #fireEventsFromXML(Server)} * to avoid triggering events we just restored again. */ private boolean loading = false; /** * */ private final Element loadedRedoLog; private boolean isRedo = false; /** * Stores the surviving legions (this variable is not needed any more) * * While the history should contain all information to reproduce the game * state, the last set of legions is currently still loaded upfront since * they contain the battle-specific information. This collides with * replaying the game from history... * Now, since 08/2008, they are not stored as "survivorlegions" any more. * Instead, they are backed up internally (done inside PlayerServerSide), * all the history is replayed. This creates proper split prediction data * in all clients. After that, backup data is compared with result of * replay. * E.g. Legion count, their content, players eliminated must be in sync. * Then the replayed ones are discarded and the backedup ones restored * - which have the right legion state (moved, donor, summoned, ...) * * TODO align the history replay more with the original gameplay so we * don't need this anymore; * 08/2008:==> this is now to some part done. Still replay * events could be closer to original events (split, summon, * acquire, teleport, ...) , not just the "result" of that * event (reveal,add,remove effects). * * TODO instead: model the actual events instead of just result, * or at least add relevant info to history elements, so that all * replayed events carry all needed data so that they could also be * processed by event viewer (currently EV does not process anything * during replay). */ public History() { root = new Element("History"); // Dummy: loadedRedoLog = new Element("LoadedRedoLog"); } /** * Constructor used by "LoadGame" */ public History(Element loadGameRoot) { // Get the history elements and store them to "root" root = (Element)loadGameRoot.getChild("History").clone(); // Get the redo log content loadedRedoLog = (Element)loadGameRoot.getChild("Redo").clone(); } /** * All events before last commit */ Element getCopy() { return (Element)root.clone(); } /** * Reached a commit point: append all recent events to the history, * clear list of recent events; caller should do this together with creating * the next snapshot. */ void flushRecentToRoot() { for (Element el : recentEvents) { el.detach(); String name = el.getName(); // TODO later, when this are proper events (not XML elements), // ask rather from the Event whether it belongs copied to // history or not. // TODO At some point in future, put also those Move events // that reveal something to history, and make either the history // replay only send the relevant reveal messages, or make the // Clients during replay (but not redo part) ignore the "move" // and just process the revealing part. // Preferrably the latter, so that proper events show up in the // EventViewer. if (name.equals("Move") || name.equals("UndoMove")) { LOGGER.finest("Flush Redo to History: skipping " + name); } else if (name.equals("Recruit") || name.equals("UndoRecruit")) { // Skipping for now, because there are also the addCreature, // removeCreature and reveal Events still in history. // TODO make the Recruit/UndoRecruit history events during // replay properly, get rid of the "side effect" type of // entries in save game. LOGGER.finest("Flush Redo to History: skipping " + name); } else { root.addContent(el); } } recentEvents.clear(); } /** * @return A Redo Element, containing all events since last commit * i.e. which need to be REDOne on top of last commit point/snapshot */ Element getNewRedoLogElement() { Element redoLogElement = new Element("Redo"); for (Element el : recentEvents) { el.detach(); redoLogElement.addContent(el); } return redoLogElement; } /** * TODO reconsider name * TODO decide if we should move it all into one big handleEvent(GameEvent) method */ void addCreatureEvent(AddCreatureAction event, int turn, String reason) { if (loading) { return; } Element element = new Element("AddCreature"); element.setAttribute("markerId", event.getLegion().getMarkerId()); element.setAttribute("creatureName", event.getAddedCreatureType() .getName()); element.setAttribute("turn", "" + turn); element.setAttribute("reason", reason); recentEvents.add(element); } void removeCreatureEvent(Legion legion, CreatureType creature, int turn, String reason) { if (loading) { return; } Element event = new Element("RemoveCreature"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("creatureName", creature.getName()); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); recentEvents.add(event); } void splitEvent(Legion parent, Legion child, List<CreatureType> splitoffs, int turn) { if (loading) { return; } Element event = new Element("Split"); event.setAttribute("parentId", parent.getMarkerId()); event.setAttribute("childId", child.getMarkerId()); event.setAttribute("turn", "" + turn); Element creatures = new Element("splitoffs"); event.addContent(creatures); for (CreatureType creatureType : splitoffs) { Element cr = new Element("creature"); cr.addContent(creatureType.getName()); creatures.addContent(cr); } recentEvents.add(event); } void mergeEvent(String splitoffId, String survivorId, int turn) { if (loading) { return; } Element event = new Element("Merge"); event.setAttribute("splitoffId", splitoffId); event.setAttribute("survivorId", survivorId); event.setAttribute("turn", "" + turn); recentEvents.add(event); } void revealEvent(boolean allPlayers, List<Player> players, Legion legion, List<CreatureType> creatures, int turn, String reason) { if (loading) { return; } if (creatures.isEmpty()) { // this happens e.g. when in final battle (titan vs. titan) // angel was called out of legion which was then empty, // and in the final updateAllLegionContents there is then // this empty legion... // TODO if this case can happen in a regular game no warning // should be logged LOGGER.log(Level.WARNING, "Called revealEvent(" + allPlayers + ", " + (players != null ? players.toString() : "-null-") + ", " + legion + ", " + creatures.toString() + ", " + turn + ") with empty creatureNames"); return; } Element event = new Element("Reveal"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("allPlayers", "" + allPlayers); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); if (!allPlayers) { Element viewers = new Element("viewers"); event.addContent(viewers); Iterator<Player> it = players.iterator(); while (it.hasNext()) { String playerName = it.next().getName(); Element viewer = new Element("viewer"); viewer.addContent(playerName); viewers.addContent(viewer); } } Element creaturesElem = new Element("creatures"); event.addContent(creaturesElem); for (CreatureType creatureType : creatures) { Element creatureElem = new Element("creature"); creatureElem.addContent(creatureType.getName()); creaturesElem.addContent(creatureElem); } recentEvents.add(event); } void playerElimEvent(Player player, Player slayer, int turn) { if (loading) { return; } Element event = new Element("PlayerElim"); event.setAttribute("name", player.getName()); if (slayer != null) { event.setAttribute("slayer", slayer.getName()); } event.setAttribute("turn", "" + turn); recentEvents.add(event); } void movementRollEvent(Player player, int roll) { if (loading) { return; } Element event = new Element("MovementRoll"); event.setAttribute("playerName", player.getName()); event.setAttribute("roll", "" + roll); recentEvents.add(event); } void legionMoveEvent(Legion legion, MasterHex newHex, EntrySide entrySide, boolean teleport, CreatureType lord) { if (loading) { return; } Element event = new Element("Move"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("newHex", newHex.getLabel()); event.setAttribute("entrySide", entrySide.getLabel()); event.setAttribute("teleport", "" + teleport); String creNameOrTextNull = lord == null ? "null" : lord.getName(); event.setAttribute("revealedLord", creNameOrTextNull); recentEvents.add(event); } void legionUndoMoveEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoMove"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } void recruitEvent(Legion legion, CreatureType recruit, CreatureType recruiter) { if (loading) { return; } Element event = new Element("Recruit"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("recruit", recruit.getName()); event.setAttribute("recruiter", recruiter == null ? "null" : recruiter .getName()); recentEvents.add(event); } void undoRecruitEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoRecruit"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } /** * Fire all events from redoLog. * Elements from RedoLog are processed one by one and the corresponding * method is called on the Server object, pretty much as if a * ClientHandler would call it when receiving such a request from Client. * Note that in some cases overriding the processingCH is necessary * (because technically, this all currently happens while still the * connecting of last joining player is processed, so processingCH is * set to his ClientHandler). * * Note that "loading" is not set to true, so they DO GET ADDED to the * recentEvents list again. * * @param server The server on which to call all the actions to be redone */ void processRedoLog(Server server) { assert loadedRedoLog != null : "Loaded RedoLog should always " + "have a JDOM root element as backing store"; LOGGER.info("History: Start processing redo log"); isRedo = true; for (Object obj : loadedRedoLog.getChildren()) { Element el = (Element)obj; LOGGER.info("processing redo event " + el.getName()); fireEventFromElement(server, el); } isRedo = false; // TODO clear loadedRedoLog? LOGGER.info("Completed processing redo log"); } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventsFromXML(Server server) { this.loading = true; assert root != null : "History should always have a " + " JDOM root element as backing store"; List<Element> kids = root.getChildren(); Iterator<Element> it = kids.iterator(); while (it.hasNext()) { Element el = it.next(); fireEventFromElement(server, el); } this.loading = false; } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventFromElement(Server server, Element el) { GameServerSide game = server.getGame(); String eventName = el.getName(); String reasonPerhaps = el.getAttributeValue("reason"); String reason = (reasonPerhaps != null && !reasonPerhaps .equals("null")) ? reasonPerhaps : "<undefinedReason>"; if (eventName.equals("Reveal") && isRedo && reason.equals(Constants.reasonRecruiter)) { // Skip this because we redo the full recruit event // TODO LOGGER.finest("Skipping Reveal event (reason " + reason + ") during redo."); } else if (eventName.equals("AddCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping AddCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("RemoveCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping RemoveCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("Reveal")) { String allPlayers = el.getAttributeValue("allPlayers"); boolean all = allPlayers != null && allPlayers.equals("true"); String markerId = el.getAttributeValue("markerId"); List<String> playerNames = new ArrayList<String>(); Element viewEl = el.getChild("viewers"); int turn = Integer.parseInt(el.getAttributeValue("turn")); String playerName = null; if (viewEl != null) { List<Element> viewers = viewEl.getChildren(); Iterator<Element> it = viewers.iterator(); while (it.hasNext()) { Element viewer = it.next(); playerName = viewer.getTextNormalize(); playerNames.add(playerName); } } List<Element> creatureElements = el.getChild("creatures") .getChildren(); List<CreatureType> creatures = new ArrayList<CreatureType>(); for (Element creature : creatureElements) { String creatureName = creature.getTextNormalize(); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } Player player = game.getPlayerByMarkerId(markerId); Legion legion; if (turn == 1 && player.getLegionByMarkerId(markerId) == null) { // there is no create event for the startup legions, // so we might need to create them for the reveal event legion = new LegionServerSide(markerId, null, player .getStartingTower(), player.getStartingTower(), player, game, creatures .toArray(new CreatureType[creatures.size()])); player.addLegion(legion); } else { legion = player.getLegionByMarkerId(markerId); } // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; if (((PlayerServerSide)player).getDeadBeforeSave()) { // Skip for players that will be dead by end of replay } else if (all) { server.allRevealCreatures(legion, creatures, reason); } else { server.oneRevealLegion(game.getPlayerByName(playerName), legion, creatures, reason); } } else if (eventName.equals("Split")) { String parentId = el.getAttributeValue("parentId"); String childId = el.getAttributeValue("childId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); List<String> creatureNames = new ArrayList<String>(); List<CreatureType> creatures = new ArrayList<CreatureType>(); List<Element> splitoffs = el.getChild("splitoffs").getChildren(); Iterator<Element> it = splitoffs.iterator(); while (it.hasNext()) { Element creature = it.next(); String creatureName = creature.getTextNormalize(); creatureNames.add(creatureName); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } LegionServerSide parentLegion = game.getLegionByMarkerId(parentId); if (isRedo) { server.overrideProcessingCH(parentLegion.getPlayer()); server.doSplit(parentLegion, childId, creatures); server.overrideProcessingCH(parentLegion.getPlayer()); return; } // LegionServerSide.split(..) doesn't like us here since the parent // legion can't remove creatures (not there?) -- create child directly // instead PlayerServerSide player = parentLegion.getPlayer(); LegionServerSide childLegion; if (player.hasLegion(childId)) { childLegion = game.getLegionByMarkerId(childId); LOGGER.severe("During replay of history: child legion " + childId + " should not " + "exist yet (turn=" + turn + ")!!\n" + "Exists already with: " + Glob.glob(",", childLegion.getCreatureTypes()) + " but " + "should now be created with creatures: " + creatures); childLegion.remove(); } childLegion = new LegionServerSide(childId, null, parentLegion .getCurrentHex(), parentLegion.getCurrentHex(), player, game, creatures.toArray(new CreatureType[creatures.size()])); player.addLegion(childLegion); for (CreatureType creature : creatures) { parentLegion.removeCreature(creature, false, false); } // Skip for players that will be dead by end of replay if (!player.getDeadBeforeSave()) { server.allTellDidSplit(parentLegion, childLegion, turn, false); } } else if (eventName.equals("Merge")) { String splitoffId = el.getAttributeValue("splitoffId"); String survivorId = el.getAttributeValue("survivorId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); LegionServerSide splitoff = game.getLegionByMarkerId(splitoffId); LegionServerSide survivor = game.getLegionByMarkerId(survivorId); // Skip for players that will be dead by end of replay if (!survivor.getPlayer().getDeadBeforeSave()) { server.undidSplit(splitoff, survivor, false, turn); } // Add them back to parent: while (splitoff.getHeight() > 0) { CreatureType type = splitoff.removeCreature(0, false, false); survivor.addCreature(type, false); } splitoff.remove(false, false); } else if (eventName.equals("AddCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Adding creature '" + creatureName + "' to legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType creatureType = game.getVariant().getCreatureByName( creatureName); legion.addCreature(creatureType, false); // Skip for players that will be dead by end of replay if (!legion.getPlayer().getDeadBeforeSave()) { server.allTellAddCreature(new AddCreatureAction(legion, creatureType), false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); } else if (eventName.equals("RemoveCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Removing creature '" + creatureName + "' from legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); if (legion == null) { LOGGER.warning("removeCreature " + creatureName + " from legion " + markerId + ", legion is null"); return; } else { List<? extends Creature> cres = legion.getCreatures(); List<String> crenames = new ArrayList<String>(); for (Creature c : cres) { crenames.add(c.getName()); } } // don't use disbandIfEmpty parameter since that'll fire another history event CreatureType removedCritter = legion.removeCreature(game .getVariant().getCreatureByName(creatureName), false, false); // Skip for players that will be dead by end of replay // Skip if removedCritter is null => removeCreature did not find it, // so there is something wrong with the save game. No use to bother // all the clients with it. if (removedCritter != null && !legion.getPlayer().getDeadBeforeSave()) { server.allTellRemoveCreature(legion, removedCritter, false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); if (legion.getHeight() == 0) { legion.remove(false, false); LOGGER.finer("Legion '" + markerId + "' removed"); } } else if (eventName.equals("PlayerElim")) { String playerName = el.getAttributeValue("name"); String slayerName = el.getAttributeValue("slayer"); Player player = game.getPlayerByName(playerName); Player slayer = game.getPlayerByNameIgnoreNull(slayerName); // Record the slayer and give him this player's legion markers. if (slayer != null) { ((PlayerServerSide)player).handleSlaying(slayer); } player.setDead(true); server.allUpdatePlayerInfo(); server.allTellPlayerElim(player, slayer, false); } else if (eventName.equals("MovementRoll")) { String playerName = el.getAttributeValue("playerName"); Player player = game.getPlayerByName(playerName); int roll = Integer.parseInt(el.getAttributeValue("roll")); ((PlayerServerSide)player).setMovementRoll(roll); game.movementRollEvent(player, roll); server.allTellMovementRoll(roll); } else if (eventName.equals("Move")) { String markerId = el.getAttributeValue("markerId"); String lordName = el.getAttributeValue("revealedLord"); String tele = el.getAttributeValue("teleport"); String newHexLabel = el.getAttributeValue("newHex"); String entrySideName = el.getAttributeValue("entrySide"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType revealedLord = lordName.equals("null") ? null : game .getVariant().getCreatureByName(lordName); MasterHex newHex = server.getGame().getVariant().getMasterBoard() .getHexByLabel(newHexLabel); EntrySide entrySide = EntrySide.fromLabel(entrySideName); boolean teleport = tele != null && tele.equals("true"); LOGGER.finest("Legion Move redo event: \n" + " marker " + markerId + ", lordName " + revealedLord + " teleported " + teleport + " to hex " + newHex.getLabel() + " entrySide " + entrySide.toString()); server.overrideProcessingCH(legion.getPlayer()); server.doMove(legion, newHex, entrySide, teleport, revealedLord); server.restoreProcessingCH(); } else if (eventName.equals("UndoMove")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER.finest("Legion Undo Move redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoMove(legion); server.restoreProcessingCH(); } else if (eventName.equals("Recruit")) { String markerId = el.getAttributeValue("markerId"); String recruitName = el.getAttributeValue("recruit"); String recruiterName = el.getAttributeValue("recruiter"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType recruit = game.getVariant().getCreatureByName( recruitName); CreatureType recruiter = recruiterName.equals("null") ? null : game.getVariant().getCreatureByName(recruiterName); LOGGER.finest("Recruit redo event: \n" + " marker " + markerId + " recruit " + recruit + " recruiter " + recruiter); server.overrideProcessingCH(legion.getPlayer()); server.doRecruit(new Recruitment(legion, recruit, recruiter)); server.restoreProcessingCH(); } else if (eventName.equals("UndoRecruit")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER .finest("UndoRecruit redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoRecruit(legion); server.restoreProcessingCH(); } else { LOGGER.warning("Unknown Redo element " + eventName); } } } ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:10 Message: Btw, it says Sun Java ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 13:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 12:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 17:06:30
|
Bugs item #3177305, was opened at 2011-02-10 14:40 Message generated for change (Comment added) made by cleka You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- >Comment By: Clemens Katzer (cleka) Date: 2011-02-10 19:06 Message: ok, XP with SP3 and Sun Java 6 ( 1.6.x ). All right, that should work. ( I may have in use SP2 but still). E.g. "Windows Vista" or "Windows 7" are more "exotic" for me. Sun Java is good also. Did you get the "Welcome to Release 0.12.0" dialog and click it away? (if not, it might have lurked around in the background hidden behind some other window and block the mouse/keyboard input or whatever ("modal dialog"). Should technically not happen/be possible, but one has seen stranger things happen.... The History.java is one of the source files, not relevant. > The only .cf files I could find are WebServer.cf, WebServer_unix.cf, > and WebServer_win.cf. Do you want me to add a line into one of these? No. They are part of the "sources" as well, in some sense. Once started, Colossus will create a directory ".colossus" (and 2 files in it) "somewhere on your computer" - in what it considers to be "your home directory". What that exactly is, might vary... The home directory is under Windows _often_ something like: C:\Documents and Settings\Mike if you logged in to the computer with username Mike. Often you get there with right-click on Start button => Explore => opens an explorer e.g. to C:\Documents and Settings\katzer\Start Menu for me as user katzer. So katzer would be my home dir. However on my computer it's configured differently, so my home directory is D:\katzer You can take an explorer (the Start => right-click => Explore thing) and type in the "path"/adress line in the top "%HOME%" and press return. (you may need to make it visible first with View => Toolbars => Address bar ). Inside there should be .colossus. Once you found that we are much further :) (normally, once masterboardboard is open, Help => About would tell the location but you don't even get there yet :-/ ) Inside there will be eventually several .cfg files (and perhaps a "saves" directory). Directory of D:\katzer\.colossus 07.02.2011 10:06 <DIR> . 07.02.2011 10:06 <DIR> .. 07.02.2011 15:12 1 997 Colossus-clemens.cfg 08.02.2011 19:49 4 425 Colossus-katzer.cfg 08.02.2011 19:49 2 069 Colossus-katzer1.cfg 28.07.2010 17:18 276 Colossus-netclient.cfg 08.02.2011 19:49 900 Colossus-server.cfg 07.02.2011 15:12 2 059 Colossus-test1.cfg 07.02.2011 22:00 586 Colossus-webclient.cfg 07.02.2011 10:56 <DIR> saves 7 File(s) 12 312 bytes 3 Dir(s) 21 313 040 384 bytes free D:\katzer\.colossus> You can ignore the "-server", -webclient and -netclient files for now - they are "internal". -katzer and -clemens etc. are "client preferences" files. Like, I played once a game as clemens, and when changed preferences such as the various auto-<do something>, position and size of windows etc., Colossus would save those to a file with that name. (some other, like Variant, type and names of players, Options in Startup dialog, are stored to the Colossus-server.cfg file). Usually when you get the Game Setup dialog (where you choose variant, count and type of players etc), first of them you make "Human" and name is initialized with the name you are logged on to the computer. Thus created with some text editor (notepad, if necessary), a textfile named Colossus-Mike.cfg (replace your name, of course). (if necessaary, right click in the right side of explorer, where the files are shown => New => Text Document => then there exists a file "New File.txt" (or similar). Click it, or F2 on it, change name to above. Put into that file the following three lines: Auto\ pick\ markers=true Auto\ pick\ color=true Favorite\ colors=Green Note the "backslash" ( \ ) in front of the space. Now if you start a game with your player name set to "Mike" the Pick... dialogs should not appear. So question is, what will get stuck then :) The other interesting thing to try is, if you can run from commandline (by typing that command, which will make the java command shown): java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar While Colossus runs, eventually happening warnings etc. would be printed to that Command window. But if it's a total "Graphics stuff somehow freezes" (like it sounds, that it does not accept click or key on any of the colors) ... hm. Tricky. Might be no warning/exception, just the graphics thread (EDT, Event Dispatcher Thread, techno babble... ;-) hangs. Let's see so far, how far we get with above. If we get that, I've already some ideas how to proceed. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:15 Message: Not sure if this will help... I found a file called History.java under my recent documents. It's pretty lengthy but it is listed below: package net.sf.colossus.server; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.colossus.common.Constants; import net.sf.colossus.game.Creature; import net.sf.colossus.game.EntrySide; import net.sf.colossus.game.Legion; import net.sf.colossus.game.Player; import net.sf.colossus.game.actions.AddCreatureAction; import net.sf.colossus.game.actions.Recruitment; import net.sf.colossus.util.Glob; import net.sf.colossus.variant.CreatureType; import net.sf.colossus.variant.MasterHex; import org.jdom.Element; /** * Stores game history as XML. * * @author David Ripton */ public class History { private static final Logger LOGGER = Logger.getLogger(History.class .getName()); /** * History: events that happened before last commit point */ private final Element root; /** * History elements/events that happened since the last commit/"snapshot". */ private final List<Element> recentEvents = new LinkedList<Element>(); /** * Set to true during the processing of {@link #fireEventsFromXML(Server)} * to avoid triggering events we just restored again. */ private boolean loading = false; /** * */ private final Element loadedRedoLog; private boolean isRedo = false; /** * Stores the surviving legions (this variable is not needed any more) * * While the history should contain all information to reproduce the game * state, the last set of legions is currently still loaded upfront since * they contain the battle-specific information. This collides with * replaying the game from history... * Now, since 08/2008, they are not stored as "survivorlegions" any more. * Instead, they are backed up internally (done inside PlayerServerSide), * all the history is replayed. This creates proper split prediction data * in all clients. After that, backup data is compared with result of * replay. * E.g. Legion count, their content, players eliminated must be in sync. * Then the replayed ones are discarded and the backedup ones restored * - which have the right legion state (moved, donor, summoned, ...) * * TODO align the history replay more with the original gameplay so we * don't need this anymore; * 08/2008:==> this is now to some part done. Still replay * events could be closer to original events (split, summon, * acquire, teleport, ...) , not just the "result" of that * event (reveal,add,remove effects). * * TODO instead: model the actual events instead of just result, * or at least add relevant info to history elements, so that all * replayed events carry all needed data so that they could also be * processed by event viewer (currently EV does not process anything * during replay). */ public History() { root = new Element("History"); // Dummy: loadedRedoLog = new Element("LoadedRedoLog"); } /** * Constructor used by "LoadGame" */ public History(Element loadGameRoot) { // Get the history elements and store them to "root" root = (Element)loadGameRoot.getChild("History").clone(); // Get the redo log content loadedRedoLog = (Element)loadGameRoot.getChild("Redo").clone(); } /** * All events before last commit */ Element getCopy() { return (Element)root.clone(); } /** * Reached a commit point: append all recent events to the history, * clear list of recent events; caller should do this together with creating * the next snapshot. */ void flushRecentToRoot() { for (Element el : recentEvents) { el.detach(); String name = el.getName(); // TODO later, when this are proper events (not XML elements), // ask rather from the Event whether it belongs copied to // history or not. // TODO At some point in future, put also those Move events // that reveal something to history, and make either the history // replay only send the relevant reveal messages, or make the // Clients during replay (but not redo part) ignore the "move" // and just process the revealing part. // Preferrably the latter, so that proper events show up in the // EventViewer. if (name.equals("Move") || name.equals("UndoMove")) { LOGGER.finest("Flush Redo to History: skipping " + name); } else if (name.equals("Recruit") || name.equals("UndoRecruit")) { // Skipping for now, because there are also the addCreature, // removeCreature and reveal Events still in history. // TODO make the Recruit/UndoRecruit history events during // replay properly, get rid of the "side effect" type of // entries in save game. LOGGER.finest("Flush Redo to History: skipping " + name); } else { root.addContent(el); } } recentEvents.clear(); } /** * @return A Redo Element, containing all events since last commit * i.e. which need to be REDOne on top of last commit point/snapshot */ Element getNewRedoLogElement() { Element redoLogElement = new Element("Redo"); for (Element el : recentEvents) { el.detach(); redoLogElement.addContent(el); } return redoLogElement; } /** * TODO reconsider name * TODO decide if we should move it all into one big handleEvent(GameEvent) method */ void addCreatureEvent(AddCreatureAction event, int turn, String reason) { if (loading) { return; } Element element = new Element("AddCreature"); element.setAttribute("markerId", event.getLegion().getMarkerId()); element.setAttribute("creatureName", event.getAddedCreatureType() .getName()); element.setAttribute("turn", "" + turn); element.setAttribute("reason", reason); recentEvents.add(element); } void removeCreatureEvent(Legion legion, CreatureType creature, int turn, String reason) { if (loading) { return; } Element event = new Element("RemoveCreature"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("creatureName", creature.getName()); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); recentEvents.add(event); } void splitEvent(Legion parent, Legion child, List<CreatureType> splitoffs, int turn) { if (loading) { return; } Element event = new Element("Split"); event.setAttribute("parentId", parent.getMarkerId()); event.setAttribute("childId", child.getMarkerId()); event.setAttribute("turn", "" + turn); Element creatures = new Element("splitoffs"); event.addContent(creatures); for (CreatureType creatureType : splitoffs) { Element cr = new Element("creature"); cr.addContent(creatureType.getName()); creatures.addContent(cr); } recentEvents.add(event); } void mergeEvent(String splitoffId, String survivorId, int turn) { if (loading) { return; } Element event = new Element("Merge"); event.setAttribute("splitoffId", splitoffId); event.setAttribute("survivorId", survivorId); event.setAttribute("turn", "" + turn); recentEvents.add(event); } void revealEvent(boolean allPlayers, List<Player> players, Legion legion, List<CreatureType> creatures, int turn, String reason) { if (loading) { return; } if (creatures.isEmpty()) { // this happens e.g. when in final battle (titan vs. titan) // angel was called out of legion which was then empty, // and in the final updateAllLegionContents there is then // this empty legion... // TODO if this case can happen in a regular game no warning // should be logged LOGGER.log(Level.WARNING, "Called revealEvent(" + allPlayers + ", " + (players != null ? players.toString() : "-null-") + ", " + legion + ", " + creatures.toString() + ", " + turn + ") with empty creatureNames"); return; } Element event = new Element("Reveal"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("allPlayers", "" + allPlayers); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); if (!allPlayers) { Element viewers = new Element("viewers"); event.addContent(viewers); Iterator<Player> it = players.iterator(); while (it.hasNext()) { String playerName = it.next().getName(); Element viewer = new Element("viewer"); viewer.addContent(playerName); viewers.addContent(viewer); } } Element creaturesElem = new Element("creatures"); event.addContent(creaturesElem); for (CreatureType creatureType : creatures) { Element creatureElem = new Element("creature"); creatureElem.addContent(creatureType.getName()); creaturesElem.addContent(creatureElem); } recentEvents.add(event); } void playerElimEvent(Player player, Player slayer, int turn) { if (loading) { return; } Element event = new Element("PlayerElim"); event.setAttribute("name", player.getName()); if (slayer != null) { event.setAttribute("slayer", slayer.getName()); } event.setAttribute("turn", "" + turn); recentEvents.add(event); } void movementRollEvent(Player player, int roll) { if (loading) { return; } Element event = new Element("MovementRoll"); event.setAttribute("playerName", player.getName()); event.setAttribute("roll", "" + roll); recentEvents.add(event); } void legionMoveEvent(Legion legion, MasterHex newHex, EntrySide entrySide, boolean teleport, CreatureType lord) { if (loading) { return; } Element event = new Element("Move"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("newHex", newHex.getLabel()); event.setAttribute("entrySide", entrySide.getLabel()); event.setAttribute("teleport", "" + teleport); String creNameOrTextNull = lord == null ? "null" : lord.getName(); event.setAttribute("revealedLord", creNameOrTextNull); recentEvents.add(event); } void legionUndoMoveEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoMove"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } void recruitEvent(Legion legion, CreatureType recruit, CreatureType recruiter) { if (loading) { return; } Element event = new Element("Recruit"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("recruit", recruit.getName()); event.setAttribute("recruiter", recruiter == null ? "null" : recruiter .getName()); recentEvents.add(event); } void undoRecruitEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoRecruit"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } /** * Fire all events from redoLog. * Elements from RedoLog are processed one by one and the corresponding * method is called on the Server object, pretty much as if a * ClientHandler would call it when receiving such a request from Client. * Note that in some cases overriding the processingCH is necessary * (because technically, this all currently happens while still the * connecting of last joining player is processed, so processingCH is * set to his ClientHandler). * * Note that "loading" is not set to true, so they DO GET ADDED to the * recentEvents list again. * * @param server The server on which to call all the actions to be redone */ void processRedoLog(Server server) { assert loadedRedoLog != null : "Loaded RedoLog should always " + "have a JDOM root element as backing store"; LOGGER.info("History: Start processing redo log"); isRedo = true; for (Object obj : loadedRedoLog.getChildren()) { Element el = (Element)obj; LOGGER.info("processing redo event " + el.getName()); fireEventFromElement(server, el); } isRedo = false; // TODO clear loadedRedoLog? LOGGER.info("Completed processing redo log"); } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventsFromXML(Server server) { this.loading = true; assert root != null : "History should always have a " + " JDOM root element as backing store"; List<Element> kids = root.getChildren(); Iterator<Element> it = kids.iterator(); while (it.hasNext()) { Element el = it.next(); fireEventFromElement(server, el); } this.loading = false; } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventFromElement(Server server, Element el) { GameServerSide game = server.getGame(); String eventName = el.getName(); String reasonPerhaps = el.getAttributeValue("reason"); String reason = (reasonPerhaps != null && !reasonPerhaps .equals("null")) ? reasonPerhaps : "<undefinedReason>"; if (eventName.equals("Reveal") && isRedo && reason.equals(Constants.reasonRecruiter)) { // Skip this because we redo the full recruit event // TODO LOGGER.finest("Skipping Reveal event (reason " + reason + ") during redo."); } else if (eventName.equals("AddCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping AddCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("RemoveCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping RemoveCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("Reveal")) { String allPlayers = el.getAttributeValue("allPlayers"); boolean all = allPlayers != null && allPlayers.equals("true"); String markerId = el.getAttributeValue("markerId"); List<String> playerNames = new ArrayList<String>(); Element viewEl = el.getChild("viewers"); int turn = Integer.parseInt(el.getAttributeValue("turn")); String playerName = null; if (viewEl != null) { List<Element> viewers = viewEl.getChildren(); Iterator<Element> it = viewers.iterator(); while (it.hasNext()) { Element viewer = it.next(); playerName = viewer.getTextNormalize(); playerNames.add(playerName); } } List<Element> creatureElements = el.getChild("creatures") .getChildren(); List<CreatureType> creatures = new ArrayList<CreatureType>(); for (Element creature : creatureElements) { String creatureName = creature.getTextNormalize(); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } Player player = game.getPlayerByMarkerId(markerId); Legion legion; if (turn == 1 && player.getLegionByMarkerId(markerId) == null) { // there is no create event for the startup legions, // so we might need to create them for the reveal event legion = new LegionServerSide(markerId, null, player .getStartingTower(), player.getStartingTower(), player, game, creatures .toArray(new CreatureType[creatures.size()])); player.addLegion(legion); } else { legion = player.getLegionByMarkerId(markerId); } // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; if (((PlayerServerSide)player).getDeadBeforeSave()) { // Skip for players that will be dead by end of replay } else if (all) { server.allRevealCreatures(legion, creatures, reason); } else { server.oneRevealLegion(game.getPlayerByName(playerName), legion, creatures, reason); } } else if (eventName.equals("Split")) { String parentId = el.getAttributeValue("parentId"); String childId = el.getAttributeValue("childId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); List<String> creatureNames = new ArrayList<String>(); List<CreatureType> creatures = new ArrayList<CreatureType>(); List<Element> splitoffs = el.getChild("splitoffs").getChildren(); Iterator<Element> it = splitoffs.iterator(); while (it.hasNext()) { Element creature = it.next(); String creatureName = creature.getTextNormalize(); creatureNames.add(creatureName); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } LegionServerSide parentLegion = game.getLegionByMarkerId(parentId); if (isRedo) { server.overrideProcessingCH(parentLegion.getPlayer()); server.doSplit(parentLegion, childId, creatures); server.overrideProcessingCH(parentLegion.getPlayer()); return; } // LegionServerSide.split(..) doesn't like us here since the parent // legion can't remove creatures (not there?) -- create child directly // instead PlayerServerSide player = parentLegion.getPlayer(); LegionServerSide childLegion; if (player.hasLegion(childId)) { childLegion = game.getLegionByMarkerId(childId); LOGGER.severe("During replay of history: child legion " + childId + " should not " + "exist yet (turn=" + turn + ")!!\n" + "Exists already with: " + Glob.glob(",", childLegion.getCreatureTypes()) + " but " + "should now be created with creatures: " + creatures); childLegion.remove(); } childLegion = new LegionServerSide(childId, null, parentLegion .getCurrentHex(), parentLegion.getCurrentHex(), player, game, creatures.toArray(new CreatureType[creatures.size()])); player.addLegion(childLegion); for (CreatureType creature : creatures) { parentLegion.removeCreature(creature, false, false); } // Skip for players that will be dead by end of replay if (!player.getDeadBeforeSave()) { server.allTellDidSplit(parentLegion, childLegion, turn, false); } } else if (eventName.equals("Merge")) { String splitoffId = el.getAttributeValue("splitoffId"); String survivorId = el.getAttributeValue("survivorId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); LegionServerSide splitoff = game.getLegionByMarkerId(splitoffId); LegionServerSide survivor = game.getLegionByMarkerId(survivorId); // Skip for players that will be dead by end of replay if (!survivor.getPlayer().getDeadBeforeSave()) { server.undidSplit(splitoff, survivor, false, turn); } // Add them back to parent: while (splitoff.getHeight() > 0) { CreatureType type = splitoff.removeCreature(0, false, false); survivor.addCreature(type, false); } splitoff.remove(false, false); } else if (eventName.equals("AddCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Adding creature '" + creatureName + "' to legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType creatureType = game.getVariant().getCreatureByName( creatureName); legion.addCreature(creatureType, false); // Skip for players that will be dead by end of replay if (!legion.getPlayer().getDeadBeforeSave()) { server.allTellAddCreature(new AddCreatureAction(legion, creatureType), false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); } else if (eventName.equals("RemoveCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Removing creature '" + creatureName + "' from legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); if (legion == null) { LOGGER.warning("removeCreature " + creatureName + " from legion " + markerId + ", legion is null"); return; } else { List<? extends Creature> cres = legion.getCreatures(); List<String> crenames = new ArrayList<String>(); for (Creature c : cres) { crenames.add(c.getName()); } } // don't use disbandIfEmpty parameter since that'll fire another history event CreatureType removedCritter = legion.removeCreature(game .getVariant().getCreatureByName(creatureName), false, false); // Skip for players that will be dead by end of replay // Skip if removedCritter is null => removeCreature did not find it, // so there is something wrong with the save game. No use to bother // all the clients with it. if (removedCritter != null && !legion.getPlayer().getDeadBeforeSave()) { server.allTellRemoveCreature(legion, removedCritter, false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); if (legion.getHeight() == 0) { legion.remove(false, false); LOGGER.finer("Legion '" + markerId + "' removed"); } } else if (eventName.equals("PlayerElim")) { String playerName = el.getAttributeValue("name"); String slayerName = el.getAttributeValue("slayer"); Player player = game.getPlayerByName(playerName); Player slayer = game.getPlayerByNameIgnoreNull(slayerName); // Record the slayer and give him this player's legion markers. if (slayer != null) { ((PlayerServerSide)player).handleSlaying(slayer); } player.setDead(true); server.allUpdatePlayerInfo(); server.allTellPlayerElim(player, slayer, false); } else if (eventName.equals("MovementRoll")) { String playerName = el.getAttributeValue("playerName"); Player player = game.getPlayerByName(playerName); int roll = Integer.parseInt(el.getAttributeValue("roll")); ((PlayerServerSide)player).setMovementRoll(roll); game.movementRollEvent(player, roll); server.allTellMovementRoll(roll); } else if (eventName.equals("Move")) { String markerId = el.getAttributeValue("markerId"); String lordName = el.getAttributeValue("revealedLord"); String tele = el.getAttributeValue("teleport"); String newHexLabel = el.getAttributeValue("newHex"); String entrySideName = el.getAttributeValue("entrySide"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType revealedLord = lordName.equals("null") ? null : game .getVariant().getCreatureByName(lordName); MasterHex newHex = server.getGame().getVariant().getMasterBoard() .getHexByLabel(newHexLabel); EntrySide entrySide = EntrySide.fromLabel(entrySideName); boolean teleport = tele != null && tele.equals("true"); LOGGER.finest("Legion Move redo event: \n" + " marker " + markerId + ", lordName " + revealedLord + " teleported " + teleport + " to hex " + newHex.getLabel() + " entrySide " + entrySide.toString()); server.overrideProcessingCH(legion.getPlayer()); server.doMove(legion, newHex, entrySide, teleport, revealedLord); server.restoreProcessingCH(); } else if (eventName.equals("UndoMove")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER.finest("Legion Undo Move redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoMove(legion); server.restoreProcessingCH(); } else if (eventName.equals("Recruit")) { String markerId = el.getAttributeValue("markerId"); String recruitName = el.getAttributeValue("recruit"); String recruiterName = el.getAttributeValue("recruiter"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType recruit = game.getVariant().getCreatureByName( recruitName); CreatureType recruiter = recruiterName.equals("null") ? null : game.getVariant().getCreatureByName(recruiterName); LOGGER.finest("Recruit redo event: \n" + " marker " + markerId + " recruit " + recruit + " recruiter " + recruiter); server.overrideProcessingCH(legion.getPlayer()); server.doRecruit(new Recruitment(legion, recruit, recruiter)); server.restoreProcessingCH(); } else if (eventName.equals("UndoRecruit")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER .finest("UndoRecruit redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoRecruit(legion); server.restoreProcessingCH(); } else { LOGGER.warning("Unknown Redo element " + eventName); } } } ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 17:10 Message: Btw, it says Sun Java ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 16:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 15:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 15:15:26
|
Bugs item #3177305, was opened at 2011-02-10 12:40 Message generated for change (Comment added) made by You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:15 Message: Not sure if this will help... I found a file called History.java under my recent documents. It's pretty lengthy but it is listed below: package net.sf.colossus.server; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.colossus.common.Constants; import net.sf.colossus.game.Creature; import net.sf.colossus.game.EntrySide; import net.sf.colossus.game.Legion; import net.sf.colossus.game.Player; import net.sf.colossus.game.actions.AddCreatureAction; import net.sf.colossus.game.actions.Recruitment; import net.sf.colossus.util.Glob; import net.sf.colossus.variant.CreatureType; import net.sf.colossus.variant.MasterHex; import org.jdom.Element; /** * Stores game history as XML. * * @author David Ripton */ public class History { private static final Logger LOGGER = Logger.getLogger(History.class .getName()); /** * History: events that happened before last commit point */ private final Element root; /** * History elements/events that happened since the last commit/"snapshot". */ private final List<Element> recentEvents = new LinkedList<Element>(); /** * Set to true during the processing of {@link #fireEventsFromXML(Server)} * to avoid triggering events we just restored again. */ private boolean loading = false; /** * */ private final Element loadedRedoLog; private boolean isRedo = false; /** * Stores the surviving legions (this variable is not needed any more) * * While the history should contain all information to reproduce the game * state, the last set of legions is currently still loaded upfront since * they contain the battle-specific information. This collides with * replaying the game from history... * Now, since 08/2008, they are not stored as "survivorlegions" any more. * Instead, they are backed up internally (done inside PlayerServerSide), * all the history is replayed. This creates proper split prediction data * in all clients. After that, backup data is compared with result of * replay. * E.g. Legion count, their content, players eliminated must be in sync. * Then the replayed ones are discarded and the backedup ones restored * - which have the right legion state (moved, donor, summoned, ...) * * TODO align the history replay more with the original gameplay so we * don't need this anymore; * 08/2008:==> this is now to some part done. Still replay * events could be closer to original events (split, summon, * acquire, teleport, ...) , not just the "result" of that * event (reveal,add,remove effects). * * TODO instead: model the actual events instead of just result, * or at least add relevant info to history elements, so that all * replayed events carry all needed data so that they could also be * processed by event viewer (currently EV does not process anything * during replay). */ public History() { root = new Element("History"); // Dummy: loadedRedoLog = new Element("LoadedRedoLog"); } /** * Constructor used by "LoadGame" */ public History(Element loadGameRoot) { // Get the history elements and store them to "root" root = (Element)loadGameRoot.getChild("History").clone(); // Get the redo log content loadedRedoLog = (Element)loadGameRoot.getChild("Redo").clone(); } /** * All events before last commit */ Element getCopy() { return (Element)root.clone(); } /** * Reached a commit point: append all recent events to the history, * clear list of recent events; caller should do this together with creating * the next snapshot. */ void flushRecentToRoot() { for (Element el : recentEvents) { el.detach(); String name = el.getName(); // TODO later, when this are proper events (not XML elements), // ask rather from the Event whether it belongs copied to // history or not. // TODO At some point in future, put also those Move events // that reveal something to history, and make either the history // replay only send the relevant reveal messages, or make the // Clients during replay (but not redo part) ignore the "move" // and just process the revealing part. // Preferrably the latter, so that proper events show up in the // EventViewer. if (name.equals("Move") || name.equals("UndoMove")) { LOGGER.finest("Flush Redo to History: skipping " + name); } else if (name.equals("Recruit") || name.equals("UndoRecruit")) { // Skipping for now, because there are also the addCreature, // removeCreature and reveal Events still in history. // TODO make the Recruit/UndoRecruit history events during // replay properly, get rid of the "side effect" type of // entries in save game. LOGGER.finest("Flush Redo to History: skipping " + name); } else { root.addContent(el); } } recentEvents.clear(); } /** * @return A Redo Element, containing all events since last commit * i.e. which need to be REDOne on top of last commit point/snapshot */ Element getNewRedoLogElement() { Element redoLogElement = new Element("Redo"); for (Element el : recentEvents) { el.detach(); redoLogElement.addContent(el); } return redoLogElement; } /** * TODO reconsider name * TODO decide if we should move it all into one big handleEvent(GameEvent) method */ void addCreatureEvent(AddCreatureAction event, int turn, String reason) { if (loading) { return; } Element element = new Element("AddCreature"); element.setAttribute("markerId", event.getLegion().getMarkerId()); element.setAttribute("creatureName", event.getAddedCreatureType() .getName()); element.setAttribute("turn", "" + turn); element.setAttribute("reason", reason); recentEvents.add(element); } void removeCreatureEvent(Legion legion, CreatureType creature, int turn, String reason) { if (loading) { return; } Element event = new Element("RemoveCreature"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("creatureName", creature.getName()); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); recentEvents.add(event); } void splitEvent(Legion parent, Legion child, List<CreatureType> splitoffs, int turn) { if (loading) { return; } Element event = new Element("Split"); event.setAttribute("parentId", parent.getMarkerId()); event.setAttribute("childId", child.getMarkerId()); event.setAttribute("turn", "" + turn); Element creatures = new Element("splitoffs"); event.addContent(creatures); for (CreatureType creatureType : splitoffs) { Element cr = new Element("creature"); cr.addContent(creatureType.getName()); creatures.addContent(cr); } recentEvents.add(event); } void mergeEvent(String splitoffId, String survivorId, int turn) { if (loading) { return; } Element event = new Element("Merge"); event.setAttribute("splitoffId", splitoffId); event.setAttribute("survivorId", survivorId); event.setAttribute("turn", "" + turn); recentEvents.add(event); } void revealEvent(boolean allPlayers, List<Player> players, Legion legion, List<CreatureType> creatures, int turn, String reason) { if (loading) { return; } if (creatures.isEmpty()) { // this happens e.g. when in final battle (titan vs. titan) // angel was called out of legion which was then empty, // and in the final updateAllLegionContents there is then // this empty legion... // TODO if this case can happen in a regular game no warning // should be logged LOGGER.log(Level.WARNING, "Called revealEvent(" + allPlayers + ", " + (players != null ? players.toString() : "-null-") + ", " + legion + ", " + creatures.toString() + ", " + turn + ") with empty creatureNames"); return; } Element event = new Element("Reveal"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("allPlayers", "" + allPlayers); event.setAttribute("turn", "" + turn); event.setAttribute("reason", reason); if (!allPlayers) { Element viewers = new Element("viewers"); event.addContent(viewers); Iterator<Player> it = players.iterator(); while (it.hasNext()) { String playerName = it.next().getName(); Element viewer = new Element("viewer"); viewer.addContent(playerName); viewers.addContent(viewer); } } Element creaturesElem = new Element("creatures"); event.addContent(creaturesElem); for (CreatureType creatureType : creatures) { Element creatureElem = new Element("creature"); creatureElem.addContent(creatureType.getName()); creaturesElem.addContent(creatureElem); } recentEvents.add(event); } void playerElimEvent(Player player, Player slayer, int turn) { if (loading) { return; } Element event = new Element("PlayerElim"); event.setAttribute("name", player.getName()); if (slayer != null) { event.setAttribute("slayer", slayer.getName()); } event.setAttribute("turn", "" + turn); recentEvents.add(event); } void movementRollEvent(Player player, int roll) { if (loading) { return; } Element event = new Element("MovementRoll"); event.setAttribute("playerName", player.getName()); event.setAttribute("roll", "" + roll); recentEvents.add(event); } void legionMoveEvent(Legion legion, MasterHex newHex, EntrySide entrySide, boolean teleport, CreatureType lord) { if (loading) { return; } Element event = new Element("Move"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("newHex", newHex.getLabel()); event.setAttribute("entrySide", entrySide.getLabel()); event.setAttribute("teleport", "" + teleport); String creNameOrTextNull = lord == null ? "null" : lord.getName(); event.setAttribute("revealedLord", creNameOrTextNull); recentEvents.add(event); } void legionUndoMoveEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoMove"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } void recruitEvent(Legion legion, CreatureType recruit, CreatureType recruiter) { if (loading) { return; } Element event = new Element("Recruit"); event.setAttribute("markerId", legion.getMarkerId()); event.setAttribute("recruit", recruit.getName()); event.setAttribute("recruiter", recruiter == null ? "null" : recruiter .getName()); recentEvents.add(event); } void undoRecruitEvent(Legion legion) { if (loading) { return; } Element event = new Element("UndoRecruit"); event.setAttribute("markerId", legion.getMarkerId()); recentEvents.add(event); } /** * Fire all events from redoLog. * Elements from RedoLog are processed one by one and the corresponding * method is called on the Server object, pretty much as if a * ClientHandler would call it when receiving such a request from Client. * Note that in some cases overriding the processingCH is necessary * (because technically, this all currently happens while still the * connecting of last joining player is processed, so processingCH is * set to his ClientHandler). * * Note that "loading" is not set to true, so they DO GET ADDED to the * recentEvents list again. * * @param server The server on which to call all the actions to be redone */ void processRedoLog(Server server) { assert loadedRedoLog != null : "Loaded RedoLog should always " + "have a JDOM root element as backing store"; LOGGER.info("History: Start processing redo log"); isRedo = true; for (Object obj : loadedRedoLog.getChildren()) { Element el = (Element)obj; LOGGER.info("processing redo event " + el.getName()); fireEventFromElement(server, el); } isRedo = false; // TODO clear loadedRedoLog? LOGGER.info("Completed processing redo log"); } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventsFromXML(Server server) { this.loading = true; assert root != null : "History should always have a " + " JDOM root element as backing store"; List<Element> kids = root.getChildren(); Iterator<Element> it = kids.iterator(); while (it.hasNext()) { Element el = it.next(); fireEventFromElement(server, el); } this.loading = false; } // unchecked conversions from JDOM @SuppressWarnings("unchecked") void fireEventFromElement(Server server, Element el) { GameServerSide game = server.getGame(); String eventName = el.getName(); String reasonPerhaps = el.getAttributeValue("reason"); String reason = (reasonPerhaps != null && !reasonPerhaps .equals("null")) ? reasonPerhaps : "<undefinedReason>"; if (eventName.equals("Reveal") && isRedo && reason.equals(Constants.reasonRecruiter)) { // Skip this because we redo the full recruit event // TODO LOGGER.finest("Skipping Reveal event (reason " + reason + ") during redo."); } else if (eventName.equals("AddCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping AddCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("RemoveCreature") && isRedo && reason.equals(Constants.reasonRecruited)) { // Skip this because we redo the full recruit event LOGGER.finest("Skipping RemoveCreature event (reason " + reason + ") during redo."); } else if (eventName.equals("Reveal")) { String allPlayers = el.getAttributeValue("allPlayers"); boolean all = allPlayers != null && allPlayers.equals("true"); String markerId = el.getAttributeValue("markerId"); List<String> playerNames = new ArrayList<String>(); Element viewEl = el.getChild("viewers"); int turn = Integer.parseInt(el.getAttributeValue("turn")); String playerName = null; if (viewEl != null) { List<Element> viewers = viewEl.getChildren(); Iterator<Element> it = viewers.iterator(); while (it.hasNext()) { Element viewer = it.next(); playerName = viewer.getTextNormalize(); playerNames.add(playerName); } } List<Element> creatureElements = el.getChild("creatures") .getChildren(); List<CreatureType> creatures = new ArrayList<CreatureType>(); for (Element creature : creatureElements) { String creatureName = creature.getTextNormalize(); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } Player player = game.getPlayerByMarkerId(markerId); Legion legion; if (turn == 1 && player.getLegionByMarkerId(markerId) == null) { // there is no create event for the startup legions, // so we might need to create them for the reveal event legion = new LegionServerSide(markerId, null, player .getStartingTower(), player.getStartingTower(), player, game, creatures .toArray(new CreatureType[creatures.size()])); player.addLegion(legion); } else { legion = player.getLegionByMarkerId(markerId); } // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; if (((PlayerServerSide)player).getDeadBeforeSave()) { // Skip for players that will be dead by end of replay } else if (all) { server.allRevealCreatures(legion, creatures, reason); } else { server.oneRevealLegion(game.getPlayerByName(playerName), legion, creatures, reason); } } else if (eventName.equals("Split")) { String parentId = el.getAttributeValue("parentId"); String childId = el.getAttributeValue("childId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); List<String> creatureNames = new ArrayList<String>(); List<CreatureType> creatures = new ArrayList<CreatureType>(); List<Element> splitoffs = el.getChild("splitoffs").getChildren(); Iterator<Element> it = splitoffs.iterator(); while (it.hasNext()) { Element creature = it.next(); String creatureName = creature.getTextNormalize(); creatureNames.add(creatureName); creatures.add(game.getVariant() .getCreatureByName(creatureName)); } LegionServerSide parentLegion = game.getLegionByMarkerId(parentId); if (isRedo) { server.overrideProcessingCH(parentLegion.getPlayer()); server.doSplit(parentLegion, childId, creatures); server.overrideProcessingCH(parentLegion.getPlayer()); return; } // LegionServerSide.split(..) doesn't like us here since the parent // legion can't remove creatures (not there?) -- create child directly // instead PlayerServerSide player = parentLegion.getPlayer(); LegionServerSide childLegion; if (player.hasLegion(childId)) { childLegion = game.getLegionByMarkerId(childId); LOGGER.severe("During replay of history: child legion " + childId + " should not " + "exist yet (turn=" + turn + ")!!\n" + "Exists already with: " + Glob.glob(",", childLegion.getCreatureTypes()) + " but " + "should now be created with creatures: " + creatures); childLegion.remove(); } childLegion = new LegionServerSide(childId, null, parentLegion .getCurrentHex(), parentLegion.getCurrentHex(), player, game, creatures.toArray(new CreatureType[creatures.size()])); player.addLegion(childLegion); for (CreatureType creature : creatures) { parentLegion.removeCreature(creature, false, false); } // Skip for players that will be dead by end of replay if (!player.getDeadBeforeSave()) { server.allTellDidSplit(parentLegion, childLegion, turn, false); } } else if (eventName.equals("Merge")) { String splitoffId = el.getAttributeValue("splitoffId"); String survivorId = el.getAttributeValue("survivorId"); String turnString = el.getAttributeValue("turn"); int turn = Integer.parseInt(turnString); LegionServerSide splitoff = game.getLegionByMarkerId(splitoffId); LegionServerSide survivor = game.getLegionByMarkerId(survivorId); // Skip for players that will be dead by end of replay if (!survivor.getPlayer().getDeadBeforeSave()) { server.undidSplit(splitoff, survivor, false, turn); } // Add them back to parent: while (splitoff.getHeight() > 0) { CreatureType type = splitoff.removeCreature(0, false, false); survivor.addCreature(type, false); } splitoff.remove(false, false); } else if (eventName.equals("AddCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Adding creature '" + creatureName + "' to legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType creatureType = game.getVariant().getCreatureByName( creatureName); legion.addCreature(creatureType, false); // Skip for players that will be dead by end of replay if (!legion.getPlayer().getDeadBeforeSave()) { server.allTellAddCreature(new AddCreatureAction(legion, creatureType), false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); } else if (eventName.equals("RemoveCreature")) { String markerId = el.getAttributeValue("markerId"); String creatureName = el.getAttributeValue("creatureName"); // TODO Now we get the reason from history element - does this // change effect/break anything? // String reason = "<unknown>"; LOGGER.finer("Removing creature '" + creatureName + "' from legion with markerId '" + markerId + "', reason '" + reason + "'"); LegionServerSide legion = game.getLegionByMarkerId(markerId); if (legion == null) { LOGGER.warning("removeCreature " + creatureName + " from legion " + markerId + ", legion is null"); return; } else { List<? extends Creature> cres = legion.getCreatures(); List<String> crenames = new ArrayList<String>(); for (Creature c : cres) { crenames.add(c.getName()); } } // don't use disbandIfEmpty parameter since that'll fire another history event CreatureType removedCritter = legion.removeCreature(game .getVariant().getCreatureByName(creatureName), false, false); // Skip for players that will be dead by end of replay // Skip if removedCritter is null => removeCreature did not find it, // so there is something wrong with the save game. No use to bother // all the clients with it. if (removedCritter != null && !legion.getPlayer().getDeadBeforeSave()) { server.allTellRemoveCreature(legion, removedCritter, false, reason); } LOGGER.finest("Legion '" + markerId + "' now contains " + legion.getCreatures()); if (legion.getHeight() == 0) { legion.remove(false, false); LOGGER.finer("Legion '" + markerId + "' removed"); } } else if (eventName.equals("PlayerElim")) { String playerName = el.getAttributeValue("name"); String slayerName = el.getAttributeValue("slayer"); Player player = game.getPlayerByName(playerName); Player slayer = game.getPlayerByNameIgnoreNull(slayerName); // Record the slayer and give him this player's legion markers. if (slayer != null) { ((PlayerServerSide)player).handleSlaying(slayer); } player.setDead(true); server.allUpdatePlayerInfo(); server.allTellPlayerElim(player, slayer, false); } else if (eventName.equals("MovementRoll")) { String playerName = el.getAttributeValue("playerName"); Player player = game.getPlayerByName(playerName); int roll = Integer.parseInt(el.getAttributeValue("roll")); ((PlayerServerSide)player).setMovementRoll(roll); game.movementRollEvent(player, roll); server.allTellMovementRoll(roll); } else if (eventName.equals("Move")) { String markerId = el.getAttributeValue("markerId"); String lordName = el.getAttributeValue("revealedLord"); String tele = el.getAttributeValue("teleport"); String newHexLabel = el.getAttributeValue("newHex"); String entrySideName = el.getAttributeValue("entrySide"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType revealedLord = lordName.equals("null") ? null : game .getVariant().getCreatureByName(lordName); MasterHex newHex = server.getGame().getVariant().getMasterBoard() .getHexByLabel(newHexLabel); EntrySide entrySide = EntrySide.fromLabel(entrySideName); boolean teleport = tele != null && tele.equals("true"); LOGGER.finest("Legion Move redo event: \n" + " marker " + markerId + ", lordName " + revealedLord + " teleported " + teleport + " to hex " + newHex.getLabel() + " entrySide " + entrySide.toString()); server.overrideProcessingCH(legion.getPlayer()); server.doMove(legion, newHex, entrySide, teleport, revealedLord); server.restoreProcessingCH(); } else if (eventName.equals("UndoMove")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER.finest("Legion Undo Move redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoMove(legion); server.restoreProcessingCH(); } else if (eventName.equals("Recruit")) { String markerId = el.getAttributeValue("markerId"); String recruitName = el.getAttributeValue("recruit"); String recruiterName = el.getAttributeValue("recruiter"); LegionServerSide legion = game.getLegionByMarkerId(markerId); CreatureType recruit = game.getVariant().getCreatureByName( recruitName); CreatureType recruiter = recruiterName.equals("null") ? null : game.getVariant().getCreatureByName(recruiterName); LOGGER.finest("Recruit redo event: \n" + " marker " + markerId + " recruit " + recruit + " recruiter " + recruiter); server.overrideProcessingCH(legion.getPlayer()); server.doRecruit(new Recruitment(legion, recruit, recruiter)); server.restoreProcessingCH(); } else if (eventName.equals("UndoRecruit")) { String markerId = el.getAttributeValue("markerId"); LegionServerSide legion = game.getLegionByMarkerId(markerId); LOGGER .finest("UndoRecruit redo event: \n" + " marker " + markerId); server.overrideProcessingCH(legion.getPlayer()); server.undoRecruit(legion); server.restoreProcessingCH(); } else { LOGGER.warning("Unknown Redo element " + eventName); } } } ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:10 Message: Btw, it says Sun Java ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 13:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 12:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 15:10:06
|
Bugs item #3177305, was opened at 2011-02-10 12:40 Message generated for change (Comment added) made by You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 15:10 Message: Btw, it says Sun Java ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 13:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 12:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 14:20:21
|
Bugs item #3177305, was opened at 2011-02-10 12:40 Message generated for change (Comment added) made by You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:20 Message: Ok, I'll try and answer as best I can... I'm not too sure how to get all of this but here goes: • I am running Windows XP Pro SP3. • When it first starts up it opens a dialog box for Java that says Java 6. • Sorry not sure about how to check the log. :/ • Commandline... is this what you are looking for? -- java -Djava.util.logging.config.file=file=logging.properties -Xmx256M -jar Colossus.jar • The only .cf files I could find are WebServer.cf, WebServer_unix.cf, and WebServer_win.cf. Do you want me to add a line into one of these? Thank you for your assistance. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-10 13:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 12:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 13:53:24
|
Bugs item #3177305, was opened at 2011-02-10 14:40 Message generated for change (Comment added) made by cleka You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- >Comment By: Clemens Katzer (cleka) Date: 2011-02-10 15:53 Message: Hm, yes, some more info is needed. For example, which OS and version (Linux, Win, Mac, ...), Which java (Sun, Openjdk, ...) and which version of it (1.5.x, 1.6.x, ...) do you use? Do you have access to the log / do you know how to configure Java Web Start logging? Or run it from commandline (DOS box, Terminal window, ...) with "start.sh" or "start.bat", than some warnings/errors/exceptions would be written to the commandline window. Sorry I was not able to answer so far, busy day; will try to come back to you today evening or tomorrow or weekend. Otherwise ping me again :) For first aid, you could put "auto pick color" and "marker" into the cf file and see whether anything else works, but I suspect any other GUI dialog might get stuck as well. I provide instruction to do that ASAP. Since I haven't heard of any such case before, I suspect it's rather a specific "OS + java version" problem than generic problem in Colossus, although I of course am interested to make it work whereever. BR, Clemens ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 14:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 12:42:27
|
Bugs item #3177305, was opened at 2011-02-10 12:40 Message generated for change (Comment added) made by You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- Comment By: https://me.yahoo.com/a/62Xw4SUZ () Date: 2011-02-10 12:42 Message: Do you need more information? Be happy to provide it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-10 12:40:15
|
Bugs item #3177305, was opened at 2011-02-10 12:40 Message generated for change (Tracker Item Submitted) made by nobody You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3177305&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-09 23:10:03
|
Bugs item #3176758, was opened at 2011-02-09 15:38 Message generated for change (Comment added) made by rebhuhn You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3176758&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Dave (rebhuhn) Assigned to: Nobody/Anonymous (nobody) Summary: null pointer exception Initial Comment: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at net.sf.colossus.client.SocketClientThread.doMove(SocketClientThread.java:1495) at net.sf.colossus.client.Client.doMove(Client.java:2544) at net.sf.colossus.gui.ClientGUI.doMove(ClientGUI.java:2992) at net.sf.colossus.gui.MasterBoard.actOnHex(MasterBoard.java:2256) at net.sf.colossus.gui.MasterBoard.access$15(MasterBoard.java:2242) at net.sf.colossus.gui.MasterBoard$MasterBoardMouseHandler.mousePressed(MasterBoard.java:2166) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at net.sf.colossus.gui.ClientGUI.doMove(ClientGUI.java:2983) at net.sf.colossus.gui.MasterBoard.actOnHex(MasterBoard.java:2256) at net.sf.colossus.gui.MasterBoard.access$15(MasterBoard.java:2242) at net.sf.colossus.gui.MasterBoard$MasterBoardMouseHandler.mousePressed(MasterBoard.java:2166) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at net.sf.colossus.gui.ClientGUI.doMove(ClientGUI.java:2983) at net.sf.colossus.gui.MasterBoard.actOnHex(MasterBoard.java:2256) at net.sf.colossus.gui.MasterBoard.access$15(MasterBoard.java:2242) at net.sf.colossus.gui.MasterBoard$MasterBoardMouseHandler.mousePressed(MasterBoard.java:2166) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Feb 9, 2011 12:28:09 PM net.sf.colossus.server.LegionServerSide moveToHex ---------------------------------------------------------------------- >Comment By: Dave (rebhuhn) Date: 2011-02-09 18:10 Message: Somehow the first part of the text was deleted. Lastest release (as of Feb 9, 2011), playing DinoTitan, 5 AIs, 1 human. Rolled a 6, split the Titan stack and attempted to do a Titan Teleport. Immediately after clicking on the stack to teleport onto, did a right click to try and look at the stack. Received this null pointer exception. Attempts to move the Titan stack returned the "already moved" error from doMove in ClientGUI. This condition persisted for the rest of the game. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3176758&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-09 21:54:07
|
Bugs item #3176805, was opened at 2011-02-09 21:54 Message generated for change (Tracker Item Submitted) made by nobody You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3176805&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Can not pick color to start game Initial Comment: Recently tried to play this game. I downloaded both the java version and the zip file. Both seem to start up just fine. The board will appear and another small window with choose a color pops up. I can not click on any color. I've tried pressing the letters that correspond to the colors. I've tried alt and ctrl combinations. Nothing works. I have to force the program to quit. Ideas? ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3176805&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-09 20:38:08
|
Bugs item #3176758, was opened at 2011-02-09 15:38 Message generated for change (Tracker Item Submitted) made by rebhuhn You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3176758&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Dave (rebhuhn) Assigned to: Nobody/Anonymous (nobody) Summary: null pointer exception Initial Comment: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at net.sf.colossus.client.SocketClientThread.doMove(SocketClientThread.java:1495) at net.sf.colossus.client.Client.doMove(Client.java:2544) at net.sf.colossus.gui.ClientGUI.doMove(ClientGUI.java:2992) at net.sf.colossus.gui.MasterBoard.actOnHex(MasterBoard.java:2256) at net.sf.colossus.gui.MasterBoard.access$15(MasterBoard.java:2242) at net.sf.colossus.gui.MasterBoard$MasterBoardMouseHandler.mousePressed(MasterBoard.java:2166) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at net.sf.colossus.gui.ClientGUI.doMove(ClientGUI.java:2983) at net.sf.colossus.gui.MasterBoard.actOnHex(MasterBoard.java:2256) at net.sf.colossus.gui.MasterBoard.access$15(MasterBoard.java:2242) at net.sf.colossus.gui.MasterBoard$MasterBoardMouseHandler.mousePressed(MasterBoard.java:2166) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at net.sf.colossus.gui.ClientGUI.doMove(ClientGUI.java:2983) at net.sf.colossus.gui.MasterBoard.actOnHex(MasterBoard.java:2256) at net.sf.colossus.gui.MasterBoard.access$15(MasterBoard.java:2242) at net.sf.colossus.gui.MasterBoard$MasterBoardMouseHandler.mousePressed(MasterBoard.java:2166) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Feb 9, 2011 12:28:09 PM net.sf.colossus.server.LegionServerSide moveToHex ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3176758&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-08 17:19:53
|
Bugs item #2939582, was opened at 2010-01-25 12:50 Message generated for change (Comment added) made by dragonsinth You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=2939582&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. >Category: GUI Group: None Status: Open >Resolution: Fixed Priority: 5 Private: No Submitted By: Scott Blum (dragonsinth) Assigned to: Clemens Katzer (cleka) Summary: Loading saved game locks UI Initial Comment: In both the release and beta versions of Colossus, I cannot successfully load saved games anymore. The game *appears* to lead successfully, and according to the title bar, the game advances to the appropriate turn and player, e.g. "Red Turn 10: Split Stacks". However, at that point the UI locks up, and the Java process continually consumes CPU until externally killed. I have attached an example of a save game I cannot load, but the problem is pervasive for me. ---------------------------------------------------------------------- >Comment By: Scott Blum (dragonsinth) Date: 2011-02-08 12:19 Message: I have not encountered this problem in more recent builds. Thanks! ---------------------------------------------------------------------- Comment By: Scott Blum (dragonsinth) Date: 2011-02-08 12:19 Message: This bug tracker item has been closed, since it is very old and probably not relevant any more. Colossus has been changed so much internally, that the problem situation most likely does not exist any more; but even if it would still exist, it would be hard to fix with the given info, because attached saved games don't work nowadays any more. Should someone again come over this bug situation, now a new bug tracker item should be created with a recent Colossus version. ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2011-02-08 06:34 Message: Does this problem still exist? ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2010-01-25 13:34 Message: I don't see any pics attachments, just the cfg file? ---------------------------------------------------------------------- Comment By: Scott Blum (dragonsinth) Date: 2010-01-25 13:26 Message: Update: there appears to be a race condition when loading up the game from the Game Setup dialog! Here are three interesting facts: 1) One time out of about 20 tries, the game did start successfully. 2) If I start a New Game, then I load the old game from the menu, it starts successfully. 3) In either case, once I'm in a valid "game is running" state, I can successfully load any saved game and have it start with 100% success. It only hangs when loading from the Game Setup screen. ---------------------------------------------------------------------- Comment By: Scott Blum (dragonsinth) Date: 2010-01-25 13:21 Message: There is NO engagement dialog; and the same failure to start occurs even when I go back and load an autosave that occurs at the start of my own turn. I have attached my configuration file, and the windows that come up at start for me are: Main, Game Status, Engagement Status, Log Window. The only stuff I can see in the log window is this: cancelDummy was set... Canceling connection accepting key. Closing server socket Client Black confirmed catch up. Remaining: 4 Client Brown confirmed catch up. Remaining: 3 Client Blue confirmed catch up. Remaining: 2 Client Red confirmed catch up. Remaining: 1 ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2010-01-25 13:09 Message: Ah, and to verify the "loading procedure in general": When it's your turn, e.g. split phase, do one split and save the game under a own choosen name (Save as), like "test". Then try to load that save game test.xml ; Does that work? -Clemens ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2010-01-25 13:04 Message: Ugh. That would be a severe problem. Hoever... it's strange. Same save game file works for me ... ;-/ In fact the game you have there is an autodsave game at the begin of the AI player. So when I load it, immediately the AI starts an engagement, I am offered the "flee" dialog, and if I don't flee, battle starts. Actually, depending on the case (probably AI's roll) the AI attacks either "my" titan legion or first another; the non-Titan legion produces a flee dialog; being titan legion attacked, there is no dialog (shouldn't there be a concede dialog?) Can you verify, when you have loaded, is there any dialog for the flee? Or is there a 2nd icon for the battle board ? Otherwise, can you provide log files / stuff from Java Web Start console? (and/or: in some other game with same user name ("Scott") enable under Window => Log window the log window. Say File -> New Game. Colossus rememebrs which windows are open, so upon next loading the log window should be open from quite early on. Post what is there at the end. If you can't copy-paste there, the Java GUI thread (EDT) is hanging, then we really have a problem :) So tell me what is written there.... Regards, Clemens ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=2939582&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-08 11:34:36
|
Bugs item #2939582, was opened at 2010-01-25 19:50 Message generated for change (Comment added) made by cleka You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=2939582&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: General Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Scott Blum (dragonsinth) Assigned to: Clemens Katzer (cleka) Summary: Loading saved game locks UI Initial Comment: In both the release and beta versions of Colossus, I cannot successfully load saved games anymore. The game *appears* to lead successfully, and according to the title bar, the game advances to the appropriate turn and player, e.g. "Red Turn 10: Split Stacks". However, at that point the UI locks up, and the Java process continually consumes CPU until externally killed. I have attached an example of a save game I cannot load, but the problem is pervasive for me. ---------------------------------------------------------------------- >Comment By: Clemens Katzer (cleka) Date: 2011-02-08 13:34 Message: Does this problem still exist? ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2010-01-25 20:34 Message: I don't see any pics attachments, just the cfg file? ---------------------------------------------------------------------- Comment By: Scott Blum (dragonsinth) Date: 2010-01-25 20:26 Message: Update: there appears to be a race condition when loading up the game from the Game Setup dialog! Here are three interesting facts: 1) One time out of about 20 tries, the game did start successfully. 2) If I start a New Game, then I load the old game from the menu, it starts successfully. 3) In either case, once I'm in a valid "game is running" state, I can successfully load any saved game and have it start with 100% success. It only hangs when loading from the Game Setup screen. ---------------------------------------------------------------------- Comment By: Scott Blum (dragonsinth) Date: 2010-01-25 20:21 Message: There is NO engagement dialog; and the same failure to start occurs even when I go back and load an autosave that occurs at the start of my own turn. I have attached my configuration file, and the windows that come up at start for me are: Main, Game Status, Engagement Status, Log Window. The only stuff I can see in the log window is this: cancelDummy was set... Canceling connection accepting key. Closing server socket Client Black confirmed catch up. Remaining: 4 Client Brown confirmed catch up. Remaining: 3 Client Blue confirmed catch up. Remaining: 2 Client Red confirmed catch up. Remaining: 1 ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2010-01-25 20:09 Message: Ah, and to verify the "loading procedure in general": When it's your turn, e.g. split phase, do one split and save the game under a own choosen name (Save as), like "test". Then try to load that save game test.xml ; Does that work? -Clemens ---------------------------------------------------------------------- Comment By: Clemens Katzer (cleka) Date: 2010-01-25 20:04 Message: Ugh. That would be a severe problem. Hoever... it's strange. Same save game file works for me ... ;-/ In fact the game you have there is an autodsave game at the begin of the AI player. So when I load it, immediately the AI starts an engagement, I am offered the "flee" dialog, and if I don't flee, battle starts. Actually, depending on the case (probably AI's roll) the AI attacks either "my" titan legion or first another; the non-Titan legion produces a flee dialog; being titan legion attacked, there is no dialog (shouldn't there be a concede dialog?) Can you verify, when you have loaded, is there any dialog for the flee? Or is there a 2nd icon for the battle board ? Otherwise, can you provide log files / stuff from Java Web Start console? (and/or: in some other game with same user name ("Scott") enable under Window => Log window the log window. Say File -> New Game. Colossus rememebrs which windows are open, so upon next loading the log window should be open from quite early on. Post what is there at the end. If you can't copy-paste there, the Java GUI thread (EDT) is hanging, then we really have a problem :) So tell me what is written there.... Regards, Clemens ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=2939582&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-07 10:28:46
|
Bugs item #3174900, was opened at 2011-02-07 12:28 Message generated for change (Tracker Item Submitted) made by cleka You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3174900&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: Variant Group: None Status: Open Resolution: None Priority: 3 Private: No Submitted By: Clemens Katzer (cleka) Assigned to: Clemens Katzer (cleka) Summary: Hint and Image files are always loaded locally Initial Comment: There is a problem if the remote client has different data files for Variant hint file and/or image files. For example DinoTitan between 0.12.0-beta1 and current (r4982): Archa(t)opeterix renamed, Spinosaur added. 1) Local (clients) hint file refers to old name Archatopterix. Creature loader attempts to create the nameChit (just the text without image) for this, does not find description from creature data (which it got from server), resulting in (during game start): WARNING: Could not find creature with name Archatopteryx 2) If client needs to draw a creature, it needs to find the image. So e.g. when one opens Caretaker, following two warnings are logged: WARNING: WARNING: creation failed for Archaopteryx WARNING: WARNING: creation failed for Spinosaur All this happens because those types of files are searched via ColossusClassLoader, not via the StaticResourceLoader which uses either local *OR* from-server depending on the situation. For now, I guess in this case the difference is uncritical (just two images not displayed). On the long run, I'd like to have the server to be able to pass a flag "force Remote", and otherwise ( = variant has not changed recently), clients should prefer local loading anyway to reduce network traffic and thus startup delays. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3174900&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-02-07 10:10:54
|
Feature Requests item #3174884, was opened at 2011-02-07 12:10 Message generated for change (Tracker Item Submitted) made by cleka You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=351939&aid=3174884&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Priority: 3 Private: No Submitted By: Clemens Katzer (cleka) Assigned to: Nobody/Anonymous (nobody) Summary: Scaling of long creature names makes them unreadable Initial Comment: Long creature names on chits are scaled so small (so that whole name fits) that they are not readable any more. This happens especially in DinoTitan, because the names are long and the board is big, so one uses a rather "high" scaling value already to make board fit to screen. Solution ideas: 1) Wrap into two lines 2) Limit how small they get scaled, truncating what does not fit / show min 50% of the characters (Winged S" is still better to recognize than Winged Serpent in 3 point font size :o) 3) Add tooltips showing the name (when mouse if over chit) ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=351939&aid=3174884&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-01-27 09:06:16
|
Bugs item #3166198, was opened at 2011-01-26 23:43 Message generated for change (Comment added) made by cleka You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3166198&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None >Priority: 3 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Select Side when battling Initial Comment: When the Battleboard appears for side selection, it appears without scrolIbars. As I play on a low-resolution screen, I need to scroll to use the masterboard and battleboards. I can only select the Right or Left options - never the other, which is off screen. ---------------------------------------------------------------------- >Comment By: Clemens Katzer (cleka) Date: 2011-01-27 11:06 Message: Hm, I see this is inconvenient; are you aware you can work around this? Either scale all Colossus windows smaller (masrerboard might be hard to read then); Or, you can activate the "Bottom" also with the keyboard: Either by pressing "Alt-B" (at least on Windows... not sure about Mac ;-) or press tab key until the button is "activated" (there is some thin dotted line around the word then), and then press the SPACE bar. Since one "can live with it", I consider this rather a feature request, thus somewhere in near future I will move it to feature request tracker, just leave it here for a while that you can read the answer. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3166198&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-01-26 22:16:23
|
Bugs item #3166198, was opened at 2011-01-26 21:43 Message generated for change (Tracker Item Submitted) made by nobody You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3166198&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: GUI Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Clemens Katzer (cleka) Summary: Select Side when battling Initial Comment: When the Battleboard appears for side selection, it appears without scrolIbars. As I play on a low-resolution screen, I need to scroll to use the masterboard and battleboards. I can only select the Right or Left options - never the other, which is off screen. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3166198&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-01-24 20:53:15
|
Bugs item #3164426, was opened at 2011-01-24 00:25 Message generated for change (Comment added) made by cleka You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3164426&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Gardner Trask (gtrasksource) Assigned to: Nobody/Anonymous (nobody) >Summary: Colossus crashes in native EDT code Initial Comment: I had to rebuild my laptop 2 weeks ago. New, updated XP, Java 6, etc. Got the beta release 0.12.0-beta1. Log in, join or start matches, and with no discernable pattern, get completely blown off system. No warnings, no prompts, not even on my "turn" at times. Shut every other app down, no improvement. He is the latest java 6 log. I am not savvy enough to understand it. If this is a singular problem, please do not labor over this. I really enjoy playing, but if it is just me, then I will have to deal with it. ---------------------------------------------------------------------- >Comment By: Clemens Katzer (cleka) Date: 2011-01-24 22:53 Message: Ugh, sounds ugly. So in fact this is a real JVM crash, not just "drop" (as in: connection dropped). But I haven't heard of similar cases, thus I suspect rather it's something unusual with your computer / java installation. Could you try a different java, e.g. a Java 1.5 JRE? (and/or, an earlier Colossus version, e.g. 0.11.0 again or 0.10.4 ? But I expect that would behave same way.) Does it happen also with local games or only on public server? As you see from the hot-spot log (if you looked into it - good that you were able to provide one!), it's something in OS-native code, related to event dispatcher thread. That's the one that acts on mouse and keyboard stuff, and does the redrawing etc. It is even possible that this is caused by unclean graphics programming in Colossus, but I see no way of debugging and fixing it. BR, -Clemens ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3164426&group_id=1939 |
|
From: SourceForge.net <no...@so...> - 2011-01-23 22:25:51
|
Bugs item #3164426, was opened at 2011-01-23 17:25 Message generated for change (Tracker Item Submitted) made by gtrasksource You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3164426&group_id=1939 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Gardner Trask (gtrasksource) Assigned to: Nobody/Anonymous (nobody) Summary: Game keeps dropping Initial Comment: I had to rebuild my laptop 2 weeks ago. New, updated XP, Java 6, etc. Got the beta release 0.12.0-beta1. Log in, join or start matches, and with no discernable pattern, get completely blown off system. No warnings, no prompts, not even on my "turn" at times. Shut every other app down, no improvement. He is the latest java 6 log. I am not savvy enough to understand it. If this is a singular problem, please do not labor over this. I really enjoy playing, but if it is just me, then I will have to deal with it. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101939&aid=3164426&group_id=1939 |