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> </textures>
</variant> </variant>
</group> </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> <material>player_trans_ao_parallax_spec.xml</material>
</actor> </actor>

View File

@ -11,5 +11,17 @@
</textures> </textures>
</variant> </variant>
</group> </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> <material>player_trans_parallax_spec.xml</material>
</actor> </actor>

View File

@ -9,5 +9,17 @@
</textures> </textures>
</variant> </variant>
</group> </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> <material>player_water.xml</material>
</actor> </actor>

View File

@ -11,5 +11,17 @@
</textures> </textures>
</variant> </variant>
</group> </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> <material>player_trans_parallax_spec.xml</material>
</actor> </actor>

View File

@ -12,5 +12,17 @@
</textures> </textures>
</variant> </variant>
</group> </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> <material>player_trans_ao_parallax_spec.xml</material>
</actor> </actor>

View File

@ -24,6 +24,18 @@
</props> </props>
</variant> </variant>
</group> </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> <group>
<variant name="alive" frequency="1"/> <variant name="alive" frequency="1"/>
<variant file="structures/destruction_medium.xml"> <variant file="structures/destruction_medium.xml">

View File

@ -19,6 +19,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="ungarrisoned" frequency="1"/> <variant name="ungarrisoned" frequency="1"/>
<variant name="garrisoned"> <variant name="garrisoned">

View File

@ -17,6 +17,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="ungarrisoned" frequency="1"/> <variant name="ungarrisoned" frequency="1"/>
<variant name="garrisoned"> <variant name="garrisoned">

View File

@ -16,6 +16,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="alive" frequency="1"/> <variant name="alive" frequency="1"/>
<variant file="structures/destruction_small.xml"/> <variant file="structures/destruction_small.xml"/>

View File

@ -18,6 +18,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="alive" frequency="1"/> <variant name="alive" frequency="1"/>
<variant file="structures/destruction_small.xml"> <variant file="structures/destruction_small.xml">

View File

@ -19,6 +19,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="ungarrisoned" frequency="1"/> <variant name="ungarrisoned" frequency="1"/>
<variant name="garrisoned"> <variant name="garrisoned">

View File

@ -24,6 +24,18 @@
</props> </props>
</variant> </variant>
</group> </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> <group>
<variant frequency="1" name="texture"> <variant frequency="1" name="texture">
<textures> <textures>

View File

@ -15,6 +15,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="alive" frequency="1"/> <variant name="alive" frequency="1"/>
<variant file="structures/destruction_small.xml"> <variant file="structures/destruction_small.xml">

View File

@ -18,6 +18,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="alive" frequency="1"/> <variant name="alive" frequency="1"/>
<variant file="structures/destruction_small.xml"> <variant file="structures/destruction_small.xml">

View File

@ -18,6 +18,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="alive" frequency="1"/> <variant name="alive" frequency="1"/>
<variant file="structures/destruction_medium.xml"> <variant file="structures/destruction_medium.xml">

View File

@ -18,6 +18,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant frequency="1" name="ungarrisoned"/> <variant frequency="1" name="ungarrisoned"/>
<variant name="garrisoned"> <variant name="garrisoned">

View File

@ -17,6 +17,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="alive" frequency="1"/> <variant name="alive" frequency="1"/>
<variant file="structures/destruction_small.xml"> <variant file="structures/destruction_small.xml">

View File

@ -22,6 +22,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="ungarrisoned" frequency="1"/> <variant name="ungarrisoned" frequency="1"/>
<variant name="garrisoned"> <variant name="garrisoned">

View File

@ -14,5 +14,17 @@
</textures> </textures>
</variant> </variant>
</group> </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> <material>no_trans_norm_spec.xml</material>
</actor> </actor>

View File

@ -18,6 +18,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="ungarrisoned" frequency="1"/> <variant name="ungarrisoned" frequency="1"/>
<variant name="garrisoned"> <variant name="garrisoned">

View File

@ -10,6 +10,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant frequency="1" name="gaul house a"> <variant frequency="1" name="gaul house a">
<mesh>structural/gaul_house_a.dae</mesh> <mesh>structural/gaul_house_a.dae</mesh>

View File

@ -18,6 +18,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant name="alive" frequency="1"/> <variant name="alive" frequency="1"/>
<variant file="structures/destruction_medium.xml"> <variant file="structures/destruction_medium.xml">

View File

@ -33,6 +33,18 @@
</textures> </textures>
</variant> </variant>
</group> </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> <group>
<variant frequency="1" name="ungarrisoned"/> <variant frequency="1" name="ungarrisoned"/>
<variant name="garrisoned"> <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); cmpRangeManager.ExploreMap(i);
} }
if (settings.Biome)
{
Engine.QueryInterface(SYSTEM_ENTITY, IID_BiomeManager)?.SetBiome(settings.Biome);
}
const cmpAIManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AIManager); const cmpAIManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AIManager);
for (let i = 0; i < settings.PlayerData.length; ++i) for (let i = 0; i < settings.PlayerData.length; ++i)
{ {

View File

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

View File

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

View File

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