DEC | NOV | Dec
| 21 |
2007 | 2010 | 2011
20 captures 26 May 01 - 21 Nov 10 |
| Close Help

"); HW.writeln(""); HW.writeln("
How it works
"); HW.writeln("

"); HW.writeln("Conceptually it is very simple, all you do is pick a starting career and then"); HW.writeln("the program stacks further careers on top of that until you have accumulated"); HW.writeln("enough experience points to make you the desired age. The resultant age is"); HW.writeln("variable, even for the same desired age, due to the random career path and the"); HW.writeln("rounding off of skills, hence the age range, not number."); HW.writeln("

"); HW.writeln("

"); HW.writeln("

Specifics
"); HW.writeln("

"); HW.writeln("

"); HW.writeln("
1. Each player is assigned a first 'full' career, along with somewhat"); HW.writeln(" fitting characteristics and Virtues."); HW.writeln("
2. Further 'half' careers are then added, with a 30% chance it will be the"); HW.writeln(" 'half' career for the current career, a 60% chance it will be a career from"); HW.writeln(" the suggested career exit list for the current career, and a 10% chance it"); HW.writeln(" will be a random career. These percentages may vary as some careers may not"); HW.writeln(" be able to be taken, due to age gained or low characteristics. This"); HW.writeln(" process is repeated until the age limit is reached."); HW.writeln("
3. Each career adds experience points, and after reaching the desired age,"); HW.writeln(" these are turned into scores. Obviously this may leave extra experience"); HW.writeln(" points which are randomly reassigned to other fractional skills."); HW.writeln("
4. The character's age is then adjusted to take account of any rounding of"); HW.writeln(" skills that has occurred, and Virtues such as Educated."); HW.writeln("
5. The grog is then aged if needed. If this process results in a"); HW.writeln(" death, it is repeated until a differing result is obtained."); HW.writeln("
6. Finally, weapons are assigned and armour based on the load of the weapon"); HW.writeln(" for which the character has the highest skill."); HW.writeln("

"); HW.writeln("

"); HW.writeln("

Careers
"); HW.writeln("

"); HW.writeln("

"); HW.writeln("
1. Each career consists of a number of skills, suggested characteristics,"); HW.writeln(" combat class, suggested"); HW.writeln(" Virtues, excluded Flaws, minimum characteristics and a series of suggested exit"); HW.writeln(" careers. "); HW.writeln("
2. For each skill, there are two numbers of experience points gained,"); HW.writeln(" those for a 'full' career and a 'half' career. The only time a grog goes"); HW.writeln(" through the 'full' career is the grog's first career. All other careers are"); HW.writeln(" 'half'. "); HW.writeln("
3. The suggested characteristics are split into primary, secondary,"); HW.writeln(" tertiary and other, with characteristics classed as primary having the highest"); HW.writeln(" chance of getting the highest scores, etc."); HW.writeln("
4. Each grog will have a 50% chance of getting the suggested Virtues and no"); HW.writeln(" chance of getting the excluded Flaws. However, some Virtues such as Educated"); HW.writeln(" will alway be chosen for scholars, for example."); HW.writeln("
5. Each career is classed as either combatant or noncombatant and thus if"); HW.writeln(" the grog's first career is a cook, s/he won't be getting Virtues such as"); HW.writeln(" Berserk."); HW.writeln("
6. Some careers have minimum characteristics requirements, for example the"); HW.writeln(" 'Sergeant', which gets the 'Greatweapon' skill, must have a Strength of at least"); HW.writeln(" 0 to wield the easiest greatweapon."); HW.writeln("
7. Each career has a number of suggested exit careers which are more likely"); HW.writeln(" to be chosen than others. Thus the cook is less likely to move straight into"); HW.writeln(" a Sergeant's position."); HW.writeln("

"); HW.writeln("

"); HW.writeln(""); HW.writeln("
"); HW.close(); return; } function SavePage(SaveWindow) { var SW = SaveWindow.document; SW.open("text/html"); SW.writeln("
"); SW.writeln(""); SW.writeln("Saving the Output"); SW.writeln("
"); SW.writeln(""); SW.writeln("

"); SW.writeln("The character sheet(s) for the created grog(s) are output to a new window launched"); SW.writeln("when you press the 'Create Grog' button. These character sheets are not those seen in the"); SW.writeln("back of the rule book, but similar and far easier to create. The actual output"); SW.writeln("is in HTML and is therefore relatively easy to modify once the character begins"); SW.writeln("to increase in skills, age, etc. To save the character sheets, simply goto"); SW.writeln("'Save As' on the 'File' menu and if saved as HTML they can then be easily"); SW.writeln("modified."); SW.writeln("

"); SW.writeln("The character sheets are designed to fill two pages of postscript, although they may"); SW.writeln("overrun sometimes, due to large numbers of abilities for instance - a problem"); SW.writeln("that can be "); SW.writeln("overcome by modifying the HTML code. To help counteract this, the font size for"); SW.writeln("the abilities section changes from 2 to 1 when the number of skills exceeds 22."); SW.writeln("Note that the 'Close' button at the bottom of the output window will appear in"); SW.writeln("both the saved HTML code and postscript. This is of course easily removed from"); SW.writeln("the HTML, or simply not printed from the postscript."); SW.writeln("

