PDA

View Full Version : 'Organic' yet Equal Stat Generation



Reinboom
2008-01-31, 04:34 PM
Another stat generation idea that came up.
Start with a base number in a stat, such as 6. Every stat has at least this.
Roll a pool of d6s, such as 36d6.
For each 1, add one to the 1st number.
For each 2, add one to the 2nd number.
etc.

Reroll all dice that would increase a stat above 18.

This guarantees that all players have an equal number of 'total stats', yet, they are decidedly random.

To further this, an idea provided by Kyace:
Once you are finished rolling your selection, you get 10 stat points you can distribute based on the rules outlined in the DMG.
This shows both a random development, background, etc. Yet still allows a character to build in "focused training", and customize a bit.

Of course, this idea suffers the problem of it takes too freaking long to roll.

So, I also offer you this:
Stat Placer (http://pifro.com/dnd/NEW/statta.php)

Lord Iames Osari
2008-01-31, 04:39 PM
Oooo, cool.

RS14
2008-01-31, 06:43 PM
I've used a similar system, but using the point-buy values so that a high score reduces others at more than a one to one rate. Because the scores are un-optimized under these systems, I think it's probably better to use slightly larger Point-buy values than are normal. Also don't forget to re-roll if no scores are above 13, as this is a possibility. I've spoilered the Java code for it, if anyone cares.


//Stat Generator
public class statRoller{
static int targetValue=-31;
static int currentValue=0;
public static void main(String[] args){
int[] ability=new int[6];
while(!(targetValue>=-30&&targetValue<=96)){
System.out.println("Please give a target value (from -30 to 96) to balance the ability arrays against.");
targetValue=TextIO.getInt();
}
System.out.println("__");
for(int i=0;i<6;i++){
ability[i]=fourDSixDropLowest();
}
do{
currentValue=0;
for(int i=0;i<6;i++){
currentValue=currentValue+getPrice(ability[i]);
}
int a=-1;
if(currentValue==targetValue){
a=0;
}
else if(currentValue<targetValue){
a=1;
}
int b=(int)(Math.random()*6);
if(ability[b]>3&&ability[b]<18){
ability[b]=ability[b]+a;
}
}
while(currentValue!=targetValue);
for(int i=0;i<6;i++){
System.out.println(ability[i]);
}

}

static int getPrice(int score){
switch(score){
case 3:
return -5;
case 4:
return -4;
case 5:
return -3;
case 6:
return -2;
case 7:
return -1;
case 8:
return 0;
case 9:
return 1;
case 10:
return 2;
case 11:
return 3;
case 12:
return 4;
case 13:
return 5;
case 14:
return 6;
case 15:
return 8;
case 16:
return 10;
case 17:
return 13;
case 18:
return 16;
default:
}
return 0;
}

static int fourDSixDropLowest(){
int[] dice=new int[4];
for(int j=0;j<4;j++){
dice[j]=(int)(Math.random()*6) + 1;
}
int lowest=7;
for(int j=0;j<4;j++){
if(dice[j]<lowest){
lowest=dice[j];
}
}
return dice[0]+dice[1]+dice[2]+dice[3]-lowest;
}
}

This uses the TextIO class from Introduction to Programming Using Java because I've never bothered to learn the language well enough to use the built in IO.
http://math.hws.edu/javanotes/source/TextIO.java