Compare commits
2 Commits
0a39cc76d6
...
a4692712cc
Author | SHA1 | Date | |
---|---|---|---|
a4692712cc | |||
2ca8f3ed13 |
@ -5,7 +5,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var cards = []Card{
|
var cards = []Card{
|
||||||
&SwitchingCard{
|
&SwitchingCard{ // Card 1
|
||||||
Name: cardsim.MsgStr("Warborn"),
|
Name: cardsim.MsgStr("Warborn"),
|
||||||
Desc: cardsim.MsgStr(" A surge of anti-kobold sentiment has been reported by your spies on the surface and your military is concerned that anti-kobold vigilantes will attack the tunnels in the near-future. They want to build up now while doing so is safe."),
|
Desc: cardsim.MsgStr(" A surge of anti-kobold sentiment has been reported by your spies on the surface and your military is concerned that anti-kobold vigilantes will attack the tunnels in the near-future. They want to build up now while doing so is safe."),
|
||||||
After: ShuffleIntoBottomHalf,
|
After: ShuffleIntoBottomHalf,
|
||||||
@ -40,6 +40,7 @@ var cards = []Card{
|
|||||||
p.Stats.BureaucracyExpense += 0.01
|
p.Stats.BureaucracyExpense += 0.01
|
||||||
p.Stats.FoodSupply -= 0.01
|
p.Stats.FoodSupply -= 0.01
|
||||||
p.Stats.Secrecy += 0.02
|
p.Stats.Secrecy += 0.02
|
||||||
|
p.Stats.PointOfDimReturns += 0.01
|
||||||
return cardsim.MsgStr("Kobolds are known to be cowards hiding in the dark."), nil
|
return cardsim.MsgStr("Kobolds are known to be cowards hiding in the dark."), nil
|
||||||
},
|
},
|
||||||
Undo: func(p *Player) error {
|
Undo: func(p *Player) error {
|
||||||
@ -48,6 +49,7 @@ var cards = []Card{
|
|||||||
p.Stats.BureaucracyExpense -= 0.01
|
p.Stats.BureaucracyExpense -= 0.01
|
||||||
p.Stats.FoodSupply += 0.01
|
p.Stats.FoodSupply += 0.01
|
||||||
p.Stats.Secrecy -= 0.02
|
p.Stats.Secrecy -= 0.02
|
||||||
|
p.Stats.PointOfDimReturns += 0.01
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
CanDo: YesWeCan,
|
CanDo: YesWeCan,
|
||||||
@ -62,6 +64,7 @@ var cards = []Card{
|
|||||||
p.Stats.EducationExpense += 0.01
|
p.Stats.EducationExpense += 0.01
|
||||||
p.Stats.FoodSupply -= 0.01
|
p.Stats.FoodSupply -= 0.01
|
||||||
p.Stats.ForeignRelations += 0.02
|
p.Stats.ForeignRelations += 0.02
|
||||||
|
p.Stats.PointOfDimReturns += 0.01
|
||||||
return cardsim.MsgStr("An undefended hunting outpost near the surface was recently wiped out by a raid."), nil
|
return cardsim.MsgStr("An undefended hunting outpost near the surface was recently wiped out by a raid."), nil
|
||||||
},
|
},
|
||||||
Undo: func(p *Player) error {
|
Undo: func(p *Player) error {
|
||||||
@ -71,6 +74,7 @@ var cards = []Card{
|
|||||||
p.Stats.EducationExpense -= 0.01
|
p.Stats.EducationExpense -= 0.01
|
||||||
p.Stats.FoodSupply += 0.01
|
p.Stats.FoodSupply += 0.01
|
||||||
p.Stats.ForeignRelations -= 0.02
|
p.Stats.ForeignRelations -= 0.02
|
||||||
|
p.Stats.PointOfDimReturns -= 0.01
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
CanDo: YesWeCan,
|
CanDo: YesWeCan,
|
||||||
@ -107,9 +111,9 @@ var cards = []Card{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}, // end of "Warborn" policies
|
}, // End of "Warborn" policies
|
||||||
}, // end of "Warborn" card
|
}, // End of "Warborn" card
|
||||||
&SwitchingCard{
|
&SwitchingCard{ // Card 2
|
||||||
Name: cardsim.MsgStr("International Festival of Bureaucracy"),
|
Name: cardsim.MsgStr("International Festival of Bureaucracy"),
|
||||||
Desc: cardsim.MsgStr(" Good times are upon us! A great festival has been declared between many kobold nations, celebrating the orderly nature of the kobold soul! That's right, it's the International Festival of Bureaucracy!"),
|
Desc: cardsim.MsgStr(" Good times are upon us! A great festival has been declared between many kobold nations, celebrating the orderly nature of the kobold soul! That's right, it's the International Festival of Bureaucracy!"),
|
||||||
After: ShuffleIntoBottomHalf,
|
After: ShuffleIntoBottomHalf,
|
||||||
@ -122,6 +126,7 @@ var cards = []Card{
|
|||||||
p.Stats.ScavengingIncome += 0.01
|
p.Stats.ScavengingIncome += 0.01
|
||||||
p.Stats.BureaucracyExpense += 0.03
|
p.Stats.BureaucracyExpense += 0.03
|
||||||
p.Stats.FoodSupply += 0.01
|
p.Stats.FoodSupply += 0.01
|
||||||
|
p.Stats.PointOfDimReturns += 0.01
|
||||||
return cardsim.MsgStr("Bureaucrats are considered pillars of society."), nil
|
return cardsim.MsgStr("Bureaucrats are considered pillars of society."), nil
|
||||||
},
|
},
|
||||||
Undo: func(p *Player) error {
|
Undo: func(p *Player) error {
|
||||||
@ -129,6 +134,7 @@ var cards = []Card{
|
|||||||
p.Stats.ScavengingIncome -= 0.01
|
p.Stats.ScavengingIncome -= 0.01
|
||||||
p.Stats.BureaucracyExpense -= 0.03
|
p.Stats.BureaucracyExpense -= 0.03
|
||||||
p.Stats.FoodSupply -= 0.01
|
p.Stats.FoodSupply -= 0.01
|
||||||
|
p.Stats.PointOfDimReturns -= 0.01
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
CanDo: YesWeCan,
|
CanDo: YesWeCan,
|
||||||
@ -163,11 +169,13 @@ var cards = []Card{
|
|||||||
Do: func(p *Player) (cardsim.Message, error) {
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
p.Stats.BasePopulation += 10
|
p.Stats.BasePopulation += 10
|
||||||
p.Stats.BureaucracyExpense -= 0.02
|
p.Stats.BureaucracyExpense -= 0.02
|
||||||
|
p.Stats.PointOfDimReturns -= 0.01
|
||||||
return cardsim.MsgStr("The local bureaucracy is staffed by volunteer labor."), nil
|
return cardsim.MsgStr("The local bureaucracy is staffed by volunteer labor."), nil
|
||||||
},
|
},
|
||||||
Undo: func(p *Player) error {
|
Undo: func(p *Player) error {
|
||||||
p.Stats.BasePopulation -= 10
|
p.Stats.BasePopulation -= 10
|
||||||
p.Stats.BureaucracyExpense += 0.02
|
p.Stats.BureaucracyExpense += 0.02
|
||||||
|
p.Stats.PointOfDimReturns += 0.01
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
CanDo: func(b *BasicPolicy, p *Player) bool {
|
CanDo: func(b *BasicPolicy, p *Player) bool {
|
||||||
@ -224,9 +232,9 @@ var cards = []Card{
|
|||||||
nil, // remember, if using a BasicPolicy, this uses EnactedDesc
|
nil, // remember, if using a BasicPolicy, this uses EnactedDesc
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}, //End of "International Festival of Bureaucracy" policies
|
}, // End of "International Festival of Bureaucracy" policies
|
||||||
}, //End of "International Festival of Bureaucracy" card
|
}, // End of "International Festival of Bureaucracy" card
|
||||||
&SwitchingCard{
|
&SwitchingCard{ // Card 3
|
||||||
Name: cardsim.MsgStr("Two Kobolds in a Trenchcoat"),
|
Name: cardsim.MsgStr("Two Kobolds in a Trenchcoat"),
|
||||||
Desc: cardsim.MsgStr("An inevitable concern of kobold nations is the matter of trade. Trade with other kobolds is straightforward, but overland caravans are unsafe. Trade with surfacers is vital... but achieving it is difficult owing to anti-kobold sentiment."),
|
Desc: cardsim.MsgStr("An inevitable concern of kobold nations is the matter of trade. Trade with other kobolds is straightforward, but overland caravans are unsafe. Trade with surfacers is vital... but achieving it is difficult owing to anti-kobold sentiment."),
|
||||||
After: ShuffleIntoBottomHalf,
|
After: ShuffleIntoBottomHalf,
|
||||||
@ -243,6 +251,7 @@ var cards = []Card{
|
|||||||
p.Stats.ScavengingIncome += 0.01
|
p.Stats.ScavengingIncome += 0.01
|
||||||
p.Stats.FoodSupply += 0.01
|
p.Stats.FoodSupply += 0.01
|
||||||
p.Stats.Secrecy += 0.05
|
p.Stats.Secrecy += 0.05
|
||||||
|
p.Stats.PointOfDimReturns += 0.05
|
||||||
return cardsim.MsgStr("Nobody ever meets a kobold merchant."), nil
|
return cardsim.MsgStr("Nobody ever meets a kobold merchant."), nil
|
||||||
},
|
},
|
||||||
Undo: func(p *Player) error {
|
Undo: func(p *Player) error {
|
||||||
@ -254,13 +263,14 @@ var cards = []Card{
|
|||||||
p.Stats.ScavengingIncome -= 0.01
|
p.Stats.ScavengingIncome -= 0.01
|
||||||
p.Stats.FoodSupply -= 0.01
|
p.Stats.FoodSupply -= 0.01
|
||||||
p.Stats.Secrecy -= 0.05
|
p.Stats.Secrecy -= 0.05
|
||||||
|
p.Stats.PointOfDimReturns -= 0.05
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
CanDo: YesWeCan,
|
CanDo: YesWeCan,
|
||||||
},
|
},
|
||||||
&BasicPolicy{
|
&BasicPolicy{
|
||||||
UnenactedDesc: cardsim.MsgStr(`Brave but potentially headstrong, another prospective merchant has attended the meeting with the following plea. "We must take head-on the risk of improving the status of kobolds! Only by bravely attending the surface markets can we hope to achieve a true and lasting peace!"`),
|
UnenactedDesc: cardsim.MsgStr(`Brave but potentially headstrong, another prospective merchant has attended the meeting with the following plea. "We must take head-on the risk of improving the status of kobolds! Only by bravely attending the surface markets can we hope to achieve a true and lasting peace!"`),
|
||||||
EnactedDesc: cardsim.MsgStr(`[currentpolicy] Your merchants represent the nation's peaceful ideals by visiting the surface openly despite occasional casaulties.`),
|
EnactedDesc: cardsim.MsgStr(`[current policy] Your merchants represent the nation's peaceful ideals by visiting the surface openly despite occasional casaulties.`),
|
||||||
Do: func(p *Player) (cardsim.Message, error) {
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
p.Stats.BasePopulation -= 15
|
p.Stats.BasePopulation -= 15
|
||||||
p.Stats.ManufacturingIncome += 0.03
|
p.Stats.ManufacturingIncome += 0.03
|
||||||
@ -276,6 +286,7 @@ var cards = []Card{
|
|||||||
p.Stats.ScavengingIncome -= 0.01
|
p.Stats.ScavengingIncome -= 0.01
|
||||||
p.Stats.Secrecy -= 0.10
|
p.Stats.Secrecy -= 0.10
|
||||||
p.Stats.ForeignRelations += 0.05
|
p.Stats.ForeignRelations += 0.05
|
||||||
|
p.Stats.PointOfDimReturns += 0.1
|
||||||
return cardsim.MsgStr("The economic planning office formally plans for attrition among its merchants."), nil
|
return cardsim.MsgStr("The economic planning office formally plans for attrition among its merchants."), nil
|
||||||
},
|
},
|
||||||
Undo: func(p *Player) error {
|
Undo: func(p *Player) error {
|
||||||
@ -293,6 +304,7 @@ var cards = []Card{
|
|||||||
p.Stats.ScavengingIncome += 0.01
|
p.Stats.ScavengingIncome += 0.01
|
||||||
p.Stats.Secrecy += 0.10
|
p.Stats.Secrecy += 0.10
|
||||||
p.Stats.ForeignRelations -= 0.05
|
p.Stats.ForeignRelations -= 0.05
|
||||||
|
p.Stats.PointOfDimReturns += 0.1
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
CanDo: YesWeCan,
|
CanDo: YesWeCan,
|
||||||
@ -309,6 +321,7 @@ var cards = []Card{
|
|||||||
p.Stats.MiningIncome -= 0.01
|
p.Stats.MiningIncome -= 0.01
|
||||||
p.Stats.ManufacturingIncome -= 0.01
|
p.Stats.ManufacturingIncome -= 0.01
|
||||||
p.Stats.HiddenRelPenalty += 0.02 // High is bad on this hidden stat.
|
p.Stats.HiddenRelPenalty += 0.02 // High is bad on this hidden stat.
|
||||||
|
p.Stats.PointOfDimReturns += 0.05
|
||||||
return cardsim.MsgStr("Kobold merchants are instantly suspected of black market connections."), nil
|
return cardsim.MsgStr("Kobold merchants are instantly suspected of black market connections."), nil
|
||||||
},
|
},
|
||||||
Undo: func(p *Player) error {
|
Undo: func(p *Player) error {
|
||||||
@ -320,6 +333,7 @@ var cards = []Card{
|
|||||||
p.Stats.MiningIncome += 0.01
|
p.Stats.MiningIncome += 0.01
|
||||||
p.Stats.ManufacturingIncome += 0.01
|
p.Stats.ManufacturingIncome += 0.01
|
||||||
p.Stats.HiddenRelPenalty -= 0.02
|
p.Stats.HiddenRelPenalty -= 0.02
|
||||||
|
p.Stats.PointOfDimReturns -= 0.05
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
CanDo: YesWeCan,
|
CanDo: YesWeCan,
|
||||||
@ -333,6 +347,7 @@ var cards = []Card{
|
|||||||
p.Stats.LogisticsExpense += 0.06
|
p.Stats.LogisticsExpense += 0.06
|
||||||
p.Stats.FoodSupply -= 0.01
|
p.Stats.FoodSupply -= 0.01
|
||||||
p.Stats.Secrecy += 0.15
|
p.Stats.Secrecy += 0.15
|
||||||
|
p.Stats.PointOfDimReturns += 0.1
|
||||||
return cardsim.MsgStr("The vast network of caverns under the surface of the world is not a natural phenomenon."), nil
|
return cardsim.MsgStr("The vast network of caverns under the surface of the world is not a natural phenomenon."), nil
|
||||||
},
|
},
|
||||||
Undo: func(p *Player) error {
|
Undo: func(p *Player) error {
|
||||||
@ -341,6 +356,7 @@ var cards = []Card{
|
|||||||
p.Stats.LogisticsExpense -= 0.06
|
p.Stats.LogisticsExpense -= 0.06
|
||||||
p.Stats.FoodSupply += 0.01
|
p.Stats.FoodSupply += 0.01
|
||||||
p.Stats.Secrecy -= 0.15
|
p.Stats.Secrecy -= 0.15
|
||||||
|
p.Stats.PointOfDimReturns -= 0.1
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
CanDo: YesWeCan,
|
CanDo: YesWeCan,
|
||||||
@ -372,9 +388,9 @@ var cards = []Card{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}, //End of "Two Kobolds in a Trenchcoat" policies
|
}, // End of "Two Kobolds in a Trenchcoat" policies
|
||||||
}, //End of "Two Kobolds in a Trenchcoat" card
|
}, // End of "Two Kobolds in a Trenchcoat" card
|
||||||
&SwitchingCard{
|
&SwitchingCard{ // Card 4
|
||||||
Name: cardsim.MsgStr("A Recipe for Stewed Kobold"),
|
Name: cardsim.MsgStr("A Recipe for Stewed Kobold"),
|
||||||
Desc: cardsim.MsgStr("Nobody would ever say a kobold smells bad, but the constant burrowing, manufacturing, and metallurgy that is common to kobold life is still a recipe for tense muscles and filthy scales. A slate of proposals have come through to address this issue."),
|
Desc: cardsim.MsgStr("Nobody would ever say a kobold smells bad, but the constant burrowing, manufacturing, and metallurgy that is common to kobold life is still a recipe for tense muscles and filthy scales. A slate of proposals have come through to address this issue."),
|
||||||
After: ShuffleIntoBottomHalf,
|
After: ShuffleIntoBottomHalf,
|
||||||
@ -455,10 +471,13 @@ var cards = []Card{
|
|||||||
},
|
},
|
||||||
}, // End of "A Recipe for Stewed Kobold" policies
|
}, // End of "A Recipe for Stewed Kobold" policies
|
||||||
}, // End of "A Recipe for Stewed Kobold" card
|
}, // End of "A Recipe for Stewed Kobold" card
|
||||||
&SwitchingCard{
|
&SwitchingCard{ // Card 5
|
||||||
Name: cardsim.MsgStr("Raid on Surface Proposed"), //TODO: Make this card arise only if War investment is positive to begin with.
|
Name: cardsim.MsgStr("Raid on Surface Proposed"),
|
||||||
Desc: cardsim.MsgStr("Resources underground are perpetually tight. Even metallurgy is hard, because fuel is scarce. You can rely on neither field nor forest. The scavengers brave the surface regularly to beg, borrow, or steal the resources necessary to your society, but your war planners want to secure resources more aggressively."),
|
Desc: cardsim.MsgStr("Resources underground are perpetually tight. Even metallurgy is hard, because fuel is scarce. You can rely on neither field nor forest. The scavengers brave the surface regularly to beg, borrow, or steal the resources necessary to your society, but your war planners want to secure resources more aggressively."),
|
||||||
After: ShuffleIntoBottomHalf,
|
After: ShuffleIntoBottomHalf,
|
||||||
|
IsValid: func(c Card, p *Player) bool {
|
||||||
|
return p.Stats.WarExpense > 0
|
||||||
|
},
|
||||||
Policies: []Policy{
|
Policies: []Policy{
|
||||||
&BasicPolicy{
|
&BasicPolicy{
|
||||||
UnenactedDesc: cardsim.MsgStr(`A scavenger clad in sturdy clothes says, "We need to secure a section of forests on the surface. The surfacers strip too many of the forests bare; if we dispatch patrols ready to fight we can keep them from assarting the forest for their endlessly growing farm communities."`),
|
UnenactedDesc: cardsim.MsgStr(`A scavenger clad in sturdy clothes says, "We need to secure a section of forests on the surface. The surfacers strip too many of the forests bare; if we dispatch patrols ready to fight we can keep them from assarting the forest for their endlessly growing farm communities."`),
|
||||||
@ -469,7 +488,7 @@ var cards = []Card{
|
|||||||
p.Stats.WarExpense += 0.01
|
p.Stats.WarExpense += 0.01
|
||||||
p.Stats.FoodSupply += 0.03
|
p.Stats.FoodSupply += 0.03
|
||||||
p.Stats.Secrecy -= 0.10
|
p.Stats.Secrecy -= 0.10
|
||||||
p.Stats.ForeignRelations -= 0.01
|
p.Stats.ForeignRelations -= 0.02
|
||||||
return cardsim.MsgStr("A bunch of lumberjacks just disappeared in a forest."), nil
|
return cardsim.MsgStr("A bunch of lumberjacks just disappeared in a forest."), nil
|
||||||
},
|
},
|
||||||
Undo: func(p *Player) error {
|
Undo: func(p *Player) error {
|
||||||
@ -478,7 +497,7 @@ var cards = []Card{
|
|||||||
p.Stats.WarExpense -= 0.01
|
p.Stats.WarExpense -= 0.01
|
||||||
p.Stats.FoodSupply -= 0.05
|
p.Stats.FoodSupply -= 0.05
|
||||||
p.Stats.Secrecy += 0.10
|
p.Stats.Secrecy += 0.10
|
||||||
p.Stats.ForeignRelations += 0.01
|
p.Stats.ForeignRelations += 0.02
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
CanDo: YesWeCan,
|
CanDo: YesWeCan,
|
||||||
@ -514,7 +533,9 @@ var cards = []Card{
|
|||||||
p.Stats.ScavengingIncome += 0.02
|
p.Stats.ScavengingIncome += 0.02
|
||||||
p.Stats.WarExpense += 0.01
|
p.Stats.WarExpense += 0.01
|
||||||
p.Stats.FoodSupply += 0.01
|
p.Stats.FoodSupply += 0.01
|
||||||
p.Stats.HiddenRelPenalty += 0.02
|
p.Stats.Secrecy -= 0.05
|
||||||
|
p.Stats.HiddenRelPenalty += 0.05
|
||||||
|
// TODO: Subtract a compassion point.
|
||||||
return cardsim.MsgStr("Some merchants are even cordial as they pay off kobold bandits."), nil
|
return cardsim.MsgStr("Some merchants are even cordial as they pay off kobold bandits."), nil
|
||||||
},
|
},
|
||||||
Undo: func(p *Player) error {
|
Undo: func(p *Player) error {
|
||||||
@ -522,7 +543,8 @@ var cards = []Card{
|
|||||||
p.Stats.ScavengingIncome -= 0.02
|
p.Stats.ScavengingIncome -= 0.02
|
||||||
p.Stats.WarExpense -= 0.01
|
p.Stats.WarExpense -= 0.01
|
||||||
p.Stats.FoodSupply -= 0.01
|
p.Stats.FoodSupply -= 0.01
|
||||||
p.Stats.HiddenRelPenalty -= 0.02
|
p.Stats.Secrecy += 0.05
|
||||||
|
p.Stats.HiddenRelPenalty -= 0.05
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
CanDo: YesWeCan,
|
CanDo: YesWeCan,
|
||||||
@ -548,6 +570,222 @@ var cards = []Card{
|
|||||||
},
|
},
|
||||||
}, // End of "Raid on Surface Proposed" policies
|
}, // End of "Raid on Surface Proposed" policies
|
||||||
}, // End of "Raid on Surface Proposed" card
|
}, // End of "Raid on Surface Proposed" card
|
||||||
|
&SwitchingCard{ // Card 6
|
||||||
|
Name: cardsim.MsgStr("Book Publishing Threat to Secrecy?"),
|
||||||
|
Desc: cardsim.MsgStr("Concerns have been raised about one of the categories of income that your nation relies upon: books. To a lesser extent, art in general. Some artifacts, especially books, have the potential to give away details of your peoples' lives that help hostile powers locate your nation."),
|
||||||
|
After: ShuffleIntoBottomHalf,
|
||||||
|
IsValid: func(c Card, p *Player) bool {
|
||||||
|
return p.Stats.PublishingIncome > 0 && p.Stats.ForeignRelations < 0
|
||||||
|
},
|
||||||
|
Policies: []Policy{
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr(`The warrior who brought this to your attention stands at attention as they say, "The risk of discovery is an existential risk! Everything that makes us discoverable increases the intensity of conflict around our warrens, draining lives from our people! It is imperative that all respect our code of silence!"`),
|
||||||
|
EnactedDesc: cardsim.MsgStr("[current policy] What published material emanates from your nation is strictly censored of details that could indicate the locations of your homes."),
|
||||||
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
|
p.Stats.Secrecy += 0.03
|
||||||
|
p.Stats.PublishingIncome -= 0.05
|
||||||
|
p.Stats.EducationExpense -= 0.01
|
||||||
|
return cardsim.MsgStr("No history records the sobbing of kobold scribes."), nil
|
||||||
|
},
|
||||||
|
Undo: func(p *Player) error {
|
||||||
|
p.Stats.Secrecy -= 0.03
|
||||||
|
p.Stats.PublishingIncome += 0.05
|
||||||
|
p.Stats.EducationExpense += 0.01
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
CanDo: YesWeCan,
|
||||||
|
},
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr(`"No! Never! Er, maybe?" asks a dithering scribe, clutching a book worriedly to their chest. "Can we set up an office of censorship to read everything we publish and send it back for edits if it would reveal anything about our location? We don't have to stop publishing; our traders buy food with foreign currencies you know!"`),
|
||||||
|
EnactedDesc: cardsim.MsgStr("[current policy] The bureaucracy includes an office of censorship that reads all writings produced for sale to ensure that nothing is revealed about the location of any living kobolds."),
|
||||||
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
|
p.Stats.Secrecy += 0.01
|
||||||
|
p.Stats.PublishingIncome -= 0.01
|
||||||
|
p.Stats.BureaucracyExpense += 0.01
|
||||||
|
return cardsim.MsgStr("The censors are the most well-read kobolds in the nation."), nil
|
||||||
|
},
|
||||||
|
Undo: func(p *Player) error {
|
||||||
|
p.Stats.Secrecy -= 0.01
|
||||||
|
p.Stats.PublishingIncome += 0.01
|
||||||
|
p.Stats.BureaucracyExpense -= 0.01
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
CanDo: YesWeCan,
|
||||||
|
},
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr(`Your Minister of Education wrings his claws sadly. "I know it'll be a monumental expense in paper and ink, but we need to encourage the writing of diaries. Our secrecy is already flawed; there are already attacks against us. Maybe our attackers will find diaries and understand that we aren't just thieves hiding under the earth."`),
|
||||||
|
EnactedDesc: cardsim.MsgStr("[current policy] Even though recovered diaries point back to your outposts, your kobolds are encouraged to carry around diaries and record thoughts from their own lives into them."),
|
||||||
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
|
p.Stats.Secrecy -= 0.01
|
||||||
|
p.Stats.PublishingIncome += 0.02
|
||||||
|
p.Stats.EducationExpense += 0.03
|
||||||
|
p.Stats.PropagandaExpense += 0.01
|
||||||
|
p.Stats.HiddenRelPenalty -= 0.01
|
||||||
|
p.Stats.PointOfDimReturns += 0.01
|
||||||
|
// TODO: Add a compassion point
|
||||||
|
return cardsim.MsgStr("Heartless surfacers burn recovered kobold diaries."), nil
|
||||||
|
},
|
||||||
|
Undo: func(p *Player) error {
|
||||||
|
p.Stats.Secrecy += 0.01
|
||||||
|
p.Stats.PublishingIncome -= 0.02
|
||||||
|
p.Stats.EducationExpense -= 0.03
|
||||||
|
p.Stats.PropagandaExpense -= 0.01
|
||||||
|
p.Stats.HiddenRelPenalty += 0.01
|
||||||
|
p.Stats.PointOfDimReturns -= 0.01
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
CanDo: func(b *BasicPolicy, p *Player) bool {
|
||||||
|
return p.Stats.Secrecy < 1
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&VerbosePolicy{
|
||||||
|
Default: &BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr("Rejecting this will inspire celebrations among the authors of your nation."),
|
||||||
|
EnactedDesc: cardsim.MsgStr("The dangers posed by publishing information from your nation can be denied without changes in policy."),
|
||||||
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
|
p.Stats.PublishingIncome += 0.01
|
||||||
|
return cardsim.MsgStr("Kobold-hating adventurers know to be well-read."), nil
|
||||||
|
},
|
||||||
|
Undo: func(p *Player) error {
|
||||||
|
p.Stats.PublishingIncome -= 0.01
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
CanDo: YesWeCan,
|
||||||
|
},
|
||||||
|
Variants: []Policy{
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr("Your publishing industry is struggling under harsh restrictions and would soar if relieved."),
|
||||||
|
},
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr("The censorship office spends tax money to crimp tax income. It has opponents, though they stay quiet."),
|
||||||
|
},
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr("Rescinding the diary initiative would ding literacy rates, but it should save on taxes."),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, // End of "Book Publishing Threat to Security?" policies"
|
||||||
|
}, // End of "Book Publishing Threat to Security?" card
|
||||||
|
&SwitchingCard{ // Card 7
|
||||||
|
Name: cardsim.MsgStr("The Eyes that Break the Ground"),
|
||||||
|
Desc: cardsim.MsgStr("Some of our miners have recently been afflicted with shared hallucinations. They report feelings of being watched in dark areas - which, thanks to kobold darkvision, is nearly everywhere - as well as seeing black blotches covered in eyes on various surfaces. They're refusing to continue work."),
|
||||||
|
After: ShuffleIntoBottomHalf,
|
||||||
|
Policies: []Policy{
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr(`A friend of one of the afflicted managed to get onto your meeting schedule to say, "We work our miners hard. We need to give them more breaks. We need to fund more investments into healthcare, too. We can set our alchemists to work brewing potions that should help."`),
|
||||||
|
EnactedDesc: cardsim.MsgStr("[current policy] Afflicted miners are being dosed with soothing alchemical teas."),
|
||||||
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
|
p.Stats.MiningIncome -= 0.01
|
||||||
|
p.Stats.AlchemyIncome += 0.02
|
||||||
|
p.Stats.HealthcareExpense += 0.01 // TODO: Implement population boost from Healthcare investment. Maybe 1000x HealthcareInvestment, so that each 0.01 Healthcare Investment is a bonus of 10 kobolds to the population?
|
||||||
|
p.Stats.PointOfDimReturns += 0.02
|
||||||
|
// Note to self, add a compassion point.
|
||||||
|
return cardsim.MsgStr("Calming alchemical potions are displacing raw material sales in local markets."), nil
|
||||||
|
},
|
||||||
|
Undo: func(p *Player) error {
|
||||||
|
p.Stats.MiningIncome += 0.01
|
||||||
|
p.Stats.AlchemyIncome -= 0.02
|
||||||
|
p.Stats.HealthcareExpense -= 0.01
|
||||||
|
p.Stats.PointOfDimReturns -= 0.02
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
CanDo: YesWeCan,
|
||||||
|
},
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr(`Your chief economic planner regards the report with surprise and disgust. "This is just an excuse for slacking! Send them back into the mines and hire guards to make sure they double production! And if they see any more eyes in the dark, tell 'em to shatter 'em with detonation charges!"`),
|
||||||
|
EnactedDesc: cardsim.MsgStr("[current policy] The mines are taut as crazy miners with explosives work under the oversight of armed guards."),
|
||||||
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
|
p.Stats.BasePopulation -= 10
|
||||||
|
p.Stats.MiningIncome += 0.03
|
||||||
|
p.Stats.GadgetryIncome += 0.01
|
||||||
|
p.Stats.WarExpense += 0.01
|
||||||
|
p.Stats.PointOfDimReturns -= 0.01
|
||||||
|
return cardsim.MsgStr("Miners are known for their enthusiasm for explosives."), nil
|
||||||
|
},
|
||||||
|
Undo: func(p *Player) error {
|
||||||
|
p.Stats.MiningIncome -= 0.03
|
||||||
|
p.Stats.GadgetryIncome -= 0.01
|
||||||
|
p.Stats.WarExpense -= 0.01
|
||||||
|
p.Stats.PointOfDimReturns += 0.01
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
CanDo: YesWeCan,
|
||||||
|
},
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr(`The head of your Ministry of Soothsaying, Shamanism, and Otherworldly Affairs has reacted with unsettling enthusiasm. "Shared hallucinations? Of eyes in the dark? This is an opportunity! We just need to train the afflicted into new spellcasters. We could learn the kind of secrets that shatter minds!"`),
|
||||||
|
EnactedDesc: cardsim.MsgStr("[current policy] Mine policy is to watch for this symptom and trial the afflicted in planar summoning."),
|
||||||
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
|
p.Stats.BasePopulation -= 20
|
||||||
|
p.Stats.MiningIncome -= 0.01
|
||||||
|
p.Stats.PlanarIncome += 0.03
|
||||||
|
p.Stats.ResearchSubsExpense += 0.01
|
||||||
|
p.Stats.PointOfDimReturns += 0.02
|
||||||
|
// TODO: Add more consequences to questionable planar contacts.
|
||||||
|
return cardsim.MsgStr("The nation is infamous for producing crazed magi."), nil
|
||||||
|
},
|
||||||
|
Undo: func(p *Player) error {
|
||||||
|
p.Stats.BasePopulation += 20
|
||||||
|
p.Stats.MiningIncome += 0.01
|
||||||
|
p.Stats.PlanarIncome += 0.03
|
||||||
|
p.Stats.ResearchSubsExpense -= 0.01
|
||||||
|
p.Stats.PointOfDimReturns -= 0.02
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
CanDo: YesWeCan,
|
||||||
|
},
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr(`The manager of one of the affected signed the right papers to get into this meeting. Regarding you coldly, they say, "They're slacking, and it's not right to permit anything to change. We don't soothing alchemicals, we don't need new guards, adding explosives to the mix is just chaotic, and recruiting crazies as spellcasters is insane itself. Trust in the miners to enforce discipline amongst each other. We don't permit anyone to hold up production."`),
|
||||||
|
EnactedDesc: cardsim.MsgStr("[current policy] The miners are dealing with laggard elements on their own."),
|
||||||
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
|
p.Stats.BasePopulation -= 20
|
||||||
|
p.Stats.MiningIncome += 0.01
|
||||||
|
p.Stats.PointOfDimReturns += 0.01
|
||||||
|
// TODO: Take away a point of compassion for this.
|
||||||
|
return cardsim.MsgStr("Sufficient misery unmakes people."), nil
|
||||||
|
},
|
||||||
|
Undo: func(p *Player) error {
|
||||||
|
p.Stats.BasePopulation += 10
|
||||||
|
p.Stats.MiningIncome -= 0.01
|
||||||
|
p.Stats.PointOfDimReturns -= 0.01
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
CanDo: YesWeCan,
|
||||||
|
},
|
||||||
|
&VerbosePolicy{
|
||||||
|
Default: &BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr("Maybe we can just work around the afflicted. Let them rest and find other employment."),
|
||||||
|
EnactedDesc: cardsim.MsgStr("[current policy] We're encouraging the afflicted to rest and find other employment."),
|
||||||
|
Do: func(p *Player) (cardsim.Message, error) {
|
||||||
|
p.Stats.MiningIncome -= 0.01
|
||||||
|
p.Stats.PointOfDimReturns += 0.01
|
||||||
|
// TODO: Add a compassion point.
|
||||||
|
return cardsim.MsgStr("Mining is just too strenuous for some kobolds."), nil
|
||||||
|
},
|
||||||
|
Undo: func(p *Player) error {
|
||||||
|
p.Stats.MiningIncome += 0.01
|
||||||
|
p.Stats.PointOfDimReturns -= 0.01
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
CanDo: YesWeCan,
|
||||||
|
},
|
||||||
|
Variants: []Policy{
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr("Rescinding the healthcare subsidy might ding our population, but it shouldn't ding our compassion. We're being very gentle with these people."),
|
||||||
|
},
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr("Withdrawing explosives access from the suffering may be a life-saving action..."),
|
||||||
|
},
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr("Maybe we should close the door on this particular otherworldly contact source."),
|
||||||
|
},
|
||||||
|
&BasicPolicy{
|
||||||
|
UnenactedDesc: cardsim.MsgStr("The miners' culture is harsh! There's an argument here for protecting the suffering."),
|
||||||
|
},
|
||||||
|
nil,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, // end of "The Eyes that Break the Ground" policies
|
||||||
|
}, // end of "The Eyes that Break the Ground" card
|
||||||
} // end of card list
|
} // end of card list
|
||||||
|
|
||||||
func initDeck(d *cardsim.Deck[*KoboldMine]) {
|
func initDeck(d *cardsim.Deck[*KoboldMine]) {
|
||||||
|
@ -10,58 +10,205 @@ import (
|
|||||||
type KoboldMine struct {
|
type KoboldMine struct {
|
||||||
BasePopulation float64 `cardsim:"stathidden"`
|
BasePopulation float64 `cardsim:"stathidden"`
|
||||||
|
|
||||||
MiningIncome float64 `cardsim:"stat" cardsim_name:"Mining Productivity"`
|
MiningIncome float64 `cardsim:"stathidden" cardsim_name:"Mining Productivity"`
|
||||||
ScavengingIncome float64 `cardsim:"stat" cardsim_name:"Scavenging Productivity"`
|
ScavengingIncome float64 `cardsim:"stathidden" cardsim_name:"Scavenging Productivity"`
|
||||||
AlchemyIncome float64 `cardsim:"stat" cardsim_name:"Alchemy Productivity"`
|
AlchemyIncome float64 `cardsim:"stathidden" cardsim_name:"Alchemy Productivity"`
|
||||||
HospitalityIncome float64 `cardsim:"stat" cardsim_name:"Hospitality Productivity"`
|
HospitalityIncome float64 `cardsim:"stathidden" cardsim_name:"Hospitality Productivity"`
|
||||||
AgricultureIncome float64 `cardsim:"stat" cardsim_name:"Agriculture Productivity"`
|
AgricultureIncome float64 `cardsim:"stathidden" cardsim_name:"Agriculture Productivity"`
|
||||||
ManufacturingIncome float64 `cardsim:"stat" cardsim_name:"Manufacturing Productivity"`
|
ManufacturingIncome float64 `cardsim:"stathidden" cardsim_name:"Manufacturing Productivity"`
|
||||||
PlanarIncome float64 `cardsim:"stat" cardsim_name:"Planar Productivity"`
|
PlanarIncome float64 `cardsim:"stathidden" cardsim_name:"Planar Productivity"`
|
||||||
PublishingIncome float64 `cardsim:"stat" cardsim_name:"Publishing Productivity"`
|
PublishingIncome float64 `cardsim:"stathidden" cardsim_name:"Publishing Productivity"`
|
||||||
ForestryIncome float64 `cardsim:"stat" cardsim_name:"Forestry Productivity"`
|
ForestryIncome float64 `cardsim:"stathidden" cardsim_name:"Forestry Productivity"`
|
||||||
FinanceIncome float64 `cardsim:"stat" cardsim_name:"Finance Productivity"`
|
FinanceIncome float64 `cardsim:"stathidden" cardsim_name:"Finance Productivity"`
|
||||||
GadgetryIncome float64 `cardsim:"stat" cardsim_name:"Gadgetry Productivity"`
|
GadgetryIncome float64 `cardsim:"stathidden" cardsim_name:"Gadgetry Productivity"`
|
||||||
FishingIncome float64 `cardsim:"stat" cardsim_name:"Fishing Productivity"`
|
FishingIncome float64 `cardsim:"stathidden" cardsim_name:"Fishing Productivity"`
|
||||||
ConstructionIncome float64 `cardsim:"stat" cardsim_name:"Construction Productivity"`
|
ConstructionIncome float64 `cardsim:"stathidden" cardsim_name:"Construction Productivity"`
|
||||||
|
|
||||||
PropagandaExpense float64 `cardsim:"stat" cardsim_name:"Propaganda Investment"`
|
PropagandaExpense float64 `cardsim:"stathidden" cardsim_name:"Propaganda Investment"`
|
||||||
BureaucracyExpense float64 `cardsim:"stat" cardsim_name:"Bureaucracy Investment"`
|
BureaucracyExpense float64 `cardsim:"stathidden" cardsim_name:"Bureaucracy Investment"`
|
||||||
WarExpense float64 `cardsim:"stat" cardsim_name:"War Investment"`
|
WarExpense float64 `cardsim:"stathidden" cardsim_name:"War Investment"`
|
||||||
QoLExpense float64 `cardsim:"stat" cardsim_name:"QoL Investment"`
|
QoLExpense float64 `cardsim:"stathidden" cardsim_name:"QoL Investment"`
|
||||||
LogisticsExpense float64 `cardsim:"stat" cardsim_name:"Logistics Investment"`
|
LogisticsExpense float64 `cardsim:"stathidden" cardsim_name:"Logistics Investment"`
|
||||||
DragonSubsExpense float64 `cardsim:"stat" cardsim_name:"Dragon Subsidies Investment"`
|
DragonSubsExpense float64 `cardsim:"stathidden" cardsim_name:"Dragon Subsidies Investment"`
|
||||||
ResearchSubsExpense float64 `cardsim:"stat" cardsim_name:"Research Subsidies Investment"`
|
ResearchSubsExpense float64 `cardsim:"stathidden" cardsim_name:"Research Subsidies Investment"`
|
||||||
EducationExpense float64 `cardsim:"stat" cardsim_name:"Education Investment"`
|
EducationExpense float64 `cardsim:"stathidden" cardsim_name:"Education Investment"`
|
||||||
HealthcareExpense float64 `cardsim:"stat" cardsim_name:"Healthcare Investment"`
|
HealthcareExpense float64 `cardsim:"stathidden" cardsim_name:"Healthcare Investment"`
|
||||||
ForeignRelExpense float64 `cardsim:"stat" cardsim_name:"Foreign Relations Investment"`
|
ForeignRelExpense float64 `cardsim:"stathidden" cardsim_name:"Foreign Relations Investment"`
|
||||||
PoliceExpense float64 `cardsim:"stat" cardsim_name:"Law Enforcement Investment"`
|
PoliceExpense float64 `cardsim:"stathidden" cardsim_name:"Law Enforcement Investment"`
|
||||||
EconPlanExpense float64 `cardsim:"stat" cardsim_name:"Economic Planning Investment"`
|
EconPlanExpense float64 `cardsim:"stathidden" cardsim_name:"Economic Planning Investment"`
|
||||||
ParksExpense float64 `cardsim:"stat" cardsim_name:"Parks and Aesthetics Investment"`
|
ParksExpense float64 `cardsim:"stathidden" cardsim_name:"Parks and Aesthetics Investment"`
|
||||||
FaithExpense float64 `cardsim:"stat" cardsim_name:"Faith Investment"`
|
FaithExpense float64 `cardsim:"stathidden" cardsim_name:"Faith Investment"`
|
||||||
|
|
||||||
FoodSupply float64 `cardsim:"stathidden"`
|
FoodSupply float64 `cardsim:"stathidden"`
|
||||||
ForeignRelations float64 `cardsim:"stathidden"`
|
ForeignRelations float64 `cardsim:"stathidden"`
|
||||||
HiddenRelPenalty float64 `cardsim:"stathidden"`
|
HiddenRelPenalty float64 `cardsim:"stathidden"` // Lower is better.
|
||||||
Secrecy float64 `cardsim:"stathidden"`
|
Secrecy float64 `cardsim:"stathidden"`
|
||||||
|
PointOfDimReturns float64 `cardsim:"stathidden"`
|
||||||
|
|
||||||
// AnotherExpense float64 `cardsim:"hiddenround5"`
|
// AnotherExpense float64 `cardsim:"hiddenround5"`
|
||||||
// A different way of adding stats that is slightly more empowering.
|
// A different way of adding stats that is slightly more empowering.
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *KoboldMine) ProductivityFunc(s *float64) func() float64 {
|
func (k *KoboldMine) ProductivityFunc(s float64) func() float64 {
|
||||||
return func() float64 {
|
return func() float64 {
|
||||||
return *s * float64(k.BasePopulation)
|
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 {
|
func (k *KoboldMine) TotalSectorIncome() float64 {
|
||||||
return float64(k.Kobolds()) * (k.MiningIncome + k.ScavengingIncome + k.AlchemyIncome + k.HospitalityIncome + k.AgricultureIncome + k.ManufacturingIncome + k.PlanarIncome + k.PublishingIncome + k.FinanceIncome + k.GadgetryIncome + k.FishingIncome + k.ConstructionIncome)
|
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 {
|
func (k *KoboldMine) TotalGovExpense() float64 {
|
||||||
return float64(k.Kobolds()) * (k.PropagandaExpense + k.BureaucracyExpense + k.WarExpense + k.QoLExpense + k.LogisticsExpense + k.DragonSubsExpense + k.ResearchSubsExpense + k.EducationExpense + k.HealthcareExpense + k.ForeignRelExpense + k.PoliceExpense + k.EconPlanExpense + k.ParksExpense + k.FaithExpense)
|
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) TotalEconomicPotential() float64 {
|
||||||
|
// return (math.Max(k.MiningIncome, 0.01) + math.Max(k.ScavengingIncome, 0) + math.Max(k.AlchemyIncome, 0) + math.Max(k.HospitalityIncome, 0) + math.Max(k.AgricultureIncome, 0) + math.Max(k.ManufacturingIncome, 0) + math.Max(k.PlanarIncome, 0) + math.Max(k.PublishingIncome, 0) + math.Max(k.FinanceIncome, 0) + math.Max(k.GadgetryIncome, 0) + math.Max(k.FishingIncome, 0) + math.Max(k.ConstructionIncome, 0.02) + math.Max(k.PropagandaExpense, 0) + math.Max(k.BureaucracyExpense, 0) + math.Max(k.WarExpense, 0) + math.Max(k.QoLExpense, 0) + math.Max(k.LogisticsExpense, 0) + math.Max(k.DragonSubsExpense, 0) + math.Max(k.ResearchSubsExpense, 0) + math.Max(k.EducationExpense, 0) + math.Max(k.HealthcareExpense, 0) + math.Max(k.ForeignRelExpense, 0) + math.Max(k.PoliceExpense, 0) + math.Max(k.EconPlanExpense, 0) + math.Max(k.ParksExpense, 0) + math.Max(k.FaithExpense, 0)) * 0.8
|
||||||
|
//} // This function is intended to enable "crowding out" effects at a later point. Each +1 increase in overall productivity increases TEP by 0.8, losing 1/5th of the gain to crowding, which should manifest as everything else declining. Now, uh... How do I scale investments by the TEP stat? With a simple multiplication, a 0.01 increase to mining would be a 0.08 increase to everything else. Damn it, I thought I had something.
|
||||||
|
|
||||||
func (k *KoboldMine) Taxation() float64 {
|
func (k *KoboldMine) Taxation() float64 {
|
||||||
return (k.TotalGovExpense() / (k.TotalSectorIncome() + k.TotalGovExpense())) * 100
|
return (k.TotalGovExpense() / (k.TotalSectorIncome() + k.TotalGovExpense())) * 100
|
||||||
}
|
}
|
||||||
@ -71,7 +218,7 @@ func (k *KoboldMine) StatTaxRate() float64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (k *KoboldMine) Kobolds() int64 {
|
func (k *KoboldMine) Kobolds() int64 {
|
||||||
return int64(k.BasePopulation * k.FoodSupply * (1 - 0.5*(k.StatObesity()/100)) * (1 + k.TrueForeignRelations()))
|
return int64((k.BasePopulation + (k.HealthcareExpense * 1000)) * k.FoodSupply * (1 - 0.5*(k.StatObesity()/100)) * (1 + k.TrueForeignRelations()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *KoboldMine) DisplayedFoodSupply() float64 {
|
func (k *KoboldMine) DisplayedFoodSupply() float64 {
|
||||||
@ -99,111 +246,111 @@ func (k *KoboldMine) Stats() []cardsim.Stat {
|
|||||||
funcs := []cardsim.Stat{
|
funcs := []cardsim.Stat{
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Mining Income",
|
"Mining Income",
|
||||||
k.ProductivityFunc(&k.MiningIncome),
|
k.ProductivityFunc(k.TrueMiningIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Scavenging Income",
|
"Scavenging Income",
|
||||||
k.ProductivityFunc(&k.ScavengingIncome),
|
k.ProductivityFunc(k.TrueScavengingIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Alchemy Income",
|
"Alchemy Income",
|
||||||
k.ProductivityFunc(&k.AlchemyIncome),
|
k.ProductivityFunc(k.TrueAlchemyIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Hospitality Income",
|
"Hospitality Income",
|
||||||
k.ProductivityFunc(&k.HospitalityIncome),
|
k.ProductivityFunc(k.TrueHospitalityIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Agriculture Income",
|
"Agriculture Income",
|
||||||
k.ProductivityFunc(&k.AgricultureIncome),
|
k.ProductivityFunc(k.TrueAgricultureIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Manufacturing Income",
|
"Manufacturing Income",
|
||||||
k.ProductivityFunc(&k.ManufacturingIncome),
|
k.ProductivityFunc(k.TrueManufacturingIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Planar Harvesting Income",
|
"Planar Harvesting Income",
|
||||||
k.ProductivityFunc(&k.PlanarIncome),
|
k.ProductivityFunc(k.TruePlanarIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Book Publishing Income",
|
"Book Publishing Income",
|
||||||
k.ProductivityFunc(&k.PublishingIncome),
|
k.ProductivityFunc(k.TruePublishingIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Forestry Income",
|
"Forestry Income",
|
||||||
k.ProductivityFunc(&k.ForestryIncome),
|
k.ProductivityFunc(k.TrueForestryIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Finance Income",
|
"Finance Income",
|
||||||
k.ProductivityFunc(&k.FinanceIncome),
|
k.ProductivityFunc(k.TrueFinanceIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Gadgetry Income",
|
"Gadgetry Income",
|
||||||
k.ProductivityFunc(&k.GadgetryIncome),
|
k.ProductivityFunc(k.TrueGadgetryIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Fishing Income",
|
"Fishing Income",
|
||||||
k.ProductivityFunc(&k.FishingIncome),
|
k.ProductivityFunc(k.TrueFishingIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Construction Income",
|
"Construction Income",
|
||||||
k.ProductivityFunc(&k.ConstructionIncome),
|
k.ProductivityFunc(k.TrueConstructionIncome()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Propaganda Expense",
|
"Propaganda Expense",
|
||||||
k.ProductivityFunc(&k.PropagandaExpense),
|
k.ProductivityFunc(k.TruePropagandaExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Bureaucracy Expense",
|
"Bureaucracy Expense",
|
||||||
k.ProductivityFunc(&k.BureaucracyExpense),
|
k.ProductivityFunc(k.TrueBureaucracyExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"War Expense",
|
"War Expense",
|
||||||
k.ProductivityFunc(&k.WarExpense),
|
k.ProductivityFunc(k.TrueWarExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"QoL Expense",
|
"QoL Expense",
|
||||||
k.ProductivityFunc(&k.QoLExpense),
|
k.ProductivityFunc(k.TrueQoLExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Logistics Expense",
|
"Logistics Expense",
|
||||||
k.ProductivityFunc(&k.LogisticsExpense),
|
k.ProductivityFunc(k.TrueLogisticsExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Dragon Subsidies",
|
"Dragon Subsidies",
|
||||||
k.ProductivityFunc(&k.DragonSubsExpense),
|
k.ProductivityFunc(k.TrueDragonSubsExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Research Subsidies",
|
"Research Subsidies",
|
||||||
k.ProductivityFunc(&k.ResearchSubsExpense),
|
k.ProductivityFunc(k.TrueResearchSubsExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Education Expense",
|
"Education Expense",
|
||||||
k.ProductivityFunc(&k.EducationExpense),
|
k.ProductivityFunc(k.TrueEducationExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Healthcare Expense",
|
"Healthcare Expense",
|
||||||
k.ProductivityFunc(&k.HealthcareExpense),
|
k.ProductivityFunc(k.TrueHealthcareExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Foreign Relations Expense",
|
"Foreign Relations Expense",
|
||||||
k.ProductivityFunc(&k.ForeignRelExpense),
|
k.ProductivityFunc(k.TrueForeignRelExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Law Enforcement Expense",
|
"Law Enforcement Expense",
|
||||||
k.ProductivityFunc(&k.PoliceExpense),
|
k.ProductivityFunc(k.TruePoliceExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Economic Planning Expense",
|
"Economic Planning Expense",
|
||||||
k.ProductivityFunc(&k.EconPlanExpense),
|
k.ProductivityFunc(k.TrueEconPlanExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Parks and Aesthetics Expense",
|
"Parks and Aesthetics Expense",
|
||||||
k.ProductivityFunc(&k.ParksExpense),
|
k.ProductivityFunc(k.TrueParksExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Faith Expense",
|
"Faith Expense",
|
||||||
k.ProductivityFunc(&k.FaithExpense),
|
k.ProductivityFunc(k.TrueFaithExpense()),
|
||||||
),
|
),
|
||||||
cardsim.StatFunc(
|
cardsim.StatFunc(
|
||||||
"Total Sector Income",
|
"Total Sector Income",
|
||||||
@ -269,5 +416,8 @@ func NewKoboldMine() *KoboldMine {
|
|||||||
ForeignRelations: -0.40,
|
ForeignRelations: -0.40,
|
||||||
HiddenRelPenalty: -0.01,
|
HiddenRelPenalty: -0.01,
|
||||||
Secrecy: .95,
|
Secrecy: .95,
|
||||||
|
PointOfDimReturns: 1.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note that the mine initializes with 1.02 points of overall productivity.
|
||||||
|
Loading…
Reference in New Issue
Block a user