Senses stage 1: smell/touch capacities, organs, acuity + detectability genes
Foundation for the perception system. Adds Smell and Touch capacities (CapacityCalc dependency chain x consciousness) with organs on the Quadruped body (nose->Smell, skin->Touch; eyes/ears already give Sight/Hearing) so hediffs and organ damage reduce them for free. New genes: acuity GeneHearing/GeneSmell/GeneTouch (radius multipliers, default 1 if a species omits them) and detectability GeneCamouflage (lower sight), GeneScent (raise smell), GeneNoise (raise hearing) on AnimalPhenotype. Deer/wolf/boar/chicken get sensible values (wolf smells well, deer is alert + dappled). cap.smell/cap.touch localized. Build + --check-content clean (48 genes, 47 traits). Multi-sense detection + memory come next. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
dc617521c2
commit
70e79a5c30
@@ -23,6 +23,12 @@
|
|||||||
"GeneMoveSpeed": 1.2,
|
"GeneMoveSpeed": 1.2,
|
||||||
"GeneBloodVolume": 1.4,
|
"GeneBloodVolume": 1.4,
|
||||||
"GeneVision": 1.3,
|
"GeneVision": 1.3,
|
||||||
|
"GeneHearing": 1.4,
|
||||||
|
"GeneSmell": 1.2,
|
||||||
|
"GeneTouch": 1.0,
|
||||||
|
"GeneCamouflage": 0.35,
|
||||||
|
"GeneScent": 0.5,
|
||||||
|
"GeneNoise": 0.4,
|
||||||
"GeneBrainSize": 0.45,
|
"GeneBrainSize": 0.45,
|
||||||
"GeneInsulation": 0.55,
|
"GeneInsulation": 0.55,
|
||||||
"GeneFurColor": 0.45,
|
"GeneFurColor": 0.45,
|
||||||
@@ -59,6 +65,12 @@
|
|||||||
"GeneMoveSpeed": 1.4,
|
"GeneMoveSpeed": 1.4,
|
||||||
"GeneBloodVolume": 1.3,
|
"GeneBloodVolume": 1.3,
|
||||||
"GeneVision": 1.5,
|
"GeneVision": 1.5,
|
||||||
|
"GeneHearing": 1.5,
|
||||||
|
"GeneSmell": 1.8,
|
||||||
|
"GeneTouch": 1.0,
|
||||||
|
"GeneCamouflage": 0.2,
|
||||||
|
"GeneScent": 0.6,
|
||||||
|
"GeneNoise": 0.5,
|
||||||
"GeneBrainSize": 0.5,
|
"GeneBrainSize": 0.5,
|
||||||
"GeneInsulation": 0.6,
|
"GeneInsulation": 0.6,
|
||||||
"GeneFurColor": 0.7,
|
"GeneFurColor": 0.7,
|
||||||
@@ -93,6 +105,12 @@
|
|||||||
"GeneMoveSpeed": 1.0,
|
"GeneMoveSpeed": 1.0,
|
||||||
"GeneBloodVolume": 1.2,
|
"GeneBloodVolume": 1.2,
|
||||||
"GeneVision": 1.0,
|
"GeneVision": 1.0,
|
||||||
|
"GeneHearing": 1.2,
|
||||||
|
"GeneSmell": 1.6,
|
||||||
|
"GeneTouch": 1.0,
|
||||||
|
"GeneCamouflage": 0.2,
|
||||||
|
"GeneScent": 0.7,
|
||||||
|
"GeneNoise": 0.7,
|
||||||
"GeneBrainSize": 0.42,
|
"GeneBrainSize": 0.42,
|
||||||
"GeneInsulation": 0.5,
|
"GeneInsulation": 0.5,
|
||||||
"GeneFurColor": 0.85,
|
"GeneFurColor": 0.85,
|
||||||
@@ -126,6 +144,12 @@
|
|||||||
"GeneMoveSpeed": 0.9,
|
"GeneMoveSpeed": 0.9,
|
||||||
"GeneBloodVolume": 0.7,
|
"GeneBloodVolume": 0.7,
|
||||||
"GeneVision": 1.1,
|
"GeneVision": 1.1,
|
||||||
|
"GeneHearing": 1.0,
|
||||||
|
"GeneSmell": 0.6,
|
||||||
|
"GeneTouch": 1.0,
|
||||||
|
"GeneCamouflage": 0.2,
|
||||||
|
"GeneScent": 0.4,
|
||||||
|
"GeneNoise": 0.6,
|
||||||
"GeneBrainSize": 0.3,
|
"GeneBrainSize": 0.3,
|
||||||
"GeneInsulation": 0.45,
|
"GeneInsulation": 0.45,
|
||||||
"GeneFurColor": 0.6,
|
"GeneFurColor": 0.6,
|
||||||
|
|||||||
@@ -33,6 +33,10 @@
|
|||||||
"capacities": { "Hearing": 0.5 } },
|
"capacities": { "Hearing": 0.5 } },
|
||||||
{ "name": "earRight", "parent": "head", "coverage": 0.01, "maxHp": 8,
|
{ "name": "earRight", "parent": "head", "coverage": 0.01, "maxHp": 8,
|
||||||
"capacities": { "Hearing": 0.5 } },
|
"capacities": { "Hearing": 0.5 } },
|
||||||
|
{ "name": "nose", "parent": "head", "coverage": 0.01, "maxHp": 8,
|
||||||
|
"capacities": { "Smell": 1.0 } },
|
||||||
|
{ "name": "skin", "coverage": 0.05, "maxHp": 20,
|
||||||
|
"capacities": { "Touch": 1.0 } },
|
||||||
{ "name": "jaw", "parent": "head", "coverage": 0.02, "maxHp": 10,
|
{ "name": "jaw", "parent": "head", "coverage": 0.02, "maxHp": 10,
|
||||||
"capacities": { "Eating": 1.0, "Talking": 0.5 } },
|
"capacities": { "Eating": 1.0, "Talking": 0.5 } },
|
||||||
{ "name": "tongue", "parent": "head", "coverage": 0.01, "maxHp": 8,
|
{ "name": "tongue", "parent": "head", "coverage": 0.01, "maxHp": 8,
|
||||||
|
|||||||
@@ -18,6 +18,29 @@
|
|||||||
{ "defName": "GeneVision", "parent": "BaseNumericGene", "label": "gene.vision",
|
{ "defName": "GeneVision", "parent": "BaseNumericGene", "label": "gene.vision",
|
||||||
"default": 1.0, "min": 0.2, "max": 3.0, "tags": ["animal", "senses"],
|
"default": 1.0, "min": 0.2, "max": 3.0, "tags": ["animal", "senses"],
|
||||||
"effects": { "vision": "value" } },
|
"effects": { "vision": "value" } },
|
||||||
|
|
||||||
|
// --- Чувства (острота = множитель радиуса восприятия) и заметность (как видят/слышат/чуют ЭТУ особь) ---
|
||||||
|
// Острота работает вместе со способностью органа (глаза/уши/нос/кожа): ген × capacity × радиус чувства.
|
||||||
|
{ "defName": "GeneHearing", "parent": "BaseNumericGene", "label": "gene.hearing",
|
||||||
|
"default": 1.0, "min": 0.2, "max": 3.0, "tags": ["animal", "senses"],
|
||||||
|
"effects": { "hearing": "value" } },
|
||||||
|
{ "defName": "GeneSmell", "parent": "BaseNumericGene", "label": "gene.smell",
|
||||||
|
"default": 1.0, "min": 0.2, "max": 3.0, "tags": ["animal", "senses"],
|
||||||
|
"effects": { "smell": "value" } },
|
||||||
|
{ "defName": "GeneTouch", "parent": "BaseNumericGene", "label": "gene.touch",
|
||||||
|
"default": 1.0, "min": 0.2, "max": 3.0, "tags": ["animal", "senses"],
|
||||||
|
"effects": { "touch": "value" } },
|
||||||
|
// Заметность цели: камуфляж снижает обнаружение зрением (1−camouflage), запах повышает обонянием,
|
||||||
|
// шум при движении повышает обнаружение слухом. См. формулу радиуса в системе восприятия.
|
||||||
|
{ "defName": "GeneCamouflage", "parent": "BaseNumericGene", "label": "gene.camouflage",
|
||||||
|
"default": 0.0, "min": 0.0, "max": 1.0, "tags": ["animal", "stealth"],
|
||||||
|
"effects": { "camouflage": "value" } },
|
||||||
|
{ "defName": "GeneScent", "parent": "BaseNumericGene", "label": "gene.scent",
|
||||||
|
"default": 0.5, "min": 0.0, "max": 1.0, "tags": ["animal", "stealth"],
|
||||||
|
"effects": { "scent": "value" } },
|
||||||
|
{ "defName": "GeneNoise", "parent": "BaseNumericGene", "label": "gene.noise",
|
||||||
|
"default": 0.5, "min": 0.0, "max": 1.0, "tags": ["animal", "stealth"],
|
||||||
|
"effects": { "noise": "value" } },
|
||||||
{ "defName": "GeneBrainSize", "parent": "BaseNumericGene", "label": "gene.brainSize",
|
{ "defName": "GeneBrainSize", "parent": "BaseNumericGene", "label": "gene.brainSize",
|
||||||
"default": 0.45, "min": 0.0, "max": 1.0, "spread": 0.03, "tags": ["animal", "brain"],
|
"default": 0.45, "min": 0.0, "max": 1.0, "spread": 0.03, "tags": ["animal", "brain"],
|
||||||
"effects": { "brainSize": "value" } },
|
"effects": { "brainSize": "value" } },
|
||||||
|
|||||||
@@ -70,6 +70,8 @@
|
|||||||
"cap.moving": "moving",
|
"cap.moving": "moving",
|
||||||
"cap.sight": "sight",
|
"cap.sight": "sight",
|
||||||
"cap.hearing": "hearing",
|
"cap.hearing": "hearing",
|
||||||
|
"cap.smell": "smell",
|
||||||
|
"cap.touch": "touch",
|
||||||
"cap.talking": "talking",
|
"cap.talking": "talking",
|
||||||
"cap.eating": "eating",
|
"cap.eating": "eating",
|
||||||
"cap.breathing": "breathing",
|
"cap.breathing": "breathing",
|
||||||
|
|||||||
@@ -70,6 +70,8 @@
|
|||||||
"cap.moving": "движение",
|
"cap.moving": "движение",
|
||||||
"cap.sight": "зрение",
|
"cap.sight": "зрение",
|
||||||
"cap.hearing": "слух",
|
"cap.hearing": "слух",
|
||||||
|
"cap.smell": "обоняние",
|
||||||
|
"cap.touch": "осязание",
|
||||||
"cap.talking": "речь",
|
"cap.talking": "речь",
|
||||||
"cap.eating": "питание",
|
"cap.eating": "питание",
|
||||||
"cap.breathing": "дыхание",
|
"cap.breathing": "дыхание",
|
||||||
|
|||||||
@@ -27,6 +27,24 @@ public struct AnimalPhenotype
|
|||||||
/// <summary>Дальность зрения (множитель радиуса поиска).</summary>
|
/// <summary>Дальность зрения (множитель радиуса поиска).</summary>
|
||||||
public float Vision;
|
public float Vision;
|
||||||
|
|
||||||
|
/// <summary>Острота слуха (множитель радиуса).</summary>
|
||||||
|
public float Hearing;
|
||||||
|
|
||||||
|
/// <summary>Острота обоняния (множитель радиуса).</summary>
|
||||||
|
public float Smell;
|
||||||
|
|
||||||
|
/// <summary>Острота осязания (множитель радиуса; чувство ближнего контакта).</summary>
|
||||||
|
public float Touch;
|
||||||
|
|
||||||
|
/// <summary>Камуфляж [0..1] — снижает обнаружение этой особи зрением (заметность = 1−camouflage).</summary>
|
||||||
|
public float Camouflage;
|
||||||
|
|
||||||
|
/// <summary>Запах [0..1] — повышает обнаружение этой особи обонянием.</summary>
|
||||||
|
public float Scent;
|
||||||
|
|
||||||
|
/// <summary>Шумность [0..1] — повышает обнаружение этой особи слухом при движении.</summary>
|
||||||
|
public float Noise;
|
||||||
|
|
||||||
/// <summary>Размер мозга (0..1) — основа интеллекта.</summary>
|
/// <summary>Размер мозга (0..1) — основа интеллекта.</summary>
|
||||||
public float BrainSize;
|
public float BrainSize;
|
||||||
|
|
||||||
@@ -76,6 +94,8 @@ public struct AnimalPhenotype
|
|||||||
public static AnimalPhenotype FromTraits(IReadOnlyDictionary<string, float> traits)
|
public static AnimalPhenotype FromTraits(IReadOnlyDictionary<string, float> traits)
|
||||||
{
|
{
|
||||||
float T(string name) => traits.GetValueOrDefault(name);
|
float T(string name) => traits.GetValueOrDefault(name);
|
||||||
|
// Острота чувств по умолчанию 1 (вид без гена не «слепнет»); заметность — мягкие дефолты.
|
||||||
|
float Acuity(string name) => traits.TryGetValue(name, out var v) ? v : 1f;
|
||||||
return new AnimalPhenotype
|
return new AnimalPhenotype
|
||||||
{
|
{
|
||||||
BodySize = T("bodySize"),
|
BodySize = T("bodySize"),
|
||||||
@@ -83,6 +103,12 @@ public struct AnimalPhenotype
|
|||||||
MoveSpeed = T("moveSpeed"),
|
MoveSpeed = T("moveSpeed"),
|
||||||
BloodVolume = T("bloodVolume"),
|
BloodVolume = T("bloodVolume"),
|
||||||
Vision = T("vision"),
|
Vision = T("vision"),
|
||||||
|
Hearing = Acuity("hearing"),
|
||||||
|
Smell = Acuity("smell"),
|
||||||
|
Touch = Acuity("touch"),
|
||||||
|
Camouflage = T("camouflage"),
|
||||||
|
Scent = traits.GetValueOrDefault("scent", 0.5f),
|
||||||
|
Noise = traits.GetValueOrDefault("noise", 0.5f),
|
||||||
BrainSize = T("brainSize"),
|
BrainSize = T("brainSize"),
|
||||||
Insulation = T("insulation"),
|
Insulation = T("insulation"),
|
||||||
FurHue = T("furHue"),
|
FurHue = T("furHue"),
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ public static class AnimalCapacities
|
|||||||
public const string BloodFiltration = "BloodFiltration";
|
public const string BloodFiltration = "BloodFiltration";
|
||||||
public const string Sight = "Sight";
|
public const string Sight = "Sight";
|
||||||
public const string Hearing = "Hearing";
|
public const string Hearing = "Hearing";
|
||||||
|
public const string Smell = "Smell";
|
||||||
|
public const string Touch = "Touch";
|
||||||
public const string Talking = "Talking";
|
public const string Talking = "Talking";
|
||||||
public const string Eating = "Eating";
|
public const string Eating = "Eating";
|
||||||
public const string Digestion = "Digestion";
|
public const string Digestion = "Digestion";
|
||||||
@@ -23,6 +25,8 @@ public static class AnimalCapacities
|
|||||||
Moving,
|
Moving,
|
||||||
Sight,
|
Sight,
|
||||||
Hearing,
|
Hearing,
|
||||||
|
Smell,
|
||||||
|
Touch,
|
||||||
Talking,
|
Talking,
|
||||||
Eating,
|
Eating,
|
||||||
Breathing,
|
Breathing,
|
||||||
@@ -99,6 +103,8 @@ public static class CapacityCalc
|
|||||||
[AnimalCapacities.Moving] = Raw(AnimalCapacities.Moving) * cons * pump,
|
[AnimalCapacities.Moving] = Raw(AnimalCapacities.Moving) * cons * pump,
|
||||||
[AnimalCapacities.Sight] = Raw(AnimalCapacities.Sight) * cons,
|
[AnimalCapacities.Sight] = Raw(AnimalCapacities.Sight) * cons,
|
||||||
[AnimalCapacities.Hearing] = Raw(AnimalCapacities.Hearing) * cons,
|
[AnimalCapacities.Hearing] = Raw(AnimalCapacities.Hearing) * cons,
|
||||||
|
[AnimalCapacities.Smell] = Raw(AnimalCapacities.Smell) * cons,
|
||||||
|
[AnimalCapacities.Touch] = Raw(AnimalCapacities.Touch) * cons,
|
||||||
[AnimalCapacities.Talking] = Raw(AnimalCapacities.Talking) * cons,
|
[AnimalCapacities.Talking] = Raw(AnimalCapacities.Talking) * cons,
|
||||||
[AnimalCapacities.Eating] = Raw(AnimalCapacities.Eating) * cons,
|
[AnimalCapacities.Eating] = Raw(AnimalCapacities.Eating) * cons,
|
||||||
[AnimalCapacities.Digestion] = Raw(AnimalCapacities.Digestion) * pump,
|
[AnimalCapacities.Digestion] = Raw(AnimalCapacities.Digestion) * pump,
|
||||||
|
|||||||
Reference in New Issue
Block a user