chore(event): end Winter Wonderland

This commit is contained in:
Sabe Jones
2016-02-01 17:01:17 -05:00
parent d9dd031e7f
commit 0fcdc49adb
15 changed files with 380 additions and 405 deletions

View File

@@ -1,9 +1,9 @@
/* Comment out for holiday events */ /* Comment out for holiday events */
/* .npc_ian { .npc_ian {
background: url("/common/img/sprites/npc_ian.gif") no-repeat; background: url("/common/img/sprites/npc_ian.gif") no-repeat;
width: 78px; width: 78px;
height: 135px; height: 135px;
} */ }
.quest_burnout { .quest_burnout {
background: url("/common/img/sprites/quest_burnout.gif") no-repeat; background: url("/common/img/sprites/quest_burnout.gif") no-repeat;

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 KiB

After

Width:  |  Height:  |  Size: 364 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@@ -25,7 +25,7 @@
"polarBearPup": "Polar Bear Cub", "polarBearPup": "Polar Bear Cub",
"jackolantern": "Jack-O-Lantern", "jackolantern": "Jack-O-Lantern",
"seasonalShop": "Seasonal Shop", "seasonalShop": "Seasonal Shop",
"seasonalShopClosedTitle": "<%= linkStart %>Siena Leslie<%= linkEnd %>", "seasonalShopClosedTitle": "<%= linkStart %>Leslie<%= linkEnd %>",
"seasonalShopTitle": "<%= linkStart %>Seasonal Sorceress<%= linkEnd %>", "seasonalShopTitle": "<%= linkStart %>Seasonal Sorceress<%= linkEnd %>",
"seasonalShopClosedText": "The Seasonal Shop is currently closed!! I don't know where the Seasonal Sorceress is now, but I bet she'll be back during the next <a href='http://habitica.wikia.com/wiki/Grand_Galas' target='_blank'>Grand Gala</a>!", "seasonalShopClosedText": "The Seasonal Shop is currently closed!! I don't know where the Seasonal Sorceress is now, but I bet she'll be back during the next <a href='http://habitica.wikia.com/wiki/Grand_Galas' target='_blank'>Grand Gala</a>!",
"seasonalShopText": "Welcome to the Seasonal Shop!! We're stocking springtime <a href='http://habitica.wikia.com/wiki/Item_Availability' target='_blank'>Seasonal Edition</a> goodies at the moment. Everything here will be available to purchase during the Spring Fling event each year, but we're only open until April 30th, so be sure to stock up now, or you'll have to wait a year to buy these items again!", "seasonalShopText": "Welcome to the Seasonal Shop!! We're stocking springtime <a href='http://habitica.wikia.com/wiki/Item_Availability' target='_blank'>Seasonal Edition</a> goodies at the moment. Everything here will be available to purchase during the Spring Fling event each year, but we're only open until April 30th, so be sure to stock up now, or you'll have to wait a year to buy these items again!",

View File

@@ -25,9 +25,6 @@ let armor = {
notes: t('armorSpecialYetiNotes', { con: 9 }), notes: t('armorSpecialYetiNotes', { con: 9 }),
con: 9, con: 9,
value: 90, value: 90,
canBuy: () => {
return true;
},
}, },
ski: { ski: {
event: EVENTS.winter, event: EVENTS.winter,
@@ -36,9 +33,6 @@ let armor = {
notes: t('armorSpecialSkiNotes', { per: 15 }), notes: t('armorSpecialSkiNotes', { per: 15 }),
per: 15, per: 15,
value: 90, value: 90,
canBuy: () => {
return true;
},
}, },
candycane: { candycane: {
event: EVENTS.winter, event: EVENTS.winter,
@@ -47,9 +41,6 @@ let armor = {
notes: t('armorSpecialCandycaneNotes', { int: 9 }), notes: t('armorSpecialCandycaneNotes', { int: 9 }),
int: 9, int: 9,
value: 90, value: 90,
canBuy: () => {
return true;
},
}, },
snowflake: { snowflake: {
event: EVENTS.winter, event: EVENTS.winter,
@@ -58,9 +49,6 @@ let armor = {
notes: t('armorSpecialSnowflakeNotes', { con: 15 }), notes: t('armorSpecialSnowflakeNotes', { con: 15 }),
con: 15, con: 15,
value: 90, value: 90,
canBuy: () => {
return true;
},
}, },
birthday: { birthday: {
event: EVENTS.birthday, event: EVENTS.birthday,
@@ -138,9 +126,6 @@ let armor = {
notes: t('armorSpecialFallRogueNotes', { per: 15 }), notes: t('armorSpecialFallRogueNotes', { per: 15 }),
value: 90, value: 90,
per: 15, per: 15,
canBuy: () => {
return true;
},
}, },
fallWarrior: { fallWarrior: {
event: EVENTS.fall, event: EVENTS.fall,
@@ -149,9 +134,6 @@ let armor = {
notes: t('armorSpecialFallWarriorNotes', { con: 9 }), notes: t('armorSpecialFallWarriorNotes', { con: 9 }),
value: 90, value: 90,
con: 9, con: 9,
canBuy: () => {
return true;
},
}, },
fallMage: { fallMage: {
event: EVENTS.fall, event: EVENTS.fall,
@@ -160,9 +142,6 @@ let armor = {
notes: t('armorSpecialFallMageNotes', { int: 9 }), notes: t('armorSpecialFallMageNotes', { int: 9 }),
value: 90, value: 90,
int: 9, int: 9,
canBuy: () => {
return true;
},
}, },
fallHealer: { fallHealer: {
event: EVENTS.fall, event: EVENTS.fall,
@@ -171,9 +150,6 @@ let armor = {
notes: t('armorSpecialFallHealerNotes', { con: 15 }), notes: t('armorSpecialFallHealerNotes', { con: 15 }),
value: 90, value: 90,
con: 15, con: 15,
canBuy: () => {
return true;
},
}, },
winter2015Rogue: { winter2015Rogue: {
event: EVENTS.winter2015, event: EVENTS.winter2015,
@@ -182,9 +158,6 @@ let armor = {
notes: t('armorSpecialWinter2015RogueNotes', { per: 15 }), notes: t('armorSpecialWinter2015RogueNotes', { per: 15 }),
value: 90, value: 90,
per: 15, per: 15,
canBuy: () => {
return true;
},
}, },
winter2015Warrior: { winter2015Warrior: {
event: EVENTS.winter2015, event: EVENTS.winter2015,
@@ -193,9 +166,6 @@ let armor = {
notes: t('armorSpecialWinter2015WarriorNotes', { con: 9 }), notes: t('armorSpecialWinter2015WarriorNotes', { con: 9 }),
value: 90, value: 90,
con: 9, con: 9,
canBuy: () => {
return true;
},
}, },
winter2015Mage: { winter2015Mage: {
event: EVENTS.winter2015, event: EVENTS.winter2015,
@@ -204,9 +174,6 @@ let armor = {
notes: t('armorSpecialWinter2015MageNotes', { int: 9 }), notes: t('armorSpecialWinter2015MageNotes', { int: 9 }),
value: 90, value: 90,
int: 9, int: 9,
canBuy: () => {
return true;
},
}, },
winter2015Healer: { winter2015Healer: {
event: EVENTS.winter2015, event: EVENTS.winter2015,
@@ -215,9 +182,6 @@ let armor = {
notes: t('armorSpecialWinter2015HealerNotes', { con: 15 }), notes: t('armorSpecialWinter2015HealerNotes', { con: 15 }),
value: 90, value: 90,
con: 15, con: 15,
canBuy: () => {
return true;
},
}, },
birthday2015: { birthday2015: {
text: t('armorSpecialBirthday2015Text'), text: t('armorSpecialBirthday2015Text'),

View File

@@ -1180,52 +1180,92 @@ api.food = {
Meat: { Meat: {
text: t('foodMeat'), text: t('foodMeat'),
target: 'Base', target: 'Base',
article: '' article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
}, },
Milk: { Milk: {
text: t('foodMilk'), text: t('foodMilk'),
target: 'White', target: 'White',
article: '' article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
}, },
Potatoe: { Potatoe: {
text: t('foodPotatoe'), text: t('foodPotatoe'),
target: 'Desert', target: 'Desert',
article: 'a ' article: 'a ',
canBuy: (function() {
return true;
}),
canDrop: true,
}, },
Strawberry: { Strawberry: {
text: t('foodStrawberry'), text: t('foodStrawberry'),
target: 'Red', target: 'Red',
article: 'a ' article: 'a ',
canBuy: (function() {
return true;
}),
canDrop: true,
}, },
Chocolate: { Chocolate: {
text: t('foodChocolate'), text: t('foodChocolate'),
target: 'Shade', target: 'Shade',
article: '' article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
}, },
Fish: { Fish: {
text: t('foodFish'), text: t('foodFish'),
target: 'Skeleton', target: 'Skeleton',
article: 'a ' article: 'a ',
canBuy: (function() {
return true;
}),
canDrop: true,
}, },
RottenMeat: { RottenMeat: {
text: t('foodRottenMeat'), text: t('foodRottenMeat'),
target: 'Zombie', target: 'Zombie',
article: '' article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
}, },
CottonCandyPink: { CottonCandyPink: {
text: t('foodCottonCandyPink'), text: t('foodCottonCandyPink'),
target: 'CottonCandyPink', target: 'CottonCandyPink',
article: '' article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
}, },
CottonCandyBlue: { CottonCandyBlue: {
text: t('foodCottonCandyBlue'), text: t('foodCottonCandyBlue'),
target: 'CottonCandyBlue', target: 'CottonCandyBlue',
article: '' article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
}, },
Honey: { Honey: {
text: t('foodHoney'), text: t('foodHoney'),
target: 'Golden', target: 'Golden',
article: '' article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
}, },
Saddle: { Saddle: {
canBuy: (function() { canBuy: (function() {
@@ -1238,91 +1278,51 @@ api.food = {
Cake_Skeleton: { Cake_Skeleton: {
text: t('foodCakeSkeleton'), text: t('foodCakeSkeleton'),
target: 'Skeleton', target: 'Skeleton',
canBuy: (function() {
return true;
}),
canDrop: true,
article: '' article: ''
}, },
Cake_Base: { Cake_Base: {
text: t('foodCakeBase'), text: t('foodCakeBase'),
target: 'Base', target: 'Base',
canBuy: (function() {
return true;
}),
canDrop: true,
article: '' article: ''
}, },
Cake_CottonCandyBlue: { Cake_CottonCandyBlue: {
text: t('foodCakeCottonCandyBlue'), text: t('foodCakeCottonCandyBlue'),
target: 'CottonCandyBlue', target: 'CottonCandyBlue',
canBuy: (function() {
return true;
}),
canDrop: true,
article: '' article: ''
}, },
Cake_CottonCandyPink: { Cake_CottonCandyPink: {
text: t('foodCakeCottonCandyPink'), text: t('foodCakeCottonCandyPink'),
target: 'CottonCandyPink', target: 'CottonCandyPink',
canBuy: (function() {
return true;
}),
canDrop: true,
article: '' article: ''
}, },
Cake_Shade: { Cake_Shade: {
text: t('foodCakeShade'), text: t('foodCakeShade'),
target: 'Shade', target: 'Shade',
canBuy: (function() {
return true;
}),
canDrop: true,
article: '' article: ''
}, },
Cake_White: { Cake_White: {
text: t('foodCakeWhite'), text: t('foodCakeWhite'),
target: 'White', target: 'White',
canBuy: (function() {
return true;
}),
canDrop: true,
article: '' article: ''
}, },
Cake_Golden: { Cake_Golden: {
text: t('foodCakeGolden'), text: t('foodCakeGolden'),
target: 'Golden', target: 'Golden',
canBuy: (function() {
return true;
}),
canDrop: true,
article: '' article: ''
}, },
Cake_Zombie: { Cake_Zombie: {
text: t('foodCakeZombie'), text: t('foodCakeZombie'),
target: 'Zombie', target: 'Zombie',
canBuy: (function() {
return true;
}),
canDrop: true,
article: '' article: ''
}, },
Cake_Desert: { Cake_Desert: {
text: t('foodCakeDesert'), text: t('foodCakeDesert'),
target: 'Desert', target: 'Desert',
canBuy: (function() {
return true;
}),
canDrop: true,
article: '' article: ''
}, },
Cake_Red: { Cake_Red: {
text: t('foodCakeRed'), text: t('foodCakeRed'),
target: 'Red', target: 'Red',
canBuy: (function() {
return true;
}),
canDrop: true,
article: '' article: ''
}, },
Candy_Skeleton: { Candy_Skeleton: {

View File

@@ -1,16 +1,16 @@
.container-fluid .container-fluid
.stable.row: .col-xs-12 .stable.row: .col-xs-12
div(class="#{env.worldDmg.seasonalShop ? 'seasonalshop_broken' : 'seasonalshop_open'}").pull-left-sm.col-centered div(class="#{env.worldDmg.seasonalShop ? 'seasonalshop_broken' : 'seasonalshop_closed'}").pull-left-sm.col-centered
.popover.static-popover.fade.right.in.pull-left-sm.col-centered .popover.static-popover.fade.right.in.pull-left-sm.col-centered
.arrow.hidden-xs .arrow.hidden-xs
h3.popover-title!=env.t('seasonalShopTitle', {linkStart:"<a href='http://blog.habitrpg.com/who' target='_blank'>", linkEnd: "</a>"}) h3.popover-title!=env.t('seasonalShopClosedTitle', {linkStart:"<a href='http://blog.habitrpg.com/who' target='_blank'>", linkEnd: "</a>"})
.popover-content .popover-content
p(ng-if='!env.worldDmg.seasonalShop')!=env.t('seasonalShopWinterText') p(ng-if='!env.worldDmg.seasonalShop')!=env.t('seasonalShopClosedText')
p(ng-if='env.worldDmg.seasonalShop')!=env.t('seasonalShopFallTextBroken') p(ng-if='env.worldDmg.seasonalShop')!=env.t('seasonalShopClosedText')
.well(ng-if='User.user.achievements.rebirths > 0')=env.t('seasonalShopRebirth') // .well(ng-if='User.user.achievements.rebirths > 0')=env.t('seasonalShopRebirth')
li.customize-menu.inventory-gear // li.customize-menu.inventory-gear
menu.pets-menu(label='{{::label}}', ng-repeat='(set,label) in ::{yeti:env.t("yetiSet"), candycane:env.t("candycaneSet"), snowflake:env.t("snowflakeSet"), ski:env.t("skiSet"), winter2015Warrior:env.t("gingerbreadSet"), winter2015Mage:env.t("northMageSet"), winter2015Healer:env.t("soothingSkaterSet"), winter2015Rogue:env.t("icicleDrakeSet")}') menu.pets-menu(label='{{::label}}', ng-repeat='(set,label) in ::{yeti:env.t("yetiSet"), candycane:env.t("candycaneSet"), snowflake:env.t("snowflakeSet"), ski:env.t("skiSet"), winter2015Warrior:env.t("gingerbreadSet"), winter2015Mage:env.t("northMageSet"), winter2015Healer:env.t("soothingSkaterSet"), winter2015Rogue:env.t("icicleDrakeSet")}')
div(ng-repeat='item in ::getSeasonalShopArray(set)', div(ng-repeat='item in ::getSeasonalShopArray(set)',
ng-class="{transparent: user.items.gear.owned[item.key] !== undefined}") ng-class="{transparent: user.items.gear.owned[item.key] !== undefined}")
@@ -42,7 +42,7 @@
ng-click='purchase("special", Content.spells.special.snowball)') ng-click='purchase("special", Content.spells.special.snowball)')
p {{::Content.spells.special.snowball.value}} p {{::Content.spells.special.snowball.value}}
span(class='shop_gold') span(class='shop_gold')
// div div
button.customize-option(class='Pet_HatchingPotion_Peppermint', button.customize-option(class='Pet_HatchingPotion_Peppermint',
popover='{{::Content.hatchingPotions.Peppermint.notes()}}', popover='{{::Content.hatchingPotions.Peppermint.notes()}}',
popover-title!=env.t("potion", {potionType: "{{::Content.hatchingPotions.Peppermint.text()}}"}), popover-title!=env.t("potion", {potionType: "{{::Content.hatchingPotions.Peppermint.text()}}"}),
@@ -51,7 +51,7 @@
ng-click='purchase("hatchingPotions", Content.hatchingPotions.Peppermint)') ng-click='purchase("hatchingPotions", Content.hatchingPotions.Peppermint)')
p {{::Content.hatchingPotions.Peppermint.value}}&nbsp; p {{::Content.hatchingPotions.Peppermint.value}}&nbsp;
span.Pet_Currency_Gem1x.inline-gems span.Pet_Currency_Gem1x.inline-gems
// 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') 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}} p {{Content.spells.special.nye.value}}
span(class='shop_gold') span(class='shop_gold')

View File

@@ -85,7 +85,7 @@ mixin customizeProfile(mobile)
+buyPref('hair.color', ['rainbow','yellow','green','purple','blue','TRUred'], 'rainbowColors') +buyPref('hair.color', ['rainbow','yellow','green','purple','blue','TRUred'], 'rainbowColors')
+buyPref('hair.color', ['pblue2','pgreen2','porange2','ppink2','ppurple2','pyellow2'], 'shimmerColors', 'disabled') +buyPref('hair.color', ['pblue2','pgreen2','porange2','ppink2','ppurple2','pyellow2'], 'shimmerColors', 'disabled')
+buyPref('hair.color', ['candycorn','ghostwhite','halloween','midnight','pumpkin','zombie'], 'hauntedColors', 'disabled') +buyPref('hair.color', ['candycorn','ghostwhite','halloween','midnight','pumpkin','zombie'], 'hauntedColors', 'disabled')
+buyPref('hair.color', ['aurora','festive','hollygreen','peppermint','snowy','winterstar'], 'winteryColors') +buyPref('hair.color', ['aurora','festive','hollygreen','peppermint','snowy','winterstar'], 'winteryColors', 'disabled')
li.customize-menu li.customize-menu
menu(label=env.t('bodyHair')) menu(label=env.t('bodyHair'))

View File

@@ -1,47 +1,64 @@
h2 1/29/2016 - HABITICA BIRTHDAY BASH: CAKE, ACHIEVEMENTS, BIRTHDAY CARDS, AND PARTY ROBES! PLUS, LAST CHANCE FOR JANUARY AND WINTER WONDERLAND ITEMS h2 2/1/2016 - FEBRUARY MYSTERY BOX, VIDEO CHALLENGE WINNER, AND OFFICIAL MOBILE APP CHALLENGE
hr hr
tr tr
td td
.npc_matt.pull-right .inventory_present_02.pull-right
h3 Habitica Birthday Bash h3 February Mystery Box
p January 31st is Habitica's Birthday, and this year we have something extra-special to enjoy: Habitica has hit over one million users! Thank you so much for being here with us - it means a lot. p Ooh... What could it be? All Habiticans who are <a href='/#/options/settings/subscription'>subscribed</a> during the month of February will receive the February Mystery Item Set! It will be revealed on the 24th, so keep your eyes peeled. Thanks for supporting the site <3
p.small.muted by Lemoness
tr
td
h3 Video Challenge Winner
p The winner of the Official Challenge for sharing the video has been randomly selected, and the lucky Habitican is... Baggs98! Thanks so much to everyone who helped us spread the word. You guys are the best.
tr
td
h3 Official Mobile App Challenge
p Weve launched another Official Challenge: the <a href='/#/options/groups/challenges/c14e8130-b22f-4e60-9bcb-7a34e5756829'>Mobile App Download Challenge</a>! In case you missed it, Habitica now has both an <a href='https://itunes.apple.com/us/app/habitica/id994882113?ls=1&mt=8' target='_blank'>iOS app</a> and an <a href='https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica' target='_blank'>Android app</a> so that you can easily use Habitica on the go, and we hope that everyone who has one of those devices will give them a try!
br br
p Now come join us and the NPCs as we celebrate! p All you have to do to be eligible for the prize is have downloaded our iOS or Android app. The contest ends on February 29th, and the 10 randomly-selected winners will each get 10 Gems! For the full rules, <a href='/#/options/groups/challenges/c14e8130-b22f-4e60-9bcb-7a34e5756829'>check out the challenge here</a>.
tr
td
.Pet_Food_Cake_Base.pull-left.slight-right-margin
h3 Cake for Everybody!
p In honor of the festivities, everyone has been awarded an assortment of cake to feed to your pets! Yum, yum. Plus, for the next two days <a href='/#/options/inventory/drops'>Alexander the Merchant</a> is now selling cake in his shop, and cake will sometimes drop when you complete your tasks. Cake works just like normal pet food, but if you want to know what type of pet likes each slice, <a href='http://habitica.wikia.com/wiki/Food' target='_blank'>the wiki has spoilers</a>.
tr
td
.shop_armor_special_birthday2016.pull-left.slight-right-margin
h3 Party Robes
p Until February 1st only, there are Party Robes available for free in the <a href='/#/tasks'>Rewards column</a>! Don them with pride.
tr
td
.achievement-habitBirthday2x.pull-right
h3 Birthday Bash Achievement
p In honor of Habitica's birthday, everyone has been awarded the Habitica Birthday Bash achievement! This achievement stacks for each Birthday Bash you celebrate with us.
tr
td
.inventory_special_birthday.pull-right
h3 Birthday Cards
p You can now send <a href='/#/options/inventory/drops'>Birthday Cards</a> to your party mates! If you do so, you'll both get the Birthday Bonanza badge. These birthday cards will be available year-round for 10 Gold each.
tr
td
.promo_mystery_201601.pull-right
h3 Last Chance for January Item Set
p Reminder: this is the final day to <a href='/#/options/settings/subscription'>subscribe</a> and receive the Champion of Resolution Item Set! If you want the Resolution Slayer or the Helm of True Resolve, now's the time! Thanks so much for your support <3
tr
td
h3 Last Chance for Winter Wonderland Outfits & Hair Colors
p On February 1st, everything will be back to normal in Habitica, so if you still have any remaining Winter Wonderland Items that you want to buy, you'd better do it now! The <a href='/#/options/inventory/seasonalshop'>Seasonal Edition items</a> and <a href='/#/options/profile/avatar'>Hair Colors</a> won't be back until next December, and if the Limited Edition items return they will have increased prices or changed art, so strike while the iron is hot!
if menuItem !== 'oldNews' if menuItem !== 'oldNews'
hr hr
a(href='/static/old-news', target='_blank') Read older news a(href='/static/old-news', target='_blank') Read older news
mixin oldNews mixin oldNews
h2 1/29/2016 - HABITICA BIRTHDAY BASH: CAKE, ACHIEVEMENTS, BIRTHDAY CARDS, AND PARTY ROBES! PLUS, LAST CHANCE FOR JANUARY AND WINTER WONDERLAND ITEMS
tr
td
.npc_matt.pull-right
h3 Habitica Birthday Bash
p January 31st is Habitica's Birthday, and this year we have something extra-special to enjoy: Habitica has hit over one million users! Thank you so much for being here with us - it means a lot.
br
p Now come join us and the NPCs as we celebrate!
tr
td
.Pet_Food_Cake_Base.pull-left.slight-right-margin
h3 Cake for Everybody!
p In honor of the festivities, everyone has been awarded an assortment of cake to feed to your pets! Yum, yum. Plus, for the next two days <a href='/#/options/inventory/drops'>Alexander the Merchant</a> is now selling cake in his shop, and cake will sometimes drop when you complete your tasks. Cake works just like normal pet food, but if you want to know what type of pet likes each slice, <a href='http://habitica.wikia.com/wiki/Food' target='_blank'>the wiki has spoilers</a>.
tr
td
.shop_armor_special_birthday2016.pull-left.slight-right-margin
h3 Party Robes
p Until February 1st only, there are Party Robes available for free in the <a href='/#/tasks'>Rewards column</a>! Don them with pride.
tr
td
.achievement-habitBirthday2x.pull-right
h3 Birthday Bash Achievement
p In honor of Habitica's birthday, everyone has been awarded the Habitica Birthday Bash achievement! This achievement stacks for each Birthday Bash you celebrate with us.
tr
td
.inventory_special_birthday.pull-right
h3 Birthday Cards
p You can now send <a href='/#/options/inventory/drops'>Birthday Cards</a> to your party mates! If you do so, you'll both get the Birthday Bonanza badge. These birthday cards will be available year-round for 10 Gold each.
tr
td
.promo_mystery_201601.pull-right
h3 Last Chance for January Item Set
p Reminder: this is the final day to <a href='/#/options/settings/subscription'>subscribe</a> and receive the Champion of Resolution Item Set! If you want the Resolution Slayer or the Helm of True Resolve, now's the time! Thanks so much for your support <3
tr
td
h3 Last Chance for Winter Wonderland Outfits & Hair Colors
p On February 1st, everything will be back to normal in Habitica, so if you still have any remaining Winter Wonderland Items that you want to buy, you'd better do it now! The <a href='/#/options/inventory/seasonalshop'>Seasonal Edition items</a> and <a href='/#/options/profile/avatar'>Hair Colors</a> won't be back until next December, and if the Limited Edition items return they will have increased prices or changed art, so strike while the iron is hot!
h2 1/26/2016 - JANUARY SUBSCRIBER ITEM AND AVATAR CUSTOMIZATION IN THE ANDROID APP h2 1/26/2016 - JANUARY SUBSCRIBER ITEM AND AVATAR CUSTOMIZATION IN THE ANDROID APP
tr tr
td td