Jump to content

McNathanson

Members
  • Posts

    1,194
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by McNathanson

  1. Their reply simply isn't logical. Steadfast is dead simple to work out, first of all, so removing it to "simplify" (then adding a fatigue rule which must be tracked over 3+ rounds of combat, and weather conditions, and other high maintenance rules) makes me call "b.s." Also, 60 Men at Arms is not cheap, it's 327 points, and "distracting" for a turn, or "screening" a better unit, is a stupid reason to take a unit. If that is their purpose, why not buy another one of the good units you are trying to screen with your crappy 327pts of Infantry? There needs to be a compelling reason to take a slower, cumbersome, less killy, less survivable unit such as Goblins, Men at Arms, etc. I think Steadfast is the only reason Infantry is playable today, especially junk infantry like Men at Arms. If this is how they reason, I'm not very optimistic that they can write rules :( PS: Not intending to be mean to whoever is working on it, I'm just calling a Spade a Spade... that reply is nonsense!
  2. I don't know, I think I disagree that WFB needs the most work. Fundamentally it may not play how we both wish it did in some ways (e.g. base to base model combat is dumb; single model redirectors are dumb), but the combination of flavor and balance (thanks to SC) may well be more work than re-writing and entire game system from scratch. Which reminds me: I think you left out on of the biggest "pros" to WFB 8th: Swedish Comp. That's a massive labor of distributed play testing that won't be done soon for any of these other systems. That alone might make WFB the better choice for some time to come. With that in mind, the question I'm asking right now is, why move off 8th edition right away? Stable rules actually benefit us, the players, for a lot of reasons: The current books all are pretty darn playable and, with SC, balanced (aside from End Times which can safely be abandoned IMO) With GW officially withdrawing support, there's no risk of a new book release upending the current meta and forcing us to redesign armies. New models can easily be re-purposed to make whatever units we like them to be... is anyone going to protest as long as the look is reasonably close? No, and especially not without some lame "GW only" rule to point to. We all have our armies, and books, and we can just add to them and paint and play and have fun! I like army design as much as the next guy, but truthfully I prefer to hang out and play, not learn rules. The game system is so complex that there's no problem with running out of interesting play, unless you are literally playing multiple times a week and have only one army. When you DO finally get bored of WFB 8th edition, you can move to a newer game which has had a chance to mature (AoS 3rd?) The only reason I can see to move now is if you are seriously into bleeding edge. I used to be when I had time to OCD out on gaming, but I don't now. I prefer to paint a little here and there, draw up a new list or two, and play a game with my buddies now and then. OFCC and similar "non-competitive" events are the only ones I have interest in. Playing this last weekend reminded me of that. I'd argue by the way that AoS can't even be discussed in this conversation until they have a "rating" system of some kind (points, etc.), community written or otherwise, because until then we have no idea how difficult to balance the game is intrinsically. If it's even half as bad as WFB or 40k in that area, we are going to have to wait a LONG time before there's any semblance of balance, and we might as well play WFB 8th + SC in the meantime.
  3. Fun times! Thanks for posting, and thanks again for all your work Sylvos!!
  4. My Brets are translating as a KoM Crusaders army, too (here's their MAA look): I guess I mean, are they markedly more or less unwieldy than they are in WFB? Do KoW tables typically have similar terrain to a WFB table (say at OFCC)? It seems to me that the pivoting movement mechanic, and the allowance for intermingling with friendlies mid-move, would make them less of a PITA than they are in WFB 8th :)
  5. I'm already thinking of how my peasant horde can translate... upon looking at it, one thing is clear: I need more Men at Arms and Bowmen for a 2k point KoW army!! 100 of each just isn't going to cut it :) BroG, are the Horde formation units at 200x80 unwieldy in practice? I'd love to plop down 3 Hordes of Men at Arms, and 3 Hordes of Archers!
  6. If we got historical rules and they were fun, I'd love to build a saracen army someday if the models were close to GW plastics quality. Their styling and composition are my absolute favorite historically, even moreso than knights of the crusade era. I know it's not likely, but one of these days maybe!
  7. "Correct" to all your questions (and to your own answer to the one non-binary question about what 20 represents). The text on this from the rulebook (my bold): So there isn't anything in the rules other than "reasonably close", and "a little more or less". What's reasonable? Well it talks about being clear, but that's easy with a huge tray sized unit. I dunno, I'd say it's pretty flexible, although if you model a "Legion" of 80 models using only 45 models and a bunch of filler, that is probably pushing it too far IMO. Not clear, but hopefully people won't abuse this and show up with a tray of fillers and a front rank!
  8. Updated to fix kownervetest function; see text in above post.
  9. And my other two armies (Dark Elves and Khorne Mortals) are both Proxy books under dev... bummer!! In the meantime I'll look at Basilia and KoMen for my Brets... seems like a decent fit for the army I have (Peasants and a few Knights).
  10. Great info to share with my fellow WFB'ers. I did note that they are following GW's super-annoying trend of Bretonnia being dead last. [big bad swear word] that!
  11. I gotta say one of the most lovely things about KoW is the limited unit size choices and although I've always thought that model removal was a very evocative mechanic, being able to do "whole unit unified base" for 5x2 blocks, and just plop them together for a 5x4, or 10x4, sounds SO nice. I'm hoping the gameplay is rewarding enough long term... would save me and Micah a lot of effort trying to do army lists and balancing for our own system :) Gonna dive in and get to know it after OFCC fo sho. Game(s) at my place in the coming weeks, BroG?
  12. Yes, '-/12' means effectively immune to Waver, but Routes on 12. Heroes are just standalone units. There are also "Individuals", which are cav-sized or smaller single model units, and they have a few special rules around how they move and interact with other units (see "Individuals" in the rulebook). As far as I know, they do NOT join units, but there may be special characters or whatever that acts as a "Hero" by being a unit champ... I don't know for sure. Other than special character rules though, Heroes are just on their own, and unless they are "Individuals", they act like any other unit would.
  13. Thanks Sammy! I think if and when I spend more time on it, it will be to add support for other abilities, and then maybe take .xml input for unit stats. Honestly I'm not sure I'll continue in Python though, I'm not finding it significantly simpler than the same code would be in Java which I'm more familiar with (and which can easily be wrapped in an Andriod UI). But if I instead take the time to write up an HTML interface, I'll keep the backing code in Python. All depends I guess on whether I get into KoW... I'm still waiting for my full copy of the rules to playtest!
  14. It's really just as easy as running the script (see the "# Usage:" comment at the top). You can Google "installing Python 2.7" and "running a Python script on Windows" and you'll get what you need. After starting the script (step #2 in the Usage instructions), press enter a bunch and you'll see a KoW combat get simulated :) NtK
  15. Hey folks I thought those of you interested in Kings of War might have fun playing around with the combat sim I wrote. It's pretty basic and doesn't have a lot of special rules support (just Crushing Blow and Thunderous Charge for now, no Phalanx, etc.). But it will show you a Unit 1 vs Unit 2 combat results distribution, including how many rounds before the loser routed, which is useful info. I'm attaching the code in a .zip and also pasting below if you prefer to just copy/paste into a .py file yourself. Enjoy! Nathan kow-combat-sim-v0.1.zip # Kings of War Combat Simulator version 0.1 # (c) Nathan Heldt-Sheller July 2015 # # Usage: # 1) Download and install Python 2.7.x # 2) From a command prompt execute the script: # python kow-combat-sim-v0.1.py # 3) Choose the KoW Combat Sim option (enter for default) # 4) Choose a number of Trials to run (up to 99999) # 5) Look at the distribution printout to see how many Trials each # unit won, and which round they won in. # # NOTE: Before running a lot of trials, you will want to disable the printouts # except the stats print. Change the "debugmsgs = True" on line ~299 (top of # main() function) to "debugmsgs = False" to disable all the debug prints. # # NOTE: There are a lot of special rules not yet supported... only Crushing Blow # and Thunderous Charge are supported currently. # # NOTE: This may have bugs, I wrote it in just one sitting. It's also my first use # of Python so I'm sure it's ugly code to a real Python programmer... sorry ;) # # NOTE: To change the units that are fighting just edit the info in the script # below (search for "example unit stats"). # # There's also a tool for rolling sequential handfuls of D6 just in case you # want to play around with it. # # Thanks, # Nathan import random import os STEADY = "steady" DISORDERED = "disordered" WAVERED = "wavered" ROUTED = "routed" def rolld6countsuccesses(num_rolls, min_success_val, debugmsgs): # debugmsgs = False if debugmsgs: print "\trolling %d dice looking for %d+..." % \ (num_rolls, min_success_val) success_count = 0 for i in range(num_rolls): die = random.randint(1, 6) if(die >= min_success_val) : success_count += 1 # if debugmsgs: print "die = %d, success_count = %d" % (die, success_count) if debugmsgs: print "\t... %d successes." % success_count return success_count def roll2d6countsuccesses(num_rolls, min_success_val, debugmsgs): # debugmsgs = False success_count = 0 for i in range(num_rolls) : die1 = random.randint(1, 6) die2 = random.randint(1, 6) if(die1 + die2) >= min_success_val : success_count += 1 if(debugmsgs): print "die1 = %d, die2 = %d, success_count = %d" % \ (die1, die2, success_count) return success_count def prompt_for_int(prompt, min_input, max_input, default, debugmsgs): # debugmsgs = True # check args if(default < min_input or default > max_input): raise ValueError(\ "bad args, default %d not within min/max range of %d - %d" % \ (default, min_input, max_input)) # prompt user x = raw_input(prompt + " [%d]: " % default) # if user enters '' assign default if x == '': try: retval = int(default) except: raise ValueError("bad args, default not an int") # else assign the input to retval if its an int else: try: retval = int(x) # check range if(retval < min_input or retval > max_input): raise ValueError("bad input, value out of range") except: if x == "q": raise ValueError("'q' => quit...") else: raise ValueError("bad input: not 'q', and not an int") return retval def d6rollersim(dice, debugmsgs): # debugmsgs = True trials = 1 rolls = 10 value_needed = 4 successes = 2 # start with 2 so that the starting default rolls is 2 if dice == 1: print "Rolling 1 die at a time." else: print "Rolling %d dice at a time." % dice while True : try: # dice = prompt_for_int("Roll 1 or 2 dice at a time?", 1, 2, dice, debugmsgs) rolls = prompt_for_int("Number of rolls to attempt?", 0, 9999, successes, debugmsgs) value_needed = prompt_for_int("Roll needed for success?", 1, 12, value_needed, debugmsgs) trials = prompt_for_int("Trials to average?", 1, 9999, trials, debugmsgs) except ValueError as e: print e #"prompt_for_int() raised an exception '%s'; breaking..." % (e) break print "Starting %d trials, rolling %d dice needing %d or better" \ % (trials, rolls, value_needed) successes = 0 for i in range(trials): # successes += rolld6countsuccesses(rolls, value_needed, debugmsgs) if(dice == 1): successes += rolld6countsuccesses(rolls, value_needed, debugmsgs) elif(dice == 2): successes += roll2d6countsuccesses(rolls, value_needed, debugmsgs) else: print("Unsupported number of dice, goodbye!") break successes /= trials; print "\tAverage successes in {0} trials = {1} out of {2}".format\ (trials, successes, rolls) def kowfightcombat(tohit, towound, attacks, debugmsgs): # debugmsgs = True if debugmsgs: print "\tattacking %d times needing %d to hit and %d to wound" \ % (attacks, tohit, towound) hits = rolld6countsuccesses(attacks, tohit, debugmsgs) wounds = rolld6countsuccesses(hits, towound, debugmsgs) return wounds def kowcalculatewounds(attacker, defender, melee, defense, attacks, cb, tc, nerve_state, debugmsgs): # debugmsgs = True tohit = max(1, melee[attacker]) if debugmsgs: print "Attacker = Unit %d; Defender = Unit %d" % \ (attacker + 1, defender + 1) if nerve_state[attacker] == STEADY: if debugmsgs: print "\tapplying thunderous_charge[%d]" % tc[attacker] towound = max(1, defense[defender] - cb[attacker] - tc[attacker]) else: towound = max(1, defense[defender] - cb[attacker]) wounds_dealt = kowfightcombat(tohit, towound, attacks[attacker], debugmsgs) if debugmsgs: print "\tAttacker's charge dealt %d wounds" % wounds_dealt return wounds_dealt def kownervetest(waver, route, dmg, debugmsgs): # debugmsgs = True nerve_roll = random.randint(1, 6) + random.randint(1, 6) if nerve_roll == 12: if debugmsgs: print "\tnerve roll %d (%d total): we are doomed!" % \ (nerve_roll, nerve_roll + dmg) return WAVERED if nerve_roll == 2: if debugmsgs: print "\tnerve roll %d (%d total): hold your ground!" % \ (nerve_roll, nerve_roll + dmg) return STEADY if (dmg + nerve_roll) >= route: if debugmsgs: print "\tnerve roll %d (%d total) => " % \ (nerve_roll, nerve_roll + dmg) + ROUTED return ROUTED if (dmg + nerve_roll) >= waver: if debugmsgs: print "\tnerve roll %d (%d total) => " % \ (nerve_roll, nerve_roll + dmg) + WAVERED return WAVERED if debugmsgs: print "\tnerve roll %d (%d total) => " % \ (nerve_roll, nerve_roll + dmg) + STEADY return STEADY def kowdocharge(attacker, defender, melee, defense, attacks, cb, tc, dmg, nerve_state, waver, route, debugmsgs): # debugmsgs = True if debugmsgs: print # blank line to separate each charge wounds_dealt = kowcalculatewounds(attacker, defender, melee, defense, attacks, cb, tc, nerve_state, debugmsgs) dmg[defender] += wounds_dealt if wounds_dealt > 0: nerve_test = kownervetest(waver[defender], route[defender], dmg[defender], debugmsgs) if nerve_test == STEADY: nerve_state[defender] = DISORDERED elif nerve_test == WAVERED: nerve_state[defender] = WAVERED elif nerve_test == ROUTED: nerve_state[defender] = ROUTED else: nerve_state[defender] = STEADY if debugmsgs: print "Unit %d: dmg = %d; nerve state = " % (defender + 1, dmg[defender]) + nerve_state[defender] def kowprintsimstats(trials, stats, max_rounds, debugmsgs): debugmsgs = False # the debugmsgs for this function are confusing; disable unit_wins = [] for i in range(max_rounds +1): unit_wins.append([0,0]) for i in range(trials): if debugmsgs: print stats[i] final_combat_round = stats[i][0] if debugmsgs: print "\nTrial %d went %d rounds" % (i, final_combat_round) if(stats[i][1] == ROUTED): unit_wins[final_combat_round][1] += 1 else: unit_wins[final_combat_round][0] += 1 print "\nKoW Combat Simulation Results" print "(Distribution of Wins by Combat Round and Unit):" print ' {0:<15s} {1:^15s} {2:<15s}'.format("Rounds\n Fought", "Unit 1 win", "Unit 2 win") for i in range(1,max_rounds+1): combat_round = i unitAwins = unit_wins[i][0] unitBwins = unit_wins[i][1] print ' {0:<15n} {1:<15n} {2:<15n}'.format(combat_round, unitAwins, unitBwins) print def kowcombatsim(trials, debugmsgs): # debugmsgs = True try: trials = prompt_for_int("Trials", 1, 99999, trials, debugmsgs) except ValueError: trials = 1 print "KoW combat using %d trials:" % trials # example unit stats for 10 Knights vs 40 Shield Wall # copy/paste these numbers to create a different matchup # note that the left value is always the first attacker, and the right # value is the first defender melee = [3,4] # melee value for [Unit 1, Unit 2] defense = [5,4] # etc attacks = [16,25] waver = [14,20] route = [16,22] crushing_blow = [0,0] thunderous_charge = [2,0] damage = [0,0] # for recording damage taken... leave at zero unless you # want to start the Trial with a damaged unit # start the trials stats = [] max_rounds = 1 for i in range(trials): combat_round = 0 nerve_state = [STEADY, STEADY] damage = [0,0] while True: # for human readability, round '1' is the first round combat_round += 1 if debugmsgs: print "\nTRIAL %d - COMBAT ROUND %d" % (i+1, combat_round) # UNIT 1's TURN attacker = 0 defender = 1 # if not wavered, 0 charges 1 if nerve_state[attacker] != WAVERED: kowdocharge(attacker, defender, melee, defense, attacks, crushing_blow, thunderous_charge, damage, nerve_state, waver, route, debugmsgs) if nerve_state[defender] == ROUTED: break # if no charge, reset defender nerve else: nerve_state[defender] = STEADY # UNIT 2's TURN attacker = 1 defender = 0 # if not wavered, 1 countercharges 0 if nerve_state[attacker] != WAVERED: kowdocharge(attacker, defender, melee, defense, attacks, crushing_blow, thunderous_charge, damage, nerve_state, waver, route, debugmsgs) if nerve_state[defender] == ROUTED: break # if no charge, reset defender nerve else: nerve_state[defender] = STEADY # trial over, record stats if combat_round > max_rounds: max_rounds = combat_round trial_results = [combat_round, nerve_state[0], damage[0], nerve_state[1], damage[1]] if debugmsgs: print "Recording Trial Results:", trial_results stats.append(trial_results) # simulation complete, print stats kowprintsimstats(trials, stats, max_rounds, debugmsgs) def main(): # debugmsgs = False # use these "top level" vars to set for the whole script debugmsgs = True # use these "top level" vars to set for the whole script # NOTE: disable HERE to run a lot of Trials without printing forever! os.system('clear') print "Welcome to Nathan's KoW combat sim v0.1; enter 'q' at any prompt to quit." mode = 1 while mode > 0: print "1) Simulate a KoW combat" print "2) Roll handfuls of D6" try: mode = prompt_for_int("Choose a mode, or 'q' to quit", 1, 2, 1, debugmsgs) except ValueError as e: print e mode = 0 # exit if mode == 1: trials = 1 kowcombatsim(trials, debugmsgs) elif mode == 2: d6rollersim(1, debugmsgs) print "quitting, goodbye!" if __name__ == "__main__": main()
  16. Yeah the "wounds" to a unit just represent general damage to the unit's morale, and as such, it isn't directly correlated to the models in the unit. Rather, the units Nerve (the "Waver" and "Route" numbers, e.g. 10/12) represent how resilient the unit is and how hard it is to wear down. So a unit of 10 models could have 1/3 Nerve (say Gnoblars ready to flee at the drop of a pin), or 30/35 (Terminator Robots!)... whatever the rules writer decides. So for example the same troop type (say Kingdom of Men Shield Wall troops) have 3 different sizes you can take: Troop (10 models, 5w x 2d), Regiment (20 models, 5w x 4d) and Horde (40 models, 10w x 4d). Each size has a different Nerve value: 9/11, 13/15, and 20/22, respectively. Given an average nerve roll of 7 (2d6) you can (very roughly) see how many wounds a unit can take before it will "probably" Route. 11-7 = 4, 15-7 = 8, and 22-7 = 15. So a 40-man unit of Shield Wall troops will "probably" Route on the Nerve test after taking 15+ wounds. And they will definitely Route after taking 19 wounds (barring a roll of 2, the KoW Insane Courage equiv). If anyone is curious to simulate some combats I've written a python script to work out unit vs. unit combat simulations. Check out my "Kings of War Combat Simulator" post for the code. Thanks, NtK
  17. BroG, are there other main rules (not just in the army lists) added to the full book? E.g. more "special rules" or ??? I'm looking at the KoW rules and the biggest concern I have right out of the gates is the combat system... it looks highly predictable based on the numbers I've run, which could make it a little dry. I remember in our game thinking that the certainty of combat outcomes was a weakness they needed to address... from looking at KoW2 pdf it doesn't seem to have changed meaningfully. Don't get me wrong though the rules look very clean and in fact have a LOT in common with the block-fantasy-battle rules Micah and I are writing. Nicely written and the game looks fun! I just worry they've taken CC simplification too far.
  18. Can't wait for some games of WFB and all the purty armies!! Until then, I'm outta this forum, too much negativity! Hopefully after a few weeks the AoS vs. WFB squabbling will die down and we can start talking about our hobby (hobbies?) again.
  19. No honestly that was an accident. Thanks TG for pointing that out. I perhaps drew too much out of the accusation of entitlement. It still *felt* like the article was lecturing people who are upset about cancellation of WFB, in the same breath as expressing enthusiasm for AoS. The two aren't mutually exclusive!
  20. So much cold logic and so little appreciation for "catdog" which is genius.
  21. I think this person really "gets" what AoS is supposed to be. I'm still really excited to play it with my daughter after OFCC is over!! I think though that what is missed is that it's not "entitlement" that has me looking for another game to replace WFB (which AoS does not do). It's that I really love the look and feel of WFB as I have grown to enjoy it. I play a Bretonnia army of 100+ peasants for a reason... cuz it looks like the opening scene of Gladiator, and is freakin' inspiring to me! So to claim that me continuing to look (elsewhere if needed) for what is inspiring to me, is somehow me being entitled, or missing the point of AoS, is just not accurate. And I realize he didn't mean "everyone who is upset about WFB being canceled is a rage-quitter". But at the same time, writing a blog in support of AoS, and holding up WFB rage-quitters as the counterexample to your own opinion, is a straw man logical fallacy, and kinda irks me :)
  22. Okay this has me liking AoS even more than the Bretonnia army book :) Deke are you coming to OFCC?!? SAY YES!
  23. Hang on, that IS what I was saying... I was saying that AoS *replaces* WFB, rather than being "the next edition" of WFB... how did I mis-communicate?
  24. Fallacy of relevance! Two wrongs don't make a right This I can mostly agree with, except that I would rather they overcorrect in favor of infantry, rather than undercorrect for a unit type that is historically just not very good. Admittedly I think it took adjustments in the meta, and new army books, before it got to about the right spot. Although I think most of the measures you mentioned (ASF elves, powerful monstrous cav) are just typical power creep measures that GW usually uses to sell models. But the end result is that infantry is playable and can do good stuff that other units can't do as well, and yet it's not overly dominating. That's a good thing. In fact, one of the things I really like about 8th (and the army books that came with them) is that *finally*, most of the units have a value or role in one build or another. Contrast that to past editions where there were so many units that were just plain worse than the other choices in the book in nearly every situation. The variety of reasonably competitive builds has never been better.
×
×
  • Create New...