Merge pull request #5781 from HabitRPG/sabrecat/greeting-cards

Greeting and Thank-You Cards
This commit is contained in:
Sabe Jones 2015-08-13 22:35:25 -05:00
commit ab91a6fba9
30 changed files with 3094 additions and 2896 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

After

Width:  |  Height:  |  Size: 240 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 91 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 KiB

After

Width:  |  Height:  |  Size: 543 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 KiB

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -110,5 +110,25 @@
"dateFormat": "Date Format",
"achievementStressbeast": "Savior of Stoïkalm",
"achievementStressbeastText": "Helped defeat the Abominable Stressbeast during the 2015 Winter Wonderland Event!",
"checkOutProgress": "Check out my progress in Habitica!"
"checkOutProgress": "Check out my progress in Habitica!",
"cardReceived": "Received a card!",
"cardReceivedFrom": "<%= cardType %> from <%= userName %>",
"greetingCard": "Greeting Card",
"greetingCardExplanation": "You both receive the Cheery Chum achievement!",
"greetingCardNotes": "Send a greeting card to a party member.",
"greeting0": "\"Hi there!\"",
"greeting1": "\"Just saying hello :)\"",
"greeting2": "\"`waves frantically`\"",
"greeting3": "\"Hey you!\"",
"cheeryChum": "Cheery Chum",
"cheeryChumText": "Hey! Hi! Hello! Sent or received <%= cards %> greeting cards.",
"thankyouCard": "Thank-You Card",
"thankyouCardExplanation": "You both receive the Greatly Grateful achievement!",
"thankyouCardNotes": "Send a Thank-You card to a party member.",
"thankyou0": "\"Thank you very much!\"",
"thankyou1": "\"Thank you, thank you, thank you!\"",
"thankyou2": "\"Sending you a thousand thanks.\"",
"thankyou3": "\"I'm very grateful - thank you!\"",
"greatlyGrateful": "Greatly Grateful",
"greatlyGratefulText": "Thanks for being thankful! Sent or received <%= cards %> Thank-You cards."
}

View file

@ -11,6 +11,7 @@
"aquaticFriends": "Aquatic Friends",
"aquaticFriendsText": "Got splashed <%= seafoam %> times by party members.",
"valentineCard": "Valentine's Day Card",
"valentineCardExplanation": "For enduring such a saccharine poem, you both receive the \"Adoring Friends\" badge!",
"valentineCardNotes": "Send a Valentine's Day card to a party member.",
"valentine0": "\"Roses are red\n\nMy Dailies are blue\n\nI'm happy that I'm\n\nIn a Party with you!\"",
"valentine1": "\"Roses are red\n\nViolets are nice\n\nLet's get together\n\nAnd fight against Vice!\"",
@ -33,16 +34,18 @@
"skiSet": "Ski-sassin (Rogue)",
"snowflakeSet": "Snowflake (Healer)",
"yetiSet": "Yeti Tamer (Warrior)",
"toAndFromCard": "To: <%= toName %>, From: <%= fromName %>",
"nyeCard": "New Year's Card",
"nyeCardExplanation": "For celebrating the new year together, you both receive the \"Auld Acquaintance\" badge!",
"nyeCardNotes": "Send a New Year's card to a party member.",
"seasonalItems": "Seasonal Items",
"auldAcquaintance": "Auld Acquaintance",
"auldAcquaintanceText": "Happy New Year! Sent or received <%= cards %> New Year's cards.",
"newYear0": "Happy New Year! May you slay many a bad Habit.",
"newYear1": "Happy New Year! May you reap many Rewards.",
"newYear2": "Happy New Year! May you earn many a Perfect Day.",
"newYear3": "Happy New Year! May your To-Do list stay short and sweet.",
"newYear4": "Happy New Year! May you not get attacked by a raging Hippogriff.",
"nye0": "\"Happy New Year! May you slay many a bad Habit.\"",
"nye1": "\"Happy New Year! May you reap many Rewards.\"",
"nye2": "\"Happy New Year! May you earn many a Perfect Day.\"",
"nye3": "\"Happy New Year! May your To-Do list stay short and sweet.\"",
"nye4": "\"Happy New Year! May you not get attacked by a raging Hippogriff.\"",
"holidayCard": "Received a holiday card!",
"mightyBunnySet": "Mighty Bunny (Warrior)",
"magicMouseSet": "Magic Mouse (Mage)",

