"); 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.