diff --git a/README.md b/README.md index 32815b4..c9cfefd 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,20 @@ -# RMSS-FoundryVTT -An Implementation of the Rolemaster Standard System for FoundryVTT +# Rolemaster Standard System for Foundry VTT + +## Intro + +This is an in development implementation of the Rolemaster Standard System for FoundryVTT. All rights to the system remain property of Iron Crown Enterprises (http://ironcrown.com/). This system will not include any of the book content and aims to provide only what is on the reproducable character sheet. If you need access to the Rolemaster Standard System please purchase a copy of the PDF's via Drive Thru RPG (https://www.drivethrurpg.com/browse/pub/461/Iron-Crown-Enterprises). + +Early project goals include: + - A functionaing character sheet that automates some of the basic maths. + - A dice roller that allows you to perform the most common rolls in the system. + - A basic combat tracker + +## Credits + +This system is based on: + - the Foundry VTT Boilerplate system by XXX + - The video tutorials by Cédric Hauteville you can watch them here: https://www.youtube.com/playlist?list=PLFV9z59nkHDccUbRXVt623UdloPTclIrz + +Icons have been provided by https://game-icons.net + +This system uses less for CSS you can see a good installation guide for VSCode at https://code.visualstudio.com/docs/languages/css#_transpiling-sass-and-less-into-css \ No newline at end of file diff --git a/rmss/.gitignore b/rmss/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/rmss/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/rmss/.vscode/tasks.json b/rmss/.vscode/tasks.json new file mode 100644 index 0000000..56e3538 --- /dev/null +++ b/rmss/.vscode/tasks.json @@ -0,0 +1,14 @@ +// Less configuration +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Less Compile", + "type": "shell", + "command": "lessc less/rmss.less rmss.css", + "group": "build" + } + ] + } \ No newline at end of file diff --git a/rmss/assets/default/armor.svg b/rmss/assets/default/armor.svg new file mode 100644 index 0000000..744d93a --- /dev/null +++ b/rmss/assets/default/armor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rmss/assets/default/herb_or_poison.svg b/rmss/assets/default/herb_or_poison.svg new file mode 100644 index 0000000..e6c839c --- /dev/null +++ b/rmss/assets/default/herb_or_poison.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rmss/assets/default/skill.svg b/rmss/assets/default/skill.svg new file mode 100644 index 0000000..7c14647 --- /dev/null +++ b/rmss/assets/default/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rmss/assets/default/skill_category.svg b/rmss/assets/default/skill_category.svg new file mode 100644 index 0000000..cfa29a4 --- /dev/null +++ b/rmss/assets/default/skill_category.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rmss/assets/default/spell.svg b/rmss/assets/default/spell.svg new file mode 100644 index 0000000..fe3dc5b --- /dev/null +++ b/rmss/assets/default/spell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rmss/assets/default/transport.svg b/rmss/assets/default/transport.svg new file mode 100644 index 0000000..fda2257 --- /dev/null +++ b/rmss/assets/default/transport.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rmss/assets/default/weapon.svg b/rmss/assets/default/weapon.svg new file mode 100644 index 0000000..4321b18 --- /dev/null +++ b/rmss/assets/default/weapon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rmss/gulpfile.js b/rmss/gulpfile.js new file mode 100644 index 0000000..65e056a --- /dev/null +++ b/rmss/gulpfile.js @@ -0,0 +1,18 @@ +var gulp = require('gulp'); +var less = require('gulp.less'); + +gulp.task('less', function (cb) { + gulp + .src('less/rmss.less') + .pipe(less()) + .pipe(gulp.dest("./")); + cb(); +}); + +gulp.task( + 'default', + gulp.series('less', function(cb) { + gulp.watch('less/*.less', gulp.series('less')); + cb(); + }) +); \ No newline at end of file diff --git a/rmss/lang/en.json b/rmss/lang/en.json new file mode 100644 index 0000000..aad52f7 --- /dev/null +++ b/rmss/lang/en.json @@ -0,0 +1,235 @@ +{ + "rmss": { + "player_character": { + "name": "Name:", + "level": "Level:", + "experience": "XP:", + "resources": { + "hits": "Hits", + "exhaustion_points": "Exhaustion Points", + "power_points": "Power Points" + }, + "attribute_headers": { + "stat": "Stat", + "temp": "Temp", + "pot": "Potential", + "basic_bonus": "Basic Bonus", + "racial_bonus": "Racial Bonus", + "special_bonus": "Special Bonus", + "stat_bonus": "Stat Bonus" + }, + "attribute": { + "agility": "Agility", + "agility_short": "Ag", + "constitution": "Constitution", + "memory": "Memory", + "reasoning": "Reasoning", + "self_discipline": "Self Discipline", + "empathy": "Empathy", + "intuition": "Intuition", + "presence": "Presence", + "quickness": "Quickness", + "strength": "Strength", + "stat_total": "Total" + } + }, + "pc_sheet_tabs": { + "record": "Record", + "skill_categories": "Skill Categories", + "skills": "Skills", + "equipment": "Equipment", + "status_record": "Status Record", + "experience_points": "Experience Points" + }, + "pc_sheet_fixed_info": { + "race": "Race:", + "profession": "Profession:", + "training_packages": "Training Packages:", + "realm": "Realm:" + }, + "pc_sheet_armor_info": { + "armor_type": "Armor Type:", + "mmp": "MMP:", + "weight_penalty": "Weight Penalty:", + "missile_penalty": "Missile Penalty:", + "quickness_penalty": "Quickness Penalty:", + "quickness_bonus": "Quickness Bonus:", + "adrenal_defense": "Adrenal Defence:", + "shield_bonus": "Shield Bonus:", + "magic": "Magic (Spells, Items, etc.):", + "total_db": "Total DB:" + }, + "pc_sheet_resistances": { + "channeling": "Channeling", + "essence": "Essence", + "mentalism": "Mentalism", + "chann_ess": "Chann/Ess", + "chann_ment": "Chann/Ment", + "ess_ment": "Ess/Ment", + "arcane": "Arcane", + "poison_disease": "Poison/Disease", + "fear": "Fear" + }, + "pc_sheet_race_stat_fixed_info": { + "soul_departure": "Soul Departs in X Rounds:", + "recovery_multiplier": "Recovery Multiplier:", + "body_dev_progression": "Body Development Progression:", + "pp_dev_progression": "PP Development Progression:", + "recover_hits_per_hour": "Recover X hits/hour resting:", + "recover_hits_per_sleep_cycle": "Recover X hits/sleep cycle:", + "recover_pp_per_hour": "Recover X PP/hour resting:", + "recover_pp_per_sleep_cycle": "Recover X PP/sleep cycle:" + }, + "pc_sheet_role_traits": { + "appearance": "Appearance:", + "sex": "Sex:", + "skin": "Skin:", + "apparent_age": "Apparent Age:", + "actual_age": "Actual Age:", + "height": "Height:", + "weight": "Weight:", + "hair": "Hair:", + "eyes": "Eyes:", + "personality": "Personality:", + "motivations": "Motivations:", + "alignment": "Alignment:" + }, + "pc_sheet_background_info": { + "nationality": "Nationality:", + "home_town": "Home Town:", + "deity": "Deity:", + "patron": "Patron:", + "parents": "Parents:", + "spouse": "Spouse", + "children": "Children:", + "other": "Other:" + }, + "pc_sheet_skills": { + "favorite": "Favorite?", + "skill_name": "Skill Name", + "ranks": "# Ranks", + "new_ranks": "New Ranks", + "rank_bonus": "Rank Bonus", + "category_bonus": "Category Bonus", + "item_bonus": "Item Bonus", + "special_bonus": "Special Bonus", + "total_bonus": "Total Bonus", + "add_skill": "Add Skill" + }, + "pc_sheet_skill_categories": { + "skillcat_name": "Skill Category Name", + "applicable_stats": "Applicable Stats", + "dev_cost": "Dev Cost", + "ranks": "# Ranks", + "new_ranks": "New Ranks", + "rank_bonus": "Rank Bonus", + "stat_bonus": "Stat Bonus", + "prof_bonus": "Prof Bonus", + "special_bonus": "Special Bonus", + "total_bonus": "Total Bonus", + "add_skillcat": "Add Skill Category" + }, + "pc_sheet_items": { + "favorite": "Favorite", + "quantity": "Quantity", + "item_name": "Item Name", + "weight": "Weight", + "cost": "Cost", + "add_item": "Add Item" + }, + "entity_sheet": { + "spell": "RMSS Spell", + "weapon": "RMSS Weapon", + "item": "RMSS Armor", + "armor": "RMSS Item", + "herb_or_poison": "RMSS Herb or Poison", + "transport": "RMSS Transport", + "skill": "RMSS Skill", + "skill_category": "RMSS Skill Category", + "player_characrer": "RMSS Player Character", + "npc": "RMSS NPC", + "creature": "RMSS Creature" + }, + "currency_type": { + "mp": "Mithril Pieces", + "pp": "Platinum Pieces", + "gp": "Gold Pieces", + "sp": "Silver Pieces", + "bp": "Bronze Pieces", + "cp": "Copper Pieces" + }, + "item": { + "description": "Other Notes", + "quantity": "Quantity", + "weight": "Weight", + "cost": "Cost", + "prod_time": "Production Time" + }, + "armor": { + "at": "AT", + "weight": "Weight", + "cost": "Cost", + "prod_time": "Production Time" + }, + "weapon": { + "cost": "Cost", + "type": "Type", + "prod_time": "Production Time", + "weight": "Weight", + "breakage_range": "B#s", + "strength": "Str", + "fumble_range": "Fumble" + }, + "herb_or_poison": { + "codes": "Codes", + "weight": "Weight", + "form_and_prep": "Form/Prep", + "cost": "Cost", + "af": "AF" + }, + "transport": { + "cost": "Cost", + "feet_per_round": "ft/rnd", + "miles_per_hour": "mi/hr", + "maneuver": "Man", + "height": "Height", + "weight": "Weight", + "capacity": "Capacity", + "offensive_bonus": "OB" + }, + "spell": { + "spell_list": "Spell List", + "level": "Level", + "area_of_effect": "Area of Effect", + "duration": "Duration", + "range": "Range", + "type": "Type", + "description": "Description" + }, + "skill_category": { + "applicable_stats": "Applicable Stats:", + "development_cost" : "Development Cost:", + "ranks": "Ranks:", + "new_ranks": "New Ranks:", + "rank_bonus": "Rank Bonus:", + "stat_bonus": "Stat Bonus:", + "prof_bonus": "Prof Bonus:", + "special_bonus_1": "Special Bonus 1:", + "special_bonus_2": "Special Bonus 2:", + "total_bonus": "Total Bonus:", + "description": "Description:" + }, + "skill": { + "favorite": "Favorite?", + "ranks": "Ranks:", + "new_ranks": "New Ranks:", + "rank_bonus": "Rank Bonus:", + "category_bonus": "Category Bonus:", + "item_bonus": "Item Bonus:", + "special_bonus_1": "Special Bonus 1:", + "special_bonus_2": "Special Bonus 2:", + "total_bonus": "Total Bonus:", + "description": "Description:" + } + } +} \ No newline at end of file diff --git a/rmss/less/actor-sheet.less b/rmss/less/actor-sheet.less new file mode 100644 index 0000000..a2c0176 --- /dev/null +++ b/rmss/less/actor-sheet.less @@ -0,0 +1,153 @@ +// General Elements + +.container { + display: flex; + } + +// Header CSS + +.actor-icon { + flex-shrink: 1; + } + + +.header-container { + flex-grow: 2; + outline: 1px solid; /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} + +.header-text { + display: flex; + flex-direction: row; + justify-content: center; + } + +// Resource Elements in Headers + +.resource-container { + display: flex; + flex-direction: row; + flex-grow: 3; + text-align: -webkit-center; +} + +.resource-container > * { + flex: 1 1 0; +} + +.resource-entry { + outline: 1px solid; /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} + +.resource-entry input{ + width: 50px; + border: none; +} + +.stat-container { + flex-direction: column; + flex-shrink: 1; + } + +.equipment-container { + flex-direction: column; + flex-grow: 1; + } + +.stat-block { + outline: 1px solid; /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} + +.stat-name, .money-name { + width: 75px; + border: none; + font-family: Signika, sans-serif; + font-size: 12px; +} + +.stat-name input { + border: none; +} + +.stat-header { + font-family: Signika, sans-serif; + font-size: 12px; +} + +// Fixed Info CSS + +.fixed-info-container { + flex-grow: 3; + flex-direction: row; + font-family: Signika, sans-serif; + font-size: 12px; +} + +.fixed-info-section { + outline: 1px solid; /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} + +.armor-block { + outline: 1px solid; /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} + +.race-stat-fixed-info-block { + outline: 1px solid; /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} + +.role-traits-block { + outline: 1px solid; /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} + +.background-info-block { + outline: 1px solid; /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} + +.resistance-block { + outline: 1px solid; /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} + +// Debugging + +.red { + background-color: orangered; +} + +.blue { + background-color: lightblue; +} + +.grey { + background-color: lightgrey; +} + +.green { + background-color: lightseagreen; +} \ No newline at end of file diff --git a/rmss/less/grid.less b/rmss/less/grid.less new file mode 100644 index 0000000..ed43414 --- /dev/null +++ b/rmss/less/grid.less @@ -0,0 +1,118 @@ +.skillcat-grid-container { + display: grid; + grid-template-columns: [skill-category-name] 10% [applicable-stats] 10% [dev-cost] 8% [num-ranks] 8% [new-ranks] 8% [rank-bonus] 8% [stat-bonus] 8% [prof-bonus] 8% [special-bonus-1] 8% [special-bonus-2] 8% [total-bonus] 8% [controls] 8%; +} + +.skillcat-grid-container > div { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; + border-bottom: 1px solid; + padding-top: 3px; + padding-bottom: 3px; + display: flex; + justify-content: flex-end; + flex-direction: column; + justify-content: center; +} + +.skillcat-grid-container > div:nth-child(24n+1), +.skillcat-grid-container > div:nth-child(24n+2), +.skillcat-grid-container > div:nth-child(24n+3), +.skillcat-grid-container > div:nth-child(24n+4), +.skillcat-grid-container > div:nth-child(24n+5), +.skillcat-grid-container > div:nth-child(24n+6), +.skillcat-grid-container > div:nth-child(24n+7), +.skillcat-grid-container > div:nth-child(24n+8), +.skillcat-grid-container > div:nth-child(24n+9), +.skillcat-grid-container > div:nth-child(24n+10), +.skillcat-grid-container > div:nth-child(24n+11), +.skillcat-grid-container > div:nth-child(24n+12) +{ + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; + border-bottom: 1px solid; + padding-top: 3px; + padding-bottom: 3px; + display: flex; + justify-content: flex-end; + flex-direction: column; + justify-content: center; + background-image: linear-gradient(rgba(0, 0, 0, 0.1) 0 0); +} + +.skillcat-grid-heading { + font-weight: bold; + border-bottom: 1px solid; + background-image: linear-gradient(rgba(0, 0, 0, 0.1) 0 0); +} + + + +.skills-grid-container { + display: grid; + grid-template-columns: [favorite] 9% [skill-name] 11% [num-ranks] 9% [new-ranks] 9% [rank-bonus] 9% [category-bonus] 9% [item-bonus] 9% [special-bonus-1] 9% [special-bonus-2] 9% [total-bonus] 9% [controls] 8%; +} + +.skills-grid-container > div { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; + border-bottom: 1px solid; + padding-top: 3px; + padding-bottom: 3px; + display: flex; + justify-content: flex-end; + flex-direction: column; + justify-content: center; +} + +.skills-grid-container > div:nth-child(22n+1), +.skills-grid-container > div:nth-child(22n+2), +.skills-grid-container > div:nth-child(22n+3), +.skills-grid-container > div:nth-child(22n+4), +.skills-grid-container > div:nth-child(22n+5), +.skills-grid-container > div:nth-child(22n+6), +.skills-grid-container > div:nth-child(22n+7), +.skills-grid-container > div:nth-child(22n+8), +.skills-grid-container > div:nth-child(22n+9), +.skills-grid-container > div:nth-child(22n+10), +.skills-grid-container > div:nth-child(22n+11) +{ + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; + border-bottom: 1px solid; + padding-top: 3px; + padding-bottom: 3px; + display: flex; + justify-content: flex-end; + flex-direction: column; + justify-content: center; + background-image: linear-gradient(rgba(0, 0, 0, 0.1) 0 0); +} + +.skills-grid-heading { + font-weight: bold; + border-bottom: 1px solid; + background-image: linear-gradient(rgba(0, 0, 0, 0.1) 0 0); +} + +.applicable-stats-grid-container { + display: grid; + grid-template-columns: [app-stat-1] 33% [app-stat-2] 33% [dapp-stat-3] 33%; +} + +.applicable-stats-grid-container > div { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; + border-bottom: 1px solid; + padding-top: 3px; + padding-bottom: 3px; + display: flex; + justify-content: flex-end; + flex-direction: column; + justify-content: center; +} \ No newline at end of file diff --git a/rmss/less/item-sheet.less b/rmss/less/item-sheet.less new file mode 100644 index 0000000..208c65e --- /dev/null +++ b/rmss/less/item-sheet.less @@ -0,0 +1,14 @@ +.sheet { + form { + display: flex; + flex-direction: column; + } + .sheet-content { + height: 100%; + display: flex; + flex-direction: column; + .editor { + height: 100% + } + } +} \ No newline at end of file diff --git a/rmss/less/money-sheet.less b/rmss/less/money-sheet.less new file mode 100644 index 0000000..78d18ce --- /dev/null +++ b/rmss/less/money-sheet.less @@ -0,0 +1,8 @@ +.money-column { + flex-direction: column; +} + +.money-container { + flex-direction: column; + flex-shrink: 1; + } \ No newline at end of file diff --git a/rmss/less/rmss.less b/rmss/less/rmss.less new file mode 100644 index 0000000..c81e97d --- /dev/null +++ b/rmss/less/rmss.less @@ -0,0 +1,6 @@ +@import "./item-sheet.less"; +@import "./actor-sheet.less"; +@import "./skillcat-sheet.less"; +@import "./money-sheet.less"; +@import "./table.less"; +@import "./grid.less"; \ No newline at end of file diff --git a/rmss/less/skillcat-sheet.less b/rmss/less/skillcat-sheet.less new file mode 100644 index 0000000..0399a73 --- /dev/null +++ b/rmss/less/skillcat-sheet.less @@ -0,0 +1,23 @@ +.skillcat-name, .skill-name, .item-name { + font-family: Signika, sans-serif; + font-size: 12px; + font-weight: bold; + text-align: center; +} + +.skillcat-entry, .skill-entry, .item-entry { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; +} + +.skillcat-headeritem, .skill-headeritem, .item-headeritem { + text-align: center; + font-weight: bold; +} + +.skillcat-controls, .skill-controls, .item-controls { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; +} \ No newline at end of file diff --git a/rmss/less/table.less b/rmss/less/table.less new file mode 100644 index 0000000..56b0738 --- /dev/null +++ b/rmss/less/table.less @@ -0,0 +1,19 @@ +.table-font { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; +} + +.table-bold { + font-weight: bold; +} + +.table-center { + text-align: center; +} + +.table-controls { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; +} \ No newline at end of file diff --git a/rmss/module/config.js b/rmss/module/config.js new file mode 100644 index 0000000..813cfec --- /dev/null +++ b/rmss/module/config.js @@ -0,0 +1,55 @@ +export const rmss = {}; + +rmss.curreny_type = { + mp: "rmss.curreny_type.mp", + pp: "rmss.curreny_type.pp", + gp: "rmss.curreny_type.gp", + sp: "rmss.curreny_type.sp", + bp: "rmss.curreny_type.bp", + cp: "rmss.curreny_type.cp" +}; + +rmss.stats = { + agility: { + fullname: "Agility", + shortname: "Ag" + }, + constitution: { + fullname: "Constitution", + shortname: "Co" + }, + memory: { + fullname: "Memory", + shortname: "Me" + }, + reasoning: { + fullname: "Reasoning", + shortname: "Re" + }, + self_discipline: { + fullname: "Self Discipline", + shortname: "SD" + }, + empathy: { + fullname: "Empathy", + shortname: "Em" + }, + intuition: { + fullname: "Intuition", + shortname: "In" + }, + presence: { + fullname: "Presence", + shortname: "Pr" + }, + quickness: { + fullname: "Quickness", + shortname: "Qu" + }, + strength: { + fullname: "Strength", + shortname: "St" + } + + +} diff --git a/rmss/module/documents/actor.js b/rmss/module/documents/actor.js new file mode 100644 index 0000000..e078a54 --- /dev/null +++ b/rmss/module/documents/actor.js @@ -0,0 +1,144 @@ +export class RMSSActor extends Actor { + + /** @override */ + prepareData() { + // Prepare data for the actor. Calling the super version of this executes + // the following, in order: data reset (to clear active effects), + // prepareBaseData(), prepareEmbeddedDocuments() (including active effects), + // prepareDerivedData(). + super.prepareData(); + } + + prepareDerivedData() { + const actorData = this.data; + const data = actorData.data; + const flags = actorData.flags.rmss || {}; + + // Make separate methods for each Actor type (character, npc, etc.) to keep + // things organized. + this._prepareCharacterData(actorData); + this._prepareNpcData(actorData); + } + + /** + * Prepare Character type specific data + */ + _prepareCharacterData(actorData) { + if (actorData.type !== 'character') return; + + // Calculate Stat Bonuses in Actor + this.prepareStatBonuses(actorData) + + // Calculate Resistance Rolls in Actor + this.prepareResistanceRolls(actorData); + + // Iterate through and apply Stat bonuses for Skill Category Items + this.prepareSkillCatStatBonuses(); + } + + /** + * Prepare NPC type specific data. + */ + _prepareNpcData(actorData) { + if (actorData.type !== 'npc') return; + + // Make modifications to data here. For example: + const data = actorData.data; + data.xp = (data.cr * data.cr) * 100; + } + + prepareStatBonuses(actorData) { + + const data = actorData.data; + + actorData.data.stats.agility.stat_bonus = Number(data.stats.agility.racial_bonus)+Number(data.stats.agility.special_bonus)+Number(data.stats.agility.basic_bonus); + actorData.data.stats.constitution.stat_bonus = Number(data.stats.constitution.racial_bonus)+Number(data.stats.constitution.special_bonus)+Number(data.stats.constitution.basic_bonus); + actorData.data.stats.memory.stat_bonus = Number(data.stats.memory.racial_bonus)+Number(data.stats.memory.special_bonus)+Number(data.stats.memory.basic_bonus); + actorData.data.stats.reasoning.stat_bonus = Number(data.stats.reasoning.racial_bonus)+Number(data.stats.reasoning.special_bonus)+Number(data.stats.reasoning.basic_bonus); + actorData.data.stats.self_discipline.stat_bonus = Number(data.stats.self_discipline.racial_bonus)+Number(data.stats.self_discipline.special_bonus)+Number(data.stats.self_discipline.basic_bonus); + actorData.data.stats.empathy.stat_bonus = Number(data.stats.empathy.racial_bonus)+Number(data.stats.empathy.special_bonus)+Number(data.stats.empathy.basic_bonus); + actorData.data.stats.intuition.stat_bonus = Number(data.stats.intuition.racial_bonus)+Number(data.stats.intuition.special_bonus)+Number(data.stats.intuition.basic_bonus); + actorData.data.stats.presence.stat_bonus = Number(data.stats.presence.racial_bonus)+Number(data.stats.presence.special_bonus)+Number(data.stats.presence.basic_bonus); + actorData.data.stats.quickness.stat_bonus = Number(data.stats.quickness.racial_bonus)+Number(data.stats.quickness.special_bonus)+Number(data.stats.quickness.basic_bonus); + actorData.data.stats.strength.stat_bonus = Number(data.stats.strength.racial_bonus)+Number(data.stats.strength.special_bonus)+Number(data.stats.strength.basic_bonus); + + } + + prepareResistanceRolls(actorData) { + + const data = actorData.data; + + actorData.data.resistance_rolls.essence = Number(actorData.data.stats.empathy.stat_bonus * 3) + actorData.data.resistance_rolls.channeling = Number(actorData.data.stats.intuition.stat_bonus * 3) + actorData.data.resistance_rolls.mentalism = Number(actorData.data.stats.presence.stat_bonus * 3) + actorData.data.resistance_rolls.fear = Number(actorData.data.stats.self_discipline.stat_bonus * 3) + actorData.data.resistance_rolls.poison_disease = Number(actorData.data.stats.constitution.stat_bonus * 3) + actorData.data.resistance_rolls.chann_ess = Number(actorData.data.stats.intuition.stat_bonus) + Number(actorData.data.stats.empathy.stat_bonus) + actorData.data.resistance_rolls.chann_ment = Number(actorData.data.stats.intuition.stat_bonus) + Number(actorData.data.stats.presence.stat_bonus) + actorData.data.resistance_rolls.ess_ment = Number(actorData.data.stats.empathy.stat_bonus) + Number(actorData.data.stats.presence.stat_bonus) + actorData.data.resistance_rolls.arcane = Number(actorData.data.stats.empathy.stat_bonus) + Number(actorData.data.stats.intuition.stat_bonus) + Number(actorData.data.stats.presence.stat_bonus) + } + + prepareSkillCatStatBonuses() { + console.log("Getting Items"); + for (const item of this.items) { + if (item.type === "skill_category") { + + // Get all the applicable stats for this skill category + var app_stat_1 = item.data.data.app_stat_1; + var app_stat_2 = item.data.data.app_stat_2; + var app_stat_3 = item.data.data.app_stat_3; + console.log(item.name + " " + app_stat_1 + " " + app_stat_2 + " " + app_stat_3); + + // If the first one is None we don't need to do anything further + if (app_stat_1 === "None") { + continue; + } + else + { + var applicable_stat_bonus = 0; + + var app_stat_1_found = false; + var app_stat_2_found = false; + var app_stat_3_found = false; + + // Iterate through the applicable stats and find their full names + for (const stat in CONFIG.rmss.stats) { + // If the configured App Stat matches the one of the stats in config + if (app_stat_1 === CONFIG.rmss.stats[stat].shortname) { + console.log("Found first stat: " + stat); + app_stat_1_found = true; + // Get the Stat Bonus + console.log(this.data.data.stats[stat].stat_bonus); + applicable_stat_bonus = applicable_stat_bonus + this.data.data.stats[stat].stat_bonus + //console.log("New Applicable Stat Bonus: " + applicable_stat_bonus) + } + if (app_stat_2 === CONFIG.rmss.stats[stat].shortname) { + console.log("Found second stat: " + stat); + app_stat_2_found = true; + console.log(this.data.data.stats[stat].stat_bonus); + applicable_stat_bonus = applicable_stat_bonus + this.data.data.stats[stat].stat_bonus + //console.log("New Applicable Stat Bonus: " + applicable_stat_bonus) + } + if (app_stat_3 === CONFIG.rmss.stats[stat].shortname) { + console.log("Found third stat: " + stat); + app_stat_3_found = true; + console.log(this.data.data.stats[stat].stat_bonus); + applicable_stat_bonus = applicable_stat_bonus + this.data.data.stats[stat].stat_bonus + //console.log("New Applicable Stat Bonus: " + applicable_stat_bonus) + } + } + console.log("Applicable Stat Bonus: " + applicable_stat_bonus) + if (app_stat_1_found === true && app_stat_2_found === true && app_stat_3_found === true) { + // Apply the update if we found stat bonuses for every applicable stat + item.data.data.stat_bonus = applicable_stat_bonus; + + // Update the total in the Item + item.calculateSkillCatTotalBonus(item.data); + } + } + } + } + } + +} \ No newline at end of file diff --git a/rmss/module/documents/item.js b/rmss/module/documents/item.js new file mode 100644 index 0000000..37679cf --- /dev/null +++ b/rmss/module/documents/item.js @@ -0,0 +1,77 @@ +export class RMSSItem extends Item { + + /** @override */ + prepareData() { + // Prepare data for the item. Calling the super version of this executes + // the following, in order: data reset (to clear active effects), + // prepareBaseData(), prepareEmbeddedDocuments() (including active effects), + // prepareDerivedData(). + super.prepareData(); + } + + // Set the images for newly created images (need to fix for copied images). + async _preCreate(data, options, userId) { + await super._preCreate(data, options, userId); + if (!data.img) { + if (this.data.type == "armor") { + await this.data.update({img: "systems/rmss/assets/default/armor.svg"}); + } + else if (this.data.type == "weapon") { + await this.data.update({img: "systems/rmss/assets/default/weapon.svg"}); + } + else if (this.data.type == "skill") { + await this.data.update({img: "systems/rmss/assets/default/skill.svg"}); + } + else if (this.data.type == "skill_category") { + await this.data.update({img: "systems/rmss/assets/default/skill_category.svg"}); + } + else if (this.data.type == "spell") { + await this.data.update({img: "systems/rmss/assets/default/spell.svg"}); + } + else if (this.data.type == "herb_or_poison") { + await this.data.update({img: "systems/rmss/assets/default/herb_or_poison.svg"}); + } + else if (this.data.type == "transport") { + await this.data.update({img: "systems/rmss/assets/default/transport.svg"}); + } + } + } + + calculateSkillCatTotalBonus(itemData) { + // Calculate Stat Bonuses + + const data = itemData.data; + + itemData.data.total_bonus = Number(data.rank_bonus)+Number(data.stat_bonus)+Number(data.prof_bonus)+Number(data.special_bonus_1)+Number(data.special_bonus_2); + } + + prepareDerivedData() { + const itemData = this.data; + const data = itemData.data; + const flags = itemData.flags.rmss || {}; + + // Make separate methods for each item type to keep things organized. + this._prepareSkillCategoryData(itemData); + this._prepareSkillData(itemData); + } + + _prepareSkillCategoryData(itemData) { + if (itemData.type !== 'skill_category') return; + + // Make modifications to data here. For example: + //const data = itemData.data; + + // Calculate Stat Bonuses + this.calculateSkillCatTotalBonus(itemData); + } + + _prepareSkillData(itemData) { + if (itemData.type !== 'skill') return; + + // Make modifications to data here. For example: + const data = itemData.data; + + // Calculate Stat Bonuses + itemData.data.total_bonus = Number(data.rank_bonus)+Number(data.category_bonus)+Number(data.item_bonus)+Number(data.special_bonus_1)+Number(data.special_bonus_2); + } +} diff --git a/rmss/module/sheets/actors/rmss_player_sheet.js b/rmss/module/sheets/actors/rmss_player_sheet.js new file mode 100644 index 0000000..2d75eeb --- /dev/null +++ b/rmss/module/sheets/actors/rmss_player_sheet.js @@ -0,0 +1,139 @@ +export default class RMSSPlayerSheet extends ActorSheet { + + // Override Default Options, Set CSS Classes, Set Default Sheet, Set up Sheet Tabs + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + template: "systems/rmss/templates/sheets/actors/rmss-character-sheet.html", + classes: ["rmss", "sheet", "actor"], + tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "features" }] + }); + } + + // Make the data available to the sheet template + getData() { + const context = super.getData(); + + // Use a safe clone of the actor data for further operations. + const actorData = this.actor.data.toObject(false); + + // Add the actor's data to context.data for easier access, as well as flags. + context.data = actorData.data; + context.flags = actorData.flags; + + // Prepare character data and items. + if (actorData.type == 'character') { + this._prepareItems(context); + this._prepareCharacterData(context); + } + + // Prepare NPC data and items. + if (actorData.type == 'npc') { + this._prepareItems(context); + } + + return context; + } + + _prepareCharacterData(context) { + } + + _prepareItems(context) { + // Initialize containers. + const gear = []; + const playerskill= []; + const skillcat = []; + + // Iterate through items, allocating to containers + for (let i of context.items) { + i.img = i.img || DEFAULT_TOKEN; + // Append to gear. + if (i.type === 'item' || i.type === 'armor' || i.type === 'weapon' || i.type === 'herb_or_poison') { + gear.push(i); + } + // Append to skill categories. + else if (i.type === 'skill_category') { + skillcat.push(i); + } + // Append to playerskill + else if (i.type === 'skill') { + playerskill.push(i); + } + } + + // Sort Skill/Skillcat Arrays + skillcat.sort(function (a, b){ + if (a.name < b.name) { + return -1; + } + if (a.name > b.name) { + return 1; + } + return 0; + }); + + playerskill.sort(function (a, b){ + if (a.name < b.name) { + return -1; + } + if (a.name > b.name) { + return 1; + } + return 0; + }); + + + // Assign and return + context.gear = gear; + context.skillcat = skillcat; + context.playerskill = playerskill; + } + + activateListeners(html) { + super.activateListeners(html); + + // NOTE: Can you do skill/item favorites this way? + + // Render the item sheet for viewing/editing prior to the editable check. + html.find('.item-edit').click(ev => { + const item = this.actor.items.get(ev.currentTarget.getAttribute("data-item-id")); + console.log(this); + item.sheet.render(true); + }); + + // ------------------------------------------------------------- + // Everything below here is only needed if the sheet is editable + if (!this.isEditable) return; + + // Add Item + html.find('.item-create').click(this._onItemCreate.bind(this)); + + // Delete Item + html.find('.item-delete').click(ev => { + const item = this.actor.items.get(ev.currentTarget.getAttribute("data-item-id")); + console.log(ev.currentTarget.getAttribute("data-item-id")); + item.delete(); + }); + } + + async _onItemCreate(event) { + event.preventDefault(); + const header = event.currentTarget; + // Get the type of item to create. + const type = header.dataset.type; + // Grab any data associated with this control. + const data = duplicate(header.dataset); + // Initialize a default name. + const name = `New ${type.capitalize()}`; + // Prepare the item object. + const itemData = { + name: name, + type: type, + data: data + }; + // Remove the type from the dataset since it's in the itemData.type prop. + delete itemData.data["type"]; + + // Finally, create the item! + return await Item.create(itemData, {parent: this.actor}); + } +} \ No newline at end of file diff --git a/rmss/module/sheets/items/rmss_armor_sheet.js b/rmss/module/sheets/items/rmss_armor_sheet.js new file mode 100644 index 0000000..d7b5d06 --- /dev/null +++ b/rmss/module/sheets/items/rmss_armor_sheet.js @@ -0,0 +1,33 @@ +// Our Item Sheet extends the default +export default class RMSSArmorSheet extends ItemSheet { + + // Set the height and width + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + width: 530, + height: 440, + template: "systems/rmss/templates/sheets/items/rmss-armor-sheet.html", + classes: ["rmss", "sheet", "item"] + }); + } + + // If our sheet is called here it is. + get template() { + return `systems/rmss/templates/sheets/items/rmss-armor-sheet.html`; + } + + // Make the data available to the sheet template + getData() { + const baseData = super.getData(); + + let sheetData = { + owner: this.item.isOwner, + editable :this.isEditable, + item: baseData.item, + data: baseData.item.data.data, + config: CONFIG.rmss + }; + + return sheetData; + } +} \ No newline at end of file diff --git a/rmss/module/sheets/items/rmss_herb_or_poison_sheet.js b/rmss/module/sheets/items/rmss_herb_or_poison_sheet.js new file mode 100644 index 0000000..52b90f5 --- /dev/null +++ b/rmss/module/sheets/items/rmss_herb_or_poison_sheet.js @@ -0,0 +1,33 @@ +// Our Item Sheet extends the default +export default class RMSSHerbAndPoisonSheet extends ItemSheet { + + // Set the height and width + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + width: 530, + height: 440, + template: "systems/rmss/templates/sheets/items/rmss-herb-or-poison-sheet.html", + classes: ["rmss", "sheet", "item"] + }); + } + + // If our sheet is called here it is. + get template() { + return `systems/rmss/templates/sheets/items/rmss-herb-or-poison-sheet.html`; + } + + // Make the data available to the sheet template + getData() { + const baseData = super.getData(); + + let sheetData = { + owner: this.item.isOwner, + editable :this.isEditable, + item: baseData.item, + data: baseData.item.data.data, + config: CONFIG.rmss + }; + + return sheetData; + } +} \ No newline at end of file diff --git a/rmss/module/sheets/items/rmss_item_sheet.js b/rmss/module/sheets/items/rmss_item_sheet.js new file mode 100644 index 0000000..047f4e7 --- /dev/null +++ b/rmss/module/sheets/items/rmss_item_sheet.js @@ -0,0 +1,33 @@ +// Our Item Sheet extends the default +export default class RMSSItemSheet extends ItemSheet { + + // Set the height and width + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + width: 530, + height: 440, + template: "systems/rmss/templates/sheets/items/rmss-item-sheet.html", + classes: ["rmss", "sheet", "item"] + }); + } + + // If our sheet is called here it is. + get template() { + return `systems/rmss/templates/sheets/items/rmss-item-sheet.html`; + } + + // Make the data available to the sheet template + getData() { + const baseData = super.getData(); + + let sheetData = { + owner: this.item.isOwner, + editable :this.isEditable, + item: baseData.item, + data: baseData.item.data.data, + config: CONFIG.rmss + }; + + return sheetData; + } +} \ No newline at end of file diff --git a/rmss/module/sheets/items/rmss_transport_sheet.js b/rmss/module/sheets/items/rmss_transport_sheet.js new file mode 100644 index 0000000..dc438d8 --- /dev/null +++ b/rmss/module/sheets/items/rmss_transport_sheet.js @@ -0,0 +1,33 @@ +// Our Item Sheet extends the default +export default class RMSSTransportSheet extends ItemSheet { + + // Set the height and width + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + width: 530, + height: 440, + template: "systems/rmss/templates/sheets/items/rmss-transport-sheet.html", + classes: ["rmss", "sheet", "item"] + }); + } + + // If our sheet is called here it is. + get template() { + return `systems/rmss/templates/sheets/items/rmss-transport-sheet.html`; + } + + // Make the data available to the sheet template + getData() { + const baseData = super.getData(); + + let sheetData = { + owner: this.item.isOwner, + editable :this.isEditable, + item: baseData.item, + data: baseData.item.data.data, + config: CONFIG.rmss + }; + + return sheetData; + } +} \ No newline at end of file diff --git a/rmss/module/sheets/items/rmss_weapon_sheet.js b/rmss/module/sheets/items/rmss_weapon_sheet.js new file mode 100644 index 0000000..076eebe --- /dev/null +++ b/rmss/module/sheets/items/rmss_weapon_sheet.js @@ -0,0 +1,33 @@ +// Our Item Sheet extends the default +export default class RMSSWeaponSheet extends ItemSheet { + + // Set the height and width + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + width: 530, + height: 440, + template: "systems/rmss/templates/sheets/items/rmss-weapon-sheet.html", + classes: ["rmss", "sheet", "item"] + }); + } + + // If our sheet is called here it is. + get template() { + return `systems/rmss/templates/sheets/items/rmss-weapon-sheet.html`; + } + + // Make the data available to the sheet template + getData() { + const baseData = super.getData(); + + let sheetData = { + owner: this.item.isOwner, + editable :this.isEditable, + item: baseData.item, + data: baseData.item.data.data, + config: CONFIG.rmss + }; + + return sheetData; + } +} \ No newline at end of file diff --git a/rmss/module/sheets/skills/rmss_skill_category_sheet.js b/rmss/module/sheets/skills/rmss_skill_category_sheet.js new file mode 100644 index 0000000..bc811a8 --- /dev/null +++ b/rmss/module/sheets/skills/rmss_skill_category_sheet.js @@ -0,0 +1,111 @@ +// Our Item Sheet extends the default +export default class RMSSSkillCategorySheet extends ItemSheet { + + // Set the height and width + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + width: 530, + height: 440, + template: "systems/rmss/templates/sheets/skills/rmss-skill-category-sheet.html", + classes: ["rmss", "sheet", "item"] + }); + } + + // If our sheet is called here it is. + get template() { + return `systems/rmss/templates/sheets/skills/rmss-skill-category-sheet.html`; + } + + // Make the data available to the sheet template + getData() { + const baseData = super.getData(); + + // Get a list of stats that can be used as applicable stats + var applicable_stat_list = this.prepareApplicableStatValues(CONFIG); + + //Get the currently selected value for all three applicable stats + var applicable_stat_1_selected = this.prepareApplicableSelectedStat("app_stat_1"); + var applicable_stat_2_selected = this.prepareApplicableSelectedStat("app_stat_2"); + var applicable_stat_3_selected = this.prepareApplicableSelectedStat("app_stat_3"); + + // Build the string for Applicable Stats + var applicable_stat_text = this.buildApplicableStatsText(applicable_stat_1_selected, applicable_stat_2_selected, applicable_stat_3_selected) + baseData.item.data.data['applicable_stats'] = applicable_stat_text + + + let sheetData = { + owner: this.item.isOwner, + editable :this.isEditable, + item: baseData.item, + data: baseData.item.data.data, + config: CONFIG.rmss, + applicable_stat_list: applicable_stat_list, + applicable_stat_1_selected: applicable_stat_1_selected, + applicable_stat_2_selected: applicable_stat_2_selected, + applicable_stat_3_selected: applicable_stat_3_selected + }; + + console.log(this.item) + + return sheetData; + } + + async _setApplicableStat(item, ev) { + // Build a JSON Object from the select tag value and select name (item data attribute key) + var update_key = ev.currentTarget.getAttribute("name"); + var update_data = ev.target.value; + + // Update Item Data + await item.update({[update_key]: update_data}); + } + + prepareApplicableStatValues(CONFIG) { + var applicable_stat_1_list = {None: "None"} + + // Get a list of stat shortnames from the config + for (const item in CONFIG.rmss.stats) { + applicable_stat_1_list[CONFIG.rmss.stats[item]['shortname']] = CONFIG.rmss.stats[item]['shortname']; + } + return applicable_stat_1_list; + } + + // Determine which Stat is selected for applicable stats + prepareApplicableSelectedStat(app_stat) { + var applicable_stat_selected = ""; + applicable_stat_selected = this.item.data.data[app_stat]; + return applicable_stat_selected; + } + + // Build the text that is displayed in the Applicable Stats field + buildApplicableStatsText(app_stat_1, app_stat_2, app_stat_3) { + + if (app_stat_1 === "None") { + return("None") + } + else if (app_stat_1 !== "None" && app_stat_2 === "None") { + return(app_stat_1) + } + else if (app_stat_1 !== "None" && app_stat_2 !== "None" && app_stat_3 === "None" ) { + return(app_stat_1 + "/" + app_stat_2 ) + } + else if (app_stat_1 !== "None" && app_stat_2 !== "None" && app_stat_3 !== "None" ) { + return(app_stat_1 + "/" + app_stat_2 + "/" + app_stat_3 ) + } + else { + return("None") + } + } + + activateListeners(html) { + super.activateListeners(html); + + // ------------------------------------------------------------- + // Everything below here is only needed if the sheet is editable + if (!this.isEditable) return; + + // Update Applicable Stats for Skill Categories + html.find('.stat-selector').change(ev => { + this._setApplicableStat(this.item, ev); + }); + } +} \ No newline at end of file diff --git a/rmss/module/sheets/skills/rmss_skill_sheet.js b/rmss/module/sheets/skills/rmss_skill_sheet.js new file mode 100644 index 0000000..f722862 --- /dev/null +++ b/rmss/module/sheets/skills/rmss_skill_sheet.js @@ -0,0 +1,33 @@ +// Our Item Sheet extends the default +export default class RMSSSkillSheet extends ItemSheet { + + // Set the height and width + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + width: 530, + height: 440, + template: "systems/rmss/templates/sheets/skills/rmss-skill-sheet.html", + classes: ["rmss", "sheet", "item"] + }); + } + + // If our sheet is called here it is. + get template() { + return `systems/rmss/templates/sheets/skills/rmss-skill-sheet.html`; + } + + // Make the data available to the sheet template + getData() { + const baseData = super.getData(); + + let sheetData = { + owner: this.item.isOwner, + editable :this.isEditable, + item: baseData.item, + data: baseData.item.data.data, + config: CONFIG.rmss + }; + + return sheetData; + } +} \ No newline at end of file diff --git a/rmss/module/sheets/spells/rmss_spell_sheet.js b/rmss/module/sheets/spells/rmss_spell_sheet.js new file mode 100644 index 0000000..55018ec --- /dev/null +++ b/rmss/module/sheets/spells/rmss_spell_sheet.js @@ -0,0 +1,32 @@ +// Our Item Sheet extends the default +export default class RMSSSpellSheet extends ItemSheet { + + // Set the height and width + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + width: 530, + height: 440, + classes: ["rmss", "sheet", "item"] + }); + } + + // If our sheet is called here it is. + get template() { + return `systems/rmss/templates/sheets/spells/rmss-spell-sheet.html`; + } + + // Make the data available to the sheet template + getData() { + const baseData = super.getData(); + + let sheetData = { + owner: this.item.isOwner, + editable :this.isEditable, + item: baseData.item, + data: baseData.item.data.data, + config: CONFIG.rmss + }; + + return sheetData; + } +} \ No newline at end of file diff --git a/rmss/packs/skill_categories.db b/rmss/packs/skill_categories.db new file mode 100644 index 0000000..11cb5bc --- /dev/null +++ b/rmss/packs/skill_categories.db @@ -0,0 +1,55 @@ +{"_id":"0d3EfynJXdtM5Dzm","name":"Armor • Light","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Ag/St/Ag","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"0w6sahjMDlHYSN8V","name":"Lore • Obscure","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Me/Re/Me","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"1G2k2fwahmEzCOFU","name":"Technical/Trade • Vocational","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Me/In/Re","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"4BM6WowdqAcmqKqQ","name":"Lore • Technical","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Me/Re/Me","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"4rr30P65Yc43Ncjh","name":"Science/Analytic • Specialized","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Re/Me/Re","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Body Development","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Co/SD/Co","development_cost":"","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.HfkzoDVADnq2dYJ7"}},"_id":"5QRIgoZ6jew76BgE"} +{"_id":"8TZWjsbDPWi4xLNt","name":"Weapon • Thrown","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Ag/St/Ag","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"91zRgmv9jirmpA3u","name":"Subterfuge • Attack","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Ag/SD/In","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Influence","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Pr/Em/In","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.elWpmeBUSeX7AdrX"}},"_id":"96thkRaRd0KvdiIY"} +{"name":"Self Control","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"SD/Pr/SD","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.rbe2UnhjpflyUZSE"}},"_id":"B1dbjqpZq0srb9tg"} +{"_id":"CegELmkfwbiBjnRk","name":"Athletic • Gymanstics","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Ag/Qu/Ag","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Power Awareness","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Em/In/Pr","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.MddRxrypkR5XmFaA"}},"_id":"DowJf31x9cOtxFHF"} +{"_id":"FFdtMkQ6yupVjPeS","name":"Spells • Arcane Open Lists","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"Fcj10XbsHSUR5phg","name":"Subterfuge • Mechanics","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"In/Ag/Re","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"G6EOQxjgxzXF178q","name":"Spells • Own Realm Other Base Lists","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Special Defenses","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"none","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.jCqolNb9eySmsuMB"}},"_id":"GLunI5fshwER51fi"} +{"_id":"Gtr6mVQnCpNtHViI","name":"Weapon • Missile","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Ag/St/Ag","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"HMWeRbDDZtl0tXEh","name":"Spells • Other Realm Base Lists","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"HpgMGMSEQ8Ts7YbG","name":"Armor • Medium","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"St/Ag/St","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"IXcTjepLPq31vxVT","name":"Artistic • Active","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Em/In/Pr","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"Ip7mrF0VZ1ExBksX","name":"Outdoor • Animal","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Em/Ag/Em","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"Jnd5pdtnTal5h06A","name":"Science/Analytic • Basic","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Re/Me/Re","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"KnUkHQavTshrTjkg","name":"Awareness • Perceptions","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"In/Sd/In","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"N42RNwyuUGHRjodJ","name":"Spells • Own Realm Closed Lists","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"OyH3yI187GiJcIc4","name":"Lore • Magical","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Me/Re/Me","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"Q4i7dMnuPsVqZHYw","name":"Artistic • Passive","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Em/In/Pr","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"QTDmhJB09fDe8iQv","name":"Martial Arts • Striking","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"St/Ag/St","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Power Point Development","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.2C7f9nvf1kuK8rXY"}},"_id":"QtaTRdx4XPibLhdr"} +{"_id":"Rl6sVmW7tYsp7AwE","name":"Weapon • Pole Arms","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"St/Ag/St","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Power Manipulation","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Em/In/Pr","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.qDbLIKRv8Q2Ciw74"}},"_id":"TW4y2IyruLOgQakC"} +{"_id":"Ta85zeG0pUbHtNBr","name":"Spells • Other Realm Open Lists","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Communications","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Re/Me/Em","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.2JoQYKw8w0Hlpq4A"}},"_id":"UCh0IobVLOUEK6av"} +{"_id":"V8KDQbEuZHFyAVmr","name":"Awareness • Searching","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"In/Re/SD","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"Vr9W9tfAwSitbMET","name":"Outdoor • Environmental","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"SD/In/Me","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"YEEf2L6g7ZMzTcbF","name":"Technical/Trade • General","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Re/Me/SD","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"YmhpyPfe6QnhPvQt","name":"Armor • Heavy","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"St/Ag/St","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"Yv6KAUTUixKBs2Wg","name":"Weapon • Missile Artillery","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"In/Ag/Re","development_cost":"","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"aJG4v8JkqUiXORVC","name":"Athletic • Endurance","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Co/Ag/St","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"aMAh2dm9dNpXc594","name":"Technical/Trade • Professional","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Re/Me/In","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"apah6xF0sZmT2wbe","name":"Spells • Own Realm Open Lists","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"bBFVMX3i9ytyGBjc","name":"Combat Maneuvers","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Ag/Qu/SD","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.tnvG5xaEcQocDS0w"}}} +{"_id":"bWXkqTxusDg3LD3p","name":"Lore • General","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Me/Re/Me","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Urban","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"In/Pr/Re","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.1ctWjqn6zIq1Ecah"}},"_id":"eGjI9piHe9tafzBC"} +{"_id":"eJ8HV5AYy1zzYrEL","name":"Weapon • 1-H Concussion","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"St/Ag/St","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"fiTen0GICCayYkzd","name":"Athletic • Brawn","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"St/Co/Ag","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"jOlyQllB1OMurWft","name":"Martial Arts • Sweeps","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Ag/St/Ag","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Special Attacks","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"St/Ag/St","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.DGkoTXdfa07tJWMt"}},"_id":"k5ybPxU5ZKdege0Q"} +{"_id":"m8dtArvtmCzVC1mA","name":"Subterfuge • Stealth","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Ag/SD/In","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Directed Spells","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Ag/SD/Ag","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.OY1iAvwGdsBA3oi9"}},"_id":"pwCwq6GP5Kra9zKv"} +{"_id":"r9z7zKuzfWlORaes","name":"Spells • Own Realm Own Base Lists","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"th7zQOOVjKY0B1j1","name":"Weapon • 2-Handed","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"St/Ag/St","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"name":"Crafts","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"Ag/Me/SD","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{"core":{"sourceId":"Item.EtAtBWxG9aujAxKn"}},"_id":"vcDgHmO9EhyzmTRj"} +{"_id":"wK30vs0JNMznlzWU","name":"Spells • Other Realm Closed List","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"y0bshWPNyGl1THYy","name":"Awareness • Senses","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"In/SD/In","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} +{"_id":"zyMFRGhlL3fuRjab","name":"Weapon • 1-H Edged","type":"skill_category","img":"systems/rmss/assets/default/skill_category.svg","data":{"description":"Description here.","applicable_stats":"St/Ag/St","development_cost":"0","ranks":0,"new_ranks":0,"rank_bonus":0,"stat_bonus":0,"prof_bonus":0,"special_bonus_1":0,"special_bonus_2":0,"total_bonus":0,"favorite":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"jFAyH93PxEe1ncxK":3},"flags":{}} diff --git a/rmss/rmss.css b/rmss/rmss.css new file mode 100644 index 0000000..2577191 --- /dev/null +++ b/rmss/rmss.css @@ -0,0 +1,296 @@ +.sheet form { + display: flex; + flex-direction: column; +} +.sheet .sheet-content { + height: 100%; + display: flex; + flex-direction: column; +} +.sheet .sheet-content .editor { + height: 100%; +} +.container { + display: flex; +} +.actor-icon { + flex-shrink: 1; +} +.header-container { + flex-grow: 2; + outline: 1px solid; + /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} +.header-text { + display: flex; + flex-direction: row; + justify-content: center; +} +.resource-container { + display: flex; + flex-direction: row; + flex-grow: 3; + text-align: -webkit-center; +} +.resource-container > * { + flex: 1 1 0; +} +.resource-entry { + outline: 1px solid; + /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} +.resource-entry input { + width: 50px; + border: none; +} +.stat-container { + flex-direction: column; + flex-shrink: 1; +} +.equipment-container { + flex-direction: column; + flex-grow: 1; +} +.stat-block { + outline: 1px solid; + /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} +.stat-name, +.money-name { + width: 75px; + border: none; + font-family: Signika, sans-serif; + font-size: 12px; +} +.stat-name input { + border: none; +} +.stat-header { + font-family: Signika, sans-serif; + font-size: 12px; +} +.fixed-info-container { + flex-grow: 3; + flex-direction: row; + font-family: Signika, sans-serif; + font-size: 12px; +} +.fixed-info-section { + outline: 1px solid; + /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} +.armor-block { + outline: 1px solid; + /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} +.race-stat-fixed-info-block { + outline: 1px solid; + /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} +.role-traits-block { + outline: 1px solid; + /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} +.background-info-block { + outline: 1px solid; + /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} +.resistance-block { + outline: 1px solid; + /* use instead of border */ + margin-top: 1px; + margin-left: 1px; + padding: 5px; +} +.red { + background-color: orangered; +} +.blue { + background-color: lightblue; +} +.grey { + background-color: lightgrey; +} +.green { + background-color: lightseagreen; +} +.skillcat-name, +.skill-name, +.item-name { + font-family: Signika, sans-serif; + font-size: 12px; + font-weight: bold; + text-align: center; +} +.skillcat-entry, +.skill-entry, +.item-entry { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; +} +.skillcat-headeritem, +.skill-headeritem, +.item-headeritem { + text-align: center; + font-weight: bold; +} +.skillcat-controls, +.skill-controls, +.item-controls { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; +} +.money-column { + flex-direction: column; +} +.money-container { + flex-direction: column; + flex-shrink: 1; +} +.table-font { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; +} +.table-bold { + font-weight: bold; +} +.table-center { + text-align: center; +} +.table-controls { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; +} +.skillcat-grid-container { + display: grid; + grid-template-columns: [skill-category-name] 10% [applicable-stats] 10% [dev-cost] 8% [num-ranks] 8% [new-ranks] 8% [rank-bonus] 8% [stat-bonus] 8% [prof-bonus] 8% [special-bonus-1] 8% [special-bonus-2] 8% [total-bonus] 8% [controls] 8%; +} +.skillcat-grid-container > div { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; + border-bottom: 1px solid; + padding-top: 3px; + padding-bottom: 3px; + display: flex; + justify-content: flex-end; + flex-direction: column; + justify-content: center; +} +.skillcat-grid-container > div:nth-child(24n+1), +.skillcat-grid-container > div:nth-child(24n+2), +.skillcat-grid-container > div:nth-child(24n+3), +.skillcat-grid-container > div:nth-child(24n+4), +.skillcat-grid-container > div:nth-child(24n+5), +.skillcat-grid-container > div:nth-child(24n+6), +.skillcat-grid-container > div:nth-child(24n+7), +.skillcat-grid-container > div:nth-child(24n+8), +.skillcat-grid-container > div:nth-child(24n+9), +.skillcat-grid-container > div:nth-child(24n+10), +.skillcat-grid-container > div:nth-child(24n+11), +.skillcat-grid-container > div:nth-child(24n+12) { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; + border-bottom: 1px solid; + padding-top: 3px; + padding-bottom: 3px; + display: flex; + justify-content: flex-end; + flex-direction: column; + justify-content: center; + background-image: linear-gradient(rgba(0, 0, 0, 0.1) 0 0); +} +.skillcat-grid-heading { + font-weight: bold; + border-bottom: 1px solid; + background-image: linear-gradient(rgba(0, 0, 0, 0.1) 0 0); +} +.skills-grid-container { + display: grid; + grid-template-columns: [favorite] 9% [skill-name] 11% [num-ranks] 9% [new-ranks] 9% [rank-bonus] 9% [category-bonus] 9% [item-bonus] 9% [special-bonus-1] 9% [special-bonus-2] 9% [total-bonus] 9% [controls] 8%; +} +.skills-grid-container > div { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; + border-bottom: 1px solid; + padding-top: 3px; + padding-bottom: 3px; + display: flex; + justify-content: flex-end; + flex-direction: column; + justify-content: center; +} +.skills-grid-container > div:nth-child(22n+1), +.skills-grid-container > div:nth-child(22n+2), +.skills-grid-container > div:nth-child(22n+3), +.skills-grid-container > div:nth-child(22n+4), +.skills-grid-container > div:nth-child(22n+5), +.skills-grid-container > div:nth-child(22n+6), +.skills-grid-container > div:nth-child(22n+7), +.skills-grid-container > div:nth-child(22n+8), +.skills-grid-container > div:nth-child(22n+9), +.skills-grid-container > div:nth-child(22n+10), +.skills-grid-container > div:nth-child(22n+11) { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; + border-bottom: 1px solid; + padding-top: 3px; + padding-bottom: 3px; + display: flex; + justify-content: flex-end; + flex-direction: column; + justify-content: center; + background-image: linear-gradient(rgba(0, 0, 0, 0.1) 0 0); +} +.skills-grid-heading { + font-weight: bold; + border-bottom: 1px solid; + background-image: linear-gradient(rgba(0, 0, 0, 0.1) 0 0); +} +.applicable-stats-grid-container { + display: grid; + grid-template-columns: [app-stat-1] 33% [app-stat-2] 33% [dapp-stat-3] 33%; +} +.applicable-stats-grid-container > div { + font-family: Signika, sans-serif; + font-size: 12px; + text-align: center; + border-bottom: 1px solid; + padding-top: 3px; + padding-bottom: 3px; + display: flex; + justify-content: flex-end; + flex-direction: column; + justify-content: center; +} diff --git a/rmss/rmss.js b/rmss/rmss.js new file mode 100644 index 0000000..7a150c4 --- /dev/null +++ b/rmss/rmss.js @@ -0,0 +1,91 @@ +// Import Configuration Object +console.log("rmss | Importing configuration javascript"); +import {rmss} from "./module/config.js"; + +// Import document classes. +console.log("rmss | Importing document classes"); +import { RMSSActor } from "./module/documents/actor.js"; +import { RMSSItem } from "./module/documents/item.js"; + +// Import Sheets +console.log("rmss | Importing actor and item sheet"); +import RMSSItemSheet from "./module/sheets/items/rmss_item_sheet.js"; +import RMSSArmorSheet from "./module/sheets/items/rmss_armor_sheet.js"; +import RMSSTransportSheet from "./module/sheets/items/rmss_transport_sheet.js"; +import RMSSWeaponSheet from "./module/sheets/items/rmss_weapon_sheet.js"; +import RMSSHerbOrPoisonSheet from "./module/sheets/items/rmss_herb_or_poison_sheet.js"; +import RMSSSpellSheet from "./module/sheets/spells/rmss_spell_sheet.js"; +import RMSSSkillCategorySheet from "./module/sheets/skills/rmss_skill_category_sheet.js" +import RMSSSkillSheet from "./module/sheets/skills/rmss_skill_sheet.js" + +import RMSSPlayerSheet from "./module/sheets/actors/rmss_player_sheet.js"; + +// Preload handlebars templates for character sheets +async function preloadHandlebarsTemplates() { + const templatePaths = [ + "systems/rmss/templates/sheets/actors/parts/actor-stats.html", + "systems/rmss/templates/sheets/actors/parts/actor-fixed-info.html", + "systems/rmss/templates/sheets/actors/parts/actor-armor-info.html", + "systems/rmss/templates/sheets/actors/parts/actor-resistance.html", + "systems/rmss/templates/sheets/actors/parts/actor-race-stat-fixed-info.html", + "systems/rmss/templates/sheets/actors/parts/actor-role-traits.html", + "systems/rmss/templates/sheets/actors/parts/actor-background-info.html", + "systems/rmss/templates/sheets/actors/parts/actor-skill-categories.html", + "systems/rmss/templates/sheets/actors/parts/actor-skills.html", + "systems/rmss/templates/sheets/actors/parts/actor-fav-skills.html", + "systems/rmss/templates/sheets/actors/parts/actor-items.html", + "systems/rmss/templates/sheets/actors/parts/actor-money.html", + "systems/rmss/templates/sheets/actors/parts/actor-skill-categories-grid.html", + "systems/rmss/templates/sheets/actors/parts/actor-skills-grid.html" + ] + return loadTemplates(templatePaths); +} + +// Hook the init function and set up our system +Hooks.once("init", function () { + console.log("rmss | Initialising Rolemaster Standard System"); + + // Load our custom actor and item classes + console.log("rmss | Loading Rolemaster Actor and Item classes"); + game.rmss = { + RMSSActor, + RMSSItem + }; + + // Define custom Document classes + CONFIG.Actor.documentClass = RMSSActor; + CONFIG.Item.documentClass = RMSSItem; + + // Make Config Data Available + CONFIG.rmss = rmss; + + // Unregister Default Sheets + console.log("rmss | Unregistering core sheets"); + + Items.unregisterSheet("core", ItemSheet); + Actors.unregisterSheet("core", ActorSheet); + + // Register RMSS Sheets + console.log("rmss | Registering RMSS sheets"); + + // Items + Items.registerSheet("rmss", RMSSItemSheet, {makeDefault: true, label: "rmss.entity_sheet.item", types: ['item']}); + Items.registerSheet("rmss", RMSSArmorSheet, {makeDefault: true, label: "rmss.entity_sheet.armor", types: ['armor']}); + Items.registerSheet("rmss", RMSSTransportSheet, {makeDefault: true, label: "rmss.entity_sheet.transport", types: ['transport']}); + Items.registerSheet("rmss", RMSSWeaponSheet, {makeDefault: true, label: "rmss.entity_sheet.weapon", types: ['weapon']}); + Items.registerSheet("rmss", RMSSHerbOrPoisonSheet, {makeDefault: true, label: "rmss.entity_sheet.herb_or_poison", types: ['herb_or_poison']}); + + // Spells + Items.registerSheet("rmss", RMSSSpellSheet, {makeDefault: true, label: "rmss.entity_sheet.spell", types: ['spell']}); + + // Skills + Items.registerSheet("rmss", RMSSSkillCategorySheet, {makeDefault: true, label: "rmss.entity_sheet.skill_category", types: ['skill_category']}); + Items.registerSheet("rmss", RMSSSkillSheet, {makeDefault: true, label: "rmss.entity_sheet.skill", types: ['skill']}); + + // Actors + Actors.registerSheet("rmss", RMSSPlayerSheet, {makeDefault: true, label: "rmss.entity_sheet.player_characrer", types: ['character']}); + + // Preload Handlebars Templates + console.log("rmss | Preloading Handlebars Templates"); + preloadHandlebarsTemplates(); +}); \ No newline at end of file diff --git a/rmss/system.json b/rmss/system.json new file mode 100644 index 0000000..13b0c3b --- /dev/null +++ b/rmss/system.json @@ -0,0 +1,31 @@ +{ + "name": "rmss", + "title": "Rolemaster Standard System", + "description": "The Rolemaster Standard System system for FoundryVTT.", + "author": "Cynicide", + "version": "0.0.1", + "minimumCoreVersion": "0.8.6", + "compatibleCoreVersion": "9", + "esmodules":[ + "rmss.js" + ], + "styles": ["rmss.css"], + "packs": [ { + "name": "skill_categories", + "label": "Skill Categories", + "system": "rmss", + "path": "./packs/skill_categories.db", + "type": "Item" + } + ], + "languages": [ + { + "lang": "en", + "name": "English", + "path": "lang/en.json" + } + ], + "gridDistance": 5, + "gridUnits": "ft", + "license": "LICENSE.txt" +} diff --git a/rmss/template.json b/rmss/template.json new file mode 100644 index 0000000..33f71c5 --- /dev/null +++ b/rmss/template.json @@ -0,0 +1,304 @@ +{ + "Actor": { + "types": ["character", "npc"], + "templates": { + "role_traits": { + "role_traits": { + "appearance": 10, + "sex": "mysex", + "skin": "myskin", + "apparent_age": 30, + "actual_age": 35, + "height": "myheight", + "weight": "myweight", + "hair": "myhair", + "eyes": "myeyes", + "personality": "mypersonality", + "motivations": "mymotivations", + "alignment": "myalignment" + } + }, + "race_stat_fixed_info": { + "race_stat_fixed_info" : { + "soul_departure_rounds": 5, + "recovery_multiplier": 7, + "body_development_progression": "research", + "pp_development_progression": "research", + "recover_hits_per_hour_resting": 6, + "recover_hits_per_sleep_cycle": 7, + "recover_pp_per_hour_resting": 8, + "recover_pp_per_sleep_cycle": 9 + } + }, + "armor_info": { + "armor_info": { + "armor_type": 7, + "mmp": -10, + "weight_penalty": -5, + "missile_penalty": 30, + "quickness_penalty": 40, + "quickness_bonus": 60, + "adrenal_defense": 50, + "shield_bonus": 20, + "magic": "research", + "total_db": 102 + } + }, + "fixed_info": { + "fixed_info": { + "race": "myrace", + "profession": "myprofession", + "training_packages": "mytrainingpackages", + "realm": "myrealm" + } + }, + "resistance_rolls": { + "resistance_rolls": { + "channeling": 0, + "essence": 0, + "mentalism": 0, + "chann_ess": 0, + "chann_ment": 0, + "ess_ment": 0, + "arcane": 0, + "poison_disease": 0, + "fear": 0 + } + }, + "background": { + "background": { + "nationality": "mynationality", + "home_town": "myhometown", + "deity": "mydeity", + "patron": "mypatron", + "parents": "myparents", + "spouse": "myspouse", + "children": "mychildren", + "other": "myother" + } + }, + "stats": { + "stats": { + "agility": { + "shortname": "Ag", + "temp": 1, + "potential": 2, + "basic_bonus": 3, + "racial_bonus": 4, + "special_bonus": 5, + "stat_bonus": 0 + }, + "constitution": { + "shortname": "Co", + "temp": 6, + "potential": 7, + "basic_bonus": 8, + "racial_bonus": 9, + "special_bonus": 10, + "stat_bonus": 0 + }, + "memory": { + "shortname": "Me", + "temp": 11, + "potential": 12, + "basic_bonus": 13, + "racial_bonus": 14, + "special_bonus": 15, + "stat_bonus": 0 + }, + "reasoning": { + "shortname": "Re", + "temp": 16, + "potential": 17, + "basic_bonus": 18, + "racial_bonus": 19, + "special_bonus": 20, + "stat_bonus": 0 + }, + "self_discipline": { + "shortname": "SD", + "temp": 21, + "potential": 22, + "basic_bonus": 23, + "racial_bonus": 24, + "special_bonus": 25, + "stat_bonus": 0 + }, + "empathy": { + "shortname": "Em", + "temp": 26, + "potential": 27, + "basic_bonus": 28, + "racial_bonus": 29, + "special_bonus": 30, + "stat_bonus": 0 + }, + "intuition": { + "shortname": "In", + "temp": 31, + "potential": 32, + "basic_bonus": 33, + "racial_bonus": 34, + "special_bonus": 35, + "stat_bonus": 0 + }, + "presence": { + "shortname": "Pr", + "temp": 36, + "potential": 37, + "basic_bonus": 38, + "racial_bonus": 39, + "special_bonus": 40, + "stat_bonus": 0 + }, + "quickness": { + "shortname": "Qu", + "temp": 41, + "potential": 42, + "basic_bonus": 43, + "racial_bonus": 44, + "special_bonus": 45, + "stat_bonus": 0 + }, + "strength": { + "shortname": "St", + "temp": 46, + "potential": 47, + "basic_bonus": 48, + "racial_bonus": 49, + "special_bonus": 50, + "stat_bonus": 0 + } + } + }, + "money": { + "mithril": 1, + "platinum": 2, + "gold": 3, + "silver": 4, + "bronze": 5, + "copper": 6, + "tin": 7, + "iron": 8 + } + }, + + "character": { + "templates": ["background", "stats", "resistance_rolls", "armor_info", "fixed_info", "race_stat_fixed_info", "role_traits", "money"], + "attributes": { + "level": { + "value": 1 + }, + "hits": { + "current": 1, + "max": 1 + }, + "exhaustion_points": { + "current": 2, + "max": 2 + }, + "power_points": { + "current": 3, + "max": 3 + }, + "experience_points": { + "value": 0 + } + } + } + }, + "Item": { + "types": ["item", "skill_category", "skill", "armor", "weapon", "transport", "herb_or_poison", "spell"], + "templates": { + "base": { + "description": "Description here." + } + }, + "item": { + "templates": ["base"], + "quantity": 1, + "weight": 0, + "cost": 0, + "prod_time": 0 + }, + "transport": { + "templates": ["base"], + "feet_per_round": 1, + "miles_per_hour": 0, + "cost": 0, + "maneuver": 0, + "height": 0, + "weight": 0, + "capacity": 0, + "offensive_bonus": 0 + }, + "armor": { + "templates": ["base"], + "quantity": 1, + "weight": 0, + "cost": 0, + "prod_time": 0, + "at": 0 + }, + "weapon": { + "templates": ["base"], + "quantity": 1, + "cost": 0, + "weight": 0, + "type" : "nothing", + "prod_time": 0, + "at": 0, + "breakage_range": "nothing", + "strength": "nothing", + "fumble_range": "nothing" + }, + "herb_or_poison": { + "templates": ["base"], + "quantity": 1, + "weight": 0, + "codes": "nothing", + "form_and_prep" : "nothing", + "cost": 0, + "af": 0 + }, + "skill": { + "templates": ["base"], + "category" : "", + "ranks": 0, + "new_ranks": 0, + "rank_bonus": 0, + "category_bonus": 0, + "item_bonus": 0, + "special_bonus_1": 0, + "special_bonus_2": 0, + "total_bonus": 0, + "favorite": false + }, + "skill_category": { + "templates": ["base"], + "applicable_stats": "St/Ag/St", + "app_stat_1": "None", + "app_stat_2": "None", + "app_stat_3": "None", + "development_cost": "0", + "ranks": 0, + "new_ranks": 0, + "rank_bonus": 0, + "stat_bonus": 0, + "prof_bonus": 0, + "special_bonus_1": 0, + "special_bonus_2": 0, + "total_bonus": 0, + "favorite": false + }, + "spell": { + "spell_list": "Open Channeling", + "level": 1, + "area_of_effect": "10 x 10 x 1", + "duration": "C", + "range": 50, + "type": "E", + "description": "My New Spell!" + } + } +} diff --git a/rmss/templates/sheets/actors/parts/actor-armor-info.html b/rmss/templates/sheets/actors/parts/actor-armor-info.html new file mode 100644 index 0000000..a2dd2f5 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-armor-info.html @@ -0,0 +1,62 @@ +
+
+ {{ localize "rmss.pc_sheet_armor_info.armor_type" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_armor_info.mmp" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_armor_info.weight_penalty" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_armor_info.missile_penalty" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_armor_info.quickness_penalty" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_armor_info.quickness_bonus" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_armor_info.adrenal_defense" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_armor_info.shield_bonus" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_armor_info.magic" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_armor_info.total_db" }} +
+
+ +
+
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-background-info.html b/rmss/templates/sheets/actors/parts/actor-background-info.html new file mode 100644 index 0000000..1d755a6 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-background-info.html @@ -0,0 +1,50 @@ +
+
+ {{ localize "rmss.pc_sheet_background_info.nationality" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_background_info.home_town" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_background_info.deity" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_background_info.patron" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_background_info.parents" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_background_info.spouse" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_background_info.children" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_background_info.other" }} +
+
+ +
+
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-fav-skills.html b/rmss/templates/sheets/actors/parts/actor-fav-skills.html new file mode 100644 index 0000000..9835f98 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-fav-skills.html @@ -0,0 +1,16 @@ + + + + + {{#each playerskill as |skill id|}} + {{#if skill.data.favorite}} + + + + + + {{/if}} + {{/each}} +
{{ localize "rmss.pc_sheet_skills.skill_name" }}
{{ localize "rmss.pc_sheet_skills.ranks" }}
{{ localize "rmss.pc_sheet_skills.total_bonus" }}
+

{{skill.name}}

+
{{skill.data.ranks}}
{{skill.data.total_bonus}}
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-fixed-info.html b/rmss/templates/sheets/actors/parts/actor-fixed-info.html new file mode 100644 index 0000000..1feb73c --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-fixed-info.html @@ -0,0 +1,26 @@ +
+
+ {{ localize "rmss.pc_sheet_fixed_info.race" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_fixed_info.profession" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_fixed_info.training_packages" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_fixed_info.realm" }} +
+
+ +
+
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-items.html b/rmss/templates/sheets/actors/parts/actor-items.html new file mode 100644 index 0000000..22eafca --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-items.html @@ -0,0 +1,28 @@ + + + + + + + + + + + {{#each gear as |item id|}} + + + + + + + + + {{/each}} +
{{ localize "rmss.pc_sheet_items.favorite" }}
{{ localize "rmss.pc_sheet_items.quantity" }}
{{ localize "rmss.pc_sheet_items.item_name" }}
{{ localize "rmss.pc_sheet_items.weight" }}
{{ localize "rmss.pc_sheet_items.cost" }}
{{item.data.quantity}}
+

{{item.name}}

+
{{item.data.weight}}
{{item.data.cost}}
+ + +
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-money.html b/rmss/templates/sheets/actors/parts/actor-money.html new file mode 100644 index 0000000..82b4fb1 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-money.html @@ -0,0 +1,14 @@ +
+
+
Mithril:
+
Platinum:
+
Gold:
+
Silver:
+
+
+
Bronze:
+
Copper:
+
Tin:
+
Iron:
+
+
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-race-stat-fixed-info.html b/rmss/templates/sheets/actors/parts/actor-race-stat-fixed-info.html new file mode 100644 index 0000000..8ebcb72 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-race-stat-fixed-info.html @@ -0,0 +1,50 @@ +
+
+ {{ localize "rmss.pc_sheet_race_stat_fixed_info.soul_departure" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_race_stat_fixed_info.recovery_multiplier" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_race_stat_fixed_info.body_dev_progression" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_race_stat_fixed_info.pp_dev_progression" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_race_stat_fixed_info.recover_hits_per_hour" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_race_stat_fixed_info.recover_hits_per_sleep_cycle" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_race_stat_fixed_info.recover_pp_per_hour" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_race_stat_fixed_info.recover_pp_per_sleep_cycle" }} +
+
+ +
+
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-resistance.html b/rmss/templates/sheets/actors/parts/actor-resistance.html new file mode 100644 index 0000000..c5e747b --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-resistance.html @@ -0,0 +1,84 @@ +
+
    +
  1. +
    +

    {{ localize "rmss.pc_sheet_resistances.channeling" }}

    +
    +
    +

    {{data.resistance_rolls.channeling}}

    +
    +
  2. + +
  3. +
    +

    {{ localize "rmss.pc_sheet_resistances.essence" }}

    +
    +
    +

    {{data.resistance_rolls.essence}}

    +
    +
  4. + +
  5. +
    +

    {{ localize "rmss.pc_sheet_resistances.mentalism" }}

    +
    +
    +

    {{data.resistance_rolls.mentalism}}

    +
    +
  6. + +
  7. +
    +

    {{ localize "rmss.pc_sheet_resistances.chann_ess" }}

    +
    +
    +

    {{data.resistance_rolls.chann_ess}}

    +
    +
  8. + +
  9. +
    +

    {{ localize "rmss.pc_sheet_resistances.chann_ment" }}

    +
    +
    +

    {{data.resistance_rolls.chann_ment}}

    +
    +
  10. + +
  11. +
    +

    {{ localize "rmss.pc_sheet_resistances.ess_ment" }}

    +
    +
    +

    {{data.resistance_rolls.ess_ment}}

    +
    +
  12. + +
  13. +
    +

    {{ localize "rmss.pc_sheet_resistances.arcane" }}

    +
    +
    +

    {{data.resistance_rolls.arcane}}

    +
    +
  14. + +
  15. +
    +

    {{ localize "rmss.pc_sheet_resistances.poison_disease" }}

    +
    +
    +

    {{data.resistance_rolls.poison_disease}}

    +
    +
  16. + +
  17. +
    +

    Fear

    +
    +
    +

    {{data.resistance_rolls.fear}}

    +
    +
  18. +
+
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-role-traits.html b/rmss/templates/sheets/actors/parts/actor-role-traits.html new file mode 100644 index 0000000..ba384b3 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-role-traits.html @@ -0,0 +1,74 @@ +
+
+ {{ localize "rmss.pc_sheet_role_traits.appearance" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.sex" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.skin" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.apparent_age" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.actual_age" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.height" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.weight" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.hair" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.eyes" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.personality" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.motivations" }} +
+
+ +
+
+ {{ localize "rmss.pc_sheet_role_traits.alignment" }} +
+
+ +
+
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-skill-categories-grid.html b/rmss/templates/sheets/actors/parts/actor-skill-categories-grid.html new file mode 100644 index 0000000..b8a2dc5 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-skill-categories-grid.html @@ -0,0 +1,33 @@ +
+
{{ localize "rmss.pc_sheet_skill_categories.skillcat_name" }}
+
{{ localize "rmss.pc_sheet_skill_categories.applicable_stats" }}
+
{{ localize "rmss.pc_sheet_skill_categories.dev_cost" }}
+
{{ localize "rmss.pc_sheet_skill_categories.ranks" }}
+
{{ localize "rmss.pc_sheet_skill_categories.new_ranks" }}
+
{{ localize "rmss.pc_sheet_skill_categories.rank_bonus" }}
+
{{ localize "rmss.pc_sheet_skill_categories.stat_bonus" }}
+
{{ localize "rmss.pc_sheet_skill_categories.prof_bonus" }}
+
{{ localize "rmss.pc_sheet_skill_categories.special_bonus" }}
+
{{ localize "rmss.pc_sheet_skill_categories.special_bonus" }}
+
{{ localize "rmss.pc_sheet_skill_categories.total_bonus" }}
+
+ {{ localize "rmss.pc_sheet_skill_categories.add_skillcat" }} +
+ {{#each skillcat as |skill_category id|}} +
{{skill_category.name}}
+
{{skill_category.data.applicable_stats}}
+
{{skill_category.data.development_cost}}
+
{{skill_category.data.ranks}}
+
{{skill_category.data.new_ranks}}
+
{{skill_category.data.rank_bonus}}
+
{{skill_category.data.stat_bonus}}
+
{{skill_category.data.prof_bonus}}
+
{{skill_category.data.special_bonus_1}}
+
{{skill_category.data.special_bonus_2}}
+
{{skill_category.data.total_bonus}}
+
+ + +
+ {{/each}} +
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-skill-categories.html b/rmss/templates/sheets/actors/parts/actor-skill-categories.html new file mode 100644 index 0000000..5107096 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-skill-categories.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + {{#each skillcat as |skill_category id|}} + + + + + + + + + + + + + + + {{/each}} +
{{ localize "rmss.pc_sheet_skill_categories.skillcat_name" }}
{{ localize "rmss.pc_sheet_skill_categories.applicable_stats" }}
{{ localize "rmss.pc_sheet_skill_categories.dev_cost" }}
{{ localize "rmss.pc_sheet_skill_categories.ranks" }}
{{ localize "rmss.pc_sheet_skill_categories.new_ranks" }}
{{ localize "rmss.pc_sheet_skill_categories.rank_bonus" }}
{{ localize "rmss.pc_sheet_skill_categories.stat_bonus" }}
{{ localize "rmss.pc_sheet_skill_categories.prof_bonus" }}
{{ localize "rmss.pc_sheet_skill_categories.special_bonus" }}
{{ localize "rmss.pc_sheet_skill_categories.special_bonus" }}
{{ localize "rmss.pc_sheet_skill_categories.total_bonus" }}
{{skill_category.name}}
{{skill_category.data.applicable_stats}}
{{skill_category.data.development_cost}}
{{skill_category.data.ranks}}
{{skill_category.data.new_ranks}}
{{skill_category.data.rank_bonus}}
{{skill_category.data.stat_bonus}}
{{skill_category.data.prof_bonus}}
{{skill_category.data.special_bonus_1}}
{{skill_category.data.special_bonus_2}}
{{skill_category.data.total_bonus}}
+ + +
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-skills-grid.html b/rmss/templates/sheets/actors/parts/actor-skills-grid.html new file mode 100644 index 0000000..42502f4 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-skills-grid.html @@ -0,0 +1,31 @@ +
+
{{ localize "rmss.pc_sheet_skills.favorite" }}
+
{{ localize "rmss.pc_sheet_skills.skill_name" }}
+
{{ localize "rmss.pc_sheet_skills.ranks" }}
+
{{ localize "rmss.pc_sheet_skills.new_ranks" }}
+
{{ localize "rmss.pc_sheet_skills.rank_bonus" }}
+
{{ localize "rmss.pc_sheet_skills.category_bonus" }}
+
{{ localize "rmss.pc_sheet_skills.item_bonus" }}
+
{{ localize "rmss.pc_sheet_skills.special_bonus" }}
+
{{ localize "rmss.pc_sheet_skills.special_bonus" }}
+
{{ localize "rmss.pc_sheet_skills.total_bonus" }}
+
+ {{ localize "rmss.pc_sheet_skills.add_skill" }} +
+ {{#each playerskill as |skill id|}} +
+
{{skill.name}}
+
{{skill.data.ranks}}
+
{{skill.data.new_ranks}}
+
{{skill.data.rank_bonus}}
+
{{skill.data.category_bonus}}
+
{{skill.data.item_bonus}}
+
{{skill.data.special_bonus_1}}
+
{{skill.data.special_bonus_2}}
+
{{skill.data.total_bonus}}
+
+ + +
+ {{/each}} +
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-skills.html b/rmss/templates/sheets/actors/parts/actor-skills.html new file mode 100644 index 0000000..fec5f14 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-skills.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + {{#each playerskill as |skill id|}} + + + + + + + + + + + + + + {{/each}} +
{{ localize "rmss.pc_sheet_skills.favorite" }}
{{ localize "rmss.pc_sheet_skills.skill_name" }}
{{ localize "rmss.pc_sheet_skills.ranks" }}
{{ localize "rmss.pc_sheet_skills.new_ranks" }}
{{ localize "rmss.pc_sheet_skills.rank_bonus" }}
{{ localize "rmss.pc_sheet_skills.category_bonus" }}
{{ localize "rmss.pc_sheet_skills.item_bonus" }}
{{ localize "rmss.pc_sheet_skills.special_bonus" }}
{{ localize "rmss.pc_sheet_skills.special_bonus" }}
{{ localize "rmss.pc_sheet_skills.total_bonus" }}
+

{{skill.name}}

+
{{skill.data.ranks}}
{{skill.data.new_ranks}}
{{skill.data.rank_bonus}}
{{skill.data.category_bonus}}
{{skill.data.item_bonus}}
{{skill.data.special_bonus_1}}
{{skill.data.special_bonus_2}}
{{skill.data.total_bonus}}
+ + +
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/parts/actor-stats.html b/rmss/templates/sheets/actors/parts/actor-stats.html new file mode 100644 index 0000000..07eafc0 --- /dev/null +++ b/rmss/templates/sheets/actors/parts/actor-stats.html @@ -0,0 +1,313 @@ +
+
    +
  1. +
    {{ localize "rmss.player_character.attribute_headers.stat" }}
    +
    {{ localize "rmss.player_character.attribute_headers.temp" }}
    +
    {{ localize "rmss.player_character.attribute_headers.pot" }}
    +
    {{ localize "rmss.player_character.attribute_headers.basic_bonus" }}
    +
    {{ localize "rmss.player_character.attribute_headers.racial_bonus" }}
    +
    {{ localize "rmss.player_character.attribute_headers.special_bonus" }}
    +
    {{ localize "rmss.player_character.attribute_headers.stat_bonus" }}
    +
  2. + +
  3. +
    + {{ localize "rmss.player_character.attribute.agility" }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + {{data.stats.agility.stat_bonus}} +
    +
  4. + +
  5. +
    + {{ localize "rmss.player_character.attribute.constitution" }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + {{data.stats.constitution.stat_bonus}} +
    +
  6. + +
  7. +
    + {{ localize "rmss.player_character.attribute.memory" }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + {{data.stats.memory.stat_bonus}} +
    +
  8. + +
  9. +
    + {{ localize "rmss.player_character.attribute.reasoning" }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + {{data.stats.reasoning.stat_bonus}} +
    +
  10. + +
  11. +
    + {{ localize "rmss.player_character.attribute.self_discipline" }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + {{data.stats.self_discipline.stat_bonus}} +
    +
  12. + +
  13. +
    + {{ localize "rmss.player_character.attribute.empathy" }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + {{data.stats.empathy.stat_bonus}} +
    +
  14. + +
  15. +
    + {{ localize "rmss.player_character.attribute.intuition" }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + {{data.stats.intuition.stat_bonus}} +
    +
  16. + +
  17. +
    + {{ localize "rmss.player_character.attribute.presence" }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + {{data.stats.presence.stat_bonus}} +
    +
  18. + +
  19. +
    + {{ localize "rmss.player_character.attribute.quickness" }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + {{data.stats.quickness.stat_bonus}} +
    +
  20. + +
  21. +
    + {{ localize "rmss.player_character.attribute.strength" }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + {{data.stats.strength.stat_bonus}} +
    +
  22. +
+
\ No newline at end of file diff --git a/rmss/templates/sheets/actors/rmss-character-sheet.html b/rmss/templates/sheets/actors/rmss-character-sheet.html new file mode 100644 index 0000000..f51dbac --- /dev/null +++ b/rmss/templates/sheets/actors/rmss-character-sheet.html @@ -0,0 +1,108 @@ +
+ + +
+ +
+ + + +
+ +
+ + + +
+ +
+ {{ localize "rmss.player_character.resources.hits" }} +

/

+
+ +
+ {{ localize "rmss.player_character.resources.exhaustion_points" }} +

/

+
+ +
+ {{ localize "rmss.player_character.resources.power_points" }} +

/

+
+
+ + + +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+
+ + + {{!-- Sheet Tab Navigation --}} + + +
+
+
+
+ {{> "systems/rmss/templates/sheets/actors/parts/actor-fixed-info.html" }} + {{> "systems/rmss/templates/sheets/actors/parts/actor-armor-info.html" }} + {{> "systems/rmss/templates/sheets/actors/parts/actor-resistance.html" }} + {{> "systems/rmss/templates/sheets/actors/parts/actor-race-stat-fixed-info.html" }} + {{> "systems/rmss/templates/sheets/actors/parts/actor-role-traits.html" }} + {{> "systems/rmss/templates/sheets/actors/parts/actor-background-info.html" }} +
+ +
+ {{> "systems/rmss/templates/sheets/actors/parts/actor-stats.html" }} + {{> "systems/rmss/templates/sheets/actors/parts/actor-fav-skills.html" }} +
+ +
+
+ +
+ {{> "systems/rmss/templates/sheets/actors/parts/actor-skill-categories-grid.html" }} +
+ +
+ {{> "systems/rmss/templates/sheets/actors/parts/actor-skills-grid.html" }} +
+ +
+
+
+ {{> "systems/rmss/templates/sheets/actors/parts/actor-items.html" }} +
+
+ {{> "systems/rmss/templates/sheets/actors/parts/actor-money.html" }} +
+
+
+
+
+ diff --git a/rmss/templates/sheets/items/rmss-armor-sheet.html b/rmss/templates/sheets/items/rmss-armor-sheet.html new file mode 100644 index 0000000..e6b0e16 --- /dev/null +++ b/rmss/templates/sheets/items/rmss-armor-sheet.html @@ -0,0 +1,36 @@ +
+
+ +

+
+
+
+ + + + + + + + + + + + + +
{{localize "rmss.item.quantity"}}{{localize "rmss.armor.weight"}}{{localize "rmss.armor.cost"}}{{localize "rmss.armor.prod_time"}}{{localize "rmss.armor.at"}}
+ + + + + + + + + +
+ {{localize "rmss.item.description"}} + {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
+
diff --git a/rmss/templates/sheets/items/rmss-herb-or-poison-sheet.html b/rmss/templates/sheets/items/rmss-herb-or-poison-sheet.html new file mode 100644 index 0000000..899f2b0 --- /dev/null +++ b/rmss/templates/sheets/items/rmss-herb-or-poison-sheet.html @@ -0,0 +1,40 @@ +
+
+ +

+
+
+
+ + + + + + + + + + + + + + + +
{{localize "rmss.item.quantity"}}{{localize "rmss.herb_or_poison.weight"}}{{localize "rmss.herb_or_poison.codes"}}{{localize "rmss.herb_or_poison.form_and_prep"}}{{localize "rmss.herb_or_poison.cost"}}{{localize "rmss.herb_or_poison.af"}}
+ + + + + + + + + + + +
+ {{localize "rmss.item.description"}} + {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
+
diff --git a/rmss/templates/sheets/items/rmss-item-sheet.html b/rmss/templates/sheets/items/rmss-item-sheet.html new file mode 100644 index 0000000..676201a --- /dev/null +++ b/rmss/templates/sheets/items/rmss-item-sheet.html @@ -0,0 +1,32 @@ +
+
+ +

+
+
+
+ + + + + + + + + + + +
{{localize "rmss.item.quantity"}}{{localize "rmss.item.weight"}}{{localize "rmss.item.cost"}}{{localize "rmss.item.prod_time"}}
+ + + + + + + +
+ {{localize "rmss.item.description"}} + {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
+
diff --git a/rmss/templates/sheets/items/rmss-transport-sheet.html b/rmss/templates/sheets/items/rmss-transport-sheet.html new file mode 100644 index 0000000..ecac73d --- /dev/null +++ b/rmss/templates/sheets/items/rmss-transport-sheet.html @@ -0,0 +1,50 @@ +
+
+ +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
{{localize "rmss.transport.cost"}}{{localize "rmss.transport.feet_per_round"}}{{localize "rmss.transport.miles_per_hour"}}{{localize "rmss.transport.maneuver"}}{{localize "rmss.transport.height"}}{{localize "rmss.transport.weight"}}{{localize "rmss.transport.capacity"}}{{localize "rmss.transport.offensive_bonus"}}
+ + + + + + + + + + + + + + + +
+ {{localize "rmss.item.description"}} + {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
+
diff --git a/rmss/templates/sheets/items/rmss-weapon-sheet.html b/rmss/templates/sheets/items/rmss-weapon-sheet.html new file mode 100644 index 0000000..95b2262 --- /dev/null +++ b/rmss/templates/sheets/items/rmss-weapon-sheet.html @@ -0,0 +1,50 @@ +
+
+ +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
{{localize "rmss.item.quantity"}}{{localize "rmss.weapon.cost"}}{{localize "rmss.weapon.type"}}{{localize "rmss.weapon.prod_time"}}{{localize "rmss.weapon.weight"}}{{localize "rmss.weapon.breakage_range"}}{{localize "rmss.weapon.strength"}}{{localize "rmss.weapon.fumble_range"}}
+ + + + + + + + + + + + + + + +
+ {{localize "rmss.item.description"}} + {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
+
diff --git a/rmss/templates/sheets/skills/rmss-skill-category-sheet.html b/rmss/templates/sheets/skills/rmss-skill-category-sheet.html new file mode 100644 index 0000000..55ed3e1 --- /dev/null +++ b/rmss/templates/sheets/skills/rmss-skill-category-sheet.html @@ -0,0 +1,76 @@ +
+
+ +

+
+
+
+
+ Applicable Stat 1 + +
+
+ Applicable Stat 2 + +
+
+ Applicable Stat 2 + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
{{localize "rmss.skill_category.applicable_stats"}}{{localize "rmss.skill_category.development_cost"}}{{localize "rmss.skill_category.ranks"}}{{localize "rmss.skill_category.new_ranks"}}{{localize "rmss.skill_category.rank_bonus"}}{{localize "rmss.skill_category.stat_bonus"}}{{localize "rmss.skill_category.prof_bonus"}}{{localize "rmss.skill_category.special_bonus_1"}}{{localize "rmss.skill_category.special_bonus_2"}}{{localize "rmss.skill_category.total_bonus"}}
+ + + + + + + + + + + + + + + + + + + +
+ {{localize "rmss.skill_category.description"}} + {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
+
diff --git a/rmss/templates/sheets/skills/rmss-skill-sheet.html b/rmss/templates/sheets/skills/rmss-skill-sheet.html new file mode 100644 index 0000000..8b15084 --- /dev/null +++ b/rmss/templates/sheets/skills/rmss-skill-sheet.html @@ -0,0 +1,52 @@ +
+
+ +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
{{localize "rmss.skill.favorite"}}{{localize "rmss.skill.ranks"}}{{localize "rmss.skill.new_ranks"}}{{localize "rmss.skill.rank_bonus"}}{{localize "rmss.skill.category_bonus"}}{{localize "rmss.skill.item_bonus"}}{{localize "rmss.skill.special_bonus_1"}}{{localize "rmss.skill.special_bonus_2"}}{{localize "rmss.skill.total_bonus"}}
+ + + + + + + + + + + + + + + + + +
+ {{localize "rmss.skill.description"}} + {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
+
diff --git a/rmss/templates/sheets/spells/rmss-spell-sheet.html b/rmss/templates/sheets/spells/rmss-spell-sheet.html new file mode 100644 index 0000000..117dd54 --- /dev/null +++ b/rmss/templates/sheets/spells/rmss-spell-sheet.html @@ -0,0 +1,42 @@ +
+
+ +

+
+
+
+ + + + + + + + + + + + + + + + + +
{{localize "rmss.spell.spell_list"}}{{localize "rmss.spell.level"}}{{localize "rmss.spell.area_of_effect"}}{{localize "rmss.spell.duration"}}{{localize "rmss.spell.range"}}{{localize "rmss.spell.type"}}
+ + + + + + + + + + + +
+ {{localize "rmss.spell.description"}} + {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
+