"); SW.writeln("
"); SW.writeln("
"); SW.close(); return; } function NewWindow(text) { if ( text == "How" ) { var How = window.open("blank.html","How","toolbar=no,menubar=no,width=700,height=550,resizeable=yes,scrollbars=yes"); HowPage(How); } else if ( text == "Save" ) { var Save = window.open("blank.html","Save","toolbar=no,menubar=no,width=700,height=400,resizeable=yes,scrollbars=yes"); SavePage(Save); } return; } function RollArsStats(career) { // roll the stats according to Andy's +3/-3 rolling system var i,roll1,roll2; var idiv2; var changed = true; var StatsOK = false; var tmpstat; var CareerMin = new Array(); var StatStart; var iroll; StatArray = new Array(8); if ( DefinedCareerPath == null ) { for (i=0;i<8;i++) { if ( Careers[career].MinStats[i] != null ) { CareerMin[CareerMin.length] = Careers[career].MinStats[i]; } } } else { for (i=0;i<8;i++) { if ( DefinedMinStats[i] != null ) { CareerMin[CareerMin.length] = DefinedMinStats[i]; } } } // sort the stats as pairs while ( changed ) { changed = false; for (i=1;i<4;i++) { StatStart = i * 2; if ( ( CareerMin[StatStart] + CareerMin[StatStart+1] ) > ( CareerMin[StatStart-2] + CareerMin[StatStart-1] ) ) { changed = true; tmpstat = CareerMin[StatStart]; CareerMin[StatStart] = CareerMin[StatStart-2]; CareerMin[StatStart-2] = tmpstat; tmpstat = CareerMin[StatStart+1]; CareerMin[StatStart+1] = CareerMin[StatStart-1]; CareerMin[StatStart-1] = tmpstat; } } } while ( ! StatsOK ) { StatsOK = true; // do the rolls; for (i=0;i<4;i++) { StatStart = i * 2; roll1 = rand_int(10); roll2 = rand_int(10); if ( ( roll1 == 0 ) || ( roll2 == 0 ) ) { StatArray[StatStart] = 0; StatArray[StatStart+1] = 0; } else { iroll = roll1 - roll2; iroll /= 2; if ( ( iroll % 1 ) != 0 ) { iroll -= iroll % 1; if ( iroll > 0 ) { StatArray[StatStart] = iroll + 1; StatArray[StatStart+1] = iroll; } else { StatArray[StatStart] = iroll - 1; StatArray[StatStart+1] = iroll; } } else { StatArray[StatStart] = iroll; StatArray[StatStart+1] = iroll; } } } // sort them as pairs changed = true; while ( changed ) { changed = false; for (i=1;i<4;i++) { StatStart = i * 2; if ( ( StatArray[StatStart] + StatArray[StatStart+1] ) > ( StatArray[StatStart-2] + StatArray[StatStart-1] ) ) { changed = true; tmpstat = StatArray[StatStart]; StatArray[StatStart] = StatArray[StatStart-2]; StatArray[StatStart-2] = tmpstat; tmpstat = StatArray[StatStart+1]; StatArray[StatStart+1] = StatArray[StatStart-1]; StatArray[StatStart-1] = tmpstat; } } } // check they are OK as far as the career goes for (i=0;i<4;i++) { StatStart = i * 2; if ( ( CareerMin[StatStart] > StatArray[StatStart] ) || ( CareerMin[StatStart] > StatArray[StatStart+1] ) || ( CareerMin[StatStart+1] > StatArray[StatStart] ) || ( CareerMin[StatStart+1] > StatArray[StatStart+1] ) ) { StatsOK = false; break; } } } return; } function StorePath(form) { var start = parseInt(form.DefinedCareerPath.options[0].value); var Career = parseInt(form.career.options[form.career.selectedIndex].value); var newoption; if ( start == -1 ) // no path defined yet. { form.DefinedCareerPath.options[0].value = Career; form.DefinedCareerPath.options[0].text = CareerNames[Career]; } else { newoption = new Option(""+CareerNames[Career]+"",Career,false,false); newoption.selected = false; form.DefinedCareerPath.options[form.DefinedCareerPath.options.length] = newoption; } return; } function DeletePath(form) { var path = form.DefinedCareerPath.selectedIndex; if ( form.DefinedCareerPath.options.length == 1 ) { ClearPath(form); return; } // as the length of the menu is at least 2, one of the following options will be // true if ( ( form.DefinedCareerPath.selectedIndex + 1 ) != form.DefinedCareerPath.options.length ) { form.DefinedCareerPath.options[form.DefinedCareerPath.selectedIndex+1].selected = true; form.DefinedCareerPath.options[path].selected = false; form.DefinedCareerPath.options[path] = null; } else { form.DefinedCareerPath.options[form.DefinedCareerPath.selectedIndex-1].selected = true; form.DefinedCareerPath.options[path].selected = false; form.DefinedCareerPath.options[path] = null; } return; } function ClearPath(form) { form.DefinedCareerPath.options.length = 1; form.DefinedCareerPath.options[0].value = -1; form.DefinedCareerPath.options[0].text = "None"; return; } //-->

# InstaGrog Program

#### by Phil J Tollinton

The copyright of this article remains with the original author. Articles may be copied or distributed freely for personal non-profit use, provided that the author is properly credited.

Note: The Javascript in this program is unsupported by some older browsers. You may have problems if using browsers earlier than Netscape 3.x / Explorer 4.x - in this case an upgrade is recommended.

Create a grog in seconds!

Version 1.1

Choose a set of stat values: |
Choose your primary career: |
Choose your approximate age range: |
For Random age only, age range: |
Choose an Aging Modifier Class: |
Maximum skill score allowed: |
Number of grogs to generate |
Include encumbrance in combat stats |
Only output information relevant to combat |
Defined Career paths
To add a career, select from the career menu and press 'Store'. To delete a career, select from the 'Defined Career path' menu and press 'Delete'. To delete all selected careers, press 'Clear'.
Defined Career path |

Thanks to Mark Shirley and Graham Pursey for their help, and to Amurgsval for the original idea.

Changes from version 1.0 by Andrew P Smith

If you have any suggestions for new careers, have had problems, or have spotted an undocumented feature, please email the site maintainer at webmaster@durenmar.de.