D&D Ability Scores: How exceptional is your character?

D&D (and many other RPGs) have ability scores. You are supposed to roll 3d6 for each of them, but most often players want better scores and DMs allow methods that gives better scores.

Each ability has a value in the range 3-18 and it gives a bonus in the range -4 to +4 (for Classic D&D: -3 to +3).

Lets forget about child mortality and assume 3d6 is for those who reach adulthood (without racial ability modifiers). This would give that the average citizen of a fantasy world has a total ability value of 63 (6 x 10.5) and a bonus of 0. It makes sense that the player characters – adventurers – are better than average. Not everyone becomes an adventurer.

If we imagine our D&D town or village not to be so very different from how children grow up today, I think this is a reasonable way to think of it (approximately)

  • 1/4: most talented among siblings
  • 1/10: most talented kid on the street
  • 1/30: most talented in class
  • 1/200: most talented in school
  • 1/1000: most talented person in a village
  • 1/10000: most talented person in town
  • … and beyond that, exceptional and rare talent

How does this match ability scores and bonuses?

Ability Score

6 abilitiesBetter than
6873%Most talented sibling
73Best of 10Most talented kid on street
74Best of 14
75Best of 18
76Best of 24
77Best of 32
78Best of 45
79Best of 64
80Best of 92
81Best of 136
82Best of 205Most talented kid in school
83Best of 316
84Best of 499
85Best of 808
86Best of 1341Most talented person in village
87Best of 2287
88Best of 4009
89Best of 7237
90Best of 13472Most talented person in town

So, a character with an average score of 15 would have a total of 90. On one hand that is a person who would probably have received some attention for her talents when growing up. On the other hand, it is far from unrealistic that such a person exist.


So what about total bonuses?

Total Bonus
6 Abilities
D&D 5e
Better than
Best of
D&D Classic
Better than
Best of
+8/50/1 924
+9/103/9 075
+10/229/49 840
+11/554/320 497
+12/1 476/2 435 080
+13/4 344/22 166 682
+14/14 251/246 959 710
+15/52 658/3 481 658 707
+16/221 926/65 692 122 012
+17/1 083 583/1 846 464 029 852
+18/6 251 574/101 983 687 214 006

What I find interesting with this is that it can somehow be connected to the background story of the character. If the character is just an unknown nobody who left her village for adventuring a total bonus of +6 (or +4 for Classic) is on the high side (a best-in-class-character would probably have recieved som attention). If, on the other hand, it is understood that the character is somehow distinguished, priviliged or meant for great deeds, it is not at all unreasonable with a total bonus of +12 (+8 in classic).

Even higher bonuses than that are very possible as long as it is understood that the characters are extraordinarily talented individuals in their society.

Other Rolling Methods

What if the DM allows other methods of rolling (Classic in parenthesis)?

~1/10 bad rollAverage roll~1/10 good roll
3d6-5 (-2)+0 (0)+5 (+2)Average person
2d6+6+4 (+2)+8 (+5)+12 (+8)Best in large class (~50)
4d6 drop worst+1 (+1)+6 (+4)+10 (+7)Best kid on street (~15)
5d6 drop worst 2+5 (+3)+9 (+6)+13 (+8)Best in small school (~100)
5e: [15, 14, 13, 12, 10, 8]+5 (+2)Best sibling
5e: My House Rule+6Best kid on street (~15)

What this table says, roughly, is that if the player rolls once using this method it is likely she will get the average outcome. Only about 1/10 she will get the bad result from the bad column, or the good result from the good column. It is not at all likely that any of your players will roll a +14 (+9) character (which would correspond to best one of 10 000, or most talented in town) with any of the methods.


From this little experiment, two things came to me.

First, when it comes to NPC, villains and heroes (Conan and Robin Hood if you like) sometimes the stats of such figures are published and they can seem ridiculously good. But that is quite fine. They may be one-in-a-million type of humans who really made a footprint in their time.

Second, most established methods for generating abilities will produce characters that are the most talented among their siblings or perhaps the most talented in their school. For a player to roll anything significantly better there are some ways:

  • Very much luck
  • Rolling very many times
  • Cheating
  • Inventing a very powerful method

I think, more than just focusing on the rolling and the methods, it makes sense to talk to they players and ask: who do you reasonably think your character is. If they are the son of Conan, or the only one girl selected by the archmage in the country to study magic because of her extraordinary talents, then very high ability scores are perfectly reasonable.

Source Code

The source code for this is written in JavaScript and runs with Node.js on your computer. It is not quite written to be published, but here it is anyway.

Parameters are hard coded in the top of main().

