diff --git a/common/img/sprites/spritesmith/misc/welcome_to_Habit_1.png b/common/img/sprites/spritesmith/misc/welcome_to_Habit_1.png new file mode 100644 index 0000000000..1830fb00e2 Binary files /dev/null and b/common/img/sprites/spritesmith/misc/welcome_to_Habit_1.png differ diff --git a/common/img/sprites/spritesmith/misc/welcome_to_Habit_2.png b/common/img/sprites/spritesmith/misc/welcome_to_Habit_2.png new file mode 100644 index 0000000000..cacb1bc564 Binary files /dev/null and b/common/img/sprites/spritesmith/misc/welcome_to_Habit_2.png differ diff --git a/common/img/sprites/spritesmith/misc/welcome_to_Habit_3.png b/common/img/sprites/spritesmith/misc/welcome_to_Habit_3.png new file mode 100644 index 0000000000..937fc6f1e6 Binary files /dev/null and b/common/img/sprites/spritesmith/misc/welcome_to_Habit_3.png differ diff --git a/common/img/sprites/spritesmith/misc/welcome_to_Habit_4.png b/common/img/sprites/spritesmith/misc/welcome_to_Habit_4.png new file mode 100644 index 0000000000..2c0afb2743 Binary files /dev/null and b/common/img/sprites/spritesmith/misc/welcome_to_Habit_4.png differ diff --git a/common/locales/en/defaultTasks.json b/common/locales/en/defaultTasks.json index 0cf2f31550..48e405ab6f 100644 --- a/common/locales/en/defaultTasks.json +++ b/common/locales/en/defaultTasks.json @@ -1,11 +1,12 @@ { - "defaultHabit1Text": "Good Habit", + "defaultTaskNotes": " ", + "defaultHabit1Text": "Productive Work (Click the pencil to edit)", "defaultHabit1Notes": "Sample Good Habits: + Eat a vegetable +15 minutes productive work", - "defaultHabit2Text": "Bad Habit", + "defaultHabit2Text": "Eat Junk Food (Click the pencil to edit)", "defaultHabit2Notes": "Sample Bad Habits: - Smoke - Procrastinate", - "defaultHabit3Text": "Good or Bad Habit", + "defaultHabit3Text": "Take the Stairs/Elevator (Click the pencil to edit)", "defaultHabit3Notes": "Sample Good or Bad Habits: +/- Took Stairs/Elevator ; +/- Drank Water/Soda", "defaultDaily1Text": "1h Personal Project", @@ -44,7 +45,7 @@ "defaultTodo5Text": "Start a Party (private group) with your friends (Social > Party)", - "defaultReward1Text": "1 Episode of Game of Thrones", + "defaultReward1Text": "15 minute break", "defaultReward1Notes": "Custom rewards can come in many forms. Some people will hold off watching their favorite show unless they have the gold to pay for it.", "defaultReward2Text": "Cake", diff --git a/common/locales/en/generic.json b/common/locales/en/generic.json index 576a7bed2c..6febe9241f 100644 --- a/common/locales/en/generic.json +++ b/common/locales/en/generic.json @@ -54,7 +54,7 @@ "gems": "Gems", "gemButton": "You have <%= number %> Gems.", "moreInfo": "More Info", - "gemsWhatFor": "Purchased using real money. Used for buying special items and services (eggs, hatching potions, Fortify, etc.). You'll need to unlock those features before being able to use Gems.", + "gemsWhatFor": "Click to buy Gems! Gems let you purchase special items like Quests, avatar customizations, and seasonal equipment.", "veteran": "Veteran", "veteranText": "Has weathered Habit The Grey (our pre Angular website), and has gained many battle-scars from its bugs.", "originalUser": "Original User!", diff --git a/common/locales/en/npc.json b/common/locales/en/npc.json index e0a6403dcf..213d85ea8f 100644 --- a/common/locales/en/npc.json +++ b/common/locales/en/npc.json @@ -50,8 +50,34 @@ "tourStatsPage": "This is your Stats page! Earn achievements by completing the listed tasks.", "tourTavernPage": "Welcome to the Tavern, an all-ages chatroom! You can freeze your account in case of illness or travel by clicking \"Rest in the Inn.\" Come say hi!", "tourPartyPage": "Your Party will help you stay accountable. Invite friends to unlock a Quest Scroll!", - "tourGuildsPage": "Guilds are social groups with common themes. Search for the subjects that interest you! We recommend the Newbies Guild.", - "tourChallengesPage": "Joining a Challenge will add tasks to your account. Compete against other users to win gem prizes!", - "tourMarketPage": "Starting at Level 4, eggs and hatching potions drop randomly when you complete tasks. They appear here - use them to hatch pets! You can also buy items from the Market." + "tourGuildsPage": "Guilds are common-interest chat groups created by the players, for the players. Browse through the list and join the Guilds that interest you. Be sure to check out the popular Newbies Guild, where anyone can ask questions about HabitRPG!", + "tourChallengesPage": "Joining a Challenge will add tasks to your account. Compete against other users to win Gem prizes!", + "tourMarketPage": "Starting at Level 4, eggs and hatching potions drop randomly when you complete tasks. They appear here - use them to hatch pets! You can also buy items from the Market.", + "tourHallPage": "Welcome to the Hall of Heroes, where open-source contributors to HabitRPG are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned Gems, exclusive equipment, and prestigious titles. You can contribute to HabitRPG, too!", + "tourPetsPage": "This is the Stable! After level 4, you can hatch pets using eggs and potions. When you hatch a pet in the Market, it will appear here! Click a pet's image to add it to your avatar. Feed them with the food you find after level 4, and they'll grow into powerful mounts.", + "tourMountsPage": "Once you've fed a pet enough food to turn it into a mount, it will appear here. (Pets, mounts, and food are available after level 4.) Click a mount to saddle up!", + "tourEquipmentPage": "This is where your Equipment is stored! Your Battle Gear affects your stats. If you want to show different Equipment on your avatar without changing your stats, click \"Enable Costume.\"", + "tourOkay": "Okay!", + + "tourAvatar1": "Your Avatar", + "tourAvatar1Proceed": "Take me there!", + "tourAvatar2": "Customize Avatar", + "tourToDosBrief": "To-Do List", + "tourDailiesBrief": "Daily Tasks", + "tourDailiesProceed": "I'll be careful!", + "tourHabitsBrief": "Good & Bad Habits", + "tourHabitsProceed": "Makes sense!", + "tourRewardsBrief": "Reward List", + "tourRewardsProceed": "Can't wait!", + "tourQuestions": "More Questions?", + "tourQuestionsProceed": "I will!", + + "welcomeToHabit": "Welcome to HabitRPG, a game to improve your life!", + "welcome1": "Create and customize an in-game avatar to represent you.", + "welcome2": "Your real-life tasks affect your avatar's Health (HP), Experience (XP), and Gold!", + "welcome3": "Complete tasks to earn Experience (XP) and Gold, which unlock awesome features and rewards!", + "welcome4": "Avoid bad habits that drain Health (HP), or your avatar will die!", + "welcome5": "Now Justin the Guide will teach you how to use your task dashboard...", + "imReady": "I'm Ready!" } diff --git a/common/locales/en/tasks.json b/common/locales/en/tasks.json index 885eb9dddc..b98352c84e 100644 --- a/common/locales/en/tasks.json +++ b/common/locales/en/tasks.json @@ -78,5 +78,22 @@ "pushTaskToTop": "Push task to top", "pushTaskToBottom": "Push task to bottom", "emptyTask": "Enter the task's title first.", - "dailiesRestingInInn": "You're Resting in the Inn! Your Dailies will NOT hurt you tonight, but they WILL still refresh every day. If you're in a quest, you won't deal damage/collect items until you check out of the Inn, but you can still be injured by a Boss if your Party mates skip their own Dailies." + "dailiesRestingInInn": "You're Resting in the Inn! Your Dailies will NOT hurt you tonight, but they WILL still refresh every day. If you're in a quest, you won't deal damage/collect items until you check out of the Inn, but you can still be injured by a Boss if your Party mates skip their own Dailies.", + "habitHelp1": "Good Habits are things that you do often. They award Gold and Experience every time you click the <%= plusIcon %>.", + "habitHelp2": "Bad Habits are things you want to avoid doing. They remove Health every time you click the <%= minusIcon %>.", + "habitHelp3": "For inspiration, check out <%= linkStart %>these sample Habits<%= linkEnd %>.", + "newbieGuild": "More questions? Ask in the <%= linkStart %>Newbies Guild<%= linkEnd %>!", + "dailyHelp1": "Dailies repeat <%= emphasisStart %>every day<%= emphasisEnd %> that they are active. Click the <%= pencilIcon %> to change the days a Daily is active.", + "dailyHelp2": "If you don't complete active Dailies, you lose Health when your day rolls over.", + "dailyHelp3": "Dailies turn <%= emphasisStart %>redder<%= emphasisEnd %> when you miss them, and <%= emphasisStart %>bluer<%= emphasisEnd %> when you complete them. The redder the Daily, the more it will reward you... or hurt you.", + "dailyHelp4": "To change when your day rolls over, go to <%= linkStart %> Settings > Site<%= linkEnd %> > Custom Day Start.", + "dailyHelp5": "For inspiration, check out these <%= linkStart %>sample Dailies<%= linkEnd %>!", + "toDoHelp1": "To-Dos start yellow, and get redder (more valuable) the longer it takes to complete them.", + "toDoHelp2": "To-Dos never hurt you! They only award Gold and Experience.", + "toDoHelp3": "Breaking a To-Do down into a checklist of smaller items will make it less scary, and will increase your points!", + "toDoHelp4": "For inspiration, check out these <%= linkStart %>sample To-Dos<%= linkEnd %>!", + "rewardHelp1": "The Equipment you buy for your avatar is stored in <%= linkStart %>Inventory > Equipment<%= linkEnd %>.", + "rewardHelp2": "Equipment affects your stats (<%= linkStart %>Avatar > Stats<%= linkEnd %>).", + "rewardHelp3": "Special equipment will appear here during World Events.", + "rewardHelp4": "Don't be afraid to set custom Rewards! Check out some samples <%= linkStart %>here<%= linkEnd %>." } diff --git a/common/script/content.coffee b/common/script/content.coffee index cc415e054d..bd8a0d25a0 100644 --- a/common/script/content.coffee +++ b/common/script/content.coffee @@ -1852,9 +1852,9 @@ _.each api.subscriptionBlocks, (b,k)->b.key = k repeat = {m:true,t:true,w:true,th:true,f:true,s:true,su:true} api.userDefaults = habits: [ - {type: 'habit', text: t('defaultHabit1Text'), notes: t('defaultHabit1Notes'), value: 0, up: true, down: false, attribute: 'str' } - {type: 'habit', text: t('defaultHabit2Text'), notes: t('defaultHabit2Notes'), value: 0, up: false, down: true, attribute: 'str'} - {type: 'habit', text: t('defaultHabit3Text'), notes: t('defaultHabit3Notes'), value: 0, up: true, down: true, attribute: 'str'} + {type: 'habit', text: t('defaultHabit1Text'), notes: t('defaultTaskNotes'), value: 0, up: true, down: false, attribute: 'per' } + {type: 'habit', text: t('defaultHabit2Text'), notes: t('defaultTaskNotes'), value: 0, up: false, down: true, attribute: 'str'} + {type: 'habit', text: t('defaultHabit3Text'), notes: t('defaultTaskNotes'), value: 0, up: true, down: true, attribute: 'str'} ] dailys: [ @@ -1873,7 +1873,7 @@ api.userDefaults = ] rewards: [ -# {type: 'reward', text: t('defaultReward1Text'), notes: t('defaultReward1Notes'), value: 20 } + {type: 'reward', text: t('defaultReward1Text'), notes: t('defaultTaskNotes'), value: 10 } # {type: 'reward', text: t('defaultReward2Text'), notes: t('defaultReward2Notes'), value: 10 } ] diff --git a/website/public/js/controllers/tasksCtrl.js b/website/public/js/controllers/tasksCtrl.js index c070727f8f..652a9386e4 100644 --- a/website/public/js/controllers/tasksCtrl.js +++ b/website/public/js/controllers/tasksCtrl.js @@ -15,7 +15,6 @@ habitrpg.controller("TasksCtrl", ['$scope', '$rootScope', '$location', 'User','N break; case 'todo': $rootScope.playSound('ToDo'); - Guide.goto('intro', 1); break; default: if (direction === 'down') $rootScope.playSound('Minus_Habit'); diff --git a/website/public/js/services/guideServices.js b/website/public/js/services/guideServices.js index 3a0a37bd95..dc609ab550 100644 --- a/website/public/js/services/guideServices.js +++ b/website/public/js/services/guideServices.js @@ -10,73 +10,57 @@ function($rootScope, User, $timeout, $state) { var chapters = { intro: [ - [ //0 + [ + { + state: 'tasks', + element: ".main-herobox", + content: window.env.t('tourAvatar1'), + placement: "right", + proceed: window.env.t('tourAvatar1Proceed') + }, + { + state: 'options.profile.avatar', + element: '.tab-content.ng-scope', + content: window.env.t('tourAvatar2'), + placement: "top", + proceed: window.env.t('tourOkay'), + backdrop: false, + orphan: true + }, { state: 'tasks', element: ".task-column.todos", - content: window.env.t('tourWelcome'), - placement: "top" - } - ], [ //1 + content: window.env.t('tourToDosBrief'), + placement: "top", + proceed: window.env.t('tourOkay') + }, { - state: 'tasks', - element: '.sticky-wrapper', - content: window.env.t('tourExp'), - placement: 'bottom' - }, { state: 'tasks', element: ".task-column.dailys", - content: window.env.t('tourDailies'), - placement: "top" - } - ], [ //2 + content: window.env.t('tourDailiesBrief'), + placement: "top", + proceed: window.env.t('tourDailiesProceed') + }, { - orphan: true, - content: window.env.t('tourCron'), - placement: 'bottom' - }, { - state: 'tasks', - element: '.meter.health', - content: window.env.t('tourHP'), - placement: 'bottom' - }, { state: 'tasks', element: ".task-column.habits", - content: window.env.t('tourHabits'), - placement: "right" - } - ], [ //3 + content: window.env.t('tourHabitsBrief'), + placement: "right", + proceed: window.env.t('tourHabitsProceed') + }, { - state: 'tasks', - element: ".hero-stats", - content: window.env.t('tourStats') - }, { state: 'tasks', element: ".task-column.rewards", - content: window.env.t('tourGP'), - placement: 'left' - } - ], [ //4 + content: window.env.t('tourRewardsBrief'), + placement: "left", + proceed: window.env.t('tourRewardsProceed') + }, { state: 'tasks', - element: '.main-herobox', - content: window.env.t('tourAvatar'), - placement: 'bottom' - } - ], [ //5 - { - state: 'options.profile.avatar', + content: window.env.t('tourQuestions'), + proceed: window.env.t('tourQuestionsProceed'), orphan: true, - content: window.env.t('tourScrollDown') - }, { - element: "ul.toolbar-nav", - backdrop:false, - content: window.env.t('tourMuchMore'), - placement: "bottom", - final: true, - //onHidden: function(){ - // $rootScope.$watch('user.flags.customizationsNotification', _.partial(goto, 'intro', 4)); - //} + final: true } ] ], @@ -114,42 +98,80 @@ function($rootScope, User, $timeout, $state) { { orphan: true, content: window.env.t('tourStatsPage'), - final: true + final: true, + proceed: window.env.t('tourOkay') } ]], tavern: [[ { orphan: true, content: window.env.t('tourTavernPage'), - final: true + final: true, + proceed: window.env.t('tourOkay') } ]], party: [[ { orphan: true, content: window.env.t('tourPartyPage'), - final: true + final: true, + proceed: window.env.t('tourOkay') } ]], guilds: [[ { orphan: true, content: window.env.t('tourGuildsPage'), - final: true + final: true, + proceed: window.env.t('tourOkay') } ]], challenges: [[ { orphan: true, content: window.env.t('tourChallengesPage'), - final: true + final: true, + proceed: window.env.t('tourOkay') } ]], market: [[ { orphan: true, content: window.env.t('tourMarketPage'), - final: true + final: true, + proceed: window.env.t('tourOkay') + } + ]], + hall: [[ + { + orphan: true, + content: window.env.t('tourHallPage'), + final: true, + proceed: window.env.t('tourOkay') + } + ]], + pets: [[ + { + orphan: true, + content: window.env.t('tourPetsPage'), + final: true, + proceed: window.env.t('tourOkay') + } + ]], + mounts: [[ + { + orphan: true, + content: window.env.t('tourMountsPage'), + final: true, + proceed: window.env.t('tourOkay') + } + ]], + equipment: [[ + { + orphan: true, + content: window.env.t('tourEquipmentPage'), + final: true, + proceed: window.env.t('tourOkay') } ]] } @@ -185,31 +207,23 @@ function($rootScope, User, $timeout, $state) { var showFinish = step.final || k == 'classes'; var showCounter = k=='intro' && !step.final; - // Experiment wud1Ba5qT1m9qR3PP0-Mmg , remove this when experiment complete - // 0=No Finish; Yes Counter 1=No Finish; No Counter 2=Yes Finish; Yes Counter 3=Yes Finish; No Counter - showFinish = showFinish || $rootScope.variant==2 || $rootScope.variant==3; - showCounter = showCounter && ($rootScope.variant==0 || $rootScope.variant==2); - - // FIXME temporarily set finish & counter on until we can get experiment working - showFinish=true;showCounter=true; - return ''; }, - storage: false, + storage: false //onEnd: function(){ // User.set({'flags.showTour': false}); //} @@ -218,6 +232,7 @@ function($rootScope, User, $timeout, $state) { var goto = function(chapter, page, force) { //return; // TODO temporarily remove old tutorial system while experimenting with leslie's new gettup + if (chapter == 'intro') User.set({'flags.welcomed': true}); var curr = User.user.flags.tour[chapter]; if (page != curr+1 && !force) return; var updates = {};updates['flags.tour.'+chapter] = page; @@ -243,21 +258,27 @@ function($rootScope, User, $timeout, $state) { if (!updateFn) return; // only run after user has been wrapped watcher(); // deregister watcher if (window.env.IS_MOBILE) return; // Don't show tour immediately on mobile devices - goto('intro', 0); // kick off first step on first visit + if (User.user.flags.welcomed == false) { + $rootScope.openModal('welcome', {size: 'lg', backdrop: 'static', keyboard: false}); + } var alreadyShown = function(before, after) { return !(!before && after === true) }; //$rootScope.$watch('user.flags.dropsEnabled', _.flow(alreadyShown, function(already) { //FIXME requires lodash@~3.2.0 $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){ switch (toState.name) { - case 'options.profile.avatar': return goto('intro', 5); - case 'options.profile.stats': return goto('stats', 0); - case 'options.social.tavern': return goto('tavern', 0); - case 'options.social.party': return goto('party', 0); - case 'options.social.guilds': return goto('guilds', 0); - case 'options.social.challenges':return goto('challenges', 0); - case 'options.inventory.drops': return goto('market', 0); + // case 'options.profile.avatar': return goto('intro', 5); + case 'options.profile.stats': return goto('stats', 0); + case 'options.social.tavern': return goto('tavern', 0); + case 'options.social.party': return goto('party', 0); + case 'options.social.guilds.public': return goto('guilds', 0); + case 'options.social.challenges': return goto('challenges', 0); + case 'options.social.hall.heroes': return goto('hall', 0); + case 'options.inventory.drops': return goto('market', 0); + case 'options.inventory.pets': return goto('pets', 0); + case 'options.inventory.mounts': return goto('mounts', 0); + case 'options.inventory.equipment': return goto('equipment', 0); } - }) + }); $rootScope.$watch('user.flags.dropsEnabled', function(after, before) { if (alreadyShown(before,after)) return; var eggs = User.user.items.eggs || {}; diff --git a/website/src/models/user.js b/website/src/models/user.js index 60385abfbb..070ab2701f 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -129,7 +129,11 @@ var UserSchema = new Schema({ party: {type: Number, 'default': -1}, guilds: {type: Number, 'default': -1}, challenges: {type: Number, 'default': -1}, - market: {type: Number, 'default': -1} + market: {type: Number, 'default': -1}, + pets: {type: Number, 'default': -1}, + mounts: {type: Number, 'default': -1}, + hall: {type: Number, 'default': -1}, + equipment: {type: Number, 'default': -1} }, dropsEnabled: {type: Boolean, 'default': false}, itemsEnabled: {type: Boolean, 'default': false}, @@ -149,7 +153,8 @@ var UserSchema = new Schema({ // Needed to track the tip to send inside the email weeklyRecapEmailsPhase: {type: Number, 'default': 0}, communityGuidelinesAccepted: {type: Boolean, 'default': false}, - cronCount: {type:Number, 'default':0} + cronCount: {type:Number, 'default':0}, + welcomed: {type: Boolean, 'default': false} }, history: { exp: Array, // [{date: Date, value: Number}], // big peformance issues if these are defined diff --git a/website/views/shared/modals/index.jade b/website/views/shared/modals/index.jade index f8f5433996..a64701f60c 100644 --- a/website/views/shared/modals/index.jade +++ b/website/views/shared/modals/index.jade @@ -11,3 +11,4 @@ include ./quests include ./rebirth include ./limited include ./invite-friends +include ./welcome.jade diff --git a/website/views/shared/modals/welcome.jade b/website/views/shared/modals/welcome.jade new file mode 100644 index 0000000000..bf8fe48dd1 --- /dev/null +++ b/website/views/shared/modals/welcome.jade @@ -0,0 +1,18 @@ +// Created by sabrecat on 5/18/15. + +script(type='text/ng-template', id='modals/welcome.html') + .modal-header + h4=env.t('welcomeToHabit') + .modal-body.text-center + h4=env.t('welcome1') + .welcome_to_Habit_1.center-block + h4=env.t('welcome2') + .welcome_to_Habit_2.center-block + h4=env.t('welcome3') + .welcome_to_Habit_3.center-block + h4=env.t('welcome4') + .welcome_to_Habit_4.center-block + .modal-footer + span.h4=env.t('welcome5') + |  + span.button.btn.btn-primary(ng-click='$close(); Guide.goto("intro",0)')=env.t('imReady') \ No newline at end of file diff --git a/website/views/shared/tasks/lists.jade b/website/views/shared/tasks/lists.jade index 4bd9629a21..242e531436 100644 --- a/website/views/shared/tasks/lists.jade +++ b/website/views/shared/tasks/lists.jade @@ -25,35 +25,32 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template") div(ng-if='list.help', ng-switch='::list.type') div(ng-switch-when='habit') ul - li Good Habits are things that you do often. They award gold and experience every time you click the +. - li Bad Habits are things you want to avoid doing. They remove health every time you click the -. - li For inspiration, check out these sample Habits - li More questions? Ask in the Newbies Guild! + li!=env.t('habitHelp1', {plusIcon:""}) + li!=env.t('habitHelp2', {minusIcon:""}) + li!=env.t('habitHelp3') + li!=env.t('newbieGuild', {linkStart:"", linkEnd: ""}) div(ng-switch-when='daily') ul - li Dailies repeat every day that they are active. Click the pencil icon to change the days a Daily is active. - li If you don’t complete active Dailies, they will hurt your avatar when your day rolls over. - li Dailies turn redder when you miss them, and bluer when you complete them. The redder the Daily, the more it will reward you... and hurt you. - li To change when your day rolls over, go to Settings > Site > Custom Day Start. - li For inspiration, check out these sample Dailies! - li More questions? Ask in the Newbies Guild! - + li!=env.t('dailyHelp1', {emphasisStart:"", emphasisEnd:"", pencilIcon:""}) + li!=env.t('dailyHelp2') + li!=env.t('dailyHelp3', {emphasisStart:"", emphasisEnd:""}) + li!=env.t('dailyHelp4', {linkStart:"", linkEnd:""}) + li!=env.t('dailyHelp5') + li!=env.t('newbieGuild', {linkStart:"", linkEnd: ""}) div(ng-switch-when='todo') ul - li To-Dos start yellow, and get redder (more valuable) the longer it takes to complete them. - li To-Dos never hurt you! They only award gold and experience. - li Breaking a To-Do down into a small checklist will make it less scary, and will increase your points! - li For inspiration, check out these sample To-Dos! - li More questions? Ask in the Newbies Guild! - + li!=env.t('toDoHelp1') + li!=env.t('toDoHelp2') + li!=env.t('toDoHelp3') + li!=env.t('toDoHelp4') + li!=env.t('newbieGuild', {linkStart:"", linkEnd: ""}) div(ng-switch-when='reward') ul - li The Equipment you buy for your avatar is stored in Inventory > Equipment. - li Equipment affects your stats (Avatar > Stats). - li There will be special equipment here during World Events. - li Don't be afraid to set custom rewards! Check out some samples here - li More questions? Ask in the Newbies Guild! - + li!=env.t('rewardHelp1', {linkStart:"", linkEnd: ""}) + li!=env.t('rewardHelp2', {linkStart:"", linkEnd: ""}) + li!=env.t('rewardHelp3') + li!=env.t('rewardHelp4') + li!=env.t('newbieGuild', {linkStart:"", linkEnd: ""}) // Todo Chart .todos-chart(ng-if='::list.type == "todo"', ng-show='charts.todos')