Merge main (gene system G1-G5, phases C-D) into the multiplayer branch
Main independently adopted the engine Core/Host split in G1, so the scene adaptations conflicted with identical changes here — resolved in main's favor (its scenes also carry the gene-driven world). Kept from this branch: BootScene's --connect path into MultiplayerScene, the buildAtlases switch in GameContent.Load (with the Task.Run lambda fix its optional parameter requires), net.* localization keys, and the Net/Server/Web projects in the solution. Program.cs now has both CLI modes: --check-content (main) and --connect (here). The engine pointer lands on d044caf, which linearly contains both lines of work. Verified on the merged tree: 366 engine tests pass, --check-content reports genes/traits intact, and a live --listen server replicates moving pawns to the probe. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
{
|
||||
"type": "Gene",
|
||||
// Организм-агностичные гены: каждый ген задаёт, как генерируются/мутируют аллели и как ген
|
||||
// вкладывается в признаки (effects: имя признака → формула; value — выраженное значение гена).
|
||||
// Этот набор покрывает измерения генома растения (его используют системы роста/жизненного цикла).
|
||||
"defs": [
|
||||
{ "defName": "BaseNumericGene", "abstract": true, "kind": "Numeric",
|
||||
"spread": 0.08, "mutationChance": 0.05, "mutationMagnitude": 0.12 },
|
||||
|
||||
{ "defName": "GeneOptimalLight", "parent": "BaseNumericGene", "label": "gene.optimalLight",
|
||||
"default": 0.6, "min": 0.0, "max": 1.0, "tags": ["environment", "light"],
|
||||
"effects": { "optimalLight": "value" } },
|
||||
{ "defName": "GeneLightTolerance", "parent": "BaseNumericGene", "label": "gene.lightTolerance",
|
||||
"default": 0.5, "min": 0.05, "max": 1.0, "tags": ["environment", "light"],
|
||||
"effects": { "lightTolerance": "value" } },
|
||||
{ "defName": "GeneOptimalTemperature", "parent": "BaseNumericGene", "label": "gene.optimalTemperature",
|
||||
"default": 14, "min": -20, "max": 45, "tags": ["environment", "temperature"],
|
||||
"effects": { "optimalTemperature": "value" } },
|
||||
{ "defName": "GeneTemperatureTolerance", "parent": "BaseNumericGene", "label": "gene.temperatureTolerance",
|
||||
"default": 16, "min": 2, "max": 40, "tags": ["environment", "temperature"],
|
||||
"effects": { "temperatureTolerance": "value" } },
|
||||
{ "defName": "GeneOptimalFertility", "parent": "BaseNumericGene", "label": "gene.optimalFertility",
|
||||
"default": 1.4, "min": 0.1, "max": 3.0, "tags": ["environment", "soil"],
|
||||
"effects": { "optimalFertility": "value" } },
|
||||
{ "defName": "GeneFertilityTolerance", "parent": "BaseNumericGene", "label": "gene.fertilityTolerance",
|
||||
"default": 0.9, "min": 0.1, "max": 3.0, "tags": ["environment", "soil"],
|
||||
"effects": { "fertilityTolerance": "value" } },
|
||||
|
||||
{ "defName": "GeneVigor", "parent": "BaseNumericGene", "label": "gene.vigor",
|
||||
"default": 1.0, "min": 0.1, "max": 3.0, "tags": ["growth"],
|
||||
"effects": { "vigor": "value" } },
|
||||
{ "defName": "GeneLifespan", "parent": "BaseNumericGene", "label": "gene.lifespan",
|
||||
"default": 160, "min": 5, "max": 500, "tags": ["lifecycle"],
|
||||
"effects": { "lifespan": "value" } },
|
||||
{ "defName": "GeneDispersalRange", "parent": "BaseNumericGene", "label": "gene.dispersalRange",
|
||||
"default": 2, "min": 1, "max": 8, "tags": ["lifecycle", "reproduction"],
|
||||
"effects": { "dispersalRange": "value" } },
|
||||
{ "defName": "GeneReproduceInterval", "parent": "BaseNumericGene", "label": "gene.reproduceInterval",
|
||||
"default": 14, "min": 1, "max": 60, "tags": ["lifecycle", "reproduction"],
|
||||
"effects": { "reproduceInterval": "value" } },
|
||||
{ "defName": "GeneSelfPollination", "parent": "BaseNumericGene", "label": "gene.selfPollination",
|
||||
"default": 0.2, "min": 0.0, "max": 1.0, "tags": ["reproduction"],
|
||||
"effects": { "selfPollination": "value" } },
|
||||
{ "defName": "GeneMutationRate", "parent": "BaseNumericGene", "label": "gene.mutationRate",
|
||||
"default": 0.05, "min": 0.0, "max": 1.0, "tags": ["reproduction"],
|
||||
"effects": { "mutationRate": "value" } },
|
||||
|
||||
// --- Контент (фаза G4): плодоношение, добыча, цвет ---
|
||||
{ "defName": "GeneFruitYield", "parent": "BaseNumericGene", "label": "gene.fruitYield",
|
||||
"default": 0, "min": 0, "max": 12, "tags": ["fruiting"],
|
||||
"effects": { "fruitYield": "value" } },
|
||||
{ "defName": "GeneFruitSeason", "parent": "BaseNumericGene", "label": "gene.fruitSeason",
|
||||
"default": 1, "min": 0, "max": 3, "spread": 0, "mutationChance": 0, "tags": ["fruiting"],
|
||||
"effects": { "fruitSeason": "value" } },
|
||||
{ "defName": "GeneHarvestAmount", "parent": "BaseNumericGene", "label": "gene.harvestAmount",
|
||||
"default": 1, "min": 0, "max": 50, "tags": ["harvest"],
|
||||
"effects": { "harvestAmount": "value" } },
|
||||
{ "defName": "GeneLeafHue", "parent": "BaseNumericGene", "label": "gene.leafHue",
|
||||
"default": 0.33, "min": 0, "max": 1, "spread": 0.04, "tags": ["morphology", "color"],
|
||||
"effects": { "leafHue": "value" } },
|
||||
|
||||
// Производный ген: признак собирается группировкой по регэкспу — сумма всех генов-толерантностей
|
||||
// (демонстрация gsom-функций фазы G5). Собственное значение гена не используется.
|
||||
{ "defName": "GeneHardiness", "parent": "BaseNumericGene", "label": "gene.hardiness",
|
||||
"default": 0, "min": 0, "max": 1, "spread": 0, "mutationChance": 0, "tags": ["derived"],
|
||||
"effects": { "hardiness": "gsum('Gene.*Tolerance')" } },
|
||||
|
||||
// Дискретный ген морфы: вариант 0 доминирует, 1 (рецессивный) виден только в гомозиготе.
|
||||
{ "defName": "GeneMorph", "kind": "Discrete", "label": "gene.morph",
|
||||
"variants": 2, "variantWeights": [0.82, 0.18], "mutationChance": 0.05, "tags": ["morphology"],
|
||||
"effects": { "variant": "value" } }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"type": "Patch",
|
||||
// Контент-патчи (фаза G5): применяются ко всем дефам типа defType, чьё имя подходит под regex match,
|
||||
// проставляя поля set. Демонстрация: даём кустам древесину при сборе (веточки).
|
||||
"patches": [
|
||||
{ "defType": "Plant", "match": "Bush.*", "set": { "harvestProduct": "ProductWood" } }
|
||||
]
|
||||
}
|
||||
@@ -2,8 +2,12 @@
|
||||
"type": "Plant",
|
||||
"defs": [
|
||||
{ "defName": "BaseTree", "abstract": true, "sizeCells": 2.0, "trunkRadiusCells": 0.28,
|
||||
"harvestProduct": "ProductWood", "fruitProduct": "ProductAcorn",
|
||||
"genome": { "optimalLight": 0.6, "lightTolerance": 0.5, "optimalTemperature": 14, "temperatureTolerance": 16,
|
||||
"optimalFertility": 1.4, "fertilityTolerance": 0.9, "vigor": 1.0, "spread": 0.08 },
|
||||
"optimalFertility": 1.4, "fertilityTolerance": 0.9, "vigor": 1.0,
|
||||
"lifespan": 160, "dispersalRange": 2, "reproduceInterval": 14, "selfPollination": 0.2,
|
||||
"mutationRate": 0.05, "variantChance": 0.15, "spread": 0.08,
|
||||
"fruitYield": 5, "fruitSeason": 2, "harvestAmount": 10, "leafHue": 0.30 },
|
||||
"stages": [
|
||||
{ "texture": "things/plant/seed_default", "sizeCells": 0.6, "growDays": 4, "label": "plant.stage.seedling" },
|
||||
{ "sizeCells": 1.2, "growDays": 9, "label": "plant.stage.sapling" },
|
||||
@@ -15,16 +19,24 @@
|
||||
{ "defName": "TreeGrayPineA", "parent": "BaseTree", "label": "plant.pine", "texture": "things/plant/treegraypine/TreeGrayPineA" },
|
||||
|
||||
{ "defName": "GrassA", "label": "plant.grass", "texture": "things/plant/grass/grassa", "sizeCells": 1.2,
|
||||
"harvestProduct": "ProductGrass",
|
||||
"genome": { "optimalLight": 0.85, "lightTolerance": 0.35, "optimalTemperature": 20, "temperatureTolerance": 12,
|
||||
"optimalFertility": 1.0, "fertilityTolerance": 1.0, "vigor": 1.3, "spread": 0.1 },
|
||||
"optimalFertility": 1.0, "fertilityTolerance": 1.0, "vigor": 1.3,
|
||||
"lifespan": 22, "dispersalRange": 3, "reproduceInterval": 3, "selfPollination": 0.8,
|
||||
"mutationRate": 0.06, "variantChance": 0.2, "spread": 0.1,
|
||||
"harvestAmount": 2, "leafHue": 0.36 },
|
||||
"stages": [
|
||||
{ "texture": "things/plant/seed_default", "sizeCells": 0.5, "growDays": 2, "label": "plant.stage.sprout" },
|
||||
{ "sizeCells": 1.2, "label": "plant.stage.mature" }
|
||||
] },
|
||||
|
||||
{ "defName": "BaseBush", "abstract": true, "label": "plant.bush", "sizeCells": 1.4,
|
||||
"fruitProduct": "ProductBerry",
|
||||
"genome": { "optimalLight": 0.6, "lightTolerance": 0.5, "optimalTemperature": 17, "temperatureTolerance": 13,
|
||||
"optimalFertility": 1.1, "fertilityTolerance": 1.0, "vigor": 1.0, "spread": 0.1 },
|
||||
"optimalFertility": 1.1, "fertilityTolerance": 1.0, "vigor": 1.0,
|
||||
"lifespan": 60, "dispersalRange": 2, "reproduceInterval": 7, "selfPollination": 0.5,
|
||||
"mutationRate": 0.05, "variantChance": 0.18, "spread": 0.1,
|
||||
"fruitYield": 3, "fruitSeason": 1, "harvestAmount": 3, "leafHue": 0.32 },
|
||||
"stages": [
|
||||
{ "texture": "things/plant/seed_default", "sizeCells": 0.6, "growDays": 3, "label": "plant.stage.sprout" },
|
||||
{ "sizeCells": 1.4, "label": "plant.stage.mature" }
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"type": "Product",
|
||||
// Продукты сбора/плодоношения растений. На них ссылаются PlantDef.harvestProduct / fruitProduct;
|
||||
// количество задаётся генами (harvestAmount / fruitYield).
|
||||
"defs": [
|
||||
{ "defName": "ProductWood", "label": "product.wood", "kind": "material" },
|
||||
{ "defName": "ProductGrass", "label": "product.grass", "kind": "material" },
|
||||
{ "defName": "ProductBerry", "label": "product.berry", "kind": "food" },
|
||||
{ "defName": "ProductAcorn", "label": "product.acorn", "kind": "food" }
|
||||
]
|
||||
}
|
||||
@@ -17,6 +17,6 @@
|
||||
{ "chance": 0.35, "options": ["TreeOakA", "TreeOakB", "TreeBirchA", "TreeGrayPineA"] }
|
||||
] },
|
||||
{ "defName": "Mountain", "label": "terrain.mountain", "maxHeight": 1.01, "color": [136, 132, 128],
|
||||
"surface": "terrain/surfaces/roughhewnrock", "fertility": 0.2 }
|
||||
"surface": "terrain/surfaces/roughhewnrock", "fertility": 0.2, "blocksLight": true }
|
||||
]
|
||||
}
|
||||
|
||||
@@ -67,6 +67,10 @@
|
||||
"plant.stage.sprout": "sprout",
|
||||
"plant.stage.sapling": "sapling",
|
||||
"plant.stage.mature": "mature",
|
||||
"product.wood": "wood",
|
||||
"product.grass": "grass",
|
||||
"product.berry": "berries",
|
||||
"product.acorn": "acorn",
|
||||
"pawn.being": "being",
|
||||
"pawn.bear": "bear",
|
||||
"pawn.deer": "deer",
|
||||
|
||||
@@ -67,6 +67,10 @@
|
||||
"plant.stage.sprout": "всходы",
|
||||
"plant.stage.sapling": "саженец",
|
||||
"plant.stage.mature": "взрослое",
|
||||
"product.wood": "древесина",
|
||||
"product.grass": "трава",
|
||||
"product.berry": "ягоды",
|
||||
"product.acorn": "жёлудь",
|
||||
"pawn.being": "житель",
|
||||
"pawn.bear": "медведь",
|
||||
"pawn.deer": "олень",
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
|
||||
<SkinSet>
|
||||
|
||||
<lifeStage>
|
||||
<appliesToAll>true</appliesToAll>
|
||||
<variants>
|
||||
@@ -9,24 +8,21 @@
|
||||
<commonality>0</commonality>
|
||||
<texName>GuineaPig</texName>
|
||||
</skin>
|
||||
|
||||
|
||||
<skin>
|
||||
<commonality>0.4</commonality>
|
||||
<texName>GuineaPig1</texName>
|
||||
</skin>
|
||||
|
||||
|
||||
<skin>
|
||||
<commonality>0.4</commonality>
|
||||
<texName>GuineaPig2</texName>
|
||||
</skin>
|
||||
|
||||
|
||||
<skin>
|
||||
<commonality>0.4</commonality>
|
||||
<texName>GuineaPig3</texName>
|
||||
</skin>
|
||||
|
||||
|
||||
</variants>
|
||||
</variants>
|
||||
</lifeStage>
|
||||
|
||||
</SkinSet>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
|
||||
<SkinSet>
|
||||
|
||||
<lifeStage>
|
||||
<appliesToAll>true</appliesToAll>
|
||||
<variants>
|
||||
@@ -9,38 +8,36 @@
|
||||
<commonality>0.12</commonality>
|
||||
<texName>Horse</texName>
|
||||
</skin>
|
||||
|
||||
|
||||
<skin>
|
||||
<commonality>0.25</commonality>
|
||||
<texName>Horse1</texName>
|
||||
</skin>
|
||||
|
||||
|
||||
<skin>
|
||||
<commonality>0.4</commonality>
|
||||
<texName>Horse2</texName>
|
||||
</skin>
|
||||
|
||||
|
||||
<skin>
|
||||
<commonality>0.4</commonality>
|
||||
<texName>Horse3</texName>
|
||||
</skin>
|
||||
|
||||
|
||||
<skin>
|
||||
<commonality>0.4</commonality>
|
||||
<texName>Horse4</texName>
|
||||
</skin>
|
||||
|
||||
|
||||
<skin>
|
||||
<commonality>0.35</commonality>
|
||||
<texName>Horse5</texName>
|
||||
</skin>
|
||||
|
||||
|
||||
<skin>
|
||||
<commonality>0.25</commonality>
|
||||
<texName>Horse6</texName>
|
||||
</skin>
|
||||
|
||||
</variants>
|
||||
</variants>
|
||||
</lifeStage>
|
||||
|
||||
</SkinSet>
|
||||
|
||||
Reference in New Issue
Block a user