const objcopy = (obj) => {
  return JSON.parse(JSON.stringify(obj));

const num2prop = (n) => {
  if ( n < 0 ) return '' + n;
  if ( 0 < n ) return '+' + n;
  return ' 0';

const numcmp = (a,b) => {
  return +a - +b;

const abilities = () => {
  const ret = {};
  let i;
  for ( i=3 ; i<=18 ; i++ ) ret[i] = 0;
  return ret;

const dice3d6 = () => {
  const ret = abilities();
  let i, j, k;
  for ( i=1;i<=6;i++ ) for ( j=1;j<=6;j++ ) for ( k=1;k<=6;k++ ) ret[i+j+k]++;
  return ret;

const dice2d6p6 = () => {
  const ret = abilities();
  let i, j;
  for ( i=1;i<=6;i++ ) for ( j=1;j<=6;j++ ) ret[i+j+6]++;
  return ret;

const dice4d6drop = () => {
  const ret = abilities();
  let i, j, k, l;
  for ( i=1;i<=6;i++ )
    for ( j=1;j<=6;j++ )
      for ( k=1;k<=6;k++ )
        for ( l=1;l<=6;l++ ) {
          const a = [i,j,k,l];
  return ret;

const dice5d6drop = () => {
  const ret = abilities();
  let i, j, k, l, m;
  for ( i=1;i<=6;i++ )
    for ( j=1;j<=6;j++ )
      for ( k=1;k<=6;k++ )
        for ( l=1;l<=6;l++ )
          for ( m=1;m<=6;m++ ) {
            const a = [i,j,k,l,m];
  return ret;

const multiplestats = (dist,n) => {
  let ret = objcopy(dist);
  let i;
  for ( i=1 ; i<n ; i++ ) {
    ret = multiplestats_2(ret,dist);
  return ret;

const multiplestats_2 = (total,one) => {
  let ret = {};
  let t, o, r;
  for ( t in total ) for ( o in one ) {
    r = num2prop(+t + +o);
    if ( !ret[r] ) ret[r] = 0;
    ret[r] += (total[t] * one[o]);
  return ret;

const bonuses = {
  'Classic' : () => {
    return {
      '-3' : 0,
      '-2' : 0,
      '-1' : 0,
      ' 0' : 0,
      '+1' : 0,
      '+2' : 0,
      '+3' : 0
  '5e' : () => {
    return {
      '-4' : 0,
      '-3' : 0,
      '-2' : 0,
      '-1' : 0,
      ' 0' : 0,
      '+1' : 0,
      '+2' : 0,
      '+3' : 0,
      '+4' : 0

const ability2bonus = {
  'Classic' : (a) => {
    switch (a) {
    case 3: return '-3';
    case 4: case 5: return '-2';
    case 6: case 7: case 8: return '-1';
    case 9: case 10: case 11: case 12: return ' 0';
    case 13: case 14: case 15: return '+1';
    case 16: case 17: return '+2';
    case 18: return '+3';
  '5e' : (a) => {
    switch (a) {
    case 3: return '-4';
    case 4: case 5: return '-3';
    case 6: case 7: return '-2';
    case 8: case 9: return '-1';
    case 10: case 11: return ' 0';
    case 12: case 13: return '+1';
    case 14: case 15: return '+2';
    case 16: case 17: return '+3';
    case 18: return '+4';

const dist_ability2bonus = (distDice,version) => {
  const distBonus = bonuses[version]();
  const getBonus = ability2bonus[version];
  let a;
  for ( a=3 ; a<=18 ; a++ ) distBonus[getBonus(a)] += distDice[a];
  return distBonus;

const toPercent = (dist) => {
  const ret = {};
  const keys = Object.keys(dist).sort(numcmp);
  let total = 0;
  let i,k;
  for ( i=0 ; i<keys.length ; i++ ) {
    k = keys[i];
    total += dist[k];
  total = 100 / total;
  for ( i=0 ; i<keys.length ; i++ ) {
    k = keys[i];
    ret[k] = dist[k] * total;
  return ret;

const accumulate = (dist) => {
  const ret = {};
  const keys = Object.keys(dist).sort(numcmp);
  let acc = 0;
  let i,k;
  for ( i=0 ; i<keys.length ; i++ ) {
    k = keys[i];
    ret[k] = acc;
    acc += dist[k];
  return ret;

const rounddecimals = (dist) => {
  let k,v;
  for ( k in dist ) {
  v = dist[k];
  if ( !Number.isInteger(v) ) {
    if ( v < 10 )
      dist[k] = '1/' + (100/v).toFixed(0);
    else if ( 90 < v )
      dist[k] = '1/' + (100/(100-v)).toFixed(0);
      dist[k] = v.toFixed(1);

const main = () => {
//const rolldist = dice3d6();
//const rolldist = dice2d6p6();
//const rolldist = dice4d6drop();
  const rolldist = dice5d6drop();
//const bonus = '5e';
  const bonus = 'Classic';
  const rollcount = 6;
  const percent = true;
  const accumulated = true;
  const round = true;
  const printall = true;
  let workdata = [{ dist:rolldist , lbl:'Roll Dist'}];
  const last = () => { return workdata[workdata.length-1].dist; };
  if ( bonus ) workdata.push({
    dist : dist_ability2bonus(last(),bonus),
     lbl : 'Bonus: ' + bonus
  if ( 1 < rollcount ) workdata.push({
    dist : multiplestats(last(),rollcount),
     lbl : '' + rollcount + ' stats'
  if ( percent ) workdata.push({
    dist : toPercent(last()),
     lbl : 'Percent'
  if ( accumulated ) workdata.push({
    dist : accumulate(last()),
     lbl : 'Accumulated'
  if ( round ) workdata.forEach((w) => { rounddecimals(w.dist) });
  if ( printall )


Rollformulär Titan Games D&D

Här följer rollformulär för svenska Dungeons & Dragons av Titan Games.

Rollformular-TitanGames.pdfOriginal Spelarens Handbok, (C) Titan Games
Rollformular-DnD.pdfMitt eget rollformulär, 2 sidor, anpassade för mina husregler
Rollformular-DnD-2on1.pdfMitt eget rollformulär, båda sidorna bredvid varandra på en A4-sida

Simple Password Hashing with Node & Argon2

When you build a service backend you should keep your users’ passwords safe. That is not so easy anymore. You should

  1. hash and salt (md5)
  2. but rather use strong hash (sha)
  3. but rather use a very expensive hash (pbkdf2, bcrypt)
  4. but rather use a hash that is very expensive on GPUs and cryptominers (argon2)

Argon2 seems to be the best choice (read elsewhere about it)!


Argon2 is very easy to use on Node.js. You basically just:

$ npm install argon2

Then your code is:

/* To hash a password */
hash = await argon2.hash('password');

/* To test a password */
if ( await argon2.verify(hash,'password') )
  console.log('Not OK');

Great! What is not to like about that?

$ du -sh node_modules/*
 20K  node_modules/abbrev
 20K  node_modules/ansi-regex
 20K  node_modules/aproba
 44K  node_modules/are-we-there-yet
348K  node_modules/argon2
 24K  node_modules/balanced-match
 24K  node_modules/brace-expansion
 24K  node_modules/chownr
 20K  node_modules/code-point-at
 40K  node_modules/concat-map
 32K  node_modules/console-control-strings
 44K  node_modules/core-util-is
120K  node_modules/debug
 36K  node_modules/deep-extend
 40K  node_modules/delegates
 44K  node_modules/detect-libc
 28K  node_modules/fs-minipass
 32K  node_modules/fs.realpath
104K  node_modules/gauge
 72K  node_modules/glob
 20K  node_modules/has-unicode
412K  node_modules/iconv-lite
 24K  node_modules/ignore-walk
 20K  node_modules/inflight
 24K  node_modules/inherits
 24K  node_modules/ini
 36K  node_modules/isarray
 20K  node_modules/is-fullwidth-code-point
 48K  node_modules/minimatch
108K  node_modules/minimist
 52K  node_modules/minipass
 32K  node_modules/minizlib
 32K  node_modules/mkdirp
 20K  node_modules/ms
332K  node_modules/needle
956K  node_modules/node-addon-api
240K  node_modules/node-pre-gyp
 48K  node_modules/nopt
 24K  node_modules/npm-bundled
 36K  node_modules/npmlog
172K  node_modules/npm-normalize-package-bin
 28K  node_modules/npm-packlist
 20K  node_modules/number-is-nan
 20K  node_modules/object-assign
 20K  node_modules/once
 20K  node_modules/osenv
 20K  node_modules/os-homedir
 20K  node_modules/os-tmpdir
 20K  node_modules/path-is-absolute
 32K  node_modules/@phc
 20K  node_modules/process-nextick-args
 64K  node_modules/rc
224K  node_modules/readable-stream
 32K  node_modules/rimraf
 48K  node_modules/safe-buffer
 64K  node_modules/safer-buffer
 72K  node_modules/sax
 88K  node_modules/semver
 24K  node_modules/set-blocking
 32K  node_modules/signal-exit
 88K  node_modules/string_decoder
 20K  node_modules/string-width
 20K  node_modules/strip-ansi
 20K  node_modules/strip-json-comments
196K  node_modules/tar
 28K  node_modules/util-deprecate
 20K  node_modules/wide-align
 20K  node_modules/wrappy
 36K  node_modules/yallist

That is 69 node modules of 5.1MB. If you think that is cool for your backend password encyption code (in order to provide two functions: encrypt and verify) you can stop reading here.

I am NOT fine with it, because:

  • it will cause me trouble, one day, when I run npm install, and something is not exactly as I expected, perhaps in production
  • how safe is this? it is the password encryption code we are talking about – what if any of these libraries are compromised?
  • it is outright ugly and wasteful

Well, argon2 has a reference implementation written in C (link). If you download it you can compile, run test and try it like:

$ make
$ make test
$ ./argon2 -h
Usage: ./argon2-linux-x64 [-h] salt [-i|-d|-id] [-t iterations] [-m log2(memory in KiB) | -k memory in KiB] [-p parallelism] [-l hash length] [-e|-r] [-v (10|13)]
Password is read from stdin
 salt The salt to use, at least 8 characters
 -i   Use Argon2i (this is the default)
 -d   Use Argon2d instead of Argon2i
 -id  Use Argon2id instead of Argon2i
 -t N Sets the number of iterations to N (default = 3)
 -m N Sets the memory usage of 2^N KiB (default 12)
 -k N Sets the memory usage of N KiB (default 4096)
 -p N Sets parallelism to N threads (default 1)
 -l N Sets hash output length to N bytes (default 32)
 -e   Output only encoded hash
- r   Output only the raw bytes of the hash
 -v (10|13) Argon2 version (defaults to the most recent version, currently 13)
 -h   Print ./argon2-linux-x64 usage

It builds to a single binary (mine is 280kb on linux-x64). It does most everything you need. How many lines of code do you think you need to write for node.js to use that binary instead of the 69 npm packages? The answer is less than 69. Here comes some notes and all the code (implementing argon2.hash and argon2.verify as used above):

  1. you can make binaries for different platforms and name them accordingly (argon2-linux-x64, argon2-darwin-x64 and so on), so you can move your code (and binaries) between different computers with no hazzle (as JavaScript should be)
  2. if you want to change argon2-parameters you can do it here, and if you want to pass an option-object to the hash function that is an easy fix
  3. options are parsed from hash (just as the node-argon2 package) when verifying, so you don’t need to “remember” what parameters you used when hashing to be able to verify
/* argon2-wrapper.js */

const nodeCrypto = require('crypto');
const nodeOs    = require('os');
const nodeSpawn = require('child_process').spawn;
/* NOTE 1 */
const binary    = './argon2';
// st binary    = './argon2-' + nodeOs.platform() + '-' + nodeOs.arch();

const run = (args,pass,callback) => {
  const proc = nodeSpawn(binary,args);
  let hash = '';
  let err = '';
  let inerr = false;
  proc.stdout.on('data', (data) => { hash += data; });
  proc.stderr.on('data', (data) => { err += data; });
  proc.stdin.on('error', () => { inerr = true; });
  proc.on('exit', (code) => {
    if ( err ) callback(err);
    else if ( inerr ) callback('I/O error');
    else if ( 0 !== code ) callback('Nonzero exit code ' + code);
    else if ( !hash ) callback('No hash');
    else callback(null,hash.trim());

exports.hash = (pass) => {
  return new Promise((resolve,reject) => {
    nodeCrypto.randomBytes(12,(e,b) => {
      if ( e ) return reject(e);
      const salt = b.toString('base64');
      const args = [salt,'-id','-e'];
/* NOTE 2 */
//    const args = [salt,'-d','-v','13','-m','12','-t','3','-p','1','-e'];
      run(args,pass,(e,h) => {
        if ( e ) reject(e);
        else resolve(h);

exports.verify = (hash,pass) => {
  return new Promise((resolve,reject) => {
    const hashfields = hash.split('$');
    const perffields = hashfields[3].split(',');
/* NOTE 3 */
    const args = [
      , '-' + hashfields[1].substring(6) // -i, -d, -id
      , '-v', (+hashfields[2].split('=')[1]).toString(16)
      , '-k', perffields[0].split('=')[1]
      , '-t', perffields[1].split('=')[1]
      , '-p', perffields[2].split('=')[1]
      , '-e'
    run(args,pass,(e,h) => {
      if ( e ) reject(e);
      else resolve(h===hash);

And for those of you who want to test it, here is a little test program that you can run. It requires

  • npm install argon2
  • argon2 reference implementation binary
const argon2package = require('argon2');
const argon2wrapper = require('./argon2-wrapper.js');

const bench = async (n,argon2) => {
  const passwords = [];
  const hashes = [];
  const start = Date.now();
  let errors = 0;

  for ( let i=0 ; i<n ; i++ ) {
    let pw = 'password-' + i;
    hashes.push(await argon2.hash(pw));
  const half = Date.now();
  console.log('Hashed ' + n + ' passwords in ' + (half-start) + ' ms');

  for ( let i=0 ; i<n ; i++ ) {
    // first try wrong password
    if ( await argon2.verify(hashes[i],'password-ill-typed') ) {
      console.log('ERROR: wrong password was verified as correct');
    if ( !(await argon2.verify(hashes[i],passwords[i]) ) ) {
      console.log('ERROR: correct password failed to verify');
  const end = Date.now();
  console.log('Verified 2x' + n + ' passwords in ' + (end-half) + ' ms');
  console.log('Error count: ' + errors);
  console.log('Hash example:\n' + hashes[0]);

const main = async (n) => {
  console.log('Testing with package');
  await bench(n,argon2package);

  console.log('Testing with binary wrapper');
  await bench(n,argon2wrapper);

Give it a try!


I find that in Linux x64, wrapping the binary is slightly faster than using the node-package. That is weird. But perhaps those 69 dependencies don’t come for free after all.


I see one problem. The node-argon2 package generates binary hashes random salts and sends to the hash algorithm. Those binary salts come out base64-encoded in the hash. However, a binary value (a byte array using 0-255) is not very easy to pass on the command line to the reference implementation (as first parameter). My wrapper-implementation also generate a random salt, but it base64-encodes it before it passes it to argon2 as salt (and argon2 then base64-encodes it again in the hash string).

So if you already use the node-package the reference c-implementation is not immediately compatible with the hashes you already have produced. The other way around is fine: “my” hashes are easily consumed by the node package.

If this is a real problem for you that you want to solve I see two solutions:

  1. make a minor modification to the C-program so it expects a salt in hex format (it will be twice as long on the command line)
  2. start supplying your own compatible hashes using the option-object now, and don’t switch to the wrapper+c until the passwords have been updated


There are bindings between languages and node-packages for stuff. But unix already comes with an API for programs written in different languages to use: process forking and pipes.

In Linux it is extremely cheap. It is quite easy to use and test, since you easily have access to the command line. And the spawn in node is easy to use.

Argon2 is nice and easy to use! Use it! Forget about bcrypt.

The best thing you can do without any dependencies is pbkdf2 which comes with node.js and is accessible in its crypto module. It is standardized/certified, that is why it is included.

Reading old Dragon Magazines in 2020

I discovered that old issues of the Dragon magazine are available free for download. When reading about old versions of Dungeons and Dragons there are often references to the Dragon Magazine.

I entertained myself browsing through the first 100 140 issues (June 1976 to August 1985) and took notes of articles I find can be of value today.

  • OD&D is mostly covered up to #25
  • After #25 most things refer to AD&D 1e (which for most practical purposes is quite compatible with OSR clones and Classic D&D)
  • There is virtually no content to be found specifically written for Classic D&D
  • There is a separate Dungeon magazine which also is downloadable for free, and which almost only contains D&D modules (adventures), so I have only noted a few such modules from Dragon magazine.

This is a list of articles I found in Dragon #1 – #130 that I found particularly relevant in 2020.

You are most welcome to give feedback on my list!

About D&D

#pagesTitle or type of article
77Gary Gagax on D&D***
823On Realism (Joke)***
1615-16,21Gary Gagax on Realism, Game Logic and more****
1636Game Balance***
2417-19Gary Gagax on Melee in D&D****
2628-Gary Gagax on OD&D and AD&D****
28Gary Gagax on OD&D and AD&D****
3512-13TSR plans D&D and AD&D****
3916-18Women want equality***
5214-15On Classic D&D by Holmes/Moldvay****
7645-52Index of previous Dragon Magazine
7726-29On Classic D&D by Mentzer****
8438-44On Companion D&D by Mentzer****
9512-13The influence of JRR Tolkien on D&D and AD&D***
1028-10Realms of role playing***
1038-10What the 2nd Edition will be like by Gary Gagax
10356Profile: Gary Gagax (never sleeps)***
10763Profile: Elmore
11241-64Index of previous Dragon Magazine
12240Gary Gagax “Farewell”**

Creatures (new AD&D 1e)

Creatures for AD&D 1e can probably be used with little effort in OSR gaming.

#pagesTitle or type of article
27The Horast
3239Crawling Claw
376-Neutral Dragons
427-15Demons, Devils, Spirits
4244Necroton and more
4488-Ice, various creatures
4566-Dust Devil, Sand Lizard
4810Sea, various creatures
5166Piranha Bat
5248-49Rhaumbusun (Crocodile-basilisk)
Devil Spider
6148-49Umbreas and more
626-11Dragons (faerie and more)
6528-30Dragons (yellow, orange, purple)
6620-21Oriental (different spirits)
6656-57Vultures, Hawk, Skeleton animals
7412-15Landragons (non flying dragons)
9020-23Bats, 6 types****
918Goristro Demon
9444-54Creature Catalogue II
9538-39The many shapes of Apes***
10140-55Creature Catalogue III**
10220-28A collection of Canines (dogs)
11638-44Sea Creatures
11946-53Creatures of the Woods
13742-49Prehistorical animals
13822-35The ungrateful dead
13970-74Rare beasts of Forgotten Realms

Creature Lore

#pagesTitle or article type
1414-Interview with a Rust Monster
2531-33Interview with an Iron Golem
2542Vampires, Variety of**
2636Lich, Blueprint of****
507-12Dragons: Fighting strategies
7115-18Mind of the monsters
766-8On Beholders
7866-68Ecology of Mind Flayers
806-8Psycology of Dopplegangers
8127-28Ecology of a Basilisk
8718-20Ecology of a Dryad
8822-24Ecology of a Rust Monster
9229-31Ecology of Ettins***
9424-26Ecology of Chimera
9522-26Ecology of a Cockatrice****
9725-27Ecology of a Gorgon
9919-20Ecology of Will-i-wisp
The Centaur Papers
10433-36Ecology of the Ochre Jelly
10616-17Ecology of the Maedar
10932-34Ecology of a Displacer beast
11550-54Ecology of a Harpy****
11632-35Ecology of a Minataur
11733-36Ecology of an Anhkheg
11942-44Ecology of the Korred
12456-57Ecology of a Gelatinous Cube
12510-12Ecology of the Greenhag
12641-43The ecology of the Shade
13136-39Ecology of the Aboleth + Stats
13142-46Ecology of Hook Horror + Stats
Give Dragons a Fighting Chance
Serpents (Dragons) and Sorcery
Dragotha (a Dracolich)
Ecology of the Red Dragon
13654-56The Golems Craft
13727-32Ecology of carnivorous plants
Golems (hiding)
Ecology of spectator (+stats)


#pagesTitle or article type
5218-24Birthplaces in Greyhawk
6314-17Sea Barons and more countries
Gods of the Seul Pantheon


These articles are mostly not about rules but other useful knowledge.

#pagesTitle or Type of article
2032-Demonic Possession
2250-54Pole Arms
2512-13Social classes in D&D
4541-43History of Dwarves
4549-51Castles*** (historical)
5013-Raising a Dragon
5855-59Swords*** Quality of swords?
5916-20Gypsies** Special “class” rules of limited use.
6325-31Humanoids (and their Deities)
6351-54Plan before you play
6367-71Coins*** (historical)
6547-53Celtic mythology
6818-22Ice Age Adventureing
Hell and Devils
7554-57Orcish language
8014-16Five things to DMing Success****
Clerics: Special Skills & Thrills
Dragon Magazine #85
Clerics must be deity-bound
9030-33Political Game
9036-60Gladsheim / Norse Mythology + Module****
9118-34The Nine Hells Revisited
926-10Clerics – missions and playing
9312-17World Building
9324-30How to pronounce monster names
9410-16Large Scale Logistics
978-Deities and their faithful
986-10Dragon Hoards
9811-13Dragon Teeth
9815-16Dragons of Dragonlance
9822-24Detailing a fantasy world
9828-32Knowing whats in Store*****
998-10The neutral point of view (between good and evil)
10536-42,55Parallel gaming worlds
1068-12The laws of Magic*
10716-21The six abilities
10722-25Increasing ability scores
10812-20The Role of Nature
10928-30A dwarf’s beard is more than hair
11122-26Out-of-control campaigns
11310-26Welcome to Hades
11538-40Clerics: Weapons of choice**
11628-30Aquatic Elves
11716-17Feuds and Feudalism
11740-42Fun without Fighting
11743-45Henchmen, Hirelings & Followers
1188-14,18-20Gladitorial Combat
11910-29Druids (several articles)
12244-45DMs ten commandments***
12316-30The Mystic’s College
12514-16Woodlands of the Realms (trees)
12518-19Code of Chivalry
12542-45Glory, Danger and Wounds
1288-14Welcome to Waterdeep
13070-78If looks could kill
13228-32Trap Design
13327-33Roman Pantheon + stats
13518-19Usages of Rope
13526-29When Game Masters go Bad*****
13618-20The long arm of the law
13628-32Inns (with price lists)
13634-38Fifty ways to foil your players
13936-40Speaking with Spirits

Magical Items

2624-Deck of Fate
3035-36Extranous Magic Items
7336-40100 Unusual Magic Items
7418-24Blades of the (Forgotten) Realms
7718-24Curses and nasty items
8034-36Treasures rare and wondrous
8228-30Magic Jewelry (13 items)
8626-28A few magic items
8914-18Six very special shields
9152-62Treasure Trove (47 magic items)
9949-52Seventeen new treasures (Magic Items)
10230-34,89-Nine Wands of Wonder
11546-47Nine magical harps
11746-47Nine magical masks
11748-51Magic rings
12564-67Magical maps of Greyhawk
12726-31Bows and Crossbows
13310-11Arrows (and Quivers)

Modules (Adventures)

A few I found interesting.

#pagesTitle or article type
7842-56Citadel by the Sea
8035-45Adventure + City
10243-54Valley of the Earthmother

Rules, Lists

These are optional rules, items and other lists.

#pagesTitle or type of article
3219-20Permanent Damage
2923Rewarding Heroism*
2924-25Taverns & Inns + Menu*****
31Criticals & Below 0HP
3430-31Beware of Quirks and Curses: Magic items are not always nice****
3847-48DM Hostile Magic Users
4860-62Instant Adventures***
6842-53+last 3Weather (Greyhawk)
776-13Tarot cards
8214-19Healing Herbs
858-11First Aid
9946-48Magic Swords
10416-19Pick Pocketing (lists)
10622-23Doors: Open them if you dare
10828-29Cantrips for Clerics
10842-26The plants of Biurndon
11227-31Cloaked in Magic
1169-27Maritime Adventures
11722-24Dungeoneers Shopping Guide****
11822-29Jousting rules
12417-32Aerial Adventuring
13040Ingredients of (alchemists) potions
13377-80Berserkers (NPC class)
13646-48Recharge of magic items
13716-24Treasures of the Wild

Random World

1715Sights and Sounds***
2110Random Town Events***
8030-34Random Treasures/Items
10530-35The well equiped victim***
11422-24Grave Encounters**
11548-49Dungeon floor design***
11560-61Doors (50 of them)****
12116-19Japanese Names**
13122-30Random Natural Caves
1368-14Random City
1378-14Hunting – whats for dinner
13734-41Weather system
13750-52Encounter tables wilderness (pre history)

Fiction / Short Stories

These should be Fantasy short stories.

#pagesTitle or type of article
1-7The Gnome Cache
214-Short Story
423-25Roads from Jakalla** Ok D&D, not much of litterature.
518-24Short Story
612-14The Forest of Flame****
712-15The Journey Most Alone** (planes and mystery)
1222-30Short Story
1322-28The Stolen Sacrifice*****
1510-11The Gospel of Benwa** (creation story, law, chaos & neutrality)
Green Magician (1/2)
Green Magician (2/2)
2442-43Monty Haul and the
Best of Freddie
Power game session
31Short Story
386-Short Story
447-Short Story
467-Short Story
5450-51Short Story
5524-36The coming of the sword
5836Short Story
6031-32Short Story
6673-74Friends in High Places***
7111-13The blink of a Wizard’s eye*
7371-72Short Story
7911-12The Ordeal* (and not fantasy)
8118-22Short Story
8265-69Short Story
8326-30Short Story
8457-63Short Story
8528-35Valkyrie Settlement
8556-62A stone’s throw away (Dragonlance)
8659-63Short Story
8859-63Short Story
8955-61Short Story
9186-93Short Story
9355-61Short Story
9457-63Short Story
9560-67Desperate Acts
9863-67The forging of fear*****
9963-67Short Story
10022-32Short Story
10162-66And Adventuring To …
10564-68On the Rocks at Slabs
10869-75The Grey Stones
11066-76The Wizards’ Boy
11362-71A Difficult Undertaking
11849-56Across the Fog-Grey Sky
11963-73The Pawns of Crux
12047-50Dragon Meat**** (humourous)
12151-63Love and Ale (Dragonlance)
12263-67The Prince’s Birthday
12557-63The passing of kings
12644-49Well Bottled at Slab’s
12836-42The Spirit Way
12958-64The old ways are best
13042-49Shark Killer
13141-45Out of hand
13449-55Eyes of Redemptions
13555-60Karl and the Ogre
13641-45The curse of the Magus
13857-64Between Lightning and Thunder
13947-49The visitor
14047-51Flesh and Blood

Art – B/W

Three warriors and a horse
Warrior – roman style
3520Bowman in Chainmail**
398Dark Paladin****
Coat of arms (Shield + Two axes)
Anvil with sculpture
Castle against night sky
5957Poisoned nobleman***
Goblins (3x)
6660Nobleman with Drinking Cup**
Two old wizards
Elegant man with flute
Rogue with sword
Lich / Death god
Mounted knight
Female knight on Unicorn
Man with sword at wall
Viking on Longship
Orc with axe
Hung in tree by mob
Ruin: Gate & Trees
Priest with warhammer
Witch or Sorceress
Dwarf with warhammer
Hiding elf / Hunters with bows
944Wizard (?)***
Shop interiors: Smith, Leather, Tanner
12019Angry dwarf with club****
Two knights jousting
A few ships
A Demon (?)
Woman drawing, man standing
Man and witch (?)
Barbarian (?) with Dragon
Woman – tottooes in face
Old Merchant
Two village women
Ritual and demon
Old man in library
Portraits of priests/shamans (2)
Coat of arms (Dragons and swords)
Wizard (and dead/defeated man)

Art – Full Color

723Warriors having passed a river**
Old man inspecting sword(s)
Monk in armory
7281Mounted knight and goblins***
9059Elmore: Dragon & Warriors*****
13315Warrior + Death Knight(?)****
13423Fighter / Dragon***
1377Hydra & Warrior***

D&D Classic: House Rules

I thinking about playing D&D Classic again for a more simple and old-school experience compared to D&D 5e. So I am basically talking about these versions:

  • Basic/Expert (B/X)
  • Basic/Export/Champion/Master/Immortal (BECMI)
  • Rules Cyclopedia

However, all rules are a bit subject to taste, and I will put a few house rules here. They may change over time. Some of these rules come from, or are inspired by, OSR clones (in particular the Swedish Svärd & Svartkonst).

Named Weapon

A character can name one weapon which gives +1 to hit and +1 to damage. Only one weapon can be named at a time, and change of weapons can only happen between adventures.

Sacrifice Shield

A shield can be destroyed to save the wielder from a strike that would otherwise give him 0HP. This can only happen once per combat.

Thieves can attack with Dexterity

Thieves can use Dexterity instead of Strength when they attack with a weapon doing at most 1d6 damage. Damage is still Strength.

Death and more

D&D Basic is deadly. 0HP means death. Poison is often saving throw or death. Petrification is instant and permanent. Let us give each character three lives per adventure.

  1. st death (or similar) results in unconsciousness. A successful (suitable) saving throw will make the character recover in his own during the next turn (not round) at 1HP. A failure means death, unless character is cared for during next turn.
  2. nd death (or similar) as 1st death. Also there is a permanent injury. If the saving throw succeeds it is just esthetic but if it fails it comes with a suitable penalty.
  3. rd death is definite.

Movement and Encumbrance

Let us start with the baseline:

(feet / round)
(feet / round)
(m / round)
150(50) Spectre
0-4004012012120(40) Hydra
401-8003090990(30) Hobgoblin
801-12002060660(20) Skeleton
1201-16001030330(10) Beholder

(I got rid of feet/turn when exploring dungeons).

I suggest:

ArmorMax DEX
(feet / round)
(feet / round)
(m / round)
None, Leather4012012

A character can carry a number of items equal to his Strength. Small items can be carried together in a sack/backback (which counts as 1). For every extra item carried, movement is reduced by 10feet/1m per round. If you use grid, round down.

500 coins or gems count as one item.

Background: this is complicated. I have a Swedish D&D with metres instead of feet. Neither pounds nor coins are very convenient to recalculate. I kind of like the 5e dexterity limitation to heavy armor. At the same time it may be more in the OSR spirit to let heavy armor limit movement to make escape harder. I also makes sense to let Strength have something to do with it.

Weapon Damage and Initiative

See separate article.


Treasure tables are multiplied by 100x instead of 1000x. Value of Gems and Jewels are in sp, not gp. Characters get 1XP for 1sp.

SonarQube – I disagree

For someone like me working in a (very) small development team SonarQube is good. It reviews my code and it teaches me about both old and new things that I did not know about.

There are some things I don’t agree about though (all JavaScript below).

“switch” statements should have at least 3 “case” clauses

I understand the point. But I have my reasons. Let us say I have orders with different statuses (DRAFT,OPEN,CLOSED). Then often I have switch statements like:

switch (order.status) {
case 'DRAFT':
case 'OPEN':
case 'CLOSED':
  throw new Error(...);

This switch over order.status happens in many places. Sometimes it is just:

switch (order.status) {
case 'CLOSED':

I don’t want to refactor the (rewrite if with switch) code if/when I need to do something for other states. And I like a consistent form.

Another case can be that I allow the user to upload files in different formats, but for now I just allow PDF.

switch ( upload.format ) {
case 'pdf':
  throw new Error('Unsupported upload.format: ' + upload.format);

A switch is much more clear than an if-statement. However, if the above code was in a function called uploadPdf() then the code would have been:

if ( 'pdf' !== upload.format ) throw new Error(...);

But in conclusion, I think switch statements with few (even 1) case clause are often fine.

This branch’s code block is the same as the block for the branch on line …

This happens to me often. A good rule is to never trust user input. So I may have code that looks like this (simplified):

if ( !(user = validateToken(request.params.token)) ) {
  error = 401;
} else if ( !authorizeAction(user,'upload') ) {
  error = 401;
} else if ( !reqest.params.orderid ) {
  error = 400;
  errormsg = 'orderid required';
} else if ( user !== (order = getOrder(request.params.orderid)).owner ) {
  error = 401;
} else if ( !validateOrder(order) ) {
  error = 400;
  errormsg = 'order failed to validate';
} else ...

The point is that important part of the code is not the code blocks, but rather the checks. The content of the code blocks may, or may not, be identical. That hardly counts as duplication of code. The important thing is that the conditions are executed one-by-one, in order and that they all pass.

I could obviously write the first two ones as the same (with a more complex condition), since both gives 401. But code is debugged, extended and refactored and for those purposes my code is much better than:

if ( !(user = validateToken(request.params.token) ) ||
     !authorizeAction(user.upload) ) {
  error = 401;
} else ...

My code is easier to read, reorganize, debug (add temporary breakpoints or printouts) or improve (perhaps all 401 are not equal one day).

Remove this …… label

The reason I get this warning is mostly that I use what i learnt in my own post Faking a good goto in JavaScript.

SonarCube also complained when I wanted to break out of a nested loop this way:

break_block {
  for ( i=0 ; i<10 ; i++ ) {
    for ( j=0 ; j<10 ; j++ ) {
      if ( (obj=lookForObjInMatrix(matrix,i,j) ) ) break break_block;
  // obj not found, not set

It is a stupid simplified example, but it happens.

OSR – and the slope of good intentions

(draft in swedish)

Jag började spela D&D med min grupp ca 1987. Det övergick i AD&D 2e och så småningom Rolesmaster (alla XP och Levelbaserade spel). När åren gick förändrades vår spelstil successivt och runt 2000 lade vi våra rollspel på hyllan. Förra året 2019 plockade vi upp hobbyn igen med D&D 5e och vi (jag) gjorde ytterligare “anpassningar” för den spelstil jag tänkte var vår.

Det som har präglat vår spelstil har varit:

  • Fokus på egna äventyr, snarare än köpta
  • Fokus på långa kampanjer – och därmed att karaktärerna normalt överlever – snarare än fokus på äventyren
  • En strävan att vara mer seriösa: mer fokus på rollspelande och berättelse, mindre fokus på regler och mekanismer

Så när vi började spela 5e så bestämde jag direkt att XP var inget för oss – som SL har jag bättre saker att göra än att anteckna sånt, tänkte jag.

Samtidigt började jag intressera mig för OSR (old school revival – alltså hur rollspel och D&D spelades i början, när hobbyn var ung och ny), mest för att jag generellt gillar enkelhet och less-is-more, och för att jag tyckte att omständiga regler inte bidrar till spelet, men när jag läst mer om OSR inser jag att det finns ett system av mekanismer och balans i OSR som jag valt bort för min grupp.

OSRHur jag har gjort när jag är SL
Erfarenhetspoäng (XP)Verkar vara onödig bokföring, och fokus på materiella saker och onödigt dödande, snarare än rollspel och berättelse
Vikt/belastningVerkar vara onödigt bokföring, ingen tycker ändå det är roligt att lämna saker bakom sig
PengarVem bryr sig om vad ett rep, en lykta eller 5 dagar på ett värdshus kostar? Vi räknar pengar slarvigt, men de är sällan någon stor fråga.
FörflyttningDet här med taktisk strid och figurspel är inte riktigt vår grej, så förflyttning går också bort.
DödlighetSom SL vill jag inte ta livet av rollfigurerna, utan försöker berätta en bra berättelse istället.
FlyktSällan. Rollfigurerna kan såklart inte anfalla vad som helst, men jag vill ju inte förbereda massa fiender som de ändå inte ska slåss mot, det varkar vara slöseri med tid.
ResurserRep, lyktor, mat, vatten och så är sällan en fråga. Jag vill ju inte att ett äventyr “tar slut” halvvägs för att det fattas något värdsligt.
Vandrande monsterAtt slå för vandrande monster på en tabell verkar bara vara en ursäkt för meningslöst dödande, och fördröjer storyn.
Reaktioner och MoralAtt först låta slumpen avgöra om varelser är vänligt eller fientligt inställda till rollpersonerna, och sedan avgöra om de väljer att fly eller inte, har jag betraktat som mekaniskt och dumt.
FällorMycket sällan
TidBara övergripande: dagar, förmiddag, eftermiddag, inte som taktiskt element

Vi spelar, har kul och det fungerar. Men vägen till helvetet kantas av goda avsikter, och kanske har jag tappat något på vägen.

Klassiskt grottäventyr

Det finns ett visst förakt mot klassiska grottäventyr. Låt mig beskriva hur ett sådant går till, och koppla till tabellen ovan.

Rollpersonerna börjar i en by och får reda på att det finns en grotta i närheten där det kan finnas skatter. Så de samlar lite information om grottan, använder sina pengar för att köpa förnödenheter och utrustning i byn, och sedan beger de sig av. På vägen till grottan kan de stöta på något vandrande monster. Reaktionsslag avgör om de är aggressiva eller inte, och moralslag avgör om de flyr, väl i strid. De har inte så mycket pengar på sig, så här gäller det att inte ge sig in i onödig strid och förlora resurser som behövs senare. Dessutom kommer vandrande monster från en slumptabell, så de kan vara obalancerat farliga, dödliga, och flykt kan vara det enda kloka. Väl framme vid grottan beger sig gruppen in i mörkret. En kamp mot klockan börjar, rollfigurerna har inte hur mycket tid på sig som helst för deras resurser i forma av mat, vatten och ljuskällor kommer ta slut. Målet är att hitta skatten – som antagligen är vaktad av något farligt monster – djupt ner i grottan. Andra fiender i grottan är antagligen inte speciellt rika och bäst att undvika och i värsta fall fly från. Flykt är ingen möjlighet för den som bär tung rustning (och springer långsamt), och kan innebära att man måste slänga utrustning efter sig. Fällor ger anledning att vara försiktig för att inte skadas eller förlora tid. När gruppen till slut närmar sig skatten väntar en farlig slutstrid, eller kanske går det att få med sig en del av skatten med list istället. Tillbaka i byn har rollfigurerna sedan pengar att spendera och en berättelse att berätta. Erfarenhetspoäng avgörs primärt av hur mycket skatter de fått med sig tillbaka.

Vad jag nu förstår är att detta (OSR) är ett spel som handlar om utforskning snarare än att simulera strider exakt. Hela spelet är fullt av risk-reward-situationer för spelarna. När man som jag gjort som SL tagit bort OSR-element så har man också plattat till spelet. I mitt fall har spelet reducerats ganska mycket till:

  • Dialog, berättelse och problemlösning
  • Taktiska strider (som spelarna förväntas vinna)

En sak som jag speciellt uppskattar med OSR när jag nu tittar på det är att jag som SL inte förväntas förbereda ett äventyr och möten (encounters) som precis utmanar rollfigurerna i rätt utsträckning. Nej, spelet är obalancerat (vandrande monster – som jag som SL så att säga inte riktigt bestämmer över – är ett tydligt exempel här). Det vet spelarna – annars dör de snabbt. Och som SL kan jag lite ta ett steg tillbaka: mitt ansvar är inte att leverera en hel story, utan att vara domare och rollspela resten av världen.

När det gäller Erfarenhetspoäng så finns det ett utbrett förakt mot att hitta skatter och döda monster för att få XP. Men det fyller också en funktion som, om man tar bort den lämnar ett hål att fylla (vad motiverar rollfigurerna?).

Skatter i Svärd & Svarkonst

I Svärd och Svartkonst handlar det om att återbörda skatter från vildmarken/kaos till civilisationen – och det är bara sådana skatter man får XP för. Det finns sedan en frivillig regel om att pengarna ska förbrukas i civilisationen (festas upp, doneras, bygga hus, handla lyx) för att få användas som XP. Så pengar kopplade till XP modellerar flera saker:

  • målet är att återbörda skatter, inte att döda alla monster
  • en äventyrare som återbördar skatter blir en person med anseende genom att pengarna kommer “byn” till nytta (en präst kan donera till sin kyrka, fester kan hållas, hus byggs)
  • den som når högre grad (9 i D&D Basic) får en titel och kan bygga sig ett fäste för sina rikedomar

D&D 5e

När jag nu tittar på D&D 5e så kan jag göra två observationer:

  • XP erhålls inte längre genom skatter, och i större utsträckning genom att besegra monster
  • Strider är mer detaljerade och tar längre tid
  • Det tar för mig som SL längre tid att förbereda ett “möte” i 5e.

Så jag kan konstatera att 5e är ett bättre spel än OSR-D&D för spelgrupper som föredrar taktiska strider än utforskning i sitt rollspelande.


Alla spelledare och grupper har sin kultur, sina normer och sitt sätt att göra saker på. OSR behöver inte vara rätt eller bäst, inte alls och inte för alla.

Men både när jag skapar äventyr, när vi spelar, och efter att vi spelar, så upplever jag som SL olika svårigheter som jag delvis har tagit på mig själv, genom att göra alla dessa avsteg från hur rollspel spelades i början, och som återkommer nu med OSR.

Balans och framgång

När det gäller balans så har jag haft en utmaning när jag gjort äventyr, för en del problem blir triviala om rollfigurerna har en viss förmåga (ex.vis en spell) och andra saker blir omöjliga annars (om man inte har en tjuv).

Jag inser att mina äventyr i princip bara kunnat sluta på två sätt: framgång eller misslyckande. Och varje utmaning blir därför något som riskerar att fälla hela äventyret och dess story, om spelarna misslyckas.

Men i OSR så blir framgången mer gradvis mätbar: alla skatter hittas inte eller kan inte bärgas utan lämnas kvar. En del skatter och problem kommer rollfigurerna enkelt över, men det gör inte hela äventyret enkelt.

Web Components 2020

Web Components is standard technology (as opposed to libraries, frameworks and tools that come and go) for web development.

It allows you to simply write custom html elements in JavaScript. Such components become framework-independent and can be shared and reused. They are simple to use. In your html-file, simply:

  <script src="wc-blink.js"></script>
  <wc-blink>This should blink</wc-blink>

The code of wc-blink is quite simple (view), I stole it (here) and modified it slightly.

Another advantage of Web Components is the Shadow DOM allowing private CSS: the styles wont escape, override or be overridden.

This technology has been around for a while… but the bad news… it still does not work with Microsoft browsers (IE11, Edge).

I wrote a simple demo page (link).

With Polyfill you can use it with Edge. IE11 seems to be out of luck because the keyword class from ES6 must work (see code for wc-blink above) and this is not simply a matter of polyfill. There is technology to compile/transpile stuff to ES5 but in that case I can rather keep building my components in Vue.js.


It is actually sad that work that goes into web browser standards (to make it possible to build applications and components for the web in a good way) gets delayed by MS simply not supporting it.

I dont think web development should be more complicated than including scripts and writing html. Web Components allow just that.

If you need to support IE11, simply ignore Web Components until you don’t need to support IE11 anymore.

If you are fine supporting just Edge, there are ways not to need to include the 117kb polyfill for everyone.

I can not afford to break IE11 at this point, and neither am I willing to transpile stuff. I stick to Vue.js components.

Fantasy! OSG Weapons and Armors House Rules

Note: I own Fantasy! OSG 3.0 in Swedish. I write this article in English. I may use the wrong terms/translations in English.

I got the Fantasy! Old School Gaming roleplaying game. I have not tried it yet, but I can immediately see that there are things (about combat) that I don’t like: Armors and Shields are way too good!

Too good for what? I see Fantasy! as a simple, fast to play, fun game that does not attempt to be realistic but rather a simple framework for roleplaying. Thus, I think the rules should stay in the background. I think

  1. experience (the character) should matter more than the equipment
  2. equipment should rather be part of the story than subject to optimization

Suggested House Rules

Each champion has two pools of dice in combat:

  • Attack dice: Strength + Weapon Skills
  • Defence dice: Dexterity + Dodge Skill

Just as in the original rules Attack Dice can be used defensively (I think there are dedicated defensive dice, like the dodge skill, in the original rules).

These things reduce Defense dice (to a minimum of zero):

  • Armor Abs
  • Weapon Damage above +1

So, for example, with Abs=2, and Damage=2, number of defence dice are reduced by 3 (to a minimum of zero).

Armors gives Abs as:

  • 1: partial leather armor
  • 2: Partial metal armor
  • 2: Full leather armor and helmet
  • 3: Full metal armor and helmet

Weapons give damage as:

  • 1D : Unarmed
  • 1D+1: Small weapon (dagger)
  • 1D+2: One handed weapon
  • 1D+3: Two handed weapon

There is opportunity for weapon variants:

  • A long sword that can be used either with 1 or 2 hands
  • A monk may be agile with his staff and use it either as +1 or +2

A Shield gives extra 1D defence, to a minimum of 1D.

Two weapons (with the skill) gives the choice between +1 damage or 1D defence.

Analysis of Original Rules

How unbalanced are the original rules really? Assume we have two simple characters in a duel:

  • Strength: 4
  • Sword +2 (this is from Fantasy 3.0!)
  • Dice: 7
  • Damage: 1D+2
  • HP: 9
  • Armor Abs: 0

It can not get more normal or ordinary than this. I programmed a simple simulator (link) and found that in the above case:

  • 13% chance of ending in a draw (both dies / reaches 0 HP)
  • 43% for each champion to win

Lets equip one champion with armor (+2):

  • Armor: 77% win, 8% draw, 14% lose
  • Shield: 70% win, 13% draw, 17% lose
  • Armor + Shield: 89% win, 5% draw, 6% lose
  • Armor + Helmet + Shield: 93% win, 3% draw, 3% lose

The champion without armor and shield can have no use of his free hand or the fact that he is not encumbered by an armor.

I don’t know what it is like to fight in a real armor. But I know what this does to storytelling and roleplaying: if combat is fairly common in your campaign, everyone will look more or less like knights quite soon. Perhaps in a larger group a ranger with a bow can survive.

There is no room for agile monks, barbarians or rouges who avoid being hit (there is a skill Dodge, which can be used regardless of armor, and regardless of your Dexterity ability).

Reasoning behind house rules

I would rather see a combat system where

  • Skill of champion matters the most
  • Equipment is mostly a matter of risk/reward, not just better/worse
  • Light armor also works

So, I want to simplify and balance equipment (armor, shield, weapon) for Fantasy!. Let us go back to the case above, without any bonus. Our champions have:

  • Strength: 4
  • Dice: 5 (unarmed Boxer)
  • Damage: 1D
  • Armor: 0
  • HP: 9

This gives each champion a 46% chance of winning. Fair enough.

If one of the champions receive bonuses, how does that changes his chance of winning:

Armor Abs586980
Dice + Damage688188
Dice + Armor Abs718694

The conclusion is that Dice and Armor ABS are more important than Damage. Armor is better than weapons, and armor diversity is larger than weapon diversity (0-4 vs 0-3). A shield is very good.

As a side note, if you equip one champion with +1/+2/+3 damage, and the other with +1/+2/+3 armor, they have the same chance of winning (!).

As another side note: if you have two (or three) opponents Armor Abs will protect against every attack, but your dice need to divided and you can only deal damage once per round.

This table shows what happens to our two sword fighters in the example above as we equip one of them better. Both of them have Dexterity 2 to 4.

Standard RulesHouse Rules
Dex 2
House Rules
Dex 3
House Rules
Dex 4
Armor 277/8/1447/12/2137/14/4938/10/51
Armor 2 + Shield89/5/661/11/2849/11/4050/12/38
Armor 3 + Shield93/3/371/7/2160/7/3348/8/44

With the standard rules, the better equipped champion could expect to win 77-93% of the fights, depending on equipment.

With the house rules, if both champions have a low Dexterity (2) armor and shield is quite helpful. However, Armor 2 completely negates all defensive dice for a champion with Dexterity 3 (the one handed sword negates the last die) and this becomes a particularly bad choice. For champions with high Dexterity (4) the benefit of armor is even less.

This is probably far from perfect, but there is a risk-reward element to it, which I like. Being agile (high Dexterity) is now very valuable (compared to the standard rules). If you are very agile you can kind of do without armor. However, if you are not agile an armor can compensate quite well.

Finally, I can say that my simulator is not perfect and there may be strategical choices to make. Perhaps with Armor Abs 3 you would choose to roll as few defensive dice as possible?


I am arrogant enough to conclude that I don’t even want to try the original Fantasy! combat rules with real players in a real game.

I know the rules of Fantasy! clearly says that the game is not balanced. Fair enough. It is a simple system. But not being balanced is one thing – being tilted and scewed, rigged, is another thing.

I can not imagine that my suggested house rules are worse than the original rules.


These house rules make some characters weaker (those wo relied on heavy armor and shield) and some stronger (those with high dexterity). Perhaps monsters, beasts and encounters need to be checked and balanced.

I think it is often quite unclear in the rules what happens if skills are raised belong level 1. I could imagine that skill levels above 1 in for example Fencing could give either 1D or +1 damage.

The rules for multiple opponents are dangerous for the lonely champion. In non-combat coooperation lets one character add half the dice from another character. But in combat each champion makes a full attack against the same target, who has to divide his defence dice in three pools.

The number of dice gets quite high for no particular purpose. Each champion rolling 5-6 dice just to see if he gets a better result than someone else rolling even more dice… it makes not so much sense. I could imagine that if both champions have many dice, the dice are distributed over several rounds. Instaead of 7vs9 twice, it could be 3vs4 and 4vs5. That could add a tactical element as well (spending dice fast for an all out attack, for example).

Perhaps my thoughts about multiple opponents and multiple rounds could be combined.

Fantasy! 3.0 Errata?

Jag fick Fantasy! 3.0 i julklapp och det verkar vara ett charmigt rollspel! Jag har läst igenom reglerna och har några frågor som jag inte direkt hittar svar på.

Eventuellt finns vissa svar i de äldre, startreglerna.

(s17) Vandrande Riddare har totalt 17 egenskapspoäng (alla andra har 15). Vad är rätt egenskaper (eller ska det vara 17 av någon anledning)?

(s24) Smyga – är det verkligen ett Fysikslag?
(startreglerna säger också Fysikslag s23, men Smidighet finns inte alls)

(s26) Rollpersonskonstruktion, står att man får 20 egenskapaspoäng att fördela (alla andra har 15).

(s34-35) Ska man slå initiativslag bara i början av striden, eller varje runda?
(startreglerna, s26-27, antyder att det bara är i början av striden)

(s41) Stora vapen: Alla yxor och svärd ger +2. Men ett stort vapen ger bara +1 i litet utrymme. Och ett stort vapen kan inte användas tillsammans med sköld eller ett annat vapen. Finns det någon fördel med att inte bara ha en liten handyxa eller ett litet kortsvärd?
(startreglerna s33 ger svärd och yxa +3, men fortfarande ingen skillnad på en tvåhandsvariant)
(svar på frågan i en tråd jag hittade på ett forum)

(s43) Rustningar absorberar skada, men sköldar ger stridstärningar. Men på s293 står det om dvärgrustningar att de ger 3 tärningar på försvarsslaget. Ger rustningar tärningar, eller har de ABS, eller både ock?
(startreglerna s34 säger att rustningar ger extra tärningar och ABS).

Generellt är det svårt att förstå vad som händer om man har mer än Nivå=1 i en Förmåga. Ex Två Vapen: gör man dubbel extra skada? Får man två försvartärningar?

Recension Stridssystemet

Först ska jag säga att jag skrev ihop alternativa husregler för strid (länk).

Sedan ska jag medge att det är något arrogant av mig att recensera ett stridssystem utan att ha spelat spelet. Men jag har en del erfarenhet, jag vet vad jag gillar och jag vet vad jag inte gillar.

Närstrid, 1 mot 1, följande parametrar är väsentliga:

  • Antal stridstärningar (som kan fördelas som anfall eller försvar)
  • Skada
  • Rustning (ABS, som dras ifrån skada när man träffas)
  • KP (hur mycket skada man kan ta innan man blir medvetslös eller dör.

Jag har skrivit en liten simulator (länk) för strider.

Exempelvis en ULV har ST 9, SK 1T+3, R 2, KP 11

Säg att vi har en rollperson med Fysik 4, Stridsvana, Fäktning och ett svärd:

  • RP 1: ST 8, SK 1T+2, R 0, KP 9

Enligt min simulering har RP1 11% chans att vinna (nu bortser vi från Mana, TKP och ET – de kan vara förbrukade)

Låt oss ger RP 1 en ringbrynja (+2), eller ringbrynja och sköld. Då har vi

  • RP 2: ST 10, SK 1T+2, R 2, KP 9 (ca 30% chans att överleva ULVen)
  • RP 3: ST 13, SK 1T+2, R 2, KP 9 (ca 49% chans)

Hjälm och benskydd ger:

  • RP 4: ST 15, SK 1T+2, R4, KP 9 (ca 79% chans)

Så? Rustning och sköld hjälper? Vadå? Det är väl inte konstigt?

Jo, jag tycker det, jag förstår inte alls hur det är tänkt:

  1. Skillnaden på vapen är väsentligen 0 stridstärningar och 1T för obeväpnad, mot +2 stridstärningar och 1T+2 för rejäla vapen. Skillnaden mellan olika beväpning är alltså 2 tärningar och två skada.
    Skillnaden mellan ingen rustning, och full rustning och sköld, är +7 stridstärningar och 4 i ABS.
    Det spelar alltså mycket större roll vad man har för rustning (och sköld) än vad man har för vapen.
  2. Det finns inga fördelar med ett 2H-vapen istället för en sköld. Ev ska reglerna tolkas som att 2H-vapen har +3 (utom i trånga utrymmen). Så, den som har ett kortsvärd vill nyttja andra handen får alltid 1 extra stridstärning, men med
    2H-vapen: +1 skada
    Sköld: +2 stridstärningar
    Sköld är helt överlägset.
  3. Det finns inga som helst regler om att det är något dåligt med sköld eller rustning.
  4. Den som inte har en tung rustning får inga fördelar alls. Förmågan Ducka är inte villkorad till lätt/ingen rustning. En smidig person kan inte undvika attacker på något vis.
  5. Inte heller med förmågan 2 vapen, är ett vapen i den andra handen på något vis lika bra som en sköld.

Jag tycker att skillnaden på vapen är rimligt liten. Rollfigurens skicklighet är överordnat, utrustningen underordad. Men rustning och sköld!?!

Den spelare som gör en jägare eller tjuv, i sällskap med krigare eller riddare, kommer snart lära sig att sköld och rustning är hela skillnaden, och tröttna eller dö snabbt. Även den som försöker göra en sexig barbar kommer köpa en helrustning till barbaren så fort som möjligt.

Jag tycker detta är det tråkigaste felet med Drakar och Demoner: sköld och rustning betyder allt. I Fantasy! är skillnaden ännu större.

I Dungeons & Dragons (5e) ger sköld +2AC (marginellt, och jämförbart med mer skada på ett större vapen). Hög Dexterity ger AC på samma sätt som en rustning, men hög Dexterity kan inte kombineras med en tung rustning.

Stridssystemet i Fantasy! duger bara om alla spelarna vill spela ungefär samma typ av karaktär, eller om några verkligen accepterar (och dessutom slipper) att bli indragna i närstrid.

Tankar och förslag

Jag måste säga att jag tvekar lite att alls försöka lösa detta. Och jag undrar om någon speltestat med en blandad grupp. Och även om jägare/tjuvar accepterar att hålla sig i bakgrunden, och ingen vill vara halvnaken barbar… på vilket sätt är detta roligt?

Men, spontana tankar:

  • Låt rustningar bara Absorbera, inge extra tärningar
  • Låt hög Smidighet ge extra defensiva försvarstärningar, fast inte i kombination med rustning
  • Nerfa sköld
  • Ta bort hjälm och benskydd (låt dem möjligvis ha något specialskydd mot kritisk skada, eller när man blir medvetslös/död eller nåt)

Men det finns nästan ingenting kvar av stridssystemet efter detta.


Genom att bara läsa reglerna får jag lite blandade känslor inför det här spelet.

Jag kan bara (tyvärr) konstatera att de enkla reglerna verkar ha förändrats från startreglerna till 3.0, utan att ändringarna varken gjorts så tydliga eller passerat korrekturläsningen korrekt.

En del saker verkar verkligen inte speltestat. Eller så ligger det i Old School Gaming att det är upp till spelledaren att bestämma vad som händer när någon får Nivå 2 i Två Vapen. Jag tycker det är konstigt.

Jag är förvånad att man gjort ett spel där rustning och sköld är ännu mer viktigt än i Drakar och Demoner.

Jag förstår att Fantasy! är ett enkelt spel. Det är inte meningen att man ska simulera och optimera. Men då är det inte meningen att man ska behöva göra det heller. Inte balancerat? Nej, ok. Men det behöver ju inte vara uppenbart obalancerat heller.