Airships: Conquer the Skies - Zarkonnen
Special eras are one of the features that I introduced in the co-op and conquest update in August. These work by temporarily changing the rules of the game, and may also have a victory condition, where an empire can be rewarded for ending the era early.

Like pretty much everything in the game, these are data-driven, so you can add new ones by modding. Here's how.

(This post assumes that you know how Airships mods work. If you want an introduction to basic modding, check out this article first.)

Play in Airships progresses through a series of eras, which slowly change the game balance, decreasing the unrest from empire size, and increasing base research and the number of spies available. Each era has a chance to be a randomly chosen special era, which accumulates over time, so that while not every era is special, you will definitely get some special ones. You can see this information in StrategicEras in the game data. Of course, you can also mod this, changing the tempo and balance of the overall game if you wish.

Special eras are stored as EraModifiers in the game data. There is also always a bonus of the exact same name, which is active while the era is active. (So whenever you create a new EraModifier, create a Bonus with the same name.)

It's probably a good idea to open eraModifiers.json with your text editor so you can see concrete examples of what this article is about.

You can also download and read the example mod that adds one new EraModifier.

Here's a very simple EraModifier, Age of Plenty:

{ "name": "AGE_OF_PLENTY", "pattern": 12, "eraIcon": { "src": "ui", "x": 80, "y": 384 }, "eraImg": { "src": "bountiful.jpg" } },

