aissia/docs/01-architecture/behavior-composition-patterns.md
StillHammer ba42b6d9c7 Update CDC with hybrid architecture (WarFactory + multi-target)
- Add hybrid deployment modes: local_dev (MVP) and production_pwa (optional)
- Integrate WarFactory engine reuse with hot-reload 0.4ms
- Define multi-target compilation strategy (DLL/SO/WASM)
- Detail both deployment modes with cost analysis
- Add progressive roadmap: Phase 1 (local), Phase 2 (POC WASM), Phase 3 (cloud)
- Budget clarified: $10-20/mois (local) vs $13-25/mois (cloud)
- Document open questions for technical validation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-27 11:49:09 +08:00

8.8 KiB

Behavior Composition Patterns - Warfactory

Philosophy : Modules comportements combinables via configuration JSON pour AI flexibility

Point 46 : Behavior Composition Pattern

Concept Core

Modular Behaviors : Chaque comportement AI = module autonome combinable

// Base behavior interface
class IBehaviorModule : public IModule {
public:
    virtual json process(const json& context) = 0;
    virtual float getWeight() const = 0;
    virtual bool shouldActivate(const json& triggers) const = 0;
};

Behavior Module Examples

AggressiveBehavior Module

class AggressiveBehavior : public IBehaviorModule {
    json process(const json& context) override {
        auto enemy_detected = context["enemy_detected"].get<bool>();
        auto health = context["health"].get<float>();

        if (enemy_detected && health > 50.0f) {
            return {
                {"action", "attack"},
                {"priority", "high"},
                {"target_selection", "closest_enemy"}
            };
        }

        return {{"action", "patrol"}};
    }

    float getWeight() const override { return 0.8f; } // High aggression

    bool shouldActivate(const json& triggers) override {
        return triggers.contains("enemy_nearby") || triggers.contains("under_attack");
    }
};

CautiousBehavior Module

class CautiousBehavior : public IBehaviorModule {
    json process(const json& context) override {
        auto health = context["health"].get<float>();
        auto enemy_count = context["enemy_count"].get<int>();

        if (health < 30.0f || enemy_count > 2) {
            return {
                {"action", "retreat"},
                {"priority", "critical"},
                {"retreat_direction", "base"}
            };
        }

        return {{"action", "defensive_position"}};
    }

    float getWeight() const override { return 0.6f; } // Moderate caution

    bool shouldActivate(const json& triggers) override {
        return triggers.contains("low_health") || triggers.contains("outnumbered");
    }
};

EconomicBehavior Module

class EconomicBehavior : public IBehaviorModule {
    json process(const json& context) override {
        auto resources = context["resources"].get<int>();
        auto factory_status = context["factory_active"].get<bool>();

        if (resources < 100 && factory_status) {
            return {
                {"action", "gather_resources"},
                {"priority", "medium"},
                {"resource_type", "preferred"}
            };
        }

        return {{"action", "optimize_production"}};
    }

    float getWeight() const override { return 0.4f; } // Economic focus

    bool shouldActivate(const json& triggers) override {
        return triggers.contains("low_resources") || triggers.contains("economic_opportunity");
    }
};

Composition Engine

BehaviorCompositionEngine

class BehaviorCompositionEngine : public IModule {
private:
    std::map<std::string, std::unique_ptr<IBehaviorModule>> behaviors;
    json composition_config;

public:
    void initialize(const json& config) override {
        composition_config = config["behavior_composition"];

        // Load configured behavior modules
        for (const auto& behavior_name : composition_config["modules"]) {
            loadBehaviorModule(behavior_name);
        }
    }

    json process(const json& context) override {
        std::vector<json> behavior_outputs;
        std::vector<float> weights;

        // Process all active behaviors
        for (const auto& [name, behavior] : behaviors) {
            if (shouldActivateBehavior(name, context)) {
                auto output = behavior->process(context);
                behavior_outputs.push_back(output);
                weights.push_back(getBehaviorWeight(name));
            }
        }

        // Compose final decision
        return composeBehaviors(behavior_outputs, weights);
    }

private:
    bool shouldActivateBehavior(const std::string& name, const json& context) {
        auto triggers = extractTriggers(context);
        return behaviors[name]->shouldActivate(triggers);
    }

