• NOW LIVE! Into the Woods--new character species, eerie monsters, and haunting villains to populate the woodlands of your D&D games.

Monte Carlo versus "The Math"

But i really think it would be interesting to see how the effect of a +1 to hit, +2 to hit and of +3 to hit vs +1/2/3 to damage is.

Except, you never have to choose to have one or the other except at extremely low level, and the expertise feats aren't a big deal until 15th level when they become +2. Which is why 1st level with one or the other isn't a meaningful test.

And how big the effect of expertise vs equal level brutes and soldiers at level 1, 10 and 20 is.

Probably better off at 5/15/25, but yep. It'll be tough until he models in actions lost and chains. Things like Storm of Blades and Anvil of Doom really care a lot more than things like Reaping Strike.

Best will be if there's enough ability to customize that everyone can put their own stuff in. So you can see, for example, how much it matters if you allow one feat or give out armbands of power, or bloodclaw, or reckless, what difference it makes.

(In a world, where leaders throw no bonuses and noone ganks a single opponent etc.)

That'd be an odd world. To be honest, I found expertise _most_ critical for my leaders (warlord and artificer) of all my characters, since my bonuses for the rest of the group were contingent on me hitting.
 

log in or register to remove this ad

Very interesting... I tried starting something like this a while ago, but eventually I gave up. Writing a simulation of even a single paragon-level character intelligently using their powers throughout a series of fights is extremely difficult. If programmers were good at this, video games would have much better AI :)

Just to point out a mistake from the first page: 29 hp / 5.75 dpr is 5.04 rounds, not 4.6. That's closer to the MC value of 5.5 rounds.
 

Quick update about what's going on:

I'm on vacation this week, which is giving me extra time to work on this. (Like I said, I'm a programmer. This is my idea of a great way to spend a Friday evening.) I'm taking advantage of the time to clean up the code and put in automated tests. As you can see from some of the mistakes I made, it was getting unwieldy as the complexity of the simulation grew.

Now that you've had a chance to see how the Monte-Carlo simulation works and where we're going, I'd like to pull way back and focus on getting the basic combat simulation solid. I'm going to start running simulations of exactly one fight, with a complete combat log (who rolled what, with what bonuses, and so forth) and I'm hoping you'll help out with fact-checking to make sure there's no more bonehead mistakes like a soldier with a +3 to-hit.

We'll build that combat engine up from where it is now to a complete 5-on-5 simulation, with movement and conditions, then turn the Monte-Carlo analyses back on. The sim is so basic right now it's hard to draw meaningful conclusions from the Monte-Carlo results, and the aggregated results of the Monte-Carlo makes it hard to fact-check the sim. So focusing on just one fight at a time will allow us to make more progress.

I also plan on putting the source code up somewhere like github, but I don't have good Internet access right now. I won't be posting much for the same reason.
 

One thing that is going to be very, very hard to simulate is the dynamic nature of combat priorities and the fallability of humans.

For example, if the party's wizard starts getting attacked by a monster, even if the optimal choice might be to let the monster beat on the wizard for a while, I think that 90% of real groups would send a meatier character over to help out the wizard. (A defender would be ideal, to mark the monster so it can't attack the wizard with impunity.)

So now you've got to take into account movement -- the fighter has to go over to where the monster is attacking the wizard -- which could provoke OAs from other monsters. You've also got to decide what the wizard does: does he shift back and target the monster with a ranged attack? Or stay in melee to flank with the fighter? And if so, does the wizard actually attack the monster with a presumably feeble melee attack, or does he use Aid Another?

It would be very interesting to know what the optimal choice is in this sutation (monster breaks away to attack the wizard):
1. tell the wizard to tough it out himself
2. send the fighter to rescue the wizard, then
3a. wizard shifts back and used ranged attacks, or
3b. wizard stays in melee and uses melee attacks, or
3c. wizard stay in melee and uses Aid Another

Monte Carlo would be a good way to figure out which of the above is optimal (assuming we can agree how to measure "optimal"). But I fear the complexity will rapidly overwhelm things.
 

Eh, there's a certain level of complexity that it can _never_ model to satisfaction. If it can do simple stuff, that's probably good enough for ballparking. You're still going to see massive swing factor due to build differences, loot differences, PC and DM tactical capabilities, etc.
 

Eh, there's a certain level of complexity that it can _never_ model to satisfaction. If it can do simple stuff, that's probably good enough for ballparking. You're still going to see massive swing factor due to build differences, loot differences, PC and DM tactical capabilities, etc.

Actually, I think fairly serious levels of complexity can be modeled and they can give people a real good idea of how the math really works.

The problem is coming up with the time to do that. It's a major effort to program things such as each PC's actions being a choice based on weighing factors. For example, choice on which foe(s) to target, choice on which power to use (with factors for not using Daily powers or Daily item powers unless the gain seems significant), choice on which square to move to, choice on which PC to heal, etc. All of these could be given weights and a system could be devised. It wouldn't be perfect, but it could be done.