View file

@ -928,6 +928,7 @@ api.spells =
if !target.items.special.nyeReceived
target.items.special.nyeReceived = []
target.items.special.nyeReceived.push user.profile.name
target.flags.cardReceived = true
target.markModified? 'items.special.nyeReceived'
user.stats.gp -= 10
@ -951,10 +952,75 @@ api.spells =
if !target.items.special.valentineReceived
target.items.special.valentineReceived = []
target.items.special.valentineReceived.push user.profile.name
target.flags.cardReceived = true
target.markModified? 'items.special.valentineReceived'
user.stats.gp -= 10
greeting:
text: t('greetingCard')
mana: 0
value: 10
immediateUse: true
silent: true
target: 'user'
notes: t('greetingCardNotes')
cast: (user, target) ->
if user == target
user.achievements.greeting ?= 0
user.achievements.greeting++
else
_.each [user,target], (t)->
t.achievements.greeting ?= 0
t.achievements.greeting++
if !target.items.special.greetingReceived
target.items.special.greetingReceived = []
target.items.special.greetingReceived.push user.profile.name
target.flags.cardReceived = true
target.markModified? 'items.special.greetingReceived'
user.stats.gp -= 10
thankyou:
text: t('thankyouCard')
mana: 0
value: 10
immediateUse: true
silent: true
target: 'user'
notes: t('thankyouCardNotes')
cast: (user, target) ->
if user == target
user.achievements.thankyou ?= 0
user.achievements.thankyou++
else
_.each [user,target], (t)->
t.achievements.thankyou ?= 0
t.achievements.thankyou++
if !target.items.special.thankyouReceived
target.items.special.thankyouReceived = []
target.items.special.thankyouReceived.push user.profile.name
target.flags.cardReceived = true
target.markModified? 'items.special.thankyouReceived'
user.stats.gp -= 10
api.cardTypes =
greeting:
key: 'greeting'
messageOptions: 4
yearRound: true
nye:
key: 'nye'
messageOptions: 5
thankyou:
key: 'thankyou'
messageOptions: 4
yearRound: true
valentine:
key: 'valentine'
messageOptions: 4
# Intercept all spells to reduce user.stats.mp after casting the spell
_.each api.spells, (spellClass) ->
_.each spellClass, (spell, key) ->

View file

@ -1165,10 +1165,12 @@ api.wrap = (user, main=true) ->
user.stats.mp++ if stat is 'int' #increase their MP along with their max MP
cb? null, _.pick(user,$w 'stats')
readValentine: (req,cb) ->
user.items.special.valentineReceived.shift()
user.markModified? 'items.special.valentineReceived'
cb? null, 'items.special'
readCard: (req, cb) ->
{cardType} = req.params
user.items.special["#{cardType}Received"].shift()
user.markModified? "items.special.#{cardType}Received"
user.flags.cardReceived = false
cb? null, 'items.special flags.cardReceived'
openMysteryItem: (req,cb,analytics) ->
item = user.purchased.plan?.mysteryItems?.shift()
@ -1188,11 +1190,6 @@ api.wrap = (user, main=true) ->
(user._tmp?={}).drop = item if typeof window != 'undefined'
cb? null, user.items.gear.owned
readNYE: (req,cb) ->
user.items.special.nyeReceived.shift()
user.markModified? 'items.special.nyeReceived'
cb? null, 'items.special'
# ------
# Score
# ------

View file

@ -0,0 +1,41 @@
var sinon = require('sinon');
var chai = require("chai")
chai.use(require("sinon-chai"))
var expect = chai.expect
var _ = require('lodash');
require('coffee-script');
var shared = require('../../common/script/index.coffee');
describe('user.ops', function() {
var user;
beforeEach(function() {
user = {
items: {
gear: { },
special: { }
},
achievements: { },
flags: { }
};
shared.wrap(user);
});
describe('readCard', function() {
it('removes card from invitation array', function() {
user.items.special.valentineReceived = ['Leslie'];
user.ops.readCard({ params: { cardType: 'valentine' } });
expect(user.items.special.valentineReceived).to.be.empty;
});
it('removes the first card from invitation array', function() {
user.items.special.valentineReceived = ['Leslie', 'Vicky'];
user.ops.readCard({ params: { cardType: 'valentine' } });
expect(user.items.special.valentineReceived).to.eql(['Vicky']);
});
});
});

