Duel of Wits Simulation

Several rounds of errors being corrected under the watchful eye of Countercheck. :slight_smile:

Wow… that’s some data crunch… can you come over and balance my chequebook?

Ok, the last post by Fuseboy was a bit glitched, but the numbers make sense now. I think it’s fixed.

The coolest thing I found when noodling with the data is that if you have two players, A and B, then as long as A is throwing more dice than B, and A is as good at rebutting as she is at pointing, and B is as good at Feinting as pointing, then no matter the difference in skill level between A and B, B should NEVER feint unless B expects A to rebut 50% of the time or more. And if A IS going to rebut 50% of the time, then B should feint 100% of the time.

And if both A and B are throwing the same number of dice, both A and B should always point. It doesn’t make a big difference at higher skill levels, but if both of you have four dice, rebutting means you score .9 disposition for every 1 disposition the other guy scores.

And you should never rebut if you have fewer dice.

In other words:

If you have as many or fewer dice than your opponent, never rebut.
If you have more dice than your opponent, never feint.
If you have fewer dice than your opponent, never feint unless you expect your opponent to rebut twice in the next exchange.
If you DO expect your opponent to rebut twice in the next exchange, you should script all feint.
If you have more dice than your opponent, mixing a single rebut into an exchange is good, but more is dangerous and leaves you exposed to Feints. Randomly alternating between 1 and 2 seems like decent strategy, especially if you weight the 1s more heavily.

Funny. That’s exactly describes my own DoW strategy, only I learned it from lots and lots of trial-and-error.

This came up at Burningcon this year, in my last slot. I was in a Duel with Mark Delsing, who was behind me in dispo as well as dice pools. Because he’s not a super-experienced dueler, I figured he’d try to protect his dispo rather than going for raw damage. So I feinted on the first move and IIRC Dismissed on the second. Sure enough, he opened with a Rebuttal and tbh I don’t remember what his second play was. Regardless, it was a quick and brutal STFU.

In debriefing about that play later, Mark and I talked a little about that and what a big error it is to try and protect yourself when you’re on your back foot. I don’t know that that’s, you know, “realistic” but it does prompt the weaker position to be more strident and daring.

That your empirical experience aligns with the simulation suggests that the sim might be working!

And yes, it totally makes sense. If you think of all the brilliant military campaigns, they’ve all been conducted by the weaker party. Part of that is bias - the weak beating the strong is a more compelling argument - but part of it is that if you are strong, it makes sense to eliminate as much uncertainty as possible, by playing it safe, while the weaker party MUST take risks or be ground down.

Now, the above rules only count if you want to maximize your damage ratio. If protecting yourself is more important than attacking, like, say, if you have one dispo left and the other guy has 3, then rebuttal might make sense even if you ordinarily shouldn’t, because you might want to use a non-damage ratio maximizing array of attack and defence dice.

So perhaps some more traits to spice things up in game. Some traits to tweak DoW, things like Thick Skinned or Rapier Wit, that give bonuses to certain actions or defenses against certain actions in DoW.

Rhetorician - You know how to pick your opponents arguments apart; +1D Rebuttal Defense when using Rhetoric.
Acid Tongued - You often inject you words with bile and vitriol; +1D Incite. We hope your friends are often Thick Skinned.
Verbal Inexactitude - You are a skilled diplomatic speaker, and may talk for some time while committing to nothing; +1D Obfuscate using Soothing Platitudes. This is also a call-on for Avoid the Topic.
etc

Ooh! more neat info. a 10% chance of a 3d feint should deter anyone with fewer than 7 dice from ever rebutting ever, and a 10% chance of a 5d feint should deter anyone with rebuttul up to 8 (where our data ends).

Haven’t worked through the ramifications of this, but the upshot seems to be, unless you have an OVERWHELMING advantage in dice, the mere existence of Feint could means you shouldn’t rebut.

Edit: Reread data. Was totally wrong. Ignore.

Ok. THis is too weird not to post even if I double post

For all sets where the rebutter has more dice than the feinter, the minimum damage ratio for a 50/50 mix of rebuttals and points (in other words, when the feinter is feinting 100% of the time) is IDENTICAL to the minimum damage ratio for an all point script (when the feinter scripts all points too)

That’s just odd. I have no idea what it means, other than that staying below 50% rebuts is a good idea.

