Fix world generation interface architecture

- Simplify IWorldGenerationFunction interface (5 required + 4 optional methods)
- Remove over-engineered methods (getProducedData, getRequiredPreviousFunctions, canExecute)
- Correct execute() signature to match implementations: execute(WorldData&, PlanetaryCore&)
- Add UniversalRegionFusionFunctionAdapter wrapper for template compatibility
- Update all 8 Phase 0/1 functions to implement corrected interface
- Delete unnecessary AWorldGenerationFunction abstract class

Phase 0 (2/2): InitializeWorldTerrain, InitializePlanetaryCore
Phase 1 (6/6): MeteoriteImpact, ImpactEffects, PlanetaryDifferentiation,
               VolcanicRedistribution, Cooling, UniversalRegionFusion

All functions now properly inherit from IWorldGenerationFunction with
consistent configure/execute pattern.

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
StillHammer 2025-10-23 10:49:44 +08:00
parent 919b68afd0
commit 63a2d251ff
9 changed files with 229 additions and 50 deletions

View File

@ -1,6 +1,8 @@
#pragma once
#include "IWorldGenerationFunction.h"
#include "PlanetaryCore.h"
#include "WorldData.h"
#include "warfactory/IDataNode.h"
#include <vector>
@ -20,7 +22,7 @@ namespace warfactory {
*
* Process: Surface cools Energy accumulated Split between space loss and core transfer
*/
class CoolingPhaseFunction {
class CoolingPhaseFunction : public IWorldGenerationFunction {
private:
float surface_cooling_rate_per_cycle; // °C reduction per cycle for surface tiles (base rate)
float energy_to_core_ratio; // Fraction of accumulated energy transferred to core
@ -34,24 +36,18 @@ public:
CoolingPhaseFunction();
// ========================================
// CONFIGURATION
// IWorldGenerationFunction Implementation
// ========================================
/**
* @brief Configure cooling process from JSON parameters
* @param config_node JSON configuration containing gradual_cooling parameters
* Expected structure:
* {
* "surface_cooling_rate_per_cycle": 50,
* "energy_to_core_ratio": 0.3,
* "energy_to_space_ratio": 0.7,
* "minimum_surface_temperature": -273,
* "minimum_core_temperature": 1000,
* "optimal_cooling_core_temperature": 2000,
* "reference_surface_temperature": 1000
* }
*/
void configure(const IDataNode& config_node);
void configure(const IDataNode& config) override;
void execute(WorldData& world, PlanetaryCore& core) override;
std::string getStepName() const override;
bool isConfigured() const override;
void reset() override;
// ========================================
// CONFIGURATION (Advanced)
// ========================================
/**
* @brief Set surface cooling rate per geological cycle

View File

@ -1,10 +1,13 @@
#pragma once
#include <string>
#include <vector>
#include "warfactory/IDataNode.h"
class WorldData;
// Forward declarations
namespace warfactory {
class WorldData;
class PlanetaryCore;
}
namespace warfactory {
@ -13,34 +16,81 @@ namespace warfactory {
*
* Each function represents a specific operation like crater generation,
* volcanic activity, or meteorite impacts within a broader phase.
*
* PATTERN: Configure-Execute
* 1. configure(config) - Load parameters from JSON (called once)
* 2. execute(world, core) - Apply generation to world data (can be called multiple times)
* 3. reset() - Clear state for re-execution
*/
class IWorldGenerationFunction {
public:
virtual ~IWorldGenerationFunction() = default;
virtual std::string getFunctionName() const = 0;
/**
* @brief Configure the function with JSON parameters
* @param config Configuration node from Regular_world.json
*
* Called ONCE before execution to load all parameters.
*/
virtual void configure(const IDataNode& config) = 0;
virtual bool execute(WorldData& world, const IDataNode& config) = 0;
/**
* @brief Execute the generation function
* @param world World terrain data to modify
* @param core Planetary core data to modify
*
* Can be called multiple times after configuration.
* Modifies world terrain and/or planetary core based on function purpose.
*/
virtual void execute(WorldData& world, PlanetaryCore& core) = 0;
virtual bool canExecute(const WorldData& world) const = 0;
/**
* @brief Get the name of this generation step
* @return Step name matching Regular_world.json "name" field
*/
virtual std::string getStepName() const = 0;
virtual float getProgress() const = 0;
virtual bool isComplete() const = 0;
/**
* @brief Check if function has been properly configured
* @return True if configure() was called successfully
*/
virtual bool isConfigured() const = 0;
/**
* @brief Reset function state for re-execution
*
* Clears any internal state but keeps configuration.
* After reset(), configure() must be called again.
*/
virtual void reset() = 0;
virtual std::string getFunctionDescription() const = 0;
// ========================================
// OPTIONAL: Progress Tracking (for UI/debug)
// ========================================
virtual float getEstimatedDuration() const = 0;
/**
* @brief Get execution progress (optional - default implementation)
* @return Progress from 0.0 (not started) to 1.0 (complete)
*/
virtual float getProgress() const { return 0.0f; }
virtual std::vector<std::string> getRequiredPreviousFunctions() const = 0;
/**
* @brief Check if execution is complete (optional - default implementation)
* @return True if function finished execution
*/
virtual bool isComplete() const { return false; }
virtual std::vector<std::string> getProducedData() const = 0;
/**
* @brief Get human-readable description (optional - default implementation)
* @return Description of what this function does
*/
virtual std::string getFunctionDescription() const { return getStepName(); }
virtual int getFunctionOrder() const = 0;
virtual std::string getParentPhase() const = 0;
/**
* @brief Get parent phase name (optional - default implementation)
* @return Phase name from Regular_world.json
*/
virtual std::string getParentPhase() const { return "unknown"; }
};
} // namespace warfactory

View File

@ -32,7 +32,10 @@ private:
public:
ImpactEffectsApplicationFunction();
// Inherited from IWorldGenerationFunction
// ========================================
// IWorldGenerationFunction Implementation
// ========================================
void configure(const IDataNode& config) override;
void execute(WorldData& world, PlanetaryCore& core) override;
std::string getStepName() const override;

View File

@ -23,7 +23,10 @@ private:
public:
InitializePlanetaryCoreFunction();
// Inherited from IWorldGenerationFunction
// ========================================
// IWorldGenerationFunction Implementation
// ========================================
void configure(const IDataNode& config) override;
void execute(WorldData& world, PlanetaryCore& core) override;
std::string getStepName() const override;

View File

@ -22,7 +22,10 @@ private:
public:
InitializeWorldTerrainFunction();
// Inherited from IWorldGenerationFunction
// ========================================
// IWorldGenerationFunction Implementation
// ========================================
void configure(const IDataNode& config) override;
void execute(WorldData& world, PlanetaryCore& core) override;
std::string getStepName() const override;

View File

@ -35,7 +35,10 @@ private:
public:
MeteoriteImpactGenerationFunction();
// Inherited from IWorldGenerationFunction
// ========================================
// IWorldGenerationFunction Implementation
// ========================================
void configure(const IDataNode& config) override;
void execute(WorldData& world, PlanetaryCore& core) override;
std::string getStepName() const override;

View File

@ -1,6 +1,8 @@
#pragma once
#include "IWorldGenerationFunction.h"
#include "PlanetaryCore.h"
#include "WorldData.h"
#include "warfactory/IDataNode.h"
#include "warfactory/ResourceRegistry.h"
#include <unordered_map>
@ -23,7 +25,7 @@ namespace warfactory {
* Process operates over 100M year cycles during early planetary formation when
* core is still molten and gravitational sorting is active.
*/
class PlanetaryDifferentiationFunction {
class PlanetaryDifferentiationFunction : public IWorldGenerationFunction {
private:
float heavy_metal_threshold_density; // g/cm³ - threshold for heavy metal classification
float sinking_rate_per_cycle; // Fraction of heavy metals that sink per cycle
@ -42,20 +44,18 @@ public:
PlanetaryDifferentiationFunction();
// ========================================
// CONFIGURATION
// IWorldGenerationFunction Implementation
// ========================================
/**
* @brief Configure differentiation process from JSON parameters
* @param config_node JSON configuration containing heavy_metal_sinking parameters
* Expected structure:
* {
* "heavy_metal_threshold_density": 5.0,
* "sinking_rate_per_cycle": 0.7,
* "differentiation_efficiency": 1.0
* }
*/
void configure(const IDataNode& config_node);
void configure(const IDataNode& config) override;
void execute(WorldData& world, PlanetaryCore& core) override;
std::string getStepName() const override;
bool isConfigured() const override;
void reset() override;
// ========================================
// CONFIGURATION (Advanced)
// ========================================
/**
* @brief Set density threshold for heavy metal classification

View File

@ -0,0 +1,118 @@
#pragma once
#include "IWorldGenerationFunction.h"
#include "UniversalRegionFusionFunction.h"
#include "../WorldData.h"
#include "../PlanetaryCore.h"
#include "../TectonicRegion.h"
#include "../ClimateRegion.h"
namespace warfactory {
/**
* @brief Adapter wrapper for UniversalRegionFusionFunction template
*
* Since UniversalRegionFusionFunction is a template that operates on different
* region types, this adapter provides the standard IWorldGenerationFunction
* interface for integration into the world generation pipeline.
*
* The adapter manages separate fusion instances for each region type:
* - TectonicRegion (plate boundaries, continental drift)
* - ClimateRegion (weather patterns, climate zones)
* - Future region types can be added as needed
*/
class UniversalRegionFusionFunctionAdapter : public IWorldGenerationFunction {
private:
// Template instances for different region types
UniversalRegionFusionFunction<TectonicRegion> tectonic_fusion;
UniversalRegionFusionFunction<ClimateRegion> climate_fusion;
// Cycle duration for fusion calculations
double current_cycle_duration_years;
// Configuration state
bool configured;
public:
/**
* @brief Construct adapter with step name
*/
UniversalRegionFusionFunctionAdapter();
// ========================================
// IWorldGenerationFunction Implementation
// ========================================
/**
* @brief Configure all fusion instances with same parameters
* @param config Configuration node from Regular_world.json
*
* Expected structure:
* {
* "enabled": true,
* "radius_calculation": "natural_logarithm",
* "base_radius": 1.5,
* "mass_reference": 5.0,
* "fusion_threshold_percentage": 0.3,
* "use_largest_radius_for_threshold": true,
* "weighted_position_update": true,
* "mass_combination": "additive",
* "applies_to_all_region_types": true
* }
*/
void configure(const IDataNode& config) override;
/**
* @brief Execute fusion for all region types in the world
* @param world World data containing all region collections
* @param core Planetary core (not used by fusion, but required by interface)
*
* Applies fusion to:
* - Tectonic regions (continental plates, oceanic plates, volcanic zones)
* - Climate regions (weather cells, wind patterns, climate zones)
*/
void execute(WorldData& world, PlanetaryCore& core) override;
/**
* @brief Get the name of this generation step
* @return "universal_region_fusion"
*/
std::string getStepName() const override;
/**
* @brief Check if function has been properly configured
* @return True if configure() was called successfully
*/
bool isConfigured() const override;
/**
* @brief Reset all fusion instances
*
* Clears state and sets configured = false
*/
void reset() override;
private:
/**
* @brief Apply fusion to tectonic regions
* @param world World data to process
* @return Number of fusion operations performed
*/
int applyTectonicFusion(WorldData& world);
/**
* @brief Apply fusion to climate regions
* @param world World data to process
* @return Number of fusion operations performed
*/
int applyClimateFusion(WorldData& world);
/**
* @brief Extract cycle duration from configuration if present
* @param config Configuration node
* @return Cycle duration in years (default: 100 million)
*/
double extractCycleDuration(const IDataNode& config);
};
} // namespace warfactory

View File

@ -25,7 +25,10 @@ private:
public:
VolcanicRedistributionFunction();
// Inherited from IWorldGenerationFunction
// ========================================
// IWorldGenerationFunction Implementation
// ========================================
void configure(const IDataNode& config) override;
void execute(WorldData& world, PlanetaryCore& core) override;
std::string getStepName() const override;