Thoughts on social boons/banes balance


Recommended Posts

EDIT: In no specific order, thanks to RageLeague, SpicyNiceCream, TF3, ArtixBot and Gr1m- for their help finding many of these!

 

So I clearly should be doing more important stuff, but let me procrastinate for an hour.

For the most part, "most" boons/banes you will get in a normal run will be from the Spree and the Admiralty, since most quests involve those guys. Not all boons and banes are equal in strength/severity, but that's fine. However, some are so weak as to be completely ignorable, which doesn't seem right either: it's not ideal that the repercussions for killing someone can be super harsh or nothing at all, in my opinion.

I've also added the price I would pay for each of the boons; for the most part, getting someone to love you when they already like you only changes the price of things they sell to you, which is only applicable for vendors. It also decreases their resolve when negotiating with them, but that tends to only matter for the Grog and the Gutted Yote bouncers (to hire them for the Day 3 boss and the Day 4 Spree questline boss respectively), the clerk at the harbour (to convince them to break the quarantine before the Day 3 boss) and the owner of the Slurping Snail (to hire them for the Day 4 Admiralty questline boss).

Rook is a lot more limited than Sal in who he can help or wine-and-dine into loving him, outside a few specific events. Coupled with his extra graft slots, and his grafts being generally a bit stronger than Sal's, this means he will be spending his money primarily on grafts, rather than social boons. Furthermore, he's also very limited in where he can provoke-kill people that hate him, so banes are effectively permanent for him; killing willy-nilly is less of an option for him, unless you really want all the banes at once.

Please see the second post for additional unique boons/banes found by ArtixBot! And a latter post by RageLeague, who datamined the game for the boons and banes we hadn't found yet (big thanks!)

 

Civilians:

Bartender boon: Mixology, restore 4 additional resolve when drinking. Compared to the 10 base resolve you gain, this is pretty weak, because you shouldn't be drinking very often to begin with, at least for the resolve gain. Fair price: 50 shills, if that, and only because of the drink discounts.
Bartender bane: Tainted supply, drinking adds an additional drunk card. This means one additional Tipsy *and* an additional Slurred Speech. This is really painful. It forces you to be a lot more careful about how you spend your resolve. Seems fine.

Foreman boon: Authority, at the start of each negotiation, add a random authority card to your draw pile. The authority cards are uneven in usefulness, and while they may seem ok in powerlevel at the beginning of a run, they're effectively just bloating your deck by the end of it. Mediocre boon as is. Fair price: 50 shills, maybe.
Foreman bane: Blacklisted, at the beginning of each negotiation discard  2  1 random cards. Painful, and may discard some key card and force you to go through a whole shuffle without it. Seems fine.

Heavy laborer boon: Heavy lifting, gain 4 defense and 2 temporary power at the start of each battle. Very flexible, all but guarantees that your first turn of battle will be a good one. One of the best combat boons. Fair price: 150-200 shills.
Heavy laborer bane: Whispered rumours, opponents start with an extra argument each negotiation. This is pretty harsh at the beginning of a run when you don't have the tools to react to it, but becomes easier to ignore later on. Seems about fine.

Laborer boon: Voice of the people, start each negotiation with an extra argument. It's basically like having a trained Yote. As far as negotiation boons go, this is pretty good, and really helps during the first one or two days. You just won't need it past that point though. Fair price: 100 shills.
Laborer bane: Elitist, all Feud citizens you meet will dislike you. This affects any civilian you meet for the first time after getting this bane. Quoting ArtixBot: "I'd say that it is the #1 bane to avoid given how ubiquitous Feud citizens are in Sal's campaign, especially since it impacts bartenders and wealthy merchants. It's a Terrorize bane (Spree Captain bane) on steroids." 

Merchant boon: Haggle badge, you can negotiate for greater quest rewards. A lot of extra money, extra negotiation xp and card offers. This is the best boon in the game right now, not to mention that good relationships with a merchant already comes with the benefit of cheaper prices at their shop. Could be toned down a bit, ideally in a way that doesn't encourage the player to "grind" negotiations as much. Fair price: 200+ shills.
Merchant bane: Bad credit, buying anything from shopkeepers costs an extra 20 shills. This adds up real fast, especially when buying drinks and fsshcakes, which are normally very cheap. It doesn't seem like much, but you will definitely feel it. A strong bane for sure.

 

Admiralty:

Clerk boon: Authorization, once a day a member of the Admiralty will help you. TF3 figured out that it works by allowing the player to ask Admiralty members for help / to turn a blind eye for free, once per day; works even if you have Red tape active, and the Admiralty will help you with fights and negotiations until you leave the area. It's strong in the rare scenarios where you actually want it, which unfortunately might not even happen in any given run. Something like Piece of the pie will often be straight up better. Fair price: 50-100 shills.
Clerk bane: Red tape, members of the Admiralty will not help you. TF3 points out it likely prevents you from bribing Admiralty in the situations outlined above. Seems very situational, in that you might go the whole run without ever being in a situation where that matters, and even when it does there are ways around it. Meh, still feels weak.

Goon boon: Piece of the pie, gain 75 shills every morning. It pays for itself. It's fine. Will be a bit better when we get the 5th day. Fair price: 100 shills.
Goon bane: Hunted, all enemy Admiralty gain 1 power. Encourages you to avoid confrontations with the Admiralty, makes Patrol leaders even scarier. It's not the strongest bane, but it's not weak.

Guard boon: Sparring, one bonus defense on all cards that gain defense. Amazing early on, although it wanes in usefulness as the run goes on and you get more efficient defense cards. It's rare to play more than 2 of those per turn. Very good boon overall. Fair price: 150-200 shills.
Guard bane: Bully, lose one defense on all cards that gain defense. Very harsh early on, and you really really don't want to stack these. There are some builds that can minimize this, but it's definitely one of the scariest banes.

Patrol leader boon: Commander, all allies gain 5 health. Eh. It's fine if you have a pet, but Patrol leaders are too rare to count on finding them when you want them. Pretty weak boon overall. Fair price: 100 shills.
Patrol leader bane: Lowered rank, allies have -5 max health. Same as before, only it can actually be a bit scary if you rely on pets. Still, pretty weak.

Intelligence officer (Oolo) boon: Admiralty Medals, all friendly arguments gain 1 composure at the start of your turn.
Intelligence Officer (Oolo) bane: Wrong papers, at the start of every negotiation, gain 2 Flustered.

 

Cult of Hesh:

Luminari boon: Bell of Hesh, draw an extra card at the start of negotiation. Considering how late game negotiations are mostly a question of when you manage to set up whatever wacky combo you've built, this makes it that bit more likely to make it happen sooner rather than later. It's solid. Fair price: 100 shills (because there is a negotiation graft that straight up grants +1 card per turn that costs 100 shills).
Luminari bane: Curse of Hesh, lose 1 action at the beginning of combat. This is really painful, to the point where it's not worth risking fighting Heshians. You absolutely don't want to get more than one of this, ever. Definitely in the very top of harshest banes.

Priest boon: Bio-feedback,  All status cards cost 1 less action. It's very good, if nothing else because it reduces Bloated to 1 action, and Injury to 0 actions.
Priest bane: Bad faith, add a Gnarled effigy to your draw pile at the beginning of combat (status card that deals 1 damage to yourself when you play a card). Contender for the title of harshest bane. Makes the early game considerably harder, and will shut down late game decks that rely on playing a lot of cards, or combo decks. It's also a bloat card that you can't get rid of with the night merchant. Discard decks can basically ignore it, however. Seems fine.

 

Spark Barons:

Professional boon: Spark visor, hit a marked enemy to gain 3 defense. You only get the defense once per turn. It's ok, 3 defense per turn is nice, even if it requires jumping through some hoops. Arguably better than the Admiralty Guard boon outside specific scenarios, but much harder to get early on in a run. By the time you get it, your deck should already be capable of producing enough defense. Seems fine overall. Fair price: 150 shills.
Professional bane: Faulty armor, start each combat with 2 exposed (thanks ArtixBot!). This is really nasty if you don't have some way to remove it. 50% reduction in defense gain at the beginning of combat will get you killed, quick. I haven't actually played with this yet, but it sounds like one of the harshest combat banes.

Security guard boon: Weapons supplier, receive a random item every morning (Stun gun, Spark grenade, Shrapnel grenade). Not much to say here, the available items are ok-ish (shrapnel grenade being the better of the bunch), they may give you that slight boost you need to defeat an enemy without dying, although the lack of replenish means you will want to spend them quickly. Decent-ish. Fair price: 100 shills. I believe items are overpriced right now.
Security guard bane: Sketchy equipment, take 2 1 damage when you use an item. You just don't use items very often unless you are murdering people left and right, and even then it's just not often enough for this to matter. Very weak bane. EDIT: even weaker after the latest nerf.

