Merge pull request #5781 from HabitRPG/sabrecat/greeting-cards
Greeting and Thank-You Cards
2
common/dist/sprites/habitrpg-shared.css
vendored
1510
common/dist/sprites/spritesmith0.css
vendored
BIN
common/dist/sprites/spritesmith0.png
vendored
|
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 240 KiB |
1680
common/dist/sprites/spritesmith1.css
vendored
BIN
common/dist/sprites/spritesmith1.png
vendored
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
832
common/dist/sprites/spritesmith3.css
vendored
BIN
common/dist/sprites/spritesmith3.png
vendored
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 91 KiB |
712
common/dist/sprites/spritesmith4.css
vendored
BIN
common/dist/sprites/spritesmith4.png
vendored
|
Before Width: | Height: | Size: 544 KiB After Width: | Height: | Size: 543 KiB |
830
common/dist/sprites/spritesmith5.css
vendored
BIN
common/dist/sprites/spritesmith5.png
vendored
|
Before Width: | Height: | Size: 235 KiB After Width: | Height: | Size: 235 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3 KiB |
|
After Width: | Height: | Size: 3 KiB |
|
|
@ -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."
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)",
|
||||
|
|
|
|||
|
|
@ -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) ->
|
||||
|
|
|
|||
|
|
@ -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
|
||||
# ------
|
||||
|
|
|
|||
41
test/common/user.ops.test.js
Normal 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']);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
]);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
]);
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
}])
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
|
|
|
|||
|
|
@ -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
|
||||
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')
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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}}"})
|
||||
|
|
|
|||