Added ability to add/edit buffs

This commit is contained in:
Jacob
2017-08-09 15:01:20 +01:00
parent bce1b85600
commit 08735ea4f7
18 changed files with 308 additions and 26 deletions

View File

@@ -16,6 +16,15 @@ Schemas.CustomBuff = new SimpleSchema({
optional: true,
trim: false,
},
target: {
type: String,
allowedValues: [
"self",
"others",
"both"
],
defaultValue: "self",
},
enabled: {
type: Boolean,
autoValue: function(){
@@ -23,27 +32,14 @@ Schemas.CustomBuff = new SimpleSchema({
//enabled is ALWAYS false on these, so that its children are also not enabled, so that the buff templates have no effects.
},
},
type: {
type: String,
allowedValues: [
"inate", //this should be "innate", but changing it could be problematic
"custom",
],
},
"lifeTime.total": {
type: Number,
defaultValue: 0, //0 is infinite
min: 0,
},
color: {
type: String,
allowedValues: _.pluck(colorOptions, "key"),
defaultValue: "q",
},
//the id of the feature, buff or item that creates this buff
parent: {
type: Schemas.Parent,
optional: true,
},
});
@@ -51,7 +47,7 @@ CustomBuffs.attachSchema(Schemas.CustomBuff);
CustomBuffs.attachBehaviour("softRemovable");
makeParent(CustomBuffs, ["name", "enabled"]); //parents of effects, attacks, proficiencies. Since this represents a template, "enabled" is always false.
makeChild(CustomBuffs, ["enabled"]); //children of lots of things
makeChild(CustomBuffs); //children of lots of things
CustomBuffs.allow(CHARACTER_SUBSCHEMA_ALLOW);
CustomBuffs.deny(CHARACTER_SUBSCHEMA_DENY);

View File

@@ -18,6 +18,9 @@ openParentDialog = function({
} else if (parent.collection === "Spells") {
template = "spellDialog";
data = {spellId: parent.id};
} else if (parent.collection === "Buffs") {
template = "buffDialog";
data = {buffId: parent.id};
}
pushDialogStack({template, data, element, returnElement, callback});
};

View File

@@ -0,0 +1,40 @@
<!-- data is the CustomBuff -->
<template name="applyBuffDialog">
<div class="fit layout vertical">
<app-header-layout has-scrolling-region class="feedback flex">
<app-header fixed effects="waterfall">
<app-toolbar>
Apply Buff
</app-toolbar>
</app-header>
<div class="form flex">
<paper-dropdown-menu class=flex label="Target" style="flex-basis: 150px; max-width: 200px;">
<dicecloud-selector selected="default" class="dropdown-content target-dropdown">
{{#if canApplyToSelf}}
<paper-item name="default" style="width: 150px;">
Self
</paper-item>
{{else}}
<paper-item name="default" style="width: 150px;">
Choose a character
</paper-item>
{{/if}}
{{#each character in writableCharacters}}
<paper-item name="{{character._id}}">
{{character.name}}
</paper-item>
{{/each}}
</dicecloud-selector>
</paper-dropdown-menu>
</div>
</app-header-layout>
<div class="buttons layout horizontal end-justified">
<paper-button id="cancelButton">
Cancel
</paper-button>
<paper-button id="applyButton" disabled={{cantApply}}>
Apply
</paper-button>
</div>
</div>
</template>

View File

@@ -0,0 +1,83 @@
Template.applyBuffDialog.onCreated(function(){
this.selectedTarget = new ReactiveVar("default");
});
Template.applyBuffDialog.helpers({
cantApply: function() {
return this.buff.target === "others" && Template.instance().selectedTarget.get() === "default"; //this is the only case where we can't apply a buff
},
canApplyToSelf: function() {
return this.buff.target !== "others"; //i.e. it is "self" or "both"
},
writableCharacters: function() {
var returnArray = [];
Characters.find({}).forEach(function(char){ //we look through all characters we have access to
if (canEditCharacter(char._id)) {
returnArray.push(char)
}
});
return returnArray;
},
});
Template.applyBuffDialog.events({
"iron-select .target-dropdown": function(event){
var detail = event.originalEvent.detail;
var value = detail.item.getAttribute("name");
Template.instance().selectedTarget.set(value);
},
"click #applyButton": function(event, instance){
var targetId = Template.instance().selectedTarget.get();
var parent = global[this.buff.parent.collection].findOne(this.buff.parent.id);
console.log(parent, this.buff.parent);
if (targetId === "default") {
if (this.buff.target === "others") return; //we have "Select a character" selected
targetId = this.buff.charId; //i.e. target self
}
//insert new buff
newBuffId = Buffs.insert({
charId: targetId,
name: this.buff.name,
description: this.buff.description,
lifeTime: {total: this.buff.lifeTime.total},
type: "custom",
appliedBy: this.buff.charId,
appliedByDetails: {
name: parent.name,
collection: this.buff.parent.collection,
},
});
//insert children
Attacks.find({"parent.id": this.buff._id}).forEach(function(doc){
temp = _.clone(doc);
temp.parent.id = newBuffId;
temp.parent.collection = "Buffs";
delete temp._id;
Attacks.insert(temp);
});
Effects.find({"parent.id": this.buff._id}).forEach(function(doc){
temp = _.clone(doc);
temp.parent.id = newBuffId;
temp.parent.collection = "Buffs";
delete temp._id;
Effects.insert(temp);
});
Proficiencies.find({"parent.id": this.buff._id}).forEach(function(doc){
temp = _.clone(doc);
temp.parent.id = newBuffId;
temp.parent.collection = "Buffs";
delete temp._id;
Proficiencies.insert(temp);
});
popDialogStack();
},
"click #cancelButton": function(event, instance){
popDialogStack();
},
});

View File

@@ -17,6 +17,6 @@
<div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
{{/if}}
{{> effectsViewList charId=charId parentId=_id}}
{{> attacksViewList charId=charId parentId=_id}}
{{> proficiencyViewList charId=charId parentId=_id}}
{{> attacksViewList charId=charId parentId=_id}}
</template>

View File

@@ -6,7 +6,7 @@ Template.buffDialog.helpers({
Template.buffDialog.events({
"click #deleteButton": function(event, instance){
Buffs.remove(instance.data.buffId);
Buffs.softRemoveNode(instance.data.buffId);
popDialogStack();
},
});
@@ -29,18 +29,15 @@ Template.buffDetails.helpers({
if (applierCharacter.name === myName) {
var charName = "your "
} else {
if (applierCharacter.charName[applierCharacter.charName.length -1] === 's') {
var charName = applierCharacter.charName + "' ";
if (applierCharacter.name[applierCharacter.name.length - 1] === 's') {
var charName = applierCharacter.name + "' ";
} else {
var charName = applierCharacter.charName + "'s ";
var charName = applierCharacter.name + "'s ";
}
}
var type = typeDict[this.appliedByDetails.collection] || "";
var applierThing = global[this.appliedByDetails.collection]
&& global[this.appliedByDetails.collection].findOne(this.appliedByDetails.id)
&& global[this.appliedByDetails.collection].findOne(this.appliedByDetails.id).name
|| "unknown ability";
var type = typeDict[this.appliedByDetails.collection] + " ";
var applierThing = this.appliedByDetails.name;
return "Applied by " + charName + type + applierThing + ".";
}

View File

@@ -0,0 +1,15 @@
<template name="customBuffEdit">
{{#with buff}}
{{#baseEditDialog title=name hideColor=true}}
<!--name-->
<paper-input id="buffNameInput" class="fullwidth" label="Name" value={{name}}></paper-input>
<!--description-->
<paper-textarea label="Description" id="buffDescriptionInput" value={{description}}></paper-textarea>
{{> effectsEditList parentId=_id parentCollection="Buffs" charId=charId name=name enabled=false}}
{{> attackEditList parentId=_id parentCollection="Buffs" charId=charId name=name enabled=false}}
{{> proficiencyEditList parentId=_id parentCollection="Buffs" charId=charId enabled=false}}
{{/baseEditDialog}}
{{/with}}
</template>

View File

@@ -0,0 +1,35 @@
Template.customBuffEdit.helpers({
buff: function(){
return CustomBuffs.findOne(this.buffId);
},
});
const debounce = (f) => _.debounce(f, 300);
Template.customBuffEdit.events({
"input #buffNameInput": debounce(function(event){
const input = event.currentTarget;
var name = input.value;
if (!name){
input.invalid = true;
input.errorMessage = "Name is required";
} else {
input.invalid = false;
CustomBuffs.update(this._id, {
$set: {name: name}
}, {
removeEmptyStrings: false,
trimStrings: false,
});
}
}),
"input #buffDescriptionInput": debounce(function(event){
var description = event.currentTarget.value;
CustomBuffs.update(this._id, {
$set: {description: description}
}, {
removeEmptyStrings: false,
trimStrings: false,
});
}),
});

View File

@@ -0,0 +1,30 @@
<!--needs to be given charId, parentId and parentCollection-->
<template name="customBuffEditList">
{{#if buffs.count}}
<div class="buffs">
<div class="paper-font-title" style="margin-bottom: 8px;">
Buffs
</div>
<table class="wideTable" style="width: 100%;">
{{#each buff in buffs}}
{{> customBuffEditListItem buff=buff}}
{{/each}}
</table>
</div>
{{/if}}
<paper-button id="addBuffButton"
class="red-button"
raised>
Add Buff
</paper-button>
</template>
<template name="customBuffEditListItem">
<tr class="buff" data-id={{buff._id}}>
{{> customBuffView buff=buff}}
<td>
<paper-icon-button class="edit-buff" icon="create">
</paper-icon-button>
</td>
</tr>
</template>

View File

@@ -0,0 +1,41 @@
Template.customBuffEditList.helpers({
buffs: function(){
var selector = {
"parent.id": this.parentId,
"charId": this.charId,
};
return CustomBuffs.find(selector);
}
});
Template.customBuffEditList.events({
"tap #addBuffButton": function(event, instance){
if (!_.isBoolean(this.enabled)) {
this.enabled = true;
}
const customBuffId = CustomBuffs.insert({
name: "New Buff",
charId: this.charId,
parent: {
id: this.parentId,
collection: this.parentCollection,
},
});
pushDialogStack({
template: "customBuffEdit",
data: {id: customBuffId},
element: event.currentTarget,
returnElement: () => instance.find(`tr.buff[data-id='${customBuffId}']`),
});
},
});
Template.customBuffEditListItem.events({
"tap .edit-buff": function(event, template){
pushDialogStack({
template: "customBuffEdit",
data: {id: this.buff._id},
element: event.currentTarget.parentElement.parentElement,
});
},
});

View File

@@ -0,0 +1,6 @@
<template name="customBuffView">
<td>{{buff.name}}</td>
<td>
<paper-button class="apply-buff-button">Apply</paper-button>
</td>
</template>

View File

@@ -0,0 +1,9 @@
Template.customBuffView.events({
"click .apply-buff-button": function(){
pushDialogStack({
template: "applyBuffDialog",
data: {buff: this.buff},
element: event.currentTarget,
});
},
});

View File

@@ -0,0 +1,12 @@
<template name="customBuffViewList">
{{#if buffs.count}}
<div class="buffs">
<div class="paper-font-title" style="margin-bottom: 8px;">
Buffs
</div>
{{#each buff in buffs}}
{{> customBuffView buff=buff}}
{{/each}}
</div>
{{/if}}
</template>

View File

@@ -0,0 +1,9 @@
Template.customBuffViewList.helpers({
buffs: function(){
var selector = {
"parent.id": this.parentId,
"charId": this.charId,
};
return CustomBuffs.find(selector);
}
});

View File

@@ -36,6 +36,7 @@
{{> effectsViewList charId=charId parentId=_id}}
{{> proficiencyViewList charId=charId parentId=_id}}
{{> customBuffViewList charId=charId parentId=_id}}
</template>
<template name="featureEdit">
@@ -73,4 +74,5 @@
{{> effectsEditList parentId=_id parentCollection="Features" charId=charId name=name enabled=enabled}}
{{> proficiencyEditList parentId=_id parentCollection="Features" charId=charId enabled=enabled}}
{{> customBuffEditList parentId=_id parentCollection="Features" charId=charId}}
</template>

View File

@@ -23,6 +23,7 @@
{{/if}}
{{> effectsViewList charId=charId parentId=_id}}
{{> attacksViewList charId=charId parentId=_id}}
{{> customBuffViewList charId=charId parentId=_id}}
</template>
<template name="itemEdit">
@@ -68,6 +69,8 @@
{{> effectsEditList parentId=_id parentCollection="Items" charId=charId enabled=equipped name=name}}
<!--Attacks-->
{{> attackEditList parentId=_id parentCollection="Items" charId=charId enabled=equipped name=name}}
<!-- Buffs -->
{{> customBuffEditList parentId=_id parentCollection="Items" charId=charId}}
</template>
<template name="containerDropdown">

View File

@@ -38,6 +38,7 @@
</div>
<div>{{#markdown}}{{evaluateSpellString charId parent.id description}}{{/markdown}}</div>
{{> attacksViewList charId=charId parentId=_id}}
{{> customBuffViewList charId=charId parentId=_id}}
</template>
<template name="spellEdit">
@@ -115,4 +116,5 @@
<paper-textarea id="descriptionInput" label="Description" value="{{description}}">
</paper-textarea>
{{> attackEditList parentId=_id parentCollection="Spells" charId=charId enabled=true name=name}}
{{> customBuffEditList parentId=_id parentCollection="Spells" charId=charId}}
</template>

View File

@@ -57,10 +57,9 @@
{{>buffListItem buff=condition}}
{{/each}}
</div>
{{#if totalBuffs.count}}
{{#if buffs.count}}
<div class="layout horizontal">
<div class="paper-font-subhead flex">Buffs</div>
<paper-button class="viewAllBuffsButton"> View All </paper-button>
</div>
{{/if}}
<div class="buffsList">