Files
RPG_City_Maker_Reborn/settings.go
T

202 lines
5.9 KiB
Go
Raw Normal View History

package main
import (
"encoding/json"
"os"
"path/filepath"
"time"
)
2026-02-05 17:50:55 -06:00
// Settings holds all the user-configurable parameters for map generation.
type Settings struct {
2026-02-05 17:50:55 -06:00
// Terrain settings
Detail float64 `json:"detail"`
Roughness float64 `json:"roughness"`
Width int `json:"width"`
Height int `json:"height"`
// Water settings
Lakes int `json:"lakes"`
LakeSizeLower float64 `json:"lake_size_lower"`
LakeSizeUpper float64 `json:"lake_size_upper"`
LakeEdgeRoughness float64 `json:"lake_edge_roughness"`
2026-02-19 10:29:17 -06:00
LakeShape string `json:"lake_shape"`
Rivers int `json:"rivers"`
MinRiverWidth float64 `json:"min_river_width"`
MaxRiverWidth float64 `json:"max_river_width"`
RiverCurvyness float64 `json:"river_curvyness"`
RiverWidthVariability float64 `json:"river_width_variability"`
RiverEdgeRoughness float64 `json:"river_edge_roughness"`
2026-02-05 17:50:55 -06:00
// Tree settings
MinTreeSize float64 `json:"min_tree_size"`
MaxTreeSize float64 `json:"max_tree_size"`
TreeCoverage float64 `json:"tree_coverage"`
TreeClumpiness float64 `json:"tree_clumpiness"`
// Road settings
NumRoads int `json:"num_roads"`
MinRoadWidth float64 `json:"min_road_width"`
MaxRoadWidth float64 `json:"max_road_width"`
RoadExits int `json:"road_exits"`
RoadCurvyness float64 `json:"road_curvyness"`
RoadDistribution float64 `json:"road_distribution"`
// Building settings
2026-02-05 15:11:55 -06:00
NumBuildings int `json:"num_buildings"`
MinBuildingSize float64 `json:"min_building_size"`
MaxBuildingSize float64 `json:"max_building_size"`
BuildingDistribution float64 `json:"building_distribution"`
BuildingShape string `json:"building_shape"`
2026-02-05 17:50:55 -06:00
2026-02-06 09:01:09 -06:00
// Ratios for mixed building shapes
BuildingShapeRatios map[string]float64 `json:"building_shape_ratios"`
2026-02-06 10:21:40 -06:00
// Procedural building settings
MinBuildingComplexity int `json:"min_building_complexity"`
MaxBuildingComplexity int `json:"max_building_complexity"`
BuildingComplexityRatio float64 `json:"building_complexity_ratio"`
2026-02-05 17:50:55 -06:00
// General settings
Seed int64 `json:"seed"`
LastExportPath string `json:"last_export_path"`
2026-02-09 10:35:28 -06:00
ImageViewState int `json:"image_view_state"`
}
2026-02-05 17:50:55 -06:00
// Save saves the current settings to a JSON file in the user's config directory.
func (s *Settings) Save() error {
2026-02-05 17:50:55 -06:00
// Get the user's config directory
configDir, err := os.UserConfigDir()
if err != nil {
return err
}
2026-02-05 17:50:55 -06:00
// Create the application's config directory if it doesn't exist
appConfigDir := filepath.Join(configDir, "rpgcitymakerreborn")
if err := os.MkdirAll(appConfigDir, 0755); err != nil {
return err
}
2026-02-05 17:50:55 -06:00
// Create and open the settings file
configFile := filepath.Join(appConfigDir, "settings.json")
file, err := os.Create(configFile)
if err != nil {
return err
}
defer file.Close()
2026-02-05 17:50:55 -06:00
// Encode the settings as JSON and write to the file
encoder := json.NewEncoder(file)
return encoder.Encode(s)
}
2026-02-05 17:50:55 -06:00
// LoadSettings loads the settings from a JSON file in the user's config directory.
// If the file doesn't exist, it returns a default set of settings.
func LoadSettings() (*Settings, error) {
2026-02-05 17:50:55 -06:00
// Get the user's config directory
configDir, err := os.UserConfigDir()
if err != nil {
return nil, err
}
2026-02-05 17:50:55 -06:00
// Open the settings file
configFile := filepath.Join(configDir, "rpgcitymakerreborn", "settings.json")
file, err := os.Open(configFile)
if err != nil {
2026-02-05 17:50:55 -06:00
// If the file doesn't exist, return default settings
if os.IsNotExist(err) {
2026-02-02 12:24:14 -06:00
homeDir, err := os.UserHomeDir()
if err != nil {
homeDir = "."
}
return &Settings{
Detail: 1,
Roughness: 0,
Width: 300,
Height: 300,
Lakes: 0,
LakeSizeLower: 1,
LakeSizeUpper: 5,
LakeEdgeRoughness: 50,
2026-02-19 10:29:17 -06:00
LakeShape: "circle",
MinTreeSize: 5,
MaxTreeSize: 20,
TreeCoverage: 20,
TreeClumpiness: 50,
Seed: time.Now().UnixNano(),
Rivers: 0,
MinRiverWidth: 1,
MaxRiverWidth: 5,
RiverCurvyness: 50,
RiverWidthVariability: 50,
RiverEdgeRoughness: 50,
NumRoads: 100,
MinRoadWidth: 2,
MaxRoadWidth: 8,
RoadExits: 5,
RoadCurvyness: 50,
RoadDistribution: 50,
NumBuildings: 200,
MinBuildingSize: 10,
MaxBuildingSize: 30,
BuildingDistribution: 20,
BuildingShape: "mixed",
2026-02-06 09:01:09 -06:00
BuildingShapeRatios: map[string]float64{
"squares": 40,
"circles": 30,
"rectangles": 30,
},
2026-02-06 10:21:40 -06:00
MinBuildingComplexity: 1,
MaxBuildingComplexity: 3,
BuildingComplexityRatio: 50,
LastExportPath: homeDir,
2026-02-09 10:35:28 -06:00
ImageViewState: 0,
}, nil
}
return nil, err
}
defer file.Close()
2026-02-05 17:50:55 -06:00
// Decode the JSON data into a Settings struct
var settings Settings
decoder := json.NewDecoder(file)
if err := decoder.Decode(&settings); err != nil {
return nil, err
}
2026-02-02 12:24:14 -06:00
2026-02-19 10:29:17 -06:00
if settings.LakeShape == "" {
settings.LakeShape = "circle"
}
2026-02-06 09:01:09 -06:00
// Ensure BuildingShapeRatios is initialized
if settings.BuildingShapeRatios == nil {
settings.BuildingShapeRatios = map[string]float64{
"squares": 40,
"circles": 30,
"rectangles": 30,
}
}
2026-02-06 10:21:40 -06:00
// Ensure procedural building settings are initialized
if settings.MinBuildingComplexity == 0 {
settings.MinBuildingComplexity = 1
}
if settings.MaxBuildingComplexity == 0 {
settings.MaxBuildingComplexity = 3
}
if settings.BuildingComplexityRatio == 0 {
settings.BuildingComplexityRatio = 50
}
2026-02-05 17:50:55 -06:00
// Ensure LastExportPath is set to a default value if it's empty
2026-02-02 12:24:14 -06:00
if settings.LastExportPath == "" {
homeDir, err := os.UserHomeDir()
if err != nil {
homeDir = "."
}
settings.LastExportPath = homeDir
}
return &settings, nil
}