1
0
forked from 0ad/0ad

🎨 Allow buildings to adapt to their map

This commit is contained in:
Stan 2024-09-22 18:35:32 +02:00
parent 9c72741e69
commit 30d57d114c
32 changed files with 456 additions and 37 deletions

View File

@ -12,5 +12,17 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<material>player_trans_ao_parallax_spec.xml</material>
</actor>

View File

@ -11,5 +11,17 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<material>player_trans_parallax_spec.xml</material>
</actor>

View File

@ -9,5 +9,17 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<material>player_water.xml</material>
</actor>

View File

@ -11,5 +11,17 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<material>player_trans_parallax_spec.xml</material>
</actor>

View File

@ -12,5 +12,17 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<material>player_trans_ao_parallax_spec.xml</material>
</actor>

View File

@ -24,6 +24,18 @@
</props>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="alive" frequency="1"/>
<variant file="structures/destruction_medium.xml">

View File

@ -19,6 +19,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="ungarrisoned" frequency="1"/>
<variant name="garrisoned">

View File

@ -17,6 +17,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="ungarrisoned" frequency="1"/>
<variant name="garrisoned">

View File

@ -16,6 +16,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="alive" frequency="1"/>
<variant file="structures/destruction_small.xml"/>

View File

@ -18,6 +18,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="alive" frequency="1"/>
<variant file="structures/destruction_small.xml">

View File

@ -19,6 +19,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="ungarrisoned" frequency="1"/>
<variant name="garrisoned">

View File

@ -24,6 +24,18 @@
</props>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant frequency="1" name="texture">
<textures>

View File

@ -15,6 +15,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="alive" frequency="1"/>
<variant file="structures/destruction_small.xml">

View File

@ -18,6 +18,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="alive" frequency="1"/>
<variant file="structures/destruction_small.xml">

View File

@ -18,6 +18,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="alive" frequency="1"/>
<variant file="structures/destruction_medium.xml">

View File

@ -18,6 +18,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant frequency="1" name="ungarrisoned"/>
<variant name="garrisoned">

View File

@ -17,6 +17,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="alive" frequency="1"/>
<variant file="structures/destruction_small.xml">

View File

@ -22,6 +22,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="ungarrisoned" frequency="1"/>
<variant name="garrisoned">

View File

@ -14,5 +14,17 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<material>no_trans_norm_spec.xml</material>
</actor>

View File

@ -18,6 +18,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="ungarrisoned" frequency="1"/>
<variant name="garrisoned">

View File

@ -10,6 +10,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant frequency="1" name="gaul house a">
<mesh>structural/gaul_house_a.dae</mesh>

View File

@ -18,6 +18,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant name="alive" frequency="1"/>
<variant file="structures/destruction_medium.xml">

View File

@ -33,6 +33,18 @@
</textures>
</variant>
</group>
<group>
<variant name="summer" frequency="1">
<textures>
<texture file="structural/celt_struct_1.dds" name="baseTex"/>
</textures>
</variant>
<variant name="winter" frequency="0">
<textures>
<texture file="structural/celt_struct_1_snow.dds" name="baseTex"/>
</textures>
</variant>
</group>
<group>
<variant frequency="1" name="ungarrisoned"/>
<variant name="garrisoned">

Binary file not shown.

View File

@ -0,0 +1,43 @@
/**
* A manager class for biomes.
* @class
* @constructor
*/
function BiomeManager() {}
/**
* Defines the XML schema and help strings of the manager.
* @memberof BiomeManager
*/
BiomeManager.prototype.Schema =
"<a:component type='system'/><empty/>";
/**
* Initializes the current map's biome.
* @memberof BiomeManager
*/
BiomeManager.prototype.Init = function()
{
this.biome = "";
}
/**
* Sets the current map's biome.
* @param {string} biome - The new biome.
* @memberof BiomeManager
*/
BiomeManager.prototype.SetBiome = function(biome)
{
this.biome = biome;
}
/**
* Returns the current map's biome.
* @memberof BiomeManager
*/
BiomeManager.prototype.GetBiome = function()
{
return this.biome;
}
Engine.RegisterSystemComponentType(IID_BiomeManager, "BiomeManager", BiomeManager);

