Modding:Encounters and Population: Difference between revisions

From Caves of Qud Wiki
Jump to navigation Jump to search
m (code formatting; add cleanup template; minor editing)
imported>Teamtotobot
m (Teamtotobot moved page Modding: Encounters and Population to Modding/Encounters and Population: Bot: Moved page)
(No difference)

Revision as of 14:32, 22 September 2019

This article is a stub. You can help Caves of Qud Wiki by expanding it.
This article is a stub. You can help Caves of Qud Wiki by expanding it.

This page is about modding. See the modding overview for an abstract on modding.
This page is about modding. See the modding overview for an abstract on modding.

There are two primary population systems in Caves of Qud, the legacy EncounterTables.xml system, and the ZoneTemplates.xml+PopulationTables.xml system. Encounter tables are an older system and we prefer to use zone templates + population tables these days, but much of the game is still populated via EncounterTables.xml.

Like ObjectTables, EncounterTables.xml supports Load="Merge" in the object root tag. This will append entries to that particular table instead of overwriting.

Population tables currently do not support XML modding, but many zone template encounters draw objects from dynamically created population tables. Check out the following tags in ObjectBlueprints.xml to see them in use: DynamicObjectsTable, ExcludeFromDynamicEncounters. Some dynamic population tables are created based on the base type of the object, so new objects will begin appearing immediately in areas generated with dynamic population tables unless they are tagged with ExcludeFromDynamicEncounters.

The unaffiliated cave systems are the only areas currently heavily populated with the template+population system.

Extending Encounter Tables

You may add new entries to existing encounter tables by including EncounterTables.xml in your mod, using an existing table name and setting the Load="Merge" property on the encountertable tag.

Adding "My New Ammo" to the "Ammo 1" built-in encounter table

<encountertables>
  <encountertable Name="Ammo 1" Load="Merge">
    <objects>
      <object Chance="100" Number="3d6" Blueprint="My New Ammo"></object>
    </objects>
  </encountertable>
</encountertables>

Additional Info

This article may need cleanup to meet quality standards.
Please help improve this page by editing it.

Reason: "The information from the Steam thread needs to be integrated into this article."

This article may need cleanup to meet quality standards.
Please help improve this page by editing it.

Reason: "The information from the Steam thread needs to be integrated into this article."

Here's a thread on Steam where Brian discusses using encounter and population tables: http://steamcommunity.com/app/333640/discussions/3/358415738194955181/

Modifying Existing Populations

To modify existing populations, use PopulationManager.cs to load the changes on game boot up.

// Helper method to fudge into the most common/simple pop tables.
public static bool AddToPopTable(string table, params PopulationItem[] items) {
    PopulationInfo info;
    if (!PopulationManager.Populations.TryGetValue(table, out info))
        return false;
        
    // If this is a single group population, add to that group.
    if (info.Items.Count == 1 && info.Items[0] is PopulationGroup) { 
        var group = info.Items[0] as PopulationGroup;
        group.Items.AddRange(items);
        return true;
    }

    info.Items.AddRange(items);
    return true;
}

// Usage in IPart constructor slapped on dummy XML object
public class SomeInitialiser : IPart
{
    public SomeInitialiser() {
        AddToPopTable("RandomLiquid", new PopulationObject { Blueprint = "SomeLiquid" });
        AddToPopTable("RandomFaction", new PopulationObject { Blueprint = "SomeFaction" });
        AddToPopTable("LairOwners_Saltdunes", new PopulationTable { Name = "DynamicObjectsTable:SomeCreature", Weight = 5 });
    }
}