This commit is contained in:
33333-33333 2026-09-16 20:53:17 +09:00
commit 8f80997b0d
256 changed files with 4044 additions and 966 deletions

130
config.js
View file

@ -6,34 +6,41 @@ WATER: 3,
DESERT: 4
});
const terrainInfo = [
{ name: "Plains", color: [82, 102, 74], move: 1.0, fertility: 0.55, mineral: 0.05, regen: 0.025 },
{ name: "Forest", color: [58, 91, 68], move: 1.3, fertility: 0.62, mineral: 0.08, regen: 0.038 },
{ name: "Mountains", color: [104, 105, 101], move: 2.6, fertility: 0.18, mineral: 0.78, regen: 0.012 },
{ name: "Water", color: [52, 78, 103], move: 7.0, fertility: 0.04, mineral: 0.02, regen: 0.004 },
{ name: "Desert", color: [139, 123, 86], move: 1.55, fertility: 0.16, mineral: 0.16, regen: 0.014 }
{ name: "平原", color: [82, 102, 74], move: 1.0, fertility: 0.55, mineral: 0.05, regen: 0.025 },
{ name: "森林", color: [58, 91, 68], move: 1.3, fertility: 0.62, mineral: 0.08, regen: 0.038 },
{ name: "山地", color: [104, 105, 101], move: 2.6, fertility: 0.18, mineral: 0.78, regen: 0.012 },
{ name: "水域", color: [52, 78, 103], move: 7.0, fertility: 0, mineral: 0.02, regen: 0.004 },
{ name: "砂漠", color: [139, 123, 86], move: 1.55, fertility: 0.16, mineral: 0.16, regen: 0.014 }
];
const WEEKS_PER_MONTH = 4;
const MONTHS_PER_YEAR = 12;
const WEEKS_PER_YEAR = MONTHS_PER_YEAR * WEEKS_PER_MONTH;
const SimConfig = Object.freeze({
world: Object.freeze({
initialPopulation: 50000,
defaultSize: 160
}),
population: Object.freeze({
softCapStart: 0.85,
hardCapScale: 1.35,
populationScale: 10,
carryingCapacityBase: 2.4,
carryingCapacityFertility: 7.8,
carryingCapacityMineral: 1.8,
carryingCapacityFarmland: 5.5,
pressurePenaltyBase: 0.2,
pressureReproductionPenalty: 0.16
}),
city: Object.freeze({
maxCities: 300,
agingStartYears: 180,
agingDecayPerYear: 0.002,
agingOverCapAttrition: 0.035,
agingRestoreMinWear: 0.08,
agingRestoreCostPerWear: 70,
agingRestoreBudgetShare: 0.18
maxCities: 1200,
initialPopulation: 400,
abandonmentPopulation: 200,
populationScale: 10,
foodProductionScale: 10,
postShockRecoveryGrowth: 0.045,
overCapacityAttrition: 0.020,
naturalFoundingMinDistance: 6,
naturalFoundingStartYears: 160,
naturalFoundingIntervalYears: 5,
naturalFoundingReferenceArea: 160 * 160,
naturalFoundingMaxPerCycle: 8,
foundingCompetitionRadius: 9,
}),
render: Object.freeze({
graphThrottleMs: 1400,
@ -42,7 +49,6 @@ historyWindowYears: 2000,
historySamplePaddingYears: 240
}),
technology: Object.freeze({
cityDiffusion: 0.0022,
tradeDiffusion: 0.0032,
cityInnovation: 0.00045
}),
@ -53,7 +59,47 @@ charismaMin: 0.5,
charismaMax: 1.5,
charismaAverage: 1.0,
leaderTenureMinYears: 22,
leaderTenureMaxYears: 72
leaderTenureMaxYears: 72,
foundingProtectionYears: 12,
warCapitalDistanceStart: 18,
warCapitalDistanceScale: 42,
warDisconnectedTerritoryFactor: 0.42,
institutionalAgingAnnualIncrease: 0.0015,
institutionalReformThreshold: 0.30,
institutionalReformBaseChance: 0.008,
institutionalReformChanceScale: 0.10,
institutionalReformMaxChance: 0.12,
institutionalReformCooldownYears: 50,
institutionalReformMinChange: -0.50,
institutionalReformMaxChange: 0.30,
treasuryCapPerPopulation: 0.30,
treasuryCityFoundingChance: 0.14,
treasuryCityFoundingCostRatio: 0.35,
treasuryCityPopulationPerCost: 0.18,
treasuryCityReservePerCost: 0.45,
treasuryCityFoundingSearchRadius: 20,
treasuryCitySiteScoreWindow: 6.0
}),
territory: Object.freeze({
baseCityReach: 9,
radiusScale: 0.5,
cityPowerWeight: 1.8,
capitalReachBonus: 1.5,
ownershipSwitchMargin: 1.5,
minimumInfluence: 2.4,
fullMaintenanceCityPopulation: 2400,
minimumPopulationSupport: 0.28,
maintenancePressure: 4,
supportSmoothing: 0.18,
smallStateSwitchPenalty: 2.5
}),
rebellion: Object.freeze({
participationLoyalty: 0.50,
automaticLoyalty: 0.30,
chanceScale: 0.20,
maxAnnualChance: 0.16,
conquestGraceYears: 20,
treasuryTransferRate: 0.65
}),
campaign: Object.freeze({
checkIntervalYears: 3,
@ -64,7 +110,8 @@ maxActiveCampaigns: 12,
frontierTargetChance: 0.35,
nonStateTargetChance: 0.30,
independentCityTargetChance: 0.20,
polityTargetChance: 0.15,
polityTargetChance: 0,
independentCityPeacefulShare: 0.4,
baseDurationYears: 8,
maxDurationYears: 25,
claimRadius: 8,
@ -114,10 +161,14 @@ lowLoyaltyTransitPenalty: 0.012,
foreignTransitPenalty: 0.008
}),
culture: Object.freeze({
spreadRadius: 3,
cityWeight: 0.035,
routeWeight: 1.35,
minimumInfluence: 0.18
minimumInfluence: 0.18,
divergenceRateMultiplier: 0.25,
absorptionPopulationThreshold: 30,
urbanSpreadRadius: 5,
cityBlendRate: 0.045,
routeBlendRate: 0.035,
routeNeighborFactor: 0.35,
cityTradeBlendRate: 0.015
}),
route: Object.freeze({
maxRouteLength: 42,
@ -136,17 +187,34 @@ routePheromoneMaintain: 0.12,
routeUpkeepPerTile: 0.018,
routeWeakThreshold: 8,
routeUnsupportedDecay: 3,
routeMaintainedBoost: 10
routeMaintainedBoost: 10,
manualProtectionYears: 25,
manualProtectedStrength: 32,
manualRouteMaxLength: 120,
desertTraversalCostFactor: 0.68,
desertRouteLengthBonus: 30,
desertAdaptiveMaxRouteLength: 96,
desertPheromoneThresholdFactor: 0.45,
desertConstructionCostFactor: 0.72
}),
war: Object.freeze({
damageMultiplier: 0.65,
tickWeeks: 4,
startChanceMultiplier: 3,
maxActiveWars: 12,
maxStartsPerTick: 4,
minDurationWeeks: 12,
idleEndWeeks: 24,
cooldownWeeks: 24,
decisiveScore: 6,
pressureMemoryDecay: 0.88,
cityDamageMinRate: 0.003,
cityDamageMaxRate: 0.08,
captureLossBase: 0.08,
captureLossMax: 0.32,
exhaustionPopulationLossBase: 0.0007,
exhaustionPopulationLossMax: 0.012,
warZoneTileLossRate: 0.006,
cityDamageMinRate: 0.025,
cityDamageMaxRate: 0.30,
captureLossBase: 0.22,
captureLossMax: 0.40,
exhaustionPopulationLossBase: 0.003,
exhaustionPopulationLossMax: 0.03,
warZoneTileLossRate: 0.025,
majorSettlementThreshold: 1.25
}),
disaster: Object.freeze({