New card, update for crime stats

This commit is contained in:
Rakeela Windrider 2023-05-23 11:30:21 -07:00
parent c30254a36d
commit f53beb4b17

View File

@ -20,6 +20,10 @@ var cards = []Card{
p.Stats.FoodSupply += 0.01 p.Stats.FoodSupply += 0.01
p.Stats.ObesogenicFood -= 0.01 p.Stats.ObesogenicFood -= 0.01
p.Stats.ForeignRelations -= 0.02 p.Stats.ForeignRelations -= 0.02
p.Stats.Rebellion -= 0.03
p.Stats.Madness += 0.01
p.Stats.Cruelty += 0.01
p.Stats.Authoritarianism += 0.04
return cardsim.MsgStr("Kobolds are known to be born warriors."), nil return cardsim.MsgStr("Kobolds are known to be born warriors."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
@ -29,6 +33,10 @@ var cards = []Card{
p.Stats.FoodSupply -= 0.01 p.Stats.FoodSupply -= 0.01
p.Stats.ObesogenicFood += 0.01 p.Stats.ObesogenicFood += 0.01
p.Stats.ForeignRelations += 0.02 p.Stats.ForeignRelations += 0.02
p.Stats.Rebellion += 0.03
p.Stats.Madness -= 0.01
p.Stats.Cruelty -= 0.01
p.Stats.Authoritarianism -= 0.04
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -71,6 +79,8 @@ var cards = []Card{
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 p.Stats.PointOfDimReturns += 0.01
p.Stats.Madness -= 0.01
p.Stats.Cruelty -= 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 {
@ -81,6 +91,8 @@ var cards = []Card{
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 p.Stats.PointOfDimReturns -= 0.01
p.Stats.Madness += 0.01
p.Stats.Cruelty += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -104,7 +116,7 @@ var cards = []Card{
Do: OverrideMsg(cardsim.MsgStr("Militant natalism has been reduced by policy.")), Do: OverrideMsg(cardsim.MsgStr("Militant natalism has been reduced by policy.")),
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`"Dig deeper" pressures in your nation may be excessive.`), UnenactedDesc: cardsim.MsgStr(`"Dig deeper" pressures in your tribe may be excessive.`),
Do: OverrideMsg(cardsim.MsgStr("Some of the lower depths are being abandoned.")), Do: OverrideMsg(cardsim.MsgStr("Some of the lower depths are being abandoned.")),
}, },
&BasicPolicy{ &BasicPolicy{
@ -120,12 +132,12 @@ var cards = []Card{
}, // End of "Warborn" policies }, // End of "Warborn" policies
}, // End of "Warborn" card }, // End of "Warborn" card
&SwitchingCard{ // Card 2 &SwitchingCard{ // Card 2
Name: cardsim.MsgStr("International Festival of Bureaucracy"), Name: cardsim.MsgStr("Pan-Tribal 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 tribes, celebrating the orderly nature of the kobold soul! That's right, it's the Pan-Tribal Festival of Bureaucracy!"),
After: ShuffleIntoBottomHalf, After: ShuffleIntoBottomHalf,
Policies: []Policy{ Policies: []Policy{
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`Your Minister of Administration is practically jumping for joy. "This is our opportunity to prove that we're a prosperous society and attract some fresh blood! We need to raise salaries in the bureaucracy, grant some time off to our bureaucrats to make sure they can attend, and try to hire talent away from other nations. We'll forge productive trade relations by this, you'll see!`), UnenactedDesc: cardsim.MsgStr(`Your Minister of Administration is practically jumping for joy. "This is our opportunity to prove that we're a prosperous society and attract some fresh blood! We need to raise salaries in the bureaucracy, grant some time off to our bureaucrats to make sure they can attend, and try to hire talent away from other tribes. We'll forge productive trade relations by this, you'll see!`),
EnactedDesc: cardsim.MsgStr("[current policy] Your bureaucrats are really looking forward to attending, where they can boast about how the festival boosted their salaries."), EnactedDesc: cardsim.MsgStr("[current policy] Your bureaucrats are really looking forward to attending, where they can boast about how the festival boosted their salaries."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation += 60 p.Stats.BasePopulation += 60
@ -133,6 +145,7 @@ var cards = []Card{
p.Stats.BureaucracyExpense += 0.03 p.Stats.BureaucracyExpense += 0.03
p.Stats.FoodSupply += 0.02 p.Stats.FoodSupply += 0.02
p.Stats.PointOfDimReturns += 0.01 p.Stats.PointOfDimReturns += 0.01
p.Stats.Gullibility -= 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 {
@ -141,21 +154,24 @@ var cards = []Card{
p.Stats.BureaucracyExpense -= 0.03 p.Stats.BureaucracyExpense -= 0.03
p.Stats.FoodSupply -= 0.02 p.Stats.FoodSupply -= 0.02
p.Stats.PointOfDimReturns -= 0.01 p.Stats.PointOfDimReturns -= 0.01
p.Stats.Gullibility += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`Your Minister of Finance pulls you aside. "This is a good opportunity to head-hunt. Bureaucrats from many nations will be attending. There's got to be some who'll work for less than the ones we've got. There are some terribly threatened or impoverished communities among kobolds.`), UnenactedDesc: cardsim.MsgStr(`Your Minister of Finance pulls you aside. "This is a good opportunity to head-hunt. Bureaucrats from many tribes will be attending. There's got to be some who'll work for less than the ones we've got. There are some terribly threatened or impoverished communities among kobolds.`),
EnactedDesc: cardsim.MsgStr("[current policy] Your nation's policy is clear: the festival of bureaucracy is a chance to trade workers with other kobold nations in your attempts to build a more efficient government."), EnactedDesc: cardsim.MsgStr("[current policy] Your tribe's policy is clear: the festival of bureaucracy is a chance to trade workers with other kobold tribes in your attempts to build a more efficient government."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation += 20 p.Stats.BasePopulation += 20
p.Stats.BureaucracyExpense -= 0.01 p.Stats.BureaucracyExpense -= 0.01
p.Stats.Gullibility -= 0.01
return cardsim.MsgStr("Immigrant bureaucrats complain about being under-appreciated."), nil return cardsim.MsgStr("Immigrant bureaucrats complain about being under-appreciated."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.BasePopulation -= 20 p.Stats.BasePopulation -= 20
p.Stats.BureaucracyExpense += 0.01 p.Stats.BureaucracyExpense += 0.01
p.Stats.Gullibility += 0.01
return nil return nil
}, },
CanDo: func(b *BasicPolicy, p *Player) bool { CanDo: func(b *BasicPolicy, p *Player) bool {
@ -170,18 +186,20 @@ var cards = []Card{
// Original implementation preserved in the hopes that I'll learn this stuff. This is equivalent to the shorter code above. I'll probably remove this comment eventually. Sincerely, Rakeela. // Original implementation preserved in the hopes that I'll learn this stuff. This is equivalent to the shorter code above. I'll probably remove this comment eventually. Sincerely, Rakeela.
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`Your Minister of Finance greets you exuberantly. "We've trimmed the wages of the bureaucracy beautifully, but maybe we can scout some outright volunteers. Some nations are absolute disasters, after all.`), UnenactedDesc: cardsim.MsgStr(`Your Minister of Finance greets you exuberantly. "We've trimmed the wages of the bureaucracy beautifully, but maybe we can scout some outright volunteers. Some tribes are absolute disasters, after all.`),
EnactedDesc: cardsim.MsgStr(`[current policy] It's hard to find volunteer workers at the festival, but your nation is doing its best.`), EnactedDesc: cardsim.MsgStr(`[current policy] It's hard to find volunteer workers at the festival, but your tribe is doing its best.`),
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 p.Stats.PointOfDimReturns -= 0.01
p.Stats.Rebellion += 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 p.Stats.PointOfDimReturns += 0.01
p.Stats.Rebellion -= 0.01
return nil return nil
}, },
CanDo: func(b *BasicPolicy, p *Player) bool { CanDo: func(b *BasicPolicy, p *Player) bool {
@ -190,11 +208,11 @@ var cards = []Card{
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`One of your non-bureaucrat friends has been in a foul temper. "This festival is everything that's wrong with our society. Life isn't about filling out forms. We ought to snub this festival and outright fire some bureaucrats."`), UnenactedDesc: cardsim.MsgStr(`One of your non-bureaucrat friends has been in a foul temper. "This festival is everything that's wrong with our society. Life isn't about filling out forms. We ought to snub this festival and outright fire some bureaucrats."`),
EnactedDesc: cardsim.MsgStr("Your nation currently bans the International Festival of Bureaucracy. There will be no local celebration without a policy change."), EnactedDesc: cardsim.MsgStr("Your tribe currently bans the Pan-Tribal Festival of Bureaucracy. There will be no local celebration without a policy change."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation -= 80 p.Stats.BasePopulation -= 80
p.Stats.BureaucracyExpense -= 0.04 p.Stats.BureaucracyExpense -= 0.04
return cardsim.MsgStr("A wave of bureaucrats just emigrated along with kobolds incensed by the nation's lack of respect for administration."), nil return cardsim.MsgStr("A wave of bureaucrats just emigrated along with kobolds incensed by the tribe's lack of respect for administration."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.BasePopulation += 80 p.Stats.BasePopulation += 80
@ -209,7 +227,7 @@ var cards = []Card{
EnactedDesc: cardsim.MsgStr("Some kobolds will attend the festival on their own. No change is expected."), EnactedDesc: cardsim.MsgStr("Some kobolds will attend the festival on their own. No change is expected."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation -= 20 p.Stats.BasePopulation -= 20
return cardsim.MsgStr("A festival of bureaucracy lured away a few kobolds to other nations."), nil return cardsim.MsgStr("A festival of bureaucracy lured away a few kobolds to other tribes."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.BasePopulation += 20 p.Stats.BasePopulation += 20
@ -230,24 +248,24 @@ var cards = []Card{
}, },
EnactFunc: func(p *Player) (cardsim.Message, error) { EnactFunc: func(p *Player) (cardsim.Message, error) {
if p.Stats.BureaucracyExpense >= -0.03 { if p.Stats.BureaucracyExpense >= -0.03 {
return cardsim.MsgStr("A festival of bureaucracy just saw the nation's bureaucracy rebuilt."), ErrKeepMessage return cardsim.MsgStr("A festival of bureaucracy just saw the tribe's bureaucracy rebuilt."), ErrKeepMessage
} }
return cardsim.MsgStr("A festival of bureaucracy brought in immigrants wondering at the nation's lack thereof."), ErrKeepMessage return cardsim.MsgStr("A festival of bureaucracy brought in immigrants wondering at the tribe's lack thereof."), ErrKeepMessage
}, },
}, },
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 "Pan-Tribal Festival of Bureaucracy" policies
}, // End of "International Festival of Bureaucracy" card }, // End of "Pan-Tribal Festival of Bureaucracy" card
&SwitchingCard{ // Card 3 &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 tribes 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,
Policies: []Policy{ Policies: []Policy{
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`Speaking for the conservative opinion, one prospective merchant says, "We need illusions. Our priority needs to be trading to acquire or studying to create artifacts of disguising. The high start-up costs are balanced by free movement in a surface society that frequently detests us."`), UnenactedDesc: cardsim.MsgStr(`Speaking for the conservative opinion, one prospective merchant says, "We need illusions. Our priority needs to be studying or trading to acquire or create spells or artifacts of disguising. The high start-up costs will be balanced by subsequent free movement in a surface society that detests us."`),
EnactedDesc: cardsim.MsgStr("[current policy] Your merchants rely on magical disguises to avoid being caught as kobolds while doing business on the surface."), EnactedDesc: cardsim.MsgStr("[current policy] Your merchants rely on magical disguises to avoid being identified as kobolds while doing business on the surface."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.ManufacturingIncome += 0.03 p.Stats.ManufacturingIncome += 0.03
p.Stats.LogisticsExpense += 0.04 p.Stats.LogisticsExpense += 0.04
@ -258,6 +276,9 @@ var cards = []Card{
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 p.Stats.PointOfDimReturns += 0.05
p.Stats.Rebellion += 0.01
p.Stats.Greed += 0.01
p.Stats.Gullibility += 0.01
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 {
@ -270,13 +291,16 @@ var cards = []Card{
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 p.Stats.PointOfDimReturns -= 0.05
p.Stats.Rebellion -= 0.01
p.Stats.Greed -= 0.01
p.Stats.Gullibility -= 0.01
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(`[current policy] 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 tribe'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
@ -294,6 +318,7 @@ var cards = []Card{
p.Stats.ForeignRelations += 0.05 p.Stats.ForeignRelations += 0.05
p.Stats.FoodSupply += 0.03 p.Stats.FoodSupply += 0.03
p.Stats.PointOfDimReturns += 0.1 p.Stats.PointOfDimReturns += 0.1
p.Stats.Cruelty -= 0.01
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 {
@ -313,6 +338,7 @@ var cards = []Card{
p.Stats.ForeignRelations -= 0.05 p.Stats.ForeignRelations -= 0.05
p.Stats.FoodSupply -= 0.03 p.Stats.FoodSupply -= 0.03
p.Stats.PointOfDimReturns += 0.1 p.Stats.PointOfDimReturns += 0.1
p.Stats.Cruelty -= 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -330,6 +356,8 @@ var cards = []Card{
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 p.Stats.PointOfDimReturns += 0.05
p.Stats.Greed += 0.03
p.Stats.Gullibility -= 0.02
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 {
@ -342,13 +370,15 @@ var cards = []Card{
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 p.Stats.PointOfDimReturns -= 0.05
p.Stats.Greed -= 0.03
p.Stats.Gullibility += 0.02
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`A mining forebold registered for the right to attend this meeting, and says, "Surfacers can't be trusted in business and we shouldn't be supporting them with trade. We need underground roads to ease trade with other kobold nations. It's a massive investment in smoothing current tunnels and digging new ones, but think of the reward: a world of underground civilizations supporting each other."`), UnenactedDesc: cardsim.MsgStr(`A mining forebold registered for the right to attend this meeting, and says, "Surfacers can't be trusted and we shouldn't be supporting them with trade. We need underground roads to ease trade with other kobolds. It's a massive investment, but think of the reward: a world of underground civilizations supporting each other."`),
EnactedDesc: cardsim.MsgStr(`[currentpolicy] Your merchants have been directed to focus on trade with other kobolds, and your miners are perpetually tunnelling towards other kobold nations in pursuit of the dream of a world of underground roads.`), EnactedDesc: cardsim.MsgStr(`[currentpolicy] Your merchants have been directed to focus on trade with other kobolds, and your miners are perpetually tunnelling towards other kobold tribes in pursuit of the dream of a world of underground roads.`),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.MiningIncome += 0.05 p.Stats.MiningIncome += 0.05
p.Stats.ConstructionIncome += 0.01 p.Stats.ConstructionIncome += 0.01
@ -356,6 +386,7 @@ var cards = []Card{
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 p.Stats.PointOfDimReturns += 0.1
p.Stats.Gullibility -= 0.01
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 {
@ -365,6 +396,7 @@ var cards = []Card{
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 p.Stats.PointOfDimReturns -= 0.1
p.Stats.Gullibility += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -386,7 +418,7 @@ var cards = []Card{
UnenactedDesc: cardsim.MsgStr("Rejecting the illusion-based merchantry will cost us a great deal in trade and surface food, but we can certainly do it."), UnenactedDesc: cardsim.MsgStr("Rejecting the illusion-based merchantry will cost us a great deal in trade and surface food, but we can certainly do it."),
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr("Rejecting our idealistic approach to surface trade will save a few lives directly, but consider how much we need the food we buy from the surfacers."), UnenactedDesc: cardsim.MsgStr("Rejecting our idealistic approach to surface trade will save a few lives directly, but consider how much we need the food we might buy!"),
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr("The surfacers' governments would certainly prefer us to abandon our underworld connections in their cities. Do we care about that? We'd be giving up some excellent profits."), UnenactedDesc: cardsim.MsgStr("The surfacers' governments would certainly prefer us to abandon our underworld connections in their cities. Do we care about that? We'd be giving up some excellent profits."),
@ -405,12 +437,14 @@ var cards = []Card{
Policies: []Policy{ Policies: []Policy{
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`A calm and cheerful scribe says, "We should have public baths! We have more problems with flooding than drought in the deep underground, so we've got plenty of water. We just need to channel it. We could create a hub of social life while improving the health of everybody!"`), UnenactedDesc: cardsim.MsgStr(`A calm and cheerful scribe says, "We should have public baths! We have more problems with flooding than drought in the deep underground, so we've got plenty of water. We just need to channel it. We could create a hub of social life while improving the health of everybody!"`),
EnactedDesc: cardsim.MsgStr("[current policy] Public bathing is a staple social policy in the mines and warrens of your nation."), EnactedDesc: cardsim.MsgStr("[current policy] Public bathing is a staple social policy in the mines and warrens of your tribe."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.ConstructionIncome += 0.01 p.Stats.ConstructionIncome += 0.01
p.Stats.QoLExpense += 0.01 p.Stats.QoLExpense += 0.01
p.Stats.HealthcareExpense += 0.01 p.Stats.HealthcareExpense += 0.01
p.Stats.ParksExpense += 0.04 p.Stats.ParksExpense += 0.04
p.Stats.Madness -= 0.01
p.Stats.Cruelty -= 0.01
return cardsim.MsgStr("The company of others makes cold water tolerable."), nil return cardsim.MsgStr("The company of others makes cold water tolerable."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
@ -418,6 +452,8 @@ var cards = []Card{
p.Stats.QoLExpense -= 0.01 p.Stats.QoLExpense -= 0.01
p.Stats.HealthcareExpense -= 0.01 p.Stats.HealthcareExpense -= 0.01
p.Stats.ParksExpense -= 0.04 p.Stats.ParksExpense -= 0.04
p.Stats.Madness += 0.01
p.Stats.Cruelty += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -441,7 +477,7 @@ var cards = []Card{
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`Your head diplomat chimes in with, "If you want to make the service self-sustaining, build a bath in a shallow cave and invite the surfacers in for a fee. Of course, we'll be giving up some of our secrecy, but it'll bring in foreign exchange to power our industries."`), UnenactedDesc: cardsim.MsgStr(`Your head diplomat chimes in with, "If you want to make the service self-sustaining, build a bath in a shallow cave and invite the surfacers in for a fee. Of course, we'll be giving up some of our secrecy, but it'll bring in foreign exchange to power our industries."`),
EnactedDesc: cardsim.MsgStr("[current policy] Conservative kobolds are scandalized: not only has the nation bathhouses, it has near-surface bathhouses for surfacers to visit."), EnactedDesc: cardsim.MsgStr("[current policy] Conservative kobolds are scandalized: not only has the tribe bathhouses, it has near-surface bathhouses for surfacers to visit."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.ConstructionIncome += 0.02 p.Stats.ConstructionIncome += 0.02
p.Stats.HospitalityIncome += 0.03 p.Stats.HospitalityIncome += 0.03
@ -449,7 +485,8 @@ var cards = []Card{
p.Stats.ParksExpense += 0.03 p.Stats.ParksExpense += 0.03
p.Stats.FoodSupply += 0.01 p.Stats.FoodSupply += 0.01
p.Stats.Secrecy -= 0.10 p.Stats.Secrecy -= 0.10
return cardsim.MsgStr("Surfacers stink less in the nation's vicinity."), nil p.Stats.Cruelty -= 0.01
return cardsim.MsgStr("Surfacers stink less in the tribe's vicinity."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.ConstructionIncome -= 0.02 p.Stats.ConstructionIncome -= 0.02
@ -458,6 +495,7 @@ var cards = []Card{
p.Stats.ParksExpense -= 0.03 p.Stats.ParksExpense -= 0.03
p.Stats.FoodSupply -= 0.01 p.Stats.FoodSupply -= 0.01
p.Stats.Secrecy += 0.10 p.Stats.Secrecy += 0.10
p.Stats.Cruelty += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -468,10 +506,12 @@ var cards = []Card{
EnactedDesc: cardsim.MsgStr("When is the right time to embark on building public baths? You can hew close to skeptics instead."), EnactedDesc: cardsim.MsgStr("When is the right time to embark on building public baths? You can hew close to skeptics instead."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation += 5 p.Stats.BasePopulation += 5
p.Stats.Gullibility -= 0.01
return cardsim.MsgStr("Opponents of public bathing won a recent political contest."), nil return cardsim.MsgStr("Opponents of public bathing won a recent political contest."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.BasePopulation -= 5 p.Stats.BasePopulation -= 5
p.Stats.Gullibility += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -545,7 +585,10 @@ var cards = []Card{
p.Stats.FoodSupply += 0.01 p.Stats.FoodSupply += 0.01
p.Stats.Secrecy -= 0.05 p.Stats.Secrecy -= 0.05
p.Stats.HiddenRelPenalty += 0.05 p.Stats.HiddenRelPenalty += 0.05
// TODO: Subtract a compassion point. p.Stats.Rebellion += 0.02
p.Stats.Cruelty += 0.04
p.Stats.Greed += 0.02
p.Stats.Gullibility -= 0.01
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 {
@ -555,6 +598,10 @@ var cards = []Card{
p.Stats.FoodSupply -= 0.01 p.Stats.FoodSupply -= 0.01
p.Stats.Secrecy += 0.05 p.Stats.Secrecy += 0.05
p.Stats.HiddenRelPenalty -= 0.05 p.Stats.HiddenRelPenalty -= 0.05
p.Stats.Rebellion -= 0.02
p.Stats.Cruelty -= 0.04
p.Stats.Greed -= 0.02
p.Stats.Gullibility += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -567,12 +614,14 @@ var cards = []Card{
p.Stats.Secrecy += 0.01 p.Stats.Secrecy += 0.01
p.Stats.WarExpense -= 0.01 p.Stats.WarExpense -= 0.01
p.Stats.HiddenRelPenalty -= 0.01 p.Stats.HiddenRelPenalty -= 0.01
p.Stats.Cruelty -= 0.01
return cardsim.MsgStr("Some of the warriors have had their fervor redirected into economic pursuits."), nil return cardsim.MsgStr("Some of the warriors have had their fervor redirected into economic pursuits."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.Secrecy -= 0.01 p.Stats.Secrecy -= 0.01
p.Stats.WarExpense += 0.01 p.Stats.WarExpense += 0.01
p.Stats.HiddenRelPenalty += 0.01 p.Stats.HiddenRelPenalty += 0.01
p.Stats.Cruelty += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -582,7 +631,7 @@ var cards = []Card{
}, // End of "Raid on Surface Proposed" card }, // End of "Raid on Surface Proposed" card
&SwitchingCard{ // Card 6 &SwitchingCard{ // Card 6
Name: cardsim.MsgStr("Book Publishing Threat to Secrecy?"), 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."), Desc: cardsim.MsgStr("Concerns have been raised about one of the categories of income that your tribe 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 tribe."),
After: ShuffleIntoBottomHalf, After: ShuffleIntoBottomHalf,
IsValid: func(c Card, p *Player) bool { IsValid: func(c Card, p *Player) bool {
return p.Stats.PublishingIncome > 0 && p.Stats.ForeignRelations < 0 return p.Stats.PublishingIncome > 0 && p.Stats.ForeignRelations < 0
@ -590,34 +639,44 @@ var cards = []Card{
Policies: []Policy{ Policies: []Policy{
&BasicPolicy{ &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!"`), 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."), EnactedDesc: cardsim.MsgStr("[current policy] The tribe's warriors enforce a code of silence at spearpoint."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.Secrecy += 0.03 p.Stats.Secrecy += 0.03
p.Stats.PublishingIncome -= 0.05 p.Stats.PublishingIncome -= 0.05
p.Stats.EducationExpense -= 0.01 p.Stats.EducationExpense -= 0.01
p.Stats.Madness += 0.02
p.Stats.Authoritarianism += 0.02
p.Stats.Gullibility -= 0.01
return cardsim.MsgStr("No history records the sobbing of kobold scribes."), nil return cardsim.MsgStr("No history records the sobbing of kobold scribes."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.Secrecy -= 0.03 p.Stats.Secrecy -= 0.03
p.Stats.PublishingIncome += 0.05 p.Stats.PublishingIncome += 0.05
p.Stats.EducationExpense += 0.01 p.Stats.EducationExpense += 0.01
p.Stats.Madness -= 0.02
p.Stats.Authoritarianism += 0.02
p.Stats.Gullibility -= 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: func(b *BasicPolicy, p *Player) bool {
return p.Stats.WarExpense > 0
},
}, },
&BasicPolicy{ &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!"`), UnenactedDesc: cardsim.MsgStr(`"No! Never! Er, maybe?" asks a dithering scribe, clutching a book worriedly to their chest. "Don't give it to the warriors! 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."), 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) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.Secrecy += 0.01 p.Stats.Secrecy += 0.01
p.Stats.PublishingIncome -= 0.01 p.Stats.PublishingIncome -= 0.01
p.Stats.BureaucracyExpense += 0.01 p.Stats.BureaucracyExpense += 0.01
return cardsim.MsgStr("The censors are the most well-read kobolds in the nation."), nil p.Stats.Authoritarianism += 0.02
return cardsim.MsgStr("The censors are the most well-read kobolds in the tribe."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.Secrecy -= 0.01 p.Stats.Secrecy -= 0.01
p.Stats.PublishingIncome += 0.01 p.Stats.PublishingIncome += 0.01
p.Stats.BureaucracyExpense -= 0.01 p.Stats.BureaucracyExpense -= 0.01
p.Stats.Authoritarianism -= 0.02
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -632,7 +691,11 @@ var cards = []Card{
p.Stats.PropagandaExpense += 0.01 p.Stats.PropagandaExpense += 0.01
p.Stats.HiddenRelPenalty -= 0.01 p.Stats.HiddenRelPenalty -= 0.01
p.Stats.PointOfDimReturns += 0.01 p.Stats.PointOfDimReturns += 0.01
// TODO: Add a compassion point p.Stats.Rebellion += 0.01
p.Stats.Madness -= 0.01
p.Stats.Cruelty -= 0.02
p.Stats.Greed -= 0.01
p.Stats.Gullibility -= 0.01
return cardsim.MsgStr("Heartless surfacers burn recovered kobold diaries."), nil return cardsim.MsgStr("Heartless surfacers burn recovered kobold diaries."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
@ -642,6 +705,11 @@ var cards = []Card{
p.Stats.PropagandaExpense -= 0.01 p.Stats.PropagandaExpense -= 0.01
p.Stats.HiddenRelPenalty += 0.01 p.Stats.HiddenRelPenalty += 0.01
p.Stats.PointOfDimReturns -= 0.01 p.Stats.PointOfDimReturns -= 0.01
p.Stats.Rebellion -= 0.01
p.Stats.Madness += 0.01
p.Stats.Cruelty += 0.02
p.Stats.Greed += 0.01
p.Stats.Gullibility += 0.01
return nil return nil
}, },
CanDo: func(b *BasicPolicy, p *Player) bool { CanDo: func(b *BasicPolicy, p *Player) bool {
@ -650,8 +718,8 @@ var cards = []Card{
}, },
&VerbosePolicy{ &VerbosePolicy{
Default: &BasicPolicy{ Default: &BasicPolicy{
UnenactedDesc: cardsim.MsgStr("Rejecting this will inspire celebrations among the authors of your nation."), UnenactedDesc: cardsim.MsgStr("Rejecting this will inspire celebrations among the authors of your tribe."),
EnactedDesc: cardsim.MsgStr("The dangers posed by publishing information from your nation can be denied without changes in policy."), EnactedDesc: cardsim.MsgStr("The dangers posed by publishing information from your tribe can be denied without changes in policy."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.PublishingIncome += 0.01 p.Stats.PublishingIncome += 0.01
return cardsim.MsgStr("Kobold-hating adventurers know to be well-read."), nil return cardsim.MsgStr("Kobold-hating adventurers know to be well-read."), nil
@ -688,15 +756,16 @@ var cards = []Card{
p.Stats.MiningIncome -= 0.01 p.Stats.MiningIncome -= 0.01
p.Stats.AlchemyIncome += 0.02 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.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 p.Stats.PointOfDimReturns += 0.01
// Note to self, add a compassion point. p.Stats.Cruelty -= 0.01
return cardsim.MsgStr("Calming alchemical potions are displacing raw material sales in local markets."), nil return cardsim.MsgStr("Calming alchemical potions are displacing raw material sales in local markets."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.MiningIncome += 0.01 p.Stats.MiningIncome += 0.01
p.Stats.AlchemyIncome -= 0.02 p.Stats.AlchemyIncome -= 0.02
p.Stats.HealthcareExpense -= 0.01 p.Stats.HealthcareExpense -= 0.01
p.Stats.PointOfDimReturns -= 0.02 p.Stats.PointOfDimReturns -= 0.01
p.Stats.Cruelty += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -710,6 +779,9 @@ var cards = []Card{
p.Stats.GadgetryIncome += 0.01 p.Stats.GadgetryIncome += 0.01
p.Stats.WarExpense += 0.01 p.Stats.WarExpense += 0.01
p.Stats.PointOfDimReturns -= 0.01 p.Stats.PointOfDimReturns -= 0.01
p.Stats.Rebellion += 0.01
p.Stats.Madness += 0.04
p.Stats.Authoritarianism -= 0.02
return cardsim.MsgStr("Miners are known for their enthusiasm for explosives."), nil return cardsim.MsgStr("Miners are known for their enthusiasm for explosives."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
@ -717,6 +789,9 @@ var cards = []Card{
p.Stats.GadgetryIncome -= 0.01 p.Stats.GadgetryIncome -= 0.01
p.Stats.WarExpense -= 0.01 p.Stats.WarExpense -= 0.01
p.Stats.PointOfDimReturns += 0.01 p.Stats.PointOfDimReturns += 0.01
p.Stats.Rebellion -= 0.01
p.Stats.Madness -= 0.04
p.Stats.Authoritarianism += 0.02
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -730,8 +805,9 @@ var cards = []Card{
p.Stats.PlanarIncome += 0.03 p.Stats.PlanarIncome += 0.03
p.Stats.ResearchSubsExpense += 0.01 p.Stats.ResearchSubsExpense += 0.01
p.Stats.PointOfDimReturns += 0.02 p.Stats.PointOfDimReturns += 0.02
// TODO: Add more consequences to questionable planar contacts. p.Stats.Madness += 0.04
return cardsim.MsgStr("The nation is infamous for producing crazed magi."), nil p.Stats.Authoritarianism -= 0.02
return cardsim.MsgStr("The tribe is infamous for producing crazed magi."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.BasePopulation += 20 p.Stats.BasePopulation += 20
@ -739,24 +815,33 @@ var cards = []Card{
p.Stats.PlanarIncome += 0.03 p.Stats.PlanarIncome += 0.03
p.Stats.ResearchSubsExpense -= 0.01 p.Stats.ResearchSubsExpense -= 0.01
p.Stats.PointOfDimReturns -= 0.02 p.Stats.PointOfDimReturns -= 0.02
p.Stats.Madness -= 0.04
p.Stats.Authoritarianism += 0.02
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
}, },
&BasicPolicy{ &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."`), 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 need 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."), EnactedDesc: cardsim.MsgStr("[current policy] The miners are dealing with laggard elements on their own."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation -= 20 p.Stats.BasePopulation -= 20
p.Stats.MiningIncome += 0.01 p.Stats.MiningIncome += 0.01
p.Stats.PointOfDimReturns += 0.01 p.Stats.PointOfDimReturns += 0.01
// TODO: Take away a point of compassion for this. p.Stats.Rebellion -= 0.03
p.Stats.Madness += 0.01
p.Stats.Cruelty += 0.02
p.Stats.Authoritarianism += 0.01
return cardsim.MsgStr("Sufficient misery unmakes people."), nil return cardsim.MsgStr("Sufficient misery unmakes people."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.BasePopulation += 10 p.Stats.BasePopulation += 10
p.Stats.MiningIncome -= 0.01 p.Stats.MiningIncome -= 0.01
p.Stats.PointOfDimReturns -= 0.01 p.Stats.PointOfDimReturns -= 0.01
p.Stats.Rebellion += 0.03
p.Stats.Madness -= 0.01
p.Stats.Cruelty -= 0.02
p.Stats.Authoritarianism -= 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -768,12 +853,13 @@ var cards = []Card{
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.MiningIncome -= 0.01 p.Stats.MiningIncome -= 0.01
p.Stats.PointOfDimReturns += 0.01 p.Stats.PointOfDimReturns += 0.01
// TODO: Add a compassion point. p.Stats.Cruelty -= 0.01
return cardsim.MsgStr("Mining is just too strenuous for some kobolds."), nil return cardsim.MsgStr("Mining is just too strenuous for some kobolds."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.MiningIncome += 0.01 p.Stats.MiningIncome += 0.01
p.Stats.PointOfDimReturns -= 0.01 p.Stats.PointOfDimReturns -= 0.01
p.Stats.Cruelty += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -786,7 +872,7 @@ var cards = []Card{
UnenactedDesc: cardsim.MsgStr("Withdrawing explosives access from the suffering may be a life-saving action..."), UnenactedDesc: cardsim.MsgStr("Withdrawing explosives access from the suffering may be a life-saving action..."),
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr("Maybe we should close the door on this particular otherworldly contact source."), UnenactedDesc: cardsim.MsgStr("Maybe we should close the door on these particular otherworldly contacts."),
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr("The miners' culture is harsh! There's an argument here for protecting the suffering."), UnenactedDesc: cardsim.MsgStr("The miners' culture is harsh! There's an argument here for protecting the suffering."),
@ -812,6 +898,8 @@ var cards = []Card{
p.Stats.PlanarIncome += 0.03 p.Stats.PlanarIncome += 0.03
p.Stats.AlchemyIncome += 0.01 p.Stats.AlchemyIncome += 0.01
p.Stats.PointOfDimReturns += 0.06 p.Stats.PointOfDimReturns += 0.06
p.Stats.Rebellion -= 0.01
p.Stats.Madness += 0.01
return cardsim.MsgStr("Surviving mage-students are really excited about their new curriculum."), nil return cardsim.MsgStr("Surviving mage-students are really excited about their new curriculum."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
@ -819,13 +907,15 @@ var cards = []Card{
p.Stats.PlanarIncome -= 0.03 p.Stats.PlanarIncome -= 0.03
p.Stats.AlchemyIncome -= 0.01 p.Stats.AlchemyIncome -= 0.01
p.Stats.PointOfDimReturns -= 0.06 p.Stats.PointOfDimReturns -= 0.06
p.Stats.Rebellion += 0.01
p.Stats.Madness -= 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`A questionably sane mage wearing a robe of eyes insists, "We should tap the elder realms! It is the fastest way to accelerate our planar harvesting! Tapping into them requires little more than a willingness to try, and the scraps taken from the societies in those realms yield technology beyond our wildest dreams! Don't flinch from the hazard; it is a step towards world conquest!"`), UnenactedDesc: cardsim.MsgStr(`A questionably sane mage wearing a robe of eyes insists, "We should tap the elder realms! It is the fastest way to accelerate our planar harvesting! Tapping into them requires little more than a willingness to try, and the scraps taken from the societies in those realms yield technology beyond our wildest dreams! Don't flinch from the hazard; it is a step towards world conquest!"`),
EnactedDesc: cardsim.MsgStr("[current policy] Your nation is locked in conflict with the lesser minions of elder horrors as it seeks to steal power from the mindbreaking realms."), EnactedDesc: cardsim.MsgStr("[current policy] Your tribe is locked in conflict with the lesser minions of elder horrors as it seeks to steal power from the mindbreaking realms."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation -= 250 p.Stats.BasePopulation -= 250
p.Stats.PlanarIncome += 0.10 p.Stats.PlanarIncome += 0.10
@ -835,7 +925,12 @@ var cards = []Card{
p.Stats.ResearchSubsExpense += 0.01 p.Stats.ResearchSubsExpense += 0.01
p.Stats.PointOfDimReturns += 0.5 p.Stats.PointOfDimReturns += 0.5
p.Stats.HiddenRelPenalty += 0.02 p.Stats.HiddenRelPenalty += 0.02
// TODO: Make the effects worse. This will increase crime rates later on. p.Stats.Rebellion += 0.01
p.Stats.Madness += 0.1
p.Stats.Cruelty += 0.02
p.Stats.Greed += 0.03
p.Stats.Gullibility -= 0.02
p.Stats.Authoritarianism -= 0.01
return cardsim.MsgStr("Several caves have been abandoned to an infestation of eldritch horrors."), nil return cardsim.MsgStr("Several caves have been abandoned to an infestation of eldritch horrors."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
@ -847,6 +942,12 @@ var cards = []Card{
p.Stats.ResearchSubsExpense -= 0.01 p.Stats.ResearchSubsExpense -= 0.01
p.Stats.PointOfDimReturns -= 0.5 p.Stats.PointOfDimReturns -= 0.5
p.Stats.HiddenRelPenalty -= 0.02 p.Stats.HiddenRelPenalty -= 0.02
p.Stats.Rebellion -= 0.01
p.Stats.Madness -= 0.1
p.Stats.Cruelty -= 0.02
p.Stats.Greed -= 0.03
p.Stats.Gullibility += 0.02
p.Stats.Authoritarianism += 0.01
return nil return nil
}, },
CanDo: func(b *BasicPolicy, p *Player) bool { CanDo: func(b *BasicPolicy, p *Player) bool {
@ -857,20 +958,34 @@ var cards = []Card{
UnenactedDesc: cardsim.MsgStr(`A stout kobold in a plain robe showed up to say, "Beware! Every planar connection leaks strange energies into the world. The safe connections, once we've the skill to make them, are to the well-ordered and benevolent realms. They have alchemical wonders and great wisdom, but moreover the energies that leak off the connection will make society more well-ordered rather than less."`), UnenactedDesc: cardsim.MsgStr(`A stout kobold in a plain robe showed up to say, "Beware! Every planar connection leaks strange energies into the world. The safe connections, once we've the skill to make them, are to the well-ordered and benevolent realms. They have alchemical wonders and great wisdom, but moreover the energies that leak off the connection will make society more well-ordered rather than less."`),
EnactedDesc: cardsim.MsgStr("[current policy] Your planar explorers have been directed to the planes of law in hopes of finding the secret of a well-governed society."), EnactedDesc: cardsim.MsgStr("[current policy] Your planar explorers have been directed to the planes of law in hopes of finding the secret of a well-governed society."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation += 1
p.Stats.PlanarIncome += 0.03 p.Stats.PlanarIncome += 0.03
p.Stats.AlchemyIncome += 0.03 p.Stats.AlchemyIncome += 0.03
p.Stats.PublishingIncome += 0.01
p.Stats.BureaucracyExpense -= 0.01 p.Stats.BureaucracyExpense -= 0.01
p.Stats.PointOfDimReturns += 0.25 p.Stats.PointOfDimReturns += 0.2
p.Stats.HiddenRelPenalty += 0.01 p.Stats.HiddenRelPenalty += 0.01
p.Stats.Rebellion -= 0.04
p.Stats.Madness -= 0.01
p.Stats.Cruelty -= 0.05
p.Stats.Greed -= 0.03
p.Stats.Gullibility += 0.02
// TODO: This will affect crime and corruption rates. // TODO: This will affect crime and corruption rates.
return cardsim.MsgStr("Planar explorers find their work boring."), nil return cardsim.MsgStr("Planar explorers find their work boring."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.BasePopulation -= 1
p.Stats.PlanarIncome -= 0.03 p.Stats.PlanarIncome -= 0.03
p.Stats.AlchemyIncome -= 0.03 p.Stats.AlchemyIncome -= 0.03
p.Stats.PublishingIncome -= 0.01
p.Stats.BureaucracyExpense += 0.01 p.Stats.BureaucracyExpense += 0.01
p.Stats.PointOfDimReturns -= 0.25 p.Stats.PointOfDimReturns -= 0.2
p.Stats.HiddenRelPenalty -= 0.01 p.Stats.HiddenRelPenalty -= 0.01
p.Stats.Rebellion += 0.04
p.Stats.Madness += 0.01
p.Stats.Cruelty += 0.05
p.Stats.Greed += 0.03
p.Stats.Gullibility -= 0.02
return nil return nil
}, },
CanDo: func(b *BasicPolicy, p *Player) bool { CanDo: func(b *BasicPolicy, p *Player) bool {
@ -878,20 +993,24 @@ var cards = []Card{
}, },
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`Your Minister of Planar Studies crashed the meeting dressed like a wealthy scavenger. "Skip these esoteric planes! We want alternate material planes so we can steal stuff that's guaranteed to teach us more about how THIS reality works. If we start hunting, maybe we can even hit the real goldmine: a graveyard world whose gadgetry is post-ownership. Besides, uh... Meat is meat, mostly. We can hunt on other worlds. The alchemists can work with what we can't eat."`), UnenactedDesc: cardsim.MsgStr(`Your Minister of Planar Studies crashed the meeting dressed like a wealthy scavenger. "Skip these esoteric planes! We want alternate material planes so we can steal stuff that's guaranteed to teach us more about how THIS reality works. If we start hunting, maybe we can even hit the real goldmine: a graveyard world whose gadgetry is post-ownership. Besides, uh... Meat is meat, mostly. We can hunt on other worlds if we stick to the ones that work like our own."`),
EnactedDesc: cardsim.MsgStr("[current policy] Your planar harvesters try to scan the multiverse for scavenging targets."), EnactedDesc: cardsim.MsgStr("[current policy] Your planar harvesters try to scan the multiverse for scavenging targets."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation -= 4
p.Stats.AlchemyIncome += 0.01 p.Stats.AlchemyIncome += 0.01
p.Stats.GadgetryIncome += 0.05 p.Stats.GadgetryIncome += 0.05
p.Stats.ScavengingIncome += 0.05 p.Stats.ScavengingIncome += 0.05
p.Stats.FoodSupply += 0.02 p.Stats.FoodSupply += 0.02
p.Stats.Greed += 0.01
return cardsim.MsgStr("Planes without kobolds tell stories of reptillian infiltrators."), nil return cardsim.MsgStr("Planes without kobolds tell stories of reptillian infiltrators."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.BasePopulation += 4
p.Stats.AlchemyIncome -= 0.01 p.Stats.AlchemyIncome -= 0.01
p.Stats.GadgetryIncome -= 0.05 p.Stats.GadgetryIncome -= 0.05
p.Stats.ScavengingIncome -= 0.05 p.Stats.ScavengingIncome -= 0.05
p.Stats.FoodSupply -= 0.02 p.Stats.FoodSupply -= 0.02
p.Stats.Greed -= 0.01
return nil return nil
}, },
CanDo: func(b *BasicPolicy, p *Player) bool { CanDo: func(b *BasicPolicy, p *Player) bool {
@ -900,7 +1019,7 @@ var cards = []Card{
}, },
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`The mage in the robe of eyes is in a celebratory mood, pouring glasses for anyone who'll take them from a bottle of some bluish-black liquid that you're pretty sure is dangerous. "Our planar harvesting potential has grown magnificently! If we target the elder planes, they'll... okay, they won't exactly fear us, but we can start taking some real treasures from them! Great spells! Exotic reagents! Unique treasures! Let's lean into the hazard!`), UnenactedDesc: cardsim.MsgStr(`The mage in the robe of eyes is in a celebratory mood, pouring glasses for anyone who'll take them from a bottle of some bluish-black liquid that you're pretty sure is dangerous. "Our planar harvesting potential has grown magnificently! If we target the elder planes, they'll... okay, they won't exactly fear us, but we can start taking some real treasures from them! Great spells! Exotic reagents! Unique treasures! Let's lean into the hazard!`),
EnactedDesc: cardsim.MsgStr("[current policy] Your nation is sacrificing safety and sanity in thievery attempts that only serve the plans of the elder gods."), EnactedDesc: cardsim.MsgStr("[current policy] Your tribe is sacrificing safety and sanity in thievery attempts that only serve the plans of the elder gods."),
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation -= 350 p.Stats.BasePopulation -= 350
p.Stats.PlanarIncome += 0.15 p.Stats.PlanarIncome += 0.15
@ -911,8 +1030,13 @@ var cards = []Card{
p.Stats.PointOfDimReturns += 0.5 p.Stats.PointOfDimReturns += 0.5
p.Stats.ForeignRelations -= 0.05 p.Stats.ForeignRelations -= 0.05
p.Stats.HiddenRelPenalty += 0.05 p.Stats.HiddenRelPenalty += 0.05
// TODO: This will be a nightmare for crime and corruption! p.Stats.Rebellion += 0.04
return cardsim.MsgStr("Nobody dares touch the treasures in the national vault."), nil p.Stats.Madness += 0.2
p.Stats.Cruelty += 0.08
p.Stats.Greed += 0.1
p.Stats.Gullibility -= 0.05
p.Stats.Authoritarianism -= 0.02
return cardsim.MsgStr("Nobody dares touch the treasures in the tribal vault."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.BasePopulation += 350 p.Stats.BasePopulation += 350
@ -924,6 +1048,12 @@ var cards = []Card{
p.Stats.PointOfDimReturns -= 0.5 p.Stats.PointOfDimReturns -= 0.5
p.Stats.ForeignRelations += 0.05 p.Stats.ForeignRelations += 0.05
p.Stats.HiddenRelPenalty -= 0.05 p.Stats.HiddenRelPenalty -= 0.05
p.Stats.Rebellion -= 0.04
p.Stats.Madness -= 0.2
p.Stats.Cruelty -= 0.08
p.Stats.Greed -= 0.1
p.Stats.Gullibility += 0.05
p.Stats.Authoritarianism += 0.02
return nil return nil
}, },
CanDo: func(b *BasicPolicy, p *Player) bool { CanDo: func(b *BasicPolicy, p *Player) bool {
@ -937,11 +1067,13 @@ var cards = []Card{
Do: func(p *Player) (cardsim.Message, error) { Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation += 40 p.Stats.BasePopulation += 40
p.Stats.PlanarIncome -= 0.01 p.Stats.PlanarIncome -= 0.01
return cardsim.MsgStr("The nation recently gained a few immigrants reassured by the lack of planar portals."), nil p.Stats.Greed -= 0.01
return cardsim.MsgStr("The tribe recently gained a few immigrants reassured by the lack of planar portals."), nil
}, },
Undo: func(p *Player) error { Undo: func(p *Player) error {
p.Stats.BasePopulation -= 40 p.Stats.BasePopulation -= 40
p.Stats.PlanarIncome += 0.01 p.Stats.PlanarIncome += 0.01
p.Stats.Greed += 0.01
return nil return nil
}, },
CanDo: YesWeCan, CanDo: YesWeCan,
@ -954,7 +1086,9 @@ var cards = []Card{
UnenactedDesc: cardsim.MsgStr("People are begging you to close the eldritch portals. They'll take anything else. Literally anything else."), UnenactedDesc: cardsim.MsgStr("People are begging you to close the eldritch portals. They'll take anything else. Literally anything else."),
}, },
&DisabledPolicy{}, // There's no closing the plane to a portal of law save by choosing something else. &DisabledPolicy{}, // There's no closing the plane to a portal of law save by choosing something else.
&DisabledPolicy{}, // Until I implement a downside for the planar scavengers, there's no closing this one either. &BasicPolicy{
UnenactedDesc: cardsim.MsgStr("There is some opposition to stealing from the multiverse, decrying the raw greed involved."),
},
&BasicPolicy{ &BasicPolicy{
UnenactedDesc: cardsim.MsgStr("People are begging you to close the eldritch portals. They'll take anything else. Literally anything else."), UnenactedDesc: cardsim.MsgStr("People are begging you to close the eldritch portals. They'll take anything else. Literally anything else."),
}, },
@ -962,6 +1096,91 @@ var cards = []Card{
}, },
}, // end of "Planar Targeting" policies }, // end of "Planar Targeting" policies
}, // end of "Planar Targeting" card }, // end of "Planar Targeting" card
&SwitchingCard{ // Card 9
Name: cardsim.MsgStr("Strategic Sweets"),
Desc: cardsim.MsgStr("Leading a starving kobold tribe can be pretty dreary. Rats, weeds, and tea made from moss... Even the VIPs are scrawny on this fare."),
After: ShuffleIntoBottomHalf,
IsValid: func(c Card, p *Player) bool {
return p.Stats.FoodSupply < 1 && p.Stats.StatObesity() < 10
},
Policies: []Policy{
&BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`A skinny minister hoists their claws at the roof in frustration as they say, "I can't take it anymore! I'm not meant to be this skinny! If it takes a whole shipment of ore to buy us a single cake, that's just the price of leadership!"`),
EnactedDesc: cardsim.MsgStr("[current policy] Funding sweet treats for leadership is considered an economic priority."),
Do: func(p *Player) (cardsim.Message, error) {
p.Stats.EconPlanExpense += 0.02
p.Stats.FoodSupply += 0.01
p.Stats.ObesogenicFood += 0.05
p.Stats.ForeignRelations += 0.01
p.Stats.Rebellion += 0.01
p.Stats.Authoritarianism += 0.01
// TODO: Make this increase corruption.
return cardsim.MsgStr("High food prices are fitting kobolds into the economy."), nil
},
Undo: func(p *Player) error {
p.Stats.EconPlanExpense -= 0.02
p.Stats.FoodSupply -= 0.01
p.Stats.ObesogenicFood -= 0.05
p.Stats.Rebellion -= 0.01
p.Stats.Authoritarianism -= 0.01
return nil
},
CanDo: YesWeCan,
},
&BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`A loyal mining foreman looks at the minister with crossed arms. "We definitely need more food, but we absolutely shouldn't set the example of feasting while others starve. We need to expand the Quality of Life budget and declare a sweets ration. Let them eat cake!"`),
EnactedDesc: cardsim.MsgStr("[current policy] A sweets ration helps kobolds face the challenge of hard labour."),
Do: func(p *Player) (cardsim.Message, error) {
p.Stats.QoLExpense += 0.04
p.Stats.FoodSupply += 0.02
p.Stats.ObesogenicFood += 0.1
p.Stats.PointOfDimReturns += 0.03
// TODO: Implement QoL functions.
return cardsim.MsgStr("The government is proud to secure sweets for the public."), nil
},
Undo: func(p *Player) error {
p.Stats.QoLExpense -= 0.03
p.Stats.FoodSupply -= 0.02
p.Stats.ObesogenicFood -= 0.1
p.Stats.Rebellion += 0.01
return nil
},
CanDo: YesWeCan,
},
&BasicPolicy{
UnenactedDesc: cardsim.MsgStr(`One of your tribe's few stout kobolds brings the issue up in the cafeteria. "I've heard rumour that some kobolds are begging for sweets. We need to take a stand against that and squelch it early! Fund nutrition research to prove what's truly healthy for kobolds!" They look at you sidelong. "And, uh. Hire me for the research. I want a food subsidy that I can call a long-term benefit to the tribe."`),
EnactedDesc: cardsim.MsgStr("[current policy] Your tribe is paying some kobolds to track how food affects health. Current consensus: your tribe is underfed."),
Do: func(p *Player) (cardsim.Message, error) {
p.Stats.ResearchSubsExpense += 0.01
p.Stats.PublishingIncome += 0.01
p.Stats.FoodSupply += 0.01
p.Stats.ObesogenicFood -= 0.03
p.Stats.PointOfDimReturns += 0.01
return cardsim.MsgStr("Eating lichen soup is remarkably thinning."), nil
},
Undo: func(p *Player) error {
p.Stats.ResearchSubsExpense -= 0.01
p.Stats.FoodSupply -= 0.01
p.Stats.ObesogenicFood += 0.03
return nil
},
CanDo: YesWeCan,
},
&BasicPolicy{
UnenactedDesc: cardsim.MsgStr("Perhaps subsidies are the wrong approach to food procurement."),
EnactedDesc: cardsim.MsgStr("Perhaps subsidies are the wrong approach to food procurement."),
Do: func(p *Player) (cardsim.Message, error) {
p.Stats.BasePopulation -= 20
return cardsim.MsgStr("A few kobolds have emigrated in fear of famine."), nil
},
Undo: func(p *Player) error {
p.Stats.BasePopulation += 20
return nil
},
CanDo: YesWeCan,
},
},
}, // end of "Strategic Sweets" card
} // end of card list } // end of card list
func initDeck(d *cardsim.Deck[*KoboldMine]) { func initDeck(d *cardsim.Deck[*KoboldMine]) {