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)