So apart from the name, we want a 16x16 icon for the era, a 400x300 image for the announcement dialog, and a background pattern for the dialog. (The patterns are numbered 0-24 and can be found in data/images/patterns.png. You can also leave out this value, but it's prettier if you have a suitable pattern!)

There are also three strings in en.properties associated with this modifier:

bonus_AGE_OF_PLENTY=Age of Plenty age_desc_AGE_OF_PLENTY=An age of bountiful harvests. age_fx_AGE_OF_PLENTY=+15% income\nDouble fleet resupply speed

So that's the name of the era, a prose description of what's happening, and a list of gameplay effects. (\n is a new line character.)

But how does this actually do anything? By being a bonus! As you may know, bonuses can have all kinds of gameplay effects in the game. For example, the AGE_OF_PLENTY bonus is used in the EmpireStat value for city income:

{ "name": "CITY_INCOME_PERCENTAGE_BONUS", "value": { "base": 0, "deltas": { "EXTRA_INCOME": 15, "AGE_OF_PLENTY": 15, "LONG_WINTER": -15, "LONG_SUMMER": -10, "AGE_OF_STORMS": -10, "GREATER_CULT": 15, "AUTARKY": 5, "TEA": 5 } } },

There's a lot of EmpireStats that bonuses can modify - here's a full list. They can also unlock city upgrades, modules, and armour and change their stats.

Here's some examples of what an EraModifier could do via bonuses:

  • Decrease the reputation required to start coronation to 70.
  • Double the local defence budget of cities.
  • Eliminate the reputation cost of breaking truces.
  • Make fires nigh on impossible to put out.
  • Double the unrest of cities not connected to the capital.
  • Unlock a new city upgrade that can only be built during the era.
  • Make Suspendium Chambers produce double lift.
  • Allow everyone to train dragon riders.
  • Unlock a new part of the tech tree.

(Note that unfortunately, two mods that replace the same EmpireStat will conflict with each other, so you have to be a bit careful with that.)

So that's the basics for EraModifiers. But they can also do a lot more, creating what are basically time-limited events for empires to participate in.

Spawning City Upgrades

You can spawn city upgrades at the start of an era, using the following fields:

  • eraStartSpawnUpgrade - The CityUpgradeType to spawn.
  • eraStartSpawnNumUpgrades - How many to spawn. The game will try to distribute them evenly.
  • doNotSpawnUpgradeInEmpiresWithBonus - Empires with this bonus won't get any of the upgrades in their towns or cities.

By default, those upgrades will survive the end of the era, but you can also use an era reward (see below) to remove them.

Spawning a Monster Nest

Using eraStartSpawnNest, you can spawn a single monster nest at the start of the era, which can be used to create a "boss monster", such as the pirate king in the age of piracy.

Expeditions

Expeditions let empires send a group of ships to investigate stuff, gaining a random reward upon return.

To enable expeditions, provide a list of rewards in the field "expeditions". The field is also bonusable, so you can provide different sets of rewards depending on what kind of empire sends the expedition.

To give the player an idea of how large a group of ships they should send to get a good outcome, use the fields expeditionLowRewardsBoundary, expeditionMediumRewardsBoundary, expeditionHighRewardsBoundary, and expeditionVeryHighRewardsBoundary.

So for example, if the total value of the ships sent is between expeditionMediumRewardsBoundary and expeditionHighRewardsBoundary, the tooltip will state "Expedition Potential: Medium".

Rewards

Rewards are used both for expedition outcomes and for what happens when an era ending is triggered. They are the same data structure that is used for monster nests. They should have a name, a title, and an image. And they can also have the following fields:

  • money - Money gained.
  • rep - Reputation gained.
  • research - Research points gained. These are applied to the current research, if one is active. Otherwise they are applied to the next research topic chosen.
  • bonus - A bonus to permanently grant.
  • tech - A technology to grant.
  • supplies - Supplies to give to the fleet that unlocked this reward. (Only meaningful for monster nest rewards.)
  • specialConstructionName - Name of a ship or landship to give to the fleet that unlocked this reward. These should be placed in a bonusConstructions folder in the mod. (Only meaningful for monster nest and expedition rewards.)
  • numSpecialConstructions - Number of special constructions to grant, 1 by default.
  • startEraModifier - Start a new EraModifier.
  • endsEraModifier - If this is the current era modifier, end it.
  • destroyAllUpgrades - Destroy all City Upgrades of this name.

There are also some fields that control which reward is picked from a list of possibilities for monster nest and expedition rewards. Note that the game never picks rewards that have no effect, such as ones that grant a bonus that an empire already has. Try to have a fall-back reward that is always valid.

  • spawnWeight - Relative chance that this reward is chosen.
  • onceOnly - This reward can only be given once.
  • requires - Require this bonus.
  • requireResearch - Research must be possible. So if the tech speed is set to No Research, this reward won't be picked.
  • requireMonsters - The game must have monsters, so monster nest density must not be set to None.
  • requireToggle - Require that a specific game feature is toggled on. The names of the available toggles as of this writing are: REPUTATION, DIPLOMACY, CORONATION, ALLIANCE_VICTORY, SUPPLY, and AUTORESOLVE.
  • minWinningFleetCost - Only used for expedition rewards. The expedition fleet must have at least this total cost.
  • maxWinningFleetCost - Only used for expedition rewards. The expedition fleet must have at most this total cost.

Using minWinningFleetCost and maxWinningFleetCost you can make it that larger fleets give better rewards.

Since rewards can both grant and require bonuses, you can use this to tell stories that unfold over multiple expeditions. See AGE_OF_MONSTERS for an example.

Bonusable Descriptions and Effects

Normally, the era modifier description and effects are the strings age_desc_X and age_fx_X, but if you want empires with specific bonuses to have different text, you can use the bonusable values "desc" and "effectsDesc" to specify strings. For example, empires with the REVOLUTION bonus get a different text and info for the Age of Unrest:

"desc": { "base": "age_desc_AGE_OF_UNREST", "REVOLUTION": "age_desc_AGE_OF_UNREST_revolution" }, "effectsDesc": { "base": "age_fx_AGE_OF_UNREST", "REVOLUTION": "age_fx_AGE_OF_UNREST_revolution" }

End Conditions

Last but not least, EraModifiers can have end conditions. When they are met, the era ends. Empires then receive rewards (or punishments) based on who triggered the end condition.

Here are the fields for the possible end conditions:


  • eraEndsWhenControllingUpgrades - When set to true, the era ends when the upgrades spawned at the start are all controlled by one empire.
  • eraEndsWhenClearingNest - When set to true, the era ends when the nest spawned at the start are is defeated by an empire.
  • eraEndsWhenUpgradesBuilt - A CityUpgradeType. The era ends when enough of them have been built, with the empire that built the most being the one that triggers the era end.
  • eraEndsWhenProportionHasUpgrade - Used to determine how many upgrades need to be built to end the era. The number of upgrades is the number of cities x eraEndsWhenProportionHasUpgrade. (This applies even if the upgrades are town upgrades.)
  • eraEndsWhenResearched - A technology. The first empire to research it is the era ender.


End Rewards

When an era end condition is triggered, empires receive a reward based on whether they were the one to trigger the end condition, their bonuses, and the bonuses of the empire that triggered the end condition.

A concrete example: Age of Piety spawns three Holy Sites at the start. Once an empire controls all three holy sites, the era ends, but what exactly happens depends on the empire. A normal empire gains 20 reputation. But if it's Cultists, they instead gain the Greater Cult bonus, a massive permanent increase to income and industry, and the holy sites are destroyed:

"eraEnderReward": { "base": { "name": "pietyVictory", "title": "pietyVictoryT", "rep": 20, "img": { "src": "temple" }, "endsEraModifier": "AGE_OF_PIETY" }, "WORM_EYE_CULT": { "name": "pietyVictoryCult", "title": "pietyVictoryCultT", "bonus": "GREATER_CULT", "destroyAllUpgrades": "holySite", "img": { "src": "cultists", "x": 0, "y": 0, "w": 400, "h": 300 }, "endsEraModifier": "AGE_OF_PIETY" } },

For the other empires that didn't manage to control the holy sites, there are four distinct outcomes based on whether they are cultists and whether the winner is a cultist:

"eraNonEnderReward": { "base": { "base": { "name": "pietyOtherVictory", "title": "pietyOtherVictoryT", "rep": -5, "img": { "src": "temple" }, "endsEraModifier": "AGE_OF_PIETY" }, "WORM_EYE_CULT": { "name": "pietyOtherVictoryOtherCult", "title": "pietyOtherVictoryOtherCultT", "rep": -5, "destroyAllUpgrades": "holySite", "img": { "src": "cultists", "x": 0, "y": 0, "w": 400, "h": 300 }, "endsEraModifier": "AGE_OF_PIETY" } }, "WORM_EYE_CULT": { "base": { "name": "pietyOtherVictoryCult", "title": "pietyOtherVictoryCultT", "rep": -20, "img": { "src": "temple" }, "endsEraModifier": "AGE_OF_PIETY" }, "WORM_EYE_CULT": { "name": "pietyOtherVictoryBothCult", "title": "pietyOtherVictoryBothCultT", "destroyAllUpgrades": "holySite", "img": { "src": "cultists", "x": 0, "y": 0, "w": 400, "h": 300 }, "endsEraModifier": "AGE_OF_PIETY" } } }

Note that eraNonEnderReward is a nested bonusable value. The first level is determined by the bonuses of the empire the reward applies to, and the second by the bonuses of the empire that ended the era.

Testing

Once you've added a new EraModifier, you can test it using the "Start Age" cheat option. Note that the game needs to be unpaused for the age to actually start. (And yes, all the cheats in the game started out as tools for testing the game.)

Conclusion and Example Mod

Putting this all together, you can create special game eras that provide variety to gameplay by changing the way the game works and giving the player interim goals. As an example of this, here's a mod that adds an Age of Schism, during which the Trilunar Church breaks into three competing sects you can try to reunite - or destroy, if you're cultists.

As always, if you have any questions about this post, feel free to comment below, and if you need help with modding, hop on the Discord and ask!
Oct 16, 2022
Airships: Conquer the Skies - Zarkonnen
Fixed land anemone text, updated German and Chinese translations.
Airships: Conquer the Skies - Zarkonnen
  • Added giant land anemone monster nests.
  • Ships withdrawing from a raid can now limp to the nearest safe port.
  • The game now checks whether you need to declare war when you intercept a fleet.
  • Halved speed at which the plague spreads.
  • Fixed post-combat ship stats in conquest.
  • Fixed waspkiller marine graphics.
  • The AI should no longer assume that human players want to break beneficial trade treaties.
  • There is now always a reward for defeating moon disks.
  • Insults are now properly hidden when the option to hide them is selected.
  • Fixes to French and German translations.
  • New cheat option: constant monster nest raids.
You might wonder why you'd want an option to make monster nests constantly attack you. The reason is that all the cheat options in the game are also tools I use for testing the game. And sometimes I need to test something involving a monster nest attack.
Sep 18, 2022
Airships: Conquer the Skies - Zarkonnen
Fixed bug where AI would apply -200 evaluation to offers for city transfers.
Airships: Conquer the Skies - Zarkonnen
The game is set a little over a decade after the collapse of the old empire. The city-states that once comprised it are now fighting for supremacy, to recreate the empire under their control, or to create some new social order altogether.

What eventually became the empire started out as a confederation of city-states that shared a language, culture, and religion. They wanted a way to resolve conflicts without resorting to constant low-level warfare. So they created a legal framework for resolving these disputes and elected a chief judge to rule on cases. When the old judge died, they would each send one elector to a conclave, and the electors would discuss the merits of possible candidates and choose a new judge.

Cities each had their own method of choosing their elector. In some cases, they were an envoy sent by the city's ruler. In others, electorship was hereditary and separate, or decided upon by a council. Some cities even experimented with popular election. The ideal elector was a wise, sensible legal mind who would rationally choose the best option in the conclave. But right from the start, electors usually represented the interests of the cities they were sent by, or their own interests entirely.

As time went on, more city-states were added to this confederation, some forcibly, some voluntarily. Most of those newer members did not have the right to send electors, but a few powerful ones did.

Less than a century later, a series of military crises meant that the cities needed to have an unified response. They made the chief judge - a fierce woman called Mathilda, later Mathilda the First - into the chief general of their armies, and eventually agreed to give her the power to levy their armies at will to fight common threats.

From then on, the power of this judge-emperor increased. They were able to issue legal rulings that affected the laws within the city-states, not just between them. And they would appoint an increasing number of important and lucrative positions in a growing bureaucracy, such as the harbourmasters of the great ports.

Influence with the emperor became ever more useful and lucrative, and so the process of election became increasingly corrupt, with electors receiving exorbitant bribes and threats to support specific candidates. As each successive emperor used their power to favour their particular faction, the prestige of the institution decreased.

Corruption and favouritism evolved into infighting, assassinations, and eventually outright civil war, as multiple power blocs elected their own emperors and fought for power.

Finally, Konrad II ascended to the throne and managed to stabilise and reform the empire. He granted each member city its own elector and introduced a rule that an emperor could only be chosen by a quorum of a supermajority of electors. He also partly succeeded in reforming imperial law and administration.



And indeed, upon his death, the electors came together and peacefully voted for a successor - all but two of them, electors for two of the founding cities, who refused to attend.

For a while, this new order held and produced peace and prosperity, but over time, the administration began to decay again. Electors again started taking bribes, the quality of emperors declined, and a new problem became apparent: cities could now threaten to withold their electors, making it impossible for a new emperor to be elected. Months and sometimes even years would pass with no successor enthroned.

When elections did happen, the emperors were weak and often elderly, ruling only for a short while. Cities resorted to mutual treaties and the occasional skirmish to resolve their differences, as appealing to the justice of the emperor was no longer practical.

By this time, imperial electors had become deeply hated by the common people, emblematic of the misrule of the empire. The monstrously venal and corrupt elector became a stock character in pamphlets and plays. Some of them were attacked by mobs or forced to resign from their positions by threat of violence.

The development of powered suspendium and modern airships changed things once more. The world became more connected, and wars acquired a new speed and violence. A popular reform movement, led by nobles and military men, installed a new emperor, Theomisos V. Together, they did away with much of the bureaucratic apparatus entirely, and instead created an imperial fleet as a power base and peace-keeping force.



This movement did not last long, destroyed by infighting and the death of its most senior members. Despite the power and authority of the fleet, the empire now entered an even steeper decline, as various factions installed and deposed puppet rulers to enrich themselves and use the fleet to threaten their rivals. Cities that were on the losing side started completely ignoring imperial edicts.

Around this time, a satirist published a pamphlet tallying the exact (and surprisingly low) cost of gaining the imperial throne - the amount of bribes needed to arrange for the previous emperor's unfortunate fall from an airship, and the payments to electors to ensure your own election. Within the imperial administration, it was widely acknowledged as accurate.

The final emperor, then, was a wealthy merchant of impeccable upbringing who had bribed the right people. To the surprise of the realm, rather than wanting to enrich himself, he genuinely intended reform. Once installed on the flagship of the imperial fleet, he started issuing radical edicts to reform the empire, much to the displeasure of the wealthy and powerful.

What happened next is unclear: Some claim that he went mad, or had indeed been mad all along. Others claim that he was preparing an edict abolishing serfdom across the empire. But there definitely was some great battle involving the imperial fleet, destroying it utterly. Were they attacked by mercenaries hired by powerful factions? Did the fleet split into factions that fought each other? We don't know, but the emperor disappeared, and the power of the fleet was no more.



There were several attempts to hold a conclave afterwards, but none of them came close to having enough electors - in part because several electors were killed by angry mobs soon thereafter, and their successors were unwilling to travel. Years had passed without an emperor before, but after more than a decade, it became clear that there would not be a new conclave. The cities, now free of the constraints of imperial rule, began looking at each other and sharpening their knives...

If you enjoyed this, you may also enjoy the previous lore dump on Calendars, Moons, Festivals and Heresies.
Sep 11, 2022
Airships: Conquer the Skies - Zarkonnen
  • Added maximum values to a number of diplomacy AI evaluations, preventing extreme numbers from distorting AI behaviour. (For example, being able to buy an entire city in exchange for a research treaty.)
  • Added a button to jump to a city being transferred in diplomacy offers.
  • City specials now have descriptions in Chinese, courtesy of ChenLe.
  • Some minor GUI fixes.
Aug 30, 2022
Airships: Conquer the Skies - Zarkonnen
Maybe actually fixed the network desync problem I've been chasing. Plus, combat music triggers correctly now!
Aug 29, 2022
Airships: Conquer the Skies - Zarkonnen
  • Stopped the AI from building landships it doesn't have the tech for.
  • Flipped AI defensive building the right way around.
  • Stealing research through espionage now works properly.
  • New cheat to guarantee 100% spy success.
  • Grapeshot cannons and bottom turrets now properly affected heavy gunnery bonus.
  • Fixed display problem with calculation for amount of research points generated.
  • Fixed display problem with city income calculation.
  • Correctly named map sizes in German.
  • Tribute paid is now listed in empire budget.
  • Negative maintenance from modules and ships is now treated more like proper income. (This is only relevant for mods that add income-generating modules, which stopped working with the big update and should now work again.)
  • Allow building multiple universities.
  • Reduced income loss from rare powerful nests. Starting out next to a black dragon nest was a bit too painful.
  • Ministry of security now decreases unrest by 15 points in all towns and cities instead of 10, is $200 more expensive, and no longer decreases local unrest as well, as that was really confusing.
  • Spy agency now increases spy network growth speed by 50% instead of 25%.
  • More error logging to hopefully track down network desyncs.
Aug 23, 2022
Airships: Conquer the Skies - Zarkonnen
  • Better, more fine-grained volume controls.
  • Spy infiltration is now half as fast and the AI doesn't constantly do spy actions anymore.
  • Fixed the Invictus achievement. Note that you'll have to start a new game to get the achievement. Sorry about that.
  • Show correct travel time for fleets based on which ships are selected.
  • Desert columns no longer randomly lift entire landships into the sky.
  • List of bonuses now shown correctly.
  • City upgrade construction time now displayed correctly.
  • AI allies no longer take your ships out of the reserve and start giving them commands.
  • Turtledove armour reward now works.
  • AI no longer builds multiple monasteries in one place.
  • Doubled trade treaty income and increased research treaty effect by 50%.
  • Fixed trade treaty incomes on low difficulties.
  • Can no longer induce revolt in cities that are still being taken over.
  • AI now obeys supply limits when travelling to friendly cities.
  • Unrest from empire size increased by about 25%. Unrest from recent takeover decreased.
  • Made ages around 40% longer.
  • Added some missing defense buildings.
  • Fixed a rare landship map pathing bug.
  • More work on fixing up desyncs.
  • Fixed some rare crashes.
Aug 19, 2022
Airships: Conquer the Skies - Zarkonnen
  • The AI is less likely to accept ultimatums, and very unlikely to accept another ultimatum if it's recently accepted one. This should make it less straightforward to bully yourself to victory.
  • Losing a city that doesn't have a ritual site no longer cancels the final ritual.
  • When you get an ultimatum or offer, there is now a button to go to the other empire's capital.
  • Increased cooldown time of some espionage actions.
  • Settings now accessible from more places, and settings button is a gear icon instead of the word "Settings".
  • You can now adjust the tooltip delay in the settings.
  • Fixed airship command panel positioning when dyslexic fonts are active.
  • Fixed graphical glitch in dyslexic fonts.
  • Fixed some multiplayer desyncs.
  • Fixed some crashes.
  • Fixed some missing text.
  • The soundtrack now includes the eight new tracks from the update.

Addendum: Version 1.1.0.4 fixes a performance problem that this update introduced.
...