Learning from knowledgeable fans

The Master of Orion fan community at RealmsBeyond.net is a wonderful resource for my Java MOO development. There are a devoted group of fans who still play the original Master of Orion (it is the best of the series, after all).

But since Java  MOO  is intended to be a strict feature clone of MOO1, all of the gameplay and testing that they have done for MOO1 directly applies to Java MOO! They have compiled detailed lists of bugs, cheats and exploits in the original game for players to avoid (or use in desperate situations).

This gives me a ready-made list of some esoteric things to make sure are working before releasing Java MOO into the wild.

Below is my working list, much of it cribbed from the RealmsBeyond forums. The red text describes my planned solution for the particular issue.

My nomenclature:
BUG – behavior in the original game that is clearly not within the original developer intent.
CHEAT – features that the player can use that the AI cannot or will not use, creating an imbalanced playing field.
EXPLOIT – behaviors that the AI is not smart enough to deal with, but that the player easily ignores when the AI does it.

BUG: Stargate Redirect
Sending a fleet through a stargate and then redirecting it to an enemy planet will allow the fleet to arrive instantly at the enemy planet.
Java MOO: Redirecting a fleet will always calculate the proper flight time.

BUG: Invading Spored Planets
When a planet has been spored out the factories are left intact. Once such a green spud has been recolonized, anyone can invade it and lift away the new owners tech, proportional to the factory count, irregardless of the fact that the planet only has 2 pop and you didn’t have to fight *anything* to make the invasion happen and nor did the new owner (necessarily) invest anything into it…
Java MOO: Original ownership of factories are tracked until converted, so recaptures of colonies will not grant techs according to factory ownership rather than colony

BUG: Bioweapons  During Combat:
When a world is spored out *during combat* rather than from the main screen the colony will die post-battle and you (the player) will escape diplomatic ramifications, both from using spores and destroying the world. Should an AI be defeated by these means the game will report that they commited autogenocide and again you escape the diplomatic ramifications of genocide.
Java MOO: Use of bioweapons during ship combat will trigger all appropriate diplomatic penalties

BUG: Infinitely Recharging Specials:
Special equipment like Warp Dissipators, Ion Stream Projectors, and Automated Repair recharge themselves every time the ship has an opportunity to move in the official release of the game. By using the “Wait” button, you can hit enemy ships an infinite number of times with special weapons, repair any and all damage to your ship, or both.
Java MOO: Used specials will not recharge and automated repair specials will only activate at the end of the combat turn

CHEAT: Galactic Council Swing Vote
While the AI votes in order of population, players always get to vote last, allowing them an opportunity to tactically use their vote with little risk.
Java MOO: All empires, including the player, will cast their votes in order of population, greatest to least.

CHEAT: Empty Threats
The player has the option to threaten the AI with attack. This has the effect of causing any fleets currently inbound to player worlds to instantly retreat, and sometimes results in the gift of an obsolete tech. This tactic is usually used when the AI has a fleet inbound to a world that the player cannot adequately defend. Some feel that this tactic is exploitive as the AI often backs down from such threats, even if they have a clear power and/or military advantage. Also can be used to brow-beat a cowardly AI with repeated use for multiple techs without much penalty.
Java MOO: The force of any empire’s threat is valued by the power differential of military fleets. Weak fleets = ignored threats. In addition, repeated threats lose power.

CHEAT: Canceling Retreats
Whenever the AI retreats from a planet, the fleet is always re-directed to its closest owned planet. The player, however, has the option to re-direct the fleet anywhere on the map, including staying in the system. This can give a huge advantage to missile/bomber ships, allowing them to wittle down fleets and bases with very little loss that they would not otherwise be able to defeat.
Java MOO: Retreating ships can no longer be redirected back to the system.

CHEAT: Hyperspace Communications
This technology allows the players to redirect fleets while in transit. The AI, however, does not use this capability even though it will research or trade for the technology.
Java MOO: The AI will use Hyperspace Communications to redirect fleets as needed.

CHEAT: Dodging missiles with the ‘Wait’ Button
Some people feel that the use of the wait button in and of itself falls into the exploit category because the AI does not have this capability. This allows, among other things, for fast bombers to out-run slow missiles, “training” the AI to attack decoy ships, etc.
Java MOO: All missiles move at the end of each round.

EXPLOIT: Guarding uncolonized planets with scouts
It is possible to prevent the AI from  scouting planets by ‘guarding’ them with unarmed scout ships. This greatly slows down the early AI expansion.
Java MOO: Ship combat will not trigger if there are no armed ships in a system, so scout ships cannot prevent other scout ships from  arriving in a system.

