Here is a csh version of the script. This one was written by Steve Frostrom just to prove it could be done.
#!/bin/csh -f clear if ("$1") then set MAXLEVEL = $1 else set MAXLEVEL = 40 endif set fmt = "%5s %9s %11s %11s %9s %9s\n" printf "$fmt" '' '' 'Class' 'Cross-Class' '' '' printf "$fmt" 'Char' '' 'Skill' 'Skill' '' 'Stat' printf "$fmt" 'Level' 'XP' 'Max Ranks' 'Max Ranks' 'Feats' 'Increases' @ level = 1 @ xp = 0 @ feats = 1 @ stats = 0 while ($level <= $MAXLEVEL) set say_level = $level # sum xp @ xp+= ($level - 1) * 1000 set say_xp = 0 # calc max skill ranks (and print cc with .5) @ maxranks = $level + 3 @ maxcc = $maxranks / 2 if ($maxranks % 2) set maxcc = "${maxcc}.5" # new feat every 3 levels, but start with 1 if ($level == 1) then @ say_feats = 1 else if ($level % 3) then @ say_feats = 0 else @ feats++ set say_feats = $feats endif endif # stat bonus every 4 levels if ($level % 4) then @ say_stats = 0 else @ stats++ @ say_stats = $stats endif # ok, here we have to get nasty foreach say (say_level say_feats say_stats) # note this doesn't set say, it sets the value of say # i.e. say_level, etc... switch (`eval echo \$$say`) case 0: # 0 set $say = "--" breaksw case *0: # *0th, *4-9th, 11-13th case *[4-9]: case 1?: set $say = `eval echo \$$say`th breaksw case *1: # 1st set $say = `eval echo \$$say`st breaksw case *2: # 2nd set $say = `eval echo \$$say`nd breaksw case *3: # 3rd set $say = `eval echo \$$say`rd breaksw endsw end # print the line printf "$fmt" $say_level $say_xp $maxranks $maxcc $say_feats $say_stats @ level++ end # vi: ts=4 sw=4