View file

@ -1,7 +1,7 @@
'use strict';
describe('Inventory Controller', function() {
var scope, ctrl, user, $rootScope;
var scope, ctrl, user, rootScope;
beforeEach(function() {
module(function($provide) {
@ -23,6 +23,7 @@ describe('Inventory Controller', function() {
}
};
scope = $rootScope.$new();
rootScope = $rootScope;
// Load RootCtrl to ensure shared behaviors are loaded
$controller('RootCtrl', {$scope: scope, User: {user: user}, $window: mockWindow});
@ -109,4 +110,45 @@ describe('Inventory Controller', function() {
expect(scope.selectedEgg).to.eql(null);
});
});
describe('openCardsModal', function(type, numberOfVariations) {
var cardsModalScope;
beforeEach(function() {
cardsModalScope = {};
sandbox.stub(rootScope, 'openModal');
sandbox.stub(rootScope, '$new').returns(cardsModalScope);
});
it('opens cards modal', function() {
scope.openCardsModal('valentine', 4);
expect(rootScope.openModal).to.be.calledOnce;
expect(rootScope.openModal).to.be.calledWith(
'cards'
);
});
it('instantiates a new scope for the modal', function() {
scope.openCardsModal('valentine', 4);
expect(rootScope.$new).to.be.calledOnce;
expect(cardsModalScope.cardType).to.eql('valentine');
expect(cardsModalScope.cardMessage).to.exist;
});
it('provides a card message', function() {
scope.openCardsModal('valentine', 1);
expect(cardsModalScope.cardMessage).to.eql(env.t('valentine0'));
});
it('randomly generates message from x number of messages', function() {
var possibleValues = [env.t('valentine0'), env.t('valentine1')];
scope.openCardsModal('valentine', 2);
expect(possibleValues).to.contain(cardsModalScope.cardMessage);
});
});
});

View file

@ -216,7 +216,17 @@ habitrpg.controller("InventoryCtrl",
$scope.selectedFood = null;
$scope.selectedPotion = null;
$scope.selectedEgg = null;
}
};
$scope.openCardsModal = function(type, numberOfVariations) {
var cardsModalScope = $rootScope.$new();
cardsModalScope.cardType = type;
cardsModalScope.cardMessage = _generateCard(type, numberOfVariations);
$rootScope.openModal('cards', {
scope: cardsModalScope
});
};
function _updateDropAnimalCount(items) {
$scope.petCount = Shared.count.beastMasterProgress(items.pets);
@ -224,5 +234,11 @@ habitrpg.controller("InventoryCtrl",
$scope.beastMasterProgress = Stats.beastMasterProgress(items.pets);
$scope.mountMasterProgress = Stats.mountMasterProgress(items.mounts);
}
function _generateCard(kind, numberOfVariations) {
var random = Math.random() * numberOfVariations;
var selection = Math.floor(random);
return env.t(kind + selection);
}
}
]);

View file