Taskmaster boon: Torpor Fiend, whenever you sleep, gain 2 xp on a random card. So we've learnt from the Heshian outpost that 5xp per day is strong, but that one activates on the same day you get it (rather than only at the beginning of the next day), spreads the xp over multiple cards so you're less likely to be hosed by RNG, and gives 5 xp instead of 2. Even worse since Rook's campaign is one day shorter, so you're getting at best 6 xp out of this. Desperately needs a boost. Maybe 2 xp for both a battle card and a negotiation card? As of now, Fair price: 50 shills, if that
Taskmaster bane: Crisis, all allies lose morale at the end of your turn. Was moderately oppressive before the nerf, but Rook just doesn't get involved in as many battles with high NPC counts as Sal does. Not the harshest bane, but not something you can ignore either. Can be scary during the Spree ambush of the merchant caravan, so it's best to avoid just in case.

Regional Manager (Fellemo) boon: Scheme, at the start of every negotiation, gain 3 influence or 3 dominance, chosen randomly.
Regional Manager (Fellemo) bane: Scandal, at the start of every negotiation, lose 1 max resolve permanently.

 

Rise:

Rebel boon: Morale boost, when your allies rally for the first time, they heal an additional 20% of their maximum health. I mean. Sal would like it if pets didn't run away the moment they broke their panic meters. Otherwise, neither Rook nor Sal particularly care for their human NPC allies a whole lot. Occasionally useful for those quests were you're protecting an NPC, I guess. Fair price: 100 shills.
Rebel bane: Civil unrest, all allies have higher panic meters. Painful for pets, that have low health to begin with, and run away instantly. Manageable for human NPCs. Not the harshest bane, but noticeable.

Radical boon: War machine, receive a free RPG once a day from a member of the Rise. Holy molly. RPGs are amazing, and unlike Weapons Supplier, you get one on the spot, no waiting for next day necessary. Absolutely worth the price of admission, let's go watch the world burn together. Fair price: 200 shills.
Radical bane: Depleted, on your first turn of combat, draw one less card. Haven't experienced it yet, but if Blacklisted taught me anything, it's that this is painful. Battles are also more high-stakes than negotiations, so this will cost you in the long run. Seems fine.

Pamphleteer boon: Propaganda machine, start each negotiation with 1 influence. Rook has some trouble getting influence, and some cards that really want the max-damage effect from it. Very very good if you're going for a green deck. Fair price: 150-200 shills.
Pamphleteer bane: Slander, when you murder a member of the Rise, lose 2 max resolve. Painful if you're SpicyNiceCream looking for a new faction to antagonize and murder for the high score, otherwise it's just punishing you for doing something you shouldn't want to do anyway. Pretty ignorable, unless the next few days of Rook's campaign shake things up considerably.

Organizer (Kalandra) boon: Excavator, the first item card you play in combat is played twice.
Organizer (Kalandra) bane: Buried, at the start of each combat, gain 2 cripple.

 

Bilebrokers:

Chemist boon: Doze bug, gain +5 max health when you sleep. Get it on day 1, gain +15 health by day 4. I find that more often than not, either I don't take that much damage in combat, or I die, with not much in between, so small amounts of max health don't change much for me. Still, it's not nothing, and effectively increases your health regeneration at night. Seems fine. Fair price: 100-150 shills.
Chemist bane: Spiked drink, 50% chance of gaining an ulcer when drinking. Like the bartender bane, only instead of drowning you in bloat that will disappear when you sleep, it gives a single card every other time you drink that will stay with you until you destroy it. Not super strong, but not ignorable either, especially if you get it early. Seems fine.

 

Jakes:

Dockhand boon: Bargaining, 20 shill discount from shopkeepers. Will add up very fast if you take advantage of it. It's solid. Fair price: 100 shills
Dockhand bane: Thin skin, gain 2 wound the first time you take damage in combat. Really painful early in the run, stays relevant throughout, makes you want to avoid fighting smugglers and wild animals (not like you have much choice for that second one). Solid bane.

Smuggler boon: First aid, whenever you are healed, remove one negative condition. Depending on your deck composition, this is huge. Two Feint upgrades heal, and with this, will make it very hard for any negative condition to stick on you for long, and some of those are really painful. Worst case scenario, you remove "fatigue", and boost your card xp gain. Solid boon that you have to put some work on to exploit. Fair price: 150-200 shills.
Smuggler bane: Fragile health, whenever you gain a debuff, take 2 damage. You just don't get debuffs that often. It does make fleads scarier early on, but that's about it. Pretty weak bane.

 

Spree:

Captain boon: Savagery, +1 bleed to all cards that apply bleed. This is pretty good if you're going for a bleed deck, useless otherwise. Unfortunately, Spree captains are so ridiculously rare, you're very unlikely to ever get this. The usefulness of this boon would shoot up a lot higher if you could get it more reliably, right now it's completely ignorable. Fair price: 150-200 shills
Captain bane: Terrorize, 2 random spree dislike you (thanks ArtixBot). Never experienced it myself, but seems fairly ignorable outside of the last Spree mission, when you have to convince raiders to help you. You might lose a lot of resolve if they are present during the negotiations.  ??? Seriously these guys are ultra rare. Only ever met 2 in some ungodly number of hours, and neither were involved in any quest, combat or negotiation.

Raider boon: Regimented, allied bandits have +10 health in combat. Meh. Helps with the final fight against Oolo, or for the Crossroads robbery quest, but that's about it. Pretty ignorable. Fair price: 50 shills.
Raider bane: Brutality, all status cards cost 1 extra action to play. Makes Bloated and Tipsy much harder to get off your deck, and a bunch of single-combat-only status cards are incredibly more annoying (Injuries, Lumin Burn,  Toxic Fumes and Strange Chemical all come to mind). Tolerable if you aren't fighting Luminaries, the Drusks or Arint, very scary if you are. 

Thief boon: Surprise attack, one extra action at the start of combat. This is amazing if you have anything to spend that action on, otherwise Heavy lifting is better. Still, it shines with Ambush cards and card draw (especially from grafts). One of the best combat boons. Fair price: 150-200 shills.
Thief bane: Outwitted, pin a random card at the beginning of combat. This seems to prioritize your cards with higher rarity. Very painful early on, since it's taking away one of your few good cards, and severely slowing down their xp gain. Even later on, it might pin whatever rare card you built your deck around (Boulder stance, Inside Fighting, etc). Arguably one of the strongest banes, depending on how you build your deck.

Thug boon: Sucker punch, +4 damage on the first attack on combat. Heavy lifting and Surprise attack are both better than this, although some cards and grafts really like it. Yes, Cynotrainer into Cross with Feedback loop means that Sucker punch is giving you an extra 16 damage and 16 combo, but that's just never going to happen. Among the weakest of the "just ok" boons. Fair price: 100 shills.
Thug bane: Marked, enemy bandits have lower Panic meters. Dangerous, in the sense that it makes it more likely you will murder more Spree, entering a vicious circle where you get more Marked until bandits straight up refuse to surrender (and then you fail the "capture Nadan" quest). Not something you can ignore, but still not the harshest bane either.

Leader (Nadan) boon: Chieftain, all allied Spree gain 2 power at the start of combat.
Leader (Nadan) bane: Kill list, enemy spree gain 2 power at the start of combat.

 

Boggers:

Clobber boon: Bogger Pauldrons, At the end of your turn, gain 1 defense for every charge. Not useful if you're building a low-charge deck, but in any other case, this is up to 6 defense per turn, for doing absolutely nothing. Gets even crazier when you stack them. Fair price: 150-200 shills
Clobber bane: Concussed, Every 4th time you gamble every turn, take 1 resolve damage. I find that most decks that can gamble 4 times per turn very often are usually decks that go infinite or almost so, and then it's pretty safe to ignore. Can take a toll if you find yourself in questlines that involve a lot of negotiations in a row, but it's otherwise a pretty safe bane to have, especially compared to the other bogger banes.

Cultivator boon: Inoculated, whenever you draw a parasite card, heal 2 health or restore 2 resolve. It's kinda hard to explain how amazing this is until you actually experience it.  The big part is the health, since Rook has low hp and nowhere near as many healing cards as Sal does. Combat parasitet cards are mostly harmless after the first upgrade, so this effectively gives Rook passive regen; combo it with the Jake smuggler boon for extra fun. The resolve part is just the cherry on top. Fair price: 150-200 shills.
Cultivator bane: Bog sensitive, whenever you draw a parasite card, take 2 damage. I haven't had the displeasure of experiencing this, but from Tinnitus, I can already tell you taking 2 resolve damage at random is very, very painful. The health part can get you killed, and will force you to get meals from Hebbel often. Very painful.

