Compare commits

..

64 Commits

Author SHA1 Message Date
Sabe Jones 034c0c9bb5 4.51.4 2018-07-16 21:12:50 +00:00
Sabe Jones e0711655f0 chore(i18n): update locales 2018-07-16 21:12:33 +00:00
Sabe Jones 71e162eed5 chore(news): Bailey 2018-07-16 16:10:04 -05:00
Sabe Jones f810fff6fc 4.51.3 2018-07-12 19:10:02 +00:00
Sabe Jones 5bbe59c52d chore(i18n): update locales 2018-07-12 19:09:42 +00:00
Sabe Jones 3f52401384 chore(news): Bailey 2018-07-12 14:05:40 -05:00
Matteo Pagliazzi e7944b3d98 iOS push notifications, use node-apn (#10517)
* fixing typos in comments. yes, I am that kind of nerd

* replacing push-notify with node-apn in deps and in pushNotifications.js

* updating calling code and tests to use node-apn

* updating APN configs to new format

* migrating team ID and key ID to config.json

* update code to use env variables and add correct topic
2018-07-12 12:56:15 +02:00
Sabe Jones 08e925e3da Merge branch 'release' into develop 2018-07-10 17:26:37 +00:00
Sabe Jones 16c9e42ad8 4.51.2 2018-07-10 17:24:18 +00:00
Sabe Jones 0e1d00c95f chore(i18n): update locales 2018-07-10 17:23:40 +00:00
Sabe Jones 166f4683ca feat(content): enable Splashy Skins 2018-07-10 12:18:41 -05:00
Keith Holliday 1fcc0d8d3a Ensured redirect is using base (#10497) 2018-07-09 10:08:19 -05:00
Matteo Pagliazzi 8a4c4e10f1 remove sensitive info from logs 2018-07-08 10:43:28 +02:00
Maurício El Uri 18ed0fe446 Fixed the unnecessary whitespace to the right of landing page (#10435) (#10490) 2018-07-06 15:57:36 -05:00
Vinicius 1f9ebeb629 Set .resting-banner z-index to 1300, set #progress .bar z-index to 1600 (#10492) 2018-07-06 15:55:44 -05:00
Sabe Jones b9d83122d1 fix(tasks): eliminate console error related to filtering
Also localize a group plans string
2018-07-06 15:43:27 -05:00
Sabe Jones d1f7e64156 fix(groups): display correct messages in two places 2018-07-06 13:21:28 -05:00
Sabe Jones 0f8e7416f8 fix(groups): save group options on task create
Also, correct count of assigned members when viewing user is among 
assignments
2018-07-06 10:30:09 -05:00
Sabe Jones 1c8b0f92df Small Group Plan fixes (#10499)
* fix(groups): better margins, don't close whole modal on close assigned members list

* fix(groups): proper sticky toggle switch
2018-07-05 16:37:06 -05:00
Sabe Jones 75e5b20f93 4.51.1 2018-07-05 15:14:05 +00:00
Sabe Jones f9db432794 chore(i18n): update locales 2018-07-05 15:12:59 +00:00
Sabe Jones 6cec7cbba2 Merge branch 'release' into develop 2018-07-03 17:39:27 +00:00
Sabe Jones f76d097313 4.51.0 2018-07-03 17:38:44 +00:00
Sabe Jones 59af471438 chore(i18n): update locales 2018-07-03 17:38:00 +00:00
Sabe Jones d0da303b7d chore(sprites): fix shop icon canvases, compile 2018-07-03 12:33:20 -05:00
Sabe Jones 596383e7a8 feat(content): Armoire and Backgrounds July 2018 2018-07-03 12:26:20 -05:00
Matteo Pagliazzi accba7fc13 fix bug in task approval notification 2018-07-03 11:23:44 +02:00
Sabe Jones dfc54f1600 Merge branch 'release' into develop 2018-07-02 19:58:23 +00:00
Sabe Jones b76ab58e3e 4.50.6 2018-07-02 19:58:00 +00:00
Sabe Jones 6f093a94c4 chore(i18n): update locales 2018-07-02 19:57:39 +00:00
Sabe Jones a9a9e7a4ab chore(sprites): compile 2018-07-02 14:51:59 -05:00
Sabe Jones b2058ec23d chore(news): Bailey challenge announcements 2018-07-02 14:51:40 -05:00
Keith Holliday 2461f53cf5 4.50.5 2018-07-01 18:25:23 -05:00
Keith Holliday 73fc288f3b 4.50.4 2018-07-01 18:25:20 -05:00
Keith Holliday ea78b6feb9 Changed docker file names (#10489) 2018-07-01 18:23:40 -05:00
Keith Holliday 7c141614ed Api login party invites (#10486)
* Fixed incorrect variable

* Fixed redirect params
2018-06-30 22:06:18 -05:00
Alys c072935e80 document the dueDate parameter for API task functions - partial fix for #8087 2018-06-30 15:55:27 +10:00
Alys 54e49ca3b9 adjust README file for recent changes in wiki Blacksmith pages
Also replace non-ascii quotes with ascii ones (nicer for
command-line reading).
2018-06-30 15:05:05 +10:00
Sabe Jones b16a245d61 Merge branch 'release' into develop 2018-06-29 19:06:20 +00:00
Sabe Jones 0a8109e496 4.50.3 2018-06-29 19:05:53 +00:00
Sabe Jones cdfcc6419f chore(i18n): update locales 2018-06-29 19:03:36 +00:00
Matteo Pagliazzi 9c25c2452f fixes #10485 2018-06-29 20:29:14 +02:00
Matteo Pagliazzi 573f2e4732 fix preening when history entries are null 2018-06-29 20:03:45 +02:00
Keith Holliday 81ffcf9c1b Added login path for Spritely (#10484) 2018-06-29 11:35:22 -05:00
Sabe Jones d8925a8811 Merge branch 'release' into develop 2018-06-29 00:22:18 +00:00
Sabe Jones 217c16988b 4.50.2 2018-06-29 00:21:56 +00:00
Sabe Jones de7f953b67 chore(i18n): update locales 2018-06-29 00:20:37 +00:00
SabreCat 8ee2a02e73 chore(news): Bailey 2018-06-29 00:18:13 +00:00
negue d9b573b430 AbstractGemItemOperation - BuyQuestWithGemOperation (#10476) 2018-06-28 12:37:21 +02:00
Keith Holliday cbcf5a03e1 Ensured leader doesn't change with group plans (#10480) 2018-06-28 11:57:24 +02:00
Matteo Pagliazzi 487523f64b client: disable broken test 2018-06-28 11:04:35 +02:00
Matteo Pagliazzi 74cfc2cf52 add ability to specify pool size for mongodb (#10481) 2018-06-28 11:02:26 +02:00
Sabe Jones 2d489e870f Merge branch 'release' into develop 2018-06-27 18:34:06 +00:00
Sabe Jones 6eb484605a fix(messages): clarify opt-in/out wording and leave label static (#10470) 2018-06-27 19:13:13 +02:00
Sabe Jones 8969b755a6 fix(analytics): remove spurious click tracking (#10469) 2018-06-27 19:12:51 +02:00
Sabe Jones 0062e5b1f1 fix(time-travelers): don't timeshift background without Hourglass (#10468) 2018-06-27 19:12:36 +02:00
Sabe Jones 50b98d8d92 fix(deletion): show feedback for social accounts (#10467) 2018-06-27 19:12:18 +02:00
Isabelle Lavandero 7ddf4b1f7b Remove "add multiple" tip once a task has been added (fixes #10440) (#10459)
* remove tip once a task has been added

* blur quickadd on enter but not on shift

* blur quickadd after tasks are created
2018-06-27 19:08:45 +02:00
Dexx Mandele c91da86b89 Remember equipment drawer tab (#10458)
* Remember equipment drawer tab

* Split local setting value constants
2018-06-27 19:08:21 +02:00
Jerell Mendoza d549fea4ed 10282: Added code for blocking party and guild invitations from block… (#10454)
* 10282: Added code for blocking party and guild invitations from blocked players, added tests

* 10282: fixed test label

* Update POST-groups_invite.test.js

removed `it.only` which was used for testing
2018-06-27 19:07:57 +02:00
Patricia Beier a362914f93 added ctrl+enter to private messages #10413 (#10436)
* added ctrl+enter to private messages #10413

* Fixes #10413
2018-06-27 19:07:41 +02:00
Hayden Betts 61001d0e9a WIP Fix flicker when user mouses over the very leftmost edge of party member avatar (#10407)
* added 1px margin-right to .member-stats

* added unit test for flicker prevention style

* remove .only() from unit test

* rewrote margin test using computed style
2018-06-27 19:07:21 +02:00
Sabe Jones bd5c4a08e2 Merge branch 'release' into develop 2018-06-26 20:45:37 +00:00
Matteo Pagliazzi 50ebdd1ece tasks hsitory migration: prevent it from running twice 2018-06-25 23:14:35 +02:00
354 changed files with 30247 additions and 29343 deletions
+29 -18
View File
@@ -1,18 +1,29 @@
FROM node:8
# Install global packages
RUN npm install -g gulp-cli mocha
# Clone Habitica repo and install dependencies
RUN mkdir -p /usr/src/habitrpg
WORKDIR /usr/src/habitrpg
RUN git clone https://github.com/HabitRPG/habitica.git /usr/src/habitrpg
RUN cp config.json.example config.json
RUN npm install
# Create Build dir
RUN mkdir -p ./website/build
# Start Habitica
EXPOSE 3000
CMD ["npm", "start"]
FROM node:8
ENV ADMIN_EMAIL admin@habitica.com
ENV AMAZON_PAYMENTS_CLIENT_ID amzn1.application-oa2-client.68ed9e6904ef438fbc1bf86bf494056e
ENV AMAZON_PAYMENTS_SELLER_ID AMQ3SB4SG5E91
ENV AMPLITUDE_KEY e8d4c24b3d6ef3ee73eeba715023dd43
ENV BASE_URL https://habitica.com
ENV FACEBOOK_KEY 128307497299777
ENV GA_ID UA-33510635-1
ENV GOOGLE_CLIENT_ID 1035232791481-32vtplgnjnd1aufv3mcu1lthf31795fq.apps.googleusercontent.com
ENV NODE_ENV production
ENV STRIPE_PUB_KEY pk_85fQ0yMECHNfHTSsZoxZXlPSwSNfA
# Install global packages
RUN npm install -g gulp-cli mocha
# Clone Habitica repo and install dependencies
RUN mkdir -p /usr/src/habitrpg
WORKDIR /usr/src/habitrpg
RUN git clone --branch release https://github.com/HabitRPG/habitica.git /usr/src/habitrpg
RUN npm install
RUN gulp build:prod --force
# Create Build dir
RUN mkdir -p ./website/build
# Start Habitica
EXPOSE 3000
CMD ["node", "./website/transpiled-babel/index.js"]
+18
View File
@@ -0,0 +1,18 @@
FROM node:8
# Install global packages
RUN npm install -g gulp-cli mocha
# Clone Habitica repo and install dependencies
RUN mkdir -p /usr/src/habitrpg
WORKDIR /usr/src/habitrpg
RUN git clone https://github.com/HabitRPG/habitica.git /usr/src/habitrpg
RUN cp config.json.example config.json
RUN npm install
# Create Build dir
RUN mkdir -p ./website/build
# Start Habitica
EXPOSE 3000
CMD ["npm", "start"]
-29
View File
@@ -1,29 +0,0 @@
FROM node:8
ENV ADMIN_EMAIL admin@habitica.com
ENV AMAZON_PAYMENTS_CLIENT_ID amzn1.application-oa2-client.68ed9e6904ef438fbc1bf86bf494056e
ENV AMAZON_PAYMENTS_SELLER_ID AMQ3SB4SG5E91
ENV AMPLITUDE_KEY e8d4c24b3d6ef3ee73eeba715023dd43
ENV BASE_URL https://habitica.com
ENV FACEBOOK_KEY 128307497299777
ENV GA_ID UA-33510635-1
ENV GOOGLE_CLIENT_ID 1035232791481-32vtplgnjnd1aufv3mcu1lthf31795fq.apps.googleusercontent.com
ENV NODE_ENV production
ENV STRIPE_PUB_KEY pk_85fQ0yMECHNfHTSsZoxZXlPSwSNfA
# Install global packages
RUN npm install -g gulp-cli mocha
# Clone Habitica repo and install dependencies
RUN mkdir -p /usr/src/habitrpg
WORKDIR /usr/src/habitrpg
RUN git clone --branch v4.49.1 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg
RUN npm install
RUN gulp build:prod --force
# Create Build dir
RUN mkdir -p ./website/build
# Start Habitica
EXPOSE 3000
CMD ["node", "./website/transpiled-babel/index.js"]
+3
View File
@@ -78,6 +78,9 @@
"PUSH_CONFIGS": {
"GCM_SERVER_API_KEY": "",
"APN_ENABLED": "false",
"APN_KEY_ID": "xxxxxxxxxx",
"APN_KEY": "xxxxxxxxxx",
"APN_TEAM_ID": "aaabbbcccd",
"FCM_SERVER_API_KEY": ""
},
"SITE_HTTP_AUTH": {
@@ -1,4 +1,4 @@
// const migrationName = 'habits-one-history-entry-per-day';
const migrationName = 'habits-one-history-entry-per-day';
const authorName = 'paglias'; // in case script author needs to know when their ...
const authorUuid = 'ed4c688c-6652-4a92-9d03-a5a79844174a'; // ... own data is done
@@ -14,7 +14,9 @@ const dbTasks = monk(connectionString).get('tasks', { castIds: false });
const dbUsers = monk(connectionString).get('users', { castIds: false });
function processUsers (lastId) {
let query = {};
let query = {
migration: {$ne: migrationName},
};
if (lastId) {
query._id = {
@@ -127,6 +129,11 @@ function updateUser (user) {
.then(habits => {
return Promise.all(habits.map(habit => updateHabit(habit, timezoneOffset, dayStart)));
})
.then(() => {
return dbUsers.update({_id: user._id}, {
$set: {migration: migrationName},
});
})
.catch((err) => {
console.log(err);
return exiting(1, `ERROR! ${ err}`);
@@ -1,4 +1,4 @@
let migrationName = '20180102_takeThis.js'; // Update per month
let migrationName = '20180702_takeThis.js'; // Update per month
let authorName = 'Sabe'; // in case script author needs to know when their ...
let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done
@@ -6,15 +6,16 @@ let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done
* Award Take This ladder items to participants in this month's challenge
*/
let monk = require('monk');
let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE
let dbUsers = monk(connectionString).get('users', { castIds: false });
import monk from 'monk';
import nconf from 'nconf';
const CONNECTION_STRING = nconf.get('MIGRATION_CONNECT_STRING'); // FOR TEST DATABASE
let dbUsers = monk(CONNECTION_STRING).get('users', { castIds: false });
function processUsers (lastId) {
// specify a query to limit the affected users (empty for all users):
let query = {
migration: {$ne: migrationName},
challenges: {$in: ['5f70ce5b-2d82-4114-8e44-ca65615aae62']}, // Update per month
challenges: {$in: ['f0481f95-1dde-4ae7-a876-d19502a45d61']}, // Update per month
};
if (lastId) {
+114 -41
View File
@@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "4.50.1",
"version": "4.51.4",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -801,13 +801,25 @@
}
},
"apn": {
"version": "1.7.8",
"resolved": "https://registry.npmjs.org/apn/-/apn-1.7.8.tgz",
"integrity": "sha1-Hp2kKPtXr6lX5UIjvvc0LALCTNo=",
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/apn/-/apn-2.2.0.tgz",
"integrity": "sha512-YIypYzPVJA9wzNBLKZ/mq2l1IZX/2FadPvwmSv4ZeR0VH7xdNITQ6Pucgh0Uw6ZZKC+XwheaJ57DFZAhJ0FvPg==",
"requires": {
"debug": "2.6.9",
"node-forge": "0.6.49",
"q": "1.5.1"
"debug": "3.1.0",
"http2": "https://github.com/node-apn/node-http2/archive/apn-2.1.4.tar.gz",
"jsonwebtoken": "8.3.0",
"node-forge": "0.7.5",
"verror": "1.10.0"
},
"dependencies": {
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
}
}
},
"append-buffer": {
@@ -5036,6 +5048,11 @@
"resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
"integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74="
},
"buffer-equal-constant-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
},
"buffer-fill": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
@@ -8792,6 +8809,14 @@
"jsbn": "0.1.1"
}
},
"ecdsa-sig-formatter": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz",
"integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=",
"requires": {
"safe-buffer": "5.1.2"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -13292,6 +13317,10 @@
"sshpk": "1.14.1"
}
},
"http2": {
"version": "https://github.com/node-apn/node-http2/archive/apn-2.1.4.tar.gz",
"integrity": "sha512-ad4u4I88X9AcUgxCRW3RLnbh7xHWQ1f5HbrXa7gEy2x4Xgq+rq+auGx5I+nUDE2YYuqteGIlbxrwQXkIaYTfnQ=="
},
"httpntlm": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz",
@@ -14768,6 +14797,29 @@
"resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
"integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk="
},
"jsonwebtoken": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz",
"integrity": "sha512-oge/hvlmeJCH+iIz1DwcO7vKPkNGJHhgkspk8OH3VKlw+mbi42WtD4ig1+VXRln765vxptAv+xT26Fd3cteqag==",
"requires": {
"jws": "3.1.5",
"lodash.includes": "4.3.0",
"lodash.isboolean": "3.0.3",
"lodash.isinteger": "4.0.4",
"lodash.isnumber": "3.0.3",
"lodash.isplainobject": "4.0.6",
"lodash.isstring": "4.0.1",
"lodash.once": "4.1.1",
"ms": "2.1.1"
},
"dependencies": {
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
@@ -14806,6 +14858,25 @@
"integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==",
"dev": true
},
"jwa": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz",
"integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==",
"requires": {
"buffer-equal-constant-time": "1.0.1",
"ecdsa-sig-formatter": "1.0.10",
"safe-buffer": "5.1.2"
}
},
"jws": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz",
"integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==",
"requires": {
"jwa": "1.1.6",
"safe-buffer": "5.1.2"
}
},
"kareem": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/kareem/-/kareem-2.1.0.tgz",
@@ -16418,6 +16489,11 @@
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
},
"lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
"integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
},
"lodash.initial": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.initial/-/lodash.initial-4.1.1.tgz",
@@ -16433,16 +16509,36 @@
"resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
"integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U="
},
"lodash.isboolean": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
"integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
},
"lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
},
"lodash.isinteger": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
"integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
},
"lodash.isnumber": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
"integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
},
"lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
},
"lodash.isstring": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
"integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
},
"lodash.istypedarray": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz",
@@ -16484,6 +16580,11 @@
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ=="
},
"lodash.once": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
},
"lodash.pairs": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/lodash.pairs/-/lodash.pairs-3.0.1.tgz",
@@ -18033,11 +18134,6 @@
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.4.1.tgz",
"integrity": "sha512-NNY/MpBkALb9jJmjpBlIi6GRoLveLUM0pJzgbp9vY9F7IQEb/HREC/nxrixechcQwd1NevOhJnWWV8QQQRE+OA=="
},
"mpns": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/mpns/-/mpns-2.1.3.tgz",
"integrity": "sha512-gPLNoVqwYoKUmNYZ2shMSdaE2XvHSRxWNzyG4DUi6Av7MSujyeOw/nj61nnQeuV/vke5E0Dni468xn0qxTHIZQ=="
},
"mquery": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mquery/-/mquery-3.0.0.tgz",
@@ -18457,9 +18553,9 @@
}
},
"node-forge": {
"version": "0.6.49",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.49.tgz",
"integrity": "sha1-8e6V1ddGI5OP4Z1piqWibVTS9g8="
"version": "0.7.5",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
"integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ=="
},
"node-gcm": {
"version": "0.14.10",
@@ -18655,9 +18751,9 @@
}
},
"node-rdkafka": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/node-rdkafka/-/node-rdkafka-2.3.3.tgz",
"integrity": "sha512-2J54zC9+Zj0iRQttmQs1Ubv8aHhmh04XjP3vk39uco7l6tp8BYYHG4XRsoqKOGGKjBLctGpFHr9g97WBE1pTbg==",
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/node-rdkafka/-/node-rdkafka-2.3.4.tgz",
"integrity": "sha512-ilaAOrEpDF3TGTlItsxU5pQXG+qjN1gKbhSvs9CoLXZaItt2EN6oU+kEdO6UkRQLKO6/Kv4m296cBrr0JCmiTw==",
"optional": true,
"requires": {
"bindings": "1.3.0",
@@ -20335,11 +20431,6 @@
"pinkie": "2.0.4"
}
},
"pipe-event": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/pipe-event/-/pipe-event-0.1.0.tgz",
"integrity": "sha1-pfXgPlqXsrdJPUsqBgzYPazLmmE="
},
"pixelsmith": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/pixelsmith/-/pixelsmith-2.2.1.tgz",
@@ -22718,19 +22809,6 @@
}
}
},
"push-notify": {
"version": "git://github.com/habitrpg/push-notify.git#6bc2b5fdb1bdc9649b9ec1964d79ca50187fc8a9",
"requires": {
"apn": "1.7.8",
"bluebird": "3.5.1",
"lodash": "4.17.10",
"mpns": "2.1.3",
"node-gcm": "0.14.10",
"pipe-event": "0.1.0",
"q": "1.5.1",
"wns": "0.5.3"
}
},
"pusher": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/pusher/-/pusher-1.5.1.tgz",
@@ -27870,11 +27948,6 @@
"dev": true,
"optional": true
},
"wns": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/wns/-/wns-0.5.3.tgz",
"integrity": "sha1-APToXPz44zg9y9gYmJBvH2rUhF8="
},
"wordwrap": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.50.1",
"version": "4.51.4",
"main": "./website/server/index.js",
"dependencies": {
"@slack/client": "^3.8.1",
@@ -11,6 +11,7 @@
"apidoc": "^0.17.5",
"autoprefixer": "^8.5.0",
"aws-sdk": "^2.239.1",
"apn": "^2.2.0",
"axios": "^0.18.0",
"axios-progress-bar": "^1.2.0",
"babel-core": "^6.26.3",
@@ -78,7 +79,6 @@
"postcss-easy-import": "^3.0.0",
"ps-tree": "^1.0.0",
"pug": "^2.0.3",
"push-notify": "git://github.com/habitrpg/push-notify.git#6bc2b5fdb1bdc9649b9ec1964d79ca50187fc8a9",
"pusher": "^1.3.0",
"rimraf": "^2.4.3",
"sass-loader": "^7.0.0",
+7 -6
View File
@@ -1,6 +1,6 @@
import { model as User } from '../../../../website/server/models/user';
import requireAgain from 'require-again';
import pushNotify from 'push-notify';
import apn from 'apn/mock';
import nconf from 'nconf';
import gcmLib from 'node-gcm'; // works with FCM notifications too
@@ -24,7 +24,7 @@ describe('pushNotifications', () => {
sandbox.stub(gcmLib.Sender.prototype, 'send').callsFake(fcmSendSpy);
sandbox.stub(pushNotify, 'apn').returns({
sandbox.stub(apn.Provider.prototype, 'send').returns({
on: () => null,
send: apnSendSpy,
});
@@ -104,10 +104,7 @@ describe('pushNotifications', () => {
},
};
sendPushNotification(user, details);
expect(apnSendSpy).to.have.been.calledOnce;
expect(apnSendSpy).to.have.been.calledWithMatch({
token: '123',
const expectedNotification = new apn.Notification({
alert: message,
sound: 'default',
category: 'fun',
@@ -117,6 +114,10 @@ describe('pushNotifications', () => {
b: true,
},
});
sendPushNotification(user, details);
expect(apnSendSpy).to.have.been.calledOnce;
expect(apnSendSpy).to.have.been.calledWithMatch(expectedNotification, '123');
expect(fcmSendSpy).to.not.have.been.called;
});
});
@@ -114,6 +114,19 @@ describe('Post /groups/:groupId/invite', () => {
});
});
it('returns error when recipient has blocked the senders', async () => {
const inviterNoBlocks = await inviter.update({'inbox.blocks': []});
let userWithBlockedInviter = await generateUser({'inbox.blocks': [inviter._id]});
await expect(inviterNoBlocks.post(`/groups/${group._id}/invite`, {
uuids: [userWithBlockedInviter._id],
}))
.to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('notAuthorizedToSendMessageToThisUser'),
});
});
it('invites a user to a group by uuid', async () => {
let userToInvite = await generateUser();
@@ -0,0 +1,23 @@
import Vue from 'vue';
import MemberDetailsComponent from 'client/components/memberDetails.vue';
describe('Members Details Component', () => {
let CTor;
let vm;
beforeEach(() => {
CTor = Vue.extend(MemberDetailsComponent);
vm = new CTor().$mount();
});
afterEach(() => {
vm.$destroy();
});
xit('prevents flickering by setting a 1px margin-right on elements of class member-stats', () => {
const memberstats = vm.$el.querySelector('.member-stats');
const style = window.getComputedStyle(memberstats, null);
const marginRightProp = style.getPropertyValue('margin-right');
expect(marginRightProp).to.equal('1');
});
});
+94
View File
@@ -0,0 +1,94 @@
import pinnedGearUtils from '../../../../website/common/script/ops/pinnedGearUtils';
import {
NotAuthorized,
} from '../../../../website/common/script/libs/errors';
import i18n from '../../../../website/common/script/i18n';
import {
generateUser,
} from '../../../helpers/common.helper';
import {BuyQuestWithGemOperation} from '../../../../website/common/script/ops/buy/buyQuestGem';
describe('shared.ops.buyQuestGems', () => {
let user;
let goldPoints = 40;
let analytics = {track () {}};
function buyQuest (_user, _req, _analytics) {
const buyOp = new BuyQuestWithGemOperation(_user, _req, _analytics);
return buyOp.purchase();
}
before(() => {
user = generateUser({'stats.class': 'rogue'});
});
beforeEach(() => {
sinon.stub(analytics, 'track');
sinon.spy(pinnedGearUtils, 'removeItemByPath');
});
afterEach(() => {
analytics.track.restore();
pinnedGearUtils.removeItemByPath.restore();
});
context('successful purchase', () => {
let userGemAmount = 10;
before(() => {
user.balance = userGemAmount;
user.stats.gp = goldPoints;
user.purchased.plan.gemsBought = 0;
user.purchased.plan.customerId = 'customer-id';
user.pinnedItems.push({type: 'quests', key: 'gryphon'});
});
it('purchases quests', () => {
let key = 'gryphon';
buyQuest(user, {params: {key}});
expect(user.items.quests[key]).to.equal(1);
expect(pinnedGearUtils.removeItemByPath.notCalled).to.equal(true);
});
});
context('bulk purchase', () => {
let userGemAmount = 10;
beforeEach(() => {
user.balance = userGemAmount;
user.stats.gp = goldPoints;
user.purchased.plan.gemsBought = 0;
user.purchased.plan.customerId = 'customer-id';
});
it('errors when user does not have enough gems', (done) => {
user.balance = 1;
let key = 'gryphon';
try {
buyQuest(user, {
params: {key},
quantity: 2,
});
} catch (err) {
expect(err).to.be.an.instanceof(NotAuthorized);
expect(err.message).to.equal(i18n.t('notEnoughGems'));
done();
}
});
it('makes bulk purchases of quests', () => {
let key = 'gryphon';
buyQuest(user, {
params: {key},
quantity: 3,
});
expect(user.items.quests[key]).to.equal(4);
});
});
});
-11
View File
@@ -121,7 +121,6 @@ describe('shared.ops.purchase', () => {
user.pinnedItems.push({type: 'eggs', key: 'Wolf'});
user.pinnedItems.push({type: 'hatchingPotions', key: 'Base'});
user.pinnedItems.push({type: 'food', key: SEASONAL_FOOD});
user.pinnedItems.push({type: 'quests', key: 'gryphon'});
user.pinnedItems.push({type: 'gear', key: 'headAccessory_special_tigerEars'});
user.pinnedItems.push({type: 'bundles', key: 'featheredFriends'});
});
@@ -157,16 +156,6 @@ describe('shared.ops.purchase', () => {
expect(pinnedGearUtils.removeItemByPath.notCalled).to.equal(true);
});
it('purchases quests', () => {
let type = 'quests';
let key = 'gryphon';
purchase(user, {params: {type, key}});
expect(user.items[type][key]).to.equal(1);
expect(pinnedGearUtils.removeItemByPath.notCalled).to.equal(true);
});
it('purchases gear', () => {
let type = 'gear';
let key = 'headAccessory_special_tigerEars';
+7 -7
View File
@@ -1,21 +1,21 @@
# Running
For information about installing Habitica locally, see [Setting up Habitica Locally](http://habitica.wikia.com/wiki/Setting_up_Habitica_Locally) and for information about running the local client, refer to the ["Run Habitica" section](http://habitica.wikia.com/wiki/Setting_up_Habitica_Locally#Run_Habitica) in that page.
For information about installing and running Habitica locally, see [Setting up Habitica Locally](http://habitica.wikia.com/wiki/Setting_up_Habitica_Locally).
# Preparation Reading
- Vue 2 (https://vuejs.org)
- Webpack (https://webpack.github.io/) is the build system and it includes plugins for code transformation, right now we have: BabelJS for ES6 transpilation, eslint for code style, less and postcss for css compilation. The code comes from https://github.com/vuejs-templates/webpack which is a Webpack template for Vue, with some small modifications to adapt it to our use case. Docs http://vuejs-templates.github.io/webpack/
- Were using `.vue` files that make it possible to have HTML, JS and CSS for each component together in a single location. Theyre implemented as a webpack plugin and the docs can be found here http://vue-loader.vuejs.org/en/
- We're using `.vue` files that make it possible to have HTML, JS and CSS for each component together in a single location. They're implemented as a webpack plugin and the docs can be found here http://vue-loader.vuejs.org/en/
- SemanticUI is the UI framework http://semantic-ui.com/. So far Ive only used the CSS part, it also has JS plugins but Ive yet to use them. It supports theming so if its not too difficult well want to customize the base theme with our own styles instead of writing CSS rules to override the original styling.
- SemanticUI is the UI framework http://semantic-ui.com/. So far I've only used the CSS part, it also has JS plugins but I've yet to use them. It supports theming so if it's not too difficult we'll want to customize the base theme with our own styles instead of writing CSS rules to override the original styling.
The code is in `/website/client`. Were using something very similar to Vuex (equivalent of Reacts Redux) for state management http://vuex.vuejs.org/en/index.html
The code is in `/website/client`. We're using something very similar to Vuex (equivalent of React's Redux) for state management http://vuex.vuejs.org/en/index.html
The API is almost the same except that we dont use mutations but only actions because it would make it difficult to work with common code
The API is almost the same except that we don't use mutations but only actions because it would make it difficult to work with common code
The project is developed directly in the `develop` branch as long as well be able to avoid splitting it into a different branch.
The project is developed directly in the `develop` branch as long as we'll be able to avoid splitting it into a different branch.
So far most of the work has been on the template, so theres no complex logic to understand. The only thing I would suggest you to read about is Vuex for data management: its basically a Flux implementation: theres a central store that hold the data for the entire app, and every change to the data must happen through an action, the data cannot be mutated directly.
So far most of the work has been on the template, so there's no complex logic to understand. The only thing I would suggest you to read about is Vuex for data management: it's basically a Flux implementation: there's a central store that hold the data for the entire app, and every change to the data must happen through an action, the data cannot be mutated directly.
For further resources, see [Guidance for Blacksmiths](http://habitica.wikia.com/wiki/Guidance_for_Blacksmiths), and in particular the ["Website Technology Stack" section](http://habitica.wikia.com/wiki/Guidance_for_Blacksmiths#Website_Technology_Stack).
+2 -2
View File
@@ -116,7 +116,7 @@ div
/* Push progress bar above modals */
#nprogress .bar {
z-index: 1090 !important; /* Must stay above nav bar */
z-index: 1600 !important; /* Must stay above nav bar */
}
.restingInn {
@@ -136,7 +136,7 @@ div
background-color: $blue-10;
position: fixed;
top: 0;
z-index: 1030;
z-index: 1300;
display: flex;
.content {
@@ -1,66 +1,72 @@
.promo_aquatic_glass_potions {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -627px 0px;
background-position: -770px 0px;
width: 141px;
height: 441px;
}
.promo_armoire_backgrounds_201806 {
.promo_armoire_backgrounds_201807 {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -627px -442px;
background-position: -912px 0px;
width: 141px;
height: 441px;
}
.promo_bundle_aquaticAmigos {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -142px -533px;
width: 423px;
height: 147px;
}
.promo_ios {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px 0px;
width: 325px;
height: 336px;
background-position: -394px 0px;
width: 375px;
height: 361px;
}
.promo_mystery_201806 {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -769px -442px;
background-position: -912px -442px;
width: 121px;
height: 114px;
}
.promo_seafoam {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -769px 0px;
background-position: -770px -442px;
width: 141px;
height: 441px;
}
.promo_seasonal_shop_summer {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -142px -681px;
background-position: -142px -557px;
width: 162px;
height: 138px;
}
.promo_splashy_skins {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -142px -370px;
width: 375px;
height: 186px;
}
.customize-option.promo_splashy_skins {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -167px -385px;
width: 60px;
height: 60px;
}
.promo_summer_splash_2018 {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -337px;
background-position: 0px -370px;
width: 141px;
height: 588px;
}
.promo_take_this {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -769px -557px;
background-position: -912px -557px;
width: 96px;
height: 69px;
}
.scene_families {
.scene_party_healing {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -142px -337px;
width: 345px;
height: 195px;
background-position: 0px 0px;
width: 393px;
height: 369px;
}
.scene_moderators {
.scene_reading {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -326px 0px;
width: 300px;
height: 300px;
background-position: -518px -370px;
width: 171px;
height: 144px;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,408 +1,552 @@
.Pet-Whale-Golden {
.Pet-Turtle-Base {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -82px 0px;
width: 81px;
height: 99px;
}
.Pet-Whale-Red {
.Pet-Turtle-CottonCandyBlue {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -492px -400px;
background-position: -492px -500px;
width: 81px;
height: 99px;
}
.Pet-Whale-Shade {
.Pet-Turtle-CottonCandyPink {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -164px 0px;
width: 81px;
height: 99px;
}
.Pet-Whale-Skeleton {
.Pet-Turtle-Desert {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -100px;
width: 81px;
height: 99px;
}
.Pet-Whale-White {
.Pet-Turtle-Golden {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -82px -100px;
width: 81px;
height: 99px;
}
.Pet-Whale-Zombie {
.Pet-Turtle-Red {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -164px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Aquatic {
.Pet-Turtle-Shade {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -246px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Base {
.Pet-Turtle-Skeleton {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -246px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-CottonCandyBlue {
.Pet-Turtle-White {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-CottonCandyPink {
.Pet-Turtle-Zombie {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -82px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Cupid {
.Pet-Unicorn-Base {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -164px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Desert {
.Pet-Unicorn-CottonCandyBlue {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -246px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Ember {
.Pet-Unicorn-CottonCandyPink {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -328px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Fairy {
.Pet-Unicorn-Desert {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -328px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Floral {
.Pet-Unicorn-Golden {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -328px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Ghost {
.Pet-Unicorn-Red {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Glass {
.Pet-Unicorn-Shade {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -82px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Golden {
.Pet-Unicorn-Skeleton {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -164px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Holly {
.Pet-Unicorn-White {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -246px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Peppermint {
.Pet-Unicorn-Zombie {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -328px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Rainbow {
.Pet-Whale-Base {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -410px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Red {
.Pet-Whale-CottonCandyBlue {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -410px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-RoyalPurple {
.Pet-Whale-CottonCandyPink {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -410px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shade {
.Pet-Whale-Desert {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -410px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shimmer {
.Pet-Whale-Golden {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -492px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Skeleton {
.Pet-Whale-Red {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -492px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Spooky {
.Pet-Whale-Shade {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -492px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-StarryNight {
.Pet-Whale-Skeleton {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -492px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Thunderstorm {
.Pet-Whale-White {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Veteran {
.Pet-Whale-Zombie {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -82px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-White {
.Pet-Wolf-Aquatic {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -164px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Zombie {
.Pet-Wolf-Base {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -246px -400px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Base {
.Pet-Wolf-CottonCandyBlue {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -328px -400px;
width: 81px;
height: 99px;
}
.Pet-Yarn-CottonCandyBlue {
.Pet-Wolf-CottonCandyPink {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -410px -400px;
width: 81px;
height: 99px;
}
.Pet-Yarn-CottonCandyPink {
.Pet-Wolf-Cupid {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: 0px 0px;
background-position: -492px -400px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Desert {
.Pet-Wolf-Desert {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -574px 0px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Golden {
.Pet-Wolf-Ember {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -574px -100px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Red {
.Pet-Wolf-Fairy {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -574px -200px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Shade {
.Pet-Wolf-Floral {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -574px -300px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Skeleton {
.Pet-Wolf-Ghost {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -574px -400px;
width: 81px;
height: 99px;
}
.Pet-Yarn-White {
.Pet-Wolf-Glass {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -500px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Zombie {
.Pet-Wolf-Golden {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -82px -500px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Holly {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -164px -500px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Peppermint {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -246px -500px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Rainbow {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -328px -500px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Red {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -410px -500px;
width: 81px;
height: 99px;
}
.Pet-Wolf-RoyalPurple {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: 0px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shade {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -574px -500px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shimmer {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Skeleton {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Spooky {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-StarryNight {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Thunderstorm {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Veteran {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -500px;
width: 81px;
height: 99px;
}
.Pet-Wolf-White {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -600px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Zombie {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -82px -600px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Base {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -164px -600px;
width: 81px;
height: 99px;
}
.Pet-Yarn-CottonCandyBlue {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -246px -600px;
width: 81px;
height: 99px;
}
.Pet-Yarn-CottonCandyPink {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -328px -600px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Desert {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -410px -600px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Golden {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -492px -600px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Red {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -574px -600px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Shade {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -600px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Skeleton {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -738px 0px;
width: 81px;
height: 99px;
}
.Pet-Yarn-White {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -738px -100px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Zombie {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -738px -200px;
width: 81px;
height: 99px;
}
.Pet_HatchingPotion_Aquatic {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -233px -500px;
background-position: -738px -369px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Base {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -414px;
background-position: -552px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_CottonCandyBlue {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -302px -500px;
background-position: -738px -438px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_CottonCandyPink {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -371px -500px;
background-position: -738px -507px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Cupid {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -440px -500px;
background-position: -738px -576px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Desert {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -509px -500px;
background-position: 0px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ember {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -578px -500px;
background-position: -69px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Fairy {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px 0px;
background-position: -138px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Floral {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -69px;
background-position: -207px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ghost {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -138px;
background-position: -276px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Glass {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -207px;
background-position: -345px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Golden {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -276px;
background-position: -414px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Holly {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -345px;
background-position: -483px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Peppermint {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -164px -500px;
background-position: -738px -300px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Purple {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -656px -483px;
background-position: -621px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Rainbow {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -600px;
background-position: -690px -700px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Red {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -69px -600px;
background-position: -820px 0px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_RoyalPurple {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -138px -600px;
background-position: -820px -69px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shade {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -207px -600px;
background-position: -820px -138px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shimmer {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -276px -600px;
background-position: -820px -207px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Skeleton {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -345px -600px;
background-position: -820px -276px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Spooky {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -414px -600px;
background-position: -820px -345px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_StarryNight {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -483px -600px;
background-position: -820px -414px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Thunderstorm {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -552px -600px;
background-position: -820px -483px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_White {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -621px -600px;
background-position: -820px -552px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Zombie {
background-image: url('~assets/images/sprites/spritesmith-main-22.png');
background-position: -725px 0px;
background-position: -820px -621px;
width: 68px;
height: 68px;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 546 KiB

After

Width:  |  Height:  |  Size: 553 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 416 KiB

After

Width:  |  Height:  |  Size: 432 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 KiB

After

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 KiB

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 111 KiB

@@ -58,7 +58,6 @@
<script>
import Avatar from '../avatar';
import { mapState } from 'client/libs/store';
import * as Analytics from 'client/libs/analytics';
import percent from '../../../common/script/libs/percent';
import {maxHealth} from '../../../common/script/index';
@@ -82,14 +81,6 @@ export default {
return `${Math.ceil(this.user.stats.hp)} / ${this.maxHealth}`;
},
},
mounted () {
Analytics.track({
hitType: 'event',
eventCategory: 'button',
eventAction: 'click',
eventLabel: 'Health Warning',
});
},
methods: {
close () {
this.$root.$emit('bv::hide::modal', 'low-health');
+2 -1
View File
@@ -112,9 +112,10 @@ export default {
} catch (e) {} // eslint-disable-line
try {
const redirectUrl = `${window.location.protocol}//${window.location.host}`;
let auth = await hello(network).login({
scope: 'email',
redirect_uri: '', // eslint-disable-line camelcase
redirect_uri: redirectUrl, // eslint-disable-line camelcase
});
await this.$store.dispatch('auth:socialAuth', {
@@ -433,10 +433,11 @@ export default {
await hello(network).logout();
} catch (e) {} // eslint-disable-line
const redirectUrl = `${window.location.protocol}//${window.location.host}`;
let auth = await hello(network).login({
scope: 'email',
// explicitly pass the redirect url or it might redirect to /home
redirect_uri: '', // eslint-disable-line camelcase
redirect_uri: redirectUrl, // eslint-disable-line camelcase
});
await this.$store.dispatch('auth:socialAuth', {
@@ -34,7 +34,7 @@
.challenge-description(v-markdown='challenge.summary')
.well-wrapper(v-if="fullLayout")
.well
div(v-for="task in tasksData", :class="{'muted': task.value === 0}", v-once)
div(v-for="task in tasksData", :class="{'muted': task.value === 0}")
.number
.svg-icon(v-html="task.icon", :class="task.label + '-icon'")
span.value {{ task.value }}
@@ -13,7 +13,7 @@
)
.row.tasks-navigation
.col-12.col-md-4
h1 Group's Tasks
h1 {{ $t('groupTasksTitle') }}
// @TODO: Abstract to component!
.col-12.col-md-4
.input-group
@@ -164,12 +164,6 @@ export default {
},
methods: {
shareUserId () {
Analytics.track({
hitType: 'event',
eventCategory: 'button',
eventAction: 'click',
eventLabel: 'Health Warning',
});
this.shareUserIdShown = !this.shareUserIdShown;
},
async createParty () {
@@ -15,7 +15,7 @@
#groupPrivateDescription1.icon(:title="$t('privateDescription')")
.svg-icon(v-html='icons.information')
b-tooltip(
:title="$t('privateDescription')",
:title="$t('onlyLeaderCreatesChallengesDetail')",
target="groupPrivateDescription1",
)
@@ -365,13 +365,6 @@ export default {
alert(this.$t('notEnoughGems'));
return;
// @TODO return $rootScope.openModal('buyGems', {track:"Gems > Gems > Create Group"});
// @TODO when modal is implemented, enable analytics
/* Analytics.track({
hitType: 'event',
eventCategory: 'button',
eventAction: 'click',
eventLabel: 'Health Warning',
}); */
}
let errors = [];
@@ -54,7 +54,6 @@ import { mapState } from 'client/libs/store';
import filter from 'lodash/filter';
import map from 'lodash/map';
import notifications from 'client/mixins/notifications';
import * as Analytics from 'client/libs/analytics';
export default {
mixins: [notifications],
@@ -65,14 +64,6 @@ export default {
emails: [],
};
},
mounted () {
Analytics.track({
hitType: 'event',
eventCategory: 'button',
eventAction: 'click',
eventLabel: 'Invite Friends',
});
},
computed: {
...mapState({user: 'user.data'}),
inviter () {
@@ -36,7 +36,7 @@
drawer(
:title="$t('equipment')",
:errorMessage="(costume && !user.preferences.costume) ? $t('costumeDisabled') : null",
:errorMessage="(costumeMode && !user.preferences.costume) ? $t('costumeDisabled') : null",
:openStatus='openStatus',
v-on:toggled='drawerToggled'
)
@@ -44,18 +44,18 @@
.drawer-tab-container
.drawer-tab.text-right
a.drawer-tab-text(
@click="costume = false",
:class="{'drawer-tab-text-active': costume === false}",
@click="selectDrawerTab('equipment')",
:class="{'drawer-tab-text-active': !costumeMode}",
) {{ $t('equipment') }}
.clearfix
.drawer-tab.float-left
a.drawer-tab-text(
@click="costume = true",
:class="{'drawer-tab-text-active': costume === true}",
@click="selectDrawerTab('costume')",
:class="{'drawer-tab-text-active': costumeMode}",
) {{ $t('costume') }}
toggle-switch.float-right.align-with-tab(
:label="$t(costume ? 'useCostume' : 'autoEquipBattleGear')",
:label="$t(costumeMode ? 'useCostume' : 'autoEquipBattleGear')",
:checked="user.preferences[drawerPreference]",
@change="changeDrawerPreference",
:hoverText="$t(drawerPreference+'PopoverText')",
@@ -77,7 +77,7 @@
template(slot="itemBadge", slot-scope="context")
starBadge(
:selected="true",
:show="!costume || user.preferences.costume",
:show="!costumeMode || user.preferences.costume",
@click="equipItem(context.item)",
)
div(
@@ -109,7 +109,7 @@
template(slot="itemBadge", slot-scope="context")
starBadge(
:selected="activeItems[context.item.type] === context.item.key",
:show="!costume || user.preferences.costume",
:show="!costumeMode || user.preferences.costume",
@click="equipItem(context.item)",
)
template(slot="popoverContent", slot-scope="context")
@@ -119,7 +119,7 @@
:item="gearToEquip",
@equipItem="equipItem($event)",
@change="changeModalState($event)",
:costumeMode="costume",
:costumeMode="costumeMode",
:isEquipped="gearToEquip == null ? false : activeItems[gearToEquip.type] === gearToEquip.key"
)
</template>
@@ -185,7 +185,7 @@ export default {
itemsPerLine: 9,
searchText: null,
searchTextThrottled: null,
costume: false,
costumeMode: false,
groupBy: 'type', // or 'class'
gearTypesToStrings: Object.freeze({ // TODO use content.itemList?
weapon: i18n.t('weaponCapitalized'),
@@ -219,11 +219,24 @@ export default {
},
mounted () {
const drawerState = getLocalSetting(CONSTANTS.keyConstants.EQUIPMENT_DRAWER_STATE);
if (drawerState === CONSTANTS.valueConstants.DRAWER_CLOSED) {
if (drawerState === CONSTANTS.drawerStateValues.DRAWER_CLOSED) {
this.$store.state.equipmentDrawerOpen = false;
}
this.costumeMode = getLocalSetting(CONSTANTS.keyConstants.CURRENT_EQUIPMENT_DRAWER_TAB) === CONSTANTS.equipmentDrawerTabValues.COSTUME_TAB ? true : false;
},
methods: {
selectDrawerTab (tabName) {
let tabNameValue;
if (tabName === 'costume') {
tabNameValue = CONSTANTS.equipmentDrawerTabValues.COSTUME_TAB;
this.costumeMode = true;
} else {
tabNameValue = CONSTANTS.equipmentDrawerTabValues.EQUIPMENT_TAB;
this.costumeMode = false;
}
setLocalSetting(CONSTANTS.keyConstants.CURRENT_EQUIPMENT_DRAWER_TAB, tabNameValue);
},
openEquipDialog (item) {
this.gearToEquip = item;
},
@@ -233,7 +246,7 @@ export default {
}
},
equipItem (item) {
this.$store.dispatch('common:equip', {key: item.key, type: this.costume ? 'costume' : 'equipped'});
this.$store.dispatch('common:equip', {key: item.key, type: this.costumeMode ? 'costume' : 'equipped'});
this.gearToEquip = null;
},
changeDrawerPreference (newVal) {
@@ -260,11 +273,11 @@ export default {
this.$store.state.equipmentDrawerOpen = newState;
if (newState) {
setLocalSetting(CONSTANTS.keyConstants.EQUIPMENT_DRAWER_STATE, CONSTANTS.valueConstants.DRAWER_OPEN);
setLocalSetting(CONSTANTS.keyConstants.EQUIPMENT_DRAWER_STATE, CONSTANTS.drawerStateValues.DRAWER_OPEN);
return;
}
setLocalSetting(CONSTANTS.keyConstants.EQUIPMENT_DRAWER_STATE, CONSTANTS.valueConstants.DRAWER_CLOSED);
setLocalSetting(CONSTANTS.keyConstants.EQUIPMENT_DRAWER_STATE, CONSTANTS.drawerStateValues.DRAWER_CLOSED);
},
},
computed: {
@@ -280,10 +293,10 @@ export default {
return this.$store.state.equipmentDrawerOpen ? 1 : 0;
},
drawerPreference () {
return this.costume === true ? 'costume' : 'autoEquip';
return this.costumeMode ? 'costume' : 'autoEquip';
},
activeItems () {
return this.costume === true ? this.costumeItems : this.equippedItems;
return this.costumeMode ? this.costumeItems : this.equippedItems;
},
gearItemsByType () {
const searchText = this.searchTextThrottled;
@@ -48,6 +48,7 @@
.member-stats {
padding-left: 12px;
padding-right: 24px;
margin-right: 1px;
opacity: 1;
transition: width 0.15s ease-out;
}
+1 -1
View File
@@ -211,7 +211,7 @@ export default {
// @TODO: {keyboard:false, backdrop:'static'}
} else if (after <= 30 && !this.user.flags.warnedLowHealth) {
this.$root.$emit('bv::show::modal', 'low-health');
// @TODO: {keyboard:false, backdrop:'static', controller:'UserCtrl', track:'Health Warning'}
// @TODO: {keyboard:false, backdrop:'static', controller:'UserCtrl'}
}
if (after === before) return;
if (this.user.stats.lvl === 0) return;
@@ -85,6 +85,12 @@ export default {
showApiToken: false,
};
},
mounted () {
window.addEventListener('message', this.receiveMessage, false);
},
destroy () {
window.removeEventListener('message', this.receiveMessage);
},
computed: {
...mapState({user: 'user.data', credentials: 'credentials'}),
apiToken () {
@@ -92,6 +98,15 @@ export default {
},
},
methods: {
receiveMessage (eventFrom) {
if (eventFrom.origin !== 'https://www.spritely.app') return;
const creds = {
userId: this.user._id,
apiToken: this.credentials.API_TOKEN,
};
eventFrom.source.postMessage(creds, eventFrom.origin);
},
async addWebhook (url) {
let webhookInfo = {
id: uuid(),
@@ -1,31 +1,19 @@
<template lang="pug">
b-modal#delete(:title="$t('deleteAccount')", :hide-footer='true' size='md')
.regular-delete(v-if='user.auth.local.email')
strong {{ $t('deleteLocalAccountText') }}
br
.row
.col-6
input.form-control(type='password', v-model='password')
br
.row
#feedback.col-12.form-group
label(for='feedbackTextArea') {{ $t('feedback') }}
textarea#feedbackTextArea.form-control(v-model='feedback')
.modal-footer
button.btn.btn-primary(@click='close()') {{ $t('neverMind') }}
button.btn.btn-danger(@click='deleteAccount()', :disabled='!password') {{ $t('deleteDo') }}
.modal-header
.social-delete(v-if='!user.auth.local.email')
h4 {{ $t('deleteAccount') }}
.modal-body
p {{ $t('deleteSocialAccountText', {magicWord: 'DELETE'}) }}
br
.row
.col-md-6
input.form-control(type='text', v-model='password')
.modal-footer
button.btn.btn-secondary(@click='close()') {{ $t('neverMind') }}
button.btn.btn-danger(:disabled='!password', @click='deleteAccount()') {{ $t('deleteDo') }}
.modal-body
br
strong(v-if='user.auth.local.email') {{ $t('deleteLocalAccountText') }}
strong(v-if='!user.auth.local.email') {{ $t('deleteSocialAccountText', {magicWord: 'DELETE'}) }}
.row.mt-3
.col-6
input.form-control(type='password', v-model='password')
.row.mt-3
#feedback.col-12.form-group
label(for='feedbackTextArea') {{ $t('feedback') }}
textarea#feedbackTextArea.form-control(v-model='feedback')
.modal-footer
button.btn.btn-primary(@click='close()') {{ $t('neverMind') }}
button.btn.btn-danger(@click='deleteAccount()', :disabled='!password') {{ $t('deleteDo') }}
</template>
<script>
@@ -44,7 +32,7 @@ export default {
},
methods: {
close () {
this.$root.$emit('bv::hide::modal', 'reset');
this.$root.$emit('bv::hide::modal', 'delete');
},
async deleteAccount () {
await axios.delete('/api/v4/user', {
@@ -55,7 +43,7 @@ export default {
});
localStorage.clear();
window.location.href = '/static/home';
this.$root.$emit('bv::hide::modal', 'reset');
this.$root.$emit('bv::hide::modal', 'delete');
},
},
};
@@ -22,7 +22,7 @@
)
.standard-page
div.featuredItems
.background
.background(:class="{'background-closed': closed, 'background-open': !closed }")
div.npc(:class="{'closed': closed }")
div.featured-label
span.rectangle
@@ -34,8 +34,6 @@
span.text(v-once) {{ $t('timeTravelersPopoverNoSubMobile') }}
span.rectangle
h1.mb-4.page-header(v-once) {{ $t('timeTravelers') }}
.clearfix(v-if="!closed")
div.float-right
span.dropdown-label {{ $t('sortBy') }}
@@ -164,12 +162,9 @@
height: 216px;
.background {
background: url('~assets/images/npc/#{$npc_timetravelers_flavor}/time_travelers_background.png');
background-repeat: repeat-x;
width: 100%;
height: 216px;
position: absolute;
top: 0;
@@ -180,6 +175,14 @@
justify-content: center;
align-items: center;
}
.background-open {
background: url('~assets/images/npc/#{$npc_timetravelers_flavor}/time_travelers_background.png');
height: 188px;
}
.background-closed {
background: url('~assets/images/npc/normal/time_travelers_background.png');
height: 216px;
}
.content {
display: flex;
+3 -2
View File
@@ -115,7 +115,7 @@
.fast-company.svg-icon(v-html='icons.fastCompany')
.discover.svg-icon(v-html='icons.discover')
.container-fluid
.seamless_stars_varied_opacity_repeat
.row.seamless_stars_varied_opacity_repeat
</template>
<style lang='scss'>
@@ -663,10 +663,11 @@
await hello(network).logout();
} catch (e) {} // eslint-disable-line
const redirectUrl = `${window.location.protocol}//${window.location.host}`;
const auth = await hello(network).login({
scope: 'email',
// explicitly pass the redirect url or it might redirect to /home
redirect_uri: '', // eslint-disable-line camelcase
redirect_uri: redirectUrl, // eslint-disable-line camelcase
});
await this.$store.dispatch('auth:socialAuth', {
@@ -67,7 +67,7 @@ export default {
} else if (assignedUsersLength > 1 && !this.userIsAssigned) {
return this.$t('assignedToMembers', {userCount: assignedUsersLength});
} else if (assignedUsersLength > 1 && this.userIsAssigned) {
return this.$t('assignedToYouAndMembers', {userCount: assignedUsersLength});
return this.$t('assignedToYouAndMembers', {userCount: assignedUsersLength - 1});
} else if (this.userIsAssigned) {
return this.$t('youAreAssigned');
} else if (assignedUsersLength === 0) {
@@ -27,9 +27,9 @@ export default {
let userIsRequesting = this.task.group.approvals && this.task.group.approvals.indexOf(this.user._id) !== -1;
if (approvalsLength === 1 && !userIsRequesting) {
return this.$t('youAreRequestingApproval', {userName: approvals[0].userId.profile.name});
return this.$t('userRequestsApproval', {userName: approvals[0].userId.profile.name});
} else if (approvalsLength > 1 && !userIsRequesting) {
return this.$t('youAreRequestingApproval', {userCount: approvalsLength});
return this.$t('userCountRequestsApproval', {userCount: approvalsLength});
} else if (approvalsLength === 1 && userIsRequesting) {
return this.$t('youAreRequestingApproval');
}
+1 -1
View File
@@ -446,7 +446,6 @@ export default {
if (this.type !== 'todo') return;
this.$root.$on('habitica::resync-requested', () => {
if (this.activeFilters.todo.label !== 'complete2') return;
this.loadCompletedTodos(true);
});
},
@@ -544,6 +543,7 @@ export default {
this.quickAddText = '';
this.quickAddRows = 1;
this.createTask(tasks);
this.$refs.quickAdd.blur();
},
editTask (task) {
this.$emit('editTask', task);
+3 -3
View File
@@ -190,7 +190,7 @@ export default {
mounted () {
// @TODO: should we abstract the drawer state/local store to a library and mixing combo? We use a similar pattern in equipment
const spellDrawerState = getLocalSetting(CONSTANTS.keyConstants.SPELL_DRAWER_STATE);
if (spellDrawerState === CONSTANTS.valueConstants.DRAWER_CLOSED) {
if (spellDrawerState === CONSTANTS.drawerStateValues.DRAWER_CLOSED) {
this.$store.state.spellOptions.spellDrawOpen = false;
}
},
@@ -205,11 +205,11 @@ export default {
this.$store.state.spellOptions.spellDrawOpen = newState;
if (newState) {
setLocalSetting(CONSTANTS.keyConstants.SPELL_DRAWER_STATE, CONSTANTS.valueConstants.DRAWER_OPEN);
setLocalSetting(CONSTANTS.keyConstants.SPELL_DRAWER_STATE, CONSTANTS.drawerStateValues.DRAWER_OPEN);
return;
}
setLocalSetting(CONSTANTS.keyConstants.SPELL_DRAWER_STATE, CONSTANTS.valueConstants.DRAWER_CLOSED);
setLocalSetting(CONSTANTS.keyConstants.SPELL_DRAWER_STATE, CONSTANTS.drawerStateValues.DRAWER_CLOSED);
},
spellDisabled (skill) {
if (skill === 'frost' && this.user.stats.buffs.streaks) {
+36 -32
View File
@@ -1,6 +1,6 @@
<template lang="pug">
form(v-if="task", @submit.stop.prevent="submit()")
b-modal#task-modal(size="sm", @hidden="onClose()", @shown="focusInput()")
b-modal#task-modal(size="sm", @hidden="onClose()", @show="handleOpen()", @shown="focusInput()")
.task-modal-header(slot="modal-header", :class="cssClass('bg')")
.clearfix
h1.float-left {{ title }}
@@ -159,11 +159,11 @@
.option.group-options(v-if='groupId')
.form-group.row
label.col-12(v-once) {{ $t('assignedTo') }}
.col-12
.col-12.mt-2
.category-wrap(@click="showAssignedSelect = !showAssignedSelect")
span.category-select(v-if='assignedMembers && assignedMembers.length === 0') {{$t('none')}}
span.category-select(v-else)
span(v-for='memberId in assignedMembers') {{memberNamesById[memberId]}}
span.mr-1(v-for='memberId in assignedMembers') {{memberNamesById[memberId]}}
.category-box(v-if="showAssignedSelect")
.container
.row
@@ -176,7 +176,7 @@
label.custom-control-label(v-once, :for="`assigned-${member._id}`") {{ member.profile.name }}
.row
button.btn.btn-primary(@click="showAssignedSelect = !showAssignedSelect") {{$t('close')}}
button.btn.btn-primary(@click.stop.prevent="showAssignedSelect = !showAssignedSelect") {{$t('close')}}
.option.group-options(v-if='groupId')
.form-group
@@ -705,26 +705,8 @@ export default {
};
},
watch: {
async task () {
if (this.groupId && this.task.group && this.task.group.approval && this.task.group.approval.required) {
this.requiresApproval = true;
}
if (this.groupId) {
let members = await this.$store.dispatch('members:getGroupMembers', {
groupId: this.groupId,
includeAllPublicFields: true,
});
this.members = members;
this.members.forEach(member => {
this.memberNamesById[member._id] = member.profile.name;
});
this.assignedMembers = [];
if (this.task.group && this.task.group.assignedUsers) this.assignedMembers = this.task.group.assignedUsers;
}
// @TODO: This whole component is mutating a prop and that causes issues. We need to not copy the prop similar to group modals
if (this.task) this.checklist = clone(this.task.checklist);
task () {
this.syncTask();
},
'task.startDate' () {
this.calculateMonthlyRepeatDays();
@@ -813,6 +795,30 @@ export default {
},
methods: {
...mapActions({saveTask: 'tasks:save', destroyTask: 'tasks:destroy', createTask: 'tasks:create'}),
async syncTask () {
if (this.groupId && this.task.group && this.task.group.approval) {
this.requiresApproval = this.task.group.approval.required;
}
if (this.groupId) {
let members = await this.$store.dispatch('members:getGroupMembers', {
groupId: this.groupId,
includeAllPublicFields: true,
});
this.members = members;
this.members.forEach(member => {
this.memberNamesById[member._id] = member.profile.name;
});
this.assignedMembers = [];
if (this.task.group && this.task.group.assignedUsers) this.assignedMembers = this.task.group.assignedUsers;
}
// @TODO: This whole component is mutating a prop and that causes issues. We need to not copy the prop similar to group modals
if (this.task) this.checklist = clone(this.task.checklist);
},
async handleOpen () {
this.syncTask();
},
cssClass (suffix) {
return this.getTaskClasses(this.task, `${this.purpose === 'edit' ? 'edit' : 'create'}-modal-${suffix}`);
},
@@ -886,6 +892,12 @@ export default {
async submit () {
if (this.newChecklistItem) this.addChecklistItem();
if (this.groupId) {
this.task.group.assignedUsers = this.assignedMembers;
this.task.requiresApproval = this.requiresApproval;
this.task.group.approval.required = this.requiresApproval;
}
if (this.purpose === 'create') {
if (this.challengeId) {
this.$store.dispatch('tasks:createChallengeTasks', {
@@ -906,19 +918,11 @@ export default {
});
});
Promise.all(promises);
this.task.group.assignedUsers = this.assignedMembers;
this.$emit('taskCreated', this.task);
} else {
this.createTask(this.task);
}
} else {
if (this.groupId) {
this.task.group.assignedUsers = this.assignedMembers;
this.task.requiresApproval = this.requiresApproval;
}
this.saveTask(this.task);
this.$emit('taskEdited', this.task);
}
+3 -3
View File
@@ -52,7 +52,7 @@
// @TODO: Implement new message header here when we fix the above
.new-message-row(v-if='selectedConversation.key && !user.flags.chatRevoked')
textarea(v-model='newMessage')
textarea(v-model='newMessage', @keyup.ctrl.enter='sendPrivateMessage()')
button.btn.btn-secondary(@click='sendPrivateMessage()') Send
</template>
@@ -337,12 +337,12 @@ export default {
optTextSet () {
if (!this.user.inbox.optOut) {
return {
switchDescription: this.$t('PMDisable'),
switchDescription: this.$t('PMReceive'),
popoverText: this.$t('PMEnabledOptPopoverText'),
};
}
return {
switchDescription: this.$t('PMEnable'),
switchDescription: this.$t('PMReceive'),
popoverText: this.$t('PMDisabledOptPopoverText'),
};
},
+6 -1
View File
@@ -3,11 +3,16 @@ const CONSTANTS = {
keyConstants: {
SPELL_DRAWER_STATE: 'spell-drawer-state',
EQUIPMENT_DRAWER_STATE: 'equipment-drawer-state',
CURRENT_EQUIPMENT_DRAWER_TAB: 'current-equipment-drawer-tab',
},
valueConstants: {
drawerStateValues: {
DRAWER_CLOSED: 'drawer-closed',
DRAWER_OPEN: 'drawer-open',
},
equipmentDrawerTabValues: {
COSTUME_TAB: 'costume-tab',
EQUIPMENT_TAB: 'equipment-tab',
},
};
function setLocalSetting (key, value) {
+1 -1
View File
@@ -297,7 +297,7 @@ router.beforeEach(function routerGuard (to, from, next) {
name: redirectTo,
query: redirectTo === 'login' ? {
redirectTo: to.path,
} : null,
} : to.query,
});
}
+8 -1
View File
@@ -359,5 +359,12 @@
"backgroundRowboatText": "Гребна лодка",
"backgroundRowboatNotes": "Изпейте песен в гребната лодка",
"backgroundPirateFlagText": "Пиратско знаме",
"backgroundPirateFlagNotes": "Развейте страховито пиратско знаме."
"backgroundPirateFlagNotes": "Развейте страховито пиратско знаме.",
"backgrounds072018": "КОМПЛЕКТ 50: юли 2018 г.",
"backgroundDarkDeepText": "Дълбочинен мрак",
"backgroundDarkDeepNotes": "Плувайте надълбоко в мрака, сред биолуминесцентни животни.",
"backgroundDilatoryCityText": "Град Мудноград",
"backgroundDilatoryCityNotes": "Разгледайте подводния град Мудноград.",
"backgroundTidePoolText": "Приливно езеро",
"backgroundTidePoolNotes": "Наблюдавайте океанския живот около приливно езеро."
}
+1 -1
View File
@@ -195,7 +195,7 @@
"hatchingPotionFairy": "Фейски цвят",
"hatchingPotionStarryNight": "Звездна нощ",
"hatchingPotionRainbow": "Дъга",
"hatchingPotionGlass": "Glass",
"hatchingPotionGlass": "Стъкло",
"hatchingPotionNotes": "Излейте това върху яйце и от него ще се излюпи любимец с(ъс) <%= potText(locale) %>.",
"premiumPotionAddlNotes": "Не може да се използва върху яйца за любимци от мисии.",
"foodMeat": "Месо",
+40 -32
View File
@@ -258,14 +258,14 @@
"weaponSpecialSpring2018MageNotes": "Това вълшебно цвете никога няма да увехне. Увеличава интелигентността с <%= int %> и усета с <%= per %>. Ограничена серия: Пролетна екипировка 2018 г.",
"weaponSpecialSpring2018HealerText": "Гранатен прът",
"weaponSpecialSpring2018HealerNotes": "Камъните в този жезъл ще концентрира силите Ви, когато изпълнявате лечебни заклинания! Увеличава интелигентността с <%= int %>. Ограничена серия: Пролетна екипировка 2018 г.",
"weaponSpecialSummer2018RogueText": "Fishing Rod",
"weaponSpecialSummer2018RogueNotes": "This lightweight, practically unbreakable rod and reel can be dual-wielded to maximize your DPS (Dragonfish Per Summer). Increases Strength by <%= str %>. Limited Edition 2018 Summer Gear.",
"weaponSpecialSummer2018WarriorText": "Betta Fish Spear",
"weaponSpecialSummer2018WarriorNotes": "Mighty enough for battle, elegant enough for ceremony, this exquisitely crafted spear shows you will protect your home surf no matter what! Increases Strength by <%= str %>. Limited Edition 2018 Summer Gear.",
"weaponSpecialSummer2018MageText": "Lionfish Fin Rays",
"weaponSpecialSummer2018MageNotes": "Underwater, magic based on fire, ice, or electricity can prove hazardous to the Mage wielding it. Conjuring poisonous spines, however, works brilliantly! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2018 Summer Gear.",
"weaponSpecialSummer2018HealerText": "Merfolk Monarch Trident",
"weaponSpecialSummer2018HealerNotes": "With a benevolent gesture, you command healing water to flow through your dominions in waves. Increases Intelligence by <%= int %>. Limited Edition 2018 Summer Gear.",
"weaponSpecialSummer2018RogueText": "Въдица",
"weaponSpecialSummer2018RogueNotes": "Можете да държите по две от тези леки и практически неразрушими въдици, за да удвоите улова си. Увеличава силата с <%= str %>. Ограничена серия: Лятна екипировка 2018 г.",
"weaponSpecialSummer2018WarriorText": "Копие на сиамска бойна риба",
"weaponSpecialSummer2018WarriorNotes": "Достатъчно здраво за битки и достатъчно изтънчено за церемонии – това специално изработено копие показва, че ще защитите дома си на всяка цена! Увеличава силата с <%= str %>. Ограничена серия: Лятна екипировка 2018 г.",
"weaponSpecialSummer2018MageText": "Лъчи-перки на лъвска риба",
"weaponSpecialSummer2018MageNotes": "Под водата заклинанията, основаващи се на огън, лед или електричество, може да бъдат опасни за Магьосника. Измагьосването на отровни шипове, обаче, работи безпроблемно! Увеличава интелигентността с <%= int %> и усета с <%= per %>. Ограничена серия: Лятна екипировка 2018 г.",
"weaponSpecialSummer2018HealerText": "Царски русалски тризъбец",
"weaponSpecialSummer2018HealerNotes": "С лек благосклонен жест насочвате лечебна вода на вълни през владенията си. Увеличава интелигентността с <%= int %>. Ограничена серия: Лятна екипировка 2018 г.",
"weaponMystery201411Text": "Вилица на изобилието",
"weaponMystery201411Notes": "Наръгайте враговете си или си боцнете от любимата храна — тази универсална вилица може всичко! не променя показателите. Предмет за абонати: ноември 2014 г.",
"weaponMystery201502Text": "Блестящият крилат скиптър на любовта и истината",
@@ -346,6 +346,8 @@
"weaponArmoireCobblersHammerNotes": "Това е специален чук за обработка на кожа. Но може да се използва и срещу червените ежедневни задачи. Увеличава якостта и силата с по <%= attrs %>. Омагьосан гардероб: Обущарски комплект (предмет 2 от 3).",
"weaponArmoireGlassblowersBlowpipeText": "Тръба за духане на стъклодухач",
"weaponArmoireGlassblowersBlowpipeNotes": "Използвайте тази тръба, за да изваете разтопеното стъкло и да го превърнете в красиви вази, орнаменти и други интересни неща. Увеличава силата с <%= str %>. Омагьосан гардероб: комплект „Стъклодухач“ (предмет 1 от 4).",
"weaponArmoirePoisonedGobletText": "Отровен бокал",
"weaponArmoirePoisonedGobletNotes": "Използвайте това, за да изградите имунитет срещу различни невъобразимо опасни отрови. Увеличава интелигентността с <%= int %>. Омагьосан гардероб: комплект „Пиратска принцеса“ (предмет 3 от 4).",
"armor": "броня",
"armorCapitalized": "Броня",
"armorBase0Text": "Обикновени дрехи",
@@ -580,14 +582,14 @@
"armorSpecialSpring2018MageNotes": "Заклинанията Ви ще се подобрят, ако носите тези меки копринени цветчета. Увеличава интелигентността с <%= int %>. Ограничена серия: Пролетна екипировка 2018 г.",
"armorSpecialSpring2018HealerText": "Гранатена броня",
"armorSpecialSpring2018HealerNotes": "Нека тази светла броня даде на сърцето Ви силата да лекувате. Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2018 г.",
"armorSpecialSummer2018RogueText": "Pocket Fishing Vest",
"armorSpecialSummer2018RogueNotes": "Bobbers? Boxes of hooks? Spare line? Lockpicks? Smoke bombs? Whatever you need on hand for your summer fishing getaway, there's a pocket for it! Increases Perception by <%= per %>. Limited Edition 2018 Summer Gear.",
"armorSpecialSummer2018WarriorText": "Betta Tail Armor",
"armorSpecialSummer2018WarriorNotes": "Dazzle onlookers with whorls of magnificent color as you spin and dart through the water. How could any opponent dare strike at this beauty? Increases Constitution by <%= con %>. Limited Edition 2018 Summer Gear.",
"armorSpecialSummer2018MageText": "Lionfish Scale Hauberk",
"armorSpecialSummer2018MageNotes": "Venom magic has a reputation for subtlety. Not so this colorful armor, whose message is clear to beast and task alike: watch out! Increases Intelligence by <%= int %>. Limited Edition 2018 Summer Gear.",
"armorSpecialSummer2018HealerText": "Merfolk Monarch Robes",
"armorSpecialSummer2018HealerNotes": "These cerulean vestments reveal that you have land-walking feet... well. Not even a monarch can be expected to be perfect. Increases Constitution by <%= con %>. Limited Edition 2018 Summer Gear.",
"armorSpecialSummer2018RogueText": "Джобен рибарски елек",
"armorSpecialSummer2018RogueNotes": "Плувки? Кутии с кукички? Резервна корда? Инструменти за разбиване на ключалки? Димни бомби? Каквото и да Ви потрябва за тазгодишния риболовен сезон, има джоб за него! Увеличава усета с <%= per %>. Ограничена серия: Лятна екипировка 2018 г.",
"armorSpecialSummer2018WarriorText": "Опашка на сиамска бойна риба",
"armorSpecialSummer2018WarriorNotes": "Заслепете зяпачите с разноцветни спирали, докато се въртите и стрелкате през водата. Как може някой враг изобщо да се осмели да нарани такава красота? Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2018 г.",
"armorSpecialSummer2018MageText": "Люспена броня на лъвска риба",
"armorSpecialSummer2018MageNotes": "Заклинанията за отравяне обикновено се правят незабележимо. Не и с тази цветна броня, с която всичко се казва ясно: внимавайте! Увеличава интелигентността с <%= int %>. Ограничена серия: Лятна екипировка 2018 г.",
"armorSpecialSummer2018HealerText": "Царски русалски одежди",
"armorSpecialSummer2018HealerNotes": "Тези небесно сини одежди показват, че имате… крака за ходене по земята. Дори и царете не са перфектни. Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2017 г.",
"armorMystery201402Text": "Одежди на вестоносец",
"armorMystery201402Notes": "Блестящи и здрави, тези одежди имат много джобове за носене на писма. Не променя показателите. Предмет за абонати: февруари 2014 г.",
"armorMystery201403Text": "Броня на горски бродник",
@@ -652,8 +654,8 @@
"armorMystery201712Notes": "Топлината и светлината произведени от тази вълшебна броня ще стоплят сърцето Ви, но няма да изгорят кожата Ви! Не променя показателите. Предмет за абонати: декември 2017 г.",
"armorMystery201802Text": "Броня на любовна буболечка",
"armorMystery201802Notes": "Тази лъскава броня отразява силата на сърцето Ви и я разпръсква към хабитиканците наоколо, които имат нужда от окуражаване! Не променя показателите. Предмет за абонати: февруари 2018 г.",
"armorMystery201806Text": "Alluring Anglerfish Tail",
"armorMystery201806Notes": "This sinuous tail features glowing spots to light your way through the deep. Confers no benefit. June 2018 Subscriber Item.",
"armorMystery201806Text": "Опашка на морски дявол",
"armorMystery201806Notes": "По тази игрива опашка има светещи петна, които ще осветят пътя Ви в дълбините. Не променя показателите. Предмет за абонати: юни 2018 г.",
"armorMystery301404Text": "Изтънчен костюм",
"armorMystery301404Notes": "Спретнат и елегантен! Не променя показателите. Предмет за абонати: февруари 3015 г.",
"armorMystery301703Text": "Изтънчена паунова рокля",
@@ -744,6 +746,8 @@
"armorArmoireGlassblowersCoverallsNotes": "Този гащеризон ще Ви защити, когато създавате шедьоври от разтопено стъкло. Увеличава якостта с <%= con %>. Омагьосан гардероб: комплект „Стъклодухач“ (предмет 2 от 4).",
"armorArmoireBluePartyDressText": "Синя бална рокля",
"armorArmoireBluePartyDressNotes": "Вие имате концентрация, сила и ум, и сте в крак с модата! Увеличава усета, силата и якостта с по <%= attrs %>. Омагьосан гардероб: комплект „Синя панделка“ (предмет 2 от 2).",
"armorArmoirePiraticalPrincessGownText": "Рокля на пиратска принцеса",
"armorArmoirePiraticalPrincessGownNotes": "В тази луксозна дреха има много джобове за криене на оръжия и плячка! Увеличава усета с <%= per %>. Омагьосан гардероб: комплект „Пиратска принцеса“ (предмет 2 от 4).",
"headgear": "шлем",
"headgearCapitalized": "Защита за главата",
"headBase0Text": "Няма защита за главата",
@@ -978,14 +982,14 @@
"headSpecialSpring2018MageNotes": "Цветчетата на този шлем ще Ви дадат специални пролетни вълшебни сили. Увеличава усета с <%= per %>. Ограничена серия: Пролетна екипировка 2018 г.",
"headSpecialSpring2018HealerText": "Гранатена диадема",
"headSpecialSpring2018HealerNotes": "Полираните скъпоценни камъни по тази диадема ще увеличат мисловните Ви сили. Увеличава интелигентността с <%= int %>. Ограничена серия: Пролетна екипировка 2018 г.",
"headSpecialSummer2018RogueText": "Fishing Sun Hat",
"headSpecialSummer2018RogueNotes": "Provides comfort and protection from the harsh glare of the summer sun over the water. Especially important if you're more accustomed to staying stealthy in the shadows! Increases Perception by <%= per %>. Limited Edition 2018 Summer Gear.",
"headSpecialSummer2018WarriorText": "Betta Fish Barbute",
"headSpecialSummer2018WarriorNotes": "Show everyone you're the alpha betta with this flamboyant helm! Increases Strength by <%= str %>. Limited Edition 2018 Summer Gear.",
"headSpecialSummer2018MageText": "Lionfish Crest",
"headSpecialSummer2018MageNotes": "Glare dolorously upon anyone who dares say you look like a “tastyfish”. Increases Perception by <%= per %>. Limited Edition 2018 Summer Gear.",
"headSpecialSummer2018HealerText": "Merfolk Monarch Crown",
"headSpecialSummer2018HealerNotes": "Adorned with aquamarine, this finned diadem marks leadership of folk, fish, and those who are a bit of both! Increases Intelligence by <%= int %>. Limited Edition 2018 Summer Gear.",
"headSpecialSummer2018RogueText": "Рибарска шапка за слънце",
"headSpecialSummer2018RogueNotes": "Осигурява комфорт и защита от жаркото лятно слънце над водата. Това е особено важно, ако сте свикнали да се промъквате в сенките! Увеличава силата с <%= per %>. Ограничена серия: Лятна екипировка 2018 г.",
"headSpecialSummer2018WarriorText": "Шлем на сиамска бойна риба",
"headSpecialSummer2018WarriorNotes": "Покажете на всички, че не бива да се закачат с Вас – с този пищен шлем! Увеличава силата с <%= str %>. Ограничена серия: Лятна екипировка 2018 г.",
"headSpecialSummer2018MageText": "Гребен на лъвска риба",
"headSpecialSummer2018MageNotes": "Пригответе убийствения си поглед, за всеки, който се осмели да каже, че изглеждате „сладко“. Увеличава усета с <%= per %>. Ограничена серия: Лятна екипировка 2018 г.",
"headSpecialSummer2018HealerText": "Царска русалска корона",
"headSpecialSummer2018HealerNotes": "Украсена със зеленикаво-сини оттенъци, тази диадема с перки показва господарството Ви над хората, рибите и онези, които са по малко от двете! Увеличава интелигентността с <%= int %>. Ограничена серия: Лятна екипировка 2018 г.",
"headSpecialGaymerxText": "Боен шлем с цветовете на дъгата",
"headSpecialGaymerxNotes": "В чест на конференцията GaymerX, този специален шлем е оцветен с шарка на дъга! GaymerX е игрално изложение в чест на ЛГБТ културата и игрите и е отворено за всички.",
"headMystery201402Text": "Крилат шлем",
@@ -1056,8 +1060,8 @@
"headMystery201803Notes": "Въпреки че изглежда като обикновено украшение, можете да накарате крилата на тази диадема да махат и да… получите още по-хубава украса! Не променя показателите. Предмет за абонати: март 2018 г.",
"headMystery201805Text": "Феноменален паунов шлем",
"headMystery201805Notes": "С този шлем ще се превърнете в най-гордата и най-красивата (а сигурно и най-шумната) птица наоколо. Не променя показателите. Предмет за абонати: май 2018 г.",
"headMystery201806Text": "Alluring Anglerfish Helm",
"headMystery201806Notes": "The mesmerizing light atop this helm will call all the creatures of the sea to your side. We urge you to use your glowy powers of attraction for good! Confers no benefit. June 2018 Subscriber Item.",
"headMystery201806Text": "Шлем на морски дявол",
"headMystery201806Notes": "Хипнотизиращата светлина, закачена отгоре на този шлем, ще привика всички морски същества на Ваша страна. Не променя показателите. Предмет за абонати: февруари 2018 г.",
"headMystery301404Text": "Украсен цилиндър",
"headMystery301404Notes": "Украсен цилиндър за най-изтънчените и високопоставени членове на обществото. Не променя показателите. Предмет за абонати: януари 3015 г.",
"headMystery301405Text": "Обикновен цилиндър",
@@ -1158,6 +1162,8 @@
"headArmoireBigWigNotes": "Някои напудрени перуки придават авторитет, но тази е само за смях! Увеличава силата с <%= str %>. Омагьосан гардероб: независим предмет.",
"headArmoireGlassblowersHatText": "Шапка на стъклодухач",
"headArmoireGlassblowersHatNotes": "Тази шапка просто си отива с останалото защитно облекло на стъклодухач! Увеличава усета с <%= per %>. Омагьосан гардероб: комплект „Стъклодухач“ (предмет 3 от 4).",
"headArmoirePiraticalPrincessHeaddressText": "Украса за глава на пиратска принцеса",
"headArmoirePiraticalPrincessHeaddressNotes": "Пиратите са известни с причудливите неща, които носят на главите си! Увеличава усета и интелигентността с по <%= attrs %>. Омагьосан гардероб: комплект „Пиратска принцеса“ (предмет 1 от 4).",
"offhand": "страничен предмет",
"offhandCapitalized": "Страничен предмет",
"shieldBase0Text": "Няма страничен предмет",
@@ -1308,10 +1314,10 @@
"shieldSpecialSpring2018WarriorNotes": "Този здрав щит свети с величието на най-чистата светлина. Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2018 г.",
"shieldSpecialSpring2018HealerText": "Гранатен щит",
"shieldSpecialSpring2018HealerNotes": "Въпреки вида си, този гранатен щит е доста здрав! Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2018 г.",
"shieldSpecialSummer2018WarriorText": "Betta Skull Shield",
"shieldSpecialSummer2018WarriorNotes": "Fashioned from stone, this fearsome skull-styled shield strikes fear into fish foes while rallying your Skeleton pets and mounts. Increases Constitution by <%= con %>. Limited Edition 2018 Summer Gear.",
"shieldSpecialSummer2018HealerText": "Merfolk Monarch Emblem",
"shieldSpecialSummer2018HealerNotes": "This shield can produce a dome of air for the benefit of land-dwelling visitors to your watery realm. Increases Constitution by <%= con %>. Limited Edition 2018 Summer Gear.",
"shieldSpecialSummer2018WarriorText": "Щит от череп на сиамска бойна риба",
"shieldSpecialSummer2018WarriorNotes": "Изработен от камък, този страховит щит във формата на череп ще всее ужас в рибните неприятели, като същевременно ще сплоти скелетните Ви любимци и превози. Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2018 г.",
"shieldSpecialSummer2018HealerText": "Царски русалски герб",
"shieldSpecialSummer2018HealerNotes": "Този щит може да създаде мехур от въздух за земните гости на подводното Ви царство. Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2018 г.",
"shieldMystery201601Text": "Решителен убиец",
"shieldMystery201601Notes": "Това острие може да отблъсне всички разсейващи Ви неща. Не променя показателите. Предмет за абонати: януари 2016 г.",
"shieldMystery201701Text": "Спиращ времето щит",
@@ -1372,6 +1378,8 @@
"shieldArmoireFancyShoeNotes": "Много специална обувка, по която работите. Подходяща за царски величия! Увеличава интелигентността и усета с по <%= attrs %>. Омагьосан гардероб: Обущарски комплект (предмет 3 от 3).",
"shieldArmoireFancyBlownGlassVaseText": "Изящна ваза от стъкло",
"shieldArmoireFancyBlownGlassVaseNotes": "Каква страхотна ваза сътворихте! Какво има вътре? Увеличава интелигентността с <%= int %>. Омагьосан гардероб: комплект „Стъклодухач“ (предмет 4 от 4).",
"shieldArmoirePiraticalSkullShieldText": "Пиратски щит от череп",
"shieldArmoirePiraticalSkullShieldNotes": "Този омагьосан щит шепне къде са местата, където враговете Ви са заровили тайните си съкровища. Слушайте внимателно! Увеличава усета и интелигентността с по <%= attrs %>. Омагьосан гардероб: комплект „Пиратска принцеса“ (предмет 4 от 4).",
"back": "Аксесоар за гръб",
"backCapitalized": "Аксесоар за гръб",
"backBase0Text": "Няма аксесоар за гръб",
+5 -5
View File
@@ -134,10 +134,9 @@
"PMPlaceholderDescription": "Изберете разговор отляво",
"PMPlaceholderTitleRevoked": "Привилегиите Ви в чата Ви бяха отнети",
"PMPlaceholderDescriptionRevoked": "Не можете да изпращате лични съобщения, тъй като привилегиите Ви в чата Ви бяха отнети. Ако имате въпроси или притеснения относно това, моля, пишете на <a href=\"mailto:admin@habitica.com\">admin@habitica.com</a>, за да ги обсъдите с екипа.",
"PMEnable": "Разрешаване на личните съобщения",
"PMDisable": "Забраняване на личните съобщения",
"PMEnabledOptPopoverText": "Ако личните съобщения са забранени, Вие ще можете да изпращате съобщения, но никой няма да може да изпраща на Вас.",
"PMDisabledOptPopoverText": "Включете това, за да можете да получавате съобщения.",
"PMReceive": "Получаване на лични съобщения",
"PMEnabledOptPopoverText": "Личните съобщения са включени. Потребителите могат да се свържат с Вас чрез профила Ви.",
"PMDisabledOptPopoverText": "Личните съобщения са изключени. Включете ги, ако искате потребителите да могат да се свързват с Вас чрез профила Ви.",
"PMDisabledCaptionTitle": "Личните съобщения са забранени",
"PMDisabledCaptionText": "Вие можете да изпращате съобщения, но никой няма да може да изпраща на Вас.",
"block": "Блокиране",
@@ -256,7 +255,7 @@
"confirmApproval": "Наистина ли искате да одобрите тази задача?",
"confirmNeedsWork": "Наистина ли искате да отбележите, че тази задача се нуждае от още работа?",
"userRequestsApproval": "<%= userName %> иска одобрение",
"userCountRequestsApproval": "<%= userCount %> потребители искат одобрение",
"userCountRequestsApproval": "<%= userCount %> членове искат одобрение",
"youAreRequestingApproval": "Вие искате одобрение",
"chatPrivilegesRevoked": "Не можете да направите това, защото привилегиите Ви в чата са Ви били отнети.",
"cannotCreatePublicGuildWhenMuted": "Не можете да създадете обществена гилдия, защото привилегиите Ви в чата са Ви били отнети.",
@@ -381,6 +380,7 @@
"bronzeTier": "Бронзово ниво",
"privacySettings": "Настройки за поверителността",
"onlyLeaderCreatesChallenges": "Само водачът може да създава предизвикателства",
"onlyLeaderCreatesChallengesDetail": "Ако това е избрано, обикновените членове на групата няма да могат да създават предизвикателства.",
"privateGuild": "Частна гилдия",
"charactersRemaining": "Оставащи знаци: <%= characters %>",
"guildSummary": "Резюме",
+5 -5
View File
@@ -121,16 +121,16 @@
"spring2018TulipMageSet": "Магьосник на лалето (магьосник)",
"spring2018GarnetHealerSet": "Гранатен лечител (лечител)",
"spring2018DucklingRogueSet": "Патешки мошеник (мошеник)",
"summer2018BettaFishWarriorSet": "Betta Fish Warrior (Warrior)",
"summer2018LionfishMageSet": "Lionfish Mage (Mage)",
"summer2018MerfolkMonarchSet": "Merfolk Monarch (Healer)",
"summer2018FisherRogueSet": "Fisher-Rogue (Rogue)",
"summer2018BettaFishWarriorSet": "Сиамски рибен воин (воин)",
"summer2018LionfishMageSet": "Лъвски рибен магьосник (магьосник)",
"summer2018MerfolkMonarchSet": "Цар на русалките (лечител)",
"summer2018FisherRogueSet": "Рибар-мошеник (мошеник)",
"eventAvailability": "Налично за купуване до <%= date(locale) %>.",
"dateEndMarch": "30 април",
"dateEndApril": "19 април",
"dateEndMay": "31 май",
"dateEndJune": "14 юни",
"dateEndJuly": "July 31",
"dateEndJuly": "31 юли",
"dateEndAugust": "31 август",
"dateEndOctober": "31 октомври",
"dateEndNovember": "30 ноември",
+1
View File
@@ -98,6 +98,7 @@
"guildQuestsNotSupported": "Гилдиите не могат да бъдат канени в мисии.",
"questNotOwned": "Не притежавате този свитък с мисия.",
"questNotGoldPurchasable": "Мисията „<%= key %>“ не може да бъде купена със злато.",
"questNotGemPurchasable": "Мисията „<%= key %>“ не може да бъде купена с диаманти.",
"questLevelTooHigh": "Трябва да бъдете ниво <%= level %>, за да започнете тази мисия.",
"questAlreadyUnderway": "Групата Ви е вече изпълнява мисия. Опитайте отново, когато текущата мисия приключи.",
"questAlreadyAccepted": "Вече сте приели поканата за мисията.",
+2 -2
View File
@@ -603,6 +603,6 @@
"questSquirrelUnlockText": "Отключва възможността за купуване на яйца на катерица от пазара.",
"cuddleBuddiesText": "Пакет мисии „Пухкави приятелчета“",
"cuddleBuddiesNotes": "Съдържа: „Зайчето-убиец“, „Нечестивият пор“ и „Бандата на морските свинчета“. Наличен до 31 май.",
"aquaticAmigosText": "Aquatic Amigos Quest Bundle",
"aquaticAmigosNotes": "Contains 'The Magical Axolotl', 'The Kraken of Inkomplete', and 'The Call of Octothulu'. Available until June 30."
"aquaticAmigosText": "Пакет мисии „Водни дружки“",
"aquaticAmigosNotes": "Съдържа: „Вълшебният саламандър“, „Кракенът на незавършеността“ и „Зовът на Октотулу“. Наличен до 30 юни."
}
+1 -1
View File
@@ -144,7 +144,7 @@
"mysterySet201803": "Комплект на смелото водно конче",
"mysterySet201804": "Комплект на изтупаната катерица",
"mysterySet201805": "Феноменален паунов комплект",
"mysterySet201806": "Alluring Anglerfish Set",
"mysterySet201806": "Комплект на морския дявол",
"mysterySet301404": "Стандартен изтънчен комплект",
"mysterySet301405": "Комплект изтънчени принадлежности",
"mysterySet301703": "Изтънчен паунов комплект",
+8 -1
View File
@@ -359,5 +359,12 @@
"backgroundRowboatText": "Rowboat",
"backgroundRowboatNotes": "Sing rounds in a Rowboat.",
"backgroundPirateFlagText": "Pirate Flag",
"backgroundPirateFlagNotes": "Fly a fearsome Pirate Flag."
"backgroundPirateFlagNotes": "Fly a fearsome Pirate Flag.",
"backgrounds072018": "SET 50: Released July 2018",
"backgroundDarkDeepText": "Dark Deep",
"backgroundDarkDeepNotes": "Swim in the Dark Deep among bioluminescent critters.",
"backgroundDilatoryCityText": "City of Dilatory",
"backgroundDilatoryCityNotes": "Meander through the undersea City of Dilatory.",
"backgroundTidePoolText": "Tide Pool",
"backgroundTidePoolNotes": "Observe the ocean life near a Tide Pool."
}
+8
View File
@@ -346,6 +346,8 @@
"weaponArmoireCobblersHammerNotes": "This hammer is specially made for leatherwork. It can do a real number on a red Daily in a pinch, though. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Cobbler Set (Item 2 of 3).",
"weaponArmoireGlassblowersBlowpipeText": "Glassblower's Blowpipe",
"weaponArmoireGlassblowersBlowpipeNotes": "Use this tube to blow molten glass into beautiful vases, ornaments, and other fancy things. Increases Strength by <%= str %>. Enchanted Armoire: Glassblower Set (Item 1 of 4).",
"weaponArmoirePoisonedGobletText": "Poisoned Goblet",
"weaponArmoirePoisonedGobletNotes": "Use this to build your resistance to iocane powder and other inconceivably dangerous poisons. Increases Intelligence by <%= int %>. Enchanted Armoire: Piratical Princess Set (Item 3 of 4).",
"armor": "zbroj",
"armorCapitalized": "Zbroj",
"armorBase0Text": "Obyčejné oblečení",
@@ -744,6 +746,8 @@
"armorArmoireGlassblowersCoverallsNotes": "These coveralls will protect you while you're making masterpieces with hot molten glass. Increases Constitution by <%= con %>. Enchanted Armoire: Glassblower Set (Item 2 of 4).",
"armorArmoireBluePartyDressText": "Blue Party Dress",
"armorArmoireBluePartyDressNotes": "You're perceptive, tough, smart, and so fashionable! Increases Perception, Strength, and Constitution by <%= attrs %> each. Enchanted Armoire: Blue Hairbow Set (Item 2 of 2).",
"armorArmoirePiraticalPrincessGownText": "Piratical Princess Gown",
"armorArmoirePiraticalPrincessGownNotes": "This luxuriant garment has many pockets for concealing weapons and loot! Increases Perception by <%= per %>. Enchanted Armoire: Piratical Princess Set (Item 2 of 4).",
"headgear": "helm",
"headgearCapitalized": "Headgear",
"headBase0Text": "No Headgear",
@@ -1158,6 +1162,8 @@
"headArmoireBigWigNotes": "Some powdered wigs are for looking more authoritative, but this one is just for laughs! Increases Strength by <%= str %>. Enchanted Armoire: Independent Item.",
"headArmoireGlassblowersHatText": "Glassblower's Hat",
"headArmoireGlassblowersHatNotes": "This hat mainly just looks good with your other protective glassblowing gear! Increases Perception by <%= per %>. Enchanted Armoire: Glassblower Set (Item 3 of 4).",
"headArmoirePiraticalPrincessHeaddressText": "Piratical Princess Headdress",
"headArmoirePiraticalPrincessHeaddressNotes": "Fancy buccaneers are known for their fancy headwear! Increases Perception and Intelligence by <%= attrs %> each. Enchanted Armoire: Piratical Princess Set (Item 1 of 4).",
"offhand": "off-hand item",
"offhandCapitalized": "Off-Hand Item",
"shieldBase0Text": "No Off-Hand Equipment",
@@ -1372,6 +1378,8 @@
"shieldArmoireFancyShoeNotes": "A very special shoe you're working on. It's fit for royalty! Increases Intelligence and Perception by <%= attrs %> each. Enchanted Armoire: Cobbler Set (Item 3 of 3).",
"shieldArmoireFancyBlownGlassVaseText": "Fancy Blown Glass Vase",
"shieldArmoireFancyBlownGlassVaseNotes": "What a fancy vase you've made! What will you put inside? Increases Intelligence by <%= int %>. Enchanted Armoire: Glassblower Set (Item 4 of 4).",
"shieldArmoirePiraticalSkullShieldText": "Piratical Skull Shield",
"shieldArmoirePiraticalSkullShieldNotes": "This enchanted shield will whisper the secret locations of your enemies' treasures- listen closely! Increases Perception and Intelligence by <%= attrs %> each. Enchanted Armoire: Piratical Princess Set (Item 4 of 4).",
"back": "Příslušenství na záda",
"backCapitalized": "Back Accessory",
"backBase0Text": "Bez příslušenství na zádech",
+6 -6
View File
@@ -134,12 +134,11 @@
"PMPlaceholderDescription": "Select a conversation on the left",
"PMPlaceholderTitleRevoked": "Your chat privileges have been revoked",
"PMPlaceholderDescriptionRevoked": "You are not able to send private messages because your chat privileges have been revoked. If you have questions or concerns about this, please email <a href=\"mailto:admin@habitica.com\">admin@habitica.com</a> to discuss it with the staff.",
"PMEnable": "Enable Private Messages",
"PMDisable": "Disable Private Messages",
"PMEnabledOptPopoverText": "When Private Messages are disabled, you still can send messages, but no one can send them to you.",
"PMDisabledOptPopoverText": "Enable this option to be able to receive messages.",
"PMReceive": "Receive Private Messages",
"PMEnabledOptPopoverText": "Private Messages are enabled. Users can contact you via your profile.",
"PMDisabledOptPopoverText": "Private Messages are disabled. Enable this option to allow users to contact you via your profile.",
"PMDisabledCaptionTitle": "Private Messages are disabled",
"PMDisabledCaptionText": "You still can send messages, but no one can send them to you.",
"PMDisabledCaptionText": "You can still send messages, but no one can send them to you.",
"block": "Blokovat",
"unblock": "Odblokovat",
"pm-reply": "Poslat odpověď",
@@ -256,7 +255,7 @@
"confirmApproval": "Are you sure you want to approve this task?",
"confirmNeedsWork": "Are you sure you want to mark this task as needing work?",
"userRequestsApproval": "<%= userName %> requests approval",
"userCountRequestsApproval": "<%= userCount %> request approval",
"userCountRequestsApproval": "<%= userCount %> members request approval",
"youAreRequestingApproval": "You are requesting approval",
"chatPrivilegesRevoked": "You cannot do that because your chat privileges have been revoked.",
"cannotCreatePublicGuildWhenMuted": "You cannot create a public guild because your chat privileges have been revoked.",
@@ -381,6 +380,7 @@
"bronzeTier": "Bronze Tier",
"privacySettings": "Privacy Settings",
"onlyLeaderCreatesChallenges": "Only the Leader can create Challenges",
"onlyLeaderCreatesChallengesDetail": "With this option selected, ordinary group members cannot create Challenges for the group.",
"privateGuild": "Private Guild",
"charactersRemaining": "<%= characters %> characters remaining",
"guildSummary": "Summary",
+1
View File
@@ -98,6 +98,7 @@
"guildQuestsNotSupported": "Cechy nelze pozvat na výpravy.",
"questNotOwned": "Nevlastníte tento svitek výpravy.",
"questNotGoldPurchasable": "Výpravu „<%= key %>\" nelze koupit na zlato.",
"questNotGemPurchasable": "Quest \"<%= key %>\" is not a Gem-purchasable quest.",
"questLevelTooHigh": "Pro začátek výpravy musíte mít úroveň <%= level %>.",
"questAlreadyUnderway": "Vaše družina se již účastní výpravy. Až dokončíte současnou výpravu zkuste to znova.",
"questAlreadyAccepted": "Již jsi přijal pozvánku na výpravu.",
+8 -1
View File
@@ -359,5 +359,12 @@
"backgroundRowboatText": "Rowboat",
"backgroundRowboatNotes": "Sing rounds in a Rowboat.",
"backgroundPirateFlagText": "Pirate Flag",
"backgroundPirateFlagNotes": "Fly a fearsome Pirate Flag."
"backgroundPirateFlagNotes": "Fly a fearsome Pirate Flag.",
"backgrounds072018": "SET 50: Released July 2018",
"backgroundDarkDeepText": "Dark Deep",
"backgroundDarkDeepNotes": "Swim in the Dark Deep among bioluminescent critters.",
"backgroundDilatoryCityText": "City of Dilatory",
"backgroundDilatoryCityNotes": "Meander through the undersea City of Dilatory.",
"backgroundTidePoolText": "Tide Pool",
"backgroundTidePoolNotes": "Observe the ocean life near a Tide Pool."
}
+8
View File
@@ -346,6 +346,8 @@
"weaponArmoireCobblersHammerNotes": "This hammer is specially made for leatherwork. It can do a real number on a red Daily in a pinch, though. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Cobbler Set (Item 2 of 3).",
"weaponArmoireGlassblowersBlowpipeText": "Glassblower's Blowpipe",
"weaponArmoireGlassblowersBlowpipeNotes": "Use this tube to blow molten glass into beautiful vases, ornaments, and other fancy things. Increases Strength by <%= str %>. Enchanted Armoire: Glassblower Set (Item 1 of 4).",
"weaponArmoirePoisonedGobletText": "Poisoned Goblet",
"weaponArmoirePoisonedGobletNotes": "Use this to build your resistance to iocane powder and other inconceivably dangerous poisons. Increases Intelligence by <%= int %>. Enchanted Armoire: Piratical Princess Set (Item 3 of 4).",
"armor": "rustning",
"armorCapitalized": "Armor",
"armorBase0Text": "Almindeligt tøj",
@@ -744,6 +746,8 @@
"armorArmoireGlassblowersCoverallsNotes": "These coveralls will protect you while you're making masterpieces with hot molten glass. Increases Constitution by <%= con %>. Enchanted Armoire: Glassblower Set (Item 2 of 4).",
"armorArmoireBluePartyDressText": "Blue Party Dress",
"armorArmoireBluePartyDressNotes": "You're perceptive, tough, smart, and so fashionable! Increases Perception, Strength, and Constitution by <%= attrs %> each. Enchanted Armoire: Blue Hairbow Set (Item 2 of 2).",
"armorArmoirePiraticalPrincessGownText": "Piratical Princess Gown",
"armorArmoirePiraticalPrincessGownNotes": "This luxuriant garment has many pockets for concealing weapons and loot! Increases Perception by <%= per %>. Enchanted Armoire: Piratical Princess Set (Item 2 of 4).",
"headgear": "helm",
"headgearCapitalized": "Headgear",
"headBase0Text": "No Headgear",
@@ -1158,6 +1162,8 @@
"headArmoireBigWigNotes": "Some powdered wigs are for looking more authoritative, but this one is just for laughs! Increases Strength by <%= str %>. Enchanted Armoire: Independent Item.",
"headArmoireGlassblowersHatText": "Glassblower's Hat",
"headArmoireGlassblowersHatNotes": "This hat mainly just looks good with your other protective glassblowing gear! Increases Perception by <%= per %>. Enchanted Armoire: Glassblower Set (Item 3 of 4).",
"headArmoirePiraticalPrincessHeaddressText": "Piratical Princess Headdress",
"headArmoirePiraticalPrincessHeaddressNotes": "Fancy buccaneers are known for their fancy headwear! Increases Perception and Intelligence by <%= attrs %> each. Enchanted Armoire: Piratical Princess Set (Item 1 of 4).",
"offhand": "off-hand item",
"offhandCapitalized": "Off-Hand Item",
"shieldBase0Text": "No Off-Hand Equipment",
@@ -1372,6 +1378,8 @@
"shieldArmoireFancyShoeNotes": "A very special shoe you're working on. It's fit for royalty! Increases Intelligence and Perception by <%= attrs %> each. Enchanted Armoire: Cobbler Set (Item 3 of 3).",
"shieldArmoireFancyBlownGlassVaseText": "Fancy Blown Glass Vase",
"shieldArmoireFancyBlownGlassVaseNotes": "What a fancy vase you've made! What will you put inside? Increases Intelligence by <%= int %>. Enchanted Armoire: Glassblower Set (Item 4 of 4).",
"shieldArmoirePiraticalSkullShieldText": "Piratical Skull Shield",
"shieldArmoirePiraticalSkullShieldNotes": "This enchanted shield will whisper the secret locations of your enemies' treasures- listen closely! Increases Perception and Intelligence by <%= attrs %> each. Enchanted Armoire: Piratical Princess Set (Item 4 of 4).",
"back": "Ryg-udstyr",
"backCapitalized": "Back Accessory",
"backBase0Text": "Intet Ryg-udstyr",

Some files were not shown because too many files have changed in this diff Show More