Game API — Facts
This page mirrors the Facts block in BindGameAPI(). Most facts read game state and should be called from Init, Update, Render, or End while the match or end-state is available. Tournament Mode applies to game commands, not these read-only APIs.
Game must be running
Calling these APIs before the game starts logs an error.
Lua signatures are strict
Pass every argument shown below. A C++ default value does not make the parameter optional in Lua unless a separate overload is bound.
Reference
| Function | Signature | Returns | Description |
|---|---|---|---|
GetFact |
(fact) |
number |
Overload: returns a fact value for the assigned player with parameter 0. |
GetFact |
(fact, parameter) |
number |
Returns a fact value for the assigned player. |
IsObjectTypeAvailable |
(unitObjectType) |
boolean |
Returns whether the assigned player currently has access to a unit or building type. |
GetUnitTypeCount |
(unitId) |
number |
Returns the assigned player's count for a unit type. |
GetAttribute |
(attribute) |
number |
Returns a PlayerAttribute value for the assigned player. |
CanAfford |
(unitId, isBuilding) |
boolean |
Returns whether the assigned player can afford an item. |
GetTechCost |
(technology) |
{ resourceId = ResourceType, amount = number }[] |
Returns the assigned player's current technology cost entries. |
GetObjectCost |
(unitObjectType) |
{ resourceId = ResourceType, amount = number }[] |
Returns the assigned player's current object cost entries with multiplier 1.0. |
GetObjectCost |
(unitObjectType, costMultiplier) |
{ resourceId = ResourceType, amount = number }[] |
Returns the assigned player's current object cost entries with the given multiplier applied. |
CanResearch |
(technology) |
boolean |
Returns whether the assigned player can currently research a technology. |
IsTechnologyResearched |
(technology) |
boolean |
Returns whether the assigned player has researched a technology. |
GetObjectsByType |
(unitType) |
Object[] |
Returns matching world objects, not just owned objects. Loot-bearing dead huntables and livestock are included. |
GetObjectsByTypes |
(unitTypes) |
Object[] |
Returns matching world objects for any listed type. Loot-bearing dead huntables and livestock are included. |
GetObjectsByClass |
(unitClass) |
Object[] |
Returns matching world objects of a class, not just owned objects. Loot-bearing dead huntables and livestock are included. |
GetGameTime |
() |
number |
Returns the current match time in seconds. |
GetAllChatMessages |
() |
string[] |
Returns the current chat buffer as plain message strings. |
GetNewChatMessages |
() |
string[] |
Returns chat messages that became visible since this module instance last called the function. |
GetLastChatMessage |
() |
string \| nil |
Returns the newest chat message, or nil if the chat buffer is empty. |
GetAssignedPlayer |
() |
Player |
Returns the player currently assigned to this module instance. |
GetPlayerById |
(id) |
Player |
Returns a player by index. Gaia is typically 0, regular players are typically 1 to 8. |
GetPlayerCount |
() |
number |
Returns the size of the world player list. |
GetMapTilesPtr |
() |
number, number |
Returns (ptr, count) for an engine-owned packed tile snapshot buffer. Intended for IPC / RPM readers. |
GetMapWidth |
() |
number |
Returns the current map width in tiles. |
GetMapHeight |
() |
number |
Returns the current map height in tiles. |
GetMapTile |
(x, y) |
MapTile |
Overload: returns the tile at integer map coordinates, or nil if out of bounds. |
GetMapTile |
(position) |
MapTile |
Overload: floors a Vector2 world/tile position to a map tile lookup. |
GetAllMapTiles |
() |
MapTile[] |
Returns all map tiles. Individual tile methods still respect fog-aware visibility. |
CalculatePath |
(startPos, targetPos) |
Vector3[] |
Calculates a native path between two Vector3 positions. |
CalculatePath |
(startPos, targetPos, collisionRadius) |
Vector3[] |
Overload: calculates a native path between two Vector3 positions with an explicit collision radius. |
GetObjectsInArea |
(pos1, pos2) |
Object[] |
Returns objects whose current tile lies inside the rectangular area between two Vector2 positions. Loot-bearing dead huntables and livestock are included. |
GetObjectsPtr |
() |
number, number |
Returns (ptr, count) for an engine-owned packed object snapshot buffer. Intended for IPC / RPM readers. |
GetObjectTypeData |
(objectTypeId, objectData) |
number |
Returns static object-type data for a UnitObjectType and ObjectData field. |
GetObjectTypeAttribute |
(objectTypeId, objectAttribute, damageType) |
number |
Returns a static object-type attribute value for a UnitObjectType. |
IsEnemyPlayer |
(player) |
boolean |
Returns whether the given player is an enemy of the assigned player. |
GetObjectById |
(id) |
Object |
Returns a world object by id. |
GetProjectileById |
(id) |
Object |
Returns a projectile object by id. |
GetAllProjectiles |
() |
Object[] |
Returns visible projectile objects. |
GetProjectilesByType |
(projectileType) |
Object[] |
Returns projectile objects matching a ProjectileType. |
GetVictoryCondition |
() |
VictoryCondition |
Returns the current victory condition. |
GetVictoryPlayer |
() |
Player |
Returns the winner when the game has ended, otherwise nil. |
Examples
function Update()
local assigned = GetAssignedPlayer()
if not assigned then
return
end
local population = GetFact(Fact.POPULATION, 0)
local wood = GetAttribute(PlayerAttribute.WOOD)
if population < 60 and CanAfford(UnitObjectType.HOUSE, true) then
Log("Player " .. tostring(assigned:GetId()) .. " has " .. tostring(wood) .. " wood.")
end
end
function Render()
for i = 0, GetPlayerCount() - 1 do
local player = GetPlayerById(i)
if player and IsEnemyPlayer(player) then
for _, tc in ipairs(player:GetTownCenters()) do
RenderObjectBounds(tc, Color(255, 64, 64, 255), 2.0)
end
end
end
end
function Update()
local tile = GetMapTile(40, 40)
if not tile then
return
end
if tile:GetTileVisibility() == TileVisibility.VISIBLE then
Log(
"Tile 40,40 terrain=" .. tostring(tile:GetTerrain())
.. " elevation=" .. tostring(tile:GetElevation())
.. " objects=" .. tostring(tile:GetObjectCount())
)
end
end
function Update()
local path = CalculatePath(Vector3(20, 20, 0), Vector3(60, 60, 0), 0.5)
Log("Path waypoint count: " .. tostring(#path))
end
function Render()
for _, projectile in ipairs(GetAllProjectiles()) do
RenderObjectBounds(projectile, Color(255, 160, 64, 255), 1.0)
end
end
function Init()
for _, entry in ipairs(GetTechCost(Technology.LOOM)) do
if entry.resourceId == ResourceType.GOLD then
Log("Loom gold cost: " .. tostring(entry.amount))
end
end
end
function Init()
local villagerHp = GetObjectTypeAttribute(UnitObjectType.VILLAGER_MALE, ObjectAttribute.HITPOINTS, 0)
local villagerTrainTime = GetObjectTypeData(UnitObjectType.VILLAGER_MALE, ObjectData.CREATION_TIME)
Log("Villager HP=" .. tostring(villagerHp) .. ", train time=" .. tostring(villagerTrainTime))
end
Notes
- Use
GetAssignedPlayer(), notGetLocalPlayer(). GetAssignedPlayerId()is documented on the control page because it is bound under the engine section and is also available inLoad(playerId).GetObjectsByType,GetObjectsByTypes, andGetObjectsByClassscan world objects, not only the assigned player's objects. Loot-bearing dead huntables and livestock are included, and explored animals or resources can still be returned outside active vision.GetMapTile(position)floorsposition.xandposition.yto integer tile coordinates before resolving the tile.CalculatePath()uses the game's native pathfinding, acceptsVector3start and target positions, and returns an empty list when no path is available.GetObjectsInArea(pos1, pos2)uses the same object filter as the other scan APIs. Loot-bearing dead huntables and livestock are included, and fog-aware visibility still applies.GetTechCost()andGetObjectCost()return arrays of resource-cost entries. Useentry.resourceIdandentry.amount; numeric indexesentry[1]andentry[2]mirror the same values.GetAllChatMessages()andGetLastChatMessage()read from the game's current chat buffer.GetNewChatMessages()tracks unread chat state per module instance. On the first call after load or reload, it returns the currently visible buffer.- Projectile lookup functions return normal
Objectreferences whoseObjectTypeisObjectType.PROJECTILEand follow the same visibility restrictions as other object queries. - When Modules See Everything is disabled, object retrieval functions follow the assigned player's fog-of-war with one exception: explored animals and resources can still be returned. On those non-visible references, only
IsVisible(),IsExplored(),GetId(),GetPosition(),GetClass(), andGetUnitObjectType()are safe. - When Modules See Everything is disabled, player-state access through
GetPlayerById()is limited. Resource, fact, tech, and object-availability methods only expose the assigned player's data. GetAllMapTiles()returns the full map grid, butMapTilemethods only expose what the assigned player is currently allowed to know.GetMapTilesPtr()andGetObjectsPtr()return engine-owned buffers rebuilt on demand. The second return value is an element count, not a byte count.GetObjectsPtr()is dead-inclusive. Read the alive state from the snapshot flags instead of assuming every entry is alive.- The snapshot helpers are primarily intended for IPC / external ML readers that want to transfer compact RPM-friendly buffers. See the IPC page for the exact packed C++ layouts.
CanAfford(unitId, isBuilding)accepts both parameters in Lua, but the binding does not distinguish the second flag internally.