Character Generator basics

This commit is contained in:
Yord 2015-09-22 11:55:28 +02:00
parent d436aeb286
commit dfb2c91da2

View file

@ -4,297 +4,747 @@ tags: [Character Generator]
--- ---
<style> <style>
div.data label { display: block; }
</style> </style>
<h2>Race</h2>
<div id="generator"> <p>
<h2>Race</h2>
<ol>
<li>
<select id="race"> <select id="race">
<option value="human">Human</option> <option value="empty"></option>
<option value="dwarf">Dwarf</option>
</select> </select>
</li> </p>
</ol> <p id="race-data" class="character-generator-data"></p>
<h2>Archetype</h2> <h2>Caste</h2>
<ol> <p>
<li> <select id="caste">
<option value="empty"></option>
</select>
</p>
<p id="caste-data" class="character-generator-data"></p>
<h2>Archetype</h2>
<p>
<select id="archetype"> <select id="archetype">
<option value="gifted">Gifted</option> <option value="empty"></option>
<option value="mighty">Mighty</option>
</select> </select>
</li> </p>
</ol> <p id="archetype-data" class="character-generator-data"></p>
<h2>Career 1</h2> <h2>Career 1</h2>
<ol> <p>
<li> <select id="career1">
<select> <option value="empty"></option>
<option value="alchemist">Alchemist</option>
<option value="cutthroat">Cutthroat</option>
</select> </select>
</li> </p>
</ol> <p id="career1-data" class="character-generator-data"></p>
<h2>Career 2</h2> <h2>Career 2</h2>
<ol> <p>
<li> <select id="career2">
<select> <option value="empty"></option>
<option value="alchemist">Alchemist</option>
<option value="cutthroat">Cutthroat</option>
</select> </select>
</li> </p>
</ol> <p id="career2-data" class="character-generator-data"></p>
<h2>Choices</h2> <h2>Adventuring Company</h2>
<ol id="choices"> <p>
</ol> <select id="adventuring-company">
<option value="empty"></option>
</select>
</p>
<p id="adventuring-company-data" class="character-generator-data"></p>
</div> <div><a href="javascript:test()">test</a></div>
<script type="text/javascript" src="/static/javascripts/index.js"></script> <script type="text/javascript">
function HeroNumber(key, value) {
this.key = key;
this.value = value;
this.html = function() {
var str = '';
str += '<div class="data">';
str += ' '+this.key+': ';
str += ' <input class="'+this.key+'" type="number" data-type="number" min="'+this.value+'" max="'+this.value+'" value="'+this.value+'" disabled />';
str += '</div>';
return str;
};
}
function number(key, value) {
return new HeroNumber(key, value);
}
function HeroRange(key, min, max) {
this.key = key;
this.min = min;
this.max = max;
this.html = function() {
var str = '';
str += '<div class="data">';
str += ' '+this.key+': ';
str += ' <input class="'+this.key+'" type="number" data-type="number" min="'+this.min+'" max="'+this.max+'" value="'+this.min+'" />';
str += '</div>';
return str;
};
}
function range(key, min, max) {
return new HeroRange(key, min, max);
}
function HeroString(key, value) {
this.key = key;
this.value = value;
this.html = function() {
var str = '';
str += '<div class="data">';
str += ' '+this.key+': ';
str += ' <input class="'+this.key+'" type="text" data-type="text" value="'+this.value+'" disabled />';
str += '</div>';
return str;
};
}
function string(key, value) {
return new HeroString(key, value);
}
function HeroListItem(key, value) {
this.key = key;
this.value = value;
this.html = function() {
var str = '';
str += '<div class="data">';
str += ' '+this.key+': ';
str += ' <input class="'+this.key+'" type="text" data-type="array" value="'+this.value+'" disabled />';
str += '</div>';
return str;
}
}
function listItem(key, value) {
return new HeroListItem(key, value);
}
function HeroList(key, listItems) {
this.key = key;
this.listItems = listItems;
this.html = function() {
var htmls = $.map(this.listItems, function(item) { return listItem(key, item).html(); });
return mkString(htmls, "\n");
}
}
function list(key, listItems) {
return new HeroList(key, listItems);
}
function HeroNumberPair(key, value) {
this.key = key;
this.value = value;
this.html = function() {
return '<option class="'+this.key+'" data-type="number" value="'+this.value+'">'+this.key+': '+this.value+'</option>';
};
}
function numberPair(key, value) {
return new HeroNumberPair(key, value);
}
function numberPairs(key, values) {
return $.map(values, function(value) { return numberPair(key, value); });
}
function HeroArrayPair(key, value) {
this.key = key;
this.value = value;
this.html = function() {
return '<option class="'+this.key+'" data-type="array" value="'+this.value+'">'+this.key+': '+this.value+'</option>';
};
}
function arrayPair(key, value) {
return new HeroArrayPair(key, value);
}
function arrayPairs(key, values) {
return $.map(values, function(value) { return arrayPair(key, value); });
}
function HeroChoices(pairs, label) {
this.pairs = pairs;
this.html = function() {
var str = '';
str += '<div class="data">\n';
if(label) str += ' <label>'+label+':</label>\n';
str += ' <select multiple>\n';
str += mkString($.map(pairs, function(pair) { return pair.html(); }), "\n ", "", "\n");
str += ' </select>\n';
str += '</div>\n';
return str;
};
}
function choices(pairs, label) {
return new HeroChoices(pairs, label);
}
</script>
<script type="text/javascript">
// TODO: All languages
var languages = ["Cygnaran", "Khadoran", "Ordic"];
var races = {
"Blighted Ogrun": [],
"Bog Trog": [],
"Dwarf": [
string("race", "Dwarf"),
number("PHY", 6),
number("SPD", 4),
number("STR", 5),
number("AGL", 3),
number("PRW", 4),
number("POI", 3),
number("INT", 4),
number("PER", 3),
listItem("languages", "Rhulic"),
choices(arrayPairs("languages", languages), "Choose 1"),
range("height", 47, 60),
range("weight", 105, 190),
listItem("abilities", "Load Bearing"),
listItem("connections", "Connection (dwarven clan)")
],
"Efaarit": [],
"Farrow": [],
"Gatorman": [],
"Gobber": [
string("race", "Gobber"),
number("PHY", 4),
number("SPD", 6),
number("STR", 3),
number("AGL", 4),
number("PRW", 4),
number("POI", 3),
number("INT", 3),
number("PER", 3),
listItem("languages", "Gobberish"),
choices(arrayPairs("languages", languages), "Choose 1"),
range("height", 32, 42),
range("weight", 38, 60),
listItem("benefits", "Deft"),
number("DEF racial modifier", 1),
listItem("notes", "Gobbers cannot use great weapons or rifles")
],
"Human (FMF)": [
string("race", "Human"),
number("PHY", 5),
number("SPD", 6),
number("STR", 4),
number("AGL", 3),
number("PRW", 4),
number("POI", 4),
number("INT", 3),
number("PER", 3),
choices(arrayPairs("languages", languages), "Choose 2"),
range("height", 55, 75),
range("weight", 90, 200),
choices([ numberPair("PHY", 1), numberPair("AGL", 1), numberPair("INT", 1) ], "Choose 1")
],
"Human (IKU)": [],
"Iosan": [
string("race", "Iosan"),
number("PHY", 5),
number("SPD", 6),
number("STR", 4),
number("AGL", 3),
number("PRW", 4),
number("POI", 4),
number("INT", 4),
number("PER", 3),
listItem("languages", "Shyr"),
choices(arrayPairs("languages", languages), "Choose 1"),
range("height", 60, 75),
range("weight", 85, 180),
listItem("notes", "begins the game with an additional ability selected from on of the careers")
],
"Nyss (FMF)": [
string("race", "Nyss"),
number("PHY", 5),
number("SPD", 6),
number("STR", 4),
number("AGL", 4),
number("PRW", 4),
number("POI", 4),
number("INT", 3),
number("PER", 3),
listItem("languages", "Aeric"),
choices(arrayPairs("languages", languages), "Choose 1"),
range("height", 62, 77),
range("weight", 95, 195),
list("notes", ["Cannot be an Arcane Mechanik, Arcanist, Gun Mage, or Warcaster",
"Nyss bows/claymores are cheaper at charater creation",
"Gains +1 on Initiative and PER rolls",
"Gains +3 ARM against cold damage",
"Gains -3 ARM against fire damage"])
],
"Nyss (IKU)": [],
"Ogrun": [
string("race", "Ogrun"),
number("PHY", 6),
number("SPD", 5),
number("STR", 6),
number("AGL", 3),
number("PRW", 4),
number("POI", 3),
number("INT", 3),
number("PER", 2),
list("languages", ["Molgur-Og", "Rhulic"]),
choices(arrayPairs("languages", languages), "Choose 1"),
range("height", 82, 105),
range("weight", 330, 500),
listItem("notes", "Can wield two-handed weapons in one hand but suffers -2 on attack rolls")
],
"Pygmy Troll": [],
"Satyxis": [],
"Skorne": [],
"Strider": [],
"Tharn": [],
"Trollkin (FMF)": [
string("race", "Trollkin"),
number("PHY", 6),
number("SPD", 5),
number("STR", 5),
number("AGL", 3),
number("PRW", 4),
number("POI", 2),
number("INT", 3),
number("PER", 3),
listItem("languages", "Molgur-Trul"),
choices(arrayPairs("languages", languages), "Choose 1"),
range("height", 63, 84),
range("weight", 150, 330),
listItem("notes", "Trollkin cannot be Arcane Mechaniks, Arcanists, or Warcasters"),
list("benefits", ["Tough", "Feat: Revitalize"])
],
"Trollkin (IKU)": []
};
var castes = {
"Extoller": [],
"Outcast": [],
"Paingiver": [],
"Slave": [],
"Warrior": [],
"Worker": []
}
var archetypes = {
"Cunning": [],
"Gifted (FMF)": [
string("archetype", "Gifted"),
choices(numberPairs("ARC", [2, 3]), "Focusers start with ARC 2, will weavers with ARC 3"),
choices(arrayPairs("benefits", ["Additional Study", "Combat Caster", "Fast Caster", "Feat: Domninator", "Feat: Powerful Caster", "Feat: Quick Cast", "Feat: Strength of Will", "Magic Sensitivity", "Rune Reader", "Warding Circle"]), "Choose 1")
],
"Gifted (IKU)": [],
"Intellectual": [
string("archetype", "Intellectual"),
choices(arrayPairs("benefits", ["Battlefield Coordination", "Feat: Flawless Timing", "Feat: Prescient", "Feat: Perfect Plot", "Feat: Plan of Action", "Feat: Quick Thinking", "Feat: Unconventional Warfare", "Genius", "Hyper Perception", "Photographic Memory"]), "Choose 1"),
listItem("notes", "friendly models gain +1 on attack and damage rolls if within command range")
],
"Mighty (FMF)": [
string("archetype", "Mighty"),
choices(arrayPairs("benefits", ["Beat Back", "Feat: Back Swing", "Feat: Bounding Leap", "Feat: Counter Charge", "Feat: Invulnerable", "Feat: Revitalize", "Feat: Shield Breaker", "Feat: Vendetta", "Righteous Anger", "Tough"]), "Choose 1"),
listItem("notes", "gains an additional die on melee damage rolls")
],
"Mighty (IKU)": [],
"Skilled (FMF)": [
string("archetype", "Skilled"),
choices(arrayPairs("benefits", ["Ambidextrous", "Cagey", "Deft", "Feat: Defensive Strike", "Feat: Disarm", "Feat: Swashbuckler", "Feat: Untouchable", "Preternatural Awareness", "Sidestep", "Virtuoso"]), "Choose 1"),
listItem("notes", "gains an additional attack")
],
"Skilled (IKU)": []
};
var careers = {
"Alchemist": [
listItem("careers", "Alchemist"),
list("abilities", ["Grenadier", "Poison Resistance"]),
list("military skills", ["Hand Weapon", "Thrown Weapon"]),
list("occupational skills", ["Alchemy", "Medicine"]),
number("gold", 50),
list("gear", ["alchemist's leather", "gas mask", "travelling alchemist's kit", "grenadier's bandolier"]),
list("gear", ["any alchemical grenate", "any alchemical grenate", "any alchemical grenate", "any alchemical grenate", "any alchemical grenate"])
],
"Allegiant": [],
"Arcane Mechanik": [
listItem("careers", "Arcane Mechanik"),
listItem("abilities", "Inscribe Formulae"),
choices(arrayPairs("military skills", ["Hand Weapon", "Rifle"]), "Choose 1"),
list("occupational skills", ["Craft (gunsmithing)", "Craft (metalworking)", "Mechanikal Engineering"]),
list("spells", ["Arcantrik Bolt", "Polarity Shield"]),
number("gold", 50),
listItem("gear", "rune etching kit"),
choices(arrayPairs("gear", ["mechanika weapon", "mechanika suit of armor"]), "Choose 1")
],
"Arcane Tempest Gun Mage": [],
"Arcanist": [],
"Archer": [],
"Aristocrat": [],
"Artillerist": [],
"Ascetic": [],
"Assault Kommando": [],
"Beast Handler": [],
"Blackclad": [],
"Bloodrunner": [],
"Bloodtracker": [],
"Bloodweaver": [],
"Bokor": [],
"Bone Grinder": [],
"Bounty Hunter": [],
"Brigand": [],
"Bushwhacker": [],
"Cataphract": [],
"Chieftain": [],
"Chirurgeon": [],
"Chymist": [],
"Crucible Guard": [],
"Cutthroat": [],
"Cygnaran Warcaster": [],
"Deathstalker": [],
"Doom Reaver": [],
"Duelist": [],
"Exemplar": [],
"Exemplar Errant": [],
"Exemplar Vengar": [],
"Explorer": [],
"Extoller": [],
"Fell Caller": [],
"Fennblade": [],
"Ferox Rider": [],
"Field Mechanik": [],
"Flame Bringers": [],
"Greylord": [],
"Greylord Outrider": [],
"Gun Mage": [],
"Gun Mage of the Amethyst Rose": [],
"Guttersnipe": [],
"Highwayman": [],
"Horseman": [],
"Illuminated Arcanist": [],
"Investigator": [],
"Iron Fang": [],
"Iron Fang Uhlan": [],
"Ironhead": [],
"Khadoran Warcaster": [],
"Knight": [],
"Kriel Champion": [],
"Labor Korune": [],
"Llaelese Warcaster": [],
"Long Rider": [],
"Mage Hunter": [],
"Man-at-Arms": [],
"Man-O-War": [],
"Man-O-War Drakhun": [],
"Marine": [],
"Maritime Order of the Trident Arcanist": [],
"Military Officer": [],
"Mist Speaker": [],
"Monster Hunter": [],
"Mortitheurge": [],
"Nihilator": [],
"Nomad": [],
"Ordic Warcaster": [],
"Paladin": [],
"Pirate": [],
"Pistoleer": [],
"Praetorian": [],
"Priest of Cyriss": [],
"Priest of Menoth": [],
"Priest of Morrow": [],
"Priest of Nyssor": [],
"Protectorate Warcaster": [],
"Pugilist": [],
"Raider": [],
"Ranger": [],
"Raptor": [],
"Ravager": [],
"Reclaimer": [],
"Rhulic 'Jack Marshal": [],
"Rhulic Field Mechanik": [],
"Rhulic Warcaster": [],
"Rifleman": [],
"Ryssovass": [],
"Scout": [],
"Scrutator": [],
"Searforge Trader": [],
"Seeker": [],
"Shaman (Devourer Wurm)": [],
"Shaman (Dhunia)": [],
"Slaughterhouser": [],
"Soldier": [],
"Sorcerer (Fire) (FMF)": [],
"Sorcerer (Fire) (IKU)": [],
"Sorcerer (Ice) (FMF)": [],
"Sorcerer (Ice) (IKU)": [],
"Sorcerer (Stone) (FMF)": [],
"Sorcerer (Stone) (IKU)": [],
"Sorcerer (Storm) (FMF)": [],
"Sorcerer (Storm) (IKU)": [],
"Spy": [],
"Storm Lance": [],
"Stormblade": [],
"Stormguard": [],
"Stormsmith": [],
"Tempest Blazer": [],
"Thamarite Advocate": [],
"Thief": [],
"Tormentor": [],
"Trencher": [],
"Trencher Commando": [],
"Tyrant": [],
"Urban Nomad": [],
"Vassal of Menoth": [],
"Venator": [],
"Warcaster": [],
"Warcaster, Cyriss": [],
"Warlock, Circle": [],
"Warlock, Farrow": [],
"Warlock, Legion": [],
"Warlock, Swamp": [],
"Warlock, Trollkin": [],
"Warlock: Skorne": [],
"Warmonger": [],
"Warrior": [],
"Wolf of Orboros": [],
"Wolf Rider": [],
"Wyrmwall Bruiser": [],
"Wyrmwall Rider": [],
"Wyrmwall Veteran": []
};
var adventuringCompanies = {
"Agents of the Crucible": [],
"Arcane Order": [],
"Army of the Western Reaches": [],
"Beast Hunters": [],
"Bonded Porters": [],
"Bone Grinder Hunting Party": [],
"Caspian Cortex Smugglers": [],
"Circle Orboros Conclave": [],
"Crusaders": [],
"Farrow Tribe": [],
"Five Fingers Transporters": [],
"Fringe Cultists": [],
"Gatorman Tribe": [],
"Greylords": [],
"Heroes of the Resistance": [],
"House Taberna": [],
"Idrian Tribe": [],
"Illuminated Ones": [],
"Intrepid Investigators": [],
"Khadoran Military Detail": [],
"Korsk Stanzynat Mustyn": [],
"Law Dogs": [],
"Mercenary Charter": [],
"Mystics": [],
"Nobile Exiles": [],
"Nomads": [],
"Northkin Kriel": [],
"Nyss Refugees": [],
"Ordic Naval Expedition": [],
"Outlaws": [],
"Pirates of the Broken Cost": [],
"Raiders": [],
"Renegades": [],
"Soldiers of Fortune": [],
"Spy Ring": [],
"Thamarite Sept": [],
"Tharn Tuath": [],
"The Inner Circle": [],
"United Kriels": [],
"Unlikely Heroes": [],
"Unorthodox Engagement Team": [],
"Wilderness Expedition": [],
"Wilderness Kriel": []
}
</script>
<script type="text/javascript">
function addOption(selector) {
return function(key, value) {
if(value.length > 0) {
var html = $(selector).html();
$(selector).html(html+'\n<option value="'+key+'">'+key+'</option>');
}
}
}
$.each(races, addOption("#race"));
$.each(castes, addOption("#caste"));
$.each(archetypes, addOption("#archetype"));
$.each(careers, addOption("#career1"));
$.each(careers, addOption("#career2"));
$.each(adventuringCompanies, addOption("#adventuring-company"));
</script>
<script type="text/javascript"> <script type="text/javascript">
// global // global
// var ikrpg // var ikrpg
var ikrpg = ikrpg || {}; var ikrpg = ikrpg || {};
function ch00se(number, choices, description) {
return function() {
var li = "";
li += "<li><select>"
choices.forEach(function(choice) {
'<option value="alchemist">Alchemist</option>' //(function () {
'<option value="cutthroat">Cutthroat</option>'
});
li += "</select></li>"
$("#choices").append(li);
};
}
(function () {
//'use strict'; //'use strict';
// helpers function hero() {
return {
function eq(a) { "race": "",
return function(elem) { return elem == a; }; "PHY": 0,
} "SPD": 0,
"STR": 0,
function is_in(array) { "AGL": 0,
return function(elem) { return array.some(eq(elem)); }; "PRW": 0,
} "POI": 0,
"INT": 0,
function add(a) { "PER": 0,
return function(b) { return a + b; }; "DEF racial modifier": 0,
} "languages": [],
"height": 0,
function become(a) { "weight": 0,
return function(b) { return a; }; "archetype": "",
} "benefits": [],
"careers": [],
function append(a) { "abilities": [],
return function(array) { return array.concat([a]); }; "connections": [],
} "military skills": [],
"occupational skills": [],
function concat(array1) { "spells": [],
return function(array2) { return array1.concat(array2); }; "gear": [],
} "gold": 0,
"notes": []
function add_all(new_obj) {
return function(old_obj) {
for(var key in new_obj) {
if(!old_obj[key]) old_obj[key] = 0;
old_obj[key] = old_obj[key] + new_obj[key];
}
return old_obj;
}; };
} }
function take_best(new_obj) { function test() {
return function(old_obj) { var data = hero();
for(var key in new_obj) {
if(!old_obj[key]) old_obj[key] = new_obj[key]; $(".character-generator-data input, .character-generator-data option:selected").each(function(index, entry) {
else if(old_obj[key] < new_obj[key]) old_obj[key] = new_obj[key]; var elem = $(entry);
var clazz = elem.attr("class");
var value = elem.val();
var type = elem.attr("data-type");
switch(type) {
case "number":
if(!data[clazz]) data[clazz] = parseInt(value);
else data[clazz] += parseInt(value);
break;
case "array":
if(!data[clazz]) data[clazz] = [value];
else data[clazz].push(value);
break;
default:
data[clazz] = value;
} }
return old_obj; });
};
console.log(data);
} }
// type can be: "one of"
function choices(amount, choices, description) { function mkString(array, between, before, after) {
// TODO var str = "";
if(before) str += before;
if(array.length > 0) {
str += array.slice(0, 1);
$.each(array.slice(1, array.length), function(index, entry) {
if(between) str += between;
str += entry;
});
}
if(after) str += after;
return str;
} }
function choose(number, property, choices, modifier, description) {
// TODO
}
// choices: [[1, "PHY", add], ["Llaelese", "languages", append], ...] function lookupAndFillOut(selectSelector, dataSelector, data) {
return function(event) {
$(dataSelector).html("");
var option = $(selectSelector).val();
if(data[option]) {
// data var stuff = data[option];
$(dataSelector).html("");
var all_archetypes = ikrpg.index.data.reduce(function(acc, obj) { $.each(stuff, function(index, entry) {
return obj["category"] == "Character Creation" && obj["subcategory"] == "Archetype" ? acc.concat([obj["name"]]) : acc; var html = $(dataSelector).html();
}, []); $(dataSelector).html(html+"\n"+entry.html());
});
var all_levels = ["hero", "veteran", "epic"]; } else {
// TODO: option does not exist!
var all_races = ikrpg.index.data.reduce(function(acc, obj) {
return obj["category"] == "Character Creation" && obj["subcategory"] == "Race" ? acc.concat([obj["name"]]) : acc;
}, []);
var all_careers = ikrpg.index.data.reduce(function(acc, obj) {
return []; // TODO obj["category"] == "Character Creation" && ["Career", "Career Option"].some(obj["subcategory"]) ? acc.concat([obj["name"]]) : acc;
}, []);
var all_languages = [
"Aeric", "Caspian", "Cygnaran", "Gobberish", "Idrian", "Khadoran", "Khurzic", "Kossite", "Llelese",
"Molgur", "Molgur-Og", "Molgur-Trul", "Morridane", "Ordic", "Rhulic", "Satyx", "Scharde", "Shyr",
"Sulese", "Telgesh", "Thurian", "Umbrean"
];
var races = {
"Human": {
race: become("Human"),
PHY: add(5),
SPD: add(6),
STR: add(4),
AGL: add(3),
PRW: add(4),
POI: add(4),
INT: add(3),
ARC: add(0),
PER: add(3),
choices: [
ch00se(2, all_languages.map(function(lang) { return [lang, "languages", append]; }), "Choose two languages:"),
ch00se(1, [ [1, "PHY", add], [1, "AGL", add], [1, "INT", add] ], "Choose one additional stat:")
],
choices: [
choices(1, [ choose(2, "languages", all_languages, append, "Choose two languages:") ], "Choose one of the following:"),
choices(1, [ choose(1, "PHY", [1], add, "Choose 1 PHY."), choose(1, "AGL", [1], add), choose(1, "INT", [1], add) ])
],
constraints: [
[function(hero) { return hero.archetypes.every(is_in(["Gifted", "Intellectual", "Mighty", "Skilled"])); }, "Archetype must be one of: Gifted, Intellectual, Mighty, Skilled."],
[function(hero) { return hero.level == "hero" && hero.PHY <= 7; }, "Hero level for PHY can be at most 7."],
[function(hero) { return hero.level == "veteran" && hero.PHY <= 8; }, "Veteran level for PHY can be at most 8."],
[function(hero) { return hero.level == "epic" && hero.PHY <= 8; }, "Epic level for PHY can be at most 8."],
[function(hero) { return hero.level == "hero" && hero.SPD <= 7; }, "Hero level for SPD can be at most 7."],
[function(hero) { return hero.level == "veteran" && hero.SPD <= 7; }, "Veteran level for SPD can be at most 7."],
[function(hero) { return hero.level == "epic" && hero.SPD <= 7; }, "Epic level for SPD can be at most 7."],
[function(hero) { return hero.level == "hero" && hero.STR <= 6; }, "Hero level for STR can be at most 6."],
[function(hero) { return hero.level == "veteran" && hero.STR <= 7; }, "Veteran level for STR can be at most 7."],
[function(hero) { return hero.level == "epic" && hero.STR <= 8; }, "Epic level for STR can be at most 8."],
[function(hero) { return hero.level == "hero" && hero.AGL <= 5; }, "Hero level for AGL can be at most 5."],
[function(hero) { return hero.level == "veteran" && hero.AGL <= 6; }, "Veteran level for AGL can be at most 6."],
[function(hero) { return hero.level == "epic" && hero.AGL <= 7; }, "Epic level for AGL can be at most 7."],
[function(hero) { return hero.level == "hero" && hero.PRW <= 5; }, "Hero level for PRW can be at most 5."],
[function(hero) { return hero.level == "veteran" && hero.PRW <= 6; }, "Veteran level for PRW can be at most 6."],
[function(hero) { return hero.level == "epic" && hero.PRW <= 7; }, "Epic level for PRW can be at most 7."],
[function(hero) { return hero.level == "hero" && hero.POI <= 5; }, "Hero level for POI can be at most 5."],
[function(hero) { return hero.level == "veteran" && hero.POI <= 6; }, "Veteran level for POI can be at most 6."],
[function(hero) { return hero.level == "epic" && hero.POI <= 7; }, "Epic level for POI can be at most 7."],
[function(hero) { return hero.level == "hero" && hero.INT <= 5; }, "Hero level for INT can be at most 5."],
[function(hero) { return hero.level == "veteran" && hero.INT <= 6; }, "Veteran level for INT can be at most 6."],
[function(hero) { return hero.level == "epic" && hero.INT <= 7; }, "Epic level for INT can be at most 7."],
[function(hero) { return hero.level == "hero" && hero.ARC <= 4; }, "Hero level for ARC can be at most 4."],
[function(hero) { return hero.level == "veteran" && hero.ARC <= 6; }, "Veteran level for ARC can be at most 6."],
[function(hero) { return hero.level == "epic" && hero.ARC <= 8; }, "Epic level for ARC can be at most 8."],
[function(hero) { return hero.level == "hero" && hero.PER <= 5; }, "Hero level for PER can be at most 5."],
[function(hero) { return hero.level == "veteran" && hero.PER <= 6; }, "Veteran level for PER can be at most 6."],
[function(hero) { return hero.level == "epic" && hero.PER <= 7; }, "Epic level for PER can be at most 7."],
]
} }
}; };
}
var archetypes = { $("#race").change(lookupAndFillOut("#race", "#race-data", races));
//"Gifted": { $("#caste").change(lookupAndFillOut("#caste", "#caste-data", castes));
// archetype: become("Gifted"), $("#archetype").change(lookupAndFillOut("#archetype", "#archetype-data", archetypes));
// "possible benefits": concat(["Additional Studies", "Combat Caster", "Fast Caster", "Feat: Dominator", "Feat: Powerful Caster", "Feat: Quick Cast", "Feat: Strength of Will", "Magic Sensitivity", "Rune Reader", "Warding Circle"]), $("#career1").change(lookupAndFillOut("#career1", "#career1-data", careers));
// $("#career2").change(lookupAndFillOut("#career2", "#career2-data", careers));
// choices: [ $("#adventuring-company").change(lookupAndFillOut("#adventuring-company", "#adventuring-company-data", adventuringCompanies));
// choices(1, [ choose(1, "benefits", archetypes["Gifted"]["possible benefits"]([]), append) ])
// ],
//
// constraints: [
// [function(hero) { return hero.benefits.every(is_in(hero["possible benefits"])); }, ""]
// ]
//}
};
var careers = {
//"Alchemist": {
// careers: append("Alchemist"),
// abilities: concat(["Grenadier", "Poison Resistance"]),
// "military skills": add_all({ "Hand Weapon": 1, "Thrown Weapon": 1 }),
// "occupational skills": add_all({ "Alchemy": 1, "Medicine": 1 }),
// "gold coins": add(50),
// "starting assets": concat(["alchemist's leather", "gas mask", "traveling alchemist's kit, any five alchemical grenades", "grenadier's bandolier"]),
// "possible abilities": concat(["Bomber", "Brew Master", "Fast Cook", "Field Alchemist", "Fire in the Hole!", "Free Style", "Grenadier", "Poison Resistance"]),
// "possible connections": append("alchemical order"),
// "possible military skills": take_best({ "Hand Weapon": 2, "Thrown Weapon": 4, "Unarmed Combat": 2 }),
// "possible occupational skills": take_best({ "Alchemy": 4 }) // CONTINUE HERE WITH CRAFT(ANY)
//}
};
// generator // generator
ikrpg.generator = { ikrpg.generator = {
hero: { //hero: {
race: "", // race: "",
archetype: "", // PHY: 0,
careers: [], // SPD: 0,
level: "hero", // STR: 0,
PHY: 0, // AGL: 0,
SPD: 0, // PRW: 0,
STR: 0, // POI: 0,
AGL: 0, // INT: 0,
PRW: 0, // ARC: 0,
POI: 0, // PER: 0,
INT: 0, // //archetype: "",
ARC: 0, // //careers: [],
PER: 0, // //level: "hero",
languages: [], // //languages: [],
"possible benefits": [], // //benefits: [],
benefits: [], // //careers: [],
careers: [], // //abilities: [],
"possible abilities": [], // //"military skills": {},
abilities: [], // //connections: [],
"possible military skills": {}, // //"occupational skills": {},
"military skills": {}, // //"gold coins": 0,
"possible connections": [], // //"starting assets": []
connections: [], //}
"possible occupational skills": {},
"occupational skills": {},
"gold coins": 0,
"starting assets": [],
constraints: [
//[function(hero) { return is_in(all_races)(hero.race); }, "Hero race must be one of: "+all_races.join(", ")+"."],
//[function(hero) { return is_in(all_archetypes)(hero.archetype); }, "Hero archetype must be one of: "+all_archetypes.join(", ")+"."],
//[function(hero) { return hero.careers.every(is_in(all_careers)); }, "Hero careers must be in: "+all_careers.join(", ")+"."],
//[function(hero) { return is_in(all_levels)(hero.level); }, "Hero level must be one of: "+all_levels.join(", ")+"."],
//// all_benefits
//// Ability level constraint (hero -> 2, veteran -> 3, epic -> 4)
]
}
}; };
})(); //})();
</script> </script>