Began implementing actual character sheet

This commit is contained in:
Thaum
2014-11-25 15:06:30 +00:00
parent 252d0f989b
commit 5eea4714b2
41 changed files with 505 additions and 279 deletions

View File

@@ -0,0 +1,3 @@
Template.registerHelper("canCast", function(){
return Characters.find({_id: this._id, spells: {$size: 0}}).count() === 0;
});

View File

@@ -0,0 +1,43 @@
.abilityDetails {
background-color: #ebe2d5;
position: absolute;
top: 0px;
height: 300px;
right: 0px;
width: 160px;
z-index: 10;
background-color: #ebe2d5;
transition: right 0.3s ease;
}
.stubHolder {
display: flex;
flex-direction: column;
justify-content: space-around;
position: absolute;
top: 0px;
bottom: 0px;
width: 40px;
left: -40px;
}
.abilityStub {
text-align: center;
cursor: pointer;
background-color: #ebe2d5;
}
.abilityDetails.collapse{
right: -160px;
}
.abilityDetails.expand{
right: 0px;
}

View File

@@ -0,0 +1,62 @@
<template name="sideAbilities">
<div class="abilityDetails {{expanded}}">
<table>
{{#if selected "strength"}}
{{> skillRow name="Save" skill="strengthSave"}}
{{> skillRow name="Athletics" skill="athletics"}}
{{/if}}
{{#if selected "dexterity"}}
{{> skillRow name="Save" skill="dexteritySave"}}
{{> skillRow name="Acrobatics" skill="acrobatics"}}
{{> skillRow name="Sleight of Hand" skill="sleightOfHand"}}
{{> skillRow name="Stealth" skill="stealth"}}
{{/if}}
{{#if selected "constitution"}}
{{> skillRow name="Save" skill="constitutionSave"}}
{{/if}}
{{#if selected "intelligence"}}
{{> skillRow name="Save" skill="intelligenceSave"}}
{{> skillRow name="Arcana" skill="arcana"}}
{{> skillRow name="History" skill="history"}}
{{> skillRow name="Investigation" skill="investigation"}}
{{> skillRow name="Nature" skill="nature"}}
{{> skillRow name="Religion" skill="religion"}}
{{/if}}
{{#if selected "wisdom"}}
{{> skillRow name="Save" skill="wisdomSave"}}
{{> skillRow name="Animal Handling" skill="animalHandling"}}
{{> skillRow name="Insight" skill="insight"}}
{{> skillRow name="Medicine" skill="medicine"}}
{{> skillRow name="Perception" skill="perception"}}
{{> skillRow name="Survival" skill="survival"}}
{{/if}}
{{#if selected "charisma"}}
{{> skillRow name="Save" skill="charismaSave"}}
{{> skillRow name="Deception" skill="deception"}}
{{> skillRow name="Intimidation" skill="intimidation"}}
{{> skillRow name="Performance" skill="performance"}}
{{> skillRow name="Persuasion" skill="persuasion"}}
{{/if}}
</table>
<div class="stubHolder">
<div class="strengthStub abilityStub">
Str<br>{{abilityMod "strength"}}
</div>
<div class="dexterityStub abilityStub">
Dex<br>{{abilityMod "dexterity"}}
</div>
<div class="constitutionStub abilityStub">
Con<br>{{abilityMod "constitution"}}
</div>
<div class="intelligenceStub abilityStub">
Int<br>{{abilityMod "intelligence"}}
</div>
<div class="wisdomStub abilityStub">
Wis<br>{{abilityMod "wisdom"}}
</div>
<div class="charismaStub abilityStub">
Cha<br>{{abilityMod "charisma"}}
</div>
</div>
</div>
</template>

View File

@@ -0,0 +1,38 @@
Template.sideAbilities.created = function(){
Template.instance().openedAbility = new ReactiveVar(null);
};
Template.sideAbilities.helpers({
openedAbility: function(){
Template.instance().openedAbility.get();
},
selected: function(string){
return Template.instance().openedAbility.get() === string;
},
expanded: function(){
if(Template.instance().openedAbility.get() === null){
return "collapse";
} else{
return "expand";
}
}
});
var abilityOpener = function(ability){
return function(){
if(Template.instance().openedAbility.get() === ability){
Template.instance().openedAbility.set(null);
} else{
Template.instance().openedAbility.set(ability);
}
};
};
Template.sideAbilities.events({
"click .strengthStub": abilityOpener("strength"),
"click .dexterityStub": abilityOpener("dexterity"),
"click .constitutionStub": abilityOpener("constitution"),
"click .intelligenceStub": abilityOpener("intelligence"),
"click .wisdomStub": abilityOpener("wisdom"),
"click .charismaStub": abilityOpener("charisma")
});

View File

@@ -0,0 +1,26 @@
<template name="skills">
<h2>Saving Throws</h2>
<table class="skillTable">
{{#each saveList}}
{{> skillRow}}
{{/each}}
</table>
<h2>Skills</h2>
<table class="skillTable">
{{#each skillList}}
{{> skillRow}}
{{/each}}
</table>
</template>
<template name="skillRow">
<tr>
<td><div class="profIcon" style="background-image: url(/png/profIcons/{{profIcon skill}})"></div></td>
{{#if failSkill}}
<td class="fail">fail</td>
{{else}}
<td class="{{advantage}}">{{../skillMod skill}}</td>
{{/if}}
<td class={{conditionals}}>{{name}}</td>
</tr>
</template>

View File

@@ -30,7 +30,10 @@ Template.skills.helpers({
{name: "Stealth", skill: "stealth"},
{name: "Survival", skill: "survival"}
];
},
}
});
Template.skillRow.helpers({
profIcon: function(skill){
var prof = Template.parentData(1).proficiency(this.skill);
if(prof > 0 && prof < 1) return "profHalf.png";

View File

@@ -0,0 +1,4 @@
#stats{
display: flex;
justify-content: space-around;
}

View File

@@ -0,0 +1,80 @@
<template name="stats">
<div id="stats">
<div>
<div id="abilities">
{{> bigAbilities}}
</div>
<div id="savesAndSkills">
{{> skills}}
</div>
</div>
<div>
<div id="armor">
{{attributeValue "armor"}}
</div>
<div id="initiative">
{{attributeValue "initiative"}}
</div>
<div id="proficiencyBonus">
{{attributeValue "proficiencyBonus"}}
</div>
<div id="speed">
{{attributeValue "speed"}}
</div>
<div id="passivePerception">
{{passiveSkill "perception"}}
</div>
<div id="hitDice">
{{> hitDice "d6HitDice"}}
{{> hitDice "d8HitDice"}}
{{> hitDice "d10HitDice"}}
{{> hitDice "d12HitDice"}}
</div>
<div id="spellSlots">
{{# if canCast}}
{{> spellSlots}}
{{/if}}
</div>
<div id="rages">
{{# if attributeBase "rages"}}
{{attributeValue "rages"}}/{{attributeBase "rages"}} rages
{{/if}}
</div>
<div id="sorceryPoints">
{{# if attributeBase "sorceryPoints"}}
{{attributeValue "sorceryPoints"}}/{{attributeBase "sorceryPoints"}} Sorcery Points
{{/if}}
</div>
<div id="expertiseDice">
{{# if attributeBase "expertiseDice"}}
{{attributeValue "expertiseDice"}}/{{attributeBase "expertiseDice"}} Expertise Dice
{{/if}}
</div>
<div id="superiorityDice">
{{# if attributeBase "superiorityDice"}}
{{attributeValue "superiorityDice"}}/{{attributeBase "superiorityDice"}} Superiority Dice
{{/if}}
</div>
</div>
</div>
</template>
<template name="hitDice">
{{# if ../attributeBase hitDice}}
<div id={{hitDice}}>
{{../attributeValue hitDice}}/{{../attributeBase hitDice}}
</div>
{{/if}}
</template>
<template name="spellSlots">
{{attributevalue "level1SpellSlots"}}
{{attributevalue "level2SpellSlots"}}
{{attributevalue "level3SpellSlots"}}
{{attributevalue "level4SpellSlots"}}
{{attributevalue "level5SpellSlots"}}
{{attributevalue "level6SpellSlots"}}
{{attributevalue "level7SpellSlots"}}
{{attributevalue "level8SpellSlots"}}
{{attributevalue "level9SpellSlots"}}
</template>

View File

@@ -1,3 +1,9 @@
.flexItem.abilities {
flex-grow: 1;
width: 100px;
max-width: 400px;
}
.floatBox.ability {
width: 85px;
text-align: center;

View File

@@ -1,68 +1,32 @@
<template name = "bigAbilities">
<div class="ability floatBox">
<div class ="abilityName">
Strength
<div class="ability">
{{> bigAbility name="Strength" ability="strength"}}
</div>
<div class="ability">
{{> bigAbility name="Dexterity" ability="dexterity"}}
</div>
<div class="ability">
{{> bigAbility name="Constitution" ability="constitution"}}
</div>
<div class="ability">
{{> bigAbility name="Intelligence" ability="intelligence"}}
</div>
<div class="ability">
{{> bigAbility name="Wisdom" ability="wisdom"}}
</div>
<div class="ability">
{{> bigAbility name="Charisma" ability="charisma"}}
</div>
</template>
<template name="bigAbility">
<div class ="abilityName">
{{name}}
</div>
<div class="abilityScore">
{{attributeValue "strength"}}
{{../attributeValue ability}}
</div>
<div class="abilityMod">
{{abilityMod "strength"}}
{{../abilityMod ability}}
</div>
</div>
<div class="ability floatBox">
<div class ="abilityName">
Dexterity
</div>
<div class="abilityScore">
{{attributeValue "dexterity"}}
</div>
<div class="abilityMod">
{{abilityMod "dexterity"}}
</div>
</div>
<div class="ability floatBox">
<div class ="abilityName">
Constitution
</div>
<div class="abilityScore">
{{attributeValue "constitution"}}
</div>
<div class="abilityMod">
{{abilityMod "constitution"}}
</div>
</div>
<div class="ability floatBox">
<div class ="abilityName">
Intelligence
</div>
<div class="abilityScore">
{{attributeValue "intelligence"}}
</div>
<div class="abilityMod">
{{abilityMod "intelligence"}}
</div>
</div>
<div class="ability floatBox">
<div class ="abilityName">
Wisdom
</div>
<div class="abilityScore">
{{attributeValue "wisdom"}}
</div>
<div class="abilityMod">
{{abilityMod "wisdom"}}
</div>
</div>
<div class="ability floatBox">
<div class ="abilityName">
Charisma
</div>
<div class="abilityScore">
{{attributeValue "charisma"}}
</div>
<div class="abilityMod">
{{abilityMod "charisma"}}
</div>
</div>
</template>

View File

@@ -1,65 +0,0 @@
.flexContainer {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
align-items: flex-start;
}
#abilityScores {
text-align: center;
flex-basis: 120px;
flex-grow: 1;
max-width: 340px;
}
/*Float boxes are indivisble, have shadows*/
.floatBox{
color: #301d02;
/*Fancy image border*/
border-image-width: 92px 60px 57px 60px;
border-image-outset: 15px;
border-image-source: url('/png/big-border.png');
border-image-slice: 275 179 171 179;
border-image-repeat: stretch;
/*Shadow*/
box-shadow: 0px 5px 20px rgba(0, 0, 0, 1);
padding: 0px 5px 5px 5px;
margin: 15px;
background: #f0e3d1;
border-radius: 20px;
min-width: 200px;
}
.bigborder{
}
/* headings in floatboxes */
.floatBox h2{
font-size: 1em;
}
.floatBox.rounded {
display: inline-block;
text-align: center;
}
/* Stats */
#armorClassBox {
width: 90px;
height: 100px;
background-image: url('/svg/ac.svg');
background-repeat: no-repeat;
text-align: center;
display: flex;
flex-direction: column;
justify-content: center;
}
.statValue {
font-size: 2em;
}

View File

@@ -1,38 +0,0 @@
<template name="character">
<div>
{{> characterName}}
</div>
<div class="flexContainer">
<div class="flexItem">
<div id="savesAndSkills" class="floatBox">
{{> skills}}
</div>
</div>
<div class="flexItem floatBox">
<h2>Inventory</h2>
{{> inventoryTables}}
</div>
<div class="flexItem floatBox">
<h2>Description</h2>
{{> textField character=this field="description"}}
</div>
<div class="flexItem floatBox">
<h2>Personality</h2>
{{> textField character=this field="personality"}}
<h2>Ideals</h2>
{{> textField character=this field="ideals"}}
<h2>Bonds</h2>
{{> textField character=this field="bonds"}}
<h2>Flaws</h2>
{{> textField character=this field="flaws"}}
</div>
<div class="flexItem floatBox">
<h2>Backstory</h2>
{{> textField character=this field="backstory"}}
</div>
<div class="flexItem floatBox">
<h2>Notes</h2>
{{> textField character=this field="notes"}}
</div>
</div>
</template>

View File

@@ -0,0 +1,11 @@
#characterSheetTabs {
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: flex-start;
}
.characterTab {
flex-grow: 1;
min-width: 100px;
}

View File

@@ -0,0 +1,19 @@
<template name="characterSheet">
<div id="characterHeader">
{{> characterName}}
{{> healthBar}}
<div id="characterSheetTabs">
<div id="statsTab" class="characterTab">Stats</div>
<div id="featuresTab" class="characterTab">Features</div>
<div id="personaTab" class="characterTab">Persona</div>
<div id="inventoryTab" class="characterTab">Inventory</div>
{{#if canCast}}
<div id="spellsTab" class="characterTab">Spellbook</div>
{{/if}}
<div id="journalTab" class="characterTab">Journal</div>
</div>
</div>
<div id="characterDetails">
{{Template.dynamic template=getTab}}
</div>
</template>

View File

@@ -0,0 +1,34 @@
Template.characterSheet.created = function(){
Template.instance().tab = new ReactiveVar("characterStats")
}
Template.characterSheet.helpers({
getTab: function(){
return Template.instance().tab.get();
},
});
var setTab = function(value){
Template.instance().tab.set(value);
}
Template.characterSheet.events({
"click #statsTab": function(){
setTab("stats");
},
"click #featuresTab": function(){
setTab("features");
},
"click #personaTab": function(){
setTab("persona");
},
"click #inventoryTab": function(){
setTab("inventory");
},
"click #spellsTab": function(){
setTab("spellbook");
},
"click #journalTab": function(){
setTab("journal");
},
})

View File

@@ -1,50 +0,0 @@
<template name="characterStats">
<div id="hitPointBox">
Hit Points
<div id="hitPoints">
<input type="number">
</div>
<div id="maxHitPoints">
{{attributeValue attributes.maxHitPoints}}
</div>
</div>
<div id="armorClassBox">
<div id="armorClass">
<div id="armorClassValue" class="statValue">
{{attributeValue attributes.armor}}
</div>
<div id="armorClassLabel">
Armor<br>Class
</div>
</div>
</div>
<div id="amorBox">
</div>
<div id="initiativeBox" class="floatBox rounded">
<div class="statValue">
{{skillMod skills.initiative}}
</div>
Initiative
</div>
<div id="speedBox" class="floatBox rounded">
<div class="statValue">
{{attributeValue attributes.speed}}
</div>
Speed
</div>
<div id="passivePerceptionBox" class="floatBox rounded">
<div class="statValue">
{{passiveSkill skills.perception}}
</div>
Passive Perception
</div>
<div>
<div>
Death Saves
</div><div>
Successes {{deathSaveSuccess}}
</div><div>
Failures {{deathSaveFail}}
</div>
</div>
</template>

View File

@@ -44,7 +44,7 @@
top: 0px;
left: -1px;
height: 0px;
width: 228px;
width: 302px;
border-width: 15px 37px 16px 37px;
border-image: url('/png/bar-border.png') 46 112 48 112 stretch;
display: flex;

View File

@@ -160,7 +160,7 @@ Template.deathSaves.events({
Characters.update(this._id, {$set: {"deathSave.pass": 0}});
},
"click .heal": function(){
Characters.update(this._id, {$inc: {"attributes.hitPoints.base": 1}});
Characters.update(this._id, {$inc: {"hitPoints.base": 1}});
},
"click .untickedDeathFail" : function(){
Characters.update(this._id, {$inc: {"deathSave.fail": 1}});

View File

@@ -0,0 +1,6 @@
<template name="inventory">
<div class="flexItem floatBox">
<h2>Inventory</h2>
{{> inventoryTables}}
</div>
</template>

View File

@@ -0,0 +1,24 @@
<template name="persona">
<div class="flexItem floatBox">
<h2>Description</h2>
{{> textField character=this field="description"}}
</div>
<div class="flexItem floatBox">
<h2>Personality</h2>
{{> textField character=this field="personality"}}
<h2>Ideals</h2>
{{> textField character=this field="ideals"}}
<h2>Bonds</h2>
{{> textField character=this field="bonds"}}
<h2>Flaws</h2>
{{> textField character=this field="flaws"}}
</div>
<div class="flexItem floatBox">
<h2>Backstory</h2>
{{> textField character=this field="backstory"}}
</div>
<div class="flexItem floatBox">
<h2>Notes</h2>
{{> textField character=this field="notes"}}
</div>
</template>

View File

@@ -1,30 +0,0 @@
<template name="skills">
<h2>Saving Throws</h2>
<table class="skillTable">
{{#each saveList}}
<tr>
<td><div class="profIcon" style="background-image: url(/png/profIcons/{{profIcon skill}})"></div></td>
{{#if failSkill}}
<td class="fail">fail</td>
{{else}}
<td class="{{advantage}}">{{../skillMod skill}}</td>
{{/if}}
<td class={{conditionals}}>{{name}}</td>
</tr>
{{/each}}
</table>
<h2>Skills</h2>
<table class="skillTable">
{{#each skillList}}
<tr>
<td><div class="profIcon" style="background-image: url(/png/profIcons/{{profIcon skill}})"></div></td>
{{#if failSkill}}
<td class="fail">fail</td>
{{else}}
<td class="{{advantage}}">{{../skillMod skill}}</td>
{{/if}}
<td class={{conditionals}}>{{name}}</td>
</tr>
{{/each}}
</table>
</template>

View File

@@ -1,13 +1,24 @@
root {
display: block;
display: block;
}
body {
font-family: sans-serif;
background: #201500;
overflow-x: hidden;
margin: 0px;
box-sizing: border-box;
}
.calculatedValue {
color: #021C33;
font-weight: bold;
}
* {
box-sizing: border-box;
}
h2 {
margin: 0;
}

View File

@@ -1,4 +1,4 @@
<head>
<title>RPG Docs</title>
<meta name="viewport" content="width=device-width">
<meta name="viewport" content="width=device-width initial-scale=1.0, user-scalable=no">
</head>