Bogger (Grimdellia) boon: Talisman, whenever you draw a parasite card, draw a card. In the endgame, parasites are mostly harmless, except for the fact they're clogging your deck. This cancels that. Effectively, it's like trashing a bad card from your deck, for free. Accordingly, Fair price: 100 shills.
Bogger (Grimdellia) bane: Bogling, whenever you draw a parasite card in negotiation or combat, discard a random card from your hand. Discarding cards at random, especially at the beginning of your turn, is really bad. You might end up with 4 cards, of which one is a parasite of questionable value, so effectively only 3 cards. This can get you killed if it happens at the wrong time. Very painful.

 

Grifters:

(Sal) boon: People person, at the start of each negotiation, gain 2 influence and 2 dominance. Fair price: 200+ shills
(Sal) bane: Wrong side, at the beginning of each negotiation, gain 1 doubt.

(Rook) boon: Grumpy scowl, at the start of each negotiation, gain 2 heated . Fair price: 150 shills.
(Rook) bane: Contagious, gain a random parasite card.

Link to comment
Share on other sites

For some reason, Irkrow has unique boons/banes.

Irkrow Boon: Top Shelf - Gain an additional 5 resolve when drinking. eh

Irkrow Bane: Bottom Shelf - Take 1 resolve damage when you Expend cards. This is definitely one of the more impactful negotiation banes considering how many cards expend...

Spark Professional's Bane: Faulty Armor - Start each combat with 2 Exposed.

Laborer's Bane: Elitist - Feud citizens you meet will dislike you. I'd say that it is the #1 bane to avoid given how ubiquitous Feud citizens are in Sal's campaign, especially since it impacts bartenders and wealthy merchants. It's a Terrorize bane (Spree Captain bane which makes 2 random Spree dislike you) on steroids.

Also, the Day 1 / Day 2 bosses have unique boons/banes.

Zyn's Boon is Sharpened Blade - all attacks apply 2 Bleed on your first turn of combat. Free damage and bleed synergy - can't complain.

Zyn's Bane is Hemophiliac - Bleed cards deal 2 bonus damage to you. Makes fighting Spree and Yotes more dangerous, otherwise there's not too much bleed in-game.

Hanbi's Boon is Steady Hands - Every 3rd turn in combat, draw 3 additional cards. Which, unsurprisingly, is very good.

Jeol's Bane is Drone Supplier - Combat Drone cards cost 1 additional action. Which I never found to be impactful at all.

Conclusion: Feud Laborers used to have the lowest-impact banes in the game but have now becomes terrors upon society (Seriously, Spree captain banes need to be hates instead of dislikes for even a similar level of impact). Boss day 2 boons are really good if you're lucky enough to get them.

Link to comment
Share on other sites

For admiralty clerks' boon, it basically makes you bribe another admiralty to help you fight or negotiate without actually paying any money. Helpful in one of the quests in the day where you go to a public place. Not useful for main quests at night. I don't get that often, so I'm not sure how good it is.

For the bane, despite it saying admiralty will not help you, the admiralty can still defend the player when the player is attacked during a place in a public place(like the bounty hunt quest). It seems that you just can't pay off admiralty to look away or help you.

Link to comment
Share on other sites

Thanks for the additions everyone!

38 minutes ago, ArtixBot said:

Laborer's Bane: Elitist - Feud citizens you meet will dislike you. I'd say that it is the #1 bane to avoid given how ubiquitous Feud citizens are in Sal's campaign, especially since it impacts bartenders and wealthy merchants. It's a Terrorize bane (Spree Captain bane which makes 2 random Spree dislike you) on steroids.

Ok, this does sound pretty overtuned. Not sure if it's actually worse than the really bad combat banes, because those will get you killed, while for the most part this won't. I find I rarely buy anything from the merchants or the bartenders (other than Fssh). It does mean that you really don't want to negotiate in the Harbour or the Lumin factory though, forces you to share two drinks with a Feud citizen before they like you, so on and so forth. Pretty harsh for sure.

38 minutes ago, ArtixBot said:

Zyn's Boon is Sharpened Blade - all attacks apply 2 Bleed on your first turn of combat. Free damage and bleed synergy - can't complain.

Zyn's Bane is Hemophiliac - Bleed cards deal 2 bonus damage to you. Makes fighting Spree and Yotes more dangerous, otherwise there's not too much bleed in-game.

Hanbi's Boon is Steady Hands - Every 3rd turn in combat, draw 3 additional cards. Which, unsurprisingly, is very good.

Jeol's Bane is Drone Supplier - Combat Drone cards cost 1 additional action. Which I never found to be impactful at all.

Nice, I've been trying for the longest time to get these boons/banes, but I just don't seem to manage it. It also seems that it's basically impossible to get the boons for the Day 1 bosses right now. I agree with your assessment here.

 

16 minutes ago, RageLeague said:

For the bane, despite it saying admiralty will not help you, the admiralty can still defend the player when the player is attacked during a place in a public place(like the bounty hunt quest). It seems that you just can't pay off admiralty to look away or help you.

Hmmm, ok, there's not that many times that makes a difference. Very situational, as far as banes go.

Link to comment
Share on other sites

19 minutes ago, pacovf said:

Ok, this does sound pretty overtuned. Not sure if it's actually worse than the really bad combat banes, because those will get you killed, while for the most part this won't. I find I rarely buy anything from the merchants or the bartenders (other than Fssh). It does mean that you really don't want to negotiate in the Harbour or the Lumin factory though, forces you to share two drinks with a Feud citizen before they like you, so on and so forth. Pretty harsh for sure.

Don't forget that if you're in a zone with a Feud bartender, those drinks will have a 50% additional charge.

Link to comment
Share on other sites

For sure, I just find that I don't bother inviting people to drinks outside the Grog if I can help it. I am cheap like that :p 

(edit: just to be clear, I do think *all* feud citizens disliking you is a bit much for a social bane)

 

EDIT: I've added what I think are reasonable prices for these boons, based on the power level of similar grafts. Unfortunately, I don't remember how much most of these cost, so I can't tell which ones are over or under-priced. About the only ones I remember are Surprise attack (100 shills, under-priced), Haggle Badge (150 shills, under-priced), and Bio-feedback (200 shills, severely over-priced).

However, I could also see an argument that all social boons are generally under-priced compared to grafts, since grafts require graft slots, while social boons just require you drink with them (much cheaper and safer than getting a new a graft slot) and that you avoid killing people from their faction, while also giving side benefits (e.g. free battle help). This could justify that getting a social boon of a comparable power level than a given graft should cost 50-100 shills more.

Link to comment
Share on other sites

Thanks to the mutators in the experimental build, I was given Authorization super early on and discovered how exactly it works. Its not random or anything, you just ask a nearby Admiralty member to help you for combat and negotiation as tho you were bribing them. Got Cadwa and Gao to help me on the first mission for free thanks to Sandano and Oolo suddenly loving me.

authorization.thumb.png.8e9b37f2e24bafbada6e19bb4e24615e.png

 

Havent gotten Red Tape, but presumably it functions the same way, preventing you from bribing Admiralty.

Link to comment
Share on other sites

Thanks! I've updated the OP with that info.

I've also found the boon from Jeol: Drone mastery, allied drones have +10 max health. Completely forgettable, especially since the only reliable way to deploy drones, is to kill Jeol for his prototype...

Link to comment
Share on other sites

Ive gotten disposable drones from the Admiralty mission to clear out the Spree from caves, but yeah, Jeol's is pretty useless unless they add Drones to our roster of pets like Autodogs at some point or some means to consistently make new drones.

Link to comment
Share on other sites

sparkysparkyboomman.thumb.png.ea7dd8191a3f1e0fafbd1d729e368d76.png

I finally got Sparky's Boon. He was the target of the Repo quest and I was too poor to pay off the debt for both parties so I had to betray my quest giver and give him a donation. Gameplay-wise I dont know how good it is. Would help shore up bad draw turns or let you pass a turn against a countering enemy without feeling too bad about it, but otherwise attacking just seems like a better idea.

 

At prestige 7 he cost 200 shills.

Link to comment
Share on other sites

I did some datamining. Here is the script that defines all social boons:

Spoiler




