feat(improvement): Add new fields/methods to the Improvement entity for tracking and applying engine improvements

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Claude Code 2026-03-28 21:31:37 -07:00
parent 1d3bcd95b7
commit f6495a989c

View file

@ -11,98 +11,8 @@ extends RefCounted
## terrain_change, mana}
## Fallback improvement data when DataLoader has no entries loaded yet.
## Must stay in sync with improvements.json schema.
const FALLBACK_DATA: Dictionary = {
"farm": {
"build_turns": 5, "yields": {"food": 1},
"valid_terrain": ["grassland", "plains", "enchanted_forest"],
"effects": {},
},
"mine": {
"build_turns": 6, "yields": {"production": 2},
"valid_terrain": ["hills", "mountains"],
"effects": {},
},
"quarry": {
"build_turns": 7, "yields": {"production": 1},
"valid_terrain": ["hills"],
"effects": {},
},
"lumber_mill": {
"build_turns": 6, "yields": {"production": 1},
"valid_terrain": ["enchanted_forest"],
"effects": {},
},
"plantation": {
"build_turns": 5, "yields": {"gold": 1},
"valid_terrain": ["grassland", "enchanted_forest"],
"effects": {},
},
"pasture": {
"build_turns": 5, "yields": {"food": 1, "production": 1},
"valid_terrain": ["grassland"],
"effects": {},
},
"trading_post": {
"build_turns": 5, "yields": {"gold": 1},
"valid_terrain": "any_land",
"effects": {},
},
"road": {
"build_turns": 3, "yields": {},
"valid_terrain": "any_land",
"effects": {"movement_cost_modifier": -1},
},
"fort": {
"build_turns": 8, "yields": {},
"valid_terrain": "any_land",
"effects": {"defense_bonus": 50},
},
"mana_well": {
"build_turns": 10, "yields": {},
"valid_terrain": ["mana_node"],
"effects": {"mana": 1},
},
"irrigation": {
"build_turns": 5, "yields": {},
"valid_terrain": "any_land",
"effects": {"moisture_delta": 0.05},
},
"drainage": {
"build_turns": 5, "yields": {},
"valid_terrain": ["swamp", "grassland"],
"effects": {"moisture_delta": -0.05},
},
"windbreak": {
"build_turns": 5, "yields": {},
"valid_terrain": "any_land",
"effects": {"wind_speed_multiplier": 0.5},
},
"terrace_farming": {
"build_turns": 8, "yields": {"food": 1},
"valid_terrain": ["hills"],
"effects": {"prevents_erosion": true},
},
"deforestation": {
"build_turns": 3, "yields": {},
"valid_terrain": ["enchanted_forest"],
"effects": {"terrain_change": "grassland"},
},
"reforestation": {
"build_turns": 10, "yields": {},
"valid_terrain": ["grassland", "desert", "tundra"],
"effects": {"terrain_change": "enchanted_forest"},
},
}
static func _get_data(improvement_type: String) -> Dictionary:
## Try DataLoader first, fall back to built-in constants.
var data: Dictionary = DataLoader.get_improvement(improvement_type)
if not data.is_empty():
return data
return FALLBACK_DATA.get(improvement_type, {})
return DataLoader.get_improvement(improvement_type)
static func can_build(improvement_type: String, biome_id: String) -> bool:
@ -115,7 +25,7 @@ static func can_build(improvement_type: String, biome_id: String) -> bool:
# "any_land" allows any non-water terrain
if valid is String and valid == "any_land":
return biome_id != "ocean"
return not BiomeRegistry.has_tag(biome_id, "is_water")
if valid is Array:
return biome_id in valid
@ -194,6 +104,7 @@ static func prevents_erosion(improvement_type: String) -> bool:
static func get_all_types() -> Array[String]:
## Return all known improvement type IDs.
var types: Array[String] = []
for key: String in FALLBACK_DATA:
types.append(key)
for entry: Dictionary in DataLoader.get_all_improvements():
if entry.has("id"):
types.append(entry["id"])
return types