Start on Implementing PIPs
This commit is contained in:
		
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,8 +1,6 @@ | ||||
| package koboldsim | ||||
|  | ||||
| import ( | ||||
| 	"math" | ||||
|  | ||||
| 	"git.chromaticdragon.app/kistaro/CardSimEngine/cardsim" | ||||
| ) | ||||
|  | ||||
| @@ -10,277 +8,88 @@ import ( | ||||
| type KoboldMine struct { | ||||
| 	BasePopulation float64 `cardsim:"stathidden"` | ||||
|  | ||||
| 	MiningIncome        float64 `cardsim:"stathidden" cardsim_name:"Mining Productivity"` | ||||
| 	ScavengingIncome    float64 `cardsim:"stathidden" cardsim_name:"Scavenging Productivity"` | ||||
| 	AlchemyIncome       float64 `cardsim:"stathidden" cardsim_name:"Alchemy Productivity"` | ||||
| 	HospitalityIncome   float64 `cardsim:"stathidden" cardsim_name:"Hospitality Productivity"` | ||||
| 	AgricultureIncome   float64 `cardsim:"stathidden" cardsim_name:"Agriculture Productivity"` | ||||
| 	ManufacturingIncome float64 `cardsim:"stathidden" cardsim_name:"Manufacturing Productivity"` | ||||
| 	PlanarIncome        float64 `cardsim:"stathidden" cardsim_name:"Planar Productivity"` | ||||
| 	PublishingIncome    float64 `cardsim:"stathidden" cardsim_name:"Publishing Productivity"` | ||||
| 	ForestryIncome      float64 `cardsim:"stathidden" cardsim_name:"Forestry Productivity"` | ||||
| 	FinanceIncome       float64 `cardsim:"stathidden" cardsim_name:"Finance Productivity"` | ||||
| 	GadgetryIncome      float64 `cardsim:"stathidden" cardsim_name:"Gadgetry Productivity"` | ||||
| 	FishingIncome       float64 `cardsim:"stathidden" cardsim_name:"Fishing Productivity"` | ||||
| 	ConstructionIncome  float64 `cardsim:"stathidden" cardsim_name:"Construction Productivity"` | ||||
| 	Mining            float64 `cardsim:"stathidden" cardsim_name:"Mining"` | ||||
| 	Scavenging        float64 `cardsim:"stathidden" cardsim_name:"Scavenging"` | ||||
| 	Alchemy           float64 `cardsim:"stathidden" cardsim_name:"Alchemy"` | ||||
| 	Hospitality       float64 `cardsim:"stathidden" cardsim_name:"Hospitality"` | ||||
| 	Agriculture       float64 `cardsim:"stathidden" cardsim_name:"Agriculture"` | ||||
| 	Manufacturing     float64 `cardsim:"stathidden" cardsim_name:"Manufacturing"` | ||||
| 	PlanarConnections float64 `cardsim:"stathidden" cardsim_name:"Planar Connections"` | ||||
| 	Publishing        float64 `cardsim:"stathidden" cardsim_name:"Publishing"` | ||||
| 	Forestry          float64 `cardsim:"stathidden" cardsim_name:"Forestry"` | ||||
| 	Finance           float64 `cardsim:"stathidden" cardsim_name:"Finance"` | ||||
| 	Gadgetry          float64 `cardsim:"stathidden" cardsim_name:"Gadgetry"` | ||||
| 	Fishing           float64 `cardsim:"stathidden" cardsim_name:"Fishing"` | ||||
| 	Construction      float64 `cardsim:"stathidden" cardsim_name:"Construction"` | ||||
|  | ||||
| 	PropagandaExpense   float64 `cardsim:"stathidden" cardsim_name:"Propaganda Investment"` | ||||
| 	BureaucracyExpense  float64 `cardsim:"stathidden" cardsim_name:"Bureaucracy Investment"` | ||||
| 	WarExpense          float64 `cardsim:"stathidden" cardsim_name:"War Investment"` | ||||
| 	QoLExpense          float64 `cardsim:"stathidden" cardsim_name:"QoL Investment"` | ||||
| 	LogisticsExpense    float64 `cardsim:"stathidden" cardsim_name:"Logistics Investment"` | ||||
| 	DragonSubsExpense   float64 `cardsim:"stathidden" cardsim_name:"Dragon Subsidies Investment"` | ||||
| 	ResearchSubsExpense float64 `cardsim:"stathidden" cardsim_name:"Research Subsidies Investment"` | ||||
| 	EducationExpense    float64 `cardsim:"stathidden" cardsim_name:"Education Investment"` | ||||
| 	HealthcareExpense   float64 `cardsim:"stathidden" cardsim_name:"Healthcare Investment"` | ||||
| 	ForeignRelExpense   float64 `cardsim:"stathidden" cardsim_name:"Foreign Relations Investment"` | ||||
| 	PoliceExpense       float64 `cardsim:"stathidden" cardsim_name:"Law Enforcement Investment"` | ||||
| 	EconPlanExpense     float64 `cardsim:"stathidden" cardsim_name:"Economic Planning Investment"` | ||||
| 	ParksExpense        float64 `cardsim:"stathidden" cardsim_name:"Parks and Aesthetics Investment"` | ||||
| 	FaithExpense        float64 `cardsim:"stathidden" cardsim_name:"Faith Investment"` | ||||
| 	Propaganda        float64 `cardsim:"stathidden" cardsim_name:"Propaganda"` | ||||
| 	Bureaucracy       float64 `cardsim:"stathidden" cardsim_name:"Bureaucracy"` | ||||
| 	Militarism        float64 `cardsim:"stathidden" cardsim_name:"Militarism"` | ||||
| 	Welfare           float64 `cardsim:"stathidden" cardsim_name:"Social Safety Net"` | ||||
| 	Logistics         float64 `cardsim:"stathidden" cardsim_name:"Logistics"` | ||||
| 	DragonSubs        float64 `cardsim:"stathidden" cardsim_name:"Dragon Subsidies"` | ||||
| 	ResearchSubs      float64 `cardsim:"stathidden" cardsim_name:"Research"` | ||||
| 	Education         float64 `cardsim:"stathidden" cardsim_name:"Education"` | ||||
| 	Healthcare        float64 `cardsim:"stathidden" cardsim_name:"Healthcare"` | ||||
| 	ForeignRelExpense float64 `cardsim:"stathidden" cardsim_name:"Diplomatic Investment"` | ||||
| 	Police            float64 `cardsim:"stathidden" cardsim_name:"Law Enforcement"` | ||||
| 	ParksExpense      float64 `cardsim:"stathidden" cardsim_name:"City Beautification"` | ||||
| 	Faith             float64 `cardsim:"stathidden" cardsim_name:"Faith"` | ||||
|  | ||||
| 	FoodSupply        float64 `cardsim:"stathidden"` | ||||
| 	ObesogenicFood    float64 `cardsim:"stathidden"` | ||||
| 	ForeignRelations  float64 `cardsim:"stathidden"` | ||||
| 	HiddenRelPenalty  float64 `cardsim:"stathidden"` // Lower is better. | ||||
| 	Secrecy           float64 `cardsim:"stathidden"` | ||||
| 	PointOfDimReturns float64 `cardsim:"stathidden"` | ||||
| 	Rebellion         float64 `cardsim:"stathidden"` | ||||
| 	Madness           float64 `cardsim:"stathidden"` | ||||
| 	Cruelty           float64 `cardsim:"stat"` | ||||
| 	Greed             float64 `cardsim:"stat"` | ||||
| 	Gullibility       float64 `cardsim:"stathidden"` | ||||
| 	Authoritarianism  float64 `cardsim:"stat"` | ||||
| 	FoodSupply       float64 `cardsim:"stathidden"` | ||||
| 	ForeignRelations float64 `cardsim:"stathidden"` | ||||
| 	HiddenRelPenalty float64 `cardsim:"stathidden"` // Lower is better. | ||||
| 	Secrecy          float64 `cardsim:"stathidden"` | ||||
| 	Rebellion        float64 `cardsim:"stathidden"` | ||||
| 	Madness          float64 `cardsim:"stathidden"` | ||||
| 	Cruelty          float64 `cardsim:"stat"` | ||||
| 	Greed            float64 `cardsim:"stat"` | ||||
| 	Gullibility      float64 `cardsim:"stathidden"` | ||||
| 	Authoritarianism float64 `cardsim:"stat"` | ||||
|  | ||||
| 	//		AnotherExpense float64 `cardsim:"hiddenround5"` | ||||
| 	//	 A different way of adding stats that is slightly more empowering. | ||||
| } | ||||
| 	Taxation   float64 `cardsim:"stat"` | ||||
| 	TaxEvasion float64 `cardsim:"stat"` | ||||
| 	Squalor    float64 `cardsim:"stat"` | ||||
| 	// Idea for tax evasion.  The corruption stat should increase tax evasion, while the squalor stat should reduce it.  The link with corruption should be obvious, but for squalor: when the economy improves, more people have resources with which to attempt to protect their income.  This is part of why rich people can evade taxes more effectively than poor people.  It's not ALL lobbying advantage. | ||||
|  | ||||
| func (k *KoboldMine) ProductivityFunc(s float64) func() float64 { | ||||
| 	return func() float64 { | ||||
| 		return math.Max(s*float64(k.Kobolds()), 0) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) ProductivityTotal() float64 { | ||||
| 	total := math.Max(k.MiningIncome, 0.01) | ||||
| 	total += math.Max(k.ScavengingIncome, 0) | ||||
| 	total += math.Max(k.AlchemyIncome, 0) | ||||
| 	total += math.Max(k.HospitalityIncome, 0) | ||||
| 	total += math.Max(k.AgricultureIncome, 0) | ||||
| 	total += math.Max(k.ManufacturingIncome, 0) | ||||
| 	total += math.Max(k.PlanarIncome, 0) | ||||
| 	total += math.Max(k.PublishingIncome, 0) | ||||
| 	total += math.Max(k.FinanceIncome, 0) | ||||
| 	total += math.Max(k.GadgetryIncome, 0) | ||||
| 	total += math.Max(k.FishingIncome, 0) | ||||
| 	total += math.Max(k.ConstructionIncome, 0.02) | ||||
| 	total += math.Max(k.PropagandaExpense, 0) | ||||
| 	total += math.Max(k.BureaucracyExpense, 0) | ||||
| 	total += math.Max(k.WarExpense, 0) | ||||
| 	total += math.Max(k.QoLExpense, 0) | ||||
| 	total += math.Max(k.LogisticsExpense, 0) | ||||
| 	total += math.Max(k.DragonSubsExpense, 0) | ||||
| 	total += math.Max(k.ResearchSubsExpense, 0) | ||||
| 	total += math.Max(k.EducationExpense, 0) | ||||
| 	total += math.Max(k.HealthcareExpense, 0) | ||||
| 	total += math.Max(k.ForeignRelExpense, 0) | ||||
| 	total += math.Max(k.PoliceExpense, 0) | ||||
| 	total += math.Max(k.EconPlanExpense, 0) | ||||
| 	total += math.Max(k.ParksExpense, 0) | ||||
| 	total += math.Max(k.FaithExpense, 0) | ||||
| 	return total | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) ProductivityMultiplier() float64 { | ||||
| 	return math.Pow(0.95, math.Max(0, k.ProductivityTotal()-k.PointOfDimReturns)) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueMiningIncome() float64 { | ||||
| 	return math.Max(k.MiningIncome*k.ProductivityMultiplier(), 0.01) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueScavengingIncome() float64 { | ||||
| 	return math.Max(k.ScavengingIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueAlchemyIncome() float64 { | ||||
| 	return math.Max(k.AlchemyIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueHospitalityIncome() float64 { | ||||
| 	return math.Max(k.HospitalityIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueAgricultureIncome() float64 { | ||||
| 	return math.Max(k.AgricultureIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueManufacturingIncome() float64 { | ||||
| 	return math.Max(k.ManufacturingIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TruePlanarIncome() float64 { | ||||
| 	return math.Max(k.PlanarIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TruePublishingIncome() float64 { | ||||
| 	return math.Max(k.PublishingIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueForestryIncome() float64 { | ||||
| 	return math.Max(k.ForestryIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueFinanceIncome() float64 { | ||||
| 	return math.Max(k.FinanceIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueGadgetryIncome() float64 { | ||||
| 	return math.Max(k.GadgetryIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueFishingIncome() float64 { | ||||
| 	return math.Max(k.FishingIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueConstructionIncome() float64 { | ||||
| 	return math.Max(k.ConstructionIncome*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TruePropagandaExpense() float64 { | ||||
| 	return math.Max(k.PropagandaExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueBureaucracyExpense() float64 { | ||||
| 	return math.Max(k.BureaucracyExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueWarExpense() float64 { | ||||
| 	return math.Max(k.WarExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueQoLExpense() float64 { | ||||
| 	return math.Max(k.QoLExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueLogisticsExpense() float64 { | ||||
| 	return math.Max(k.LogisticsExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueDragonSubsExpense() float64 { | ||||
| 	return math.Max(k.DragonSubsExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueResearchSubsExpense() float64 { | ||||
| 	return math.Max(k.ResearchSubsExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueEducationExpense() float64 { | ||||
| 	return math.Max(k.EducationExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueHealthcareExpense() float64 { | ||||
| 	return math.Max(k.HealthcareExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueForeignRelExpense() float64 { | ||||
| 	return math.Max(k.ForeignRelExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TruePoliceExpense() float64 { | ||||
| 	return math.Max(k.PoliceExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueEconPlanExpense() float64 { | ||||
| 	return math.Max(k.EconPlanExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueParksExpense() float64 { | ||||
| 	return math.Max(k.ParksExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TrueFaithExpense() float64 { | ||||
| 	return math.Max(k.FaithExpense*k.ProductivityMultiplier(), 0) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TotalSectorIncome() float64 { | ||||
| 	return float64(k.Kobolds()) * (math.Max(k.TrueMiningIncome(), 0.01) + math.Max(k.TrueScavengingIncome(), 0) + math.Max(k.TrueAlchemyIncome(), 0) + math.Max(k.TrueHospitalityIncome(), 0) + math.Max(k.TrueAgricultureIncome(), 0) + math.Max(k.TrueManufacturingIncome(), 0) + math.Max(k.TruePlanarIncome(), 0) + math.Max(k.TruePublishingIncome(), 0) + math.Max(k.TrueFinanceIncome(), 0) + math.Max(k.TrueGadgetryIncome(), 0) + math.Max(k.TrueFishingIncome(), 0) + math.Max(k.TrueConstructionIncome(), 0.02)) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) TotalGovExpense() float64 { | ||||
| 	return float64(k.Kobolds()) * (math.Max(k.TruePropagandaExpense(), 0) + math.Max(k.TrueBureaucracyExpense(), 0) + math.Max(k.TrueWarExpense(), 0) + math.Max(k.TrueQoLExpense(), 0) + math.Max(k.TrueLogisticsExpense(), 0) + math.Max(k.TrueDragonSubsExpense(), 0) + math.Max(k.TrueResearchSubsExpense(), 0) + math.Max(k.TrueEducationExpense(), 0) + math.Max(k.TrueHealthcareExpense(), 0) + math.Max(k.TrueForeignRelExpense(), 0) + math.Max(k.TruePoliceExpense(), 0) + math.Max(k.TrueEconPlanExpense(), 0) + math.Max(k.TrueParksExpense(), 0) + math.Max(k.TrueFaithExpense(), 0)) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) Taxation() float64 { | ||||
| 	return (k.TotalGovExpense() / (k.TotalSectorIncome() + k.TotalGovExpense())) * 100 | ||||
| } | ||||
|  | ||||
| // Idea for the tax rate.  I could have a tracked "tax evasion" stat that drives up taxation (people who actually pay have to pay more) as well as a tracked "public pay ratio" stat that drives up taxation if the public sector is paid more than the private sector and vice versa if the public sector is paid less.  Both stats should be exposed to the player. | ||||
| // Idea for tax evasion.  The corruption stat should increase tax evasion, while the squalor stat should reduce it.  The link with corruption should be obvious, but for squalor: when the economy improves, more people have resources with which to attempt to protect their income. | ||||
|  | ||||
| func (k *KoboldMine) StatTaxRate() float64 { | ||||
| 	return k.Taxation() | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) Kobolds() int64 { | ||||
| 	return int64((k.BasePopulation + (k.HealthcareExpense * 1000)) * k.FoodSupply * (1 - 0.5*(k.StatObesity()/100)) * (1 + k.TrueForeignRelations())) | ||||
| 	return int64((k.BasePopulation * (k.Healthcare + 1)) * (k.FoodSupply) * (100 + k.TrueForeignRelations()/100)) | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	MinFoodSupply = 18 | ||||
| 	MaxFoodSupply = 37 | ||||
| ) | ||||
|  | ||||
| func (k *KoboldMine) DisplayedFoodSupply() float64 { | ||||
| 	return (k.FoodSupply - 1) * 100 | ||||
| 	return 100 * (k.FoodSupply - MinFoodSupply) / (MaxFoodSupply - MinFoodSupply) //This returns a Policy Implementation Percentage, so that the player can see how good they are at capturing food supply.  When it becomes possible for Food Supply to hit 0 and end the game in famine, the minimum survivable food supply PIP should be calculated and returned to the player as a warned-against failure threshold. | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) StatObesogenicity() float64 { | ||||
| 	return (k.ObesogenicFood - 1) * 100 | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) StatObesity() float64 { | ||||
| 	return (100 / (2.3 + math.Exp(-0.04*(k.DisplayedFoodSupply()-37)))) + 100/(2.3+math.Exp(-0.04*(k.StatObesogenicity()-37))) | ||||
| } | ||||
| //func (k *KoboldMine) StatObesity() float64 { | ||||
| //return (100 / (2.3 + math.Exp(-0.04*(k.DisplayedFoodSupply()-37)))) + 100/(2.3+math.Exp(-0.04*(k.StatObesogenicity()-37))) | ||||
| //} | ||||
|  | ||||
| func (k *KoboldMine) TrueForeignRelations() float64 { | ||||
| 	return (1 - math.Max(math.Min(k.Secrecy, 1), 0)) * (math.Max(math.Min(k.ForeignRelations, 1), -1) - k.HiddenRelPenalty) | ||||
| 	openness := 100 - clamp(k.Secrecy, 0, 100) | ||||
| 	effectiveRel := clamp(k.ForeignRelations, -100, 100) - k.HiddenRelPenalty | ||||
| 	return openness / 100 * effectiveRel | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	MinForeignRelations = -11 | ||||
| 	MaxForeignRelations = 9 | ||||
| ) | ||||
|  | ||||
| func (k *KoboldMine) DisplayedForeignRelations() float64 { | ||||
| 	return math.Max(math.Min((k.ForeignRelations*100), 100), -100) | ||||
| 	return 100 * (k.ForeignRelations - MinForeignRelations) / (MaxForeignRelations - MinForeignRelations) | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) DisplayedSecrecy() float64 { | ||||
| 	return k.Secrecy * 100 | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) SqualorReduction() float64 { | ||||
| 	total := math.Max(k.MiningIncome, 0.01) | ||||
| 	total -= math.Max(k.ScavengingIncome, 0) | ||||
| 	total += math.Max(k.AlchemyIncome, 0) | ||||
| 	total += math.Max(k.HospitalityIncome, 0) * 2 | ||||
| 	total += math.Max(k.ManufacturingIncome, 0) | ||||
| 	total += math.Max(k.PlanarIncome, 0) | ||||
| 	total += math.Max(k.PublishingIncome, 0) * 2 | ||||
| 	total += math.Max(k.FinanceIncome, 0) * 3 | ||||
| 	total += math.Max(k.GadgetryIncome, 0) * 2 | ||||
| 	total += math.Max(k.ConstructionIncome, 0.02) * 2 | ||||
| 	total += math.Max(k.PropagandaExpense, 0) | ||||
| 	total += math.Max(k.BureaucracyExpense, 0) * 2 | ||||
| 	total += math.Max(k.QoLExpense, 0) * 20 | ||||
| 	total += math.Max(k.LogisticsExpense, 0) | ||||
| 	total += math.Max(k.ResearchSubsExpense, 0) * 2 | ||||
| 	total += math.Max(k.EducationExpense, 0) * 4 | ||||
| 	total += math.Max(k.HealthcareExpense, 0) * 6 | ||||
| 	total += math.Max(k.ForeignRelExpense, 0) | ||||
| 	total += math.Max(k.PoliceExpense, 0) | ||||
| 	total += math.Max(k.EconPlanExpense, 0) | ||||
| 	total += math.Max(k.ParksExpense, 0) * 3 | ||||
| 	total += math.Max(k.FaithExpense, 0) * 10 | ||||
| 	return total | ||||
| } | ||||
|  | ||||
| func (k *KoboldMine) StatSqualor() float64 { | ||||
| 	return 100 * math.Pow(1.204, 1.2-(2*k.SqualorReduction())) | ||||
| } | ||||
|  | ||||
| // So I want squalor to be a value between 100 and 0 that reduces readily at the start and then becomes increasingly difficult to further reduce.  This initial squalor stat starts at about 80%, but may not change rapidly enough.  Note that the 1.2-(2* sequence is meant to balance it at 80% starting point.  If I change the velocity on the 2* side, I have to change the 1.2 offset as well.  I really hope this math works, because I don't quite understand it. | ||||
|  | ||||
| func (k *KoboldMine) StatChaos() float64 { | ||||
| @@ -298,122 +107,6 @@ func (k *KoboldMine) StatCorruption() float64 { | ||||
| func (k *KoboldMine) Stats() []cardsim.Stat { | ||||
| 	stats := cardsim.ExtractStats(k) | ||||
| 	funcs := []cardsim.Stat{ | ||||
| 		cardsim.StatFunc( | ||||
| 			"Mining Income", | ||||
| 			k.ProductivityFunc(k.TrueMiningIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Scavenging Income", | ||||
| 			k.ProductivityFunc(k.TrueScavengingIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Alchemy Income", | ||||
| 			k.ProductivityFunc(k.TrueAlchemyIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Hospitality Income", | ||||
| 			k.ProductivityFunc(k.TrueHospitalityIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Agriculture Income", | ||||
| 			k.ProductivityFunc(k.TrueAgricultureIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Manufacturing Income", | ||||
| 			k.ProductivityFunc(k.TrueManufacturingIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Planar Harvesting Income", | ||||
| 			k.ProductivityFunc(k.TruePlanarIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Book Publishing Income", | ||||
| 			k.ProductivityFunc(k.TruePublishingIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Forestry Income", | ||||
| 			k.ProductivityFunc(k.TrueForestryIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Finance Income", | ||||
| 			k.ProductivityFunc(k.TrueFinanceIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Gadgetry Income", | ||||
| 			k.ProductivityFunc(k.TrueGadgetryIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Fishing Income", | ||||
| 			k.ProductivityFunc(k.TrueFishingIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Construction Income", | ||||
| 			k.ProductivityFunc(k.TrueConstructionIncome()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Propaganda Expense", | ||||
| 			k.ProductivityFunc(k.TruePropagandaExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Bureaucracy Expense", | ||||
| 			k.ProductivityFunc(k.TrueBureaucracyExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"War Expense", | ||||
| 			k.ProductivityFunc(k.TrueWarExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"QoL Expense", | ||||
| 			k.ProductivityFunc(k.TrueQoLExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Logistics Expense", | ||||
| 			k.ProductivityFunc(k.TrueLogisticsExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Dragon Subsidies", | ||||
| 			k.ProductivityFunc(k.TrueDragonSubsExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Research Subsidies", | ||||
| 			k.ProductivityFunc(k.TrueResearchSubsExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Education Expense", | ||||
| 			k.ProductivityFunc(k.TrueEducationExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Healthcare Expense", | ||||
| 			k.ProductivityFunc(k.TrueHealthcareExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Foreign Relations Expense", | ||||
| 			k.ProductivityFunc(k.TrueForeignRelExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Law Enforcement Expense", | ||||
| 			k.ProductivityFunc(k.TruePoliceExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Economic Planning Expense", | ||||
| 			k.ProductivityFunc(k.TrueEconPlanExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Parks and Aesthetics Expense", | ||||
| 			k.ProductivityFunc(k.TrueParksExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Faith Expense", | ||||
| 			k.ProductivityFunc(k.TrueFaithExpense()), | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Total Sector Income", | ||||
| 			k.TotalSectorIncome, | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Total Government Expense", | ||||
| 			k.TotalGovExpense, | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Foreign Relations", | ||||
| 			k.DisplayedForeignRelations, | ||||
| @@ -430,14 +123,6 @@ func (k *KoboldMine) Stats() []cardsim.Stat { | ||||
| 			"Kobolds", | ||||
| 			k.Kobolds, | ||||
| 		), | ||||
| 		cardsim.InvisibleStatFunc( | ||||
| 			"Squalor Reduction", | ||||
| 			k.SqualorReduction, | ||||
| 		), | ||||
| 		cardsim.StatFunc( | ||||
| 			"Squalor", | ||||
| 			k.StatSqualor, | ||||
| 		), | ||||
| 	} | ||||
| 	stats = append(stats, funcs...) | ||||
| 	//	cardsim.SortStats(stats) | ||||
| @@ -446,46 +131,42 @@ func (k *KoboldMine) Stats() []cardsim.Stat { | ||||
|  | ||||
| func NewKoboldMine() *KoboldMine { | ||||
| 	return &KoboldMine{ | ||||
| 		BasePopulation:      1025, | ||||
| 		MiningIncome:        0.15, | ||||
| 		ScavengingIncome:    0.1, | ||||
| 		AlchemyIncome:       0.01, | ||||
| 		HospitalityIncome:   0.0, | ||||
| 		AgricultureIncome:   0.0, | ||||
| 		ManufacturingIncome: 0.10, | ||||
| 		PlanarIncome:        0.00, | ||||
| 		PublishingIncome:    0.02, | ||||
| 		ForestryIncome:      0.0, | ||||
| 		FinanceIncome:       0.02, | ||||
| 		GadgetryIncome:      0.03, | ||||
| 		FishingIncome:       0.0, | ||||
| 		ConstructionIncome:  0.05, | ||||
| 		PropagandaExpense:   0.01, | ||||
| 		BureaucracyExpense:  0.05, | ||||
| 		WarExpense:          0.1, | ||||
| 		QoLExpense:          0.01, | ||||
| 		LogisticsExpense:    0.02, | ||||
| 		DragonSubsExpense:   0.0, | ||||
| 		ResearchSubsExpense: 0.0, | ||||
| 		EducationExpense:    0.01, | ||||
| 		HealthcareExpense:   0.01, | ||||
| 		ForeignRelExpense:   0.0, | ||||
| 		PoliceExpense:       0.03, | ||||
| 		EconPlanExpense:     0.02, | ||||
| 		ParksExpense:        0.0, | ||||
| 		FaithExpense:        0.03, | ||||
| 		FoodSupply:          0.20, | ||||
| 		ForeignRelations:    -0.40, | ||||
| 		HiddenRelPenalty:    -0.01, | ||||
| 		Rebellion:           0.10, | ||||
| 		Madness:             0.25, | ||||
| 		Cruelty:             0.45, | ||||
| 		Greed:               0.35, | ||||
| 		Gullibility:         0.10, | ||||
| 		Authoritarianism:    0.70, | ||||
| 		Secrecy:             .95, | ||||
| 		PointOfDimReturns:   1.0, | ||||
| 		BasePopulation:    1025, | ||||
| 		Mining:            0, | ||||
| 		Scavenging:        0, | ||||
| 		Alchemy:           0, | ||||
| 		Hospitality:       0, | ||||
| 		Agriculture:       0, | ||||
| 		Manufacturing:     0, | ||||
| 		PlanarConnections: 0, | ||||
| 		Publishing:        0, | ||||
| 		Forestry:          0, | ||||
| 		Finance:           0, | ||||
| 		Gadgetry:          0, | ||||
| 		Fishing:           0, | ||||
| 		Construction:      0, | ||||
| 		Propaganda:        0, | ||||
| 		Bureaucracy:       0, | ||||
| 		Militarism:        0, | ||||
| 		Welfare:           0, | ||||
| 		Logistics:         0, | ||||
| 		DragonSubs:        0, | ||||
| 		ResearchSubs:      0, | ||||
| 		Education:         0, | ||||
| 		Healthcare:        0, | ||||
| 		ForeignRelExpense: 0, | ||||
| 		Police:            0, | ||||
| 		ParksExpense:      0, | ||||
| 		Faith:             0, | ||||
| 		FoodSupply:        20, | ||||
| 		ForeignRelations:  0, | ||||
| 		HiddenRelPenalty:  0, | ||||
| 		Rebellion:         0, | ||||
| 		Madness:           0, | ||||
| 		Cruelty:           0, | ||||
| 		Greed:             0, | ||||
| 		Gullibility:       0, | ||||
| 		Authoritarianism:  0, | ||||
| 		Secrecy:           95, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Note that the mine initializes with 1.02 points of overall productivity. | ||||
|   | ||||
| @@ -1,6 +1,10 @@ | ||||
| package koboldsim | ||||
|  | ||||
| import "math" | ||||
| import ( | ||||
| 	"math" | ||||
|  | ||||
| 	"golang.org/x/exp/constraints" | ||||
| ) | ||||
|  | ||||
| // Generic helper functions not directly attached to Card Sim Engine mechanics. | ||||
|  | ||||
| @@ -20,3 +24,13 @@ func Mean(vals ...float64) float64 { | ||||
| 	} | ||||
| 	return total / float64(len(vals)) | ||||
| } | ||||
|  | ||||
| func clamp[T constraints.Ordered](val, low, high T) T { | ||||
| 	if val < low { | ||||
| 		return low | ||||
| 	} | ||||
| 	if val > high { | ||||
| 		return high | ||||
| 	} | ||||
| 	return val | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user