Throughout the last months we made several corrections and additions affecting the modding API that were too small to discuss in one blogpost. Since quite a few changes accumulated though, we decided to bundle them and wrap up the year with a collection of mini blogposts.
Other articles in the modding API series:
- Units, Buildings & more
- Inventory System
- Too many villagers!
- Restocking farms
From all of our API objects
GameEntity saw the most drastic changes. Firstly, the members for hitbox and language data were moved to abilities, while the
icon is now part of the nyan UI modding API (which is under construction at the moment).
Building also had unique members which were moved to the five new abilities
TerrainRequirement. We hope that by outsourcing these members to abilities, game entities will become even more versatile and less restrictive in their definition.
Secondly, we introduced
GameEntityType referenced by the member
types which is a new object that can be used for a broader classification of game entities. A game entity can be of several
Archer or both. In comparison to the classes in AoE2,
GameEntityType is not tied to armor and acts as an independent mechanism.
Last but not least, we want to welcome
Projectile as the fifth
GameEntity category. In the 2. blogpost we declared that
Projectile should not be a
GameEntity because it does not operate independently and always needs a host unit that shoots it. Howerever, we came to the conclusion that just because projectiles are dependent on their host in AoE2, this doesn't necessarily have to be the case in openage. Hence, the
Projectile object has emancipated itself and can now be used for other things than attacking, e.g. converting, resource gathering, repairing and more.
Another addition specifically designed for population space is
ResourceContingent. Contingents are resources with the additional feature that they can be used and provided temporarily. In context of population space, this means that units use 1
PopulationSpace resource while they are alive and free it again when they have died. Similarly, houses provide 5
PopulationSpace once they are built which is available as long as they are not destroyed.
ResourceContingent is of type
Resource, contingents can potentially be gathered and thus permanently added to the resource pool, too. This could lead to some interesting dual-use mechanics where a resource contingent is gathered first and then temporarily used. For example, one could define a resource contingent
Grain which has to be collected from farms, while the amount of grain is also used as the population limit. The player can then choose between
- Keep the
Grain for additional population space, thus being able to field more units
Gold and therefore lose room for population, but gain the potential to buy better upgrades for their units.
Age of Empires 2 is not known for giving its units many attributes except HP, yet many other RTS games are more generous in that regard. Examples are mana, stamina (Battle Realms), "special" power (AoM, EE), shield (SWGB) and so on and so forth. So, instead of creating an ability for every single attribute RTS designers thought of, we generalize them with the
Attribute API object. The definition of attributes is very similar to that of
Resource which makes sense as attributes technically are resources, although only available in the scope of the unit. Abilities that cost attribute points reference
AttributeAmount which is an attribute's counterpart to
For AoE2, two attributes are needed in total:
Health should be self-explanatory,
Faith is used by monks to convert units.
Faith is also a
RegeneratingAttribute that is refilled at a defined
rate. In preparation for SWGB support, we also added
ProtectingAttribute which shields another attribute from damage. For example, if
Health, then the attribute points of the shield will be substracted first in case of an attack. Once the attribute points of
Shield reach 0, the
Health points of the unit start to get subtracted. Of course, we can also build longer protection chains with 3 or more attributes.
Introducing the attribute system required reworking attacks and armor. Now
ArmorDefense is always connected to a specific attribute through
ArmorAttack had a similar change so that every attack value is targeted at one specfic attribute. Optionally,
ArmorAttack is allowed to ignore protections from the
ignore_protections set. As a result, we can now have attacks in SWGB that only affect shields or ignore the shield entirely and damage the HP directly.
Training and building
At last, we have made a small change to how the cost and creation time of units and buildings were managed. Before, cost and creation time were decided by the created unit through the
Creatable ability. In our newest API draft, we delegated the decision to the creating unit or more precisely, to the
Build abilities. These reference a
CreatableGameEntity object which stores cost, creation time, requirements and the unit/building that is created. This slight alteration should give more freedom to pricing when the same unit is produced in several different buildings.
That's it for this time, but there will probably be more to add, change or discuss about soon.
Did we leave something out or are we forgetting something important in our API? Shout at us (and discuss your ideas) by visiting our subreddit /r/openage!
As always, if you want to reach us directly in the dev chatroom:
#sfttech on freenode.net