local SOCIAL_GRAFTS =
{
    bolstered_health =
    {
        name ="Bolstered Health",
        desc = "+{1} Max Health.",
        desc_fn = function( self, fmt_str ) return loc.format( fmt_str, self:GetDef().health_bonus ) end,

        health_bonus = 2,

        OnAdded = function(self, agent)
            local health = self.owner:GetAspect("health")
            local cur, max = health:Get()
            health:SetBounds(0, max + self:GetDef().health_bonus)
            health:Set(cur + self:GetDef().health_bonus)
        end,
        OnRemoved = function(self, agent)
            local health = self.owner:GetAspect("health")
            local cur, max = health:Get()
            health:SetBounds(0, max - self:GetDef().health_bonus)
            health:Set(math.min(cur, max))
        end,
    },
    
    bolstered_resolve =
    {
        name ="Bolstered Resolve",
        desc = "+{1} Max Resolve.",
        is_good = true,
        desc_fn = function( self, fmt_str ) return loc.format( fmt_str, self:GetDef().resolve_bonus or 0 ) end,

        resolve_bonus = 2,

        OnAdded = function(self, agent)
            local cur, max = TheGame:GetGameState():GetCaravan():GetResolve()
            TheGame:GetGameState():GetCaravan():DeltaMaxResolve( self:GetDef().resolve_bonus )
        end,
        
        OnRemoved = function(self, agent)
            local cur, max = TheGame:GetGameState():GetCaravan():GetResolve()
            TheGame:GetGameState():GetCaravan():DeltaMaxResolve( self:GetDef().resolve_bonus )
        end,

    },

    --JAKES
    -- Dockhand
    bargaining = 
    {
        name = "Bargaining",
        desc = "20 shill discount from shopkeepers.",

        event_handlers = 
        {
            [ "calc_payment" ] = function( self, agent, modifiers, reasons, params )
                if params and params.is_shop then
                    modifiers.generic_modifier = (modifiers.generic_modifier or 0) - 20
                    table.insert(reasons, loc.format( "<#BONUS>{1} shill discount from {2}</>", 20, self:GetDef().name))
                end
            end
        },
    },

    -- Smuggler
    first_aid = 
    {
        name = "First Aid",
        desc = "Whenever you are healed, also remove one negative condition.",

        OnActivateFighter = ApplyCondition,

        battle_condition =
        {
            hidden = true,
            event_handlers = 
            {
                [ BATTLE_EVENT.HEAL_HEALTH ] = function( self, fighter, delta, source  )
                    if fighter == self.owner then
                        self.owner:RemoveDebuff()
                        self.battle:BroadcastEvent( BATTLE_EVENT.GRAFT_TRIGGERED, self.graft )
                    end
                end
            },
        },
    },

    -- LABORER
    voice_of_the_people =
    {
        name = "Voice of the People",
        desc = "Start all negotiations with a {voice_of_the_people} argument.",

        negotiation_modifier = 
        {
            desc = "",
            target_enemy = TARGET_ANY_RESOLVE,
            modifier_type = MODIFIER_TYPE.ARGUMENT,

            OnSetStacks = function( self, old_stacks )
                self.min_persuasion = math.floor(math.pow(2, self.stacks))
                self.max_persuasion = self.min_persuasion
            end,

            max_resolve = 4,

            min_persuasion = 2,
            max_persuasion = 2,

            hide_stacks = true,
            target_enemy = TARGET_ANY_RESOLVE,
            modifier_type = MODIFIER_TYPE.ARGUMENT,

            event_handlers =
            {
                [ EVENT.END_TURN ] = function( self, minigame, negotiator )
                    if negotiator == self.negotiator then
                        self:ApplyPersuasion()
                    end
                end
            },
        },
        OnStartNegotiation = ApplyGraftModifier,
    },

    -- HEAVY LABORER
    heavy_lifting =
    {
        name = "Heavy Lifting",
        desc = "At the start of each battle, gain 4 {DEFEND} and 2 temporary {POWER}.",

        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.BEGIN_PLAYER_TURN ] = function( self, battle )
                    self.owner:AddCondition("DEFEND", 4 * self.stacks, self)
                    self.owner:AddCondition("POWER", 2 * self.stacks, self)
                end,

                [ BATTLE_EVENT.END_PLAYER_TURN ] = function( self, battle )
                    self.owner:RemoveCondition("POWER", 2 * self.stacks)
                    self.owner:RemoveCondition(self.id)
                end
            },
        },
        OnActivateFighter = ApplyCondition,
    },

    -- FOREMAN
    authority =
    {
        name = "Authority",
        desc = "At the start of each negotiation, add a random authority card to your draw pile.",

        OnStartNegotiation = ApplyGraftModifier,

        negotiation_modifier =
        {
            hidden = true,
            cards = {"by_the_book", "proper_channels", "permits"},
            event_handlers =
            {
                [ EVENT.BEGIN_PLAYER_TURN ] = function( self, minigame )
                    for i=1,self.stacks do
                        local chosen_card = self.cards[math.random(#self.cards)]
                        local card = Negotiation.Card( chosen_card, minigame:GetPlayer() )
                        card:ScaleToDifficulty(minigame)
                        minigame:DealCard(card)
                    end
                    self.negotiator:RemoveModifier(self.id, self.stacks)
                end
            },
        },
    },


    --ADMIRALTY

    confidence = 
    {
        name ="Confidence",
        desc = "+5 Max Health.",
        
        bonus = 5,
        OnAdded = function(self, agent)
            local health = self.owner:GetAspect("health")
            local cur, max = health:Get()
            health:SetBounds(0, max + self:GetDef().bonus)
            health:Set(cur + self:GetDef().bonus)
        end,
        OnRemoved = function(self, agent)
            local health = self.owner:GetAspect("health")
            local cur, max = health:Get()
            health:SetBounds(0, max - self:GetDef().bonus)
            health:Set(math.min(cur, max))
        end,
    },

    -- Goon
    piece_of_the_pie = 
    {
        name = "Piece of the Pie",
        desc = "Gain {1#money} every morning.",
        desc_fn = function ( self, fmt_str )
            return loc.format(fmt_str, self:GetDef().money_gain)
        end,

        money_gain = 75,

        MorningMail = function( self, cxt, graft_instance )
            cxt:Dialog([[
                * Someone has left an envelope for you. It carries the Admiralty crest, stamped on in red wax.
                * Scrawled on the front is {1} and inside you find {2#money}.
                ]], 
                graft_instance.userdata.agents and graft_instance.userdata.agents[1] and graft_instance.userdata.agents[1]:GetName() or "your friend's name", self.money_gain )
            cxt.enc:GainMoney( self.money_gain )
        end
    },

    --HESH
    -- Luminari

    bell_of_hesh =
    {
        name = "Bell of Hesh",
        desc = "Draw 1 extra card at the start of negotiation.",
        
        negotiation_modifier =
        {
            event_handlers =
            {
                [ EVENT.CALC_DRAW_COUNT ] = function( self, acc )
                    acc:AddValue( self.stacks or 1, self )
                end,

                [ EVENT.END_PLAYER_TURN ] = function( self, minigame )
                    self.negotiator:RemoveModifier(self)
                end,
            },
        },

        OnStartNegotiation = ApplyGraftModifier,
    },

    -- Priest
    bio_feedback =
    {
        name = "Bio-Feedback",
        desc = "Status Cards cost 1 less action.",
        
        OnActivateFighter = ApplyCondition,
        battle_condition = 
        {
            hidden = true,
            event_handlers = 
            {
                [ BATTLE_EVENT.CALC_ACTION_COST ] = function( self, cost_acc, card, target )
                    if CheckBits(card.flags, battle_defs.CARD_FLAGS.STATUS) then
                        cost_acc:AddValue(-self.stacks, self)
                    end
                end,
            },
        },
    },

    --MERCHANT
    haggle_badge =
    {
        name = "Haggle Badge",
        desc = "You can negotiate for greater quest rewards.",
    },

    --Chemist
    doze_bug =
    {
        name = "Doze Bug",
        desc = "Whenever you sleep, increase your max health by {1}.",
        desc_fn = function( self, fmt_str ) return
            loc.format( fmt_str, self:GetDef().health_bonus )
        end,
        
        health_bonus = 5,

        event_handlers = 
        {
            [ "do_sleep" ] = function( self )
                local health = self.owner:GetAspect("health")
                local cur, max = health:Get()
                health:SetBounds(0, max + self:GetDef().health_bonus)
                health:Set(cur + self:GetDef().health_bonus)
            end
        },
    },

    --BARTENDER
    mixology =
    {
        name = "Mixology",
        desc = "Restore an additional 4 resolve when drinking.",
        
        event_handlers = 
        {
            ["do_drink"] = function( self, drink_effects )
                drink_effects.resolve_gain = drink_effects.resolve_gain + 4
            end
        },
    },

    top_shelf =
    {
        name = "Top Shelf",
        desc = "Restore an additional 6 resolve when drinking.",
        
        event_handlers = 
        {
            [ "do_drink" ] = function( self, drink_effects )
                drink_effects.resolve_gain = drink_effects.resolve_gain + 6
            end
        },
    },

    torpor_fiend =
    {
        name = "Torpor Fiend",
        desc = "When you sleep, gain {1} experience on a random card.",
        desc_fn = function( self, fmt_str ) return loc.format( fmt_str, self:GetDef().xp_amount) end,
        
        xp_amount = 2,
        event_handlers = 
        {
            [ "do_sleep" ] = function( self )
                local negotiation_cards = TheGame:GetGameState():GetPlayerAgent().negotiator:GetCards()
                local battle_cards = TheGame:GetGameState():GetPlayerAgent().battler:GetCards()
                local options = {}
                   
                for i=1, #negotiation_cards do
                    if negotiation_cards[i]:HasUpgrades() and not negotiation_cards[i]:UpgradeReady() then
                        table.insert(options, negotiation_cards[i])
                    end                        
                end
                for i=1, #battle_cards do
                    if battle_cards[i]:HasUpgrades() and not battle_cards[i]:UpgradeReady() then
                        table.insert(options, battle_cards[i])
                    end                        
                end
                local card
                if #options > 1 then
                    card = options[math.random(#options)]
                else
                    card = options[1]
                end
                card:AddXP(self:GetDef().xp_amount)
            end
        },
    },

    accelerator =
    {
        name = "Accelerator",
        desc = "The first card played in negotiation or battle gains +2 XP.",
        
        OnStartNegotiation = function( self, minigame )
            local modifier_id = self:GetDef().negotiation_modifier
            local modifier = minigame:GetNegotiator( self.owner ):AddModifier( modifier_id, self.stacks or 1 )
            modifier.graft = self
            return modifier
        end,

        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        negotiation_modifier =
        {
            event_handlers =
            {
                [ EVENT.POST_RESOLVE ] = function( self, minigame, card )
                    if card.owner == self.owner then
                        card:AddXP( 2 * self.stacks )
                        self.owner:RemoveModifier( self )
                    end
                end,
            }
        },

        battle_condition =
        {
            event_handlers =
            {
                [ BATTLE_EVENT.POST_RESOLVE ] = function( self, battle, attack )
                    if attack and attack.attacker == self.owner and attack.card then
                        attack.card:AddXP( 2 * self.stacks )
                        self.owner:RemoveCondition( self.id )
                    end
                end,
            },
        },
    },

    -- Admiralty Guard
    sparring =
    {
        name = "Sparring",
        desc = "Gain 1 bonus {DEFEND} on all cards that apply {DEFEND}.",

        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.CALC_MODIFY_STACKS ] = function( self, acc, condition_id, fighter, card )
                    if condition_id == "DEFEND" and is_instance( card, Battle.Card ) and card.owner == self.owner then
                        if acc.value > 0 then
                            acc:AddValue( self.stacks, self )
                        end
                    end
                end,
            },
        },
    },

    -- Admiralty clerk
    authorization =
    {
        name = "Authorization",
        desc = "Once a day, a member of the Admiralty will help you in combat or negotiation.",
        desc_fn = function( self, fmt_str )
            if self:GetDef().OnCooldown( self ) then
                return loc.format( "{1}\n<#PENALTY>{2}</>", fmt_str, "On Cooldown" )
            else
                return fmt_str
            end
        end,
        
        OnCooldown = function( self )
            return self:HasMemory( "COOLDOWN", 1 )
        end,

        StartCooldown = function( self )
            self:Remember( "COOLDOWN" )
        end,

        event_handlers = 
        {
            [ "manipulate_chat" ] = function( self, bribe_params, cxt )
                if cxt:GetAgent():GetFactionID() == "ADMIRALTY" then
                    -- Disable default manipulate options; see authorization_graft_chat.
                    if not self:GetDef().OnCooldown( self ) then
                        bribe_params.hidden = true
                    end
                end
            end
        },
    },

    -- Admiralty Patrol Leader
    commander =
    {
        name = "Commander",
        desc = "All allies gain +5 health in combat.",
        
        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.ACTIVATED_FIGHTER ] = function( self, fighter )
                    if fighter ~= self.owner and fighter:GetTeam() == self.owner:GetTeam() then
                        fighter:DeltaMaxHealth(5 * self.stacks)
                        fighter:HealHealth(5 * self.stacks, self)
                    end
                end,
            },
        },        
    },

    -- Bandit Captain
    savagery =
    {
        name = "Savagery",
        desc = "+1 {BLEED} to all cards that apply {BLEED}.",
        
        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            event_handlers =
            {
                [ BATTLE_EVENT.CONDITION_ADDED ] = function( self, fighter, condition, stacks, source )
                    if fighter ~= self.owner and source and source.owner == self.owner and condition == "BLEED" then
                        fighter:AddCondition("BLEED", self.stacks)
                    end
                end,
            },
        },
    },

    -- Bandit Goon
    sucker_punch = 
    {
        name ="Sucker Punch",
        desc = "+{1} Damage on the first attack in combat.",
        desc_fn = function( self, fmt_str ) return loc.format( fmt_str, 4) end,

        battle_condition =
        {
            desc = "+{1} Damage on the first attack in combat.",
            desc_fn = function( self, fmt_str ) return loc.format( fmt_str, 4 * self.stacks) end,
            event_handlers =
            {
                [ BATTLE_EVENT.CALC_DAMAGE ] = function( self, card, target, dmgt )
                    if card.owner == self.owner then
                        dmgt:AddDamage( 4 * self.stacks, 4 * self.stacks, self )
                    end
                end,

                [ BATTLE_EVENT.POST_RESOLVE ] = function( self, battle, attack )
                    if self.owner == attack.owner and attack.card:IsAttackCard() then
                        self.owner:RemoveCondition(self.id)
                    end
                end
            },
        },
        OnActivateFighter = ApplyCondition,
    },

    -- Bandit Goon2
    surprise_attack = 
    {
        name ="Surprise Attack",
        desc = "Gain 1 action at the start of combat.",

        battle_condition =
        {
            event_handlers = 
            {
                [ BATTLE_EVENT.BEGIN_PLAYER_TURN ] = function( self, battle )
                    battle:ModifyActionCount(self.stacks)
                    self.owner:RemoveCondition(self.id)
                end
            },
        },
        OnActivateFighter = ApplyCondition,
    },

    -- Bandit Raider
    regimented =
    {
        name = "Regimented",
        desc = "All allied bandits have +10 Health in combat.",
        
        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.ACTIVATED_FIGHTER ] = function( self, fighter )
                    if fighter ~= self.owner and fighter:GetTeam() == self.owner:GetTeam() and fighter.agent:GetFactionID() == "BANDITS" then
                        fighter:DeltaMaxHealth(10 * self.stacks)
                        fighter:DeltaHealth(10 * self.stacks)
                    end
                end,
            },
        },
    },

    -- Spark Baron Professional
    spark_visor =
    {
        name = "Spark Visor",
        desc = "At the start of each turn, mark an enemy. Attacking that enemy grants you 3 {DEFEND}.",
        
        OnActivateFighter = ApplyCondition,

        battle_condition = 
        {
            hidden = true,
            event_handlers = 
            {
                [ BATTLE_EVENT.BEGIN_PLAYER_TURN ] = function( self, battle )
                    local target_fighters = {}
                    battle:CollectRandomTargets( target_fighters, self.owner:GetEnemyTeam().fighters, self.stacks )

                    for i=1, #target_fighters do
                        local target = target_fighters[i]
                        target:AddCondition("SPARK_VISOR_MARK", 1, self)
                    end
                end,
            },
        },
    },

    -- Spark baron goon
    weapons_supplier =
    {
        name = "Weapons Supplier",
        desc = "Receive a random item card every morning.",

        available_items = {"stun_gun", "spark_grenade", "shrapnel_grenade"},

        MorningMail = function( self, cxt, graft_instance )
            local chosen_item = self.available_items[math.random(#self.available_items)]
            cxt:Dialog([[
                * You notice a large box with the Spark Barons logo on it.
                * Upon closer inspection, you see {1}'s name on it. You open it to find a {2#card}.
                ]], 
                graft_instance.userdata.agents and graft_instance.userdata.agents[1] and graft_instance.userdata.agents[1]:GetName() or "your friend", chosen_item )
            cxt:ForceTakeCards{chosen_item}
        end
    },

    -- Rise Rebel
    morale_boost =
    {
        name = "Morale Boost",
        desc = "When your allies rally for the first time, they heal an additional 20% of their maximum health.",
        
        OnActivateFighter = ApplyCondition,

        battle_condition =
        {
            hidden = true,
            fighters_healed = {},
            event_handlers = 
            {
                [ BATTLE_EVENT.CONDITION_REMOVED ] = function( self, fighter, condition, stacks, source )
                    if fighter:GetTeam() == self.owner:GetTeam() and condition.id == "SURRENDER" and not table.contains(self.fighters_healed, fighter) then
                        fighter:HealHealth(math.round(fighter:GetMaxHealth() * .2))
                        self.battle:BroadcastEvent( BATTLE_EVENT.GRAFT_TRIGGERED, self.graft )
                        table.insert(self.fighters_healed, fighter)
                    end
                end,
            },
        },
    },

    -- Zyn
    sharpened_blades =
    {
        name = "Sharpened Blades",
        desc = "All attacks apply 2 {BLEED} on your first turn of combat.",

        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            event_handlers =
            {
                [ battle_defs.BATTLE_EVENT.ON_HIT ] = function( self, battle, attack )
                    if attack.card:IsAttackCard() and attack.attacker == self.owner then
                        attack:AddCondition( "BLEED", 2 * self.stacks, attack.card )
                    end
                end,

                [ battle_defs.BATTLE_EVENT.END_PLAYER_TURN ] = function( self, battle )
                    self.owner:RemoveCondition( self.id )
                end,
            },
        },
    },

    -- Hanbi
    steady_hands =
    {
        name = "Steady Hands",
        desc = "Every 3rd turn in combat, draw 3 additional cards.",

        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition(fighter)
        end,

        battle_condition =
        {
            counter = 0,
            event_handlers = 
            {
                [ battle_defs.BATTLE_EVENT.BEGIN_PLAYER_TURN ] = function( self, card, deck )
                    self.counter = self.counter + 1
                    if self.counter >= 3 then
                        self.battle:DrawCards(3)
                        self.counter = 0
                    end
                end
            },
        },
    },

    -- Sparky
    system_shock =
    {
        name = "System Shock",
        desc = "If you didn't attack last turn, gain 2 temporary {POWER}.",

        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            hidden = true,
            event_handlers = 
            {
                [ battle_defs.BATTLE_EVENT.BEGIN_PLAYER_TURN ] = function( self, battle )
                    if self.no_attacks then
                        battle:BroadcastEvent( BATTLE_EVENT.GRAFT_TRIGGERED, self.graft )
                        self.owner:AddCondition("POWER", 2, self)
                        self.added_power = true
                    end
                    self.no_attacks = true
                end,

                [ battle_defs.BATTLE_EVENT.END_PLAYER_TURN ] = function( self, battle )
                    if self.added_power then
                        self.owner:RemoveCondition("POWER", 2, self)
                        self.added_power = false
                    end
                end,

                [ battle_defs.BATTLE_EVENT.POST_RESOLVE ] = function( self, battle, attack )
                    if attack and attack.card and attack.card:IsAttackCard() and attack.card.owner == self.owner then
                        self.no_attacks = false
                    end
                end
            },
        },
    },

    -- Jeol
    drone_mastery =
    {
        name = "Drone Mastery",
        desc = "Allied combat drones have 10 additional max Health.",

        OnActivateFighter = ApplyCondition,

        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.ACTIVATED_FIGHTER ] = function( self, fighter )
                    if fighter ~= self.owner and fighter:GetTeam() == self.owner:GetTeam() and fighter.agent:GetContentID() == "COMBAT_DRONE" then
                        fighter:DeltaMaxHealth(10 * self.stacks)
                        fighter:DeltaHealth(10 * self.stacks)
                    end
                end,
            },
        },
    },

    -- Rise Pamphleteer
    propaganda_machine =
    {
        name = "Propaganda Machine",
        desc = "Start each negotiation with 1 {negotiation.INFLUENCE}.",

        OnStartNegotiation = function( self, minigame )
            minigame:GetPlayerNegotiator():AddModifier( "INFLUENCE", 1 )
        end,
    },

    -- Rise Radical
    war_machine =
    {
        name = "War Machine",
        desc = "Receive a free {card.rpg} once a day from a member of the Rise.",
    }
}

