The heroes introduced in the Heroes & Villains DLC can be modded, changing them or adding new ones.
You can download a simple example mod here, for you to study and modify. You can also look at the already existing heroes in data/crossplay/heroes/HeroType. You can probably figure things out just from that.
The rest of this post attempts to document everything exhaustively, so don't feel that you have to have read all of it to start modding heroes! Reading "Basic Hero Structure" and "Recruit Hooks" and then whatever you think you need should be enough to start.
You can find detailed documentation on how modding works here, but here's the short version: A mod is a folder containing an info.json file, a logo.png file, and a bunch of folders containing JSON files with the same structure as the data folder in the game. You will also need a strings/en.properties file for the text in your mod, and an images folder. Here's the basic structure:
MyHeroMod/
info.json
logo.png
HeroType/
myHeroes.json
strings/
en.properties
images/
myHeroPortrait.jpg
scaled/
myHeroPortrait-200.jpg
myHeroPortrait-100.jpg
myHeroPortrait-50.jpg
logo.png should be a 512x512 PNG and info.json should look like this:
{
"id": "MyHeroMod",
"name": {
"en": "My Hero Mod"
},
"description": {
"en": "My Hero Mod is a mod that mods heroes."
}
}
Note that for your mod, you shouldn't put the HeroType folder into a crossplay folder.
Basic Hero Structure
To get started, create a HeroType folder inside your mod folder, and add a JSON file containing the following.
A hero needs at least a name, a role ("CAPTAIN" or "GOVERNOR"), a portrait image, and a maintenance value. If you want to change an existing hero in the game, use the same name to overwrite them.
The name is used to look up their display name in en.properties. The hero also needs a description under [hero name]_desc, so:
myHero=Steve Stevenson
myHero_desc=Steve is just this guy, you know?
The portrait should be a 300x300px JPG or PNG stored in the images folder. Also add 200px, 100px, and 50px downscaled versions of it to images/scaled/, with the pixel size in the name like so: myHeroPortrait-200.jpg, myHeroPortrait-100.jpg, myHeroPortrait-50.jpg.
This will spawn a new hero in the game, but they won't do anything and can't be acquired.
Recruit Hooks
To get heroes to turn up for recruitment, you need a list of recruit hooks, which specify events that cause them to turn up. Here's an example of three hooks:
So the hero may turn up when you build a fleet academy, when you win a fight, or when you research cartography. See the full list at the end of this document, or look at the existing heroes.
Template Heroes
If you want to create a generic kind of hero, of which there can be multiple copies, use the following lines:
templateSpawnPerEmpire is multiplied by the number of starting empires and rounded up to arrive at the number of such heroes to create at the start of the game.
The first name of the hero is generated by picking a number between 0 and templateFirstNameNum - 1 and then looking up "HERO_[number]" in the strings, same with the last name. So M are male names (26 available), F are female names (26 available), NB are non-binary names (6 available), and B are last names (26 available). You can also make your own name lists.
Starter Heroes
At the start of the game, players are given a choice between a set of heroes to start the game with. You can turn a template hero into a starter hero by setting isStarter to true. The game will also create additional such heroes based on templateSpawnPerEmpire if it's more than 0.
Techs and Bonuses
Heroes can give the player techs when they are hired, for example:
"techs": [ "CARTOGRAPHY" ],
If a hero gives a tech, it's a good idea to also specify a hireCost value, which is an up-front payment when hiring the hero, so that players can't just get a tech for nothing.
And a hero can give a bonus to the empire they're working for, which lasts as long as they're around, using "bonus".
Finally, you can use "departureBonus" to specify a bonus that the hero gives the empire when they leave it, due to stat changes or being dismissed. Right now this is just used for druid (Vex) in captains.json, who curses your empire when they depart.
Passive Combat Abilities
On to making heroes actually do something! If you're creating a captain, you can give them passive combat abilities that apply to the ship or fleet they're in. The following are available:
Ship:
shipBonus: A Bonus applied to this ship alone.
fireRatePercent
accuracyPercent
crewSpeedPercent
flammabilityPercent
explosionRiskPercent
commandCooldownPercent
repairAmountPercent
firefightAmountPercent
propulsionPercent
liftPercent
armourRepairPercent
experiencePercent
lootMoneyPercentage: Percentage of total value of destroyed enemy ships earned after combat.
scavengeMoneyToSupply: Multiplied by total value of destroyed enemy ships to gain supply after combat. Note that 100 supply is a lot and 100 ship value is tiny, so this should be a number much smaller than 1.
surpriseAttack: If set to true, enemy ships start on command cooldown.
Fleet:
expeditionStrengthPercent: Expedition outcomes are based on total fleet strength. This is a percent bonus to fleet strength for this purpose alone.
fleetSpeedPercent
fleetFireRatePercent
fleetAccuracyPercent
fleetCrewSpeedPercent
fleetFlammabilityPercent
fleetExplosionRiskPercent
fleetCommandCooldownPercent
fleetRepairAmountPercent
fleetFirefightAmountPercent
If you have multiple captains in a fleet, only the strongest ability counts. They don't stack.
All percentage values should be integers.
Combat abilities
Captains can also have active combat abilities, which are specified like this:
AERIAL_ACE: Also specify a CrewType with aerialAceCrewType so it knows what unit to spawn.
AIR_SUPPORT: Also specify a CrewType with airSupportCrewType and a number with airSupportNumCrew so it knows how many of what units to spawn.
PERSONAL_GUARD: Also specify a CrewType with guardCrewType and a number with numGuards so it knows how many of what units to spawn.
Passive City Abilities
If you're making a governor, they can have passive abilities that apply to the city they're assigned to:
unrest
spyDefence
productionPercent
defenceBudget
incomePercent
researchPercent
upgradeCostPercent
upgradeSpeedPercent
airshipSpeedPercent
landshipSpeedPercent
buildingSpeedPercent
You can also use "research" specify an amount of research generated independent of whether they're assigned anywhere.
Edicts
Governors can also enact edicts in cities they're assigned to. Edicts are temporary events, and unlike active captain abilities, new ones can be modded in. To add one or more edicts to a hero, add a line like this:
"edicts": [ "martial_law" ],
Then, create your edict by adding a JSON file to the Edicts folder in your mod, e.g:
Edicts need a name, a duration, an icon, and an iconBackground. The icon should be a 16x16px white on transparent icon with a 1px margin, and the iconBackground should be the icon plus a 1px border, fitting into those 16x16 by using the margin. (See the example mod for what that looks like.)
Edicts can make a sound. They can change the stats of the hero that enacts them (see about stats below). You can also have the hero make a comment on the edict.
Edicts can have two kinds of effects: immediate effects that happen when they're enacted, and ongoing effects that last until the end of the edict.
Immediate effects:
money
instantResearch
rep
pillaging
Ongoing effects:
unrest
spyDefence
production
defenceBudget
incomePercent
research: Misnamed, also a percentage.
upgradeCostPercent
upgradeSpeedPercent
airshipSpeedPercent
landshipSpeedPercent
buildingSpeedPercent
Moving and Clearing Monster Nests
Governors can have the ability to clear or move specific monster nests in the territory of their city. To specify clearable nests, add a list to "clearableNests" like so:
You can use nestClearRep, nestClearMoney and nestClearResearch to add rep/money/research effects to clearing a nest. Use nestClearStat to specify the name of a stat you want to change when clearing a nest, and nestClearStatChange to specify by how much. Finally, use nestClearComment to have the hero make a comment when clearing the nest.
Moving nests (which means relocating it to an empty nest location outside your territory) has all the same fields, so moveableNests, nestMoveRep, nestMoveMoney, nestMoveResearch, nestMoveStat, nestMoveStatChange, and nestMoveComment.
Stats
Finally, both captains and governors can have stats, which are values between 0 and 100 that can be affected by the same kind of events as recruit hooks. You can make up any kind of stat, like "Sliminess" or "Desire for Cheese".
Here's an example stats block from Commander Bertelli:
Each stat needs a name and a starting value, and one or several changers, which specify when the stat should change. See the list of hooks below to see what changers are possible. Heroes can also make a comment when the changer is triggered.
You can also base the amount by which a stat changes on the size of the map, by adding a changeDivByCities and optionally a changeMax value. Here's an example:
This means that if you gain a town or city, the stat changes by min(changeMax, change + changeDivByCities / numberOfCitiesOnMap). So 1 plus 100 divided by the map size, but no more than 10. This is especially useful for stats with powerful effects, where you want them to happen more slowly on large maps.
When a stat reaches 0 or 100, it can affect the hero by making them leave, killing them, changing them into another hero, enabling coronation victory without having the required rep, or winning the game altogether.
Here's the values to set for these effects:
leaveOn0: true/false
leaveOn100: true/false
dieOn0: true/false
dieOn100: true/false
evolveOn0: Name of hero to change into
evolveOn100: Name of hero to change into
winOn100: true/false
coronationOn100: true/false
If you want your hero to evolve into another, set up another hero entry with spawnAtStart set to false, so that their evolved form doesn't turn up beforehand.
Note that Loyalty is a bit of a special case with stats, as a hero with a loyalty stat below 25 is corruptable by spy actions. The stat that lets you have a coronation is usually Fame, and the one that lets you win outright is usually Power, but that's not hard-coded.
Testing
Once you've put together your hero, you can use the cheats (enabled in the game settings) to acquire them for testing.
Additional Features
Using Captains in Single Combats
Captains can also be used in single combats outside of the campaign by setting the singleCombatCost value.
Nemesis Empire
By setting hasNemesisEmpire to true, a hero can have a nemesis empire, which is a random empire that they hate. The game picks a random empire at the start of the game when creating the hero. Typically, the hero's loyalty changes based on how you interact with their nemesis, but the details of that are up to you.
Because empires can be destroyed, you should also create a version of the hero without the nemesis stat effects and specify it in turnIntoIfNemesisIsGone.
See beautiful_and_determined (Captain Bui) in captains.json for an example.
Of course, a hero will never turn up for recruitment for their nemesis.
Hometown
Conversely, by setting hasHomeCity to true, a hero can have a random hometown. You can then use hooks specific to that hometown to change their stats. See science_admin (Sa'd Khayyam) in governors.json for an example.
Since towns and cities cannot be destroyed, you don't need a version without a hometown.
Hire Comments
Heroes can comment on other heroes being hired without having a stat change, for additional storytelling purposes. You don't need to add anything to the HeroType for this. Simply add a line called
[hero1]_hire_[hero2]
to en.properties.
For example:
painted_sorceress_hire_secret_heretic=Oh, Kamina is so eager to please! We all know why, of course.
This has painted_sorceress (Izegbe) comment on you hiring secret_heretic (Kamina Ver).
Combat Comments
Heroes can also make comments upon things happening in combat. This uses the PortraitMessageType system already used for generic comments on combat.
To create a comment when a hero uses an ability, add a PortraitMessageType that looks like this:
The eventInfoPrefix is what the system uses to match to combat events. Here, it says that DOUBLE_TIME has been cast by health_and_safety. The message has as many variations as there are message images - so just one in that case, which is:
health_and_safety_DOUBLE_TIME0=Double time, men! Like we trained!
To create a comment when a hero observes an enemy hero's ability use, add one like this:
Heroes can have "interesting" set to true. If a player has spent two in-game years without having a hero marked as "interesting" turn up for hire, the game tries really hard to get one to turn up as soon as possible.
List of Hooks
Finally finally, here's the list of event hooks and their parameter that you can use for recruitHooks and stat changers. Note that you can find plenty of examples of these being used in captains.json and governors.json.
anyNestDestroyed: You've destroyed a nest of any type.
bioNestDestroyed: You've destroyed a nest marked as biological.
nonBioNestDestroyed: You've destroyed a nest not marked as biological.
nestDestroyed(nestType: MonsterNestType): You've destroyed a nest of this specific type.
multiNestDestroyed(nestTypes: list of MonsterNestType): You've destroyed a nest from this list of types. The list will be referred to by the first nest on the list.
anyNestAppeared: A nest of any type has appeared in your territory.
bioNestAppeared: A nest marked as biological has appeared in your territory.
nonBioNestAppeared: A nest not marked as biological has appeared in your territory.
nestAppeared(nestType: MonsterNestType): A nest of this specific type has appeared in your territory.
multiNestAppeared(nestTypes: list of MonsterNestType): A nest from this list of types has appeared in your territory. The list will be referred to by the first nest on the list.
anyUpgradeBuilt: You've built a town or city upgrade.
upgradeBuilt(upgradeType: CityUpgradeType): You've built a town or city upgrade of this type.
takeover(takeoverType: TakeoverMethod): You've started taking over a town or city using this method.
anySpyAction: You've done any spy action.
spyAction(spyActionType: see list of CitySpyActions below): You've done a spy action of this type.
anySpyActionAgainstNemesis: You've done any spy action against this hero's nemesis.
spyActionAgainstNemesis(spyActionType: see list of CitySpyActions below): You've done a spy action of this type against this hero's nemesis.
everyMonth: Exactly once every month.
randomly: Triggers about every 6 months.
rarely: Triggers about every 19 months.
relationshipLevelUpgrade(newLevel: see list of RelationshipLevels below): Your relationship level with another empire has increased to this level.
relationshipLevelUpgradeWithBonusEmpire(newLevel: see list of RelationshipLevels below, bonus: Bonus): Your relationship level with another empire that has this bonus has increased to this level. Used e.g to have Father Tesseract complain when you're nice to cultist empires.
nemesisRelationshipLevelUpgrade(newLevel: see list of RelationshipLevels below): Your relationship level with this hero's nemesis has increased to this level.
relationshipLevelDowngrade(newLevel: see list of RelationshipLevels below): Your relationship level with another empire has decreased to this level.
relationshipLevelDowngradeWithBonusEmpire(newLevel: see list of RelationshipLevels below, bonus: Bonus): Your relationship level with another empire that has this bonus has decreased to this level.
nemesisRelationshipLevelDowngrade(newLevel: see list of RelationshipLevels below): Your relationship level with this hero's nemesis has decreased to this level.
tradeTreaty: You've made a trade treaty with another empire.
tradeTreatyEnded: You've broken or dissolved a trade treaty with another empire.
researchTreaty: You've made a research treaty with another empire.
researchTreatyEnded: You've broken or dissolved a research treaty with another empire.
sendTribute: You've started sending tribute to another empire.
sendTributeToNemesis: You've started sending tribute to this hero's nemesis.
sendTributeEnded: You've stopped sending tribute to another empire.
receiveTribute:You've started receiving tribute from another empire.
receiveTributeFromNemesis: You've started receiving tribute from this hero's nemesis.
receiveTributeEnded: You've stopped receiving tribute from another empire.
demonstrateSubmission: You've demonstrated submission to another empire.
demonstrateSubmissionToNemesis: You've demonstrated submission to this hero's nemesis.
receiveSubmission: You've received submission from another empire.
receiveSubmissionFromNemesis: You've received submission from this hero's nemesis.
cityGained: You've gained control of a town or city.
homeCityGained: You've gained control of this hero's hometown.
cityLost: You've lost control of a town or city.
homeCityLost: You've lost control of this hero's hometown.
combatVictory: You've won a battle.
combatVictoryAgainstNemesis: You've won a battle against this hero's nemesis.
combatDefeat: You've lost a battle.
combatDefeatAgainstNemesis: You've lost a battle against this hero's nemesis.
nemesisDestroyed: This hero's nemesis empire has stopped existing. (By your actions or otherwise.)
techResearched: You've researched any technology.
techResearched(tech: Tech): You've researched this specific technology.
heroHired(hero: HeroType): You've hired this hero.
heroLeft(hero: HeroType): This hero has left your employ, by being fired, or leaving, or dying.
repLevelUpgrade: Your reputation level has increased.
repLevelUpgrade(level: see list of RepLevels below): Your reputation level has increased to this level.
repLevelDowngrade: Your reputation level has decreased.
repLevelDowngrade(level: see list of RepLevels below): Your reputation level has decreased to this level.
incident(tag: text, see list of Incident Tags below): You had a diplomatic incident outcome with this tag.
CitySpyActions:
SABOTAGE_RISE_TO_POWER
BRIBE_GOVERNOR
CONVERT_GOVERNOR
INTRIGUE
UNEARTH_SCANDALS
ORGANISE_STRIKES
SABOTAGE_PRODUCTION
STEAL_RESEARCH
STEAL_SUPPLIES
STEAL_FUNDS
BUILD_NETWORK
FOMENT_UNREST
SABOTAGE_CORONATION
SABOTAGE_FINAL_RITUAL
INCITE_RIOT
INCITE_REVOLT
RelationshipLevels:
WAR
TRUCE
PEACE
NON_AGGRESSION_PACT
DEFENSIVE_PACT
ALLIANCE
RepLevels:
LOVED (80-100)
LIKED (60-79)
TOLERATED (40-59)
DISLIKED (20-39)
HATED (0-19)
Incident Tags currently being used in incidents:
coop: You cooperate with another empire.
betrayed: You were betrayed by another empire.
betrayal: You betrayed another empire.
kindness: You showed kindness to another empire.
kindnessReceived: You received kindness from another empire.
1/2 and 1/4 speeds are available again in multiplayer.
There's now a cheat menu option for getting heroes of your choice.
Age of monsters/piracy/madness now spawns monster nests at the start rather than throughout the age.
Conquest Balance
+10 base unrest in towns, +15 in cities.
Increased maximum unrest decrease from defensive buildings from 20 to 30.
Reduced cost of defensive buildings by 1/6.
AI is now much more likely to enter alliances and defensive pacts once one empire controls a significant proportion of the map.
These balance changes are intended to improve the difficulty curve of the game, so you may find it somewhat harder than before.
Combat Balance
Mech squid and fleshcrackers now have a limited running time. (3 minutes and 4 minutes respectively)
Halved mech squid HP.
More accurate ballista.
50% faster wurms.
Reduced grenade arc gravity.
Reduced heavy wooden armour blast damage absorb from 8 back to 6.
Increased flamethrower blast damage from 6 to 8.
Boosted big wheel carry cap by 20%.
Extra 10 degrees of mortar depression.
8 seconds until lightning starts to hit in high storm instead of 4.
Fixes
AI no longer hires heroes it can't afford, and fires heroes if money is tight.
Prevented buildings with keels and other constructions with the wrong kinds of modules.
Landships can drive on constructions (other landships, buildings, airships) now.
Fixed direct control crash.
Fixed intercept crash.
Fixed some causes of desync. Still hunting others.
Fixed torpedo bombers having catastrophically bad aim at the start of combats.
Minor Fixes
Improved Japanese font rendering.
AI fleets consisting of single supply ships no longer attempt to conquer cities.
Preloading weather background sound loops to make weather changes go more smoothly.
Added missing image for age of madness.
Added some new nest icons.
Fixed band of brothers text.
Fixed missing Targeting Computer string.
Fixed damaged inverted large junk sail image.
Deduplicated special build options.
Prevented the same hero from turning up too often.
Turnabout now flips tentacles.
Prevented multiple filled nests in the same city at start.
Added a border around the map view mode selector in the bottom right.
Hero Reworks
Manha Ithkuil: Added Loyalty stat that decreases by 1/month and is increased by combat defeats, certain spy actions, and betraying empires in diplomatic incidents.
Palmerston: Removing a monster nest now increases rep by 3. Can now also remove Titan Bladeweeds and Land Anemones. Added Monster Exhibition edict that increases rep, reduces unrest, and produces a bit of science.
Sigan Sainik: Gain 3 rep from clearing nests. Maintenance reduced from 10 to 5. Building a Hospital now also grants 5 Idealism.
Sigan the Cruel: Local production and unrest bonuses replaced by empire-wide bonus Sigan's Cruelty: +100% production, +20% town and city income, +15 unrest.
Lord Sigan: Fame increase from clearing a nest increased from 5 to 10. Local unrest bonus replaced by empire-wide bonus Sigan's Wisdom: -10 unrest, double gentle takeover speed.
Igor Nescimus: Once his nemesis is defeated, gains 25 XP per Police Station and Garrison built. Upgrades into a version that doubles unrest reduction from Police Stations and Garrisons.
Hero Balance Changes
Professor John Prolix: +5 Research
Kantorka: Unlocks Dragonriders
Lilith: Reduced upgrade speed by a third, increased Ritual of Praise cost from 500 to 800.
Lilith, Saviour of Mankind: Brutal takeovers now only increase Loyalty by 5 instead of 10.
Commander Yithrak: Reduced fire rate bonus from 50% to 40%.
Vex: Base loyalty increased from 30 to 90, loyalty gain from destroying a non-biological nest increased from 20 to 40, loyalty loss from destroying a biological nest increases from 30 to 60, added -1 loyalty per month.
The Magnificent Alexander: Magnificent Party cost reduced from 1000 to 500, and it now also reduces 25 Boredom in Alexander.
Captain Bertelli: Fleet crew speed bonus increased from 10% to 25%. +50% Fame gain from winning combats. Fame loss from losing combats reduced from 30 to 25.
Akim: Maintenance reduced from 10 to 3.
Yitzhak Sutter: Maintenance reduced from 8 to 5.
Lacuna Abgott: Spy success chance bonus increased from 20% to 40%.
Fatima: Maintenance increased from 8 to 12.
Grand Sorceress Fatima: Maintenance increased from 15 to 20. Summoned guardian sprites do 80% less damage.
Laura Ali (base): Upgrade cost reduction increased from 30% to 50%. 50% more experience gain.
Dame Ali: Maintenance reduced from 16 to 10.
Luca van Fruchtenbach: Added $300 one-off hire cost. Replaced 20% local spy defence with 10% empire-wide spy defence.
Sa'd Khayyam: Symposium cost reduced from $1000 to $500. Instead of boosting local research by 20%, it now grants a lump sum of research.
Sam: Maintenance reduced from $10 to $5. Can no longer build Mech Squid. Doubled XP gain from destroying monster nests.
Doctor Violet: Increased maintenance from $15 to $17. Mech squid now have reduced HP and a 3 minute running time before they stop.
Izegbe: Reduced maintenance from $12 to $9.
Starter Hero Balance Changes
Architect: Doubled XP gain from building town and city upgrades.
Disciplinarian: Increased unrest reduction from 25 to 30. Doubled martial law running time to a year.
Engineer (upgraded): Fleet accuracy bonus reduced from 30% to 20%.
Special Event Hero Balance Changes
Ascended Scholar: Summoned guardian sprites do 80% less damage.
Mad Scientist: Instead of providing 5 research, now triples research output at the city she is assigned to. Mech squid now have reduced HP and a 3 minute running time before they stop.
Welcome to the inevitable post-release bugfix update!
The DLC now works on Macs!
Trebuchets no longer block airflow.
AI should no longer send so many insults and delegations.
Reduced frequency of heroes appearing slightly.
Added settings for frequency of heroes appearing and frequency of diplomatic incidents.
Added toggle for hero victory.
Better spacing of modules in editor module list.
Disarm and Cripple abilities deactivate properly once they've taken out all weapons/propulsion.
Added one new player-contributed fleet.
Added the proper portrait for powered-up Zotullah. (Zotullah!)
I've been reading people's feedback and reviews. The most common negative feedback was the heroes happen too frequently, and that in general, messages for players to deal with turn up too frequently.
During development, I was frankly worried that the DLC wouldn't have enough of an immediately noticeable impact. So I erred on the side of too many things happening rather than too few. I've now toned down the frequency of heroes a bit, and also added game setup settings that let you choose if you'd like heroes to be a rare thing, of if you'd like to play Steampunk HR Simulator 2023.
As for balancing individual heroes, that will be an ongoing process based on your feedback, so do let me know about specific heroes that you find overpowered or underpowered.
I am very pleased to announce that Heroes & Villains, a DLC for Airships: Conquer the Skies, is now available!
In Heroes & Villains, you can recruit commanders for your airships and governors for your cities, and use their special abilities to conquer the world.
Commanders can outflank enemy ships, supercharge their engines, or repurpose random objects as ammunition. And some commanders are sorcerers who can blind enemies, control the weather, or summon creatures to aid them.
Meanwhile, governors increase the productivity of cities, quiet unrest, and can pronounce edicts and events such as martial law, forced labour, or a fun masked ball.
Based on your actions, these characters can gain experience, gain or lose their loyalty, or become more angry, stressed, insane, powerful, famous. Over time, some will change into different versions of themselves - experienced or embittered or empowered. Disloyal governors can be great liabilities, while some heroes can become famous or magically powerful enough to help you win the game.
Diplomatic incidents can now arise between empires, where you have to decide whether to trust or betray your neighbours. Risk war to burnish your own reputation? Encourage cultists? Fight pirates together? The right answer depends very much on where you are, what you need, and what you know about the other empire.
Ship crew now gain experience with each battle - assuming they survive it, that is. So here's an incentive to keep those little air sailors alive, maybe give them a sickbay, maybe some better armour. Or don't bother - there's always more where they came from.
Also, here's a an extra surprise feature: You can design and award medals to ships based on their experience level. Each medal tier only has a small number of medals, and the medals are permanently lost along with their ships, so make sure you keep your medal-bearing ships alive.
Also note that if you join a multiplayer game, you can use the DLC during the game even if you haven't bought it. I wanted to avoid splitting the player base along DLC lines.
And as always with any big release, there are probably bugs, so if you encounter any problems, please report them on the Steam forums or on Discord, and I'll get to fixing them right away.
I am also happy to announce that Airships is part of Simfest, the Steam festival celebrating all things related to simulation games. From today through July 24, Airships is 50% off! Do check out Simfest to see a wide variety of the latest and greatest simulation titles, both newly released and coming soon.
Alongside the DLC release, the baseline version of Airships is also getting an update with some new things and rebalancing.
Landships are now available at tier 0, using wheels instead of tracks. Of course, these landships need to be propelled somehow, which is why there's now teams of lizards you can attach to your vehicles. They're not very fast, but they're cheap and work perfectly fine.
The game now supports weapons with arcing ballistic trajectories. Most weapons still have flat trajectories, but grenades, ballistas, and heavy bombards have arced ones. In addition, there's now trebuchets as a tier 0 siege weapon, and mortars, which you get along with cannons.
Some modules got a major redesign, such as imperial cannons, which now do splash damage, acid spitters, which are now rapid fire, and targeting computers that now assist guided missiles.
The weather will now sometimes change during a fight - rain starting or ending, dusk turning into night, dawn into day, and so on. And there's a bunch of performance improvements and bug fixes, including a fix to a desync bug that's been plaguing the game for about a year now.
Heavy Bombard: 44 -> 50 Blast damage, +30% Accuracy, Made trajectory ballistic, Added 450m max range, Added 28m max up range, Added 0.7x accuracy multiplier against airships
With Heroes & Villains releasing in one week, here's a post about some of the design decisions I made.
Last year, I taught a class at the Zurich University of the Arts about using game mechanics to tell stories. It was a very small class, and so we spent our time sitting together, playing games, and discussing them. We played Crusader Kings 3, Rimworld, I Was a Teenage Exocolonist, Six Ages: Ride Like the Wind, and more. I'm not sure if we figured out what was intended to be the core theme of the class, but we did learn a bunch of things about characters in games and procedural narratives.
Conveniently, I then immediately got to apply these things to the design of the Heroes & Villains expansion.
One of the surprising strengths of I Was a Teenage Exocolonist, a game about surviving your teenage years on an alien planet, is that its characters are handcrafted rather than procedurally generated. It's a game that's meant to be played through repeatedly as you figure out how to achieve your goals, and so you meet the same people again and again. My assumption would have been that you get bored of the characters, but in fact your emotional connection to them deepens with repeated playthroughs.
In comparison, Rimworld has a pretty sophisticated system for generating characters with all kinds of different traits - but because these traits get jumbled up each time you play, repeated playthroughs actually alienate me from the game characters. As I see more and more recombinations - and as people keep on dying from random rabid squirrel attacks - I stop seeing them as people and just see them as collections of traits that are more or less useful.
So for Heroes & Villains, I intentionally chose to go with handcrafted characters - quite a lot of them, more than sixty, but you'll still see them again and again. So that when you see a familiar face pop up, you'll go "oh, it's that guy!"
The second decision I made was to express stories through mechanics as much as possible. Both characters' stories and diplomatic incidents focus on mechanics and tradeoffs rather than having large amounts of flavour text.
This is a response to another game we looked at, Crusader Kings 3, which has elaborately written events with text that I read maybe once, if at all. It's just too much text, and the text is so specific and detailed that reading it actually breaks my suspension of disbelief. Oh, your dog gets lost the same way as the dogs of ten previous rulers?
They're doing their best, pumping the game full of hundreds and thousands of events - but it's a losing battle. To make people notice that there's new events in an update, you need to have a significant proportion of new ones, and so each time you have to add even more for it to be noticeable. I'm one dev. I can't possibly write hundreds of events.
Instead, I concentrated on creating interesting decisions and very little text. Heroes have different stats - Loyalty, Pride, Fear, Rage, Sanity, Stress - depending on what kind of person they are, and your game actions affect those stats. So you have Commander Bertelli, whose pride can overtake his experience and turn him into a jerk, or the Aukhan Band of Brothers, whose oath of brotherhood weakens as your empire enters modernity, or Captain Bui, who is consumed with desire for revenge on one specific empire.
The expansion also adds diplomatic incidents, which are events that happen between two empires. They're prisoner's dilemma type decisions, so you have to take into account the situation both empires are in, and their personality, be they human or AI. Perhaps you can afford to antagonise the other empire. Maybe you desperately want to reduce their reputation. Maybe they have grievances towards you, and this is your chance to get rid of them and avert war.
All together, I made those design decisions to provide interesting gameplay experiences and choices, rather than things you numbly click through. You'll be able to see them in one week, when the expansion comes out!
I am happy to announce that Airships: Heroes and Villains will release on July 20, 2023. It's the first DLC for the steampunk ship-building strategy game Airships: Conquer the Skies.
In Heroes & Villains, you can recruit commanders for your airships and governors for your cities, and use their special abilities to conquer the world.
Commanders can outflank enemy ships, supercharge their engines, or repurpose random objects as ammunition. And some commanders are sorcerers who can blind enemies, control the weather, or summon creatures to aid them.
Meanwhile, governors increase the productivity of cities, quiet unrest, and can pronounce edicts and events such as martial law, forced labour, or a fun masked ball.
Based on your actions, these characters can gain experience, gain or lose their loyalty, or become more angry, stressed, insane, powerful, famous. Over time, some will change into different versions of themselves - experienced or embittered or empowered. Disloyal governors can be great liabilities, while some heroes can become famous or magically powerful enough to help you win the game.
AI should now respect minimum interval between spy actions set by difficulty level, ending spy notice spam. (And remember that you can right-click on the notices to dismiss them.)
Having 0 money now halves your research, halves your resupply speed, and imposes a 30% spy defence penalty.
Made tech screen GUI clearer, I hope.
Tech research finished popup now actually tells you the effects of the tech you researched.
Towns and cities disconnected from your capital now have a map icon so it's more visible.
Unrest spy action is harder, but more effective.
Aircraft no longer land on ships that have been taken over by the enemy.
You can no longer trick the diplomacy AI by threatening war so that that it cancels all treaties, and then declaring war anyway, saving yourself the rep loss.
Age of Madness should no longer also spawn all kinds of other monster nests.
Age of Quiet unrest reduction reduced from 20 to 10, and it now also halves resupply speed.
Coronation tooltip indicates how many cities you currently have.
AI control should no longer give orders to direct control ship.