6 Commits

Author SHA1 Message Date
2e389704ea v0.0.3
Finishing v0.0.3

Layout fixes
Added support for rolling skill on spells
Fixed migration
Cleaned up the code
Fixed Hjältarnas Tid skill error, updated layout, fixed buttons not working
Fixed right click menu for weapons
Added roll dialog and exceptional rolls
Updated skills styling
Co-Authored-By: erebus <erebus@rikspolisen.se>
Co-Committed-By: erebus <erebus@rikspolisen.se>
2020-12-01 16:30:39 +00:00
6f030bd6b5 Final v0.0.2 2020-11-30 06:23:35 +01:00
512d0de4e5 Updated README 2020-11-29 15:34:47 +01:00
ef6cc11bcb Updated README 2020-11-29 15:34:14 +01:00
bb5d29e28e Updated README 2020-11-29 15:23:59 +01:00
d42988e859 Updated README 2020-11-29 15:15:10 +01:00
33 changed files with 1581 additions and 201 deletions

View File

@@ -0,0 +1,18 @@
# Kopparhavets Hjältar
Detta är utveklat privat och inte officielt stöttat av personerna bakom Kopparhavets Hjältar.
## Installera Kopparhavet game system
1. Öppna Foundry VTT
2. Gå till "Game Systems" fliken
3. Klicka på "Install System" knappen
4. Kopiera följande länk och klistra in i "Manifest URL" fältet:
https://pi.rikspolisen.se/foundryvtt/kopparhavet/raw/branch/master/system.json
5. Klicka Install, efter en kort tid borde systemet vara installerat.
## Rustning
Instruktioner för hur man skapar en rustning hittas i Wikin
https://pi.rikspolisen.se/foundryvtt/kopparhavet/wiki/Skapa-rustning.

View File

@@ -17,11 +17,13 @@
"BIO.AGE": "Age", "BIO.AGE": "Age",
"BIO.KIN": "Kin", "BIO.KIN": "Kin",
"BIO.NAME": "Name", "BIO.NAME": "Name",
"BIO.NICKNAME": "Nickname",
"BIO.PROFESSION": "Profession", "BIO.PROFESSION": "Profession",
"CURRENCY.QUARTER": "Quarter", "CURRENCY.QUARTER": "Quarter",
"CURRENCY.SHEKEL": "Shekel", "CURRENCY.SHEKEL": "Shekel",
"CURRENCY.TITLE": "Currency", "CURRENCY.TITLE": "Currency",
"CURRENCY.SILVER": "Silver",
"DICE.ROLL": "Dice roll", "DICE.ROLL": "Dice roll",
@@ -33,6 +35,9 @@
"FEATURES.TITLE": "Features", "FEATURES.TITLE": "Features",
"HT.FEATURES.TITLE": "Features",
"HT.RELATIONSHIP.TITLE": "Relationships",
"ITEM.ARMOR": "Rustning", "ITEM.ARMOR": "Rustning",
"ITEM.ATTACK": "Attack", "ITEM.ATTACK": "Attack",
"ITEM.DAMAGE": "Damage", "ITEM.DAMAGE": "Damage",
@@ -48,6 +53,8 @@
"ITEM.TALENT": "Talent", "ITEM.TALENT": "Talent",
"ITEM.WEAPON": "Weapon", "ITEM.WEAPON": "Weapon",
"LEARNING.TITLE": "Learning",
"MENU.SENTTOCHAT": "Send To Chat", "MENU.SENTTOCHAT": "Send To Chat",
"MOD.INIT": "Initiative", "MOD.INIT": "Initiative",
@@ -56,6 +63,14 @@
"ROLL.SUCCESS": "Success", "ROLL.SUCCESS": "Success",
"ROLL.FAILURE": "Failure", "ROLL.FAILURE": "Failure",
"ROLL.TITLE": "Roll dice",
"BUTTON.ROLL": "Roll",
"BUTTON.CANCEL": "Cancel",
"ROLL.CLOSED": "Closed",
"ROLL.OPENED": "Opened",
"MENU.SHOWROLLDIALOG": "Show diceroller dialog",
"ROLL.OPENCLOSE": "Open / Close",
"ROLL.EXCEPTIONAL": "Exceptional",
"SKILL.TYPE": "Type", "SKILL.TYPE": "Type",
"SKILL.BASE": "Basic", "SKILL.BASE": "Basic",
@@ -67,6 +82,9 @@
"SPELL.DIFFICULTY": "Difficulty", "SPELL.DIFFICULTY": "Difficulty",
"SPELL.ROLL": "Roll", "SPELL.ROLL": "Roll",
"SPELL.COST": "Cost", "SPELL.COST": "Cost",
"SPELL.ATTACKROLL": "Attack roll",
"SPELL.OPPOSITE": "Opposite",
"SPELL.RITUAL": "Ritual",
"STATS.HEALTH": "Health", "STATS.HEALTH": "Health",
"STATS.MANA": "Mana", "STATS.MANA": "Mana",
@@ -76,6 +94,7 @@
"TAB.COMBAT": "Combat", "TAB.COMBAT": "Combat",
"TAB.DESCRIPTION": "Description", "TAB.DESCRIPTION": "Description",
"TAB.GEAR": "Gear", "TAB.GEAR": "Gear",
"TAB.MAIN": "Main",
"TAB.MODIFICATION": "Modifications", "TAB.MODIFICATION": "Modifications",
"TAB.NOTE": "Note", "TAB.NOTE": "Note",
"TAB.SKILLS": "Skills", "TAB.SKILLS": "Skills",

View File

@@ -17,11 +17,14 @@
"BIO.AGE": "Ålder", "BIO.AGE": "Ålder",
"BIO.KIN": "Folkslag", "BIO.KIN": "Folkslag",
"BIO.NAME": "Namn", "BIO.NAME": "Namn",
"BIO.NICKNAME": "Tillnamn",
"BIO.PROFESSION": "Värv", "BIO.PROFESSION": "Värv",
"BIO.APPEARANCE": "Utseende",
"CURRENCY.QUARTER": "Kvarting", "CURRENCY.QUARTER": "Kvarting",
"CURRENCY.SHEKEL": "Shekel", "CURRENCY.SHEKEL": "Shekel",
"CURRENCY.TITLE": "Mynt", "CURRENCY.TITLE": "Mynt",
"CURRENCY.SILVER": "Silver",
"DICE.ROLL": "Tärningsslag", "DICE.ROLL": "Tärningsslag",
@@ -33,6 +36,9 @@
"FEATURES.TITLE": "Särdrag", "FEATURES.TITLE": "Särdrag",
"HT.FEATURES.TITLE": "Karaktärsdrag",
"HT.RELATIONSHIP.TITLE": "Relationer",
"ITEM.ARMOR": "Rustning", "ITEM.ARMOR": "Rustning",
"ITEM.ATTACK": "Anfall", "ITEM.ATTACK": "Anfall",
"ITEM.DAMAGE": "Skada", "ITEM.DAMAGE": "Skada",
@@ -48,6 +54,8 @@
"ITEM.TALENT": "Förmåga", "ITEM.TALENT": "Förmåga",
"ITEM.WEAPON": "Vapen", "ITEM.WEAPON": "Vapen",
"LEARNING.TITLE": "Inlärning",
"MENU.SENTTOCHAT": "Skicka till chat", "MENU.SENTTOCHAT": "Skicka till chat",
"MOD.INIT": "Turordning", "MOD.INIT": "Turordning",
@@ -57,6 +65,15 @@
"ROLL.SUCCESS": "Lyckat", "ROLL.SUCCESS": "Lyckat",
"ROLL.FAILURE": "Misslyckat", "ROLL.FAILURE": "Misslyckat",
"ROLL.TITLE": "Slå tärningar",
"BUTTON.ROLL": "Slå",
"BUTTON.CANCEL": "Avbryt",
"ROLL.CLOSED": "Stängd",
"ROLL.OPENED": "Öppnad",
"MENU.SHOWROLLDIALOG": "Visa tärningsdialog",
"ROLL.OPENCLOSE": "Öppna / Stäng",
"ROLL.EXCEPTIONAL": "Exceptionellt",
"SKILL.TYPE": "Typ", "SKILL.TYPE": "Typ",
"SKILL.BASE": "Grundfärdigheter", "SKILL.BASE": "Grundfärdigheter",
"SKILL.ADVENTURE": "Äventyrsfärdigheter", "SKILL.ADVENTURE": "Äventyrsfärdigheter",
@@ -65,8 +82,12 @@
"SKILL.LANGUAGE": "Språk", "SKILL.LANGUAGE": "Språk",
"SPELL.DIFFICULTY": "Svårighet", "SPELL.DIFFICULTY": "Svårighet",
"SPELL.ROLL": "Slag", "SPELL.ROLLTITLE": "Slag",
"SPELL.COST": "Kostnad", "SPELL.COST": "Kostnad",
"SPELL.ROLL": "Färdighetsslag",
"SPELL.ATTACKROLL": "Anfallsslag",
"SPELL.OPPOSITE": "Motsatt",
"SPELL.RITUAL": "Ritual",
"STATS.HEALTH": "Hälsa", "STATS.HEALTH": "Hälsa",
"STATS.MANA": "Skuld", "STATS.MANA": "Skuld",
@@ -76,6 +97,7 @@
"TAB.COMBAT": "Strid", "TAB.COMBAT": "Strid",
"TAB.DESCRIPTION": "Beskrivning", "TAB.DESCRIPTION": "Beskrivning",
"TAB.GEAR": "Utrustning", "TAB.GEAR": "Utrustning",
"TAB.MAIN": "Allmänt",
"TAB.MODIFICATION": "Modifikationer", "TAB.MODIFICATION": "Modifikationer",
"TAB.NOTE": "Anteckning", "TAB.NOTE": "Anteckning",
"TAB.SKILLS": "Färdigheter", "TAB.SKILLS": "Färdigheter",

View File