People do this with things such as chess programs all of the time. But, they take a long time to develop.

With regard to different builds, a developer could create 3 different builds for each class (54 PCs? all the way to level 30), then create all of the possible combinations of (for example) two strikers, one defender, one leader, and one controller. But, this would multiply the number of runs by ~250,000 for any given scenario test, so it would take some serious computing power. The number climbs real quick, but a reasonable simulation could be done. It's just hard and time consuming to do.

No simulation will handle everything, but such a simulation at certain levels will indicate things such as how many rounds it took for the various "teams" to either succeed or die.

Tests could even be run with other factors. One random Daily power used and 20% healing surges gone for each PC, two random Daily powers used and 40% healing surges gone for each PC, etc.
 

4E has some basic principles, some base damage, defenses, etc.

This core can be tested with a high degree of accuracy.

The builds of each class, feats, and other details are just that, details.

They CAN be evaluated, but it only makes sense after the core has been measured.
 

I've made a good amount of progress on the retrofit of the simulation. It's taken a while because I've added a ton of tests and also reworked the basic infrastructure. Powers are now more-or-less 'pluggable', which will make adding new powers in the future a lot easier.

The sim has taken a step backwards at the moment--I've haven't put the encounter, daily, or heal powers back in yet. There are also some glitches in the initiative logic that have been there all along (for example, monsters will attack you after they've died). The good news is that the new reporting system makes those glitches very obvious, where before they were hidden.

Here's what a typical fight looks like:

Code:
Level 1 Dwarf Fighter vs. Level 1 Soldier

Round 1:
  Level 1 Dwarf Fighter's turn:
    Reaping Strike:
      19 to hit Level 1 Soldier (1d20+7, rolled 12).
      Hit Level 1 Soldier (19 vs. AC 17).
      Reaping Strike does 14 damage (2d6+6 brutal 1)
      Level 1 Soldier has 14 hp remaining (28 - 14 = 14).
  Level 1 Soldier's turn:
    Soldier Basic Attack:
      17 to hit Level 1 Dwarf Fighter (1d20+7, rolled 10).
      Hit Level 1 Dwarf Fighter (17 vs. AC 17).
      Soldier Basic Attack does 7 damage (1d10+3)
      Level 1 Dwarf Fighter has 20 hp remaining (27 - 7 = 20).
  
Round 2:
  Level 1 Dwarf Fighter's turn:
    Reaping Strike:
      19 to hit Level 1 Soldier (1d20+7, rolled 12).
      Hit Level 1 Soldier (19 vs. AC 17).
      Reaping Strike does 12 damage (2d6+6 brutal 1)
      Level 1 Soldier has 2 hp remaining (14 - 12 = 2).
  Level 1 Soldier's turn:
    Soldier Basic Attack:
      12 to hit Level 1 Dwarf Fighter (1d20+7, rolled 5).
      Missed Level 1 Dwarf Fighter (12 vs. AC 17).
  
Round 3:
  Level 1 Dwarf Fighter's turn:
    Reaping Strike:
      19 to hit Level 1 Soldier (1d20+7, rolled 12).
      Hit Level 1 Soldier (19 vs. AC 17).
      Reaping Strike does 11 damage (2d6+6 brutal 1)
      Level 1 Soldier has -9 hp remaining (2 - 11 = -9).
  Level 1 Soldier has died!
  Level 1 Soldier's turn:
    Soldier Basic Attack:
      24 to hit Level 1 Dwarf Fighter (1d20+7, rolled 17).
      Hit Level 1 Dwarf Fighter (24 vs. AC 17).
      Soldier Basic Attack does 5 damage (1d10+3)
      Level 1 Dwarf Fighter has 15 hp remaining (20 - 5 = 15).
 

And... we're back.

Not dead yet!

I've got the sim back up to where it was before, but with LOTS more reporting, including a cool feature where it shows you an example fight from each scenario. Hopefully the extra detail will let you catch any boneheaded mistakes in the sim. I've also built in 138 tests, which should reduce if not eliminate boneheadedness.

At Elric's suggestion, I've changed the sim to assume five encounters in a day rather than fighting to the death. That seems to match WoTC's assumptions a bit better. With that approach, we look at two variables: survival rate for the day and resource consumption.

I'm also ready to take requests: what power/feat/race match-ups would you like to see? I'm going to stick to one-vs-one fights for now, but other than that I'll try to accommodate requests.

Anyway, enough chatter. Here are the new results.

Dwarf Fighter vs. Soldier

[sblock=Combatants]
Code:
Dwarf Fighter:
  Stats: HP 27; AC 17; Surges 10
  Powers:
    Brute Strike:
      Daily * Reliable
      Standard Action
      Attack: 1d20+7 vs. AC
      Hit: 6d6[brutal 1]+6 damage
    Steel Serpent Strike:
      Encounter
      Standard Action
      Attack: 1d20+7 vs. AC
      Hit: 4d6[brutal 1]+6 damage
    Reaping Strike:
      At-Will
      Standard Action
      Attack: 1d20+7 vs. AC
      Hit: 2d6[brutal 1]+6 damage
      Miss: 4 damage
    Dwarven Resilience:
      Encounter
      Minor Action
      Spend a healing surge and regain 6 hit points.

Soldier:
  Stats: HP 29; AC 17; Surges 1
  Powers:
    Soldier Basic Attack:
      At-Will
      Standard Action
      Attack: 1d20+8 vs. AC
      Hit: 1d10+3 damage
[/sblock]
Code:
Days simulated: 10000

Avg fights survived: 4.3
  0  (2.5%): ==
  1  (7.9%): ====
  2 (13.2%): ====
  3 (18.9%): =====
  4 (26.1%): ======
  5(100.0%): ===================================================================

Avg surges remaining (survivors only): 2.5 of 10
  0 (31.7%): ===================================================================
  1 (43.5%): ========================
  2 (55.7%): =========================
  3 (67.4%): ========================
  4 (78.6%): =======================
  5 (87.2%): ==================
  6 (93.2%): ============
  7 (97.3%): ========
  8 (98.9%): ===
  9 (99.7%): =

Avg rounds per fight (survivors only): 2.9
  1 (13.7%): ============================
  2 (45.3%): ===================================================================
  3 (68.1%): ================================================
  4 (85.8%): =====================================
  5 (94.9%): ===================
  6 (99.1%): ========
  7 (99.9%): =

Survival rate: 73.9%
[sblock=Example of 0 fight(s) survived:]
Code:
FIGHT #1:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 10
      Brute Strike (standard action):
        Attacks Soldier with 16 vs. 17 AC (1d20+7; rolled 9).
        Misses.
        Brute Strike was not expended (Reliable).
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 22 vs. 17 AC (1d20+8; rolled 14).
        Hits for 6 damage (1d10+3; rolled 3).
        Dwarf Fighter has 21 hp remaining (27 hp - 6 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 21; AC 17; Surges 10
      Brute Strike (standard action):
        Attacks Soldier with 13 vs. 17 AC (1d20+7; rolled 6).
        Misses.
        Brute Strike was not expended (Reliable).
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (9 remaining).
        Dwarf Fighter heals 6 hp (21 hp -> 27 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 19 vs. 17 AC (1d20+8; rolled 11).
        Hits for 6 damage (1d10+3; rolled 3).
        Dwarf Fighter has 21 hp remaining (27 hp - 6 damage).
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 21; AC 17; Surges 9
      Brute Strike (standard action):
        Attacks Soldier with 11 vs. 17 AC (1d20+7; rolled 4).
        Misses.
        Brute Strike was not expended (Reliable).
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 13 vs. 17 AC (1d20+8; rolled 5).
        Misses.
    
  Round 4:
    Dwarf Fighter's turn:
      Stats: HP 21; AC 17; Surges 9
      Brute Strike (standard action):
        Attacks Soldier with 16 vs. 17 AC (1d20+7; rolled 9).
        Misses.
        Brute Strike was not expended (Reliable).
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 24 vs. 17 AC (1d20+8; rolled 16).
        Hits for 13 damage (1d10+3; rolled 10).
        Dwarf Fighter has 8 hp remaining (21 hp - 13 damage).
    
  Round 5:
    Dwarf Fighter's turn:
      Stats: HP 8; AC 17; Surges 9
      Brute Strike (standard action):
        Attacks Soldier with 8 vs. 17 AC (1d20+7; rolled 1).
        Misses.
        Brute Strike was not expended (Reliable).
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 16 vs. 17 AC (1d20+8; rolled 8).
        Misses.
    
  Round 6:
    Dwarf Fighter's turn:
      Stats: HP 8; AC 17; Surges 9
      Brute Strike (standard action):
        Attacks Soldier with 8 vs. 17 AC (1d20+7; rolled 1).
        Misses.
        Brute Strike was not expended (Reliable).
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 25 vs. 17 AC (1d20+8; rolled 17).
        Hits for 11 damage (1d10+3; rolled 8).
        Dwarf Fighter has -3 hp remaining (8 hp - 11 damage).
    Dwarf Fighter has died!
    
  Villains win!
[/sblock]
[sblock=Example of 1 fight(s) survived:]
Code:
FIGHT #1:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 10
      Brute Strike (standard action):
        Attacks Soldier with 17 vs. 17 AC (1d20+7; rolled 10).
        Hits for 30 damage (6d6[brutal 1]+6; rolled 5, 1, 1, 5, 5, 3, 2, 4).
        Soldier has -1 hp remaining (29 hp - 30 damage).
        Brute Strike has been expended.
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
  
FIGHT #2:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 10
      Steel Serpent Strike (standard action):
        Attacks Soldier with 8 vs. 17 AC (1d20+7; rolled 1).
        Misses.
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 27 vs. 17 AC (1d20+8; rolled 19).
        Hits for 11 damage (1d10+3; rolled 8).
        Dwarf Fighter has 16 hp remaining (27 hp - 11 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 16; AC 17; Surges 10
      Reaping Strike (standard action):
        Attacks Soldier with 9 vs. 17 AC (1d20+7; rolled 2).
        Misses but does 4 damage (static).
        Soldier has 25 hp remaining (29 hp - 4 damage).
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (9 remaining).
        Dwarf Fighter heals 6 hp (16 hp -> 22 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier's turn:
      Stats: HP 25; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 18 vs. 17 AC (1d20+8; rolled 10).
        Hits for 13 damage (1d10+3; rolled 10).
        Dwarf Fighter has 9 hp remaining (22 hp - 13 damage).
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 9; AC 17; Surges 9
      Reaping Strike (standard action):
        Attacks Soldier with 20 vs. 17 AC (1d20+7; rolled 13).
        Hits for 14 damage (2d6[brutal 1]+6; rolled 2, 6).
        Soldier has 11 hp remaining (25 hp - 14 damage).
    Soldier's turn:
      Stats: HP 11; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 25 vs. 17 AC (1d20+8; rolled 17).
        Hits for 12 damage (1d10+3; rolled 9).
        Dwarf Fighter has -3 hp remaining (9 hp - 12 damage).
    Dwarf Fighter has died!
    
  Villains win!
[/sblock]
[sblock=Example of 2 fight(s) survived:]
Code:
FIGHT #1:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 10
      Brute Strike (standard action):
        Attacks Soldier with 27 vs. 17 AC (1d20+7; rolled 20).
        Crits for 42 damage (6d6[brutal 1]+6; maximized).
        Soldier has -13 hp remaining (29 hp - 42 damage).
        Brute Strike has been expended.
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
  
FIGHT #2:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 10
      Steel Serpent Strike (standard action):
        Attacks Soldier with 26 vs. 17 AC (1d20+7; rolled 19).
        Hits for 15 damage (4d6[brutal 1]+6; rolled 2, 2, 2, 3).
        Soldier has 14 hp remaining (29 hp - 15 damage).
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 14; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 19 vs. 17 AC (1d20+8; rolled 11).
        Hits for 6 damage (1d10+3; rolled 3).
        Dwarf Fighter has 21 hp remaining (27 hp - 6 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 21; AC 17; Surges 10
      Reaping Strike (standard action):
        Attacks Soldier with 10 vs. 17 AC (1d20+7; rolled 3).
        Misses but does 4 damage (static).
        Soldier has 10 hp remaining (14 hp - 4 damage).
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (9 remaining).
        Dwarf Fighter heals 6 hp (21 hp -> 27 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier's turn:
      Stats: HP 10; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 13 vs. 17 AC (1d20+8; rolled 5).
        Misses.
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 9
      Reaping Strike (standard action):
        Attacks Soldier with 17 vs. 17 AC (1d20+7; rolled 10).
        Hits for 15 damage (2d6[brutal 1]+6; rolled 5, 1, 4).
        Soldier has -5 hp remaining (10 hp - 15 damage).
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Steel Serpent Strike recharges.
    Dwarven Resilience recharges.
  
FIGHT #3:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 9
      Steel Serpent Strike (standard action):
        Attacks Soldier with 16 vs. 17 AC (1d20+7; rolled 9).
        Misses.
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 25 vs. 17 AC (1d20+8; rolled 17).
        Hits for 13 damage (1d10+3; rolled 10).
        Dwarf Fighter has 14 hp remaining (27 hp - 13 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 14; AC 17; Surges 9
      Reaping Strike (standard action):
        Attacks Soldier with 12 vs. 17 AC (1d20+7; rolled 5).
        Misses but does 4 damage (static).
        Soldier has 25 hp remaining (29 hp - 4 damage).
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (8 remaining).
        Dwarf Fighter heals 6 hp (14 hp -> 20 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier's turn:
      Stats: HP 25; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 28 vs. 17 AC (1d20+8; rolled 20).
        Crits for 13 damage (1d10+3; maximized).
        Dwarf Fighter has 7 hp remaining (20 hp - 13 damage).
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 7; AC 17; Surges 8
      Reaping Strike (standard action):
        Attacks Soldier with 25 vs. 17 AC (1d20+7; rolled 18).
        Hits for 16 damage (2d6[brutal 1]+6; rolled 1, 5, 5).
        Soldier has 9 hp remaining (25 hp - 16 damage).
    Soldier's turn:
      Stats: HP 9; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 28 vs. 17 AC (1d20+8; rolled 20).
        Crits for 13 damage (1d10+3; maximized).
        Dwarf Fighter has -6 hp remaining (7 hp - 13 damage).
    Dwarf Fighter has died!
    
  Villains win!
[/sblock]
[sblock=Example of 3 fight(s) survived:]
Code:
FIGHT #1:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 10
      Brute Strike (standard action):
        Attacks Soldier with 12 vs. 17 AC (1d20+7; rolled 5).
        Misses.
        Brute Strike was not expended (Reliable).
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 11 vs. 17 AC (1d20+8; rolled 3).
        Misses.
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 10
      Brute Strike (standard action):
        Attacks Soldier with 11 vs. 17 AC (1d20+7; rolled 4).
        Misses.
        Brute Strike was not expended (Reliable).
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 28 vs. 17 AC (1d20+8; rolled 20).
        Crits for 13 damage (1d10+3; maximized).
        Dwarf Fighter has 14 hp remaining (27 hp - 13 damage).
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 14; AC 17; Surges 10
      Brute Strike (standard action):
        Attacks Soldier with 20 vs. 17 AC (1d20+7; rolled 13).
        Hits for 31 damage (6d6[brutal 1]+6; rolled 3, 2, 1, 4, 1, 5, 1, 6, 5).
        Soldier has -2 hp remaining (29 hp - 31 damage).
        Brute Strike has been expended.
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (9 remaining).
        Dwarf Fighter heals 6 hp (14 hp -> 20 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Dwarf Fighter spends a healing surge (8 remaining).
    Dwarf Fighter heals 6 hp (20 hp -> 26 hp; 0 hp wasted).
    Dwarven Resilience recharges.
  
FIGHT #2:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 26; AC 17; Surges 8
      Steel Serpent Strike (standard action):
        Attacks Soldier with 26 vs. 17 AC (1d20+7; rolled 19).
        Hits for 19 damage (4d6[brutal 1]+6; rolled 2, 3, 5, 3).
        Soldier has 10 hp remaining (29 hp - 19 damage).
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 10; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 27 vs. 17 AC (1d20+8; rolled 19).
        Hits for 5 damage (1d10+3; rolled 2).
        Dwarf Fighter has 21 hp remaining (26 hp - 5 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 21; AC 17; Surges 8
      Reaping Strike (standard action):
        Attacks Soldier with 12 vs. 17 AC (1d20+7; rolled 5).
        Misses but does 4 damage (static).
        Soldier has 6 hp remaining (10 hp - 4 damage).
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (7 remaining).
        Dwarf Fighter heals 6 hp (21 hp -> 27 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier's turn:
      Stats: HP 6; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 10 vs. 17 AC (1d20+8; rolled 2).
        Misses.
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 7
      Reaping Strike (standard action):
        Attacks Soldier with 24 vs. 17 AC (1d20+7; rolled 17).
        Hits for 12 damage (2d6[brutal 1]+6; rolled 3, 3).
        Soldier has -6 hp remaining (6 hp - 12 damage).
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Steel Serpent Strike recharges.
    Dwarven Resilience recharges.
  
FIGHT #3:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 7
      Steel Serpent Strike (standard action):
        Attacks Soldier with 27 vs. 17 AC (1d20+7; rolled 20).
        Crits for 30 damage (4d6[brutal 1]+6; maximized).
        Soldier has -1 hp remaining (29 hp - 30 damage).
        Steel Serpent Strike has been expended.
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Steel Serpent Strike recharges.
  
FIGHT #4:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 7
      Steel Serpent Strike (standard action):
        Attacks Soldier with 13 vs. 17 AC (1d20+7; rolled 6).
        Misses.
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 17 vs. 17 AC (1d20+8; rolled 9).
        Hits for 9 damage (1d10+3; rolled 6).
        Dwarf Fighter has 18 hp remaining (27 hp - 9 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 18; AC 17; Surges 7
      Reaping Strike (standard action):
        Attacks Soldier with 11 vs. 17 AC (1d20+7; rolled 4).
        Misses but does 4 damage (static).
        Soldier has 25 hp remaining (29 hp - 4 damage).
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (6 remaining).
        Dwarf Fighter heals 6 hp (18 hp -> 24 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier's turn:
      Stats: HP 25; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 9 vs. 17 AC (1d20+8; rolled 1).
        Misses.
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 24; AC 17; Surges 6
      Reaping Strike (standard action):
        Attacks Soldier with 15 vs. 17 AC (1d20+7; rolled 8).
        Misses but does 4 damage (static).
        Soldier has 21 hp remaining (25 hp - 4 damage).
    Soldier's turn:
      Stats: HP 21; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 28 vs. 17 AC (1d20+8; rolled 20).
        Crits for 13 damage (1d10+3; maximized).
        Dwarf Fighter has 11 hp remaining (24 hp - 13 damage).
    
  Round 4:
    Dwarf Fighter's turn:
      Stats: HP 11; AC 17; Surges 6
      Reaping Strike (standard action):
        Attacks Soldier with 16 vs. 17 AC (1d20+7; rolled 9).
        Misses but does 4 damage (static).
        Soldier has 17 hp remaining (21 hp - 4 damage).
    Soldier's turn:
      Stats: HP 17; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 18 vs. 17 AC (1d20+8; rolled 10).
        Hits for 13 damage (1d10+3; rolled 10).
        Dwarf Fighter has -2 hp remaining (11 hp - 13 damage).
    Dwarf Fighter has died!
    
  Villains win!
[/sblock]
[sblock=Example of 4 fight(s) survived:]
Code:
FIGHT #1:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 10
      Brute Strike (standard action):
        Attacks Soldier with 13 vs. 17 AC (1d20+7; rolled 6).
        Misses.
        Brute Strike was not expended (Reliable).
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 18 vs. 17 AC (1d20+8; rolled 10).
        Hits for 7 damage (1d10+3; rolled 4).
        Dwarf Fighter has 20 hp remaining (27 hp - 7 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 20; AC 17; Surges 10
      Brute Strike (standard action):
        Attacks Soldier with 19 vs. 17 AC (1d20+7; rolled 12).
        Hits for 38 damage (6d6[brutal 1]+6; rolled 4, 6, 1, 6, 6, 5, 5).
        Soldier has -9 hp remaining (29 hp - 38 damage).
        Brute Strike has been expended.
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (9 remaining).
        Dwarf Fighter heals 6 hp (20 hp -> 26 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Dwarven Resilience recharges.
  
FIGHT #2:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 26; AC 17; Surges 9
      Steel Serpent Strike (standard action):
        Attacks Soldier with 26 vs. 17 AC (1d20+7; rolled 19).
        Hits for 21 damage (4d6[brutal 1]+6; rolled 6, 4, 3, 1, 2).
        Soldier has 8 hp remaining (29 hp - 21 damage).
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 8; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 15 vs. 17 AC (1d20+8; rolled 7).
        Misses.
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 26; AC 17; Surges 9
      Reaping Strike (standard action):
        Attacks Soldier with 25 vs. 17 AC (1d20+7; rolled 18).
        Hits for 15 damage (2d6[brutal 1]+6; rolled 6, 3).
        Soldier has -7 hp remaining (8 hp - 15 damage).
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Steel Serpent Strike recharges.
  
FIGHT #3:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 26; AC 17; Surges 9
      Steel Serpent Strike (standard action):
        Attacks Soldier with 9 vs. 17 AC (1d20+7; rolled 2).
        Misses.
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 24 vs. 17 AC (1d20+8; rolled 16).
        Hits for 9 damage (1d10+3; rolled 6).
        Dwarf Fighter has 17 hp remaining (26 hp - 9 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 17; AC 17; Surges 9
      Reaping Strike (standard action):
        Attacks Soldier with 25 vs. 17 AC (1d20+7; rolled 18).
        Hits for 14 damage (2d6[brutal 1]+6; rolled 3, 5).
        Soldier has 15 hp remaining (29 hp - 14 damage).
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (8 remaining).
        Dwarf Fighter heals 6 hp (17 hp -> 23 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier's turn:
      Stats: HP 15; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 21 vs. 17 AC (1d20+8; rolled 13).
        Hits for 9 damage (1d10+3; rolled 6).
        Dwarf Fighter has 14 hp remaining (23 hp - 9 damage).
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 14; AC 17; Surges 8
      Reaping Strike (standard action):
        Attacks Soldier with 20 vs. 17 AC (1d20+7; rolled 13).
        Hits for 17 damage (2d6[brutal 1]+6; rolled 1, 5, 1, 6).
        Soldier has -2 hp remaining (15 hp - 17 damage).
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Dwarf Fighter spends a healing surge (7 remaining).
    Dwarf Fighter heals 6 hp (14 hp -> 20 hp; 0 hp wasted).
    Dwarf Fighter spends a healing surge (6 remaining).
    Dwarf Fighter heals 6 hp (20 hp -> 26 hp; 0 hp wasted).
    Steel Serpent Strike recharges.
    Dwarven Resilience recharges.
  
FIGHT #4:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 26; AC 17; Surges 6
      Steel Serpent Strike (standard action):
        Attacks Soldier with 18 vs. 17 AC (1d20+7; rolled 11).
        Hits for 18 damage (4d6[brutal 1]+6; rolled 2, 3, 3, 4).
        Soldier has 11 hp remaining (29 hp - 18 damage).
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 11; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 26 vs. 17 AC (1d20+8; rolled 18).
        Hits for 4 damage (1d10+3; rolled 1).
        Dwarf Fighter has 22 hp remaining (26 hp - 4 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 22; AC 17; Surges 6
      Reaping Strike (standard action):
        Attacks Soldier with 25 vs. 17 AC (1d20+7; rolled 18).
        Hits for 14 damage (2d6[brutal 1]+6; rolled 4, 1, 4).
        Soldier has -3 hp remaining (11 hp - 14 damage).
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Dwarf Fighter spends a healing surge (5 remaining).
    Dwarf Fighter heals 6 hp (22 hp -> 27 hp; 1 hp wasted).
    Steel Serpent Strike recharges.
  
FIGHT #5:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 5
      Steel Serpent Strike (standard action):
        Attacks Soldier with 9 vs. 17 AC (1d20+7; rolled 2).
        Misses.
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 25 vs. 17 AC (1d20+8; rolled 17).
        Hits for 5 damage (1d10+3; rolled 2).
        Dwarf Fighter has 22 hp remaining (27 hp - 5 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 22; AC 17; Surges 5
      Reaping Strike (standard action):
        Attacks Soldier with 10 vs. 17 AC (1d20+7; rolled 3).
        Misses but does 4 damage (static).
        Soldier has 25 hp remaining (29 hp - 4 damage).
    Soldier's turn:
      Stats: HP 25; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 27 vs. 17 AC (1d20+8; rolled 19).
        Hits for 12 damage (1d10+3; rolled 9).
        Dwarf Fighter has 10 hp remaining (22 hp - 12 damage).
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 10; AC 17; Surges 5
      Reaping Strike (standard action):
        Attacks Soldier with 16 vs. 17 AC (1d20+7; rolled 9).
        Misses but does 4 damage (static).
        Soldier has 21 hp remaining (25 hp - 4 damage).
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (4 remaining).
        Dwarf Fighter heals 6 hp (10 hp -> 16 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier's turn:
      Stats: HP 21; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 24 vs. 17 AC (1d20+8; rolled 16).
        Hits for 13 damage (1d10+3; rolled 10).
        Dwarf Fighter has 3 hp remaining (16 hp - 13 damage).
    
  Round 4:
    Dwarf Fighter's turn:
      Stats: HP 3; AC 17; Surges 4
      Reaping Strike (standard action):
        Attacks Soldier with 10 vs. 17 AC (1d20+7; rolled 3).
        Misses but does 4 damage (static).
        Soldier has 17 hp remaining (21 hp - 4 damage).
    Soldier's turn:
      Stats: HP 17; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 19 vs. 17 AC (1d20+8; rolled 11).
        Hits for 10 damage (1d10+3; rolled 7).
        Dwarf Fighter has -7 hp remaining (3 hp - 10 damage).
    Dwarf Fighter has died!
    
  Villains win!
[/sblock]
[sblock=Example of 5 fight(s) survived:]
Code:
FIGHT #1:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 10
      Brute Strike (standard action):
        Attacks Soldier with 20 vs. 17 AC (1d20+7; rolled 13).
        Hits for 26 damage (6d6[brutal 1]+6; rolled 2, 3, 4, 2, 4, 5).
        Soldier has 3 hp remaining (29 hp - 26 damage).
        Brute Strike has been expended.
    Soldier's turn:
      Stats: HP 3; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 26 vs. 17 AC (1d20+8; rolled 18).
        Hits for 11 damage (1d10+3; rolled 8).
        Dwarf Fighter has 16 hp remaining (27 hp - 11 damage).
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 16; AC 17; Surges 10
      Steel Serpent Strike (standard action):
        Attacks Soldier with 23 vs. 17 AC (1d20+7; rolled 16).
        Hits for 21 damage (4d6[brutal 1]+6; rolled 6, 4, 2, 3).
        Soldier has -18 hp remaining (3 hp - 21 damage).
        Steel Serpent Strike has been expended.
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (9 remaining).
        Dwarf Fighter heals 6 hp (16 hp -> 22 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Dwarf Fighter spends a healing surge (8 remaining).
    Dwarf Fighter heals 6 hp (22 hp -> 27 hp; 1 hp wasted).
    Steel Serpent Strike recharges.
    Dwarven Resilience recharges.
  
FIGHT #2:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 8
      Steel Serpent Strike (standard action):
        Attacks Soldier with 17 vs. 17 AC (1d20+7; rolled 10).
        Hits for 24 damage (4d6[brutal 1]+6; rolled 6, 6, 1, 3, 3).
        Soldier has 5 hp remaining (29 hp - 24 damage).
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 5; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 12 vs. 17 AC (1d20+8; rolled 4).
        Misses.
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 8
      Reaping Strike (standard action):
        Attacks Soldier with 17 vs. 17 AC (1d20+7; rolled 10).
        Hits for 11 damage (2d6[brutal 1]+6; rolled 2, 3).
        Soldier has -6 hp remaining (5 hp - 11 damage).
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Steel Serpent Strike recharges.
  
FIGHT #3:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 8
      Steel Serpent Strike (standard action):
        Attacks Soldier with 17 vs. 17 AC (1d20+7; rolled 10).
        Hits for 23 damage (4d6[brutal 1]+6; rolled 3, 6, 1, 3, 1, 5).
        Soldier has 6 hp remaining (29 hp - 23 damage).
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 6; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 14 vs. 17 AC (1d20+8; rolled 6).
        Misses.
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 8
      Reaping Strike (standard action):
        Attacks Soldier with 9 vs. 17 AC (1d20+7; rolled 2).
        Misses but does 4 damage (static).
        Soldier has 2 hp remaining (6 hp - 4 damage).
    Soldier's turn:
      Stats: HP 2; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 9 vs. 17 AC (1d20+8; rolled 1).
        Misses.
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 8
      Reaping Strike (standard action):
        Attacks Soldier with 22 vs. 17 AC (1d20+7; rolled 15).
        Hits for 14 damage (2d6[brutal 1]+6; rolled 1, 2, 1, 1, 1, 6).
        Soldier has -12 hp remaining (2 hp - 14 damage).
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Steel Serpent Strike recharges.
  
FIGHT #4:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 8
      Steel Serpent Strike (standard action):
        Attacks Soldier with 13 vs. 17 AC (1d20+7; rolled 6).
        Misses.
        Steel Serpent Strike has been expended.
    Soldier's turn:
      Stats: HP 29; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 10 vs. 17 AC (1d20+8; rolled 2).
        Misses.
    
  Round 2:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 8
      Reaping Strike (standard action):
        Attacks Soldier with 8 vs. 17 AC (1d20+7; rolled 1).
        Misses but does 4 damage (static).
        Soldier has 25 hp remaining (29 hp - 4 damage).
    Soldier's turn:
      Stats: HP 25; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 9 vs. 17 AC (1d20+8; rolled 1).
        Misses.
    
  Round 3:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 8
      Reaping Strike (standard action):
        Attacks Soldier with 8 vs. 17 AC (1d20+7; rolled 1).
        Misses but does 4 damage (static).
        Soldier has 21 hp remaining (25 hp - 4 damage).
    Soldier's turn:
      Stats: HP 21; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 27 vs. 17 AC (1d20+8; rolled 19).
        Hits for 10 damage (1d10+3; rolled 7).
        Dwarf Fighter has 17 hp remaining (27 hp - 10 damage).
    
  Round 4:
    Dwarf Fighter's turn:
      Stats: HP 17; AC 17; Surges 8
      Reaping Strike (standard action):
        Attacks Soldier with 24 vs. 17 AC (1d20+7; rolled 17).
        Hits for 18 damage (2d6[brutal 1]+6; rolled 1, 6, 6).
        Soldier has 3 hp remaining (21 hp - 18 damage).
      Dwarven Resilience (minor action):
        Dwarf Fighter spends a healing surge (7 remaining).
        Dwarf Fighter heals 6 hp (17 hp -> 23 hp; 0 hp wasted).
        Dwarven Resilience has been expended.
    Soldier's turn:
      Stats: HP 3; AC 17; Surges 1
      Soldier Basic Attack (standard action):
        Attacks Dwarf Fighter with 15 vs. 17 AC (1d20+8; rolled 7).
        Misses.
    
  Round 5:
    Dwarf Fighter's turn:
      Stats: HP 23; AC 17; Surges 7
      Reaping Strike (standard action):
        Attacks Soldier with 13 vs. 17 AC (1d20+7; rolled 6).
        Misses but does 4 damage (static).
        Soldier has -1 hp remaining (3 hp - 4 damage).
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Dwarf Fighter spends a healing surge (6 remaining).
    Dwarf Fighter heals 6 hp (23 hp -> 27 hp; 2 hp wasted).
    Steel Serpent Strike recharges.
    Dwarven Resilience recharges.
  
FIGHT #5:
  Round 1:
    Dwarf Fighter's turn:
      Stats: HP 27; AC 17; Surges 6
      Steel Serpent Strike (standard action):
        Attacks Soldier with 27 vs. 17 AC (1d20+7; rolled 20).
        Crits for 30 damage (4d6[brutal 1]+6; maximized).
        Soldier has -1 hp remaining (29 hp - 30 damage).
        Steel Serpent Strike has been expended.
    Soldier has died!
    
  Heroes win!
  Dwarf Fighter takes a short rest.
    Steel Serpent Strike recharges.
[/sblock]
 
Last edited:

The source code

I still haven't gotten around to figuring out github, but in the meantime, here's the latest source code.

To run this, you'll need a copy of Ruby (Google it). Then open a command prompt and switch to the directory with the source code. To self test, type:

Code:
rake
To run the sim, type:

Code:
rake analyze
To run a specific number of days, type:

Code:
rake analyze runs=10000
And to save off the (BBCode-formatted) results, type:

Code:
rake analyze runs=10000 > output.txt
 

Attachments


Into the Woods

Remove ads

Top