@ -13,12 +13,14 @@ angular.module('habitrpg')
$scope._expandedMenu = ($scope._expandedMenu == menu) ? null : menu;
};
function selectNotificationValue(mysteryValue, invitationValue, unallocatedValue, messageValue, noneValue) {
function selectNotificationValue(mysteryValue, invitationValue, cardValue, unallocatedValue, messageValue, noneValue) {
var user = $scope.user;
if (user.purchased && user.purchased.plan && user.purchased.plan.mysteryItems && user.purchased.plan.mysteryItems.length) {
return mysteryValue;
} else if ((user.invitations.party && user.invitations.party.id) || (user.invitations.guilds && user.invitations.guilds.length > 0)) {
return invitationValue;
} else if (user.flags.cardReceived) {
return cardValue;
} else if (user.flags.classSelected && !(user.preferences && user.preferences.disableClasses) && user.stats.points) {
return unallocatedValue;
} else if (!(_.isEmpty(user.newMessages))) {
@ -26,14 +28,16 @@ angular.module('habitrpg')
} else {
return noneValue;
}
};
}
$scope.clearMessages = Chat.seenMessage;
$scope.clearCards = Chat.clearCards;
$scope.iconClasses = function() {
return selectNotificationValue(
'glyphicon-gift',
'glyphicon-user',
'glyphicon-envelope',
'glyphicon-plus-sign',
'glyphicon-comment',
'glyphicon-comment inactive'
@ -41,7 +45,7 @@ angular.module('habitrpg')
};
$scope.hasNoNotifications = function() {
return selectNotificationValue(false, false, false, false, true);
return selectNotificationValue(false, false, false, false, false, true);
}
}
]);

View file

@ -15,14 +15,19 @@ function($resource, $http, ApiUrl, User) {
var chatService = {
seenMessage: seenMessage,
clearCards: clearCards,
utils: utils
};
return chatService;
function clearCards() {
User.user.ops.update && User.set({'flags.cardReceived':false});
}
function seenMessage(gid) {
// On enter, set chat message to "seen"
$http.post(ApiUrl.get() + '/api/v2/groups/'+gid+'/chat/seen');
if (User.user.newMessages) delete User.user.newMessages[gid];
}
}])
}]);

View file

