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

2
.codio
View File

@@ -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"
}
}

View File

@@ -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;
}

View File

@@ -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
},

View File

@@ -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);

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>

19
rpg-docs/nohup.out Normal file
View File

@@ -0,0 +1,19 @@
[[[[[ ~/workspace/rpg-docs ]]]]]
=> Started proxy.
=> Started MongoDB.
I20141122-15:44:13.239(0)? ** You've set up some data subscriptions with Meteor.publish(), but
I20141122-15:44:13.351(0)? ** you still have autopublish turned on. Because autopublish is still
I20141122-15:44:13.352(0)? ** on, your Meteor.publish() calls won't have much effect. All data
I20141122-15:44:13.352(0)? ** will still be sent to all clients.
I20141122-15:44:13.352(0)? **
I20141122-15:44:13.352(0)? ** Turn off autopublish by removing the autopublish package:
I20141122-15:44:13.353(0)? **
I20141122-15:44:13.353(0)? ** $ meteor remove autopublish
I20141122-15:44:13.353(0)? **
I20141122-15:44:13.353(0)? ** .. and make sure you have Meteor.publish() and Meteor.subscribe() calls
I20141122-15:44:13.353(0)? ** for each collection that you want clients to see.
I20141122-15:44:13.353(0)? 
=> Started your app.
=> App running at: http://localhost:3000/

View 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);
});
});
});
}

View 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);
});
});
});
}