EXPLOIT: Instant fleet construction
It is possible to queue up production in a large ship, and then switch to a new design of smaller ships and immediately build an entire fleet of ships in a single turn.
Java MOO: Switching ship construction moves all accumulated production to the colony reserve, which can only be used to speed production (up to double) on subsequent colony projects.

EXPLOIT: Funneling reserve through ultra-rich planets
Because ultra-rich planets triple production, players can funnel reserve from UR planets (at 150%) and then back into the same planets to greatly increase production.
Java MOO: Reserve funds sent to planets will not gain any further planetary bonuses or penalties.

EXPLOIT: “Spectator Wars”:
It is not difficult to convince an AI to declare war on another, sometimes even an ally, allowing you to starts without getting involved yourself.
Java MOO: Asking an AI to declare war will, if accepted, cause the player to declare war automatically .

EXPLOIT: Bribing:
The AI in Moo can be pursuaded to do just about anything with enough bribes of BC or outdated tech. Can be considered an exploit if used to excess.
Java MOO: The value of BC bribes is proportional to the bribed empire’s economy, and will scale proportionally to the square root (i.e. 4xbribe = 2xeffective). In addition, only one bribe per turn is allowed.

EXPLOIT: Trading Worthless Techs:
The AI will place irrationally high values on some techs that it cannot use, or are out-dated. The best example is the Silicoids, who will trade dearly for Soil and Advanced Soil Enrichment, but can never use it. Similarly, everybody else will trade high for Soil even if they already have Advanced Soil.
Java MOO: the AI will not value obsolete or unuseable techs. Others are valued based on marginal improvement (i.e  Terraforming +80 will be more valuable if the AI has only +20 instead of, say, +60).

EXPLOIT: “The Yo-Yo Trick”:
The AI is hard coded to try and avoid any missile on the tactical screen it can outrun, even if the damage taken from a hit would be minimal. This allows the player to “pin” enemy ships in the back rows of the tactical grid by firing slow missiles at ships as they approach, wait for them to retreat out of range, and repeat as they close again. In the mean time, the fleet is taking damage from planetary missile bases, since those rounds do not have a maximum range. This often results in the player being able to defeat a clearly superior attack fleet with an obsolete missile boat stack and a few missile bases.
Java MOO: AI will properly assess threat of various enemy stacks and will act accordingly.

EXPLOIT: Baiting:
The AI will try to attack any ship it feels it can beat on the tactical sceen, even if that will result in significant damage/desctruction of the attacking fleet with respect to the value of the target. Probably the best example is using unarmed scout ships over planets with missile bases to destroy enemy ships.
Java MOO: AI will properly assess threat of various enemy stacks and will act accordingly.