And here is all the social banes:



local SOCIAL_GRAFTS =
{
    thin_skin =
    {
        name = "Thin Skin",
        desc = "The first time you take damage each fight, gain 2 {WOUND}.",

        OnActivateFighter = ApplyCondition,

        battle_condition = 
        {
            hidden = true,

            event_handlers =
            {
                [ BATTLE_EVENT.DELTA_STAT ] = function( self, fighter, stat, delta, value, mitigated  )
                    if fighter == self.owner and stat == COMBAT_STAT.HEALTH and delta < 0 and not self.used then
                        self.used = true
                        self.owner:AddCondition("WOUND", 2 * self.stacks, self)
                        self.owner:RemoveCondition(self.id)
                        self.battle:BroadcastEvent( BATTLE_EVENT.GRAFT_TRIGGERED, self.graft )
                    end
                end
            },
        },
    },

    fragile_health =
    {
        name = "Fragile Health",
        desc = "Whenever you gain a debuff, take 2 damage.",

        OnActivateFighter = ApplyCondition,
        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.CONDITION_ADDED ] = function( self, fighter, condition, stacks, source )
                    if fighter == self.owner and condition.ctype == CTYPE.DEBUFF then
                        self.owner:ApplyDamage(2, self.owner, self)
                        self.battle:BroadcastEvent( BATTLE_EVENT.GRAFT_TRIGGERED, self.graft )
                    end
                end
            },
        },
    },

    elitist =
    {
        name = "Elitist",
        desc = "Feud Citizens that you meet for the first time will dislike you.",

        event_priorities =
        {
            [ "start_convo" ] = 1, -- Prioritized before first_impressions
        },

        event_handlers =
        {
            [ "start_convo" ] = function( self, agent )
                if not agent:KnowsPlayer() and agent:GetFactionID() == "FEUD_CITIZEN" then
                    agent:OpinionEvent( OPINION.ELITIST_FACTION_DISLIKE )
                end
            end,
        }
    },

    whispered_rumors =
    {
        name = "Whispered Rumors",
        desc = "Opponents start with an additional argument each negotiation.",

        negotiation_modifier =
        {
            desc_fn = function( self, fmt_str, engine, widget )
                if self.enemy and widget and widget.PostPortrait then
                    local txt = loc.format( "{1#agent} has been spreading bad rumors about you!", self.enemy )
                    widget:PostPortrait( self.enemy, txt )
                end
            end,

            max_resolve = 5,
            max_stacks = 1,

            modifier_type = MODIFIER_TYPE.ARGUMENT,

            target_enemy = TARGET_ANY_RESOLVE,
            min_persuasion = 1,
            max_persuasion = 5,

            bonus_damage = { 0, 1, 1, 2 },

            OnInit = function( self, enemy )
                self:SetResolve( 3, MODIFIER_SCALING.MED )
                assert( is_instance( enemy, Agent ))
                self.enemy = enemy
                self.engine:BroadcastEvent( EVENT.CUSTOM, self.OnQuipBadRumor, self )
                self.min_persuasion = self.min_persuasion + self.bonus_damage[math.min(#self.bonus_damage, self.engine:GetDifficulty())]
                self.max_persuasion = self.max_persuasion + self.bonus_damage[math.min(#self.bonus_damage, self.engine:GetDifficulty())]
            end,

            -- FIXME: because these reference an arbitrary 3rd party, quips can't be used :()
            DIALOG = {
                [[
                    agent:
                        {1#agent} warned me about you.
                ]],
                [[
                    agent:
                        {1#agent} told me you're not to be trusted.
                ]],
                [[
                    agent:
                        Why should I listen to you and not {1#agent}?
                ]],
            },

            OnQuipBadRumor = function( panel, self )
                local txt = loc.format( table.arraypick( self.DIALOG ), self.enemy )
                panel:Dialog( txt )
                panel:Delay( 2.0 )
            end,

            OnBeginTurn = function( self, minigame )
                local r = math.random()
                if r < 1 / math.max(1, minigame:GetTurns()) then
                    minigame:BroadcastEvent( EVENT.CUSTOM, self.OnQuipBadRumor, self )
                end
                self:ApplyPersuasion()
            end,
        },

        OnStartNegotiation = function( self, minigame )
            local enemy
            if self.userdata and self.userdata.agents then
                local agents = shallowcopy( self.userdata.agents )
                table.arrayremove( agents, minigame:GetOpponent())
                enemy = table.arraypick( agents )
            end
            if enemy ~= nil then
                local modifier_id = self:GetDef().negotiation_modifier
                local modifier = minigame:GetOpponentNegotiator():AddModifier( modifier_id, self.stacks or 1, enemy )
                modifier.graft = self
                return modifier
            end
        end,
    },

    blacklisted =
    {
        name = "Blacklisted",
        desc = "At the start of each negotiation, discard a random card.",

        OnStartNegotiation = ApplyGraftModifier,
        negotiation_modifier = 
        {
            hidden = true,
            event_handlers= 
            {
                [ EVENT.HAND_DRAWN ] = function( self, minigame )
                    if minigame:GetTurns() == 1 then
                        local hand = minigame:GetHandDeck()
                        local card = hand:PeekRandom()
                        if card then minigame:DiscardCard(card) end
                    end                    
                    self.negotiator:RemoveModifier( self )
                end
            },
        },
    },

    on_the_lamb =
    {
        name ="On the Lam",
        desc = "-4 Max Health.",
        
        OnAdded = function(self, agent)
            local health = self.owner:GetAspect("health")
            local cur, max = health:Get()
            health:SetBounds(0, max - 4)
            health:Set(math.min(cur, max))
        end,
        OnRemoved = function(self, agent)
            local health = self.owner:GetAspect("health")
            local cur, max = health:Get()
            health:SetBounds(0, max + 4)
            health:Set(cur + 4)
        end,
    },

    hunted =
    {
        name = "Hunted",
        desc = "All enemy Admiralty gain 1 {POWER} at the start of combat.",

        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.ACTIVATED_FIGHTER ] = function( self, fighter )
                    if fighter:GetTeam() ~= self.owner:GetTeam() and fighter.agent:GetFactionID() == "ADMIRALTY" then
                        fighter:AddCondition("POWER", 1, self)
                    end
                end,
            },
        },
        OnActivateFighter = ApplyCondition,
    },

    --BANDITS  

    shakey = 
    {
        name = "Shakey",
        desc = "-2 max resolve.",
        
        OnAdded = function(self, agent)
            local cur, max = TheGame:GetGameState():GetCaravan():GetResolve()
            TheGame:GetGameState():GetCaravan():DeltaMaxResolve(-2)
        end,

        OnRemoved = function(self, agent)
            local cur, max = TheGame:GetGameState():GetCaravan():GetResolve()
            TheGame:GetGameState():GetCaravan():DeltaMaxResolve(2)
        end,
    },

    curse_of_hesh = 
    {
        name = "Curse of Hesh",
        desc = "Lose 1 action and draw a card on your first turn of combat.",
        
        battle_condition =
        {
            ctype = CTYPE.DEBUFF,
            desc = "Lose {1} {1*action|actions} on your first turn of combat.",
            desc_fn = function( self, fmt_str )
                return loc.format( fmt_str, self.stacks or 1)
            end,
            event_handlers =
            {
                [ BATTLE_EVENT.BEGIN_TURN ] = function( self, fighter )
                    if fighter == self.owner then
                        if self.owner.player_controlled then
                            self.battle:ModifyExertedCount( self.stacks )
                            self.battle:DrawCards(1)
                        end
                    end
                end,

                [ BATTLE_EVENT.END_PLAYER_TURN ] = function( self, battle )
                    self.owner:RemoveCondition(self.id)
                end
            },
        },
        OnActivateFighter = ApplyCondition,
    },

    bad_faith =
    {
        name = "Bad Faith",
        desc = "At the start of each fight, add a {gnarled_effigy} to your draw pile.",

        OnActivateFighter = ApplyCondition,

        battle_condition =
        {
            hidden = true,
            card_id = "gnarled_effigy",
            event_handlers =
            {
                [ EVENT.BEGIN_PLAYER_TURN ] = function( self, battle )
                    for i=1,self.stacks do
                        local card = Battle.Card( self.card_id, self.owner )
                        battle:DealCard(card)
                    end
                    self.owner:RemoveCondition(self.id, self.stacks)
                end
            },
        },
    },

    bad_credit = 
    {
        name = "Bad Credit",
        desc = "Buying anything from shopkeepers costs an additional 20 shills.",

        event_handlers = 
        {
            [ "calc_payment" ] = function( self, agent, modifiers, reasons )
                if agent:HasAspect("cardshop") then
                    modifiers.generic_modifier = (modifiers.generic_modifier or 0) + 20
                    table.insert(reasons, loc.format( "<#PENALTY>{1} shill surcharge from {2}</>", 20, self:GetDef().name))
                end
            end
        },
    },

    spiked_drink =
    {
        name = "Spiked Drink",
        desc = "50% chance to gain an {negotiation.ulcer} card whenever you drink.",

        event_handlers = 
        {
            ["do_drink"] = function( self, drink_effects )
                if math.random() < .5 then table.insert( drink_effects.cards, "ulcer" ) end
            end
        },
    },

    tainted_supply =
    {
        name = "Tainted Supply",
        desc = "Drinking adds an additional drunk card.",
        
        event_handlers =
        {
            [ "do_drink" ] = function( self, drink_effects )
                table.insert( drink_effects.cards, "drunk_player" )
                table.insert( drink_effects.cards, "drunk" )
            end
        },
    }, 

    intimidated =
    {
        name = "Bully",
        desc = "Lose 1 {DEFEND} on all cards that apply {DEFEND}.",
        
        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.CALC_MODIFY_STACKS ] = function( self, acc, condition_id, fighter, card )
                    if condition_id == "DEFEND" and is_instance( card, Battle.Card ) and card.owner == self.owner then
                        if acc.value > 0 then
                            acc:AddValue( -self.stacks, self )
                        end
                    end
                end,
            },
        },
    },

    red_tape =
    {
        name = "Red Tape",
        desc = "Members of the Admiralty will not help you in combat or negotiation.",
    
        event_handlers = 
        {
            [ "manipulate_chat" ] = function( self, bribe_params, cxt )
                if cxt:GetAgent():GetFactionID() == "ADMIRALTY" then
                    bribe_params.disable = true
                    bribe_params.disable_reason = loc.format( "{1#graft} : {2}", self.id, self:GetDesc() )
                end
            end
        },
    },

    lowered_rank =
    {
        name = "Lowered Rank",
        desc = "Allies have -5 max health in combat.",
        
        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            event_handlers =
            {
                [ BATTLE_EVENT.ACTIVATED_FIGHTER ] = function( self, fighter )
                    if fighter ~= self.owner and fighter:GetTeam() == self.owner:GetTeam() then
                        fighter:DeltaMaxHealth(-5 * self.stacks)
                    end
                end,
            },
        },   
    },

    terrorized = 
    {
        name = "Terrorized",
        desc = "When gained, 2 random Spree dislike you.",
        
        OnAdded = function(self, agent)
            local candidates = ObtainWorkTable()

            for k,agent in pairs(TheGame:GetGameState().agents) do
                if not AgentUtil.HasPlotArmour(agent) and not agent:IsPlayer() and agent:GetFactionID() == "BANDITS" then
                    table.insert(candidates, agent)
                end
            end    

            for i=1, math.min( #candidates, 2 ) do
                local chosen = table.arraypick(candidates)
                table.remove(candidates, candidates.chosen)
                chosen:OpinionEvent( OPINION.TERRORIZED )
            end
            
            ReleaseWorkTable(candidates)
        end,
    },

    marked = 
    {
        name = "Marked",
        desc = "Enemy Bandits have lower Panic meters.",
        
        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            event_handlers =
            {
                [ BATTLE_EVENT.ACTIVATED_FIGHTER ] = function( self, fighter )
                    if fighter:GetTeam() ~= self.owner:GetTeam() and fighter.agent:GetFactionID() == "BANDITS" then
                        local morale = fighter:GetMorale()
                        if morale then
                            local new_morale = morale/(0.5 + self.stacks)
                            fighter:DeltaMorale( new_morale - morale )
                        end
                    end
                end,
            },
        },
    },

    outwitted =
    {
        name = "Outwitted",
        desc = "Pin a random card at the start of combat.",
        
        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.BEGIN_PLAYER_TURN ] = function( self, battle )
                    for i=1,self.stacks do
                        local incepted_card = Battle.Card( "status_pinned", self.owner)
                        incepted_card:DoPinning( battle, self.owner )
                    end
                    self.owner:RemoveCondition(self.id)
                end,
            },
        },
    },

    brutality = 
    {
        name = "Brutality",
        desc = "Status cards cost 1 additional action.",
        
        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition( fighter )
        end,

        battle_condition =
        {
            event_handlers =
            {
                [ BATTLE_EVENT.CALC_ACTION_COST ] = function( self, cost_acc, card, target )
                    if CheckBits(card.flags, battle_defs.CARD_FLAGS.STATUS) then
                        cost_acc:AddValue(self.stacks, self)
                    end
                end,
            },
        },
    },

    faulty_armor = 
    {
        name = "Faulty Armor",
        desc = "Start each battle with 2 {EXPOSED}.",
        
        OnActivateFighter = ApplyCondition,

        battle_condition = 
        {
            hidden = true,
            event_handlers = 
            {
                [ BATTLE_EVENT.BEGIN_PLAYER_TURN ] = function( self, battle )
                    self.owner:AddCondition("EXPOSED", self.stacks * 2, self)
                    self.owner:RemoveCondition(self.id)
                end
            },
        },
    },

    crisis =
    {
        name = "Crisis",
        desc = "All allies lose morale at the end of your turn.",

        OnActivateFighter = ApplyCondition,

        battle_condition =
        {
            hidden = true,
            event_handlers = 
            {
                [ BATTLE_EVENT.END_PLAYER_TURN ] = function( self, battle )
                    local fighters = shallowcopy( battle:GetPlayerTeam():GetFighters() )
                    for i, fighter in ipairs( fighters ) do
                        fighter:DeltaMorale(0.1)
                    end
                end
            },
        }
    },

    sketchy_equipment =
    {
        name = "Sketchy Equipment",
        desc = "Take 2 damage whenever you use an item.",
        
        OnActivateFighter = ApplyCondition,
        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.POST_RESOLVE ] = function( self, battle, attack )
                    if attack.card:IsFlagged( battle_defs.CARD_FLAGS.ITEM ) then
                        battle:BroadcastEvent( BATTLE_EVENT.GRAFT_TRIGGERED, self.graft )
                        self.owner:ApplyDamage( 2* self.stacks, self.owner, self, false )
                    end
                end
            },
        },
    },

    civil_unrest =
    {
        name = "Civil Unrest",
        desc = "All allies have higher panic meters.",
        
        OnActivateFighter = ApplyCondition,

        battle_condition = 
        {
            hidden = true,
            event_handlers = 
            {
                [ BATTLE_EVENT.ACTIVATED_FIGHTER ] = function( self, fighter )
                    if fighter ~= self.owner and fighter:GetTeam() == self.owner:GetTeam() then
                        fighter:DeltaMorale(.15)
                    end
                end,
            },
        },
    },

    hemophiliac = 
    {
        name = "Hemophiliac",
        desc = "Bleed cards deal 2 bonus damage to you.",
        
        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition(fighter)
        end,

        battle_condition =
        {
            event_handlers = 
            {
                [ battle_defs.BATTLE_EVENT.CARD_DEALT ] = function( self, card, deck )
                    if card.id == "status_bleed" then
                        card.bleed_damage = (card.bleed_damage or 2) + 2
                    end
                end
            },
        },
    },


    fumbling_fingers =
    {
        name = "Fumbling Fingers",
        desc = "Every 3rd turn in combat, discard a random card from your hand.",
        
        OnActivateFighter = function( self, fighter )
            self:AddBattleCondition(fighter)
        end,

        battle_condition =
        {
            counter = 0,
            event_handlers = 
            {
                [ battle_defs.BATTLE_EVENT.BEGIN_PLAYER_TURN ] = function( self, card, deck )
                    self.counter = self.counter + 1
                    if self.counter >= 3 then
                        local card = self.battle:GetHandDeck():PeekRandom()
                        if card then
                            self.battle:DiscardCard( card )
                        end
                        self.counter = 0
                    end
                end
            },
        },
    },

    short_circuit =
    {
        name = "Short Circuit",
        desc = "Take 2 damage whenever you gain {POWER}.",

        OnActivateFighter = ApplyCondition,

        battle_condition = 
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.CONDITION_ADDED ] = function( self, fighter, condition, stacks, source )
                    if condition.id == "POWER" and fighter == self.owner then
                        self.owner:ApplyDamage(2, self.owner, self, false)
                        self.battle:BroadcastEvent( BATTLE_EVENT.GRAFT_TRIGGERED, self.graft )
                    end
                end
            },
        },
    },

    drone_supplier =
    {
        name = "Drone Supplier",
        desc = "Combat Drone cards cost 1 additional action.",

        OnActivateFighter = ApplyCondition,

        battle_condition =
        {
            hidden = true,
            event_handlers = 
            {
                [ BATTLE_EVENT.CALC_ACTION_COST ] = function( self, cost_acc, card, target )
                    if card.id == "combat_drone" then
                        cost_acc:AddValue(self.stacks, self)
                    end
                end,
            },
        },
    },

    slander =
    {
        name = "Slander",
        desc = "When you murder a member of the Rise, lose 2 max resolve.",

        event_handlers =
        {
            [ "resolve_battle" ] = function( self, battle, primary_enemy, repercussions )
                for i, fighter in battle:AllFighters() do
                    local agent = fighter.agent
                    if agent:IsDead() and agent:GetFactionID() == "RISE" and fighter:GetKiller() and fighter:GetKiller():IsPlayer() then
                        --
                        TheGame:GetGameState():GetCaravan():DeltaMaxResolve( -2 )
                    end
                end
            end,
        }
    },

    depleted =
    {
        name = "Depleted",
        desc = "On your first turn of combat, draw one less card.",

        OnActivateFighter = ApplyCondition,

        battle_condition =
        {
            hidden = true,
            event_handlers =
            {
                [ BATTLE_EVENT.CALC_DRAW_COUNT ] = function( self, acc )
                    if self.battle:GetTurns() <= 1 then
                        acc:AddValue( -self.stacks, self )
                    end
                end
            }
        },
    }


}


 