@ -55,7 +55,9 @@ var UserSchema = new Schema({
valentine: Number,
costumeContest: Boolean,
nye: Number,
habiticaDays: Number
habiticaDays: Number,
greeting: Number,
thankyou: Number
},
auth: {
blocked: Boolean,
@ -160,7 +162,8 @@ var UserSchema = new Schema({
welcomed: {type: Boolean, 'default': false},
armoireEnabled: {type: Boolean, 'default': false},
armoireOpened: {type: Boolean, 'default': false},
armoireEmpty: {type: Boolean, 'default': false}
armoireEmpty: {type: Boolean, 'default': false},
cardReceived: {type: Boolean, 'default': false}
},
history: {
exp: Array, // [{date: Date, value: Number}], // big peformance issues if these are defined
@ -210,7 +213,11 @@ var UserSchema = new Schema({
valentine: Number,
valentineReceived: Array, // array of strings, by sender name
nye: Number,
nyeReceived: Array
nyeReceived: Array,
greeting: Number,
greetingReceived: Array,
thankyou: Number,
thankyouReceived: Array
},
// -------------- Animals -------------------
@ -350,7 +357,7 @@ var UserSchema = new Schema({
profile: {
blurb: String,
imageUrl: String,
name: String,
name: String
},
stats: {
hp: {type: Number, 'default': shared.maxHealth},

View file

@ -16,7 +16,6 @@
popover-trigger='mouseenter', popover-placement='right',
ng-click='chooseEgg(egg)')
.badge.badge-info.stack-count {{points}}
//-p {{Content.eggs[egg].text()}}
li.customize-menu
menu.hatchingPotion-menu(label=(env.t('hatchingPotions') + ' ({{potCount}})'))
@ -62,14 +61,6 @@
+specialItem('shinySeed')
+specialItem('seafoam')
div(ng-if='user.items.special.valentineReceived[0]')
button.customize-option(class='inventory_special_valentine',
popover="Valentine's Day Card from {{User.user.items.special.valentineReceived[0]}}",
popover-trigger='mouseenter', popover-placement='right',
popover-append-to-body='true',
ng-click='openModal("valentine")')
.badge.badge-info.stack-count {{user.items.special.valentineReceived.length}}
div(ng-if='user.purchased.plan.customerId || user.purchased.plan.mysteryItems.length')
button.customize-option(class='inventory_present inventory_present_{{moment().format("MM")}}',
popover=env.t('subscriberItemText'), popover-trigger='mouseenter',
@ -84,13 +75,13 @@
ng-click="$state.go('options.inventory.timetravelers')")
.badge.badge-info.stack-count {{user.purchased.plan.consecutive.trinkets}}
div(ng-if='user.items.special.nyeReceived[0]')
button.customize-option(class='inventory_special_nye',
popover="New Year's Card from {{User.user.items.special.nyeReceived[0]}}",
div(ng-repeat='type in Content.cardTypes', ng-init='received=type.key+"Received"', ng-show='user.items.special[received][0]')
button.customize-option(class='inventory_special_{{::type.key}}',
popover=env.t('cardReceivedFrom', {cardType:'{{::Content.spells.special[type.key].text()}}', userName: '{{User.user.items.special[received][0]}}'}),
popover-trigger='mouseenter', popover-placement='right',
popover-append-to-body='true',
ng-click='openModal("nye")')
.badge.badge-info.stack-count {{user.items.special.nyeReceived.length}}
ng-click='openCardsModal(type.key, type.messageOptions)')
.badge.badge-info.stack-count {{user.items.special[received].length}}
.col-md-6.border-left
h2=env.t('market')
@ -209,13 +200,13 @@
p
| 20&nbsp;
span.shop_gold
// div
button.customize-option(class='inventory_special_valentine',
popover='{{::Content.spells.special.valentine.notes()}}',
popover-title='{{::Content.spells.special.valentine.text()}}',
div(ng-repeat='type in Content.cardTypes', ng-show='type.yearRound')
button.customize-option(class='inventory_special_{{::type.key}}',
popover='{{::Content.spells.special[type.key].notes()}}',
popover-title='{{::Content.spells.special[type.key].text()}}',
popover-trigger='mouseenter', popover-placement='right',
popover-append-to-body='true',
ng-click='castStart(Content.spells.special.valentine)')
ng-click='castStart(Content.spells.special[type.key])')
p
| {{Content.spells.special.valentine.value}}
| {{Content.spells.special[type.key].value}}
span(class='shop_gold')

View file

@ -166,8 +166,6 @@ nav.toolbar(ng-controller='MenuCtrl')
a(target="_blank" href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG')=env.t('contributeToHRPG')
li
a(target="_blank" href='http://habitrpg.wikia.com/wiki/FAQ')=env.t('FAQ')
//-li(ng-controller='SettingsCtrl')
a(ng-click='showTour()', popover-placement='right', popover-trigger='mouseenter', popover=env.t('restartTour'))= env.t('showTour')
ul.toolbar-subscribe(ng-if='!user.purchased.plan.customerId')
li.toolbar-subscribe-button
button.highlight(ui-sref='options.settings.subscription',popover-trigger='mouseenter',popover-placement='bottom',popover-title=env.t('subscriptions'),popover=env.t('subDescription'),popover-append-to-body='true')=env.t('subscribe')
@ -188,6 +186,12 @@ nav.toolbar(ng-controller='MenuCtrl')
a(ui-sref='options.social.party', ng-click='expandMenu(null)')
span.glyphicon.glyphicon-user
span=env.t('invitedTo', {name: '{{user.invitations.party.name}}'})
li(ng-if='user.flags.cardReceived')
a(ng-click='$state.go("options.inventory.drops"); expandMenu(null)')
span.glyphicon.glyphicon-envelope
span=env.t('cardReceived')
a(ng-click='clearCards()', popover=env.t('clear'),popover-placement='right',popover-trigger='mouseenter',popover-append-to-body='true')
span.glyphicon.glyphicon-remove-circle
li(ng-repeat='guild in user.invitations.guilds')
a(ui-sref='options.social.guilds.public', ng-click='expandMenu(null)')
span.glyphicon.glyphicon-user
@ -202,14 +206,8 @@ nav.toolbar(ng-controller='MenuCtrl')
span {{v.name}}
a(ng-click='clearMessages(k)', popover=env.t('clear'),popover-placement='right',popover-trigger='mouseenter',popover-append-to-body='true')
span.glyphicon.glyphicon-remove-circle
// li(ng-if='user.items.special.valentineReceived[0] || user.items.special.nyeReceived[0]')
a(ng-click='$state.go("options.inventory.drops"); expandMenu(null)')
span.glyphicon.glyphicon-envelope
span=env.t('holidayCard')
ul.toolbar-controls
//-li
//-a(ng-click='') Clear all
li.toolbar-controls-button
a(ng-click='expandMenu(null)')=env.t('close')
li.toolbar-audio

View file

@ -1,49 +1,12 @@
//Valentine
script(id='modals/valentine.html', type='text/ng-template')
script(id='modals/cards.html', type='text/ng-template')
.modal-header
h4
.inventory_special_valentine.pull-right
=env.t('valentineCard')
.pull-right(class='inventory_special_{{::cardType}}')
h4 {{::env.t(cardType + 'Card')}}
.modal-body
.bg-info(style='padding:10px')
p To: {{user.profile.name}}, From: {{user.items.special.valentineReceived[0]}}
p {{::env.t('toAndFromCard', { toName: user.profile.name, fromName: user.items.special[cardType + 'Received'][0]})}}
hr
ul.list-unstyled(ng-switch='::Math.floor(Math.random()*4)')
li(ng-switch-when='0')
markdown(text=env.t('valentine0'))
li(ng-switch-when='1')
markdown(text=env.t('valentine1'))
li(ng-switch-when='2')
markdown(text=env.t('valentine2'))
li(ng-switch-default)
markdown(text=env.t('valentine3'))
p
small For enduring such a saccharine poem, you both receive the "Adoring Friends" badge!
markdown(text='{{::cardMessage}}')
.modal-footer
button.btn.btn-default(ng-click='user.ops.readValentine({});$close()')=env.t('ok')
// New Year's
script(id='modals/nye.html', type='text/ng-template')
.modal-header
h4
.inventory_special_nye.pull-right
=env.t('nyeCard')
.modal-body
.bg-info(style='padding:10px')
p To: {{user.profile.name}}, From: {{user.items.special.nyeReceived[0]}}
hr
ul.list-unstyled(ng-switch='::Math.floor(Math.random()*5)')
li(ng-switch-when='0')
=env.t('newYear0')
li(ng-switch-when='1')
=env.t('newYear1')
li(ng-switch-when='2')
=env.t('newYear2')
li(ng-switch-when='3')
=env.t('newYear3')
li(ng-switch-default)
=env.t('newYear4')
p
small For celebrating the new year together, you both receive the "Auld Acquaintance" badge!
.modal-footer
button.btn.btn-default(ng-click='user.ops.readNYE({});$close()')=env.t('ok')
small.pull-left {{::env.t(cardType + 'CardExplanation')}}
button.btn.btn-default(ng-click='user.ops.readCard({params: {cardType: cardType}}); $close()')=env.t('ok')

View file

@ -1,28 +1,38 @@
h5 8/4/2015 - NEW ITEMS IN THE ENCHANTED ARMOIRE AND AUGUST BACKGROUNDS
h5 8/13/2015 - GOLD-PURCHASABLE CARDS
hr
tr
td
.background_pyramids.pull-right
h5 August Backgrounds Revealed
p There are three new avatar backgrounds in the <a href='/#/options/profile/backgrounds'>Background Shop</a>! Now your avatar can admire the Pyramids, stalk across the Sunset Savannah, or dance under Twinkly Party Lights!
p.small.muted by (in order): minac1, Bambin, and rosiesully
tr
td
.promo_enchanted_armoire_201508.pull-right
h5 New Items in the Enchanted Armoire!
p There is new equipment in Enchanted Armoire, a 100 GP Reward in the Rewards Column which unlocks after you've attained Ultimate Gear!
.inventory_special_greeting.pull-right
.inventory_special_thankyou.pull-right
h5 Gold-Purchasable Cards
p There are two new types of Card available in the <a href='/#/options/inventory/drops'>Market</a> that you can send to the people in your Party: Greeting Cards and Thank-You Cards! Both cost 10 Gold, and will be available year-round. Sending or receiving these cards will give you some fun achievements!
br
p Click on the Enchanted Armoire for a random chance at special Equipment, including the Golden Toga Item Set and the Horned Iron Item Set.! It may also give you random XP or food items. We'll be adding new equipment to it during the first week of each month, but even when you've exhausted the current supply, you can keep clicking for a chance at food and XP.
br
p Now go spend all that accumulated Gold! May the Random Number Generator smile upon you...
br
p.small.muted by Lemoness and SabreCat
p.small.muted Art by Kiwibot, Starsystemic, Podcod, and UncommonCriminal
p Enjoy!
p.small.muted by PainterProphet, Teto Is Great, Lemoness, and SabreCat
hr
a(href='/static/old-news', target='_blank') Read older news
mixin oldNews
h5 8/4/2015 - NEW ITEMS IN THE ENCHANTED ARMOIRE AND AUGUST BACKGROUNDS
tr
td
.background_pyramids.pull-right
h5 August Backgrounds Revealed
p There are three new avatar backgrounds in the <a href='/#/options/profile/backgrounds'>Background Shop</a>! Now your avatar can admire the Pyramids, stalk across the Sunset Savannah, or dance under Twinkly Party Lights!
p.small.muted by (in order): minac1, Bambin, and rosiesully
tr
td
.promo_enchanted_armoire_201508.pull-right
h5 New Items in the Enchanted Armoire!
p There is new equipment in Enchanted Armoire, a 100 GP Reward in the Rewards Column which unlocks after you've attained Ultimate Gear!
br
p Click on the Enchanted Armoire for a random chance at special Equipment, including the Golden Toga Item Set and the Horned Iron Item Set.! It may also give you random XP or food items. We'll be adding new equipment to it during the first week of each month, but even when you've exhausted the current supply, you can keep clicking for a chance at food and XP.
br
p Now go spend all that accumulated Gold! May the Random Number Generator smile upon you...
br
p.small.muted by Lemoness and SabreCat
p.small.muted Art by Kiwibot, Starsystemic, Podcod, and UncommonCriminal
h5 8/2/2015 - AUGUST MYSTERY BOX!
tr
td

View file

@ -205,13 +205,6 @@ div(ng-if='::profile.achievements.habitBirthdays')
=env.t('habitBirthdayPluralText', {number: "{{::profile.achievements.habitBirthdays}}"})
hr
div(ng-if='::profile.achievements.valentine')
.achievement.achievement-valentine
h5=env.t('adoringFriends')
small
=env.t('adoringFriendsText', {cards: "{{::profile.achievements.valentine}}"})
hr
div(ng-if='::profile.achievements.quests.dilatory')
.achievement.achievement-dilatory
h5=env.t('achievementDilatory')
@ -219,6 +212,13 @@ div(ng-if='::profile.achievements.quests.dilatory')
=env.t('achievementDilatoryText')
hr
div(ng-if='::profile.achievements.quests.stressbeast')
.achievement.achievement-stoikalm
h5=env.t('achievementStressbeast')
small
=env.t('achievementStressbeastText')
hr
div(ng-if='::profile.achievements.costumeContest')
.achievement.achievement-costumeContest
h5=env.t('costumeContest')
@ -226,6 +226,18 @@ div(ng-if='::profile.achievements.costumeContest')
=env.t('costumeContestText')
hr
div(ng-if='::profile.achievements.greeting')
.achievement.achievement-greeting
h5=env.t('cheeryChum')
small=env.t('cheeryChumText', {cards: "{{::profile.achievements.greeting}}"})
hr
div(ng-if='::profile.achievements.thankyou')
.achievement.achievement-thankyou
h5=env.t('greatlyGrateful')
small=env.t('greatlyGratefulText', {cards: "{{::profile.achievements.thankyou}}"})
hr
div(ng-if='::profile.achievements.nye')
.achievement.achievement-nye
h5=env.t('auldAcquaintance')
@ -233,9 +245,8 @@ div(ng-if='::profile.achievements.nye')
=env.t('auldAcquaintanceText', {cards: "{{::profile.achievements.nye}}"})
hr
div(ng-if='::profile.achievements.quests.stressbeast')
.achievement.achievement-stoikalm
h5=env.t('achievementStressbeast')
div(ng-if='::profile.achievements.valentine')
.achievement.achievement-valentine
h5=env.t('adoringFriends')
small
=env.t('achievementStressbeastText')
hr
=env.t('adoringFriendsText', {cards: "{{::profile.achievements.valentine}}"})