Began implementing actual character sheet
This commit is contained in:
2
.codio
2
.codio
@@ -8,7 +8,7 @@
|
||||
|
||||
// Preview button configuration
|
||||
"preview": {
|
||||
"Prieview": "https://period-sheriff-3000.codio.io",
|
||||
"Prieview": "http://period-sheriff-3000.codio.io",
|
||||
"Ungit": "https://period-sheriff-9501.codio.io/#/repository?path=/home/codio/workspace"
|
||||
}
|
||||
}
|
||||
@@ -60,6 +60,8 @@ Schemas.Character = new SimpleSchema({
|
||||
ki: {type: Schemas.Attribute},
|
||||
sorceryPoints: {type: Schemas.Attribute},
|
||||
rages: {type: Schemas.Attribute},
|
||||
superiorityDice: {type: Schemas.Attribute},
|
||||
expertiseDice: {type: Schemas.Attribute},
|
||||
|
||||
|
||||
//hit dice
|
||||
@@ -236,9 +238,9 @@ Schemas.Character = new SimpleSchema({
|
||||
deathSave: { type: Schemas.DeathSave },
|
||||
time: { type: Number, min: 0, decimal: true, defaultValue: 0},
|
||||
initiativeOrder:{ type: Number, min: 0, max: 1, decimal: true, defaultValue: 0},
|
||||
expirations: { type: [Schemas.Expiration], defaultValue: []}
|
||||
expirations: { type: [Schemas.Expiration], defaultValue: []},
|
||||
spells: { type: [Schemas.Spell], defaultValue: []}
|
||||
//TODO add permission stuff for owner, readers and writers
|
||||
//TODO spells
|
||||
});
|
||||
|
||||
Characters.attachSchema(Schemas.Character);
|
||||
@@ -257,6 +259,32 @@ Characters.find({},{fields: {time: 1, expirations: 1}}).observe({
|
||||
}
|
||||
});
|
||||
|
||||
var attributeBase = function(attribute){
|
||||
var value = 0;
|
||||
//add all values in add array
|
||||
_.each(attribute.add, function(effect){
|
||||
value += evaluateEffect(charId, effect);
|
||||
});
|
||||
|
||||
//multiply all values in mul array
|
||||
_.each(attribute.mul, function(effect){
|
||||
value *= evaluateEffect(charId, effect);
|
||||
});
|
||||
|
||||
//largest min
|
||||
_.each(attribute.min, function(effect){
|
||||
var min = evaluateEffect(charId, effect);
|
||||
value = value > min? value : min;
|
||||
});
|
||||
|
||||
//smallest max
|
||||
_.each(attribute.max, function(effect){
|
||||
var max = evaluateEffect(charId, effect);
|
||||
value = value < max? value : max;
|
||||
});
|
||||
return value;
|
||||
}
|
||||
|
||||
//functions and calculated values.
|
||||
//These functions can only rely on this._id since no other
|
||||
//field is likely to be attached to all returned characters
|
||||
@@ -311,29 +339,37 @@ Characters.helpers({
|
||||
var charId = this._id;
|
||||
var attribute = this.getField(attributeName);
|
||||
//base value
|
||||
var value = attribute.base;
|
||||
//add all values in add array
|
||||
_.each(attribute.add, function(effect){
|
||||
value += evaluateEffect(charId, effect);
|
||||
});
|
||||
var value = attributeBase(attribute);
|
||||
value += attribute.adjustment;
|
||||
|
||||
//this attribute returns, pull it from the array, we may visit it again safely
|
||||
visitedAttributes = _.without(visitedAttributes, attributeName);
|
||||
return value;
|
||||
}
|
||||
})(),
|
||||
|
||||
//multiply all values in mul array
|
||||
_.each(attribute.mul, function(effect){
|
||||
value *= evaluateEffect(charId, effect);
|
||||
});
|
||||
attributeBase: (function(){
|
||||
//store a private array of attributes we've visited without returning
|
||||
//if we try to visit the same attribute twice before resolving its value
|
||||
//we are in a dependency loop and need to GTFO
|
||||
var visitedAttributes = [];
|
||||
return function(attributeName){
|
||||
check(attributeName, String);
|
||||
//we're still evaluating this attribute, must be in a loop
|
||||
if(_.contains(visitedAttributes, attributeName)) {
|
||||
console.log("dependency loop detected");
|
||||
return NaN;
|
||||
}
|
||||
//push this attribute to the list of visited attributes
|
||||
//we can't visit it again unless it returns first
|
||||
visitedAttributes.push(attributeName);
|
||||
|
||||
//largest min
|
||||
_.each(attribute.min, function(effect){
|
||||
var min = evaluateEffect(charId, effect);
|
||||
value = value > min? value : min;
|
||||
});
|
||||
|
||||
//smallest max
|
||||
_.each(attribute.max, function(effect){
|
||||
var max = evaluateEffect(charId, effect);
|
||||
value = value < max? value : max;
|
||||
});
|
||||
//done traversing the tree, this attribute returns, pull it from the array
|
||||
var charId = this._id;
|
||||
var attribute = this.getField(attributeName);
|
||||
//base value
|
||||
var value = attributeBase(attribute);
|
||||
|
||||
//this attribute returns, pull it from the array, we may visit it again safely
|
||||
visitedAttributes = _.without(visitedAttributes, attributeName);
|
||||
return value;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Schemas.Attribute = new SimpleSchema({
|
||||
//the unmodified value of the attribute
|
||||
//the temporary shift of the attribute
|
||||
//should be zero for most attributes after a long rest
|
||||
base: {
|
||||
adjustment: {
|
||||
type: Number,
|
||||
defaultValue: 0
|
||||
},
|
||||
@@ -16,7 +16,7 @@ Schemas.Attribute = new SimpleSchema({
|
||||
//note that to make an invulnerability add a new max of zero value
|
||||
Schemas.Vulnerability = new SimpleSchema({
|
||||
//same as attribute
|
||||
base: {
|
||||
adjustment: {
|
||||
type: Number,
|
||||
defaultValue: 0
|
||||
},
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
Items = new Meteor.Collection('items');
|
||||
|
||||
Schemas.Item = new SimpleSchema({
|
||||
name: {type: String},
|
||||
description:{type: String},
|
||||
name: {type: String, defaultValue: "New Item"},
|
||||
plural: {type: String, optional: true},
|
||||
description:{type: String, defaultValue: ""},
|
||||
container: {type: String, regEx: SimpleSchema.RegEx.Id},
|
||||
quantity: {type: Number, min: 0, defaultValue: 1},
|
||||
weight: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
||||
value: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
||||
tradeGood: {type: Boolean, defaultValue: false},
|
||||
stackable: {type: Boolean, defaultValue: false},
|
||||
buffs: {type: [Schemas.Buff]}
|
||||
buffs: {type: [Schemas.Buff], defaultValue: []},
|
||||
equipmentSlot: {type: String, defaultValue: "", allowedValues: ["head", "body", "arms", "hands", "held", "feet"]},
|
||||
});
|
||||
|
||||
Items.attachSchema(Schemas.Item);
|
||||
|
||||
3
rpg-docs/client/globalHelpers/canCast.js
Normal file
3
rpg-docs/client/globalHelpers/canCast.js
Normal file
@@ -0,0 +1,3 @@
|
||||
Template.registerHelper("canCast", function(){
|
||||
return Characters.find({_id: this._id, spells: {$size: 0}}).count() === 0;
|
||||
});
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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")
|
||||
});
|
||||
@@ -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>
|
||||
@@ -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";
|
||||
4
rpg-docs/client/views/character/Stats/stats.css
Normal file
4
rpg-docs/client/views/character/Stats/stats.css
Normal file
@@ -0,0 +1,4 @@
|
||||
#stats{
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
}
|
||||
80
rpg-docs/client/views/character/Stats/stats.html
Normal file
80
rpg-docs/client/views/character/Stats/stats.html
Normal 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>
|
||||
@@ -1,3 +1,9 @@
|
||||
.flexItem.abilities {
|
||||
flex-grow: 1;
|
||||
width: 100px;
|
||||
max-width: 400px;
|
||||
}
|
||||
|
||||
.floatBox.ability {
|
||||
width: 85px;
|
||||
text-align: center;
|
||||
|
||||
@@ -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>
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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>
|
||||
11
rpg-docs/client/views/character/characterSheet.css
Normal file
11
rpg-docs/client/views/character/characterSheet.css
Normal 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;
|
||||
}
|
||||
19
rpg-docs/client/views/character/characterSheet.html
Normal file
19
rpg-docs/client/views/character/characterSheet.html
Normal 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>
|
||||
34
rpg-docs/client/views/character/characterSheet.js
Normal file
34
rpg-docs/client/views/character/characterSheet.js
Normal 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");
|
||||
},
|
||||
})
|
||||
@@ -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>
|
||||
@@ -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;
|
||||
|
||||
@@ -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}});
|
||||
|
||||
6
rpg-docs/client/views/character/inventory/inventory.html
Normal file
6
rpg-docs/client/views/character/inventory/inventory.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<template name="inventory">
|
||||
<div class="flexItem floatBox">
|
||||
<h2>Inventory</h2>
|
||||
{{> inventoryTables}}
|
||||
</div>
|
||||
</template>
|
||||
24
rpg-docs/client/views/character/persona/persona.html
Normal file
24
rpg-docs/client/views/character/persona/persona.html
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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>
|
||||
19
rpg-docs/nohup.out
Normal file
19
rpg-docs/nohup.out
Normal file
@@ -0,0 +1,19 @@
|
||||
[[[[[ ~/workspace/rpg-docs ]]]]]
|
||||
|
||||
=> Started proxy.
|
||||
=> Started MongoDB.
|
||||
[34mI20141122-15:44:13.239(0)? [39m** You've set up some data subscriptions with Meteor.publish(), but
|
||||
[34mI20141122-15:44:13.351(0)? [39m** you still have autopublish turned on. Because autopublish is still
|
||||
[34mI20141122-15:44:13.352(0)? [39m** on, your Meteor.publish() calls won't have much effect. All data
|
||||
[34mI20141122-15:44:13.352(0)? [39m** will still be sent to all clients.
|
||||
[34mI20141122-15:44:13.352(0)? [39m**
|
||||
[34mI20141122-15:44:13.352(0)? [39m** Turn off autopublish by removing the autopublish package:
|
||||
[34mI20141122-15:44:13.353(0)? [39m**
|
||||
[34mI20141122-15:44:13.353(0)? [39m** $ meteor remove autopublish
|
||||
[34mI20141122-15:44:13.353(0)? [39m**
|
||||
[34mI20141122-15:44:13.353(0)? [39m** .. and make sure you have Meteor.publish() and Meteor.subscribe() calls
|
||||
[34mI20141122-15:44:13.353(0)? [39m** for each collection that you want clients to see.
|
||||
[34mI20141122-15:44:13.353(0)? [39m
|
||||
=> Started your app.
|
||||
|
||||
=> App running at: http://localhost:3000/
|
||||
9
rpg-docs/tests/mocha/client/sampleClientTest.js
Normal file
9
rpg-docs/tests/mocha/client/sampleClientTest.js
Normal file
@@ -0,0 +1,9 @@
|
||||
if (!(typeof MochaWeb === 'undefined')){
|
||||
MochaWeb.testOnly(function(){
|
||||
describe("a group of tests", function(){
|
||||
it("should respect equality", function(){
|
||||
chai.assert.equal(5,5);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
9
rpg-docs/tests/mocha/server/sampleServerTest.js
Normal file
9
rpg-docs/tests/mocha/server/sampleServerTest.js
Normal file
@@ -0,0 +1,9 @@
|
||||
if (!(typeof MochaWeb === 'undefined')){
|
||||
MochaWeb.testOnly(function(){
|
||||
describe("Server initialization", function(){
|
||||
it("should have a Meteor version defined", function(){
|
||||
chai.assert(Meteor.release);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user