View File

@ -0,0 +1,83 @@
/**
* A manager class for biomes.
* @class
* @constructor
*/
function BiomeReplacer() {}
/**
* Defines the XML schema and help strings of the component.
* @memberof BiomeReplacer
*/
BiomeReplacer.prototype.Schema = `
<a:help>Defines the variants an entity can assume depending on a map biome.</a:help>
<a:example>
<Variants>
<Winter>
<AffectedBiomes datatype="tokens">generic/alpine</AffectedBiomes>
<ActorVariant>winter</ActorVariant>
</Winter>
</Variants>
</a:example>
<element name='Variants' a:help='Effect for having multiple builders.'>
<oneOrMore>
<element a:help='Element containing the variant data.'>
<anyName/>
<interleave>
<element name='AffectedBiomes' a:help='Names of the biomes affected byt this variant'>
<attribute name='datatype'>
<value>tokens</value>
</attribute>
<text/>
</element>
<element name='ActorVariant' a:help='Actor variant to switch to.'>
<text/>
</element>
</interleave>
</element>
</oneOrMore>
</element>`;
/**
* Initializes the biome replacer.
* @memberof BiomeReplacer
*/
BiomeReplacer.prototype.Init = function()
{
}
/**
* @param {{ "from": number, "to": number }} msg - Message containing the old new owner.
* @memberof BiomeReplacer
*/
BiomeReplacer.prototype.OnCreate = function(msg)
{
const currentBiome = Engine.QueryInterface(SYSTEM_ENTITY, IID_BiomeManager)?.GetBiome();
if (!currentBiome)
return;
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (!cmpVisual)
return;
for (const variantName of Object.keys(this.template.Variants))
{
const variant = this.template.Variants[variantName];
if (!variant.AffectedBiomes || !variant.AffectedBiomes._string)
continue;
const affectedBiomes = variant.AffectedBiomes._string.split(" ");
if (affectedBiomes.indexOf(currentBiome) !== -1)
{
cmpVisual.SelectAnimation(variant.ActorVariant, false, 1.0);
return;
}
}
};
Engine.RegisterComponentType(IID_BiomeReplacer, "BiomeReplacer", BiomeReplacer);

View File

@ -0,0 +1 @@
Engine.RegisterInterface("BiomeManager");

View File

@ -0,0 +1 @@
Engine.RegisterInterface("BiomeReplacer");

View File

@ -41,6 +41,11 @@ function InitGame(settings)
cmpRangeManager.ExploreMap(i);
}
if (settings.Biome)
{
Engine.QueryInterface(SYSTEM_ENTITY, IID_BiomeManager)?.SetBiome(settings.Biome);
}
const cmpAIManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AIManager);
for (let i = 0; i < settings.PlayerData.length; ++i)
{

View File

@ -5,4 +5,5 @@
<Ownership merge=""/>
<Position merge=""/>
<VisualActor merge=""/>
<BiomeReplacer merge=""/>
</Entity>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity filtered="">
<BiomeReplacer merge=""/>
<!-- We only want to include components which are necessary (for the visual previewing of an entity)
and safe (i.e. won't do anything that affects the synchronised simulation state), so additions
to this list should be carefully considered -->

View File

@ -1,5 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_structure_civic_house">
<BiomeReplacer>
<Variants>
<Winter>
<AffectedBiomes datatype="tokens">generic/alpine</AffectedBiomes>
<ActorVariant>winter</ActorVariant>
</Winter>
</Variants>
</BiomeReplacer>
<Identity>
<Civ>gaul</Civ>
<SpecificName>Tegia</SpecificName>