6 thoughts on “Learning from knowledgeable fans”

  1. While I agree with most of these and the solutions listed, there are some which I feel are incorrectly addressed.

    First: Bribing.

    I don’t think restricting the bribe to once per turn is correct. Maybe a better solution is to have the strength of each bribe after the first reduced by some growing percentage instead? Something like:

    bribeEffectiveness = sqrt(bribeValue) * bribeReductionPercentage.

    This would also allow you to add additional penalties to the bribeReductionPercentage earlier in the calculation for such things as the AI mistrusting the briber.

    “Spectator Wars”:

    Creating these kind of proxy wars isn’t, I think, an exploit at all. It’s very important to the diplomatic course of the game. After all, the AI will tend to do something similar to the player; ask them to engage in a war and then immediately make peace.

    What should be done instead is to allow the AI to utilize and recognize a Spectator War. If a player (or other AI empire) hasn’t supported an AI in a war (either through directly declaring or through tech and money), then the AI should note that. You can have them complain about the other empire’s inactivity as well. Creating a “history list” of events like this will give the AI an idea if an empire can be trusted to engage and support a war they ask the AI to start and that, in turn, can be used in the calculation if they accept. An empire with a history of starting proxy wars and not doing anything is unlikely to make good with a declaration of war itself, after all.

    If you really wanted to get fancy with it, you could have the AI search through this database of past diplomatic history and use it as phrasing for the diplomacy screen. “Remember when we fought against the Alkari at your behest and you did nothing? If you wish to make up for this dishonorable display, I suggest you pay 1500 BC.” Stuff like that.


  2. The problem with bribing is that it is exploitable by spamming. You could add diminishing returns or just eliminate the ability to spam. Diminishing returns will encourage hardcore players to simply min/max by bribing once/turn anyway, so I’m not sure it’s worth the additional complexity.

    With spectators wars, it definitely is an exploit when you can convince an AI to declare war on his ALLY while you suffer no diplomatic repercussions. That doesn’t really make any sense and it’s hard to imagine that was an intended feature. Spectator wars are still very possible with framing, which is key strategy when playing the Darloks.

    Java MOO does have a system in place to track the history of incidents between empires, so more complexity can be added to it as needed. However, your suggestion kind of gives the player one “free double-cross” every game since he would always start each one with a clean slate. That’s an advantage unavailable to the AI, which is a concern.


  3. Fair point on the bribing. If it’s not worth the additional complexity in your estimation, that’s fine. The limitation does feel a bit game-y and artificial, though.

    As for the second point, I agree that getting an ally to suddenly declare war doesn’t make much sense (unless the alliance is one of convenience, and/or the AI is particularly backstabbing), but I think you’re oversimplifying the secondary aspect.

    How much the AI trusts an empire to pony up for a war would only be an aspect of the calculation if they accept, not the totality. If there is no data, then it just doesn’t influence the calculation either positively or negatively. If an empire has a history of being a sneaky git, then that would negatively affect the decision. If an empire has a history of being a staunch ally, that would positively affect it. Obviously, you’d want other things in that calculation such as the comparative strengths of the belligerent empires, what the askee had to gain, how warlike they are usually, if they were already considering attacking someone, what their current relations are with the asker, etc. Basically, all the calculations that go into deciding to go to war normally would happen.

    In fact, the first time an empire asked another to go to war might prove more difficult than if there was a history (even if it was a bad history), since that tends to be a mid-game tactic where the empires are fairly even in power and there is still a good deal of expansion territory.

    Spying to cause this kind of trouble is definitely good and useful for Darlock and Psilons, but more diplomatic species do their underhanded work out in the open. Besides which, it can very difficult to plan for a lucky spy roll that will allow one to frame who you want or need. Framing using spies is mostly an unexpected opportunity, rather than a reliable strategy. The diplomatic game which is something that can be planned for and integrated into one’s grand gameplay.

    The final point is one I don’t quite get. Surely in a new game, all the AI empires would be in the same boat as the human player, with there being no history between anyone?


    1. ok, but then if you are asking your ALLY to declare war on another race, then what is stopping him from invoking your alliance to join him in the war? If you agree, then there is no difference. And if you refuse, doesn’t that break the alliance?

      So, let’s recap. There seem to be 3 ways to get one race to attack another:
      A) Use espionage to inflame tensions between the two races behind the scenes
      B) Form an alliance with one race and then invoke the alliance for a joint war (which you may contribute to only minimally)
      C) Use Diplomacy to…. ?

      To me, options B & C are the same thing. You use diplomacy to create alliances to get someone else to do the dirty work. I’m not sure how else you could convince someone else diplomatically to wage war without some assurance of assistance.

      However, a true diplomat would get his ally, Race B, to declare war against Race C (while getting himself dragged into it), but then quickly find a way to diplomatically create peace between him and Race C and extract himself out of the war. That seems like the diplomatic way to create the same situation.


      1. While the ally thing could work, it would necessitate the removal of the Oath Breaker Penalty and immediate termination of the alliance to be truly functionally equivalent. And if that’s the case, then there’s not much point to the alliance, really.

        Perhaps an actual use case might help. In one of my personal favorite games of MOO, a situation arose where it was my empire against the Silicoids as the largest empires on the map. There were several smaller ones. Neither I nor the Silicoids wanted to wage war on each other, but we each had our blocks of smaller empires which were aligned, but not allied with us. Instead, I (and maybe the Silicoids; I honestly don’t know if the original game’s AI was able to ask unallied empires to go to war with a third party) used the smaller empires as proxy fighters against each other, hoping to strengthen our respective voting blocks for the council vote.

        If only alliances allowed for this kind of diplomatic posturing, then the cold war situation between the Silicoids and I would’ve either turned hot or turned those allied voting blocks against us when they inevitably asked to join their war and we refused.

        The other major use case would be using a race with diplomacy advantages like the humans to set other empires against one another while they keep out of it and continue business as usual with the warred-against empire. Declaring war ruins all the current diplomatic status and trade agreements, after all. The alliance requirement would render that tactic useless.


      2. You’ve given me some definite food for thought here. There are clearly several different scenarios that may need to be handled differently. The exploitable problem in MOO1 is that it’s too easy to convince an empire to wage war on another, even against their own ally.

        I’ll give this some more thought and try to come up with a more nuanced solution. Thanks a ton for your input!


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s