    float getBehaviorWeight(const std::string& name) {
        auto weights = composition_config["weights"];
        if (weights.contains(name)) {
            return weights[name].get<float>();
        }
        return behaviors[name]->getWeight();
    }

    json composeBehaviors(const std::vector<json>& outputs, const std::vector<float>& weights) {
        // Weighted decision composition
        json final_decision;
        float total_weight = 0.0f;

        // Calculate weighted priorities
        for (size_t i = 0; i < outputs.size(); ++i) {
            auto priority = getPriorityValue(outputs[i]["priority"]);
            auto weighted_priority = priority * weights[i];

            if (weighted_priority > total_weight) {
                final_decision = outputs[i];
                total_weight = weighted_priority;
            }
        }

        return final_decision;
    }
};

Configuration-Driven Composition

Example Configuration

{
  "behavior_composition": {
    "modules": ["aggressive", "cautious", "economic"],
    "weights": {
      "aggressive": 0.7,
      "cautious": 0.8,
      "economic": 0.3
    },
    "triggers": {
      "low_health": "switch_to_cautious",
      "enemy_nearby": "activate_aggressive",
      "low_resources": "activate_economic"
    },
    "priority_matrix": {
      "critical": 1.0,
      "high": 0.8,
      "medium": 0.5,
      "low": 0.2
    },
    "dynamic_weights": {
      "health_modifier": {
        "high_health": {"aggressive": 1.2, "cautious": 0.8},
        "low_health": {"aggressive": 0.3, "cautious": 1.5}
      }
    }
  }
}

Advanced Composition Features

{
  "behavior_composition": {
    "modules": ["aggressive", "cautious", "economic", "tactical"],
    "composition_strategy": "weighted_priority",
    "context_modifiers": {
      "time_of_day": {
        "night": {"cautious": 1.3, "aggressive": 0.7},
        "day": {"aggressive": 1.1, "tactical": 1.2}
      },
      "resource_level": {
        "abundant": {"economic": 0.5, "aggressive": 1.3},
        "scarce": {"economic": 1.5, "cautious": 1.2}
      }
    },
    "behavior_transitions": {
      "aggressive_to_cautious": {
        "trigger": "health < 25%",
        "transition_time": 2.0
      },
      "economic_to_aggressive": {
        "trigger": "resources > 500",
        "transition_time": 1.0
      }
    }
  }
}

Usage Examples

Tank AI Composition

{
  "tank_ai": {
    "modules": ["aggressive", "tactical", "survival"],
    "weights": {"aggressive": 0.8, "tactical": 0.9, "survival": 1.0},
    "context": "combat_heavy"
  }
}

Economic AI Composition

{
  "company_ai": {
    "modules": ["economic", "cautious", "opportunistic"],
    "weights": {"economic": 1.0, "cautious": 0.6, "opportunistic": 0.4},
    "context": "market_trading"
  }
}

Diplomatic AI Composition

{
  "diplomatic_ai": {
    "modules": ["cooperative", "strategic", "economic"],
    "weights": {"cooperative": 0.7, "strategic": 0.9, "economic": 0.5},
    "context": "international_relations"
  }
}

Architecture Benefits

Development Advantages

  • Module Reusability : Behaviors réutilisables entre différents AI agents
  • Easy Testing : Chaque behavior testable indépendamment
  • Claude-Friendly : Modules 200 lignes max, comprehensibles par IA
  • Hot-Reload : Modification behaviors sans restart système

Gameplay Advantages

  • AI Diversity : Combinations créent personnalités AI distinctes
  • Dynamic Adaptation : Behaviors s'adaptent selon context/triggers
  • Emergent Complexity : Interactions behaviors créent sophistication émergente
  • Player Customization : Players peuvent configurer AI allies

Performance Benefits

  • Selective Activation : Seuls behaviors pertinents s'activent
  • Lightweight Composition : JSON processing minimal overhead
  • Parallel Processing : Behaviors processables en parallèle
  • Efficient Caching : Composition results cachables

Implementation Strategy

Phase 1 : Core Behaviors

  • Implement basic behavior modules (Aggressive, Cautious, Economic)
  • Simple weighted composition
  • JSON configuration loading

Phase 2 : Advanced Composition

  • Context modifiers et dynamic weights
  • Behavior transitions
  • Priority matrices sophistiquées

Phase 3 : AI Personalities

  • Predefined personality templates
  • Player customization interface
  • Emergent behavior analysis