Compare commits
64 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 034c0c9bb5 | |||
| e0711655f0 | |||
| 71e162eed5 | |||
| f810fff6fc | |||
| 5bbe59c52d | |||
| 3f52401384 | |||
| e7944b3d98 | |||
| 08e925e3da | |||
| 16c9e42ad8 | |||
| 0e1d00c95f | |||
| 166f4683ca | |||
| 1fcc0d8d3a | |||
| 8a4c4e10f1 | |||
| 18ed0fe446 | |||
| 1f9ebeb629 | |||
| b9d83122d1 | |||
| d1f7e64156 | |||
| 0f8e7416f8 | |||
| 1c8b0f92df | |||
| 75e5b20f93 | |||
| f9db432794 | |||
| 6cec7cbba2 | |||
| f76d097313 | |||
| 59af471438 | |||
| d0da303b7d | |||
| 596383e7a8 | |||
| accba7fc13 | |||
| dfc54f1600 | |||
| b76ab58e3e | |||
| 6f093a94c4 | |||
| a9a9e7a4ab | |||
| b2058ec23d | |||
| 2461f53cf5 | |||
| 73fc288f3b | |||
| ea78b6feb9 | |||
| 7c141614ed | |||
| c072935e80 | |||
| 54e49ca3b9 | |||
| b16a245d61 | |||
| 0a8109e496 | |||
| cdfcc6419f | |||
| 9c25c2452f | |||
| 573f2e4732 | |||
| 81ffcf9c1b | |||
| d8925a8811 | |||
| 217c16988b | |||
| de7f953b67 | |||
| 8ee2a02e73 | |||
| d9b573b430 | |||
| cbcf5a03e1 | |||
| 487523f64b | |||
| 74cfc2cf52 | |||
| 2d489e870f | |||
| 6eb484605a | |||
| 8969b755a6 | |||
| 0062e5b1f1 | |||
| 50b98d8d92 | |||
| 7ddf4b1f7b | |||
| c91da86b89 | |||
| d549fea4ed | |||
| a362914f93 | |||
| 61001d0e9a | |||
| bd5c4a08e2 | |||
| 50ebdd1ece |
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
@@ -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"]
|
||||
@@ -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) {
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -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';
|
||||
|
||||
@@ -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/
|
||||
|
||||
- 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/
|
||||
- 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 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.
|
||||
- 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`. We’re using something very similar to Vuex (equivalent of React’s 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 don’t 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 we’ll 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 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.
|
||||
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).
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 546 KiB After Width: | Height: | Size: 553 KiB |
|
Before Width: | Height: | Size: 416 KiB After Width: | Height: | Size: 432 KiB |
|
Before Width: | Height: | Size: 350 KiB After Width: | Height: | Size: 342 KiB |
|
Before Width: | Height: | Size: 300 KiB After Width: | Height: | Size: 307 KiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 176 KiB |
|
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 113 KiB |
|
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');
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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'),
|
||||
};
|
||||
},
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -297,7 +297,7 @@ router.beforeEach(function routerGuard (to, from, next) {
|
||||
name: redirectTo,
|
||||
query: redirectTo === 'login' ? {
|
||||
redirectTo: to.path,
|
||||
} : null,
|
||||
} : to.query,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -359,5 +359,12 @@
|
||||
"backgroundRowboatText": "Гребна лодка",
|
||||
"backgroundRowboatNotes": "Изпейте песен в гребната лодка",
|
||||
"backgroundPirateFlagText": "Пиратско знаме",
|
||||
"backgroundPirateFlagNotes": "Развейте страховито пиратско знаме."
|
||||
"backgroundPirateFlagNotes": "Развейте страховито пиратско знаме.",
|
||||
"backgrounds072018": "КОМПЛЕКТ 50: юли 2018 г.",
|
||||
"backgroundDarkDeepText": "Дълбочинен мрак",
|
||||
"backgroundDarkDeepNotes": "Плувайте надълбоко в мрака, сред биолуминесцентни животни.",
|
||||
"backgroundDilatoryCityText": "Град Мудноград",
|
||||
"backgroundDilatoryCityNotes": "Разгледайте подводния град Мудноград.",
|
||||
"backgroundTidePoolText": "Приливно езеро",
|
||||
"backgroundTidePoolNotes": "Наблюдавайте океанския живот около приливно езеро."
|
||||
}
|
||||
@@ -195,7 +195,7 @@
|
||||
"hatchingPotionFairy": "Фейски цвят",
|
||||
"hatchingPotionStarryNight": "Звездна нощ",
|
||||
"hatchingPotionRainbow": "Дъга",
|
||||
"hatchingPotionGlass": "Glass",
|
||||
"hatchingPotionGlass": "Стъкло",
|
||||
"hatchingPotionNotes": "Излейте това върху яйце и от него ще се излюпи любимец с(ъс) <%= potText(locale) %>.",
|
||||
"premiumPotionAddlNotes": "Не може да се използва върху яйца за любимци от мисии.",
|
||||
"foodMeat": "Месо",
|
||||
|
||||
@@ -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": "Няма аксесоар за гръб",
|
||||
|
||||
@@ -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": "Резюме",
|
||||
|
||||
@@ -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 ноември",
|
||||
|
||||
@@ -98,6 +98,7 @@
|
||||
"guildQuestsNotSupported": "Гилдиите не могат да бъдат канени в мисии.",
|
||||
"questNotOwned": "Не притежавате този свитък с мисия.",
|
||||
"questNotGoldPurchasable": "Мисията „<%= key %>“ не може да бъде купена със злато.",
|
||||
"questNotGemPurchasable": "Мисията „<%= key %>“ не може да бъде купена с диаманти.",
|
||||
"questLevelTooHigh": "Трябва да бъдете ниво <%= level %>, за да започнете тази мисия.",
|
||||
"questAlreadyUnderway": "Групата Ви е вече изпълнява мисия. Опитайте отново, когато текущата мисия приключи.",
|
||||
"questAlreadyAccepted": "Вече сте приели поканата за мисията.",
|
||||
|
||||
@@ -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 юни."
|
||||
}
|
||||
@@ -144,7 +144,7 @@
|
||||
"mysterySet201803": "Комплект на смелото водно конче",
|
||||
"mysterySet201804": "Комплект на изтупаната катерица",
|
||||
"mysterySet201805": "Феноменален паунов комплект",
|
||||
"mysterySet201806": "Alluring Anglerfish Set",
|
||||
"mysterySet201806": "Комплект на морския дявол",
|
||||
"mysterySet301404": "Стандартен изтънчен комплект",
|
||||
"mysterySet301405": "Комплект изтънчени принадлежности",
|
||||
"mysterySet301703": "Изтънчен паунов комплект",
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
@@ -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",
|
||||
|
||||