Go figure out what to deal with this information.

Link to comment
Share on other sites

I want to, but I haven’t had the time to really sit down and write my thoughts. I also want to add in RageLeague’s info.

I don’t think most boons change much in usefulness between Sal and Rook though. The biggest change is that Rook can’t provoke-kill people that hate him, so some banes can hurt a bit more.

Link to comment
Share on other sites

These aren't the main boons (i'll let pacovf add those when he has time) but there are 2 quite specific ones that you can unlock through Rook's campaign:

When you get the event where you meet Sal, you can get the social boon from Sparky & Jeol if you decide to help them in battle.
Sparky's boon = System shock "If you didn't attack last turn, gain 2 temporary Power".
Jeol's boon = Drone Mastery "Allied mechs have 10 additional max health".

Link to comment
Share on other sites

Found the Spree Captain's boon in-game. It was in the giant code list that RageLeague posted, but that's a little hard to read.

spreecap.thumb.png.9a8a49f71da74d98a608e4abdc9ad923.png

Savagery: +1 Bleed to all cards that apply Bleed (200 shill cost)

Link to comment
Share on other sites

5 hours ago, TF3 said:

Found the Spree Captain's boon in-game. It was in the giant code list that RageLeague posted, but that's a little hard to read.

spreecap.thumb.png.9a8a49f71da74d98a608e4abdc9ad923.png

