mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
* Changed files to fix Bug 7958: - website/client-old/.../userCtrl.js#38: removed to keep inventory constant - website/common/.../changeClass.js#33: removed to stop 'classes' introduction * Adjustments following Bug Review - Removed remaining 'foundKey' logic - Adjusted test logic to reflect feature change * Reverting userCtrl.js to development version - Reintroduces "classes" Guide tour * New version of Fixes #7958 - Changed logic to only notify user the first time they choose a class - Changed message to represent this change in logic - #LINT: Cleaned interface for changing class - New method: enableClasses() -- because, really, should we be calling User.changeClass({}) from the UX? - New method: payForNewClass() -- handles prompting the user to confirm that they want to change class * Remove new User Flag, use flags.tour.classes * Whoopsie. Fix PR conflict. * Changed files to fix Bug 7958: - website/client-old/.../userCtrl.js#38: removed to keep inventory constant - website/common/.../changeClass.js#33: removed to stop 'classes' introduction * Adjustments following Bug Review - Removed remaining 'foundKey' logic - Adjusted test logic to reflect feature change * Reverting userCtrl.js to development version - Reintroduces "classes" Guide tour * New version of Fixes #7958 - Changed logic to only notify user the first time they choose a class - Changed message to represent this change in logic - #LINT: Cleaned interface for changing class - New method: enableClasses() -- because, really, should we be calling User.changeClass({}) from the UX? - New method: payForNewClass() -- handles prompting the user to confirm that they want to change class * Remove new User Flag, use flags.tour.classes * Whoopsie. Fix PR conflict. * Removed Extraneous Flag * Removed Extraneous Flag * Changed files to fix Bug 7958: - website/client-old/.../userCtrl.js#38: removed to keep inventory constant - website/common/.../changeClass.js#33: removed to stop 'classes' introduction * New version of Fixes #7958 - Changed logic to only notify user the first time they choose a class - Changed message to represent this change in logic - #LINT: Cleaned interface for changing class - New method: enableClasses() -- because, really, should we be calling User.changeClass({}) from the UX? - New method: payForNewClass() -- handles prompting the user to confirm that they want to change class Remove new User Flag, use flags.tour.classes Whoopsie. Fix PR conflict. Removed Extraneous Flag * Fixes handling architecture change * Updates following Review 20170418-0602 * Remove cause of mocha/no-exclusive-tests lint failure
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
/* eslint-disable camelcase */
|
||||||
|
|
||||||
import changeClass from '../../../website/common/script/ops/changeClass';
|
import changeClass from '../../../website/common/script/ops/changeClass';
|
||||||
import {
|
import {
|
||||||
NotAuthorized,
|
NotAuthorized,
|
||||||
@@ -58,7 +60,8 @@ describe('shared.ops.changeClass', () => {
|
|||||||
|
|
||||||
it('changes class', () => {
|
it('changes class', () => {
|
||||||
user.stats.class = 'healer';
|
user.stats.class = 'healer';
|
||||||
user.items.gear.owned.armor_rogue_1 = true; // eslint-disable-line camelcase
|
user.items.gear.owned.weapon_healer_3 = true;
|
||||||
|
user.items.gear.equipped.weapon = 'weapon_healer_3';
|
||||||
|
|
||||||
let [data] = changeClass(user, {query: {class: 'rogue'}});
|
let [data] = changeClass(user, {query: {class: 'rogue'}});
|
||||||
expect(data).to.eql({
|
expect(data).to.eql({
|
||||||
@@ -70,13 +73,10 @@ describe('shared.ops.changeClass', () => {
|
|||||||
|
|
||||||
expect(user.stats.class).to.equal('rogue');
|
expect(user.stats.class).to.equal('rogue');
|
||||||
expect(user.flags.classSelected).to.be.true;
|
expect(user.flags.classSelected).to.be.true;
|
||||||
expect(user.items.gear.equipped.weapon).to.equal('weapon_rogue_0');
|
|
||||||
expect(user.items.gear.owned.weapon_rogue_0).to.be.true;
|
expect(user.items.gear.owned.weapon_rogue_0).to.be.true;
|
||||||
expect(user.items.gear.equipped.armor).to.equal('armor_rogue_1');
|
|
||||||
expect(user.items.gear.owned.armor_rogue_1).to.be.true;
|
|
||||||
expect(user.items.gear.equipped.shield).to.equal('shield_rogue_0');
|
|
||||||
expect(user.items.gear.owned.shield_rogue_0).to.be.true;
|
expect(user.items.gear.owned.shield_rogue_0).to.be.true;
|
||||||
expect(user.items.gear.equipped.head).to.equal('head_base_0');
|
expect(user.items.gear.owned.weapon_healer_3).to.be.true;
|
||||||
|
expect(user.items.gear.equipped.weapon).to.equal('weapon_healer_3');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -23,16 +23,18 @@ habitrpg.controller('UserCtrl', ['$rootScope', '$scope', '$location', 'User', '$
|
|||||||
}
|
}
|
||||||
|
|
||||||
$scope.changeClass = function(klass){
|
$scope.changeClass = function(klass){
|
||||||
if (!klass) {
|
|
||||||
if (!confirm(window.env.t('sureReset')))
|
|
||||||
return;
|
|
||||||
return User.changeClass({});
|
|
||||||
}
|
|
||||||
|
|
||||||
User.changeClass({query:{class:klass}});
|
User.changeClass({query:{class:klass}});
|
||||||
$scope.selectedClass = undefined;
|
|
||||||
Shared.updateStore(User.user);
|
Shared.updateStore(User.user);
|
||||||
Guide.goto('classes', 0,true);
|
|
||||||
|
Guide.goto('classes', 0, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.enableClasses = function(){
|
||||||
|
return User.changeClass({});
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.payForNewClass = function(){
|
||||||
|
if (confirm(window.env.t('sureReset'))) return User.changeClass({});
|
||||||
}
|
}
|
||||||
|
|
||||||
$scope.save = function(){
|
$scope.save = function(){
|
||||||
|
|||||||
@@ -64,11 +64,15 @@ function($rootScope, User, $timeout, $state, Analytics, Notification, Shared, So
|
|||||||
classes: [
|
classes: [
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
orphan: true,
|
||||||
|
content: window.env.t('classGearText'),
|
||||||
|
final: true,
|
||||||
state: 'options.inventory.equipment',
|
state: 'options.inventory.equipment',
|
||||||
element: '.equipment-tab',
|
element: '.equipment-tab',
|
||||||
title: window.env.t('classGear'),
|
title: window.env.t('classGear'),
|
||||||
content: window.env.t('classGearText')
|
hideNavigation: true
|
||||||
}, {
|
}
|
||||||
|
/*, {
|
||||||
state: 'options.profile.stats',
|
state: 'options.profile.stats',
|
||||||
element: ".allocate-stats",
|
element: ".allocate-stats",
|
||||||
title: window.env.t('stats'),
|
title: window.env.t('stats'),
|
||||||
@@ -88,7 +92,7 @@ function($rootScope, User, $timeout, $state, Analytics, Notification, Shared, So
|
|||||||
title: window.env.t('readMore'),
|
title: window.env.t('readMore'),
|
||||||
content: window.env.t('moreClass'),
|
content: window.env.t('moreClass'),
|
||||||
final: true
|
final: true
|
||||||
}
|
}*/
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
stats: [[
|
stats: [[
|
||||||
@@ -265,6 +269,7 @@ function($rootScope, User, $timeout, $state, Analytics, Notification, Shared, So
|
|||||||
|
|
||||||
var goto = function(chapter, page, force) {
|
var goto = function(chapter, page, force) {
|
||||||
if (chapter == 'intro' && User.user.flags.welcomed != true) User.set({'flags.welcomed': true});
|
if (chapter == 'intro' && User.user.flags.welcomed != true) User.set({'flags.welcomed': true});
|
||||||
|
if (chapter == 'classes' && User.user.flags.tour.classes === -2) return;
|
||||||
if (page === -1) page = 0;
|
if (page === -1) page = 0;
|
||||||
var curr = User.user.flags.tour[chapter];
|
var curr = User.user.flags.tour[chapter];
|
||||||
if (page != curr+1 && !force) return;
|
if (page != curr+1 && !force) return;
|
||||||
|
|||||||
@@ -214,7 +214,7 @@ angular.module('habitrpg')
|
|||||||
},
|
},
|
||||||
|
|
||||||
changeClass: function (data) {
|
changeClass: function (data) {
|
||||||
callOpsFunctionAndRequest('changeClass', 'change-class', "POST",'', data);
|
callOpsFunctionAndRequest('changeClass', 'change-class', "POST", '', data);
|
||||||
},
|
},
|
||||||
|
|
||||||
disableClasses: function () {
|
disableClasses: function () {
|
||||||
|
|||||||
@@ -61,7 +61,7 @@
|
|||||||
"paymentMethods": "Purchase using",
|
"paymentMethods": "Purchase using",
|
||||||
|
|
||||||
"classGear": "Class Gear",
|
"classGear": "Class Gear",
|
||||||
"classGearText": "First: don't panic! Your old gear is in your inventory, and you're now wearing the apprentice equipment of your new class. Wearing your class's gear grants you a 50% bonus to stats. However, feel free to switch back to your old gear.",
|
"classGearText": "Congratulations on choosing a class! I've added your new basic weapon to your inventory. Take a look below to equip it!",
|
||||||
"classStats": "These are your class's stats; they affect the game-play. Each time you level up, you get one point to allocate to a particular stat. Hover over each stat for more information.",
|
"classStats": "These are your class's stats; they affect the game-play. Each time you level up, you get one point to allocate to a particular stat. Hover over each stat for more information.",
|
||||||
"autoAllocate": "Auto Allocate",
|
"autoAllocate": "Auto Allocate",
|
||||||
"autoAllocateText": "If 'automatic allocation' is checked, your avatar gains stats automatically based on your tasks' attributes, which you can find in <strong>TASK > Edit > Advanced > Attributes</strong>. Eg, if you hit the gym often, and your 'Gym' Daily is set to 'Strength', you'll gain Strength automatically.",
|
"autoAllocateText": "If 'automatic allocation' is checked, your avatar gains stats automatically based on your tasks' attributes, which you can find in <strong>TASK > Edit > Advanced > Attributes</strong>. Eg, if you hit the gym often, and your 'Gym' Daily is set to 'Strength', you'll gain Strength automatically.",
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import i18n from '../i18n';
|
import i18n from '../i18n';
|
||||||
import get from 'lodash/get';
|
import get from 'lodash/get';
|
||||||
import each from 'lodash/each';
|
|
||||||
import findLast from 'lodash/findLast';
|
|
||||||
import pick from 'lodash/pick';
|
import pick from 'lodash/pick';
|
||||||
import splitWhitespace from '../libs/splitWhitespace';
|
import splitWhitespace from '../libs/splitWhitespace';
|
||||||
import { capByLevel } from '../statHelpers';
|
import { capByLevel } from '../statHelpers';
|
||||||
@@ -43,31 +41,8 @@ module.exports = function changeClass (user, req = {}, analytics) {
|
|||||||
user.stats.class = klass;
|
user.stats.class = klass;
|
||||||
user.flags.classSelected = true;
|
user.flags.classSelected = true;
|
||||||
|
|
||||||
each(['weapon', 'armor', 'shield', 'head'], (type) => {
|
user.items.gear.owned[`weapon_${klass}_0`] = true;
|
||||||
let foundKey = false;
|
if (klass === 'rogue') user.items.gear.owned[`shield_${klass}_0`] = true;
|
||||||
findLast(user.items.gear.owned, (val, key) => {
|
|
||||||
if (key.indexOf(`${type}_${klass}`) !== -1 && val === true) {
|
|
||||||
foundKey = key;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!foundKey) {
|
|
||||||
if (type === 'weapon') {
|
|
||||||
foundKey = `weapon_${klass}_0`;
|
|
||||||
} else if (type === 'shield' && klass === 'rogue') {
|
|
||||||
foundKey = 'shield_rogue_0';
|
|
||||||
} else {
|
|
||||||
foundKey = `${type}_base_0`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
user.items.gear.equipped[type] = foundKey;
|
|
||||||
|
|
||||||
if (type === 'weapon' || (type === 'shield' && klass === 'rogue')) { // eslint-disable-line no-extra-parens
|
|
||||||
user.items.gear.owned[`${type}_${klass}_0`] = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (analytics) {
|
if (analytics) {
|
||||||
analytics.track('change class', {
|
analytics.track('change class', {
|
||||||
|
|||||||
@@ -69,5 +69,5 @@ script(type='text/ng-template', id='modals/chooseClass.html')
|
|||||||
.modal-footer
|
.modal-footer
|
||||||
span(popover-placement='left', popover-trigger='mouseenter', popover=env.t('optOutOfClassesText'))
|
span(popover-placement='left', popover-trigger='mouseenter', popover=env.t('optOutOfClassesText'))
|
||||||
button.btn.btn-danger(ng-click='User.disableClasses({}); $close()')=env.t('optOutOfClasses')
|
button.btn.btn-danger(ng-click='User.disableClasses({}); $close()')=env.t('optOutOfClasses')
|
||||||
button.btn.btn-primary(ng-disabled='!selectedClass' ng-click='changeClass(selectedClass); $close()')=env.t('select')
|
button.btn.btn-primary(ng-disabled='!selectedClass' ng-click='changeClass(selectedClass); selectedClass = undefined; $close()')=env.t('select')
|
||||||
.pull-left!=env.t('chooseClassLearn')
|
.pull-left!=env.t('chooseClassLearn')
|
||||||
|
|||||||
Reference in New Issue
Block a user