Very cool summary. To this, I’d add what’s been learned about Dismiss, which is that they’re useful whenever the extra 2D is as good as your next action’s Point (in particular if you have a better Dismissal skill), and also any time the fight is about to end.

The reason Obfuscate/Rebuttal works so well seems to be because Obfuscate lowers your opponent’s effectively available dice (+1 Ob more or less eats up 2D). So if you can reliably pull off an Obfuscate, it puts you in reach of the bigger rebuttal spreads.

So, a couple of comments:

  1. Right now, switching to Dismiss if it looks likely to be your last blow (due to either party losing) is the only endgame-specific tactic I have in play.

  2. The idea that a different dice allocation might be attractive is plausible, but I’d love to see a specific idea for what it should be! I imagine the general principle would have something to do with not wasting dice. For example, if you only have 1 Dispo left, but the enemy has 5, it might make more sense to play even more aggressively (for typical skill levels) on the grounds that preventing all damage is likely to take up a lot of dice.

I wonder if it’s as simple as registering the fact that everyone’s damage is capped at the level of the enemy’s remaining dispo, and using that in the calculation of damage ratios.

I do think it’s a protip that anyone who cares to have a shot at Duel of Wits have a Dismiss skill in their arsenal.

This is all permutations of the BW Protip: When in doubt, do the opposite of turtle.

EDIT: Corollary Protip: When you are certain you should turtle, reconsider.

IMO 1/4 of DoW is timing and anticipating the Dismiss, 1/3 is laying out the statements of purpose, 1/3 is setting up for and selecting the compromise(s), with the remainder largely dealing with not screwing so you can make sure you are a position where your Dismiss matters. :slight_smile:

Had an hilarious DoW today in which both duelists were unskilled but nevertheless managed to go two full exchanges + a free shot after the second failed Dismiss. It definitely highlighted for me a lot of what’s been said here, but also: in such a situation, Avoid becomes much, much better, as it will likely nullify a Point—at least in theory. What actually happened was we started out with Avoid vs. Cast Spell and I boosted my character’s Will to 7, which enabled me to roll quite a few dice on my attacks for the rest of the Duel.

Matt

That’s interesting, I haven’t tried this for really low skills (like 2D with no FoRKs).

Something to consider is that even overwhelming defenses are leaky - a 2D attack against a 4D defense will cause an average of 0.13 points of dispo damage*. That’s not very much, but it’s something. You have lived to fight another volley, just 0.13 dispo poorer. The enemy inches ahead of you.

  • (Much of the time the attack will do no damage, but since the defense can never do any at all, there’s nothing to counterbalance the few times that the attack does get through, leaving a small, but positive average.)

The one place Rebuttal has real potential, IMO, is when you are well ahead and the opponent telegraphs their Dismiss. A correctly selected Rebuttal, Dismiss/Point, Dismiss/Point is usually crushing against a weaker opponent doing a Dismiss Hail Mary in volley 1.

EDIT: That is the type of situation (that I believe Paul was alluding to?) where you have to be careful assessing just by average dispo per volley because the real measure that matters is the percentage of the time you avoid an increase in the level of compromise you have to give, and that difference can be hidden within average dispo damage numbers.

Actually, in this case, I think timing doesn’t matter that much. Rebuttal is very good if you have a dice advantage and an opponent who never Feints. Hail mary Dismiss actions by weaker players are generally a bad idea on any action, until the disparity gets overwhelming (e.g. when you have 2D, and Dismissing literally doubles your dice).

But in general, I’m starting to wonder if tales of well-timed actions are a bit too seductive. In terms of actual concrete advice (that a new player, or a software program could follow), the question is this, “What’s good timing?” That’s the actual gold, concrete recommendations on when to script particular actions.

If you can think of a better metric, I’m all ears!

…and? Although I suspect that is not the full story, because disposition [to the next step of compromise] matters, too. If there is only 1 point till the next step, rather than 4 or 5 to the next step makes a difference on the risk/reward.

“What’s good timing?”

Reading the other person (or character as they are playing them, if that is primarily what they are doing), AKA Amazing Kreskin . :slight_smile: Also understanding their odds and tactical options, allowing you to box them in. (EDIT: Which is also part of what Kreskin does, incidentally.)

If you can think of a better metric, I’m all ears!

What I said, the metric as per the outcomes that we actually use in play. Percentage of outcomes categorized by loss [EDIT: with size X of compromise], win with size X of compromise, or double win.