Savagery: +1 Bleed to all cards that apply Bleed (200 shill cost)

Thanks for posting, never seen it before, that boon is insane though man. Imagine how trolled you'd feel if you went Combo deck when you get it lol.

Link to comment
Share on other sites

Found out Authorization supersedes Red Tape for bribing Admiralty, so you can use your single daily free bribe for an extra 30 shills per use, or some extra muscle in a fight which is much more worth it. Still underwhelming since Goons give you guaranteed 75 shills per day, and its rng in getting a quest that happens to have combat in an area with admiralty to make it more worthwhile.

Now that I mention it, would be interesting if Authorization allowed you to "hire" an Admiralty member as a party member for a quest instead of just bribing. Would keep the same lore flavor as it currently has while being much more consistently useful, though you still have to find an Admiralty existing somewhere to make use of it.

Link to comment
Share on other sites

On 2019/10/6 at 4:39 AM, pacovf said:

and then you fail the "capture Nadan" quest

If you kill Nadan's summoned Spree minions it will lower his resolve/panic meter. Still not exactly easy since they ran in 2 turns.

On 2019/10/6 at 4:39 AM, pacovf said:

Painful if you're SpicyNiceCream looking for a new faction to antagonize and murder for the high score

I feel like a genocider now. 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

Please be aware that the content of this thread may be outdated and no longer applicable.