top of page

Millennia

My Role

  • Implemented content for ages, national spirits, governments, factions, tile improvements, and more leading up to launch.
  • Designed and implemented a system for Ai players to show their decisions within a game.
  • Balanced complex economies within the game for both human and Ai players.
  • Supported the game with continuous update cycles and balance patches.
  • Wrote extensive in-game and flavor text,  nested tooltips, infopedia entries, and coordinated with localization teams to ensure high-quality translations across multiple languages.
Tech.png

Game Summary

Millennia is a turn based 4X strategy game for PC where players take a unique journey through alternate sets of history, shape what their nation is known for, and engage in deep economy systems.
Engine:
Platform:
Unity 2019.4.4.0f1
PC
Development Time:
1.5 years
Team Size:
18 team members

Initial Concept

Age2_Bronze_3840x2160.png
Random2.png
Iteration
The concept for the game is a spin on Civilization except alternate history. Players make decisions within the course of the game and that will affect them for the rest of their playthrough. The game tries to answer a number of things Civ fans have disliked for years such as having ways to end a playthrough early, customizing your chosen nation through actions taken rather than a predetermined choice, and a more in depth tile economy with a goods system.

Design Goals

Balancing Systems

I was tasked with the balancing and management of multiple overlapping systems that made up a complex in game economy. I tried to make changes that enhanced the player's decisions with how they built their nation.

Ai Decision Making

I was the main designer tasked with managing Ai. My main goal with the enemy Ai players was to make them appear to be smarter than they are by showing them visibly changing or acting differently based on decisions they made. 

Iterative Playtesting

I joined this team in the middle of intense development to help get the game across the finish line. My central goal was to make positive additions to the core of the game through black-box style balancing and feedback from playtesting.

Balance Systems

Soft Region Count

There was a lot of design work that went into the economy of the game. I wouldn't be able to show every problem with a culture power, technology, tile improvement, or good that I was tasked with solving.

Some of the more interesting problems I tackled when looking at resources within the game were ensuring Region Count had soft limits based on culture upkeep. I tracked Ai & human player's average culture values per age and set an upkeep value that would be affected by an exponential exponent. That way we could ensure big culture spikes at certain gameplay ages and balance ages around an intended region count.
RegionCountCultureUpkeep.png
Integrate_Region.png

Tuning Overpowered Abilities

Another issue I ran into during development was that culture powers felt outclassed by the Eureka ability to discover a random technology. Players would rush culture, then discover technologies faster than players who rushed knowledge buildings. I decided during development that this dynamic didn't make sense. I brought it up to the lead designer and after getting approval I was tasked with coming up with a solution.

To fix this I added a negative modifier to the Eureka power each time it's use within an age. However, once the next age triggers Eureka will scale back to it's original value, then increase to an age-appropriate amount of knowledge. This greatly improved the play experience as now all players tended to use their first culture power on the Eureka ability, but then use other powers after the scaling took effect. Now players were summoning armies and founding religions within an age when previously they were spamming constant Eurekas.
EurekaModel.png
EurekaModel.png

Taps vs Drains

Taps add resources to a player's inventory within an in-game economy. Drains remove those resources. During Millenia's development it was clear we had an issue of too many taps within the Domain XP system. Domain XP was often added to the player's inventory on a per-turn-basis. This issue would scale as the the game went on for a long time. The vision for the game was to have a very long playtime, roughly 500 turns, so players often hit their Domain XP cap around turn 250.

I felt that it was satisfying to add more Domain XP taps as a player. So instead of removing taps I opted to design new drains for the game that would be rolled out in an update. Domain XP often couldn't influence other systems such as City Food, Housing, or Education. The drains I proposed would add temporary percentage-based buffs to a selected city's need. While the powers themselves had a middling effect to gameplay they gave players a way to modify their city stats using an overflowing resource they had nothing else to spend on.
CalloutGovernmentXP.png
JiraComment_DomainDrains.png
New_GovXPAbility_InGame.png

Ai Decision Making

Dynamically Weighted Goals

During development Millennia already had static weights that helped determine an Ai player's decisions. A culture power with a higher weight would be used more frequently by the AI player than another power they had access to with a lower weight. Some consistent feedback throughout development was that it was difficult to tell what the other players were doing

Working with the Ai programmer on our team we created a system of dynamically weighted Ai goals that placed weights on abilities, units, and tile improvements based on a set of requirements. I was tasked with authoring all of these goals for everything in the game, and the Ai programmer I was working with assisted in caching off this data to help the game remain performant.

Here's an example. The Aztecs within this example game selected the Mound Builders national spirit. Here is the goal I wrote out in XML which specifies to add weight to tagged objects with AIHint-Mound. The Mound tile improvement is tagged with this ai hint so while this goal is active for the player they will build it more. The goal also specifies the age must be below Age 4 and the player must own less than or equal to 3 mounds. The capital city can be seen in game with two mound improvements.
GoalXML.png
ActiveGoal.png
TileImpExample.png

Research Pace

Another example of my design work with the Ai players in Millennia pertains to the knowledge race. Over a ~500 turn game human players would begin to easily outpace ai players gaining a lead of 2-3 whole ages. This resulted in players with tanks fighting players on horseback, obviously not an ideal play experience for the human player.

To fix this issue I took a multi-faceted approach using new Ai goals, new updates for Ai players upon age transitions, additional difficulty settings, and balance on paper using available telemetry at the time.

First I made a chart looking at tech costs by age, took the average knowledge per turn of  ai players across many games on average difficulty, and broke those costs down into their turn count for the age. I also used telemetry data available at the time (most games only reached around turn 400 at the time due to this knowledge race issue) and pulled in game data of when ai players reached different ages by what turn number.

I then added new ai goals, buffs, and buildings at sections where ai players took many more turns than the target number (50 per age after age 3). Finally to refine this I increased or decreased this average based on the difficulty of each Ai player.
TechCostByAge.png
KnowledgeRaceGraphRevised.png
KnowledgeTelemetry.png

Iterative Playtesting

Wonders

Something I noticed after many rounds of playtesting was that the game featured Wonder buildings in the early ages of the game, but not the later ones. I designed a list of new wonders to fill out the rest of the ages.

I researched historically accurate examples and wrote out pseudo XML entries for each of these new buildings. I also designed these buildings to be powerful as not every player will unlock them on every run. 

I worked with the game's publisher on copyright issues for what buildings could and could not be used. I also worked with the art team on what buildings they would like to see and work on in game. Once the assets were finished it was easy for me to add them to the game along with my XML to begin testing and playing with them.
Arc_De_Triomphe.png
Arc_De_Triomphe_XML.png

Postmortem

What Went Well

  • This was the largest game I've shipped to date with the highest volume of content.
  • Some of the player's nicest compliments for the game are how deep the systems within it are and how it's fun to play even if it's visually unappealing.

What Went Wrong

  • There's an overreliance on text within the game to explain mechanics.
  • The game's late game tends to drag as the player is burdened with managing too many regions, units, etc. This was a problem in Civilization we were not able to solve in this game.

What I Learned

  • I learned the importance of planning file and code structure. The Ai goals xml deck ended up very disorganized.
  • When possible think about data driving a mechanic. Data empowered the design team to craft a lot of content for this game.
bottom of page