diff --git a/lang/en.json b/lang/en.json
index 75f7569..2b092f0 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -1,6 +1,8 @@
{
"Mosh.Add": "Add",
"Mosh.AddOr":"Add Or",
+ "Mosh.AddOption":"Add Option",
+ "Mosh.AddGroup":"Add Group",
"Mosh.AddASkill": "Add a Skill?",
"Mosh.Advantage": "Advantage",
"Mosh.AllStatsAndSavesDecreasedBy": "All stats and saves decreased by",
@@ -37,7 +39,9 @@
"Mosh.CharacterGenerator.SkillOption.PopupTrainedDescription": "Choose 1 Trained skill",
"Mosh.CharacterGenerator.SkillOption.PopupExpertDescription": "Choose 1 Expert skill",
"Mosh.CharacterGenerator.SkillOption.PopupMasterDescription": "Choose 1 Master skill",
+ "Mosh.CharacterGenerator.SkillOption.PopupFullMasterName": "Master Set",
"Mosh.CharacterGenerator.SkillOption.PopupFullMasterDescription": "Choose 1 Master skill, and an Expert and Trained Skill prerequisite.",
+ "Mosh.CharacterGenerator.SkillOption.PopupFullExpertName": "Expert Set",
"Mosh.CharacterGenerator.SkillOption.PopupFullExperDescription": "Choose 1 Expert skill, and Trained Skill prerequisite.",
"Mosh.CharacterGenerator.SkillOption.ChoiceWord": "Option",
"Mosh.CharacterGenerator.SkillOption.ChoiceText":"Choose 1 from these skill bonus options",
@@ -47,6 +51,8 @@
"Mosh.CharacterGenerator.Table.Trinket": "Trinket Table",
"Mosh.CharacterGenerator.Error.NoClass": "You need to select a class first.",
"Mosh.CLASS": "CLASS",
+ "Mosh.classNewStatOptionEmptyError":"You must select at least two stat or saves",
+ "Mosh.classNewSkillOptionSkillTip":"Save first.",
"Mosh.Combat": "Combat",
"Mosh.Condition": "Condition",
"Mosh.Cost": "Cost",
@@ -69,6 +75,8 @@
"Mosh.DeleteItem": "Delete Item",
"Mosh.DeleteSkill": "Delete Skill",
"Mosh.DeleteWeapon": "Delete Weapon",
+ "Mosh.DeleteGroup": "Delete Group",
+ "Mosh.DeleteOption": "Delete Option",
"Mosh.Description": "Description",
"Mosh.Disabled": "Disabled",
"Mosh.Disadvantage": "Disadvantage",
@@ -152,7 +160,8 @@
"Mosh.Skills": "Skills",
"Mosh.SkillsFixed": "Fixed Skills",
"Mosh.SkillsPrerequisite": "Prerequisite Skills",
- "Mosh.SkillsOptional": "Optional Skills",
+ "Mosh.SkillsOptionalAnd": "Selected Skills",
+ "Mosh.SkillsOptionalOr": "Optional Skills",
"Mosh.SkillTraining": "Skill Training",
"Mosh.SpecialAbilities": "Special Abilities",
"Mosh.Speed": "Speed",
diff --git a/module/item/class-sheet.js b/module/item/class-sheet.js
index e1676e8..1365afd 100644
--- a/module/item/class-sheet.js
+++ b/module/item/class-sheet.js
@@ -29,28 +29,36 @@ export class MothershipClassSheet extends MothershipItemSheet {
if (typeof data.system.base_adjustment.skills_granted == 'undefined'){
data.system.base_adjustment.skills_granted=[];
}
+
+ //Create placeholder for the skills object, to get the info of the skill
data.system.base_adjustment.skills_granted_object = [];
for (const skill of data.system.base_adjustment.skills_granted){
- if(Array.isArray(skill)){
- let option_skills = [];
- for (const option of skill){
- option_skills.push(await fromUuid(option));
- }
- data.system.base_adjustment.skills_granted_object.push(option_skills);
- }else{
data.system.base_adjustment.skills_granted_object.push(await fromUuid(skill));
- }
};
-
+ console.log(data.system.selected_adjustment.choose_skill_or);
+ let choose_skill_or = data.system.selected_adjustment.choose_skill_or;
+ for (const [ig, group] of choose_skill_or.entries()){
+ for (const [io, option] of group.entries()){
+ let names = [];
+ data.system.selected_adjustment.choose_skill_or[ig][io].from_list_names = [];
+ for(const [is, skill] of option.from_list.entries()){
+ names.push((await fromUuid(skill)).name);
+ }
+ data.system.selected_adjustment.choose_skill_or[ig][io].from_list_names = names;
+ }
+ console.log(data.system.selected_adjustment.choose_skill_or);
+ }
+
data.system.common_skills_object = [];
for (const skill of data.system.common_skills){
data.system.common_skills_object.push(await fromUuid(skill));
};
+ /*
if (typeof data.system.selected_adjustment.choose_stat.stats == 'undefined'){
data.system.selected_adjustment.choose_stat.stats=[];
- }
+ }*/
data.enriched=[];
data.enriched.description = await TextEditor.enrichHTML(data.system.description, {async: true});
@@ -64,13 +72,11 @@ export class MothershipClassSheet extends MothershipItemSheet {
if (droppedUuid.type != "Item"){
return;
}
- console.log(event);
- console.log(event.currentTarget);
- console.log(event.target);
- console.log(event.target.parentNode);
+
const droppedObject = await fromUuid(droppedUuid.uuid);
if (droppedObject.type == "skill"){
//todo: add a check if the skill already exist in the list and dont add it, (by id or by name?)
+ console.log(event.currentTarget.id);
if(event.currentTarget.id == "skills.fixed"){
let parent_fixed_or = event.target.closest('div[id="skills.fixed.or"]');
@@ -94,6 +100,20 @@ export class MothershipClassSheet extends MothershipItemSheet {
this.object.update({"system.common_skills":skills});
return this.render(false);
}
+ else if(event.currentTarget.id =="choose_skill_or_li"){
+ const li = $(ev.currentTarget);
+ let index = li.data("itemId");
+ const parent = $(ev.currentTarget).parents(".items-list");
+ let parent_index = parent.data("itemId");
+
+ let options = this.object.system.selected_adjustment.choose_skill_or;
+
+ options[parent_index][index].from_list.push(droppedObject.uuid);
+
+ this.object.update({"system.selected_adjustment.choose_skill_or":options});
+ return this.render(false);
+
+ }
}
}
@@ -107,18 +127,7 @@ export class MothershipClassSheet extends MothershipItemSheet {
const li = $(ev.currentTarget).parents(".item");
let skills = this.object.system.base_adjustment.skills_granted.filter(function( obj ) {
-
- if(Array.isArray(obj)){
- let found = false;
- for (const option of obj){
- if (option === li.data("itemId")){
- found = true;
- }
- }
- return !found;
- }else{
return obj !== li.data("itemId");
- }
});
this.object.update({"system.base_adjustment.skills_granted":skills});
return this.render(false);
@@ -135,24 +144,95 @@ export class MothershipClassSheet extends MothershipItemSheet {
return this.render(false);
});
- html.find('.stat-delete').click(ev => {
+ html.find('.stat-option-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item");
- let stats = this.object.system.selected_adjustment.choose_stat.stats.filter(function( obj ) {
- return obj !== li.data("itemId");
- });
- this.object.update({"system.selected_adjustment.choose_stat.stats":stats});
+ let stats = this.object.system.selected_adjustment.choose_stat;
+ stats.splice(li.data("itemId"),1);
+
+ this.object.update({"system.selected_adjustment.choose_stat":stats});
return this.render(false);
});
- html.find('.stat-create').click(this._onStatCreate.bind(this));
- html.find('div[id="skill-create-or-option"]').click(ev => {
- let skills = this.object.system.base_adjustment.skills_granted;
- //add new empty or option
- skills.push([]);
- this.object.update({"system.base_adjustment.skills_granted":skills});
- return this.render(false);
- });
+
+ html.find('.stat-option-add').click(this._onStatCreate.bind(this));
+
+
+ html.find('.skills-group-add').click(ev => {
+ let skills = this.object.system.selected_adjustment.choose_skill_or;
+ let new_group = []
+ skills.push(new_group);
+ this.object.update({"system.selected_adjustment.choose_skill_or":skills});
+ return this.render(false);
+ });
+ html.find('.skills-group-delete').click(ev => {
+ const li = $(ev.currentTarget).parents(".items-list");
+
+ let options = this.object.system.selected_adjustment.choose_skill_or;
+ options.splice(li.data("itemId"),1);
+
+ this.object.update({"system.selected_adjustment.choose_skill_or":options});
+ return this.render(false);
+ });
+
+ html.find('.skills-group-option-delete').click(ev => {
+ const li = $(ev.currentTarget).parents(".item");
+ const liparent = li.parents(".items-list");
+
+ let options = this.object.system.selected_adjustment.choose_skill_or;
+ options[liparent.data("itemId")].splice(li.data("itemId"),1);
+
+ this.object.update({"system.selected_adjustment.choose_skill_or":options});
+ return this.render(false);
+ });
+
+ html.find('.skills-group-option-createnew').click(ev => {
+ const li = $(ev.currentTarget).parents(".item");
+
+ let new_data = {
+ "name":li.find('input[name="choose_skill_or_name"]').prop("value"),
+ "trained": li.find('input[name="choose_skill_or_trained"]').prop("value"),
+ "expert": li.find('input[name="choose_skill_or_expert"]').prop("value"),
+ "expert_full_set": li.find('input[name="choose_skill_or_expert_full_set"]').prop("value"),
+ "master": li.find('input[name="choose_skill_or_master"]').prop("value"),
+ "master_full_set": li.find('input[name="choose_skill_or_master_full_set"]').prop("value"),
+ "from_list": [],
+ }
+ if(new_data.name ==""){
+ new_data.name = `Option: ${(this.object.system.selected_adjustment.choose_skill_or[li.data("itemId")].length)+1}`
+ }
+ if(new_data.trained ==""){
+ new_data.trained = 0;
+ }
+ if(new_data.expert ==""){
+ new_data.expert = 0;
+ }
+ if(new_data.expert_full_set ==""){
+ new_data.expert_full_set = 0;
+ }
+ if(new_data.master ==""){
+ new_data.master = 0;
+ }
+ if(new_data.master_full_set ==""){
+ new_data.master_full_set = 0;
+ }
+ //console.log(new_data);
+ let options = this.object.system.selected_adjustment.choose_skill_or;
+ options[li.data("itemId")].push(new_data);
+
+ //save data
+ this.object.update({"system.selected_adjustment.choose_skill_or":options});
+
+ //clear form and hide it
+ li.find('input[name="choose_skill_or_name"]').prop("value","");
+ li.find('input[name="choose_skill_or_trained"]').prop("value","");
+ li.find('input[name="choose_skill_or_expert"]').prop("value","");
+ li.find('input[name="choose_skill_or_expert_full_set"]').prop("value","");
+ li.find('input[name="choose_skill_or_master"]').prop("value","");
+ li.find('input[name="choose_skill_or_master_full_set"]').prop("value","");
+
+ return this.render(false);
+ });
}
@@ -164,47 +244,59 @@ export class MothershipClassSheet extends MothershipItemSheet {
*/
_onStatCreate(event) {
event.preventDefault();
- let stats = this.object.system.selected_adjustment.choose_stat.stats;
+ let choose_stat = this.object.system.selected_adjustment.choose_stat;
- let DialogContent = `
Stat
\
-
`
+ let DialogContent = `${game.i18n.localize("Mosh.CharacterGenerator.StatOption")}
\
+
\
+ ${game.i18n.localize("Mosh.Strength")}
\
+ ${game.i18n.localize("Mosh.Speed")}
\
+ ${game.i18n.localize("Mosh.Intellect")}
\
+ ${game.i18n.localize("Mosh.Combat")}
\
+ ${game.i18n.localize("Mosh.Sanity")}
\
+ ${game.i18n.localize("Mosh.Fear")}
\
+ ${game.i18n.localize("Mosh.Body")}
`
let d = new Dialog({
title: "Select Stat",
content: DialogContent,
buttons: {
- roll: {
+ create: {
icon: '',
label: "Create",
callback: (html) => {
-
- let statname = html.find('[id=\"system.selected_adjustment.choose_stat.stats\"]')[0].value
+
+ let new_stat_option = {
+ modification: html.find('[id=\"modification\"]').prop("value"),
+ stats: [],
+ }
+ if (html.find('[id=\"strength\"]')[0].checked){
+ new_stat_option.stats.push("strength");
+ }
+ if (html.find('[id=\"speed\"]')[0].checked){
+ new_stat_option.stats.push("speed");
+ }
+ if (html.find('[id=\"intellect\"]')[0].checked){
+ new_stat_option.stats.push("intellect");
+ }
+ if (html.find('[id=\"combat\"]')[0].checked){
+ new_stat_option.stats.push("combat");
+ }
+ if (html.find('[id=\"sanity\"]')[0].checked){
+ new_stat_option.stats.push("sanity");
+ }
+ if (html.find('[id=\"fear\"]')[0].checked){
+ new_stat_option.stats.push("fear");
+ }
+ if (html.find('[id=\"body\"]')[0].checked){
+ new_stat_option.stats.push("body");
+ }
+ if(new_stat_option.stats.length < 2){
+ ui.notifications.error(game.i18n.localize("Mosh.classNewStatOptionEmptyError"));
+ return;
+ }
- stats.push(statname);
- this.object.update({"system.selected_adjustment.choose_stat.stats":stats});
+ choose_stat.push(new_stat_option);
+ this.object.update({"system.selected_adjustment.choose_stat":choose_stat});
}
},
@@ -214,7 +306,7 @@ export class MothershipClassSheet extends MothershipItemSheet {
callback: () => { }
}
},
- default: "roll",
+ default: "create",
close: () => { }
});
d.render(true);
diff --git a/module/mosh.js b/module/mosh.js
index faef550..d2f88b2 100644
--- a/module/mosh.js
+++ b/module/mosh.js
@@ -112,7 +112,16 @@ Hooks.once('init', async function () {
}
}
});
-
+ //convert uuid list to names for display.
+ Handlebars.registerHelper('UUidListToNames',function(UuidList){
+ var names = []
+ for(let i=0;i {
let buttons_options = {};
@@ -203,11 +213,19 @@ export class DLActorGenerator extends FormApplication {
});
}
+ /**
+ * Apply the skills to the form,
+ * @param {*} html
+ * @param {[uuid]} skillsUuid List of skill uuid,
+ * @returns
+ */
async updateSkillHtmlUl(html, skillsUuid) {
//html.find(`ul[id="system.class.skils.text"]`).empty();
let new_skills = await html.find(`input[id="system.class.skills.uuid"]`).prop("value").split(",").filter(Boolean);
for (let i = 0; i < skillsUuid.length; i++) {
let skill = null;
+ //incase we have an array of arrays the second array is considered options
+ //this is legacy, whe should never have this case anymore
if(Array.isArray(skillsUuid[i])){
//we have skill options, display popup to choose
let options = [];
@@ -232,6 +250,10 @@ export class DLActorGenerator extends FormApplication {
return new_skills;
}
+ /**
+ * Process the skill options and display all the necesary popups
+ * @param {*} skillPopupOptions
+ */
async popUpSkillOptions(skillPopupOptions) {
for (let i = 0; i < skillPopupOptions.master_full_set; i++) {
@@ -258,6 +280,13 @@ export class DLActorGenerator extends FormApplication {
//return skillsUuid;
}
+ /**
+ * Dialog with dropdown to select the skills, it grey-out already owned skills and filters the dropdown based on the skilltree of the previously selected skills,
+ * the fill older is from master to trained.
+ * @param {*} template
+ * @param {*} exclusive
+ * @returns
+ */
async showSkillDialog(template, exclusive = false) {
let skillsUuid = this.skillsUuid;
@@ -324,71 +353,88 @@ export class DLActorGenerator extends FormApplication {
});
}
- async showOptionsDialog(option_1, option_2) {
- let popupData = {
- option_1: option_1,
- option_2: option_2,
- }
+ /**
+ * Popup to ask the user to select what skill option to use,
+ * @param {*} list_option_skills_or
+ * @returns
+ */
+ async showOptionsDialog(list_option_skills_or) {
+ let popupData = {options:list_option_skills_or};
+
let popUpContent = await renderTemplate("systems/mosh/templates/dialogs/actor-generator/actor-generator-skill-option-choice-dialog.html", popupData);
return new Promise((resolve) => {
+
+ let buttonsData = {};
+ for (let i=0;i',
+ label: list_option_skills_or[i].name,//game.i18n.localize("Mosh.CharacterGenerator.SkillOption.ChoiceWord") + ` ${i}`,
+ callback: () => {
+ resolve(list_option_skills_or[i]);
+ }
+
+ };
+ }
let d = new Dialog({
title: game.i18n.localize("Mosh.CharacterGenerator.SkillOption.PopupTitle"),
content: popUpContent,
window:{width: 500,},
- buttons: {
- "1": {
- icon: '',
- label: game.i18n.localize("Mosh.CharacterGenerator.SkillOption.ChoiceWord") + " 1",
- callback: () => {
- resolve(option_1);
- }
- },
- "2": {
- icon: '',
- label: game.i18n.localize("Mosh.CharacterGenerator.SkillOption.ChoiceWord") + " 2",
- callback: () => {
- resolve(option_2);
- }
- },
- },
+ buttons: buttonsData,
});
d.render(true);
});
}
+ /**
+ * Process all the skills for the selected class
+ * @param {*} html
+ */
async applyClassSkills(html) {
let class_uuid = html.find(`input[id="system.class.uuid"]`).prop("value");
if (class_uuid == "") {
ui.notifications.error(game.i18n.localize("Mosh.CharacterGenerator.SkillOption.Classerror"));
}
let classObject = await fromUuid(class_uuid);
+ //empty previously existing skills
await html.find(`ul[id="system.class.skils.text"]`).empty();
await html.find(`input[id="system.class.skills.uuid"]`).prop("value", "");
+ //apply fixed skils
this.skillsUuid = classObject.system.base_adjustment.skills_granted.slice();
this.skillsUuid = await this.updateSkillHtmlUl(html, this.skillsUuid);
+ //process optional skills
+ let option_skills_and = classObject.system.selected_adjustment.choose_skill_and;
+ await this.popUpSkillOptions(option_skills_and);
- let option_skills_1 = classObject.system.selected_adjustment.choose_skill_and;
- await this.popUpSkillOptions(option_skills_1);
- let option_skills_2 = classObject.system.selected_adjustment.choose_skill_or;
- const isEmptyOption1 = Object.values(option_skills_2.option_1).every(x => x === null || x === '' || x === 0);
- const isEmptyOption2 = Object.values(option_skills_2.option_2).every(x => x === null || x === '' || x === 0);
- let option_skills_2_choosed = {}
- if (isEmptyOption1 == false && isEmptyOption2 == false) {
- //we need to choose-> render popup with both options
- option_skills_2_choosed = await this.showOptionsDialog(option_skills_2.option_1,option_skills_2.option_2);
- } else if (isEmptyOption1 == false) {
- //there is only option 1 (edge case) but we go with it.
- option_skills_2_choosed = option_skills_2.option_1;
- } else if (isEmptyOption2 == false) {
- //there is only option 2 (edge case) but we go with it.
- option_skills_2_choosed = option_skills_2.option_2;
+ let list_option_skills_or = classObject.system.selected_adjustment.choose_skill_or;
+ for (let i = 0; i 1){
+ selected_option = await this.showOptionsDialog(options_skill_or);
+ }
+ //process fixed skills first, so we dont double select them
+ if(selected_option.from_list.length>0){
+ this.skillsUuid = await this.updateSkillHtmlUl(html, selected_option.from_list);
+ }
+
+ await this.popUpSkillOptions(selected_option);
+
}
- await this.popUpSkillOptions(option_skills_2_choosed);
}
+ /**
+ * Apply the changed or dropped class into the generator, stats, skills and table configuration.
+ * @param {uuid} classUuid
+ * @param {Boolean} randomCharacter
+ * @returns
+ */
async updateClass(classUuid, randomCharacter = false) {
const droppedObject = await fromUuid(classUuid);
@@ -406,55 +452,59 @@ export class DLActorGenerator extends FormApplication {
//posible-todo: un-do the rolls of patch, trinket and loadout?
}
-
+ //update form
this._element.find(`input[id="system.class.uuid"]`).prop("value", classUuid);
this._element.find(`input[id="system.class.traumaresponse"]`).prop("value", droppedObject.system.trauma_response);
+
+ //get tables
this.trinketTable = droppedObject.system.roll_tables.trinket;
this.patchTable = droppedObject.system.roll_tables.patch;
this.loadoutTable = droppedObject.system.roll_tables.loadout;
+ //Apply bonuses first, so if the popup are closed or crashed the bonuses are already applyed.
+ let fix_stats_and_saves = droppedObject.system.base_adjustment;
+ Object.entries(fix_stats_and_saves).forEach(([key, value]) => {
+ if (key != "skills_granted") {
+ //this sets all the bonuses of base_adjustment including max_wounds
+ this._element.find(`input[name="system.stats.${key}.bonus"]`).prop("value", value);
+ }
+ });
+ /**
+ * Stats
+ */
+ //stats options
+ let list_option_stats_and_saves = droppedObject.system.selected_adjustment.choose_stat;
+ for(let i =0;i',
+ label: option_stats_and_saves.stats[j],//.replace(/\.bonus/i,"").replace(/(.*)\.+/i,""),
+ callback: () => this._element.find(`input[name="system.stats.${option_stats_and_saves.stats[j]}.bonus"]`).prop("value", (parseInt(option_stats_and_saves.modification) + parseInt(prev_bonus)))
+ };
+ }
+ let d = new Dialog({
+ title: game.i18n.localize("Mosh.CharacterGenerator.StatOptionPopupTitle"),
+ content: `${game.i18n.localize("Mosh.CharacterGenerator.StatOptionPopupText")} (${option_stats_and_saves.modification})
`,
+ buttons: buttons_options,
+ default: "1",
+ //render: html => console.log("Register interactivity in the rendered dialog"),
+ //close: html => console.log("This always is logged no matter which option is chosen")
+ });
+ d.render(true);
+ }
+ }
+
/**
* Skills
* */
await this.applyClassSkills(this._element);
- /**
- * Stats
- */
- ///try{
- //let statsandsaves = JSON.parse(droppedObject.system.statsandsaves.replaceAll("","").replaceAll("
","").replaceAll("","").replaceAll("
","").replaceAll(" ",""));
- let fix_stats_and_saves = droppedObject.system.base_adjustment;
-
- Object.entries(fix_stats_and_saves).forEach(([key, value]) => {
- if (key != "skills_granted") {
- //this sets all the bonuses of base_adjustment including max_wounds
- this._element.find(`input[name="system.stats.${key}.bonus"]`).prop("value", value);
- }
- });
-
- //stats options
- let option_stats_and_saves = droppedObject.system.selected_adjustment.choose_stat;
- if (option_stats_and_saves.modification) {
- let buttons_options = {};
- for (let j = 0; j < option_stats_and_saves.stats.length; j++) {
- let prev_bonus = this._element.find(`input[name="system.stats.${option_stats_and_saves.stats[j]}.bonus"]`).prop("value");
- buttons_options[j] = {
- icon: '',
- label: option_stats_and_saves.stats[j],//.replace(/\.bonus/i,"").replace(/(.*)\.+/i,""),
- callback: () => this._element.find(`input[name="system.stats.${option_stats_and_saves.stats[j]}.bonus"]`).prop("value", (parseInt(option_stats_and_saves.modification) + parseInt(prev_bonus)))
- };
- }
- let d = new Dialog({
- title: game.i18n.localize("Mosh.CharacterGenerator.StatOptionPopupTitle"),
- content: `${game.i18n.localize("Mosh.CharacterGenerator.StatOptionPopupText")} (${option_stats_and_saves.modification})
`,
- buttons: buttons_options,
- default: "1",
- //render: html => console.log("Register interactivity in the rendered dialog"),
- //close: html => console.log("This always is logged no matter which option is chosen")
- });
- d.render(true);
- }
+
return;
}
diff --git a/templates/dialogs/actor-generator/actor-generator-skill-option-choice-dialog.html b/templates/dialogs/actor-generator/actor-generator-skill-option-choice-dialog.html
index 5e12de3..f8a691d 100644
--- a/templates/dialogs/actor-generator/actor-generator-skill-option-choice-dialog.html
+++ b/templates/dialogs/actor-generator/actor-generator-skill-option-choice-dialog.html
@@ -5,74 +5,48 @@
+ {{#each options}}
-
{{localize 'Mosh.CharacterGenerator.SkillOption.ChoiceWord'}}: 1
+
{{this.name}}:
- {{#if option_1.master}}
+ {{#if this.master}}
-
- {{localize 'Mosh.SkillRankMaster'}} : {{option_1.master}}
+ {{localize 'Mosh.SkillRankMaster'}} : {{this.master}}
{{/if}}
- {{#if option_1.expert}}
+ {{#if this.expert}}
-
- {{localize 'Mosh.SkillRankExpert'}} : {{option_1.expert}}
+ {{localize 'Mosh.SkillRankExpert'}} : {{this.expert}}
{{/if}}
- {{#if option_1.trained}}
+ {{#if this.trained}}
-
- {{localize 'Mosh.SkillRankTrained'}} : {{option_1.trained}}
+ {{localize 'Mosh.SkillRankTrained'}} : {{this.trained}}
{{/if}}
- {{#if option_1.master_full_set}}
+ {{#if this.master_full_set}}
-
{{localize 'Mosh.SkillRankMaster'}} & {{localize 'Mosh.SkillsPrerequisite'}} :
- {{option_1.master_full_set}}
+ {{this.master_full_set}}
{{/if}}
- {{#if option_1.expert_full_set}}
+ {{#if this.expert_full_set}}
-
{{localize 'Mosh.SkillRankExpert'}} & {{localize 'Mosh.SkillsPrerequisite'}} :
- {{option_1.expert_full_set}}
+ {{this.expert_full_set}}
{{/if}}
-
-
-
-
{{localize 'Mosh.CharacterGenerator.SkillOption.ChoiceWord'}}: 2
-
-
- {{#if option_2.master}}
+ {{#if this.from_list}}
-
- {{localize 'Mosh.SkillRankMaster'}} : {{option_2.master}}
-
- {{/if}}
- {{#if option_2.expert}}
- -
- {{localize 'Mosh.SkillRankExpert'}} : {{option_2.expert}}
-
- {{/if}}
- {{#if option_2.trained}}
- -
- {{localize 'Mosh.SkillRankTrained'}} : {{option_2.trained}}
-
- {{/if}}
- {{#if option_2.master_full_set}}
- -
- {{localize 'Mosh.SkillRankMaster'}} & {{localize 'Mosh.SkillsPrerequisite'}} :
- {{option_2.master_full_set}}
-
- {{/if}}
- {{#if option_2.expert_full_set}}
- -
- {{localize 'Mosh.SkillRankExpert'}} & {{localize 'Mosh.SkillsPrerequisite'}} :
- {{option_2.expert_full_set}}
+ {{UUidListToNames this.from_list}}
{{/if}}
+ {{/each}}
diff --git a/templates/item/item-class-sheet.html b/templates/item/item-class-sheet.html
index 875f8ee..21c2d86 100644
--- a/templates/item/item-class-sheet.html
+++ b/templates/item/item-class-sheet.html
@@ -159,7 +159,8 @@
{{ localize 'Mosh.Description' }}
{{ localize 'Mosh.CharacterGenerator.StatOption' }}
{{ localize 'Mosh.SkillsFixed' }}
- {{ localize 'Mosh.SkillsOptional' }}
+ {{ localize 'Mosh.SkillsOptionalAnd' }}
+ {{ localize 'Mosh.SkillsOptionalOr' }}
{{ localize 'Mosh.CharacterGenerator.Tables' }}
{{ localize 'Mosh.CharacterGenerator.CommonSkills' }}
@@ -173,35 +174,28 @@
{{!-- stats&saves Tab --}}
-
-
-
{{ localize
- 'Mosh.Value' }}
+
+
+
+ {{#each system.selected_adjustment.choose_stat as |group id|}}
+ -
+
{{group.modification}}
+ {{#each group.stats as |stat id|}}{{stat}}{{#if @last}}{{else}}, {{/if}}{{/each}}
-
-
-
-
-
- {{#each system.selected_adjustment.choose_stat.stats as |stat id|}}
- -
-
{{stat}}
-
-
- {{/each}}
-
-
+
+
+ {{/each}}
+
{{!-- skills Tab --}}
@@ -213,13 +207,12 @@
{{ localize 'Mosh.SkillRank' }}
{{ localize 'Mosh.SkillBonus' }}
{{#each system.base_adjustment.skills_granted_object as |skill id|}}
- {{#if skill.name}}
{{skill.name}}
@@ -230,48 +223,16 @@
class="fas fa-trash">
- {{else}}
-
-
-
OR
-
- {{#each skill as |subskill subid|}}
- -
-
-
{{subskill.name}}
- {{subskill.system.rank}}
- {{subskill.system.bonus}}
-
-
- {{/each}}
-
-
- {{#if skill.[1]}}{{else}}
-
- {{/if}}
-
- {{/if}}
{{/each}}
-
+ {{!-- skills Tab --}}
+
-
-
-
-
-
+ class="resource-label minmaxtext">{{ localize 'Mosh.SkillRankTrained' }}
+ class="resource-label minmaxtext">{{ localize 'Mosh.SkillRankExpert' }}
+ class="resource-label minmaxtext">{{ localize 'Mosh.SkillRankMaster' }}
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ {{!-- skills Tab --}}
+
@@ -508,4 +411,13 @@
-
\ No newline at end of file
+
+
\ No newline at end of file