The disposition per volley (offense and defense) isn’t a bad starting point but the closer you get to resolution of the DoW the more the actual point by point granularity of the results matter as affects which category compromise will happen and is limited in effect by “getting to zero is enough”.

Ah, gotcha. Okay, for evaluating scripts, so far what I’ve been doing is computing the average remaining disposition remaining (which is negative if the other guy wins, on average). I haven’t looked at the variance much as I’ve mostly been sorting them automatically (in particular, the many generations of semi-random genetic scripters) so I need a single value, but variance is very interesting for humans to use when picking a strategy, as some are no doubt much more unpredictable than others.

As far as disposition damage ratio, I don’t use that for evaluating scripts, only for coming up with rules to script better - such as the optimal rebuttal split, or deciding how much Avoiding I want to use in my next strategy. It’s a really solid metric, though. If you want to win with the least dispo loss, or (if you lose) inflict the biggest compromise, then that’s exactly the same thing as maximizing your damage ratio (over the whole duel, not per volley). The winner of any race will have the highest average speed, it’s just looking at the numbers the other way around.

My sense is that the best script doesn’t change very much based on starting dispositions. There are endgame effects, but so far they seem fairly … narrow. The optimal dice spread for a rebuttal only changes when either you or the opponent is down to 1 or 2 dispo, for common skill levels, and Dismiss looks similar.

Nevertheless, I will switch the ranking metric to “compromise level”. What I plan to do is produce a number from +1.0 to -1.0. +1.0 to 0.0 is scaled to your starting disposition, and 0.0 to -1.0 is scaled to the opponent’s disposition.

Here’s the code for two of my scripting strategies. I post this in the vain hopes that someone might think it’s straight forward and want to try their hand at one also.

This is PointScripter, who always scripts points. This is mostly to show what a simple script looks like.


package com.trilemma.bw.scripting;


public class PointScripter extends Scripter {


	@Override
	public Action[] script() {
		return new Action[] { new Point(me), new Point(me), new Point(me) };
	}


}



This is “combined arms 3”, which incorporates most of what I believed as of a few days ago. It’s one of the best contenders in my mix of simpletons, though it does get hurt against Feint-heavy underdogs - it’s rebutting too much, basically.


package com.trilemma.bw.scripting;


import java.util.Random;


public class CA3Scripter extends Scripter {


    private Random random = new Random();


    @Override
    public Action[] script() {
        return new Action[] { action(1), action(2), action(3) };
    }


    private boolean obfuscate = false;


    private Action action(int volley) {


        if (advantage() >= 2) {
            obfuscate = !obfuscate;
            if (obfuscate)
                return new Obfuscate(me);
            else
                return new Rebuttal(me, me.getSkill() / 2);
        }


        // Dismiss is +2D over point, so claims 1 dispo on average. So any
        // time
        // someone would only have 1 Dispo left after a Point, use the
        // Dismiss
        // instead.
        if (dispoReduced(me, them, volley, 1))
            return new Dismiss(me);
        if (dispoReduced(them, me, volley, 1))
            return new Dismiss(me);


        // If we're really disadvantaged, consider throwing Dismisses into the
        // mix in proportion to the disadvantage
        // In other words, if a d4 is less than or equal to their advantage, then Dismiss
        if (advantage() < 0) {
            if ((random.nextInt(4) + 1) <= -advantage())
                return new Dismiss(me);
        }


        // If we're 3D or more behind, Feint half the time
        if (advantage() < -2) {
            if (random.nextBoolean())
                return new Feint(me);
        }


        return new Point(me);
    }


    private int advantage() {
        return me.getSkill() - them.getSkill();
    }




    /**
     * Returns true if undefended points would reduce the defender's disposition to the
     * threshhold or less within the specified number of volleys
     */
    private boolean dispoReduced(Player attacker, Player defender, int volleys,
            double dispoThreshhold) {


        double damageDone = ((double) attacker.getSkill() / 2) * volleys;
        double defenderRemainingDispo = defender.getDisposition() - damageDone;


        return defenderRemainingDispo <= dispoThreshhold;


    }


}


I’m also simulating Mouse Guard’s Conflict.

Any time you think your opponent might Rebuttal, countering your anticipated Dismiss, you should consider Dismissing one volley earlier, so their possible Rebuttal is useless. Someone we didn’t know 'til a couple days ago that Hesitation is a great counter to Rebuttal!