fix staged nation tax rate consumption

This commit is contained in:
2026-07-27 10:07:59 +00:00
parent de510da48e
commit 26e033665a
7 changed files with 118 additions and 49 deletions
+2 -3
View File
@@ -18,6 +18,7 @@ import {
import type { ScenarioConfig } from '@sammo-ts/logic';
import type { InMemoryTurnWorld, TurnCalendarHandler, TurnCalendarContext } from './inMemoryWorld.js';
import { resolveAppliedNationRate } from './nationTaxRate.js';
import type { TurnGeneral } from './types.js';
const resolveNumber = (source: Record<string, unknown>, keys: string[], fallback: number): number => {
@@ -30,8 +31,6 @@ const resolveNumber = (source: Record<string, unknown>, keys: string[], fallback
return fallback;
};
const resolveNationRate = (nation: Nation): number => asNumber(nation.meta.rate, 20);
const resolveNationBill = (nation: Nation): number => asNumber(nation.meta.bill, 100);
const resolveOfficerCity = (meta: Record<string, unknown>): number => {
@@ -72,7 +71,7 @@ const buildNationIncomeContext = (nation: Nation, trait: NationTraitModule | nul
? (type: TriggerNationalIncomeType, amount: number) => trait.onCalcNationalIncome!(actionContext, type, amount)
: undefined;
return {
rate: resolveNationRate(nation),
rate: resolveAppliedNationRate(nation.meta),
modifyIncome,
};
};
@@ -3,6 +3,7 @@ import { createIncomeActionContext, type NationTraitModule } from '@sammo-ts/log
import type { InMemoryTurnWorld } from './inMemoryWorld.js';
import type { MonthlyEventActionHandler } from './monthlyEventHandler.js';
import { resolveAppliedNationRate } from './nationTaxRate.js';
type SemiAnnualResource = 'gold' | 'rice';
@@ -21,8 +22,6 @@ const resolveBasePopulationIncrease = (world: InMemoryTurnWorld): number => {
return typeof value === 'number' && Number.isFinite(value) ? value : 5_000;
};
const resolveNationRate = (meta: Record<string, unknown>): number => asNumber(meta.rate, 20);
const decayDomesticValue = (value: number): number => roundLegacyIntegerColumn(value * 0.99);
const applyResourceMaintenance = (value: number, ratios: readonly [number, number][]): number => {
@@ -82,15 +81,11 @@ export const createProcessSemiAnnualHandler = (options: {
const basePopulationIncrease = resolveBasePopulationIncrease(world);
for (const nation of world.listNations()) {
const rate = resolveNationRate(nation.meta);
const rate = resolveAppliedNationRate(nation.meta);
let populationRatio = (30 - rate) / 200;
const trait = options.nationTraits?.get(nation.typeCode);
if (trait?.onCalcNationalIncome) {
populationRatio = trait.onCalcNationalIncome(
createIncomeActionContext(nation),
'pop',
populationRatio
);
populationRatio = trait.onCalcNationalIncome(createIncomeActionContext(nation), 'pop', populationRatio);
}
const genericRatio = (20 - rate) / 200;
const trustDiff = 20 - rate;
@@ -114,15 +109,9 @@ export const createProcessSemiAnnualHandler = (options: {
agriculture: roundLegacyIntegerColumn(
Math.min(city.agricultureMax, city.agriculture * (1 + genericRatio))
),
commerce: roundLegacyIntegerColumn(
Math.min(city.commerceMax, city.commerce * (1 + genericRatio))
),
security: roundLegacyIntegerColumn(
Math.min(city.securityMax, city.security * (1 + genericRatio))
),
defence: roundLegacyIntegerColumn(
Math.min(city.defenceMax, city.defence * (1 + genericRatio))
),
commerce: roundLegacyIntegerColumn(Math.min(city.commerceMax, city.commerce * (1 + genericRatio))),
security: roundLegacyIntegerColumn(Math.min(city.securityMax, city.security * (1 + genericRatio))),
defence: roundLegacyIntegerColumn(Math.min(city.defenceMax, city.defence * (1 + genericRatio))),
wall: roundLegacyIntegerColumn(Math.min(city.wallMax, city.wall * (1 + genericRatio))),
meta: {
...city.meta,
+11
View File
@@ -0,0 +1,11 @@
import { asNumber } from '@sammo-ts/common';
const DEFAULT_NATION_RATE = 20;
export const resolveAppliedNationRate = (meta: Record<string, unknown>): number => {
const stagedRate = meta.rate_tmp;
if (typeof stagedRate === 'number' && Number.isFinite(stagedRate)) {
return stagedRate;
}
return asNumber(meta.rate, DEFAULT_NATION_RATE);
};