diff --git a/public/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js index 003615e52a..c5567ce038 100644 --- a/public/js/controllers/notificationCtrl.js +++ b/public/js/controllers/notificationCtrl.js @@ -68,6 +68,11 @@ habitrpg.controller('NotificationCtrl', $rootScope.modals.achievements.beastMaster = true; }, true); + $rootScope.$watch('user.achievements.rebirths', function(after, before){ + if(after === before) return; + $rootScope.modals.achievements.rebirth = true; + }); + /*_.each(['weapon', 'head', 'chest', 'shield'], function(watched){ $rootScope.$watch('user.items.' + watched, function(before, after){ if (after == before) return; diff --git a/public/js/controllers/settingsCtrl.js b/public/js/controllers/settingsCtrl.js index 0efd6504c1..8ad6419a14 100644 --- a/public/js/controllers/settingsCtrl.js +++ b/public/js/controllers/settingsCtrl.js @@ -59,6 +59,12 @@ habitrpg.controller('SettingsCtrl', $rootScope.$state.go('tasks'); } + $scope.rebirth = function(){ + User.user.ops.rebirth({}); + $rootScope.modals.rebirth = false; + $rootScope.$state.go('tasks'); + } + $scope.changePassword = function(changePass){ if (!changePass.oldPassword || !changePass.newPassword || !changePass.confirmNewPassword) { return alert("Please fill out all fields"); diff --git a/public/js/services/guideServices.js b/public/js/services/guideServices.js index 975cb73ca2..96bc90f202 100644 --- a/public/js/services/guideServices.js +++ b/public/js/services/guideServices.js @@ -139,7 +139,10 @@ angular.module('guideServices', []). } }); - + $rootScope.$watch('user.flags.rebirthEnabled', function(after, before) { + if (alreadyShown(before, after)) return; + $rootScope.modals.rebirthEnabled = true; + }); /** diff --git a/src/models/user.js b/src/models/user.js index 8726e31e81..d6ea6e6e46 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -46,7 +46,9 @@ var UserSchema = new Schema({ snowball: Number, streak: Number, challenges: Array, - quests: Schema.Types.Mixed + quests: Schema.Types.Mixed, + rebirths: Number, + rebirthLevel: Number }, auth: { facebook: Schema.Types.Mixed, @@ -95,7 +97,8 @@ var UserSchema = new Schema({ partyEnabled: Boolean, // FIXME do we need this? contributor: Boolean, classSelected: {type: Boolean, 'default': false}, - mathUpdates: Boolean + mathUpdates: Boolean, + rebirthEnabled: {type: Boolean, 'default': false} }, history: { exp: Array, // [{date: Date, value: Number}], // big peformance issues if these are defined diff --git a/src/routes/apiv2.js b/src/routes/apiv2.js index a44d5e8b1c..065d152c8c 100644 --- a/src/routes/apiv2.js +++ b/src/routes/apiv2.js @@ -65,7 +65,8 @@ router['delete']('/user', auth.auth, user['delete']); router.post('/user/revive', auth.auth, cron, user.revive); // Shared.ops router.post('/user/reroll', auth.auth, cron, user.reroll); // Shared.ops router.post('/user/reset', auth.auth, user.reset); // Shared.ops -router.post('/user/sleep', auth.auth, cron, user.sleep); //Shared.opss +router.post('/user/sleep', auth.auth, cron, user.sleep); //Shared.ops +router.post('/user/rebirth', auth.auth, cron, user.rebirth); //Shared.ops router.post('/user/class/change', auth.auth, cron, user.changeClass); //Shared.ops | query={class} router.post('/user/class/allocate', auth.auth, cron, user.allocate); //Shared.ops | query={stat} diff --git a/views/options/inventory/inventory.jade b/views/options/inventory/inventory.jade index ce935dc15a..54f634682c 100644 --- a/views/options/inventory/inventory.jade +++ b/views/options/inventory/inventory.jade @@ -137,3 +137,8 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') p | {{Content.spells.special.snowball.value}} span.Pet_Currency_Gem1x.inline-gems + div(ng-show='user.flags.rebirthEnabled') + button.customize-option(popover='Begin a new character at Level 1 while retaining achievements, collectibles, and tasks with history.', popover-title='Orb of Rebirth', popover-trigger='mouseenter', popover-placement='left', ng-click='modals.rebirth = true', class='rebirth_orb') + p + | 8 + span.Pet_Currency_Gem1x.inline-gems diff --git a/views/shared/header/avatar.jade b/views/shared/header/avatar.jade index fd9ed71529..eb90fa239a 100644 --- a/views/shared/header/avatar.jade +++ b/views/shared/header/avatar.jade @@ -46,3 +46,4 @@ figure.herobox(ng-click='spell ? castEnd(profile, "user", $event) : clickMember( .avatar-level(ng-class='userLevelStyle(profile,"label")') i.icon-circle-arrow-up.icon-white(ng-show='profile.stats.buffs.str || profile.stats.buffs.per || profile.stats.buffs.con || profile.stats.buffs.int || profile.stats.buffs.stealth', tooltip='Buffed', style='margin-right:5px;') | Lvl {{profile.stats.lvl}} + i.icon-plus-sign.icon-white(ng-show='profile.achievements.rebirths', tooltip='Reborn, max level {{profile.achievements.rebirthLevel}}', style='margin-left:5px') diff --git a/views/shared/modals/achievements.jade b/views/shared/modals/achievements.jade index a30a15d2bd..ef14be21bf 100644 --- a/views/shared/modals/achievements.jade +++ b/views/shared/modals/achievements.jade @@ -7,7 +7,7 @@ div(modal='modals.achievements.streak') .achievement.achievement-thermometer | You have stacked your "Streaker" Achievement! Every 21 days of streak, you gain 1 achievement point here. .modal-footer - button.btn.btn-default.cancel(ng-click='modals.achievements.streak = false') Ok + button.btn.btn-default.cancel(ng-click='modals.achievements.streak = false') OK // Max Gear div(modal='modals.achievements.ultimateGear') @@ -17,7 +17,7 @@ div(modal='modals.achievements.ultimateGear') .achievement.achievement-armor | You have earned the "Ultimate Gear" Achievement for upgrading to the maximum gear set! .modal-footer - button.btn.btn-default.cancel(ng-click='modals.achievements.ultimateGear = false') Ok + button.btn.btn-default.cancel(ng-click='modals.achievements.ultimateGear = false') OK // Beast Master div(modal='modals.achievements.beastMaster') @@ -28,7 +28,7 @@ div(modal='modals.achievements.beastMaster') .achievement.achievement-rat | You have earned the "Beast Master" Achievement for collecting all the pets! .modal-footer - button.btn.btn-default.cancel(ng-click='modals.achievements.beastMaster = false') Ok + button.btn.btn-default.cancel(ng-click='modals.achievements.beastMaster = false') OK // Contributor div(modal='user.flags.contributor') @@ -40,7 +40,15 @@ div(modal='user.flags.contributor') {{user.profile.name}}, you awesome person! You're now a level {{user.contributor.level}} contributor for helping HabitRPG. See what prizes you've earned for your contribution! .modal-footer - button.btn.btn-default.cancel(ng-click='set({"flags.contributor":false})') Ok - + button.btn.btn-default.cancel(ng-click='set({"flags.contributor":false})') OK +//Rebirth +div(modal='modals.achievements.rebirth') + .modal-header + h3 Achievement! + .modal-body + .achievement.achievement-sun + | You've begun a new adventure! This is Rebirth {{user.achievements.rebirths}} for you, and the highest Level you've attained is {{user.achievements.rebirthLevel}}. To stack this Achievement, begin your next new adventure when you've reached an even higher Level! + .modal-footer + button.btn.btn-default.cancel(ng-click='modals.achievements.rebirth = false') OK diff --git a/views/shared/modals/index.jade b/views/shared/modals/index.jade index bb7dd5ac8e..db481615bb 100644 --- a/views/shared/modals/index.jade +++ b/views/shared/modals/index.jade @@ -8,4 +8,5 @@ include ./members include ./settings include ./drops include ./classes -include ./quests \ No newline at end of file +include ./quests +include ./rebirth \ No newline at end of file diff --git a/views/shared/modals/rebirth.jade b/views/shared/modals/rebirth.jade new file mode 100644 index 0000000000..0139276afd --- /dev/null +++ b/views/shared/modals/rebirth.jade @@ -0,0 +1,45 @@ +// Created by Sabe on 12/22/13. + +div(modal='modals.rebirthEnabled') + .modal-header + h3 Rebirth: New Adventure Available! + .modal-body + .rebirth_orb.pull-left(style='margin-right: 5px') + p + span. + You've unlocked Rebirth! This special Market item allows you to begin a new game at level 1 while keeping your tasks, achievements, pets, and more. Use it to breathe new life into HabitRPG if you feel you've achieved it all, or to experience new features with the fresh eyes of a beginning character! + .modal-footer + button.btn.btn-default.cancel(ng-click='modals.rebirthEnabled = false') Close + +div(modal='modals.rebirth') + .modal-header + h3 Rebirth: Begin a New Adventure + .modal-body + include ../gems + .rebirth_orb.pull-left(style='margin-right: 5px') + p Rebirth starts your character over from Level 1, as if you had created a new account. + br + p Your adventure begins anew with a clean slate: + .unordered + li You return to full Health. + li You have no Experience, Gold, or equipment. + li Your Habits, Dailies, and To-Dos reset to yellow, and streaks reset. + li You have the starting class of Warrior until you earn a new class. + br + p Your new character inherits a few things from their predecessor: + .unordered + li Tasks, history, and settings remain. + li Challenge, Guild, and Party memberships remain. + li Gems, backer tiers, and contributor levels remain. + li Items obtained from Gems or drops (such as pets and mounts) remain, though you cannot access them until you unlock them again. + br + .achievement-sun.pull-left(style='margin-right: 5px') + p You also earn an Achievement for beginning a new adventure! + .modal-footer + button.btn.btn-large.cancel(ng-click='modals.rebirth = false') Never mind + span(ng-if='user.balance < 2') + a.btn.btn-success.btn-large(ng-click="modals.buyGems = true") Buy More Gems + span.gem-cost Not enough Gems + span(ng-if='user.balance >= 2', ng-controller='SettingsCtrl') + a.btn.btn-danger.btn-large(ng-click='rebirth()') Be Reborn + span.gem-cost 8 Gems diff --git a/views/shared/profiles/achievements.jade b/views/shared/profiles/achievements.jade index ae71005565..0be4d10dcc 100644 --- a/views/shared/profiles/achievements.jade +++ b/views/shared/profiles/achievements.jade @@ -3,7 +3,6 @@ //
//
//
- //
//
//
//
@@ -57,6 +56,14 @@ small Has found all 90 pets (insanely difficult, give this user props!) hr + div(ng-if='profile.achievements.rebirths') + .achievement.achievement-sun + h5(ng-if='profile.achievements.rebirths == 1') Began a New Adventure + h5(ng-if='profile.achievements.rebirths > 1') Began {{profile.achievements.rebirths}} New Adventures + small. + Used an Orb of Rebirth to start over after attaining Level {{profile.achievements.rebirthLevel}}. + hr + div(ng-if='profile.achievements.helpedHabit') .achievement.achievement-tree h5 Helped Habit Grow @@ -100,4 +107,4 @@ .achievement.achievement-snowball h5 Annoying Friends small Got snowballed {{profile.achievements.snowball}} times by party members. - hr \ No newline at end of file + hr