feat(turn-processor): ✨ Enable floating-point precision in building effect calculations and add unit tests for fractional value handling
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
parent
6c6c546778
commit
43c896a94f
2 changed files with 36 additions and 2 deletions
|
|
@ -239,6 +239,18 @@ func _sum_city_building_effect(city: CityScript, effect_type: String) -> int:
|
|||
return total
|
||||
|
||||
|
||||
func _sum_city_building_effect_float(city: CityScript, effect_type: String) -> float:
|
||||
var total: float = 0.0
|
||||
for building_id: Variant in city.buildings:
|
||||
var bdata: Dictionary = DataLoader.get_building(str(building_id))
|
||||
if bdata.is_empty():
|
||||
continue
|
||||
for effect: Dictionary in bdata.get("effects", []):
|
||||
if effect.get("type", "") == effect_type:
|
||||
total += float(effect.get("value", 0))
|
||||
return total
|
||||
|
||||
|
||||
func _apply_building_bonuses(city: CityScript, building_id: String) -> void:
|
||||
var bdata: Dictionary = DataLoader.get_building(building_id)
|
||||
var effects: Array = bdata.get("effects", [])
|
||||
|
|
@ -348,7 +360,12 @@ func _process_economy(player: RefCounted, game_map: RefCounted) -> void: # Play
|
|||
var tile_json: String = BuildableHelperScript.build_tile_yields_json(c, game_map)
|
||||
var yields: Dictionary = c.get_yields(tile_json)
|
||||
var building_gold: int = _sum_city_building_effect(c, "gold")
|
||||
income += int(yields.get("gold", 0)) + building_gold
|
||||
var city_gold: int = int(yields.get("gold", 0)) + building_gold
|
||||
# Apply percentage bonuses (marketplace +25% = 0.25)
|
||||
var gold_pct: float = _sum_city_building_effect_float(c, "gold_percent")
|
||||
if gold_pct > 0.0:
|
||||
city_gold = int(float(city_gold) * (1.0 + gold_pct))
|
||||
income += city_gold
|
||||
# Golden Age: +20% gold income
|
||||
if player.golden_age_active:
|
||||
income = int(income * 1.2)
|
||||
|
|
|
|||
|
|
@ -239,6 +239,18 @@ func _sum_city_building_effect(city: CityScript, effect_type: String) -> int:
|
|||
return total
|
||||
|
||||
|
||||
func _sum_city_building_effect_float(city: CityScript, effect_type: String) -> float:
|
||||
var total: float = 0.0
|
||||
for building_id: Variant in city.buildings:
|
||||
var bdata: Dictionary = DataLoader.get_building(str(building_id))
|
||||
if bdata.is_empty():
|
||||
continue
|
||||
for effect: Dictionary in bdata.get("effects", []):
|
||||
if effect.get("type", "") == effect_type:
|
||||
total += float(effect.get("value", 0))
|
||||
return total
|
||||
|
||||
|
||||
func _apply_building_bonuses(city: CityScript, building_id: String) -> void:
|
||||
var bdata: Dictionary = DataLoader.get_building(building_id)
|
||||
var effects: Array = bdata.get("effects", [])
|
||||
|
|
@ -348,7 +360,12 @@ func _process_economy(player: RefCounted, game_map: RefCounted) -> void: # Play
|
|||
var tile_json: String = BuildableHelperScript.build_tile_yields_json(c, game_map)
|
||||
var yields: Dictionary = c.get_yields(tile_json)
|
||||
var building_gold: int = _sum_city_building_effect(c, "gold")
|
||||
income += int(yields.get("gold", 0)) + building_gold
|
||||
var city_gold: int = int(yields.get("gold", 0)) + building_gold
|
||||
# Apply percentage bonuses (marketplace +25% = 0.25)
|
||||
var gold_pct: float = _sum_city_building_effect_float(c, "gold_percent")
|
||||
if gold_pct > 0.0:
|
||||
city_gold = int(float(city_gold) * (1.0 + gold_pct))
|
||||
income += city_gold
|
||||
# Golden Age: +20% gold income
|
||||
if player.golden_age_active:
|
||||
income = int(income * 1.2)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue