Merge branch 'master' into 014_track_talents

This commit is contained in:
Johannes Loher 2021-01-07 00:00:36 +01:00
commit b582b44f20
16 changed files with 222 additions and 81 deletions

View file

@ -83,7 +83,7 @@ npm test
## Contributing ## Contributing
Code and content contributions are accepted. Please feel free to submit issues Code and content contributions are accepted. Please feel free to submit issues
to the issue tracker or submit merge requests for code changes. to the issue tracker or submit merge requests for code changes. To create an issue send a mail to [git+dungeonslayers-ds4-155-issue-@git.f3l.de](mailto:git+dungeonslayers-ds4-155-issue-@git.f3l.de).
## Licensing ## Licensing

View file

@ -21,4 +21,5 @@
@import "scss/components/character_values"; @import "scss/components/character_values";
@import "scss/components/attributes_traits"; @import "scss/components/attributes_traits";
@import "scss/components/combat_values"; @import "scss/components/combat_values";
@import "scss/components/character_progression";
} }

View file

@ -5,6 +5,7 @@
"DS4.HeadingDetails": "Details", "DS4.HeadingDetails": "Details",
"DS4.HeadingEffects": "Effects", "DS4.HeadingEffects": "Effects",
"DS4.HeadingItems": "Items", "DS4.HeadingItems": "Items",
"DS4.HeadingProfile": "Profile",
"DS4.HeadingTalents": "Talents & Abilities", "DS4.HeadingTalents": "Talents & Abilities",
"DS4.AttackType": "Attack Type", "DS4.AttackType": "Attack Type",
"DS4.AttackTypeAbbr": "AT", "DS4.AttackTypeAbbr": "AT",
@ -80,6 +81,7 @@
"DS4.BaseInfoClass": "Class", "DS4.BaseInfoClass": "Class",
"DS4.BaseInfoHeroClass": "Hero Class", "DS4.BaseInfoHeroClass": "Hero Class",
"DS4.BaseInfoRacialAbilities": "Racial Abilites", "DS4.BaseInfoRacialAbilities": "Racial Abilites",
"DS4.BaseInfoCulture": "Culture",
"DS4.ProgressionLevel": "Level", "DS4.ProgressionLevel": "Level",
"DS4.ProgressionExperiencePoints": "Experience Points", "DS4.ProgressionExperiencePoints": "Experience Points",
"DS4.ProgressionTalentPoints": "Talent Points", "DS4.ProgressionTalentPoints": "Talent Points",
@ -88,5 +90,16 @@
"DS4.TalentRankBase": "Acquired Ranks", "DS4.TalentRankBase": "Acquired Ranks",
"DS4.TalentRankMax": "Maximum Ranks", "DS4.TalentRankMax": "Maximum Ranks",
"DS4.TalentRankMod": "Additional Ranks", "DS4.TalentRankMod": "Additional Ranks",
"DS4.TalentRankTotal": "Total Ranks" "DS4.TalentRankTotal": "Total Ranks",
"DS4.LanguageLanguages": "Languages",
"DS4.LanguageAlphabets": "Alphabets",
"DS4.ProfileGender": "Gender",
"DS4.ProfileBirthday": "Birthday",
"DS4.ProfileBirthplace": "Birthplace",
"DS4.ProfileAge": "Age",
"DS4.ProfileHeight": "Height",
"DS4.ProfilHairColor": "Hair Color",
"DS4.ProfileWeight": "Weight",
"DS4.ProfileEyeColor": "Eye Color",
"DS4.ProfileSpecialCharacteristics": "Special Characteristics"
} }

View file

@ -4,6 +4,8 @@ export interface DS4ActorDataType {
combatValues: DS4ActorDataCombatValues; combatValues: DS4ActorDataCombatValues;
baseInfo: DS4ActorDataBaseInfo; baseInfo: DS4ActorDataBaseInfo;
progression: DS4ActorDataProgression; progression: DS4ActorDataProgression;
language: DS4ActorDataLanguage;
profile: DS4ActorDataProfile;
} }
interface DS4ActorDataAttributes { interface DS4ActorDataAttributes {
@ -55,6 +57,7 @@ interface DS4ActorDataBaseInfo {
class: string; class: string;
heroClass: string; heroClass: string;
racialAbilities: string; racialAbilities: string;
culture: string;
} }
interface DS4ActorDataProgression { interface DS4ActorDataProgression {
@ -63,3 +66,20 @@ interface DS4ActorDataProgression {
talentPoints: UsableResource<number>; talentPoints: UsableResource<number>;
progressPoints: UsableResource<number>; progressPoints: UsableResource<number>;
} }
interface DS4ActorDataLanguage {
languages: string;
alphabets: string;
}
interface DS4ActorDataProfile {
gender: string;
birthday: string;
birthplace: string;
age: number;
height: number;
hairColor: string;
weight: number;
eyeColor: string;
specialCharacteristics: string;
}

View file

@ -136,10 +136,11 @@ export const DS4 = {
class: "DS4.BaseInfoClass", class: "DS4.BaseInfoClass",
heroClass: "DS4.BaseInfoHeroClass", heroClass: "DS4.BaseInfoHeroClass",
racialAbilities: "DS4.BaseInfoRacialAbilities", racialAbilities: "DS4.BaseInfoRacialAbilities",
culture: "DS4.BaseInfoCulture",
}, },
/** /**
* Definme the progression info of a character * Define the progression info of a character
*/ */
progression: { progression: {
level: "DS4.ProgressionLevel", level: "DS4.ProgressionLevel",
@ -147,4 +148,42 @@ export const DS4 = {
talentPoints: "DS4.ProgressionTalentPoints", talentPoints: "DS4.ProgressionTalentPoints",
progressPoints: "DS4.ProgressionProgressPoints", progressPoints: "DS4.ProgressionProgressPoints",
}, },
/**
* Define the language info of a character
*/
language: {
languages: "DS4.LanguageLanguages",
alphabets: "DS4.LanguageAlphabets",
},
/**
* Define the profile info of a character
*/
profile: {
gender: "DS4.ProfileGender",
birthday: "DS4.ProfileBirthday",
birthplace: "DS4.ProfileBirthplace",
age: "DS4.ProfileAge",
height: "DS4.ProfileHeight",
hairColor: "DS4.ProfilHairColor",
weight: "DS4.ProfileWeight",
eyeColor: "DS4.ProfileEyeColor",
specialCharacteristics: "DS4.ProfileSpecialCharacteristics",
},
/**
* Define the profile info types for hanndlebars of a character
*/
profileDTypes: {
gender: "String",
birthday: "String",
birthplace: "String",
age: "Number",
height: "Number",
hairColor: "String",
weight: "Number",
eyeColor: "String",
specialCharacteristics: "String",
},
}; };

View file

@ -42,6 +42,8 @@ async function registerHandlebarsPartials() {
"systems/ds4/templates/actor/partials/overview-control-buttons.hbs", "systems/ds4/templates/actor/partials/overview-control-buttons.hbs",
"systems/ds4/templates/actor/partials/attributes-traits.hbs", "systems/ds4/templates/actor/partials/attributes-traits.hbs",
"systems/ds4/templates/actor/partials/combat-values.hbs", "systems/ds4/templates/actor/partials/combat-values.hbs",
"systems/ds4/templates/actor/partials/profile.hbs",
"systems/ds4/templates/actor/partials/character-progression.hbs",
]; ];
return loadTemplates(templatePaths); return loadTemplates(templatePaths);
} }
@ -69,6 +71,8 @@ Hooks.once("setup", function () {
"combatValues", "combatValues",
"baseInfo", "baseInfo",
"progression", "progression",
"language",
"profile",
]; ];
// Exclude some from sorting where the default order matters // Exclude some from sorting where the default order matters

View file

@ -8,7 +8,6 @@
} }
.attribute-value { .attribute-value {
border: 2px groove $c-border-groove; border: 2px groove $c-border-groove;
line-height: $default-input-height;
font-size: 1.5em; font-size: 1.5em;
text-align: center; text-align: center;
padding-left: 2px; padding-left: 2px;
@ -17,6 +16,7 @@
input, input,
.attribute-value-total { .attribute-value-total {
grid-column: span 2; grid-column: span 2;
line-height: $default-input-height;
} }
} }
} }
@ -32,7 +32,6 @@
.trait-value { .trait-value {
border: 2px groove $c-border-groove; border: 2px groove $c-border-groove;
font-size: 1.5em; font-size: 1.5em;
line-height: $default-input-height;
text-align: center; text-align: center;
padding-left: 2px; padding-left: 2px;
padding-right: 2px; padding-right: 2px;
@ -40,6 +39,7 @@
input, input,
.trait-value-total { .trait-value-total {
grid-column: span 2; grid-column: span 2;
line-height: $default-input-height;
} }
} }
} }

View file

@ -1,8 +1,11 @@
.basic-properties { .basic-properties {
flex: 0 0 100%; flex: 0 0 100%;
gap: 2px;
.basic-property { .basic-property {
display: grid; display: grid;
align-content: end; align-content: end;
padding-left: 1px;
padding-right: 1px;
& > label { & > label {
font-weight: bold; font-weight: bold;
@ -13,6 +16,10 @@
width: 100%; width: 100%;
} }
.input-divider {
text-align: center;
}
@include mark-invalid-or-disabled-input; @include mark-invalid-or-disabled-input;
} }
} }

View file

@ -0,0 +1,28 @@
.progression {
.progression-entry {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-end;
align-items: center;
padding-right: 3px;
h2.progression-label {
font-family: $font-heading;
display: block;
height: 50px;
padding: 0px;
color: $c-light-grey;
border: none;
line-height: 50px;
margin: $header-top-margin 0;
text-align: right;
//flex: 0;
}
input.progression-value {
margin-left: 5px;
flex: 0 0 40px;
text-align: left;
}
}
}

View file

@ -18,6 +18,9 @@
.flex1 { .flex1 {
flex: 1; flex: 1;
} }
.flex125 {
flex: 1.25;
}
.flex15 { .flex15 {
flex: 1.5; flex: 1.5;
} }
@ -51,6 +54,9 @@
.flex1 { .flex1 {
flex: 1; flex: 1;
} }
.flex125 {
flex: 1.25;
}
.flex15 { .flex15 {
flex: 1.5; flex: 1.5;
} }

View file

@ -28,8 +28,8 @@
} }
.grid-6col { .grid-6col {
grid-column: span 5 / span 5; grid-column: span 6 / span 6;
grid-template-columns: repeat(5, minmax(0, 1fr)); grid-template-columns: repeat(6, minmax(0, 1fr));
} }
.grid-7col { .grid-7col {

View file

@ -1,5 +1,12 @@
.window-app { .window-app {
font-family: $font-primary; font-family: $font-primary;
input[type="text"],
input[type="number"],
input[type="password"],
input[type="date"],
input[type="time"] {
width: 100%;
}
} }
.rollable { .rollable {

View file

@ -83,7 +83,8 @@
"race": "", "race": "",
"class": "", "class": "",
"heroClass": "", "heroClass": "",
"racialAbilities": "" "racialAbilities": "",
"culture": ""
}, },
"progression": { "progression": {
"level": 0, "level": 0,
@ -96,6 +97,21 @@
"total": 0, "total": 0,
"used": 0 "used": 0
} }
},
"language": {
"languages": "",
"alphabets": ""
},
"profile": {
"gender": "",
"birthday": "",
"birthplace": "",
"age": 0,
"height": 0,
"hairColor": "",
"weight": 0,
"eyeColor": "",
"specialCharacteristics": ""
} }
} }
}, },

View file

@ -2,89 +2,57 @@
{{!-- Sheet Header --}} {{!-- Sheet Header --}}
<header class="sheet-header"> <header class="sheet-header">
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="100" width="100" /> <img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="100" width="100" />
<div class="header-fields"> <div class="header-fields flexrow">
<h1 class="charname"><input name="name" type="text" value="{{actor.name}}" placeholder="Name" /></h1> <h1 class="charname"><input name="name" type="text" value="{{actor.name}}" placeholder="Name" /></h1>
</div> {{> systems/ds4/templates/actor/partials/character-progression.hbs}}
<div class="character-values">
{{!-- The grid classes are defined in scss/global/_grid.scss. To use, use both the "grid" and "grid-Ncol" <div class="flexrow basic-properties">
class where "N" can be any number from 1 to 12 and will create that number of columns. --}} <div class="basic-property">
<div class="base-infos grid grid-3col"> <label class="basic-property-label" for="data.baseInfo.race">{{config.baseInfo.race}}</label>
{{!-- "flex-group-center" is also defined in the _grid.scss file and it will add a small amount of <input type="text" name="data.baseInfo.race" value="{{data.baseInfo.race}}" data-dtype="String" />
padding, a border, and will center all of its child elements content and text. --}} </div>
<div class="base-info flex-group-center"> <div class="basic-property">
<label for="data.baseInfo.race" class="base-info-label">{{config.baseInfo.race}}</label> <label class="basic-property-label" for="data.baseInfo.culture">{{config.baseInfo.culture}}</label>
<div class="base-info-content flexrow flex-center flex-between"> <input type="text" name="data.baseInfo.culture" value="{{data.baseInfo.culture}}"
<input type="text" name="data.baseInfo.race" value="{{data.baseInfo.race}}" data-dtype="String" />
data-dtype="String" /> </div>
<div class="basic-property flex125">
<label class="basic-property-label"
for="data.progression.progressPoints.used">{{config.progression.progressPoints}}</label>
<div class="flexrow">
<input type="number" name="data.progression.progressPoints.used"
value="{{data.progression.progressPoints.used}}" data-dtype="Number" /><span
class="input-divider"> /
</span><input type="number" name="data.progression.progressPoints.total"
value="{{data.progression.progressPoints.total}}" data-dtype="Number" />
</div> </div>
</div> </div>
<div class="base-info flex-group-center"> <div class="basic-property flex125">
<div class="grid grid-3col"> <label class="basic-property-label"
<div class="base-info flex-group-center"> for="data.progression.talentPoints.used">{{config.progression.talentPoints}}</label>
<label for="data.progression.level" <div class="flexrow">
class="base-info-label">{{config.progression.level}}</label> <input type="number" name="data.progression.talentPoints.used"
<div class="base-info-content flexrow flex-center flex-between"> value="{{data.progression.talentPoints.used}}" data-dtype="Number" /><span
<input type="text" name="data.progression.level" value="{{data.progression.level}}" class="input-divider"> /
data-dtype="Number" /> </span><input type="number" name="data.progression.talentPoints.total"
</div> value="{{data.progression.talentPoints.total}}" data-dtype="Number" />
</div>
<div class="base-info flex-group-center">
<label for="data.progression.progressPoints"
class="base-info-label">{{config.progression.progressPoints}}</label>
<div class="base-info-content flexrow flex-center flex-between">
<input type="text" name="data.progression.progressPoints.used"
value="{{data.progression.progressPoints.used}}" data-dtype="Number" /><span> /
</span><input type="text" name="data.progression.progressPoints.total"
value="{{data.progression.progressPoints.total}}" data-dtype="Number" />
</div>
</div>
<div class="base-info flex-group-center">
<label for="data.progression.talentPoints"
class="base-info-label">{{config.progression.talentPoints}}</label>
<div class="base-info-content flexrow flex-center flex-between">
<input type="text" name="data.progression.talentPoints.used"
value="{{data.progression.talentPoints.used}}" data-dtype="Number" /><span> /
</span><input type="text" name="data.progression.talentPoints.total"
value="{{data.progression.talentPoints.total}}" data-dtype="Number" />
</div>
</div>
</div> </div>
</div> </div>
<div class="base-info flex-group-center"> <div class="basic-property">
<label for="data.baseInfo.class" class="base-info-label">{{config.baseInfo.class}}</label> <label class="basic-property-label" for="data.baseInfo.class">{{config.baseInfo.class}}</label>
<div class="base-info-content flexrow flex-center flex-between"> <input type="text" name="data.baseInfo.class" value="{{data.baseInfo.class}}" data-dtype="String" />
<input type="text" name="data.baseInfo.class" value="{{data.baseInfo.class}}"
data-dtype="String" />
</div>
</div> </div>
<div class="base-info flex-group-center"> <div class="basic-property">
<label for="data.baseInfo.racialAbilities" <label class="basic-property-label"
class="base-info-label">{{config.baseInfo.racialAbilities}}</label> for="data.baseInfo.heroClass">{{config.baseInfo.heroClass}}</label>
<div class="base-info-content flexrow flex-center flex-between"> <input type="text" name="data.baseInfo.heroClass" value="{{data.baseInfo.heroClass}}"
<input type="text" name="data.baseInfo.racialAbilities" data-dtype="String" />
value="{{data.baseInfo.racialAbilities}}" data-dtype="String" />
</div>
</div>
<div class="base-info flex-group-center">
<label for="data.progression.experiencePoints"
class="base-info-label">{{config.progression.experiencePoints}}</label>
<div class="base-info-content flexrow flex-center flex-between">
<input type="text" name="data.progression.experiencePoints"
value="{{data.progression.experiencePoints}}" data-dtype="Number" />
</div>
</div>
<div class="base-info flex-group-center">
<label for="data.baseInfo.heroClass" class="base-info-label">{{config.baseInfo.heroClass}}</label>
<div class="base-info-content flexrow flex-center flex-between">
<input type="text" name="data.baseInfo.heroClass" value="{{data.baseInfo.heroClass}}"
data-dtype="String" />
</div>
</div> </div>
</div> </div>
</div>
<div class="character-values">
{{> systems/ds4/templates/actor/partials/attributes-traits.hbs}} {{> systems/ds4/templates/actor/partials/attributes-traits.hbs}}
{{> systems/ds4/templates/actor/partials/combat-values.hbs}} {{> systems/ds4/templates/actor/partials/combat-values.hbs}}
</div> </div>
</header> </header>
@ -92,6 +60,7 @@
<nav class="sheet-tabs tabs" data-group="primary"> <nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="description">{{localize 'DS4.HeadingDescription'}}</a> <a class="item" data-tab="description">{{localize 'DS4.HeadingDescription'}}</a>
<a class="item" data-tab="talents">{{localize 'DS4.HeadingTalents'}}</a> <a class="item" data-tab="talents">{{localize 'DS4.HeadingTalents'}}</a>
<a class="item" data-tab="profile">{{localize "DS4.HeadingProfile"}}</a>
<a class="item" data-tab="items">{{localize 'DS4.HeadingItems'}}</a> <a class="item" data-tab="items">{{localize 'DS4.HeadingItems'}}</a>
</nav> </nav>
@ -102,6 +71,9 @@
{{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}}
</div> </div>
{{! Profile Tab --}}
{{> systems/ds4/templates/actor/partials/profile.hbs}}
{{!-- Talents Tab --}} {{!-- Talents Tab --}}
{{> systems/ds4/templates/actor/partials/talents-overview.hbs}} {{> systems/ds4/templates/actor/partials/talents-overview.hbs}}

View file

@ -0,0 +1,15 @@
<div class="progression flexrow">
<div class="progression-entry">
<h2 class="progression-label"><label for="data.progression.level">{{config.progression.level}}</label>
</h2>
<input class="progression-value" type="number" name="data.progression.level" value="{{data.progression.level}}"
data-dtype="Number" />
</div>
<div class="progression-entry">
<h2 class="progression-label"><label
for="data.progression.experiencePoints">{{config.progression.experiencePoints}}</label>
</h2>
<input class="progression-value" type="number" name="data.progression.experiencePoints"
value="{{data.progression.experiencePoints}}" data-dtype="Number" />
</div>
</div>

View file

@ -0,0 +1,13 @@
<div class="tab profile" data-group="primary" data-tab="profile">
<div class="grid grid-2col">
{{#each data.profile as |profile-data-value profile-data-key|}}
<div class="profile-entry">
<label for="data.profile.{{profile-data-key}}">
{{lookup ../config.profile profile-data-key}}
</label>
<input type="text" name="data.profile.{{profile-data-key}}" value="{{profile-data-value}}"
data-dtype="{{lookup ../config/profileDTypes profile-data-key}}" />
</div>
{{/each}}
</div>
</div>