@@ -1,4 +1,5 @@
import KHDiceRoller from "../helpers/dice-helper.js" import KHDiceRoller from "../helpers/dice-helper.js"
import ActorHelpers from "../helpers/actor-helper.js";
/** /**
* Extend the basic ActorSheet with some very simple modifications * Extend the basic ActorSheet with some very simple modifications
@@ -9,12 +10,23 @@ export class ActorSheetKH extends ActorSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
if(game.settings.get("kopparhavet", "gameSystem") === "hjaltarnas-tid") {
return mergeObject(super.defaultOptions, {
classes: ["kopparhavet", "sheet", "actor"],
template: "systems/kopparhavet/templates/actors/ht-character-sheet.html",
width: 710,
height: 650,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "main" }],
scrollY: [".skills-tab .skills", ".talent-tab .items"],
});
}
return mergeObject(super.defaultOptions, { return mergeObject(super.defaultOptions, {
classes: ["kopparhavet", "sheet", "actor"], classes: ["kopparhavet", "sheet", "actor"],
template: "systems/kopparhavet/templates/actors/character-sheet.html", template: "systems/kopparhavet/templates/actors/character-sheet.html",
width: 710, width: 710,
height: 650, height: 650,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "skills" }], tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "main" }],
scrollY: [".skills-tab .skills", ".talent-tab .items"], scrollY: [".skills-tab .skills", ".talent-tab .items"],
}); });
} }
@@ -22,7 +34,13 @@ export class ActorSheetKH extends ActorSheet {
/** @override */ /** @override */
get template() { get template() {
const path = "systems/kopparhavet/templates/actors"; const path = "systems/kopparhavet/templates/actors";
return `${path}/${this.actor.data.type}-sheet.html`; let prefix = "";
if(game.settings.get("kopparhavet", "gameSystem") === "hjaltarnas-tid") {
prefix = "ht-";
}
return `${path}/${prefix}${this.actor.data.type}-sheet.html`;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -121,6 +139,186 @@ export class ActorSheetKH extends ActorSheet {
}, },
]); ]);
new ContextMenu(html, "li.item-weapon", [
{
name: game.i18n.localize("MENU.SHOWROLLDIALOG"),
icon: '<i class="far dice"></i>',
callback: (li) => {
let itemId = li.data("itemId");
let _item = this.actor.items.find((element) => element._id == itemId);
// Retrieve skill based on name
let skill = this.actor.items.find((element) => element.name === _item.data.data.skill.value);
let skillName = skill.name
let skillValue = skill.data.data.value
let showValue = false
if(this.actor.data.type === "character") {
showValue = true
}
this.khRoller.rollSkillDialogInChat(skillName, skillValue, showValue, this.actor)
},
},
{
name: game.i18n.localize("MENU.SENTTOCHAT"),
icon: '<i class="far fa-comment"></i>',
callback: (li) => {
let itemId = li.data("itemId");
this._itemDetailsToChat(itemId);
},
},
]);
new ContextMenu(html, "li.item-skill", [
{
name: game.i18n.localize("MENU.SHOWROLLDIALOG"),
icon: '<i class="far dice"></i>',
callback: (li) => {
let itemId = li.data("itemId");
let _item = this.actor.items.find((element) => element._id == itemId);
let skillName = _item.name
let skillValue = _item.data.data.value
let showValue = false
if(this.actor.data.type === "character") {
showValue = true
}
this.khRoller.rollSkillDialogInChat(skillName, skillValue, showValue, this.actor)
},
},
{
name: game.i18n.localize("MENU.SENTTOCHAT"),
icon: '<i class="far fa-comment"></i>',
callback: (li) => {
let itemId = li.data("itemId");
this._itemDetailsToChat(itemId);
},
},
]);
new ContextMenu(html, "li.item-spell", [
{
name: game.i18n.localize("MENU.SHOWROLLDIALOG"),
icon: '<i class="far dice"></i>',
callback: (li) => {
let itemId = li.data("itemId");
let _item = this.actor.items.find((element) => element._id == itemId);
if (!_item) {
_item = game.items.get(itemId);
if (!_item) {
console.log("IMPORT ERROR")
return
}
}
let showValue = false
let difficulty = 0
if(this.actor.data.type === "character") {
showValue = true
}
switch (_item.data.data.difficulty.value) {
case "simple":
difficulty = 5
break;
case "easy":
difficulty = 2
break;
case "hard":
difficulty = -2
break;
case "daunting":
difficulty = -5
break;
}
if(_item.data.data.roll.value === "roll" || _item.data.data.roll.value === "attackroll") {
// Retrieve skill based on name
let skill = this.actor.items.find((element) => element.name === _item.data.data.roll.skill);
let skillName = _item.name
let skillValue = skill.data.data.value
if(this.actor.data.type === "character") {
skillName = _item.name + " (" + skill.name + ")"
}
this.khRoller.rollSkillDialogInChat(skillName, skillValue, showValue, this.actor, difficulty)
} else if(_item.data.data.roll.value === "opposite") {
// Retrieve skill based on name
let skill = this.actor.items.find((element) => element.name === _item.data.data.roll.skill);
let skillName = _item.name
let skillValue = skill.data.data.value
if(this.actor.data.type === "character") {
skillName = _item.name + " (" + skill.name + ")"
}
this.khRoller.rollSkillDialogInChat(skillName, skillValue, showValue, this.actor, difficulty)
} else if(_item.data.data.roll.value === "ritual") {
console.log("Not supported yet")
this.khRoller.rollSkillDialogInChat("Ritual", -1, showValue, this.actor, difficulty)
}
},
},
{
name: game.i18n.localize("MENU.SENTTOCHAT"),
icon: '<i class="far fa-comment"></i>',
callback: (li) => {
let itemId = li.data("itemId");
this._itemDetailsToChat(itemId);
},
},
]);
new ContextMenu(html, "li.item-attack", [
{
name: game.i18n.localize("MENU.SHOWROLLDIALOG"),
icon: '<i class="far dice"></i>',
callback: (li) => {
let skillValue = li.data("ability");
let skillName = "ITEM.ATTACK";
let showValue = false
if(this.actor.data.type === "character") {
showValue = true
}
this.khRoller.rollSkillDialogInChat(skillName, skillValue, showValue, this.actor)
},
},
{
name: game.i18n.localize("MENU.SENTTOCHAT"),
icon: '<i class="far fa-comment"></i>',
callback: (li) => {
let itemId = li.data("itemId");
this._itemDetailsToChat(itemId);
},
},
]);
new ContextMenu(html, "li.item-defence", [
{
name: game.i18n.localize("MENU.SHOWROLLDIALOG"),
icon: '<i class="far dice"></i>',
callback: (li) => {
const skillValue = li.data("defence");
let skillName = "ADVERSARY.DEFENCE";
this.khRoller.rollSkillDialogInChat(skillName, skillValue, false, this.actor)
},
}
]);
html.find(".feature").click(async (ev) => { html.find(".feature").click(async (ev) => {
const featureName = $(ev.currentTarget).data("feature"); const featureName = $(ev.currentTarget).data("feature");
const featureValue = this.actor.data.data.feature[featureName].value; const featureValue = this.actor.data.data.feature[featureName].value;
@@ -138,7 +336,35 @@ export class ActorSheetKH extends ActorSheet {
// Delete Inventory Item // Delete Inventory Item
html.find(".item-delete").click((ev) => { html.find(".item-delete").click((ev) => {
const li = $(ev.currentTarget).parents(".item"); let parent = $(ev.currentTarget).data("parent")
const li = $(ev.currentTarget).parents(parent);
const item = this.actor.getOwnedItem(li.data("itemId"));
if(item) {
if (item.type === "armor") {
let initValue = -1
if (item.data.data.equipable.equipped) {
initValue = 4
this.actor.items.map((i) => {
if (i.type === "armor") {
if (i._id !== item._id && i.data.data.equipable.equipped && i.data?.data?.modifications) {
for (let k of Object.keys(i.data.data.modifications)) {
if (i.data.data.modifications[k].modtype === "init") {
initValue = i.data.data.modifications[k].value;
}
}
}
}
});
}
if (initValue > 0) {
this.actor.update({["data.combat.init"]: initValue});
}
}
}
this.actor.deleteOwnedItem(li.data("itemId")); this.actor.deleteOwnedItem(li.data("itemId"));
@@ -147,7 +373,8 @@ export class ActorSheetKH extends ActorSheet {
// Edit Inventory Item // Edit Inventory Item
html.find(".item-edit").click(async (ev) => { html.find(".item-edit").click(async (ev) => {
const li = $(ev.currentTarget).parents(".item"); let parent = $(ev.currentTarget).data("parent")
let li = $(ev.currentTarget).parents(parent);
let itemId = li.data("itemId"); let itemId = li.data("itemId");
let item = this.actor.getOwnedItem(itemId); let item = this.actor.getOwnedItem(itemId);
@@ -166,7 +393,7 @@ export class ActorSheetKH extends ActorSheet {
/* Roll spell cost */ /* Roll spell cost */
html.find(".roll-spell-cost").click((ev) => { html.find(".roll-spell-cost").click((ev) => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item-spell");
let itemId = li.data("itemId"); let itemId = li.data("itemId");
let spell = this.actor.getOwnedItem(itemId); let spell = this.actor.getOwnedItem(itemId);
@@ -189,9 +416,74 @@ export class ActorSheetKH extends ActorSheet {
} }
}); });
html.find(".roll-spell-skill").click((ev) => {
const li = $(ev.currentTarget).parents(".item-spell");
let itemId = li.data("itemId");
let spell = this.actor.getOwnedItem(itemId);
if (!spell) {
spell = game.items.get(itemId);
if (!spell) {
console.log("IMPORT ERROR")
return
}
}
let showValue = false
let difficulty = 0
if(this.actor.data.type === "character") {
showValue = true
}
switch (spell.data.data.difficulty.value) {
case "simple":
difficulty = 5
break;
case "easy":
difficulty = 2
break;
case "hard":
difficulty = -2
break;
case "daunting":
difficulty = -5
break;
}
if(spell.data.data.roll.value === "roll" || spell.data.data.roll.value === "attackroll") {
// Retrieve skill based on name
let skill = this.actor.items.find((element) => element.name === spell.data.data.roll.skill);
let skillName = spell.name
let skillValue = skill.data.data.value
if(this.actor.data.type === "character") {
skillName = spell.name + " (" + skill.name + ")"
}
this.khRoller.rollSkillInChat(skillName, skillValue, showValue, this.actor, difficulty)
} else if(spell.data.data.roll.value === "opposite") {
// Retrieve skill based on name
let skill = this.actor.items.find((element) => element.name === spell.data.data.roll.skill);
let skillName = spell.name
let skillValue = skill.data.data.value
if(this.actor.data.type === "character") {
skillName = spell.name + " (" + skill.name + ")"
}
this.khRoller.rollSkillInChat(skillName, skillValue, showValue, this.actor, difficulty)
} else if(spell.data.data.roll.value === "ritual") {
console.log("Not supported yet")
}
});
/* Roll skill */ /* Roll skill */
html.find(".roll-skill").click((ev) => { html.find(".roll-skill").click((ev) => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item-skill");
let itemId = li.data("itemId"); let itemId = li.data("itemId");
let _item = this.actor.items.find((element) => element._id == itemId); let _item = this.actor.items.find((element) => element._id == itemId);
@@ -208,7 +500,7 @@ export class ActorSheetKH extends ActorSheet {
/* Roll weapon skill */ /* Roll weapon skill */
html.find(".roll-weapon-skill").click((ev) => { html.find(".roll-weapon-skill").click((ev) => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item-weapon");
let itemId = li.data("itemId"); let itemId = li.data("itemId");
let weapon = this.actor.getOwnedItem(itemId); let weapon = this.actor.getOwnedItem(itemId);
@@ -237,7 +529,7 @@ export class ActorSheetKH extends ActorSheet {
/* Roll weapon damage */ /* Roll weapon damage */
html.find(".roll-damage").click((ev) => { html.find(".roll-damage").click((ev) => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item-weapon");
let itemId = li.data("itemId"); let itemId = li.data("itemId");
let weapon = this.actor.getOwnedItem(itemId); let weapon = this.actor.getOwnedItem(itemId);
@@ -278,6 +570,7 @@ export class ActorSheetKH extends ActorSheet {
let defence = armor.data.data.defence.value; let defence = armor.data.data.defence.value;
let hasHelmet = false; let hasHelmet = false;
if(game.settings.get("kopparhavet", "gameSystem") === "kopparhavet") {
this.actor.items.map((i) => { this.actor.items.map((i) => {
if (i.type === "armor") { if (i.type === "armor") {
if (i.data.data.equipable.equipped && i.data.data.helmet.value) { if (i.data.data.equipable.equipped && i.data.data.helmet.value) {
@@ -287,6 +580,7 @@ export class ActorSheetKH extends ActorSheet {
} }
} }
}); });
}
let regex = /([0-9]*)t([0-9]*)/g; let regex = /([0-9]*)t([0-9]*)/g;
let regexMatch; let regexMatch;
@@ -298,6 +592,7 @@ export class ActorSheetKH extends ActorSheet {
/* Toggle item equipped */ /* Toggle item equipped */
html.find(".items .item a.toggle-equipped").click(this._toggleEquippedItem.bind(this)); html.find(".items .item a.toggle-equipped").click(this._toggleEquippedItem.bind(this));
html.find(".items .item-weapon a.toggle-equipped").click(this._toggleEquippedItem.bind(this));
/* Handle increase of items in inventory */ /* Handle increase of items in inventory */
html.find(".item-quantity .quantity.increase").click(this._increaseQuantity.bind((this))); html.find(".item-quantity .quantity.increase").click(this._increaseQuantity.bind((this)));
@@ -311,16 +606,38 @@ export class ActorSheetKH extends ActorSheet {
/* Adversary specific */ /* Adversary specific */
html.find(".roll-adversary-attack").click((ev) => { html.find(".roll-adversary-attack").click((ev) => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item-attack");
let skillValue = li.data("ability"); let skillValue = li.data("ability");
console.log(skillValue)
let skillName = "ITEM.ATTACK"; let skillName = "ITEM.ATTACK";
this.khRoller.rollSkillInChat(skillName, skillValue, false, this.actor) this.khRoller.rollSkillInChat(skillName, skillValue, false, this.actor)
}); });
html.find(".roll-attack-damage").click((ev) => {
const li = $(ev.currentTarget).parents(".item-attack");
let itemId = li.data("itemId");
let weapon = this.actor.getOwnedItem(itemId);
if (!weapon) {
weapon = game.items.get(itemId);
if (!weapon) {
console.log("IMPORT ERROR")
return
}
}
let damage = weapon.data.data.damage.value;
let regex = /([0-9]*)t([0-9]*)/g;
let regexMatch;
while (regexMatch = regex.exec(damage.toLowerCase())) {
this.khRoller.rollDamageInChat(regexMatch[1], this.actor)
}
});
html.find(".roll-defence").click((ev) => { html.find(".roll-defence").click((ev) => {
const skillValue = $(ev.currentTarget).data("defence"); const skillValue = $(ev.currentTarget).data("defence");
@@ -357,6 +674,104 @@ export class ActorSheetKH extends ActorSheet {
this.khRoller.rollArmorInChat(regexMatch[1], hasHelmet, this.actor) this.khRoller.rollArmorInChat(regexMatch[1], hasHelmet, this.actor)
} }
}); });
// Add or Remove relationship
html.find(".learning-control").click(this._onClickLearningControl.bind(this));
html.find(".learning-click").click(this._onClickLearingLearned.bind(this));
/* Hjältarnas Tid specefic */
if(game.settings.get("kopparhavet", "gameSystem") === "hjaltarnas-tid") {
// Add or Remove relationship
html.find(".relation-control").click(this._onClickRelationshipControl.bind(this));
html.find(".relation-click").click(this._onClickRelationshipUsed.bind(this));
}
}
async _onClickLearingLearned(event) {
event.stopPropagation();
const li1 = $(event.currentTarget);
const li2 = $(event.currentTarget).parents(".learning");
let box = li1.data("num")
let learingKey = li2.data("attribute");
const clickedValue = (this.actor.data.data.learning[learingKey][box] == undefined ? false : this.actor.data.data.learning[learingKey][box]);
let dataName = "data.learning." + learingKey + "." + box
let tempData = {}
tempData[dataName] = !clickedValue
this.actor.update(tempData);
this._render();
}
async _onClickLearningControl(event) {
event.preventDefault();
const a = event.currentTarget;
const action = a.dataset.action;
const attrs = this.object.data.data.learning;
const form = this.form;
// Add new modification
if (action === "create") {
const nk = new Date().getTime();
let newKey = document.createElement("div");
newKey.innerHTML = `<input class="learning-key" type="text" name="data.learning.attr${nk}.key" value="attr${nk}" style="display: none;" /><input class="learning-key" type="text" name="data.learning.attr${nk}.value" value="" style="display: none;" />`;
form.appendChild(newKey);
await this._onSubmit(event);
}
// Remove existing modification
else if (action === "delete") {
const li = a.closest(".learning");
li.parentElement.removeChild(li);
await this._onSubmit(event);
}
}
async _onClickRelationshipControl(event) {
event.preventDefault();
const a = event.currentTarget;
const action = a.dataset.action;
const attrs = this.object.data.data.relationships;
const form = this.form;
// Add new modification
if (action === "create") {
const nk = new Date().getTime();
let newKey = document.createElement("div");
newKey.innerHTML = `<input class="relation-key" type="text" name="data.relationships.attr${nk}.key" value="attr${nk}" style="display: none;" /><input class="relation-key" type="text" name="data.relationships.attr${nk}.value" value="" style="display: none;" />`;
form.appendChild(newKey);
await this._onSubmit(event);
}
// Remove existing modification
else if (action === "delete") {
const li = a.closest(".relation");
li.parentElement.removeChild(li);
await this._onSubmit(event);
}
}
async _onClickRelationshipUsed(event) {
event.stopPropagation();
const li = $(event.currentTarget).parents(".relation");
let relationshipKey = li.data("attribute");
const clickedValue = (this.actor.data.data.relationships[relationshipKey].check == undefined ? false : this.actor.data.data.relationships[relationshipKey].check);
let dataName = "data.relationships." + relationshipKey + ".check"
let tempData = {}
tempData[dataName] = !clickedValue
this.actor.update(tempData);
this._render();
} }
async _toggleEquippedItem(event) { async _toggleEquippedItem(event) {
@@ -469,6 +884,13 @@ export class ActorSheetKH extends ActorSheet {
} }
} }
/** @override */
_updateObject(event, formData) {
const actorUpdate = ActorHelpers.actorUpdate.bind(this);
actorUpdate(event, formData);
}
/** /**
* Send details of an item to chat. * Send details of an item to chat.
* @private * @private

View File

@@ -12,7 +12,5 @@ export class ActorKH extends Actor {
const data = actorData.data; const data = actorData.data;
const flags = actorData.flags; const flags = actorData.flags;
data.type = actorData.type; data.type = actorData.type;
console.log("ACTOR DATA")
} }
} }

View File

@@ -0,0 +1,54 @@
export default class ActorHelpers {
static async actorUpdate(event, formData) {
formData = expandObject(formData);
// Handle the free-form relationship list
const formAttrs = expandObject(formData)?.data?.relationships || {};
const relationships = Object.values(formAttrs).reduce((obj, v) => {
let k = v["key"].trim();
delete v["key"];
obj[k] = v;
return obj;
}, {});
// Remove modifications which are no longer used
if (this.object.data?.data?.relationships) {
for (let k of Object.keys(this.object.data.data.relationships)) {
if (!relationships.hasOwnProperty(k)) relationships[`-=${k}`] = null;
}
}
// recombine modifications to formData
if (Object.keys(relationships).length > 0) {
setProperty(formData, `data.relationships`, relationships);
}
// Handle the free-form learnign list
const formAttrsLearning = expandObject(formData)?.data?.learning || {};
const learning = Object.values(formAttrsLearning).reduce((obj, v) => {
let k = v["key"].trim();
delete v["key"];
obj[k] = v;
return obj;
}, {});
// Remove modifications which are no longer used
if (this.object.data?.data?.learning) {
for (let k of Object.keys(this.object.data.data.learning)) {
if (!learning.hasOwnProperty(k)) learning[`-=${k}`] = null;
}
}
// recombine modifications to formData
if (Object.keys(learning).length > 0) {
setProperty(formData, `data.learning`, learning);
}
// Update the Item
this.actor.data.flags.loaded = false;
this.object.update(formData);
}
}

View File

@@ -84,7 +84,7 @@ export default class KHDiceRoller {
}); });
} }
async rollSkillInChat(skillName, skillValue, showValue, speaker) { async rollSkillInChat(skillName, skillValue, showValue, speaker, openclosed) {
const roll = new Roll(`1d100`); const roll = new Roll(`1d100`);
let res = roll.roll(); let res = roll.roll();
@@ -95,12 +95,34 @@ export default class KHDiceRoller {
computedName += " (" + skillValue + ")" computedName += " (" + skillValue + ")"
} }
if(openclosed === undefined) {
openclosed = 0
}
let rollData = { let rollData = {
name: computedName, name: computedName,
res: res res: res
}; };
if(skillValue > 0) { if(skillValue > 0) {
let oneRes = Math.floor((res.total / 1) % 10);
let tenRes = Math.floor((res.total / 10) % 10);
if(openclosed < 0) {
rollData.closed = Math.abs(openclosed)
}
if(openclosed > 0) {
rollData.opened = Math.abs(openclosed)
}
if(openclosed < 0 && oneRes !== 0 && Math.abs(openclosed) >= oneRes) {
// roll is closed
rollData.failure = true
} else if(openclosed > 0 && oneRes !== 0 && Math.abs(openclosed) >= oneRes){
// roll is opened
rollData.success = true
} else {
if (res.total <= skillValue) { if (res.total <= skillValue) {
rollData.success = true rollData.success = true
} else { } else {
@@ -108,6 +130,11 @@ export default class KHDiceRoller {
} }
} }
if(oneRes === tenRes) {
rollData.excetional = true
}
}
const html = await renderTemplate("systems/kopparhavet/templates/dice/roll.html", rollData); const html = await renderTemplate("systems/kopparhavet/templates/dice/roll.html", rollData);
await roll.toMessage({ await roll.toMessage({
@@ -121,4 +148,101 @@ export default class KHDiceRoller {
}, },
}); });
} }
async rollSkillDialogInChat(skillName, skillValue, showValue, speaker, startopen) {
const id = randomID();
if(startopen === undefined) {
startopen = 0
}
const content = await renderTemplate("systems/kopparhavet/templates/roll-dialog.html", {
id,
startopen,
skillName,
skillValue,
});
await new Dialog({
title: game.i18n.localize("ROLL.TITLE"),
content,
buttons: {
one: {
icon: '<i class="fas fa-check"></i>',
label: game.i18n.localize("BUTTON.ROLL"),
callback: async () => {
const container = document.getElementById(id);
let openclosed = container.querySelector('[name="openclosed"]').value
const roll = new Roll(`1d100`);
let res = roll.roll();
let computedName = skillName
if(showValue) {
computedName += " (" + skillValue + ")"
}
let rollData = {
name: computedName,
res: res
};
// Evaluate result only if we have a positive skillvalue
if(skillValue > 0) {
let oneRes = Math.floor((res.total / 1) % 10);
let tenRes = Math.floor((res.total / 10) % 10);
if(openclosed < 0) {
rollData.closed = Math.abs(openclosed)
}
if(openclosed > 0) {
rollData.opened = Math.abs(openclosed)
}
if(openclosed < 0 && oneRes !== 0 && Math.abs(openclosed) >= oneRes) {
// roll is closed
rollData.failure = true
} else if(openclosed > 0 && oneRes !== 0 && Math.abs(openclosed) >= oneRes){
// roll is opened
rollData.success = true
} else {
if (res.total <= skillValue) {
rollData.success = true
} else {
rollData.failure = true
}
}
if(oneRes === tenRes) {
rollData.excetional = true
}
}
const html = await renderTemplate("systems/kopparhavet/templates/dice/roll.html", rollData);
await roll.toMessage({
create: true,
content: html,
user: game.user._id,
speaker: {
actor: speaker._id,
token: speaker.token,
alias: speaker.name,
},
});
},
},
two: {
icon: '<i class="fas fa-times"></i>',
label: game.i18n.localize("BUTTON.CANCEL"),
},
},
},
{
classes: ["dialog", "kopparhavet"],
}).render(true);
}
} }

View File

@@ -0,0 +1,21 @@
/**
* Perform a system migration for the entire World, applying migrations for Actors, Items, and Compendium packs
* @return {Promise} A Promise which resolves once the migration is completed
*/
export const migrateWorld = async function () {
ui.notifications.info(
`Applying System Migration for version ${game.system.data.version}. Please be patient and do not close your game or shut down your server.`,
{permanent: true}
);
// Migrate to v0.0.3 from v0.0.2 and v0.0.1
game.items.forEach((item) => {
if(item.data.type === "spell") {
item.update({"data.roll.label": "SPELL.ROLLTITLE"});
}
});
// Set the migration as complete
game.settings.set("kopparhavet", "worldSchemaVersion", game.system.data.version);
ui.notifications.info(`System Migration to version ${game.system.data.version} completed!`, { permanent: true });
};

View File

@@ -8,7 +8,7 @@ export class ItemSheetKH extends ItemSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return mergeObject(super.defaultOptions, {
classes: ["starwarsffg", "sheet", "item"], classes: ["kopparhavet", "sheet", "item"],
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }], tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }],
scrollY: [".sheet-body", ".tab"], scrollY: [".sheet-body", ".tab"],
}); });
@@ -36,7 +36,13 @@ export class ItemSheetKH extends ItemSheet {
switch (this.object.data.type) { switch (this.object.data.type) {
case "weapon": case "weapon":
// Load Skills Compendium skills // Load Skills Compendium skills
let skillList2 = await game.packs.get("kopparhavet.skills").getContent(); let skillList2
if(game.settings.get("kopparhavet", "gameSystem") === "hjaltarnas-tid") {
skillList2 = await game.packs.get("kopparhavet.skills-ht").getContent();
} else {
skillList2 = await game.packs.get("kopparhavet.skills").getContent();
}
for (let item of skillList2) { for (let item of skillList2) {
if(item.data.type === "skill" && item.data.data.type.value === "combat") { if(item.data.type === "skill" && item.data.data.type.value === "combat") {
@@ -66,6 +72,28 @@ export class ItemSheetKH extends ItemSheet {
this.position.width = 405; this.position.width = 405;
this.position.height = 570; this.position.height = 570;
break; break;
case "spell":
// Load Skills Compendium skills
let skillList3
if(game.settings.get("kopparhavet", "gameSystem") === "hjaltarnas-tid") {
skillList3 = await game.packs.get("kopparhavet.skills-ht").getContent();
} else {
skillList3 = await game.packs.get("kopparhavet.skills").getContent();
}
for (let item of skillList3) {
if(item.data.type === "skill") {
skillList.push(item)
}
}
// Retrieve any created skills as well
for (let item of game.items.entities) {
if(item.data.type === "skill") {
skillList.push(item)
}
}
default: default:
this.position.width = 450; this.position.width = 450;
this.position.height = 605; this.position.height = 605;
@@ -139,6 +167,7 @@ export class ItemSheetKH extends ItemSheet {
/** @override */ /** @override */
_updateObject(event, formData) { _updateObject(event, formData) {
const itemUpdate = ItemHelpers.itemUpdate.bind(this); const itemUpdate = ItemHelpers.itemUpdate.bind(this);
itemUpdate(event, formData); itemUpdate(event, formData);
} }

View File

@@ -24,3 +24,81 @@ KH.armor_types = {
"ac": 30, "ac": 30,
}, },
}; };
KH.baseSkills = [
"Smidighet",
"Trolldom",
"Fingerfärdighet",
"Finna dolda ting",
"Förleda",
"Gömma sig",
"Handel",
"Hantverk",
"Insikt",
"Jakt",
"Kastvapen",
"Knivar",
"Lagkunskap",
"Legender",
"Läkekonst",
"Lärdom",
"Musik",
"Rida",
"Sjömanskap",
"Skytte",
"Sköldar",
"Slagsmål",
"Spana",
"Spel",
"Spjut",
"Språk",
"Status",
"Stigvana",
"Styrka",
"Svärd",
"Taktik",
"Uthållighet",
"Utstrålning",
"Viljestyrka",
"Väderkunskap",
"Yxor"
]
KH.baseSkillsHT = [
"Fingerfärdighet",
"Gömma sig",
"Handel",
"Härkonst",
"Jakt",
"Lagkunskap",
"Ledarskap",
"Leta",
"Läkekonst",
"Lärdom",
"Manövrer",
"Rida",
"Sjömannaskap",
"Skaldekonst",
"Skapa",
"Spana",
"Spel",
"Spelmannaskap",
"Språk",
"Status",
"Stigvana",
"Styrkeprov",
"Trolldom",
"Uthållighet",
"Viljestyrka",
"Väderkunskap",
"Vältalighet",
"Wyrd",
"Kastvapen",
"Knivkamp",
"Skytte",
"Sköldkamp",
"Slagsmål",
"Spjutkamp",
"Svärdskamp",
"Yxkamp"
]

View File

@@ -1,15 +1,25 @@
export default class KHHooks { export default class KHHooks {
static async onCreateActor(actor, options, userId) { static async onCreateActor(actor, options, userId) {
if (actor.data.type == "character") { if (actor.data.type == "character") {
const actorbaseSkills = actor.data.data.baseSkills; // Load Skills Compendium skills
let skillIndex;
let actorbaseSkills;
if(game.settings.get("kopparhavet", "gameSystem") === "hjaltarnas-tid") {
// Set currency name
actor.update({ "data.currency.shekel.label": "CURRENCY.SILVER" });
actorbaseSkills = CONFIG.KH.baseSkillsHT
skillIndex = await game.packs.get("kopparhavet.skills-ht").getContent();
} else {
actorbaseSkills = CONFIG.KH.baseSkills;
skillIndex = await game.packs.get("kopparhavet.skills").getContent();
}
// Check if skill already exists by some chance // Check if skill already exists by some chance
const existingSkills = actor.items.filter((i) => i.type === ItemType.Skill).map((i) => i.name); const existingSkills = actor.items.filter((i) => i.type === ItemType.Skill).map((i) => i.name);
const skillsToAdd = actorbaseSkills.filter((s) => !existingSkills.includes(s)); const skillsToAdd = actorbaseSkills.filter((s) => !existingSkills.includes(s));
// Load Skills Compendium skills
const skillIndex = await game.packs.get("kopparhavet.skills").getContent();
// Filter skillIndex array to include only skills for Actor Type. // Filter skillIndex array to include only skills for Actor Type.
let _skillsList = skillIndex.filter((i) => skillsToAdd.includes(i.data.name)); let _skillsList = skillIndex.filter((i) => skillsToAdd.includes(i.data.name));

View File

@@ -4,6 +4,7 @@ import KHHooks from "./kh-hooks.js";
import { ActorKH } from "./actors/actor.js"; import { ActorKH } from "./actors/actor.js";
import { ActorSheetKH } from "./actors/actor-sheet.js"; import { ActorSheetKH } from "./actors/actor-sheet.js";
import { KH } from "./kh-config.js"; import { KH } from "./kh-config.js";
import * as migrations from "./helpers/migration-helper.js";
Hooks.once("init", () => { Hooks.once("init", () => {
CONFIG.Combat.initiative = { formula: "(@combat.init)d6kh2", decimals: 0 }; CONFIG.Combat.initiative = { formula: "(@combat.init)d6kh2", decimals: 0 };
@@ -14,22 +15,44 @@ Hooks.once("init", () => {
// Give global access to FFG config. // Give global access to FFG config.
CONFIG.KH = KH; CONFIG.KH = KH;
//registerFonts();
registerSheets();
preloadHandlebarsTemplates();
registerHandlebarsHelpers();
game.settings.register("kopparhavet", "worldSchemaVersion", { game.settings.register("kopparhavet", "worldSchemaVersion", {
name: "World Version", name: "World Version",
hint: "Used to automatically upgrade worlds data when the system is upgraded.", hint: "Used to automatically upgrade worlds data when the system is upgraded.",
scope: "world", scope: "world",
config: true, config: true,
default: 0, default: 0,
type: Number, type: String,
}); });
game.settings.register("kopparhavet", "gameSystem", {
name: "Game System",
hint: "Select what game system is being used..",
scope: "world",
config: true,
default: "kopparhavet",
choices: {
"kopparhavet": "Kopparhavets Hjältar",
"hjaltarnas-tid": "Hjältarnas Tid"
},
type: String,
onChange: (rule) => {
window.location.reload();
},
});
//registerFonts();
registerSheets();
if(game.settings.get("kopparhavet", "gameSystem") === "hjaltarnas-tid") {
preloadHandlebarsTemplatesHT();
} else {
preloadHandlebarsTemplates();
}
registerHandlebarsHelpers();
}); });
Hooks.once("ready", () => { Hooks.once("ready", () => {
//migrateWorld(); migrateWorld();
}); });
/* POPULATE CHARACTER WITH DEFAULT SKILLS */ /* POPULATE CHARACTER WITH DEFAULT SKILLS */
@@ -37,8 +60,6 @@ Hooks.on("createActor", async (actor, options, userId) => KHHooks.onCreateActor(
function registerSheets() { function registerSheets() {
// Register sheet application classes // Register sheet application classes
console.log("Registerting sheets")
Actors.unregisterSheet("core", ActorSheet); Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("kopparhavet", ActorSheetKH, { types: ["character"], makeDefault: true }); Actors.registerSheet("kopparhavet", ActorSheetKH, { types: ["character"], makeDefault: true });
Actors.registerSheet("kopparhavet", ActorSheetKH, { types: ["adversary"], makeDefault: true }); Actors.registerSheet("kopparhavet", ActorSheetKH, { types: ["adversary"], makeDefault: true });
@@ -66,6 +87,7 @@ function preloadHandlebarsTemplates() {
"systems/kopparhavet/templates/items/spell-sheet.html", "systems/kopparhavet/templates/items/spell-sheet.html",
"systems/kopparhavet/templates/items/talent-sheet.html", "systems/kopparhavet/templates/items/talent-sheet.html",
"systems/kopparhavet/templates/items/weapon-sheet.html", "systems/kopparhavet/templates/items/weapon-sheet.html",
"systems/kopparhavet/templates/parts/actor/main.html",
"systems/kopparhavet/templates/parts/actor/bio.html", "systems/kopparhavet/templates/parts/actor/bio.html",
"systems/kopparhavet/templates/parts/actor/combat.html", "systems/kopparhavet/templates/parts/actor/combat.html",
"systems/kopparhavet/templates/parts/actor/gear.html", "systems/kopparhavet/templates/parts/actor/gear.html",
@@ -76,6 +98,29 @@ function preloadHandlebarsTemplates() {
return loadTemplates(templatePaths); return loadTemplates(templatePaths);
} }
function preloadHandlebarsTemplatesHT() {
const templatePaths = [
"systems/kopparhavet/templates/chat/item-card.html",
"systems/kopparhavet/templates/actors/ht-adversary-sheet.html",
"systems/kopparhavet/templates/actors/ht-character-sheet.html",
"systems/kopparhavet/templates/dice/roll.html",
"systems/kopparhavet/templates/items/adversaryAttack-sheet.html",
"systems/kopparhavet/templates/items/armor-sheet.html",
"systems/kopparhavet/templates/items/gear-sheet.html",
"systems/kopparhavet/templates/items/skill-sheet.html",
"systems/kopparhavet/templates/items/spell-sheet.html",
"systems/kopparhavet/templates/items/talent-sheet.html",
"systems/kopparhavet/templates/items/weapon-sheet.html",
"systems/kopparhavet/templates/parts/actor/ht-main.html",
"systems/kopparhavet/templates/parts/actor/ht-combat.html",
"systems/kopparhavet/templates/parts/actor/gear.html",
"systems/kopparhavet/templates/parts/actor/ht-skills.html",
"systems/kopparhavet/templates/parts/actor/talent.html",
"systems/kopparhavet/templates/parts/shared/modifications.html",
];
return loadTemplates(templatePaths);
}
function normalize(data, defaultValue) { function normalize(data, defaultValue) {
if (data) { if (data) {
return data.toLowerCase(); return data.toLowerCase();
@@ -124,8 +169,42 @@ function registerHandlebarsHelpers() {
} }
}); });
Handlebars.registerHelper("spellRoll", function (roll) {
roll = normalize(roll, "roll");
switch (roll) {
case "roll":
return game.i18n.localize("SPELL.ROLL");
case "attackroll":
return game.i18n.localize("SPELL.ATTACKROLL");
case "opposite":
return game.i18n.localize("SPELL.OPPOSITE");
case "ritual":
return game.i18n.localize("SPELL.RITUAL");
}
});
Handlebars.registerHelper('plaintextToHTML', function(value) { Handlebars.registerHelper('plaintextToHTML', function(value) {
// strip tags, add <br/> tags // strip tags, add <br/> tags
return new Handlebars.SafeString(value.replace(/(<([^>]+)>)/gi, "").replace(/(?:\r\n|\r|\n)/g, '<br/>')); return new Handlebars.SafeString(value.replace(/(<([^>]+)>)/gi, "").replace(/(?:\r\n|\r|\n)/g, '<br/>'));
}); });
} }
function migrateWorld() {
// Determine whether a system migration is required and feasible
const currentVersion = game.settings.get("kopparhavet", "worldSchemaVersion");
const NEEDS_MIGRATION_VERSION = "0.0.3";
const COMPATIBLE_MIGRATION_VERSION = '0' || isNaN('NaN');
let needMigration = currentVersion < NEEDS_MIGRATION_VERSION || currentVersion === null;
// Perform the migration
if (needMigration && game.user.isGM) {
if (currentVersion && currentVersion < COMPATIBLE_MIGRATION_VERSION) {
ui.notifications.error(
`Your system data is from a version that cannot be reliably migrated to the latest version. The process will be attempted, but errors may occur.`,
{ permanent: true }
);
}
migrations.migrateWorld();
}
}

37
packs/skills-ht.db Normal file
View File

@@ -0,0 +1,37 @@
{"name":"Fingerfärdighet","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.tmNI5YIYYjGuZK5i"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"AY9pFa3b9qB65CVM"}
{"name":"Gömma sig","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.Ewo6mu7WdoOcF6DD"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"LsEwsYN90mrMAwJC"}
{"name":"Handel","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.syxeJlio8vIrx0Lr"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"JjXlb1GNQEmgXut1"}
{"name":"Härkonst","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.Yvy3Ej3tDNhp0VVA"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"a1AxdXijThSi6VNG"}
{"name":"Jakt","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.orNrL49vWUePhLaU"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"tPSscak2iUxVNKyP"}
{"name":"Kastvapen","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.YpheXmaKsX9omtBA"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"BN9Y5YRwBk8rbWba"}
{"name":"Knivkamp","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.uctwxo07FCKCk2K4"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"TVRH99cyiGmAkUNY"}
{"name":"Lagkunskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.b9U8BXjNvI4LwlRX"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"fJQm2snkj0C6GcGG"}
{"name":"Läkekonst","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.bVEJBtXhXOkqIBek"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"RHcwYXp1WfnPDcTT"}
{"name":"Lärdom","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.5wz37ypKMn6tgtTr"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"2G92IWn9BCGtmqHv"}
{"name":"Ledarskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.DDZkgceLisZOYHEi"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"tHF9QafgX9sqfpAW"}
{"name":"Leta","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.0m5bA14oR16bB2Gt"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"sWHSbMOOBlhShKrP"}
{"name":"Manövrer","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.XF2eNRo6uMhDs5Uv"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"N4nreeMOFTOCmJWa"}
{"name":"Rida","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.boR4AGF8LD12ykoc"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"kEi1G8CoDO8R2Yqw"}
{"name":"Sjömannaskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.8org0OaWuKO6rCqm"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"12sCrhriIkvlBhZR"}
{"name":"Skaldekonst","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.dYcVgFgx6WmBWCeZ"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"Lgp89BnjQQ0QbWFG"}
{"name":"Skapa","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.DSWruhUT6DT9kY7Z"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"58gGOTfVYLJaYly0"}
{"name":"Sköldkamp","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"Qg4PmjVCFSylYlHM"}
{"name":"Skytte","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.KJLF5fDrZaA1DKg1"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"izHncfq2g44vxrOj"}
{"name":"Slagsmål","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.UkwUABDT8NB8y1mQ"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"LK3tbOXHrBpWxALq"}
{"name":"Spana","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.5oQCvQNiDSeIe8vI"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"YuPS88e7mNq0Ixm1"}
{"name":"Spel","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.bcRVOx8M3Ue6tgGz"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"bwfnRUbXSNEluqgP"}
{"name":"Spelmannaskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.eFeMJtv30eImpUMn"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"kpmj729kiYYHe8kS"}
{"name":"Spjutkamp","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.GxkoQ2KdPh9ogGuJ"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"MCw0iaS0jicX4EhH"}
{"name":"Språk","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.BkCe8HPX1wVYlsmV"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"082XSYN2gkCu7eiw"}
{"name":"Status","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.5NCkdBZ4lWwLzGwk"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"Hgpw4KoUqsE69Tgm"}
{"name":"Stigvana","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.NBRV1tzrIV9AmGka"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"DKSzGZr7iKavSq7A"}
{"name":"Styrkeprov","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.IC2RGKp9cEYzyIln"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"ULy4VKzv7TpbjBdK"}
{"name":"Svärdskamp","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.b9no6ZeE5KyG9AfT"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"tibPHZGChVumrm2B"}
{"name":"Trolldom","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.EVCN4lxeferZYP0P"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"WvUs3O5F7aksjM6D"}
{"name":"Uthållighet","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.Uc9XLdzkI7mGMTLL"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"bazsFyBhvZMOWKxh"}
{"name":"Väderkunskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.elGMSOQROaYXCEPA"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"AvQobAh7dQ3coziY"}
{"name":"Vältalighet","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.F5lkuwhO3WGl5yWk"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"qijUm0Gz9zSIr55P"}
{"name":"Viljestyrka","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.qbi9SN1V4bPT3T3Y"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"sqInbChYhQ1VhVUv"}
{"name":"Wyrd","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.TjVsmOs0PqbAzNUf"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"MD7Gz5QJYw1C98NM"}
{"name":"Yxkamp","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.VWaRRqiUlMw1nPUn"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"UJhsMDi2VNNFN9st"}

View File

@@ -1,36 +1,36 @@
{"name":"Smidighet","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"base","label":"SKILL.TYPE"},"value":"25","used":false},"flags":{"core":{"sourceId":"Item.tmNI5YIYYjGuZK5i"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"INlHwwv9wG4VA13D"} {"name":"Fingerfärdighet","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.syxeJlio8vIrx0Lr"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"IVuFDobCZTw5sEOw"}
{"name":"Trolldom","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.Ewo6mu7WdoOcF6DD"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"kIu2AL79urDjZV8z"} {"name":"Finna dolda ting","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.Yvy3Ej3tDNhp0VVA"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"Jp0pc8PlQ08uIQ81"}
{"name":"Fingerfärdighet","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.syxeJlio8vIrx0Lr"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"9gkb0ONyCuBcWwoB"} {"name":"Förleda","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.orNrL49vWUePhLaU"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"4WYeODaMqXG2Urxb"}
{"name":"Finna dolda ting","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.Yvy3Ej3tDNhp0VVA"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"PaieUawcyfKhfSCv"} {"name":"Gömma sig","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.b9U8BXjNvI4LwlRX"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"fUAmqrS5m3rlBqu3"}
{"name":"Förleda","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.orNrL49vWUePhLaU"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"JN1b5A5QHoinB5Gd"} {"name":"Handel","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.DDZkgceLisZOYHEi"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"Mw5OL5irndqEV0Cf"}
{"name":"Gömma sig","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.b9U8BXjNvI4LwlRX"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"A8DBqRLBJ0yU3Ebp"} {"name":"Hantverk","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.0m5bA14oR16bB2Gt"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"4XKApBWTI9agpijF"}
{"name":"Handel","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.DDZkgceLisZOYHEi"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"GS4NknpWIKYWceky"} {"name":"Insikt","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.bVEJBtXhXOkqIBek"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"DnixLDN5YqDmQ3w7"}
{"name":"Hantverk","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.0m5bA14oR16bB2Gt"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"imcYcYl21T4xewNa"} {"name":"Jakt","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.5wz37ypKMn6tgtTr"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"dhjKxKklgTKDQ6LI"}
{"name":"Insikt","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.bVEJBtXhXOkqIBek"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"NXJMfsrhYeCCEFP2"} {"name":"Kastvapen","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.XF2eNRo6uMhDs5Uv"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"MTwMDLf5SyNPpPaM"}
{"name":"Jakt","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.5wz37ypKMn6tgtTr"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"3EuThKpVWrtV1Myy"} {"name":"Knivar","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.boR4AGF8LD12ykoc"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"4Qz1KWm2vzYSviGo"}
{"name":"Kastvapen","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.XF2eNRo6uMhDs5Uv"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"33aM81M73ZyO1NNT"} {"name":"Lagkunskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.8org0OaWuKO6rCqm"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"OZZNcLo8kJEl5bxz"}
{"name":"Knivar","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.boR4AGF8LD12ykoc"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"dGpYfI8CLwxKSzas"} {"name":"Läkekonst","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.DSWruhUT6DT9kY7Z"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"39W3RKp0OYJ6ODHc"}
{"name":"Lagkunskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.8org0OaWuKO6rCqm"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"SYa97JM5u0aCNJMA"} {"name":"Lärdom","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.5oQCvQNiDSeIe8vI"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"3SIpCpZrFJ0Wo1yG"}
{"name":"Legender","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.dYcVgFgx6WmBWCeZ"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"JcmDWE2GxJ9HKIuT"} {"name":"Legender","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.dYcVgFgx6WmBWCeZ"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"9U3LFDwN8maRuB4O"}
{"name":"Läkekonst","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.DSWruhUT6DT9kY7Z"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"DqnFfN91ovo86QOn"} {"name":"Musik","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.bcRVOx8M3Ue6tgGz"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"07lF8ECXawymH6sJ"}
{"name":"Lärdom","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.5oQCvQNiDSeIe8vI"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"Y6kDWokNA81POqvG"} {"name":"Rida","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.eFeMJtv30eImpUMn"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"KwypnNBcjbpJHgNw"}
{"name":"Musik","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.bcRVOx8M3Ue6tgGz"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"5nMScpCnMbb77QfD"} {"name":"Sjömanskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.BkCe8HPX1wVYlsmV"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"dGFnaEQAwsbMe06A"}
{"name":"Rida","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.eFeMJtv30eImpUMn"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"lqRRrd1Qdmbv5Nay"} {"name":"Sköldar","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.NBRV1tzrIV9AmGka"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"h0t1HszSchtAU4CD"}
{"name":"Sjömanskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.BkCe8HPX1wVYlsmV"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"JIEl6a3sIkH2V5wX"} {"name":"Skytte","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.5NCkdBZ4lWwLzGwk"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"IuE45fz0yTGXeAeg"}
{"name":"Skytte","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.5NCkdBZ4lWwLzGwk"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"jEoMTkqoxQ9iSaoB"} {"name":"Slagsmål","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.IC2RGKp9cEYzyIln"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"93J8eMq8Ruii7HGQ"}
{"name":"Sköldar","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.NBRV1tzrIV9AmGka"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"OkDh0xCD26hUrthN"} {"name":"Smidighet","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"base","label":"SKILL.TYPE"},"value":"25","used":false},"flags":{"core":{"sourceId":"Item.tmNI5YIYYjGuZK5i"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"bj1YnS866BInFyBC"}
{"name":"Slagsmål","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.IC2RGKp9cEYzyIln"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"afCvHSTrmDWNkj31"} {"name":"Spana","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.EVCN4lxeferZYP0P"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"9thUjlghPlpJCeVu"}
{"name":"Spana","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.EVCN4lxeferZYP0P"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"Z0pWniEH3MBU69g6"} {"name":"Spel","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.Uc9XLdzkI7mGMTLL"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"kPJ2fnAXyQJYn9r7"}
{"name":"Spel","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.Uc9XLdzkI7mGMTLL"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"HigGBE4oUC9yYMYw"} {"name":"Spjut","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.qbi9SN1V4bPT3T3Y"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"yFBhPZrfG35GZlJ6"}
{"name":"Spjut","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.qbi9SN1V4bPT3T3Y"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"Ab22ZgWUiHl83kLQ"} {"name":"Språk","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.elGMSOQROaYXCEPA"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"YjhRgpl5EKPuLfqd"}
{"name":"Språk","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.elGMSOQROaYXCEPA"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"VZx4zxd72g4tKvAd"} {"name":"Status","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.F5lkuwhO3WGl5yWk"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"B9l1Gg5jDycSRvmN"}
{"name":"Status","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.F5lkuwhO3WGl5yWk"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"eaooVeqja7pzzC1X"} {"name":"Stigvana","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.TjVsmOs0PqbAzNUf"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"nBfDHdCERZngNS3o"}
{"name":"Stigvana","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.TjVsmOs0PqbAzNUf"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"dR4UbIXYyCovTGzA"} {"name":"Styrka","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"base","label":"SKILL.TYPE"},"value":"25","used":false},"flags":{"core":{"sourceId":"Item.YpheXmaKsX9omtBA"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"K47Rdtaomx6ixCj6"}
{"name":"Styrka","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"base","label":"SKILL.TYPE"},"value":"25","used":false},"flags":{"core":{"sourceId":"Item.YpheXmaKsX9omtBA"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"anObCIyX3DdSjNPY"} {"name":"Svärd","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.uctwxo07FCKCk2K4"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"BLw8iWU04QAVCwI1"}
{"name":"Svärd","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.uctwxo07FCKCk2K4"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"IketG7YFZuGHnihF"} {"name":"Taktik","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.KJLF5fDrZaA1DKg1"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"my0qR3hj3MW6q0pW"}
{"name":"Taktik","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.KJLF5fDrZaA1DKg1"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"5xTZzjUd7x2EgmG2"} {"name":"Trolldom","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.Ewo6mu7WdoOcF6DD"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"LUq6INKpJDcNtG20"}
{"name":"Uthållighet","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"base","label":"SKILL.TYPE"},"value":"25","used":false},"flags":{"core":{"sourceId":"Item.VWaRRqiUlMw1nPUn"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"4yFL38tdvBenZKBQ"} {"name":"Utstrålning","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"base","label":"SKILL.TYPE"},"value":"25","used":false},"flags":{"core":{"sourceId":"Item.VWaRRqiUlMw1nPUn"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"7Bu4TQh7TvH01Kld"}
{"name":"Viljestyrka","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"base","label":"SKILL.TYPE"},"value":"25","used":false},"flags":{"core":{"sourceId":"Item.UkwUABDT8NB8y1mQ"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"vyW9DUMDPYqBSCtz"} {"name":"Väderkunskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.GxkoQ2KdPh9ogGuJ"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"BkBOOXT7r5D1O2dd"}
{"name":"Väderkunskap","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"adventure","label":"SKILL.TYPE"},"value":"15","used":false},"flags":{"core":{"sourceId":"Item.GxkoQ2KdPh9ogGuJ"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"TEOcwEm0Z9GzJS6h"} {"name":"Viljestyrka","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"base","label":"SKILL.TYPE"},"value":"25","used":false},"flags":{"core":{"sourceId":"Item.UkwUABDT8NB8y1mQ"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"f3hTLYs6zBhLfpTE"}
{"name":"Yxor","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.b9no6ZeE5KyG9AfT"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"BKu4BwEspAMQ5Yn3"} {"name":"Yxor","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"combat","label":"SKILL.TYPE"},"value":"30","used":false},"flags":{"core":{"sourceId":"Item.b9no6ZeE5KyG9AfT"},"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"cn51JP1hsyEz8u56"}
{"name":"Utstrålning","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"base","label":"SKILL.TYPE"},"value":"25","used":false},"flags":{"core":{"sourceId":"Item.VWaRRqiUlMw1nPUn"}},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"4yFL38tdvBenZKBQ"} {"name":"Uthållighet","permission":{"default":0,"tSnD115pP1EPBAXK":3},"type":"skill","data":{"description":{"value":"","type":"String","label":"ITEM.DESCRIPTION"},"type":{"value":"base","label":"SKILL.TYPE"},"value":"25","used":false},"flags":{"loaded":false},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"MnkH6ttZ29JN1vI6"}

View File

@@ -188,4 +188,20 @@
} }
.sheet-tabs { .sheet-tabs {
min-height: 36px;
}
.relation-list li:not(:last-child) {
margin-bottom: 5px;
}
.learning-list li:not(:last-child) {
margin-bottom: 5px;
}
.learning-list .learning,
.relation-list .relation {
padding: 0 0 5px;
border-bottom: 1px solid #bbb;
text-align: center;
} }

View File

@@ -97,17 +97,24 @@
margin: auto; margin: auto;
} }
.items .items-list .item { .items .items-list .item,
.items .items-list .item-spell,
.items .items-list .item-weapon,
.items .items-list .item-skill,
.items .items-list .item-nor,
.items .items-list .item-defence {
line-height: 24px; line-height: 24px;
padding: 3px 0; padding: 3px 0;
border-bottom: 1px solid #bbb; border-bottom: 1px solid #bbb;
text-align: center; text-align: center;
} }
.items .items-list .item .toggle-equipped { .items .items-list .item .toggle-equipped,
.items .items-list .item-weapon .toggle-equipped {
color: #888; color: #888;
} }
.items .items-list .item .toggle-equipped.active { .items .items-list .item .toggle-equipped.active,
.items .items-list .item-weapon .toggle-equipped.active{
color: #191813; color: #191813;
} }

View File

@@ -2,10 +2,10 @@
"name": "kopparhavet", "name": "kopparhavet",
"title": "Kopparhavets Hjältar", "title": "Kopparhavets Hjältar",
"description": "The Molten Sea is a dangerous but exciting place, where pirates, sorcerers and secretive orders of knighthood struggle for power, wealth and ancient lore.", "description": "The Molten Sea is a dangerous but exciting place, where pirates, sorcerers and secretive orders of knighthood struggle for power, wealth and ancient lore.",
"version": "0.0.1", "version": "0.0.3",
"minimumCoreVersion": "0.7.5", "minimumCoreVersion": "0.7.5",
"compatibleCoreVersion": "0.7.7", "compatibleCoreVersion": "0.7.7",
"templateVersion": 3, "templateVersion": 4,
"author": "Erebus", "author": "Erebus",
"scripts": [], "scripts": [],
"esmodules": [ "esmodules": [
@@ -21,10 +21,17 @@
"packs": [ "packs": [
{ {
"name": "skills", "name": "skills",
"label": "Skills", "label": "Kopparhavets Hjältar Färdigheter",
"system": "kopparhavet", "system": "kopparhavet",
"path": "./packs/skills.db", "path": "./packs/skills.db",
"entity": "Item" "entity": "Item"
},
{
"name": "skills-ht",
"label": "Hjältarnas Tid Färdigheter",
"system": "kopparhavet",
"path": "./packs/skills-ht.db",
"entity": "Item"
} }
], ],
"languages": [ "languages": [
@@ -46,6 +53,6 @@
"url": "https://pi.rikspolisen.se/foundryvtt/kopparhavet", "url": "https://pi.rikspolisen.se/foundryvtt/kopparhavet",
"socket": true, "socket": true,
"manifest": "https://pi.rikspolisen.se/foundryvtt/kopparhavet/raw/branch/master/system.json", "manifest": "https://pi.rikspolisen.se/foundryvtt/kopparhavet/raw/branch/master/system.json",
"download": "https://pi.rikspolisen.se/foundryvtt/kopparhavet/archive/v0.0.1.zip", "download": "https://pi.rikspolisen.se/foundryvtt/kopparhavet/archive/v0.0.3.zip",
"license": "" "license": ""
} }

View File

@@ -41,44 +41,6 @@
"stats", "stats",
"combat" "combat"
], ],
"baseSkills": [
"Smidighet",
"Trolldom",
"Fingerfärdighet",
"Finna dolda ting",
"Förleda",
"Gömma sig",
"Handel",
"Hantverk",
"Insikt",
"Jakt",
"Kastvapen",
"Knivar",
"Lagkunskap",
"Legender",
"Läkekonst",
"Lärdom",
"Musik",
"Rida",
"Sjömanskap",
"Skytte",
"Sköldar",
"Slagsmål",
"Spana",
"Spel",
"Spjut",
"Språk",
"Status",
"Stigvana",
"Styrka",
"Svärd",
"Taktik",
"Uthållighet",
"Utstrålning",
"Viljestyrka",
"Väderkunskap",
"Yxor"
],
"bio": { "bio": {
"kin": { "kin": {
"label": "BIO.KIN", "label": "BIO.KIN",
@@ -88,9 +50,17 @@
"label": "BIO.PROFESSION", "label": "BIO.PROFESSION",
"value": "" "value": ""
}, },
"nickname": {
"label": "BIO.NICKNAME",
"value": ""
},
"age": { "age": {
"label": "BIO.AGE", "label": "BIO.AGE",
"value": "" "value": ""
},
"appearance": {
"label": "BIO.APPEARANCE",
"value": ""
} }
}, },
"background": { "background": {
@@ -142,7 +112,8 @@
"label": "CURRENCY.QUARTER", "label": "CURRENCY.QUARTER",
"value": 0 "value": 0
} }
} },
"relationships": {}
}, },
"adversary": { "adversary": {
"templates": [ "templates": [
@@ -259,9 +230,12 @@
"core" "core"
], ],
"roll": { "roll": {
"value": "", "value": "roll",
"type": "String", "type": "String",
"label": "SPELL.ROLL" "label": "SPELL.ROLLTITLE",
"skill": "Trolldom",
"oppositeskill": "",
"ritual": {}
}, },
"cost": { "cost": {
"value": "", "value": "",

View File

@@ -1,19 +1,19 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<div class="character"> <div class="character">
<div class="header grid-container" style="grid-template-columns: auto auto 1.7fr 2fr;"> <div class="header grid-container" style="grid-template-columns: auto auto 1fr auto 1fr; margin-bottom: 10px;">
<div class="avatar flex-group-center" style="grid-row: 1/7;"> <div class="avatar flex-group-center" style="grid-row: 1/7;">
<img class="profile-img actor-avatar-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" /> <img class="profile-img actor-avatar-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" />
</div> </div>
<label style="margin: auto;">{{localize "BIO.NAME"}}:</label> <label style="margin: auto;">{{localize "BIO.NAME"}}:</label>
<h1 class="charname" style="margin-bottom: 0;grid-column: 3/5;"><input name="name" type="text" value="{{actor.name}}" placeholder="{{localize "BIO.NAME"}}" /></h1> <h1 class="charname" style="margin-bottom: 0;grid-column: 3/6;"><input name="name" type="text" value="{{actor.name}}" placeholder="{{localize "BIO.NAME"}}" /></h1>
<label style="margin: auto;">{{localize data.bio.profession.label}}:</label>
<input name="data.bio.profession.value" type="text" value="{{data.bio.profession.value}}" placeholder="{{localize data.bio.profession.label}}" />
<label style="margin: auto;">{{localize data.bio.kin.label}}:</label> <label style="margin: auto;">{{localize data.bio.kin.label}}:</label>
<input name="data.bio.kin.value" type="text" value="{{data.bio.kin.value}}" placeholder="{{localize data.bio.kin.label}}" /> <input name="data.bio.kin.value" type="text" value="{{data.bio.kin.value}}" placeholder="{{localize data.bio.kin.label}}" />
<label style="margin: auto;">{{localize data.bio.profession.label}}:</label>
<input name="data.bio.profession.value" type="text" value="{{data.bio.profession.value}}" placeholder="{{localize data.bio.profession.label}}" />
<label style="margin: auto;">{{localize data.health.label}}:</label> <label style="margin: auto;">{{localize data.health.label}}:</label>
<div class="grid-container" style="grid-template-columns: auto 1fr auto;"> <div class="grid-container" style="grid-template-columns: auto 1fr auto;">
<input class="center-text" type="text" name="data.health.value" value="{{data.health.value}}" data-dtype="Number" /> <input class="center-text" type="text" name="data.health.value" value="{{data.health.value}}" data-dtype="Number" />
@@ -34,35 +34,11 @@
<span> / </span> <span> / </span>
<input class="center-text" type="text" name="data.mana.max" value="{{data.mana.max}}" data-dtype="Number" /> <input class="center-text" type="text" name="data.mana.max" value="{{data.mana.max}}" data-dtype="Number" />
</div> </div>
<div class="border grid-container" style="grid-column-gap: 5px; grid-column: 4; grid-row: 2/7; grid-template-columns: 1fr auto;">
<h2 style="margin-bottom: 0; grid-column: 1/3;">{{localize "FEATURES.TITLE"}}</h2>
<input name="data.feature.one.label" class="roll-feature" type="text" value="{{data.feature.one.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.one.value}}active{{/if}}" data-feature="one">
<i class="far {{#if data.feature.one.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<input name="data.feature.two.label" class="roll-feature" type="text" value="{{data.feature.two.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.two.value}}active{{/if}}" data-feature="two">
<i class="far {{#if data.feature.two.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<input name="data.feature.three.label" class="roll-feature" type="text" value="{{data.feature.three.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.three.value}}active{{/if}}" data-feature="three">
<i class="far {{#if data.feature.three.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<input name="data.feature.four.label" class="roll-feature" type="text" value="{{data.feature.four.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.four.value}}active{{/if}}" data-feature="four">
<i class="far {{#if data.feature.four.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
</div>
</div> </div>
<div class="sheet-tabs tabs flex row" data-group="primary"> <div class="sheet-tabs tabs flex row" data-group="primary">
<b class="item" data-tab="main">{{localize "TAB.MAIN"}}</b>
<b class="item" data-tab="skills">{{localize "TAB.SKILLS"}}</b> <b class="item" data-tab="skills">{{localize "TAB.SKILLS"}}</b>
<!-- <b class="item" data-tab="combat">{{localize "TAB.COMBAT"}}</b> -->
<b class="item" data-tab="talent">{{localize "TAB.TALENTS"}}</b> <b class="item" data-tab="talent">{{localize "TAB.TALENTS"}}</b>
<b class="item" data-tab="gear">{{localize "TAB.GEAR"}}</b> <b class="item" data-tab="gear">{{localize "TAB.GEAR"}}</b>
<b class="item" data-tab="bio">{{localize "TAB.BIO"}}</b> <b class="item" data-tab="bio">{{localize "TAB.BIO"}}</b>
@@ -70,14 +46,12 @@
</div> </div>
<div class="sheet-body"> <div class="sheet-body">
<div class="tab" data-group="primary" data-tab="main">
{{> systems/kopparhavet/templates/parts/actor/main.html}}
</div>
<div class="tab" data-group="primary" data-tab="skills"> <div class="tab" data-group="primary" data-tab="skills">
{{> systems/kopparhavet/templates/parts/actor/skills.html}} {{> systems/kopparhavet/templates/parts/actor/skills.html}}
</div> </div>
<!--
<div class="tab" data-group="primary" data-tab="combat">
{{> systems/kopparhavet/templates/parts/actor/combat.html}}
</div>
-->
<div class="tab" data-group="primary" data-tab="talent"> <div class="tab" data-group="primary" data-tab="talent">
{{> systems/kopparhavet/templates/parts/actor/talent.html}} {{> systems/kopparhavet/templates/parts/actor/talent.html}}
</div> </div>

View File

@@ -0,0 +1,51 @@
<form class="{{cssClass}}" autocomplete="off">
<div class="adversary">
<div class="header grid-container" style="grid-template-columns: auto 1fr auto 1fr auto;margin-bottom: 5px">
<div class="avatar flex-group-center" style="grid-row: 1/7;">
<img class="profile-img actor-avatar-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" />
</div>
<label style="margin: auto;">{{localize "BIO.NAME"}}:</label>
<h1 class="charname" style="margin-bottom: 0;grid-column: 3/6;"><input name="name" type="text" value="{{actor.name}}" placeholder="{{localize "BIO.NAME"}}" /></h1>
<label style="margin: auto;">{{localize data.health.label}}:</label>
<div class="grid-container" style="grid-template-columns: auto 1fr auto;">
<input class="center-text" type="text" name="data.health.value" value="{{data.health.value}}" data-dtype="Number" />
<span> / </span>
<input class="center-text" type="text" name="data.health.max" value="{{data.health.max}}" data-dtype="Number" />
</div>
<label style="margin: auto;">{{localize data.stamina.label}}:</label>
<div class="grid-container" style="grid-template-columns: auto 1fr auto;">
<input class="center-text" type="text" name="data.stamina.value" value="{{data.stamina.value}}" data-dtype="Number" />
<span> / </span>
<input class="center-text" type="text" name="data.stamina.max" value="{{data.stamina.max}}" data-dtype="Number" />
</div>
<label style="margin: auto;">{{localize data.mana.label}}:</label>
<div class="grid-container" style="grid-template-columns: auto 1fr auto;">
<input class="center-text" type="text" name="data.mana.value" value="{{data.mana.value}}" data-dtype="Number" />
<span> / </span>
<input class="center-text" type="text" name="data.mana.max" value="{{data.mana.max}}" data-dtype="Number" />
</div>
</div>
<div class="sheet-tabs tabs flex row" data-group="primary">
<b class="item" data-tab="combat">{{localize "TAB.COMBAT"}}</b>
<b class="item" data-tab="talent">{{localize "TAB.TALENTS"}}</b>
<b class="item" data-tab="note">{{localize "TAB.NOTE"}}</b>
</div>
<div class="sheet-body">
<div class="tab" data-group="primary" data-tab="combat">
{{> systems/kopparhavet/templates/parts/actor/ht-combat.html}}
</div>
<div class="tab" data-group="primary" data-tab="talent">
{{> systems/kopparhavet/templates/parts/actor/talent.html}}
</div>
<div class="tab border note" data-group="primary" data-tab="note" style="height: 100%; border-top: none;">
{{editor content=data.bio.note.value target="data.bio.note.value" button=true owner=owner editable=editable}}
</div>
</div>
</div>
</form>

View File

@@ -0,0 +1,68 @@
<form class="{{cssClass}}" autocomplete="off">
<div class="character">
<div class="header grid-container" style="grid-template-columns: auto auto 1fr auto 1fr; margin-bottom: 10px;">
<div class="avatar flex-group-center" style="grid-row: 1/8;">
<img class="profile-img actor-avatar-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" />
</div>
<label style="margin: auto;">{{localize "BIO.NAME"}}:</label>
<h1 class="charname" style="margin-bottom: 0; grid-column: 3/6;"><input name="name" type="text" value="{{actor.name}}" placeholder="{{localize "BIO.NAME"}}" /></h1>
<label style="margin: auto;">{{localize data.bio.nickname.label}}:</label>
<input name="data.bio.nickname.value" style="grid-column: 3/6;" type="text" value="{{data.bio.nickname.value}}" placeholder="{{localize data.bio.nickname.label}}" />
<label style="margin: auto;">{{localize data.bio.kin.label}}:</label>
<input name="data.bio.kin.value" type="text" value="{{data.bio.kin.value}}" placeholder="{{localize data.bio.kin.label}}" />
<label style="margin: auto;">{{localize data.bio.profession.label}}:</label>
<input name="data.bio.profession.value" type="text" value="{{data.bio.profession.value}}" placeholder="{{localize data.bio.profession.label}}" />
<label style="margin: auto;">{{localize data.health.label}}:</label>
<div class="grid-container" style="grid-template-columns: auto 1fr auto;">
<input class="center-text" type="text" name="data.health.value" value="{{data.health.value}}" data-dtype="Number" />
<span> / </span>
<input class="center-text" type="text" name="data.health.max" value="{{data.health.max}}" data-dtype="Number" />
</div>
<label style="margin: auto;">{{localize data.stamina.label}}:</label>
<div class="grid-container" style="grid-template-columns: auto 1fr auto;">
<input class="center-text" type="text" name="data.stamina.value" value="{{data.stamina.value}}" data-dtype="Number" />
<span> / </span>
<input class="center-text" type="text" name="data.stamina.max" value="{{data.stamina.max}}" data-dtype="Number" />
</div>
<label style="margin: auto;">{{localize data.mana.label}}:</label>
<div class="grid-container" style="grid-template-columns: auto 1fr auto;">
<input class="center-text" type="text" name="data.mana.value" value="{{data.mana.value}}" data-dtype="Number" />
<span> / </span>
<input class="center-text" type="text" name="data.mana.max" value="{{data.mana.max}}" data-dtype="Number" />
</div>
</div>
<div class="sheet-tabs tabs flex row" data-group="primary">
<b class="item" data-tab="main">{{localize "TAB.MAIN"}}</b>
<b class="item" data-tab="skills">{{localize "TAB.SKILLS"}}</b>
<b class="item" data-tab="talent">{{localize "TAB.TALENTS"}}</b>
<b class="item" data-tab="gear">{{localize "TAB.GEAR"}}</b>
<b class="item" data-tab="note">{{localize "TAB.NOTE"}}</b>
</div>
<div class="sheet-body">
<div class="tab" data-group="primary" data-tab="main">
{{> systems/kopparhavet/templates/parts/actor/ht-main.html}}
</div>
<div class="tab" data-group="primary" data-tab="skills">
{{> systems/kopparhavet/templates/parts/actor/ht-skills.html}}
</div>
<div class="tab" data-group="primary" data-tab="talent">
{{> systems/kopparhavet/templates/parts/actor/talent.html}}
</div>
<div class="tab" data-group="primary" data-tab="gear">
{{> systems/kopparhavet/templates/parts/actor/gear.html}}
</div>
<div class="tab note border" data-group="primary" data-tab="note" style="border-top: none;">
{{editor content=data.bio.note.value target="data.bio.note.value" button=true owner=owner editable=editable}}
</div>
</div>
</div>
</form>

View File

@@ -74,8 +74,7 @@
<strong>{{localize data.cost.label}}:</strong> {{data.cost.value}} <strong>{{localize data.cost.label}}:</strong> {{data.cost.value}}
<strong>{{localize data.difficulty.label}}:</strong> {{rollDifficulty data.difficulty.value}} <strong>{{localize data.difficulty.label}}:</strong> {{rollDifficulty data.difficulty.value}}
<div style="grid-column-start: 1; grid-column-end: 5;"> <div style="grid-column-start: 1; grid-column-end: 5;">
<strong>{{localize data.roll.label}}</strong> <strong>{{localize data.roll.label}}:</strong> {{spellRoll data.roll.value}}
{{data.roll.value}}
</div> </div>
</div> </div>
{{#if data.description}} {{#if data.description}}

View File

@@ -4,6 +4,16 @@
<div class="roll"> <div class="roll">
<div class="dice-roll"> <div class="dice-roll">
{{#if closed}}
<div style="text-align: center; margin-bottom: 0.5rem;">
{{localize "ROLL.CLOSED"}}: {{closed}}
</div>
{{/if}}
{{#if opened}}
<div style="text-align: center; margin-bottom: 0.5rem;">
{{localize "ROLL.OPENED"}}: {{opened}}
</div>
{{/if}}
<div class="dice-result"> <div class="dice-result">
{{#if showFormula}} {{#if showFormula}}
<div class="dice-formula-kh">{{res.formula}}</div> <div class="dice-formula-kh">{{res.formula}}</div>
@@ -13,14 +23,14 @@
</div> </div>
</div> </div>
{{#if success}} {{#if success}}
<div style="text-align: center; width: 100%; font-weight: bold; color: limegreen;"> <h2 style="border: none; text-align: center; width: 100%; font-weight: bold; color: limegreen;">
{{localize "ROLL.SUCCESS"}} {{#if excetional}}{{localize "ROLL.EXCEPTIONAL"}}{{/if}} {{localize "ROLL.SUCCESS"}}
</div> </h2>
{{/if}} {{/if}}
{{#if failure}} {{#if failure}}
<div style="text-align: center; width: 100%; font-weight: bold; color: darkred;"> <h2 style="border: none; text-align: center; width: 100%; font-weight: bold; color: darkred;">
{{localize "ROLL.FAILURE"}} {{#if excetional}}{{localize "ROLL.EXCEPTIONAL"}}{{/if}} {{localize "ROLL.FAILURE"}}
</div> </h2>
{{/if}} {{/if}}
</div> </div>
</div> </div>

View File

@@ -26,7 +26,24 @@
</div> </div>
<div style="grid-column-start: 1; grid-column-end: 3;"> <div style="grid-column-start: 1; grid-column-end: 3;">
<label>{{localize data.roll.label}}</label> <label>{{localize data.roll.label}}</label>
<input name="data.roll.value" type="text" value="{{data.roll.value}}" /> <select class="item-weapon-cat-select" name="data.roll.value">
{{#select data.roll.value}}
<option value="roll">{{localize "SPELL.ROLL"}}</option>
<option value="attackroll">{{localize "SPELL.ATTACKROLL"}}</option>
<option value="opposite">{{localize "SPELL.OPPOSITE"}}</option>
<option value="ritual">{{localize "SPELL.RITUAL"}}</option>
{{/select}}
</select>
</div>
<div style="grid-column-start: 1; grid-column-end: 3;">
<label>{{localize "ITEM.SKILL"}}</label>
<select class="item-weapon-skill-select" name="data.roll.skill">
{{#select data.roll.skill}}
{{#each this.khskills as |t|}}
<option value="{{t.name}}">{{t.name}}</option>
{{/each}}
{{/select}}
</select>
</div> </div>
</div> </div>
<div class="item"> <div class="item">

View File

@@ -2,16 +2,16 @@
<div class="combat border"> <div class="combat border">
<ul class="items"> <ul class="items">
<ul class="items-list"> <ul class="items-list">
<li class="item flexrow"> <li class="item-nor flexrow">
<div class="item-name" style="flex-grow: 8;">{{localize "MOD.INIT"}}</div> <div class="item-name" style="flex-grow: 8;">{{localize "MOD.INIT"}}</div>
<div class="item-value" style="flex: none;"><input name="data.combat.init" class="skill-value" type="number" value="{{data.combat.init}}" data-dtype="Number" /></div> <div class="item-value" style="flex: none;"><input name="data.combat.init" class="skill-value" type="number" value="{{data.combat.init}}" data-dtype="Number" /></div>
</li> </li>
<li class="item flexrow"> <li class="item-defence flexrow" data-defence="{{data.combat.defence}}">
<div class="item-name roll-defence rollable" data-defence="{{data.combat.defence}}" style="flex-grow: 8;">{{localize "ADVERSARY.DEFENCE"}}</div> <div class="item-name roll-defence rollable" data-defence="{{data.combat.defence}}" style="flex-grow: 8;">{{localize "ADVERSARY.DEFENCE"}}</div>
<div class="item-value" style="flex: none;"><input name="data.combat.defence" class="skill-value" type="text" value="{{data.combat.defence}}" /></div> <div class="item-value" style="flex: none;"><input name="data.combat.defence" class="skill-value" type="text" value="{{data.combat.defence}}" /></div>
</li> </li>
<li class="item flexrow"> <li class="item-nor flexrow">
<div class="item-name" style="flex-grow: 8;">{{localize "ADVERSARY.HASHELMET"}}</div> <div class="item-name" style="flex-grow: 8;">{{localize "ADVERSARY.HASHELMET"}}</div>
<div style="align-self: flex-end"> <div style="align-self: flex-end">
<a style="margin: auto;" class="adversary-helmet-click {{#if data.combat.helmet}}active{{/if}}"> <a style="margin: auto;" class="adversary-helmet-click {{#if data.combat.helmet}}active{{/if}}">
@@ -20,7 +20,7 @@
</div> </div>
</li> </li>
<li class="item flexrow"> <li class="item-nor flexrow">
<div class="item-name roll-adversary-armor rollable" data-armor="{{data.combat.armor}}" style="flex-grow: 8;">{{localize "ITEM.DEFENCE"}}</div> <div class="item-name roll-adversary-armor rollable" data-armor="{{data.combat.armor}}" style="flex-grow: 8;">{{localize "ITEM.DEFENCE"}}</div>
<div class="item-value" style="flex: none;"><input name="data.combat.armor" class="skill-value" type="text" value="{{data.combat.armor}}" /></div> <div class="item-value" style="flex: none;"><input name="data.combat.armor" class="skill-value" type="text" value="{{data.combat.armor}}" /></div>
</li> </li>
@@ -33,7 +33,7 @@
<ul class="items"> <ul class="items">
<ul class="items-list"> <ul class="items-list">
{{#each actor.skills as |skill key|}} {{#each actor.skills as |skill key|}}
<li class="item flexrow" data-item-id="{{skill._id}}"> <li class="item-skill flexrow" data-item-id="{{skill._id}}">
<div class="item-name roll-skill rollable" style="flex-grow: 8;">{{skill.name}}</div> <div class="item-name roll-skill rollable" style="flex-grow: 8;">{{skill.name}}</div>
<div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div> <div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div>
</li> </li>
@@ -52,7 +52,7 @@
<ul class="items-list"> <ul class="items-list">
{{#each actor.attacks as |item key|}} {{#each actor.attacks as |item key|}}
<li class="item flexrow" data-item-id="{{item._id}}" data-ability="{{item.data.skill.value}}"> <li class="item-attack flexrow" data-item-id="{{item._id}}" data-ability="{{item.data.skill.value}}">
<div class="item-name">{{item.name}}</div> <div class="item-name">{{item.name}}</div>
<div class="skill-roll"> <div class="skill-roll">
<div class="roll-button"> <div class="roll-button">
@@ -61,12 +61,12 @@
</div> </div>
<div class="skill-roll"> <div class="skill-roll">
<div class="roll-button"> <div class="roll-button">
<div class="roll-damage rollable">{{item.data.damage.value}}</div> <div class="roll-attack-damage rollable">{{item.data.damage.value}}</div>
</div> </div>
</div> </div>
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" data-parent=".item-attack" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" data-parent=".item-attack" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@@ -20,7 +20,7 @@
</li> </li>
<ul class="items-list"> <ul class="items-list">
{{#each actor.weapons as |item id|}} {{#each actor.weapons as |item id|}}
<li class="item flexrow" data-item-id="{{item._id}}" data-ability="{{item.data.skill.value}}"> <li class="item-weapon flexrow" data-item-id="{{item._id}}" data-ability="{{item.data.skill.value}}">
<div class="item-name">{{item.name}}</div> <div class="item-name">{{item.name}}</div>
<div> <div>
{{#if item.data.equipable.equipped}} {{#if item.data.equipable.equipped}}
@@ -40,8 +40,8 @@
</div> </div>
</div> </div>
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" data-parent=".item-weapon" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" data-parent=".item-weapon" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -79,8 +79,8 @@
</div> </div>
{{/if}} {{/if}}
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" data-parent=".item" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" data-parent=".item" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -105,8 +105,8 @@
<div class="quantity decrease"><i class="far fa-minus-square"></i></div> <div class="quantity decrease"><i class="far fa-minus-square"></i></div>
</div> </div>
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" data-parent=".item" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" data-parent=".item" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@@ -0,0 +1,68 @@
<div class="border grid-container" style="height: 100%; border-top: none; grid-template-columns: 1fr 1fr; grid-template-rows: auto 1fr;">
<div class="combat border">
<ul class="items">
<ul class="items-list">
<li class="item-nor flexrow">
<div class="item-name" style="flex-grow: 8;">{{localize "MOD.INIT"}}</div>
<div class="item-value" style="flex: none;"><input name="data.combat.init" class="skill-value" type="number" value="{{data.combat.init}}" data-dtype="Number" /></div>
</li>
<li class="item-defence flexrow" data-defence="{{data.combat.defence}}">
<div class="item-name roll-defence rollable" data-defence="{{data.combat.defence}}" style="flex-grow: 8;">{{localize "ADVERSARY.DEFENCE"}}</div>
<div class="item-value" style="flex: none;"><input name="data.combat.defence" class="skill-value" type="text" value="{{data.combat.defence}}" /></div>
</li>
<li class="item-nor flexrow">
<div class="item-name roll-adversary-armor rollable" data-armor="{{data.combat.armor}}" style="flex-grow: 8;">{{localize "ITEM.DEFENCE"}}</div>
<div class="item-value" style="flex: none;"><input name="data.combat.armor" class="skill-value" type="text" value="{{data.combat.armor}}" /></div>
</li>
</ul>
</ul>
</div>
<div class="talents border" style="grid-row: 1/3; grid-column-start: 2;">
<h1 style="margin-bottom: 0; grid-column: 1/4;">{{localize "TAB.SKILLS"}}</h1>
<ul class="items">
<ul class="items-list">
{{#each actor.skills as |skill key|}}
<li class="item-skill flexrow" data-item-id="{{skill._id}}">
<div class="item-name roll-skill rollable" style="flex-grow: 8;">{{skill.name}}</div>
<div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div>
</li>
{{/each}}
</ul>
</ul>
</div>
<div class="attacks border">
<ul class="items">
<li class="items-header flexrow">
<div class="header-name">{{localize "ITEM.ATTACK"}}</div>
<div class="">{{localize "ITEM.SKILL"}}</div>
<div>{{localize "ITEM.DAMAGE"}}</div>
<div></div>
</li>
<ul class="items-list">
{{#each actor.attacks as |item key|}}
<li class="item-attack flexrow" data-item-id="{{item._id}}" data-ability="{{item.data.skill.value}}">
<div class="item-name">{{item.name}}</div>
<div class="skill-roll">
<div class="roll-button">
<div class="roll-adversary-attack rollable">{{item.data.skill.value}}</div>
</div>
</div>
<div class="skill-roll">
<div class="roll-button">
<div class="roll-attack-damage rollable">{{item.data.damage.value}}</div>
</div>
</div>
<div class="item-controls">
<a class="item-control item-edit" data-parent=".item-attack" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" data-parent=".item-attack" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</ul>
</div>
</div>

View File

@@ -0,0 +1,99 @@
<div class="bio-tab border scroll-y" style="height: 100%; border-top: none;">
<div class="grid-container" style="height: fit-content; border-top: none; grid-template-rows: 1fr auto auto; grid-template-columns: 1fr 1fr;">
<div class="border grid-container" style="height: 100%; grid-row: 1/4; grid-template-rows: auto 1fr; height: fit-content; min-height: 200px;">
<h2 style="margin-bottom: 0;">{{localize data.bio.appearance.label}}</h2>
<div class="description">
{{editor content=data.bio.appearance.value target="data.bio.appearance.value" button=true owner=owner editable=editable}}
</div>
</div>
<div class="border grid-container" style="grid-column-gap: 5px; grid-template-columns: 1fr auto; max-height: 163px;">
<h2 style="margin-bottom: 0; grid-column: 1/3;">{{localize "HT.FEATURES.TITLE"}}</h2>
<input name="data.feature.one.label" class="roll-feature" type="text" value="{{data.feature.one.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.one.value}}active{{/if}}" data-feature="one">
<i class="far {{#if data.feature.one.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<input name="data.feature.two.label" class="roll-feature" type="text" value="{{data.feature.two.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.two.value}}active{{/if}}" data-feature="two">
<i class="far {{#if data.feature.two.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<input name="data.feature.three.label" class="roll-feature" type="text" value="{{data.feature.three.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.three.value}}active{{/if}}" data-feature="three">
<i class="far {{#if data.feature.three.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<input name="data.feature.four.label" class="roll-feature" type="text" value="{{data.feature.four.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.four.value}}active{{/if}}" data-feature="four">
<i class="far {{#if data.feature.four.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
</div>
<div class="border">
<header class="relation-header" >
<h2 class="grid-container" style="margin-bottom: 0; grid-template-columns: 2fr 1fr auto;">
{{localize "HT.RELATIONSHIP.TITLE"}}
<div></div>
<a class="relation-control" data-action="create"><i class="fas fa-plus"></i></a>
</h2>
</header>
<ol class="relation-list" style="padding: 0;">
{{#each data.relationships as |attr key|}}
<li class="relation grid-container" style="grid-template-columns: 2fr auto auto;" data-attribute="{{key}}">
<input class="relation-key" type="text" name="data.relationships.{{key}}.key" value="{{key}}" style="display: none;" />
<input class="relation-value" type="text" name="data.relationships.{{key}}.value" value="{{attr.value}}" />
<a style="margin: auto 10px;" class="relation-click {{#if attr.check}}active{{/if}}">
<i class="far {{#if attr.check}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a style="margin: auto;" class="relation-control" data-action="delete"><i class="fas fa-trash"></i></a>
</li>
{{/each}}
</ol>
</div>
<div class="border">
<header class="learning-header" >
<h2 class="grid-container" style="margin-bottom: 0; grid-template-columns: 2fr 1fr auto;">
{{localize "LEARNING.TITLE"}}
<div></div>
<a class="learning-control" data-action="create"><i class="fas fa-plus"></i></a>
</h2>
</header>
<ol class="learning-list" style="padding: 0;">
{{#each data.learning as |attr key|}}
<li class="learning grid-container" style="grid-template-columns: 2fr auto auto;" data-attribute="{{key}}">
<input class="learning-key" type="text" name="data.learning.{{key}}.key" value="{{key}}" style="display: none;" />
<input style="margin-top: auto; margin-bottom: auto;" class="learning-value" type="text" name="data.learning.{{key}}.value" value="{{attr.value}}" />
<div class="grid-container" style="margin: auto 10px; grid-template-rows: auto auto; grid-template-columns: auto auto auto auto;">
<a data-num="one" class="learning-click {{#if attr.one}}active{{/if}}">
<i class="far {{#if attr.one}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="two" class="learning-click {{#if attr.two}}active{{/if}}">
<i class="far {{#if attr.two}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="three" class="learning-click {{#if attr.three}}active{{/if}}">
<i class="far {{#if attr.three}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="four" class="learning-click {{#if attr.four}}active{{/if}}">
<i class="far {{#if attr.four}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="five" class="learning-click {{#if attr.five}}active{{/if}}">
<i class="far {{#if attr.five}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="six" class="learning-click {{#if attr.six}}active{{/if}}">
<i class="far {{#if attr.six}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="seven" class="learning-click {{#if attr.seven}}active{{/if}}">
<i class="far {{#if attr.seven}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="eight" class="learning-click {{#if attr.eight}}active{{/if}}">
<i class="far {{#if attr.eight}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
</div>
<a style="margin: auto;" class="learning-control" data-action="delete"><i class="fas fa-trash"></i></a>
</li>
{{/each}}
</ol>
</div>
</div>
</div>

View File

@@ -0,0 +1,46 @@
<div class="skills-tab border scroll-y grid-container" style="grid-template-columns: 1fr 1fr; border-top: none;">
<div class="skills border" style="grid-column: 2; grid-row: 1/5;">
<h1 style="margin-bottom: 0; grid-column: 1/4;">{{localize "SKILL.ADVENTURE"}}</h1>
<ul class="items">
<ul class="items-list">
{{#each actor.skills as |skill key|}}
{{#if skill.hasAdventure}}
<li class="item-skill flexrow" data-item-id="{{skill._id}}">
<div class="item-name roll-skill rollable" style="flex-grow: 8;">{{skill.name}}</div>
<div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div>
<div style="align-self: flex-end; margin-top: auto; margin-bottom: auto;">
<a style="margin: auto;" class="click-skill {{#if skill.data.used}}active{{/if}}" data-item-id="{{skill._id}}">
<i class="far {{#if skill.data.used}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
</div>
</li>
{{/if}}
{{/each}}
</ul>
</ul>
</div>
<div class="skills border">
<h1 style="margin-bottom: 0; grid-column: 1/4;">{{localize "SKILL.COMBAT"}}</h1>
<ul class="items">
<ul class="items-list">
{{#each actor.skills as |skill key|}}
{{#if skill.hasCombat}}
<li class="item-skill flexrow" data-item-id="{{skill._id}}">
<div class="item-name roll-skill rollable" style="flex-grow: 8;">{{skill.name}}</div>
<div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div>
<div style="align-self: flex-end; margin-top: auto; margin-bottom: auto;">
<a style="margin: auto;" class="click-skill {{#if skill.data.used}}active{{/if}}" data-item-id="{{skill._id}}">
<i class="far {{#if skill.data.used}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
</div>
</li>
{{/if}}
{{/each}}
</ul>
</ul>
</div>
<div class="skills border grid-container" style="grid-column-gap: 5px; grid-template-columns: 1fr;">
<h1 style="grid-column: unset;">{{localize data.languages.label}}</h1>
<input name="data.languages.value" type="text" value="{{data.languages.value}}" />
</div>
</div>

View File

@@ -0,0 +1,78 @@
<div class="bio-tab border scroll-y" style="height: 100%; border-top: none;">
<div class="grid-container" style="height: fit-content; border-top: none; grid-template-rows: 1fr auto; grid-template-columns: 1fr 1fr;">
<div class="border grid-container" style="height: 100%; grid-row: 1/4; grid-template-rows: auto 1fr; height: fit-content; min-height: 200px;">
<h2 style="margin-bottom: 0;">{{localize data.bio.appearance.label}}</h2>
<div class="description">
{{editor content=data.bio.appearance.value target="data.bio.appearance.value" button=true owner=owner editable=editable}}
</div>
</div>
<div class="border grid-container" style="grid-column-gap: 5px; grid-template-columns: 1fr auto; max-height: 163px;">
<h2 style="margin-bottom: 0; grid-column: 1/3;">{{localize "FEATURES.TITLE"}}</h2>
<input name="data.feature.one.label" class="roll-feature" type="text" value="{{data.feature.one.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.one.value}}active{{/if}}" data-feature="one">
<i class="far {{#if data.feature.one.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<input name="data.feature.two.label" class="roll-feature" type="text" value="{{data.feature.two.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.two.value}}active{{/if}}" data-feature="two">
<i class="far {{#if data.feature.two.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<input name="data.feature.three.label" class="roll-feature" type="text" value="{{data.feature.three.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.three.value}}active{{/if}}" data-feature="three">
<i class="far {{#if data.feature.three.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<input name="data.feature.four.label" class="roll-feature" type="text" value="{{data.feature.four.label}}" />
<a style="margin: auto;" class="feature {{#if data.feature.four.value}}active{{/if}}" data-feature="four">
<i class="far {{#if data.feature.four.value}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
</div>
<div class="border">
<header class="learning-header" >
<h2 class="grid-container" style="margin-bottom: 0; grid-template-columns: 2fr 1fr auto;">
{{localize "LEARNING.TITLE"}}
<div></div>
<a class="learning-control" data-action="create"><i class="fas fa-plus"></i></a>
</h2>
</header>
<ol class="learning-list" style="padding: 0;">
{{#each data.learning as |attr key|}}
<li class="learning grid-container" style="grid-template-columns: 2fr auto auto;" data-attribute="{{key}}">
<input class="learning-key" type="text" name="data.learning.{{key}}.key" value="{{key}}" style="display: none;" />
<input style="margin-top: auto; margin-bottom: auto;" class="learning-value" type="text" name="data.learning.{{key}}.value" value="{{attr.value}}" />
<div class="grid-container" style="margin: auto 10px; grid-template-rows: auto auto; grid-template-columns: auto auto auto auto;">
<a data-num="one" class="learning-click {{#if attr.one}}active{{/if}}">
<i class="far {{#if attr.one}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="two" class="learning-click {{#if attr.two}}active{{/if}}">
<i class="far {{#if attr.two}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="three" class="learning-click {{#if attr.three}}active{{/if}}">
<i class="far {{#if attr.three}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="four" class="learning-click {{#if attr.four}}active{{/if}}">
<i class="far {{#if attr.four}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="five" class="learning-click {{#if attr.five}}active{{/if}}">
<i class="far {{#if attr.five}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="six" class="learning-click {{#if attr.six}}active{{/if}}">
<i class="far {{#if attr.six}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="seven" class="learning-click {{#if attr.seven}}active{{/if}}">
<i class="far {{#if attr.seven}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
<a data-num="eight" class="learning-click {{#if attr.eight}}active{{/if}}">
<i class="far {{#if attr.eight}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a>
</div>
<a style="margin: auto;" class="learning-control" data-action="delete"><i class="fas fa-trash"></i></a>
</li>
{{/each}}
</ol>
</div>
</div>
</div>

View File

@@ -5,10 +5,10 @@
<ul class="items-list"> <ul class="items-list">
{{#each actor.skills as |skill key|}} {{#each actor.skills as |skill key|}}
{{#if skill.hasBase}} {{#if skill.hasBase}}
<li class="item flexrow" data-item-id="{{skill._id}}"> <li class="item-skill flexrow" data-item-id="{{skill._id}}">
<div class="item-name roll-skill" style="flex-grow: 8;">{{skill.name}}</div> <div class="item-name roll-skill rollable" style="flex-grow: 8;">{{skill.name}}</div>
<div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div> <div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div>
<div style="align-self: flex-end"> <div style="align-self: flex-end; margin-top: auto; margin-bottom: auto;">
<a style="margin: auto;" class="click-skill {{#if skill.data.used}}active{{/if}}" data-item-id="{{skill._id}}"> <a style="margin: auto;" class="click-skill {{#if skill.data.used}}active{{/if}}" data-item-id="{{skill._id}}">
<i class="far {{#if skill.data.used}}fa-times-circle{{else}}fa-circle{{/if}}"></i> <i class="far {{#if skill.data.used}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a> </a>
@@ -25,10 +25,10 @@
<ul class="items-list"> <ul class="items-list">
{{#each actor.skills as |skill key|}} {{#each actor.skills as |skill key|}}
{{#if skill.hasAdventure}} {{#if skill.hasAdventure}}
<li class="item flexrow" data-item-id="{{skill._id}}"> <li class="item-skill flexrow" data-item-id="{{skill._id}}">
<div class="item-name roll-skill" style="flex-grow: 8;">{{skill.name}}</div> <div class="item-name roll-skill rollable" style="flex-grow: 8;">{{skill.name}}</div>
<div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div> <div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div>
<div style="align-self: flex-end"> <div style="align-self: flex-end; margin-top: auto; margin-bottom: auto;">
<a style="margin: auto;" class="click-skill {{#if skill.data.used}}active{{/if}}" data-item-id="{{skill._id}}"> <a style="margin: auto;" class="click-skill {{#if skill.data.used}}active{{/if}}" data-item-id="{{skill._id}}">
<i class="far {{#if skill.data.used}}fa-times-circle{{else}}fa-circle{{/if}}"></i> <i class="far {{#if skill.data.used}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a> </a>
@@ -45,10 +45,10 @@
<ul class="items-list"> <ul class="items-list">
{{#each actor.skills as |skill key|}} {{#each actor.skills as |skill key|}}
{{#if skill.hasCombat}} {{#if skill.hasCombat}}
<li class="item flexrow" data-item-id="{{skill._id}}"> <li class="item-skill flexrow" data-item-id="{{skill._id}}">
<div class="item-name roll-skill" style="flex-grow: 8;">{{skill.name}}</div> <div class="item-name roll-skill rollable" style="flex-grow: 8;">{{skill.name}}</div>
<div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div> <div class="item-value" style="flex: none;"><input class="skill-value" type="number" value="{{skill.data.value}}" min="0" data-item-id="{{skill._id}}" data-dtype="Number" /></div>
<div style="align-self: flex-end"> <div style="align-self: flex-end; margin-top: auto; margin-bottom: auto;">
<a style="margin: auto;" class="click-skill {{#if skill.data.used}}active{{/if}}" data-item-id="{{skill._id}}"> <a style="margin: auto;" class="click-skill {{#if skill.data.used}}active{{/if}}" data-item-id="{{skill._id}}">
<i class="far {{#if skill.data.used}}fa-times-circle{{else}}fa-circle{{/if}}"></i> <i class="far {{#if skill.data.used}}fa-times-circle{{else}}fa-circle{{/if}}"></i>
</a> </a>

View File

@@ -9,8 +9,8 @@
<li class="item flexrow" data-item-id="{{talent._id}}"> <li class="item flexrow" data-item-id="{{talent._id}}">
<div class="item-name">{{talent.name}}</div> <div class="item-name">{{talent.name}}</div>
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" data-parent=".item" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" data-parent=".item" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -25,13 +25,13 @@
<ul class="items"> <ul class="items">
<ul class="items-list"> <ul class="items-list">
{{#each actor.spells as |spell key|}} {{#each actor.spells as |spell key|}}
<li class="item flexrow" data-item-id="{{spell._id}}"> <li class="item-spell flexrow" data-item-id="{{spell._id}}">
<div class="item-name">{{spell.name}}</div> <div class="item-name roll-spell-skill rollable" style="margin-top: auto; margin-bottom: auto;">{{spell.name}}</div>
<div class="cost roll-spell-cost rollable">{{spell.data.cost.value}}</div> <div class="cost roll-spell-cost rollable">{{spell.data.cost.value}}</div>
<div class="difficulty">{{rollDifficulty spell.data.difficulty.value}}</div> <div class="difficulty">{{rollDifficulty spell.data.difficulty.value}}</div>
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" data-parent=".item-spell" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" data-parent=".item-spell" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@@ -0,0 +1,55 @@
<div id="{{id}}" class="roll-dialog">
<h1 style="text-align: center;">{{localize skillName}} ({{skillValue}})</h1>
<div class="flexrow" style="margin-bottom: 10px;">
<label style="margin: auto;">{{localize "ROLL.OPENCLOSE"}}</label>
<input type="button" name="openclosed" min="0" value="{{startopen}}" style="min-height: 30px; min-width: 45px;" />
<label name="notopenedorclosed" style="margin: auto; display: inline-block;">&nbsp;</label>
<label name="closed" style="margin: auto; display: none; text-align: center;">{{localize "ROLL.CLOSED"}}</label>
<label name="opened" style="margin: auto; display: none; text-align: center;">{{localize "ROLL.OPENED"}}</label>
</div>
</div>
<script>
(function() {
const scope = document.getElementById("{{{id}}}");
const input = scope.querySelector(`[name="openclosed"`);
const closed = scope.querySelector(`[name="closed"`);
const opened = scope.querySelector(`[name="opened"`);
const none = scope.querySelector(`[name="notopenedorclosed"`);
input.addEventListener("click", (event) => {
event.target.value++;
if(event.target.value > 0) {
closed.style.display = "none"
none.style.display = "none"
opened.style.display = "inline-block"
} else if(event.target.value < 0) {
opened.style.display = "none"
none.style.display = "none"
closed.style.display = "inline-block"
} else {
opened.style.display = "none"
closed.style.display = "none"
none.style.display = "inline-block"
}
});
input.addEventListener("contextmenu", (event) => {
event.target.value--;
if(event.target.value > 0) {
closed.style.display = "none"
none.style.display = "none"
opened.style.display = "inline-block"
} else if(event.target.value < 0) {
opened.style.display = "none"
none.style.display = "none"
closed.style.display = "inline-block"
} else {
opened.style.display = "none"
closed.style.display = "none"
none.style.display = "inline-block"
}
});
})();
</script>