-
@general_zod It doesn't consider conquering a land territory to close a canal in order to block enemy fleets. It does recognize whether canals are open/closed when calculating potential enemy attacks though. Considering canal 'value' is something that is on the list and I'll clarify that a bit.
-
If/when the AI begins valueing canal land territories, it will be a game changer for a map like Iron War. At that time I will have to play that map again and see if balancing or other changes are needed. @Black_Elk I'm glad you have not given up on Iron War and still play it. You might be the best qualified person to define what small changes would be fair after an AI update

-
How accessible (in terms of ease of readability) is the ai code? and how well documented is it?
been playing quite a few ai games lately on various maps; and while fun enough, it'd be nicer if I could make the ai smarter, so I wanted to look under the hood to see if I could tweak some values to tighten up the ai's play.
or are there any particular sub-problems wherein it would be helpful to have more thinking on how to design the algorithms?
(yes I'm in computer science and know how hard ai is) -
@zlefin Well, if you know Java well then it shouldn't be too difficult. I'd say the code is structured fairly well but definitely could use some refactoring in different areas. The first post of this thread lays out the high level flow and structure of the AI. I'd recommend pulling down the code and attempting to improve one specific thing. I'm glad to provide advice/assistance. There are tons of areas that could be improved in the AI including the list of things in the first post of this thread but also performance and even algorithms that are used. Really depends what you want to improve about it and what maps as really each map potentially has different priorities on the biggest weak points of the AI.
-
Thank you for being an active "TripleA" member (long timer), and for your contributions to our map depository. We hope you take advantage of the many new mapmaking features that are coming in our next official stable release. Although you can also use our current pre-releases in your map-making endeavors.
https://github.com/triplea-game/triplea/releases
The "TripleA" platform is currently entering it's new golden age. But we still have a lot of features and improvements on the backlogs. Which can really, even further propel, the quality of our existing games as well as those currently in development. "TripleA" is always in need of more assistance on the development team. Since you have experience with this sort of thing. Maybe consider joining the team and coordinating efforts on a higher level.
But if not, even tinkering on your free time is also very beneficial to "TripleA". You may post anything you find, that can be improved at our GitHub link, where they speak technical jargon. Or post on this forum. Also here is a convenient link to our current public features request page, that are on our backlog.
Best Regards, GZ
https://github.com/triplea-game/triplea/issues
https://forums.triplea-game.org/topic/182/guidelines-and-feature-request-list
-
@redrum
I can read java fine; but I'm quite rusty and haven't actually used dev tools in years. I think i'd like to use something like a debugger mode so I can go step by step and watch the ai perform it's calculations. that tends to be the easiest way to get a feel for how the ai is thinking; and to figure out exactly where to place a change to fix it. I looked through the ai files a bit with just a regular text editor; but it's so much easier when I have the right tools for the job, and a regular text editor isn't much of a specialized tool. any particular programs you recommend?the most common annoyance is the ai leaving itself overly exposed to counterattacks; the ai sent in too many forces to an attack it had a good enough odds at with less. especially on low luck setting wherein it's easier to exploit those. I've been playing balance of power 2 lately; and the ai does that a fair bit. when a battlefield is a back and forth over the turns, this causes the ai to suffer higher attrition over time than I do.
while design is fun, coding is a chore, so mostly I'm looking for thinsg wherein a well-placed change can make a nice improvement without taking too long to write.
-
@zlefin Most of the developers use Eclipse but IntelliJ works as well. Here are the general recommendations for settings up the code base: https://github.com/triplea-game/triplea/tree/master/docs/dev
For observing how the AI is thinking, you can turn on AI logging at different levels by going to the top menu bar in game 'Debug' -> 'Show Hard AI Logs'. Its pretty rough as I'm really the only person that ever looks at it so lots of data and might take a bit of time to understand the context. Using that combined with searching through the code or using a debugger should give you a picture of what's going on.
On the AI using too many units on attack, this is a bit on purpose because ensuring that attacks are successful and leave at least 1 land unit helps minimize the chance that attacks fail and leave unexpected counterattacks open which can be hard to handle.
If you have some save games, I'm glad to help walk through a few scenarios with you so you can understand the decisions the AI is making and whether tweaking things could help. The other thing to realize is currently the AI isn't optimized for any particular maps and runs the exact same algorithms all on maps. Eventually I'd like to provide map makers with AI configuration so it can be more optimized for each map.
-
ok; i'm gonna do some looking over for the results when Russia is set to hard ai for the opening move of Big world 2: balance of power.
The Canhold = X variable in the "Check if we should try to hold attack territories" section is supposed to measure whether the enemy would either be unable to recapture the territory, or it would be unprofitable for the enemy to recapture it, correct?edit: bah; I downloaded the most recent pre-release engine version and now the map is giving errors; i'd wanted to use it in case there's bugs in the ai calcs that were fixed since the regular release. guess I need to revert to a more stable version; I shouldn't have told it to overwrite my installation
which version would be best to revert to? -
@zlefin If you are seeing errors in the latest pre-release then please let me know as we try to keep it stable. I'd rather try to fix any errors you see then revert. But there hasn't been very many AI changes recently so the regular stable should be fine (7621) if you want to test things out.
Yeah, the canHold is used to indicate whether the AI thinks it can hold or would be worth holding a territory it can attack. It uses this to determine whether to move minimal troops and prefer using air if canHold=false and move max attackers in to maximize its TUV trade if canHold=true.
-
@redrum
was responded to before I finished edit(s), so discussion chain gets confused; just skip past this.
edit - rewriting for clarity, one moment; -
@zlefin Ok, I'll take a look. In that case, please try this pre-release as I don't see any NPE when starting BW2 BoP: 1.9.0.0.9687
-
I'm still gettin ga null pointer exception when starting that map with russia set to hard ai in version .9687; maybe the map xmls got corrupted or something; I forget what the issue was that affected the 270bc maps; but something similar here might've caused a problem.
I tried using triplea's remove map to remove Big world 2 then reinstall it; still gettin the nullpointerexception; where should I post the error log from the console? it looks really long; like it's stuck in a loop; I wonder why it's affecting my installation but not yours. bleh.
did a little more checking - i'm gettin the same error (or at least same name for the error) on a lot of different maps; and in both the .9687 and the .9713; I think something musta gotten screwed up with my overall triplea installations.
-
@zlefin I'd recommend clearing your map directory and redownload maps. You can just post the error here for now.
-
@zlefin hey! Cool! I suggested literally years ago that when the AI is officially done that maybe we can make a thread for an "AI tweak challenge" where someone tweaks the AI and challenges us to beat the AI twice (once as Axis and once as Allies etc.) and then we can see who submits the hardest most unbeatable AI!
Ya, I was testing the current AI as it went from easy to currently very tough but the AI has now been at its current state for literally 2 years now so I haven't hadto test it and I have been waiting for "tactical AI" updates until then but I think I'm basically waiting for the official final release to test.
Great posts though and I hope you submit tweaked AI's (I only play the WWII Classic map though) to battle and test to see if they are actually better than the current AI ... just an interesting idea and could lead to years and years of tough, challenging battles to post about in some thread eventually!
-
@redrum
ok; I dug a little more: i'm still getting the error when I use the .9687 installation I have in a separate folder. If I use 7621, the most recent stable, I don't get the error.her'es the error (very long indeed):
TripleA engine version 1.9.0.0.9687
Loading map: big_world_2, from: C:\Users\Tom\triplea\downloadedMaps\big_world_2-master.zip
Loading resources from the following paths: [C:\Users\Tom\triplea\downloadedMaps\big_world_2-master.zip, C:\Program Files\TripleA2\assets]
Loading map: big_world_2, from: C:\Users\Tom\triplea\downloadedMaps\big_world_2-master.zip
Loading resources from the following paths: [C:\Users\Tom\triplea\downloadedMaps\big_world_2-master.zip, C:\Program Files\TripleA2\assets]
Loading map: big_world_2, from: C:\Users\Tom\triplea\downloadedMaps\big_world_2-master.zip
Loading resources from the following paths: [C:\Users\Tom\triplea\downloadedMaps\big_world_2-master.zip, C:\Program Files\TripleA2\assets]
Loading map: big_world_2, from: C:\Users\Tom\triplea\downloadedMaps\big_world_2-master.zip
Loading resources from the following paths: [C:\Users\Tom\triplea\downloadedMaps\big_world_2-master.zip, C:\Program Files\TripleA2\assets]
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Warning: serialization de-serialization error, m_name in DefaultNamed.java is null.
Error: java.lang.NullPointerException
java.lang.NullPointerException
at games.strategy.engine.data.DefaultNamed.equals(DefaultNamed.java:33)
at java.base/java.util.HashMap.putVal(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.ArrayList.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.ArrayList.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.ArrayList.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.ArrayList.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.ArrayList.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.ArrayList.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.ArrayList.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.ArrayList.readObject(Unknown Source)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at java.base/java.util.HashMap.readObject(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at com.google.common.collect.ImmutableListMultimap.readObject(ImmutableListMultimap.java:486)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.base/java.io.ObjectInputStream.defaultReadObject(Unknown Source)
at games.strategy.engine.data.GameData.readObject(GameData.java:122)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
at games.strategy.engine.framework.GameDataManager.loadGame(GameDataManager.java:108)
at games.strategy.io.IoUtils.readFromMemory(IoUtils.java:60)
at games.strategy.engine.framework.GameDataUtils.cloneGameData(GameDataUtils.java:29)
at games.strategy.engine.framework.GameDataUtils.cloneGameData(GameDataUtils.java:19)
at games.strategy.triplea.ui.TripleAFrame.showHistory(TripleAFrame.java:1657)
at games.strategy.triplea.ui.TripleAFrame.updateStep(TripleAFrame.java:1465)
at games.strategy.ui.SwingAction.lambda$invokeAndWait$0(SwingAction.java:86)
at games.strategy.ui.SwingAction.lambda$invokeAndWaitResult$1(SwingAction.java:114)
at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.desktop/java.awt.EventQueue.access$500(Unknown Source)
at java.desktop/java.awt.EventQueue$3.run(Unknown Source)
at java.desktop/java.awt.EventQueue$3.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.run(Unknown Source) -
I'm gonna just test with 7621 for awhile; and see how the ai plays here. I think the .8304 (or whatever it was I previously had had) version had some weird bugs in it anyways; in particular in it I think the enemytuvswing for the check the enemy counterattack to see if it can hold captured territories was generating some very erroneous values (like 2E9; which is obviously absurd), which caused the ai to do some dumb things. but that doesn't seem to be occurring in 7621, and it was consistently doing so in that other version for some of the opening moves. right now I don' tfeel like trying to dig it out again and see if the behavior consistently recurs in that version; especially sinc eit may well relate to since-fixed bugs, and i've had too much drama today.
-
@zlefin That's fine. Looks like the error occurs when you are trying to load a save game. Do you know what version you created that save game with and can you upload the save game here so I can try to reproduce it?
It appears either the save game data is messed up or something has changed in the engine causing it to not be able to load the old save game.
-
@captain-crunch Yah, if an AI thing for tuning the algorithm values per game (not per map) would be eventually made, I think there should be a way to determine what gets accepted, in case anybody wants to submit one for any not actively owned maps (of course, maps with an active owner, the owner decides).
Maybe running AI vs AI somewhat officially monitored battles, in case, like, several people offer an AI configuration for WW2 Classic or whatever (you also have to consider that proposals might be worse than default, so some reasonably quick way to test would be in order, unless restricting the feature to actively owned maps only). -
@redrum
but that error didn' toccur when I was trying to load a save game; it was starting a new game.
I opened that copy of triplea (which is on a separate installation as to not interfere), did select map for another map to make sure it clears it. did select map again to select bigworld2 BOP, set Russia to Hard AI; and click play to start the game. then it generates that error within a second or so. and it still consistently does that if I repeat the process using the 9687 installation.maybe it's a side effect of it being a different installation?
-
were there any known bugs in the ai's calculations in 7621?
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login