diff --git a/common/img/sprites/spritesmith/achievements/achievement-flower.png b/common/img/sprites/spritesmith/achievements/achievement-flower.png new file mode 100644 index 0000000000..679883fd8f Binary files /dev/null and b/common/img/sprites/spritesmith/achievements/achievement-flower.png differ diff --git a/common/img/sprites/spritesmith/misc/inventory_special_flower.png b/common/img/sprites/spritesmith/misc/inventory_special_flower.png new file mode 100644 index 0000000000..1ae27c91ad Binary files /dev/null and b/common/img/sprites/spritesmith/misc/inventory_special_flower.png differ diff --git a/common/img/sprites/spritesmith/npcs/npc_alex.png b/common/img/sprites/spritesmith/npcs/npc_alex.png index d4df9ff25d..8982854041 100644 Binary files a/common/img/sprites/spritesmith/npcs/npc_alex.png and b/common/img/sprites/spritesmith/npcs/npc_alex.png differ diff --git a/common/img/sprites/spritesmith/npcs/npc_bailey.png b/common/img/sprites/spritesmith/npcs/npc_bailey.png index b44a4bab17..419496bdd0 100644 Binary files a/common/img/sprites/spritesmith/npcs/npc_bailey.png and b/common/img/sprites/spritesmith/npcs/npc_bailey.png differ diff --git a/common/img/sprites/spritesmith/npcs/npc_daniel.png b/common/img/sprites/spritesmith/npcs/npc_daniel.png index a596899089..471f751e72 100644 Binary files a/common/img/sprites/spritesmith/npcs/npc_daniel.png and b/common/img/sprites/spritesmith/npcs/npc_daniel.png differ diff --git a/common/img/sprites/spritesmith/npcs/npc_ian.png b/common/img/sprites/spritesmith/npcs/npc_ian.png index 0f4c6cc682..86860dfa1b 100644 Binary files a/common/img/sprites/spritesmith/npcs/npc_ian.png and b/common/img/sprites/spritesmith/npcs/npc_ian.png differ diff --git a/common/img/sprites/spritesmith/npcs/npc_justin.png b/common/img/sprites/spritesmith/npcs/npc_justin.png index 2dff875c79..9365bc12c9 100644 Binary files a/common/img/sprites/spritesmith/npcs/npc_justin.png and b/common/img/sprites/spritesmith/npcs/npc_justin.png differ diff --git a/common/img/sprites/spritesmith/npcs/npc_matt.png b/common/img/sprites/spritesmith/npcs/npc_matt.png index c000ef52aa..e129d6e43e 100644 Binary files a/common/img/sprites/spritesmith/npcs/npc_matt.png and b/common/img/sprites/spritesmith/npcs/npc_matt.png differ diff --git a/common/img/sprites/spritesmith/npcs/npc_timetravelers.png b/common/img/sprites/spritesmith/npcs/npc_timetravelers.png index b7593f2650..badc7286a5 100644 Binary files a/common/img/sprites/spritesmith/npcs/npc_timetravelers.png and b/common/img/sprites/spritesmith/npcs/npc_timetravelers.png differ diff --git a/common/img/sprites/spritesmith/npcs/npc_timetravelers_active.png b/common/img/sprites/spritesmith/npcs/npc_timetravelers_active.png index 81d6968b3d..727d3ce409 100644 Binary files a/common/img/sprites/spritesmith/npcs/npc_timetravelers_active.png and b/common/img/sprites/spritesmith/npcs/npc_timetravelers_active.png differ diff --git a/common/img/sprites/spritesmith/npcs/seasonalshop_spring2015.png b/common/img/sprites/spritesmith/npcs/seasonalshop_spring2015.png index af538d7adb..e1f811893e 100644 Binary files a/common/img/sprites/spritesmith/npcs/seasonalshop_spring2015.png and b/common/img/sprites/spritesmith/npcs/seasonalshop_spring2015.png differ diff --git a/common/img/sprites/spritesmith/promo/promo_item_notif.png b/common/img/sprites/spritesmith/promo/promo_item_notif.png new file mode 100644 index 0000000000..736ce5312a Binary files /dev/null and b/common/img/sprites/spritesmith/promo/promo_item_notif.png differ diff --git a/common/img/sprites/spritesmith/shop/shop_flower.png b/common/img/sprites/spritesmith/shop/shop_flower.png new file mode 100644 index 0000000000..c76610a9c1 Binary files /dev/null and b/common/img/sprites/spritesmith/shop/shop_flower.png differ diff --git a/common/locales/en/limited.json b/common/locales/en/limited.json index bc764594bf..9ada11db0a 100644 --- a/common/locales/en/limited.json +++ b/common/locales/en/limited.json @@ -6,6 +6,8 @@ "annoyingFriendsText": "Got snowballed <%= snowballs %> times by party members.", "alarmingFriends": "Alarming Friends", "alarmingFriendsText": "Got spooked <%= spookDust %> times by party members.", + "agriculturalFriends": "Agricultural Friends", + "agriculturalFriendsText": "Got transformed into a flower <%= flowers %> times by party members.", "valentineCard": "Valentine's Day Card", "valentineCardNotes": "Send a Valentine's Day card to a party member.", "valentine0": "\"Roses are red<%= lineBreak %>My Dailies are blue<%= lineBreak %>I'm happy that I'm<%= lineBreak %>In a Party with you!\"", diff --git a/common/locales/en/spells.json b/common/locales/en/spells.json index fde9ef1872..9596959b6c 100644 --- a/common/locales/en/spells.json +++ b/common/locales/en/spells.json @@ -53,8 +53,13 @@ "spellSpecialSaltNotes": "Someone has snowballed you. Ha ha, very funny. Now get this snow off me!", "spellSpecialSpookDustText": "Spooky Sparkles", - "spellSpecialSpookDustNotes": "Turn your friends into a floating blanket with eyes!", + "spellSpecialSpookDustNotes": "Turn a friend into a floating blanket with eyes!", "spellSpecialOpaquePotionText": "Opaque Potion", - "spellSpecialOpaquePotionNotes": "Cancel the effects of Spooky Sparkles." + "spellSpecialOpaquePotionNotes": "Cancel the effects of Spooky Sparkles.", + + "spellSpecialFlowerText": "Shiny Seed", + "spellSpecialFlowerNotes": "Turn a friend into a joyous flower!", + "spellSpecialPetalFreePotionText": "Petal-Free Potion", + "spellSpecialPetalFreePotionNotes": "Cancel the effects of a Shiny Seed." } diff --git a/common/script/content.coffee b/common/script/content.coffee index 39b0050f7a..152344e93a 100644 --- a/common/script/content.coffee +++ b/common/script/content.coffee @@ -693,6 +693,8 @@ api.spells = notes: t('spellSpecialSnowballAuraNotes') cast: (user, target) -> target.stats.buffs.snowball = true + target.stats.buffs.spookDust = false + target.stats.buffs.flower = false target.achievements.snowball ?= 0 target.achievements.snowball++ user.items.special.snowball-- @@ -715,7 +717,9 @@ api.spells = target: 'user' notes: t('spellSpecialSpookDustNotes') cast: (user, target) -> + target.stats.buffs.snowball = false target.stats.buffs.spookDust = true + target.stats.buffs.flower = false target.achievements.spookDust ?= 0 target.achievements.spookDust++ user.items.special.spookDust-- @@ -731,6 +735,31 @@ api.spells = user.stats.buffs.spookDust = false user.stats.gp -= 5 + flower: + text: t('spellSpecialFlowerText') + mana: 0 + value: 15 + target: 'user' + notes: t('spellSpecialFlowerNotes') + cast: (user, target) -> + target.stats.buffs.snowball = false + target.stats.buffs.spookDust = false + target.stats.buffs.flower = true + target.achievements.flower ?= 0 + target.achievements.flower++ + user.items.special.flower-- + + petalFreePotion: + text: t('spellSpecialPetalFreePotionText') + mana: 0 + value: 5 + immediateUse: true + target: 'self' + notes: t('spellSpecialPetalFreePotionNotes') + cast: (user, target) -> + user.stats.buffs.flower = false + user.stats.gp -= 5 + nye: text: t('nyeCard') mana: 0 diff --git a/website/src/models/user.js b/website/src/models/user.js index 08f286eb41..7e7da0c0e7 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -44,6 +44,7 @@ var UserSchema = new Schema({ veteran: Boolean, snowball: Number, spookDust: Number, + flower: Number, streak: Number, challenges: Array, quests: Schema.Types.Mixed, @@ -191,6 +192,7 @@ var UserSchema = new Schema({ special:{ snowball: {type: Number, 'default': 0}, spookDust: {type: Number, 'default': 0}, + flower: {type: Number, 'default': 0}, valentine: Number, valentineReceived: Array, // array of strings, by sender name nye: Number, @@ -356,7 +358,8 @@ var UserSchema = new Schema({ stealth: {type: Number, 'default': 0}, streaks: {type: Boolean, 'default': false}, snowball: {type: Boolean, 'default': false}, - spookDust: {type: Boolean, 'default': false} + spookDust: {type: Boolean, 'default': false}, + flower: {type: Boolean, 'default': false} }, training: { int: {type: Number, 'default': 0}, diff --git a/website/views/options/inventory/inventory.jade b/website/views/options/inventory/inventory.jade index a5a5d599c9..75a8f1b787 100644 --- a/website/views/options/inventory/inventory.jade +++ b/website/views/options/inventory/inventory.jade @@ -53,13 +53,18 @@ script(type='text/ng-template', id='partials/options.inventory.seasonalshop.html p | {{::quest.value}}  span.Pet_Currency_Gem1x.inline-gems - // menu.pets-menu(label=env.t('seasonalItems')) + menu.pets-menu(label=env.t('seasonalItems')) div + button.customize-option(popover='{{::Content.spells.special.flower.notes()}}', popover-title='{{::Content.spells.special.flower.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='purchase("special", Content.spells.special.flower)', class='inventory_special_flower') + p + | {{::Content.spells.special.flower.value}} + span(class='shop_gold') + // div button.customize-option(popover='{{::Content.spells.special.snowball.notes()}}', popover-title='{{::Content.spells.special.snowball.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='purchase("special", Content.spells.special.snowball)', class='inventory_special_snowball') p | {{::Content.spells.special.snowball.value}} span(class='shop_gold') - div + // div button.customize-option(popover='{{::Content.spells.special.nye.notes()}}', popover-title='{{::Content.spells.special.nye.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='castStart(Content.spells.special.nye)', class='inventory_special_nye') p | {{Content.spells.special.nye.value}} @@ -143,6 +148,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') .badge.badge-info.stack-count {{user.items.special.#{k}}} +specialItem('snowball') +specialItem('spookDust') + +specialItem('flower') div(ng-if='user.items.special.valentineReceived[0]') button.customize-option(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")', class='inventory_special_valentine') diff --git a/website/views/shared/header/avatar.jade b/website/views/shared/header/avatar.jade index 075854b4e1..14957bf9d2 100644 --- a/website/views/shared/header/avatar.jade +++ b/website/views/shared/header/avatar.jade @@ -17,60 +17,62 @@ mixin avatar(opts) span.snowman span(ng-if='profile.stats.buffs.spookDust') span.spookman - span(ng-if='!profile.stats.buffs.snowball && !profile.stats.buffs.spookDust') + span(ng-if='profile.stats.buffs.flower') span(class='avatar_flower_{{profile.stats.class}}') + span(ng-if='!profile.stats.buffs.snowball && !profile.stats.buffs.spookDust && !profile.stats.buffs.flower') + // Back Accessory - span(class='{{profile.items.gear.equipped.back}}', ng-if='!profile.preferences.costume') - span(class='{{profile.items.gear.costume.back}}', ng-if='profile.preferences.costume') + span(class='{{profile.items.gear.equipped.back}}', ng-if='!profile.preferences.costume') + span(class='{{profile.items.gear.costume.back}}', ng-if='profile.preferences.costume') // Avatar - span(class='skin_{{profile.preferences.skin}}', ng-if='!profile.preferences.sleep') - span(class='skin_{{profile.preferences.skin}}_sleep', ng-if='profile.preferences.sleep') + span(class='skin_{{profile.preferences.skin}}', ng-if='!profile.preferences.sleep') + span(class='skin_{{profile.preferences.skin}}_sleep', ng-if='profile.preferences.sleep') // Shirt - span(class='{{profile.preferences.size}}_shirt_{{profile.preferences.shirt}}') + span(class='{{profile.preferences.size}}_shirt_{{profile.preferences.shirt}}') // Armor - span(class='{{profile.preferences.size}}_{{profile.items.gear.equipped.armor}}', ng-if='!profile.preferences.costume') - span(class='{{profile.preferences.size}}_{{profile.items.gear.costume.armor}}', ng-if='profile.preferences.costume') + span(class='{{profile.preferences.size}}_{{profile.items.gear.equipped.armor}}', ng-if='!profile.preferences.costume') + span(class='{{profile.preferences.size}}_{{profile.items.gear.costume.armor}}', ng-if='profile.preferences.costume') //- Cape collar - span(class='{{profile.items.gear.equipped.back}}_collar', ng-if='!profile.preferences.costume') - span(class='{{profile.items.gear.costume.back}}_collar', ng-if='profile.preferences.costume') + span(class='{{profile.items.gear.equipped.back}}_collar', ng-if='!profile.preferences.costume') + span(class='{{profile.items.gear.costume.back}}_collar', ng-if='profile.preferences.costume') // Body - span(class='{{profile.items.gear.equipped.body}}', ng-if='!profile.preferences.costume') - span(class='{{profile.items.gear.costume.body}}', ng-if='profile.preferences.costume') + span(class='{{profile.items.gear.equipped.body}}', ng-if='!profile.preferences.costume') + span(class='{{profile.items.gear.costume.body}}', ng-if='profile.preferences.costume') // Hair - span(class='head_0') - span(class='hair_base_{{profile.preferences.hair.base}}_{{profile.preferences.hair.color}}') - span(class='hair_bangs_{{profile.preferences.hair.bangs}}_{{profile.preferences.hair.color}}') - span(class='hair_mustache_{{profile.preferences.hair.mustache}}_{{profile.preferences.hair.color}}') - span(class='hair_beard_{{profile.preferences.hair.beard}}_{{profile.preferences.hair.color}}') + span(class='head_0') + span(class='hair_base_{{profile.preferences.hair.base}}_{{profile.preferences.hair.color}}') + span(class='hair_bangs_{{profile.preferences.hair.bangs}}_{{profile.preferences.hair.color}}') + span(class='hair_mustache_{{profile.preferences.hair.mustache}}_{{profile.preferences.hair.color}}') + span(class='hair_beard_{{profile.preferences.hair.beard}}_{{profile.preferences.hair.color}}') // Eyewear - span(class='{{profile.items.gear.equipped.eyewear}}', ng-if='!profile.preferences.costume') - span(class='{{profile.items.gear.costume.eyewear}}', ng-if='profile.preferences.costume') + span(class='{{profile.items.gear.equipped.eyewear}}', ng-if='!profile.preferences.costume') + span(class='{{profile.items.gear.costume.eyewear}}', ng-if='profile.preferences.costume') // Helm - span(class='{{profile.items.gear.equipped.head}}', ng-if='!profile.preferences.costume') - span(class='{{profile.items.gear.costume.head}}', ng-if='profile.preferences.costume') + span(class='{{profile.items.gear.equipped.head}}', ng-if='!profile.preferences.costume') + span(class='{{profile.items.gear.costume.head}}', ng-if='profile.preferences.costume') // Head Accessory - span(class='{{profile.items.gear.equipped.headAccessory}}', ng-if='!profile.preferences.costume') - span(class='{{profile.items.gear.costume.headAccessory}}', ng-if='profile.preferences.costume') + span(class='{{profile.items.gear.equipped.headAccessory}}', ng-if='!profile.preferences.costume') + span(class='{{profile.items.gear.costume.headAccessory}}', ng-if='profile.preferences.costume') // Flower span(class='hair_flower_{{profile.preferences.hair.flower}}') // Shield - span(class='{{profile.items.gear.equipped.shield}}', ng-if='!profile.preferences.costume') - span(class='{{profile.items.gear.costume.shield}}', ng-if='profile.preferences.costume') + span(class='{{profile.items.gear.equipped.shield}}', ng-if='!profile.preferences.costume') + span(class='{{profile.items.gear.costume.shield}}', ng-if='profile.preferences.costume') // Weapon - span(class='{{profile.items.gear.equipped.weapon}}', ng-if='!profile.preferences.costume') - span(class='{{profile.items.gear.costume.weapon}}', ng-if='profile.preferences.costume') + span(class='{{profile.items.gear.equipped.weapon}}', ng-if='!profile.preferences.costume') + span(class='{{profile.items.gear.costume.weapon}}', ng-if='profile.preferences.costume') // Mount Head diff --git a/website/views/shared/new-stuff.jade b/website/views/shared/new-stuff.jade index 23b9993f30..27a5e2ac49 100644 --- a/website/views/shared/new-stuff.jade +++ b/website/views/shared/new-stuff.jade @@ -1,19 +1,49 @@ -h5 4/1/2015 - HOSTILE FLOWER TAKEOVER OF JOY AND DOOM +h5 4/2/2015 - LAST CHANCE FOR MARCH ITEM SET; SHINY SEEDS; MESSAGE CHALLENGE CREATORS; ITEM DROP ICONS hr tr td - h5 Joy and Doom to All! - p THE SPRING FLING HAS FLUNG TOO FAR! Run while you can, Habiticans! The floral theme has come to life and is taking over Habitica with horrifying cheer, repeat, the flowers are taking over HMMMPH MMPH MMMHPPPH.... - .avatar_flower_wizard - p CELEBRATE FLOWER POWER. + h5 Last Chance for March Item Set + p Reminder: this is the final day to subscribe and receive the Aquamarine Item Set! If you want the Aquamarine Eyewear or the Aquamarine Armor, now's the time! Thanks so much for your support <3 + tr + td + .inventory_present.pull-right + p Cool! What could it be? All Habiticans who are subscribed during the month of April will receive the April Mystery Item Set! It will be revealed on the 25th, so keep your eyes peeled. Thanks for supporting the site <3 + p.small.muted by Lemoness + tr + td + + h5 Shiny Seeds + p Phew! Was that whole incident with the flowers just a colorful bad dream? But wait... what are these Shiny Seeds in the Seasonal Shop? br - p RESISTANCE IS SILLY. - p.small.muted by Lemoness and Baconsaur + .inventory_special_flower.pull-right + p Whatever you do, don't drop one of these on a party member! Or yourself! That could be floral, I mean, dangerous. + p.small.muted by Lemoness and SabreCat + tr + td + h5 Message Challenge Creators + p Now on the Challenges page, you can to click on the challenge creator's name to view their profile, message them, or to see how long ago they last logged in if you are curious about whether the challenge might still be active. + p.small.muted by TheHollidayInn + tr + td + .promo_item_notif.pull-right + h5 Icons in Notifications + p Now, when you find an item from scoring a task, an image of the item appears in the drop notification. Instant gratification when that egg or potion you've been hunting for finally appears! + p.small.muted by TheHollidayInn hr a(href='/static/old-news', target='_blank') Read older news mixin oldNews + h5 4/1/2015 - HOSTILE FLOWER TAKEOVER OF JOY AND DOOM + tr + td + h5 Joy and Doom to All! + p THE SPRING FLING HAS FLUNG TOO FAR! Run while you can, Habiticans! The floral theme has come to life and is taking over Habitica with horrifying cheer, repeat, the flowers are taking over HMMMPH MMPH MMMHPPPH.... + .avatar_flower_wizard + p CELEBRATE FLOWER POWER. + br + p RESISTANCE IS SILLY. + p.small.muted by Lemoness and Baconsaur h5 3/29/2015 - PASTEL SKIN, SHIMMER HAIR COLORS, SURVEY BADGES AWARDED, AND PARTY SORT ORDER tr td diff --git a/website/views/shared/profiles/achievements.jade b/website/views/shared/profiles/achievements.jade index dc2ef8a5d2..ca6ceb779a 100644 --- a/website/views/shared/profiles/achievements.jade +++ b/website/views/shared/profiles/achievements.jade @@ -178,6 +178,13 @@ div(ng-if='profile.achievements.spookDust') =env.t('alarmingFriendsText', {spookDust: "{{profile.achievements.spookDust}}"}) hr +div(ng-if='profile.achievements.flower') + .achievement.achievement-flower + h5=env.t('agriculturalFriends') + small + =env.t('agriculturalFriendsText', {flowers: "{{profile.achievements.flower}}"}) + hr + div(ng-if='::profile.achievements.habitBirthdays') .achievement.achievement-habitBirthday h5=env.t('habitBirthday') diff --git a/website/views/shared/tasks/lists.jade b/website/views/shared/tasks/lists.jade index 963190c2cf..29cd271fd0 100644 --- a/website/views/shared/tasks/lists.jade +++ b/website/views/shared/tasks/lists.jade @@ -97,7 +97,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template") p.task-text {{item.text()}} // Events - ul.items.rewards(ng-if='main && list.type=="reward" && (user.items.special.snowball>0 || user.stats.buffs.snowball || user.items.special.spookDust>0 || user.stats.buffs.spookDust)') + ul.items.rewards(ng-if='main && list.type=="reward" && (user.items.special.snowball>0 || user.stats.buffs.snowball || user.items.special.spookDust>0 || user.stats.buffs.spookDust || user.items.special.flower>0 || user.stats.buffs.flower)') mixin specialSpell(k,canceler) li.task.reward-item(ng-if='#{canceler ? "user.stats.buffs."+canceler : "user.items.special."+k+">0"}',popover-trigger='mouseenter', popover-placement='top', popover='{{Content.spells.special.#{k}.notes()}}') @@ -118,9 +118,10 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template") +specialSpell('snowball') +specialSpell('spookDust') - + +specialSpell('flower') +specialSpell('salt','snowball') +specialSpell('opaquePotion','spookDust') + +specialSpell('petalFreePotion','flower') // Actual List ul(class='{{list.type}}s main-list', ng-show='obj[list.type + "s"].length > 0', hrpg-sort-tasks)