Files
owniverse/world/owniverse/civilization_evolution.gd
T

48 lines
2.9 KiB
GDScript
Raw Normal View History

extends RefCounted
## Shared civilization coefficients and worship derived from float profiles.
const E = preload("res://world/owniverse/math/exact.gd")
const State = preload("res://world/owniverse/civilization_state.gd")
const ETHICS = State.ETHICS
const OPPOSITE = {"m": "l", "l": "m", "w": "d", "d": "w", "c": "b", "b": "c"}
# Cache the weighted float worship rate multiplied by the exact population.
static func worship(world, target: Dictionary, rules: Dictionary, physical: Dictionary = {}) -> Variant:
var result: Variant = 0
if physical.is_empty(): physical = world.ledger.physical_amounts(target)
for id in rules:
if not rules[id].worships: continue
var pop: Dictionary = State.normalize_profile(target.ethics.get(id, {}))
var coefficients: Dictionary = {}
for ethic in pop: coefficients[ethic] = rules[id].ethics[ethic].worship
var cached: Dictionary = world.ledger.worship_products.get(id, {})
var count: Variant = physical.get(id, 0)
if cached.is_empty() or not E.eq(cached.population, pop) or not E.eq(cached.coefficients, coefficients) or not E.eq(cached.count, count):
var worship_rate: float = 0.0
for ethic in pop: worship_rate += (0.0 + pop[ethic]) * E.approx(E.of(coefficients[ethic]))
cached = {"population": pop.duplicate(), "coefficients": coefficients, "count": count, "product": E.multiply(count, worship_rate)}
world.ledger.worship_products[id] = cached
result = E.add(result, cached.product)
return result
static func coefficients(world, rules: Dictionary, id: String, modifiers: Dictionary) -> Dictionary:
if not E.eq(world.ledger.civilization_modifiers, modifiers):
world.ledger.civilization_modifiers = modifiers.duplicate()
world.ledger.civilization_coefficients.clear()
var cached: Dictionary = world.ledger.civilization_coefficients.get(id, {})
var signature: String = ""
for ethic in ETHICS:
var row: Dictionary = rules[id].ethics[ethic]
signature += ethic + ":" + str(row.progress) + "," + str(row.degradation) + "," + str(row.war) + "," + str(row.colonization) + ";"
if not cached.is_empty() and cached.signature == signature: return cached.rates
var rates: Dictionary = {}
for ethic in rules[id].ethics:
var row: Dictionary = rules[id].ethics[ethic]
var p: float = maxf(0.0, E.approx(E.of(row.progress)) * E.approx(modifiers.progress))
var d: float = maxf(0.0, E.approx(E.of(row.degradation)) * E.approx(modifiers.degradation))
var scale: float = maxf(1.0, p + d)
rates[ethic] = {"pro": p / scale, "deg": d / scale,
"war": clampf(E.approx(E.of(row.war)) * E.approx(modifiers.war), 0.0, 1.0),
"col": clampf(E.approx(E.of(row.colonization)) * E.approx(modifiers.colonization), 0.0, 1.0)}
world.ledger.civilization_coefficients[id] = {"signature": signature, "rates": rates}
return rates