Compare commits
49 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a19db5798d | |||
| ea1569e23e | |||
| ec5de91123 | |||
| b1a348aee3 | |||
| be86812900 | |||
| c879560445 | |||
| 188023b197 | |||
| c4343379a1 | |||
| ce07d06c15 | |||
| a0041221be | |||
| ebfb6f96b3 | |||
| 22d696219a | |||
| 9014943a86 | |||
| 6a70487fa6 | |||
| 4fa381f153 | |||
| 97209e40ad | |||
| 2e97f9864e | |||
| 6d6adfd919 | |||
| 13123c0bae | |||
| 577e6f005e | |||
| 1361fea2d4 | |||
| cbcc7cd479 | |||
| 0e36c1aa0f | |||
| 5b4505ac62 | |||
| aa3d972cb4 | |||
| d4b729c95e | |||
| d4b867acc3 | |||
| 15c09691af | |||
| 27263e9b2f | |||
| 2d9715b657 | |||
| 8ca5ee99b0 | |||
| 9f9da5632d | |||
| 9364cdc2b4 | |||
| 2896cf77e0 | |||
| 936d3ffc98 | |||
| 9608b9fa9f | |||
| 657327edd7 | |||
| 9706a9c8be | |||
| 484bae40cd | |||
| c0b6353ded | |||
| f71062e86c | |||
| 193e7062c3 | |||
| 86d2fed76e | |||
| 2b7fe7c1d5 | |||
| 999b62df43 | |||
| b7448e2cfe | |||
| 0bc836b490 | |||
| fdf7e3a665 | |||
| 00d12e83bd |
@@ -12,6 +12,7 @@ ENV GOOGLE_CLIENT_ID 1035232791481-32vtplgnjnd1aufv3mcu1lthf31795fq.apps.googleu
|
||||
ENV LOGGLY_CLIENT_TOKEN ab5663bf-241f-4d14-8783-7d80db77089a
|
||||
ENV NODE_ENV production
|
||||
ENV STRIPE_PUB_KEY pk_85fQ0yMECHNfHTSsZoxZXlPSwSNfA
|
||||
ENV APPLE_AUTH_CLIENT_ID 9Q9SMRMCNN.com.habitrpg.ios.Habitica
|
||||
|
||||
# Install global packages
|
||||
RUN npm install -g gulp-cli mocha
|
||||
|
||||
@@ -79,5 +79,6 @@
|
||||
"APPLE_TEAM_ID": "",
|
||||
"APPLE_AUTH_CLIENT_ID": "",
|
||||
"APPLE_AUTH_KEY_ID": "",
|
||||
"BLOCKED_IPS": ""
|
||||
"BLOCKED_IPS": "",
|
||||
"LOG_AMPLITUDE_EVENTS": "false"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"version": "4.140.5",
|
||||
"version": "4.140.11",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -1574,9 +1574,9 @@
|
||||
"integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g=="
|
||||
},
|
||||
"@types/express": {
|
||||
"version": "4.17.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.4.tgz",
|
||||
"integrity": "sha512-DO1L53rGqIDUEvOjJKmbMEQ5Z+BM2cIEPy/eV3En+s166Gz+FeuzRerxcab757u/U4v4XF4RYrZPmqKa+aY/2w==",
|
||||
"version": "4.17.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz",
|
||||
"integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==",
|
||||
"requires": {
|
||||
"@types/body-parser": "*",
|
||||
"@types/express-serve-static-core": "*",
|
||||
@@ -1594,9 +1594,9 @@
|
||||
}
|
||||
},
|
||||
"@types/express-serve-static-core": {
|
||||
"version": "4.17.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.3.tgz",
|
||||
"integrity": "sha512-sHEsvEzjqN+zLbqP+8OXTipc10yH1QLR+hnr5uw29gi9AhCAAAdri8ClNV7iMdrJrIzXIQtlkPvq8tJGhj3QJQ==",
|
||||
"version": "4.17.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.5.tgz",
|
||||
"integrity": "sha512-578YH5Lt88AKoADy0b2jQGwJtrBxezXtVe/MBqWXKZpqx91SnC0pVkVCcxcytz3lWW+cHBYDi3Ysh0WXc+rAYw==",
|
||||
"requires": {
|
||||
"@types/node": "*",
|
||||
"@types/range-parser": "*"
|
||||
@@ -8813,122 +8813,17 @@
|
||||
}
|
||||
},
|
||||
"jwks-rsa": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.7.0.tgz",
|
||||
"integrity": "sha512-tq7DVJt9J6wTvl9+AQfwZIiPSuY2Vf0F+MovfRTFuBqLB1xgDVhegD33ChEAQ6yBv9zFvUIyj4aiwrSA5VehUw==",
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.8.0.tgz",
|
||||
"integrity": "sha512-+HYROHD5fsYQCNrJ37RSr2NjbN2/V9YT+yVF3oJxLmPIZWrmp1SOl1hMw2RcuNh+LGA2bGZIhRKGiMjhQa/b7Q==",
|
||||
"requires": {
|
||||
"@types/express-jwt": "0.0.42",
|
||||
"axios": "^0.19.2",
|
||||
"debug": "^4.1.0",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"limiter": "^1.1.4",
|
||||
"lru-memoizer": "^2.0.1",
|
||||
"ms": "^2.1.2",
|
||||
"request": "^2.88.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"assert-plus": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
|
||||
},
|
||||
"aws-sign2": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
|
||||
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
|
||||
},
|
||||
"caseless": {
|
||||
"version": "0.12.0",
|
||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
||||
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
|
||||
},
|
||||
"form-data": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
|
||||
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
|
||||
"requires": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.6",
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
},
|
||||
"har-validator": {
|
||||
"version": "5.1.3",
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
|
||||
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
|
||||
"requires": {
|
||||
"ajv": "^6.5.5",
|
||||
"har-schema": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"http-signature": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
||||
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
|
||||
"requires": {
|
||||
"assert-plus": "^1.0.0",
|
||||
"jsprim": "^1.2.2",
|
||||
"sshpk": "^1.7.0"
|
||||
}
|
||||
},
|
||||
"oauth-sign": {
|
||||
"version": "0.9.0",
|
||||
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
|
||||
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
|
||||
},
|
||||
"punycode": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
|
||||
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
|
||||
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
|
||||
},
|
||||
"request": {
|
||||
"version": "2.88.2",
|
||||
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
|
||||
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
|
||||
"requires": {
|
||||
"aws-sign2": "~0.7.0",
|
||||
"aws4": "^1.8.0",
|
||||
"caseless": "~0.12.0",
|
||||
"combined-stream": "~1.0.6",
|
||||
"extend": "~3.0.2",
|
||||
"forever-agent": "~0.6.1",
|
||||
"form-data": "~2.3.2",
|
||||
"har-validator": "~5.1.3",
|
||||
"http-signature": "~1.2.0",
|
||||
"is-typedarray": "~1.0.0",
|
||||
"isstream": "~0.1.2",
|
||||
"json-stringify-safe": "~5.0.1",
|
||||
"mime-types": "~2.1.19",
|
||||
"oauth-sign": "~0.9.0",
|
||||
"performance-now": "^2.1.0",
|
||||
"qs": "~6.5.2",
|
||||
"safe-buffer": "^5.1.2",
|
||||
"tough-cookie": "~2.5.0",
|
||||
"tunnel-agent": "^0.6.0",
|
||||
"uuid": "^3.3.2"
|
||||
}
|
||||
},
|
||||
"tough-cookie": {
|
||||
"version": "2.5.0",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
|
||||
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
|
||||
"requires": {
|
||||
"psl": "^1.1.28",
|
||||
"punycode": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"tunnel-agent": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
|
||||
"requires": {
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
}
|
||||
"ms": "^2.1.2"
|
||||
}
|
||||
},
|
||||
"jws": {
|
||||
@@ -9757,27 +9652,47 @@
|
||||
}
|
||||
},
|
||||
"mongodb": {
|
||||
"version": "3.4.1",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.4.1.tgz",
|
||||
"integrity": "sha512-juqt5/Z42J4DcE7tG7UdVaTKmUC6zinF4yioPfpeOSNBieWSK6qCY+0tfGQcHLKrauWPDdMZVROHJOa8q2pWsA==",
|
||||
"version": "3.5.6",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.6.tgz",
|
||||
"integrity": "sha512-sh3q3GLDLT4QmoDLamxtAECwC3RGjq+oNuK1ENV8+tnipIavss6sMYt77hpygqlMOCt0Sla5cl7H4SKCVBCGEg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"bson": "^1.1.1",
|
||||
"bl": "^2.2.0",
|
||||
"bson": "^1.1.4",
|
||||
"denque": "^1.4.1",
|
||||
"require_optional": "^1.0.1",
|
||||
"safe-buffer": "^5.1.2",
|
||||
"saslprep": "^1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"bl": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz",
|
||||
"integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"readable-stream": "^2.3.5",
|
||||
"safe-buffer": "^5.1.1"
|
||||
}
|
||||
},
|
||||
"bson": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz",
|
||||
"integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"mongoose": {
|
||||
"version": "5.9.7",
|
||||
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.7.tgz",
|
||||
"integrity": "sha512-WJOBh9WMvivqBK8my9HFtSzSySKdUxJPNGAwswEakAasWUcPXJl3yHMtZ4ngGnKbwTT9KnAr75xamlt/PouR9w==",
|
||||
"version": "5.9.9",
|
||||
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.9.tgz",
|
||||
"integrity": "sha512-pLkIkM7XQwfbQ+xK1l57Zv0DYPH190/I6Cv5+PbJGfAU0HvX0atMlp+vly8zcjNTEvTkVM80qA5eBYBvZyLYXw==",
|
||||
"requires": {
|
||||
"bson": "~1.1.1",
|
||||
"kareem": "2.3.1",
|
||||
"mongodb": "3.5.5",
|
||||
"mongoose-legacy-pluralize": "1.0.2",
|
||||
"mpath": "0.6.0",
|
||||
"mpath": "0.7.0",
|
||||
"mquery": "3.2.2",
|
||||
"ms": "2.1.2",
|
||||
"regexp-clone": "1.0.0",
|
||||
@@ -9816,9 +9731,9 @@
|
||||
"integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
|
||||
},
|
||||
"monk": {
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/monk/-/monk-7.1.2.tgz",
|
||||
"integrity": "sha512-wyO1wW2lVlVChJXtNIyJ/ZSlBg/wQ/XTsWzfhuV19pl47/44nxR1KhXKxTnSB1hx08xuTMF3QodvaFBuRWPUjQ==",
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/monk/-/monk-7.2.0.tgz",
|
||||
"integrity": "sha512-PdCTlPhmUH5ULg80CS0Dgn9LQ7omldNQg+kVn7wtQF1cA/me/Kd5YmiRDxUeTUukpNFkrM3qEYP5oC5AqVjSgw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"debug": "*",
|
||||
@@ -9901,9 +9816,9 @@
|
||||
}
|
||||
},
|
||||
"mpath": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz",
|
||||
"integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw=="
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz",
|
||||
"integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg=="
|
||||
},
|
||||
"mquery": {
|
||||
"version": "3.2.2",
|
||||
@@ -11014,14 +10929,6 @@
|
||||
"passport-oauth2": "1.x.x"
|
||||
}
|
||||
},
|
||||
"passport-google-oauth2": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/passport-google-oauth2/-/passport-google-oauth2-0.2.0.tgz",
|
||||
"integrity": "sha512-62EdPtbfVdc55nIXi0p1WOa/fFMM8v/M8uQGnbcXA4OexZWCnfsEi3wo2buag+Is5oqpuHzOtI64JpHk0Xi5RQ==",
|
||||
"requires": {
|
||||
"passport-oauth2": "^1.1.2"
|
||||
}
|
||||
},
|
||||
"passport-google-oauth20": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-1.0.0.tgz",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "4.140.5",
|
||||
"version": "4.140.11",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.9.0",
|
||||
@@ -42,20 +42,19 @@
|
||||
"in-app-purchase": "^1.11.3",
|
||||
"js2xmlparser": "^4.0.1",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"jwks-rsa": "^1.7.0",
|
||||
"jwks-rsa": "^1.8.0",
|
||||
"lodash": "^4.17.15",
|
||||
"merge-stream": "^2.0.0",
|
||||
"method-override": "^3.0.0",
|
||||
"moment": "^2.24.0",
|
||||
"moment-recur": "^1.0.7",
|
||||
"mongoose": "^5.9.7",
|
||||
"mongoose": "^5.9.9",
|
||||
"morgan": "^1.10.0",
|
||||
"nconf": "^0.10.0",
|
||||
"node-gcm": "^1.0.2",
|
||||
"on-headers": "^1.0.2",
|
||||
"passport": "^0.4.1",
|
||||
"passport-facebook": "^3.0.0",
|
||||
"passport-google-oauth2": "^0.2.0",
|
||||
"passport-google-oauth20": "1.0.0",
|
||||
"paypal-ipn": "3.0.0",
|
||||
"paypal-rest-sdk": "^1.8.1",
|
||||
@@ -112,7 +111,7 @@
|
||||
"expect.js": "^0.3.1",
|
||||
"istanbul": "^1.1.0-alpha.1",
|
||||
"mocha": "^5.1.1",
|
||||
"monk": "^7.1.2",
|
||||
"monk": "^7.2.0",
|
||||
"require-again": "^2.0.0",
|
||||
"sinon": "^7.2.4",
|
||||
"sinon-chai": "^3.5.0",
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
import mongoose from 'mongoose';
|
||||
import {
|
||||
highlightMentions,
|
||||
} from '../../../../website/server/libs/highlightMentions';
|
||||
|
||||
describe('highlightMentions', () => {
|
||||
beforeEach(() => {
|
||||
const mockFind = {
|
||||
select () {
|
||||
return this;
|
||||
},
|
||||
lean () {
|
||||
return this;
|
||||
},
|
||||
exec () {
|
||||
return Promise.resolve([{
|
||||
auth: { local: { username: 'user' } }, _id: '111',
|
||||
}, { auth: { local: { username: 'user2' } }, _id: '222' }, { auth: { local: { username: 'user3' } }, _id: '333' }, { auth: { local: { username: 'user-dash' } }, _id: '444' }, { auth: { local: { username: 'user_underscore' } }, _id: '555' },
|
||||
]);
|
||||
},
|
||||
};
|
||||
|
||||
sinon.stub(mongoose.Model, 'find').returns(mockFind);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
sinon.restore();
|
||||
});
|
||||
|
||||
it('doesn\'t change text without mentions', async () => {
|
||||
const text = 'some chat text';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal(text);
|
||||
});
|
||||
it('highlights existing users', async () => {
|
||||
const text = '@user: message';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal('[@user](/profile/111): message');
|
||||
});
|
||||
it('highlights special characters', async () => {
|
||||
const text = '@user-dash: message @user_underscore';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal('[@user-dash](/profile/444): message [@user_underscore](/profile/555)');
|
||||
});
|
||||
it('doesn\'t highlight nonexisting users', async () => {
|
||||
const text = '@nouser message';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal('@nouser message');
|
||||
});
|
||||
it('highlights multiple existing users', async () => {
|
||||
const text = '@user message (@user2) @user3 @user';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal('[@user](/profile/111) message ([@user2](/profile/222)) [@user3](/profile/333) [@user](/profile/111)');
|
||||
});
|
||||
it('doesn\'t highlight more than 5 users', async () => {
|
||||
const text = '@user @user2 @user3 @user4 @user5 @user6';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal(text);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,136 @@
|
||||
import mongoose from 'mongoose';
|
||||
import highlightMentions from '../../../../website/server/libs/highlightMentions';
|
||||
|
||||
describe('highlightMentions', () => {
|
||||
beforeEach(() => {
|
||||
const mockFind = {
|
||||
select () {
|
||||
return this;
|
||||
},
|
||||
lean () {
|
||||
return this;
|
||||
},
|
||||
exec () {
|
||||
return Promise.resolve([
|
||||
{ auth: { local: { username: 'user' } }, _id: '111' },
|
||||
{ auth: { local: { username: 'user2' } }, _id: '222' },
|
||||
{ auth: { local: { username: 'user3' } }, _id: '333' },
|
||||
{ auth: { local: { username: 'user-dash' } }, _id: '444' },
|
||||
{ auth: { local: { username: 'user_underscore' } }, _id: '555' },
|
||||
]);
|
||||
},
|
||||
};
|
||||
|
||||
sinon.stub(mongoose.Model, 'find').returns(mockFind);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
sinon.restore();
|
||||
});
|
||||
|
||||
it('doesn\'t change text without mentions', async () => {
|
||||
const text = 'some chat text';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal(text);
|
||||
});
|
||||
|
||||
it('highlights existing users', async () => {
|
||||
const text = '@user: message';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal('[@user](/profile/111): message');
|
||||
});
|
||||
|
||||
it('highlights special characters', async () => {
|
||||
const text = '@user-dash: message @user_underscore';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal('[@user-dash](/profile/444): message [@user_underscore](/profile/555)');
|
||||
});
|
||||
|
||||
it('doesn\'t highlight nonexisting users', async () => {
|
||||
const text = '@nouser message';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal('@nouser message');
|
||||
});
|
||||
|
||||
it('highlights multiple existing users', async () => {
|
||||
const text = '@user message (@user2) @user3 @user';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal('[@user](/profile/111) message ([@user2](/profile/222)) [@user3](/profile/333) [@user](/profile/111)');
|
||||
});
|
||||
|
||||
it('doesn\'t highlight more than 5 users', async () => {
|
||||
const text = '@user @user2 @user3 @user4 @user5 @user6';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal(text);
|
||||
});
|
||||
|
||||
describe('exceptions in code blocks', () => {
|
||||
it('doesn\'t highlight user in inline code block', async () => {
|
||||
const text = '`@user`';
|
||||
|
||||
const result = await highlightMentions(text);
|
||||
|
||||
expect(result[0]).to.equal(text);
|
||||
});
|
||||
|
||||
it('doesn\'t highlight user in fenced code block', async () => {
|
||||
const text = 'Text\n\n```\n// code referencing @user\n```\n\nText';
|
||||
|
||||
const result = await highlightMentions(text);
|
||||
|
||||
expect(result[0]).to.equal(text);
|
||||
});
|
||||
|
||||
it('doesn\'t highlight user in indented code block', async () => {
|
||||
const text = ' @user';
|
||||
|
||||
const result = await highlightMentions(text);
|
||||
|
||||
expect(result[0]).to.equal(text);
|
||||
});
|
||||
|
||||
it('does highlight user that\'s after in-line code block', async () => {
|
||||
const text = '`<code />` for @user';
|
||||
|
||||
const result = await highlightMentions(text);
|
||||
|
||||
expect(result[0]).to.equal('`<code />` for [@user](/profile/111)');
|
||||
});
|
||||
|
||||
it('does highlight same content properly', async () => {
|
||||
const text = '@user `@user`';
|
||||
|
||||
const result = await highlightMentions(text);
|
||||
|
||||
expect(result[0]).to.equal('[@user](/profile/111) `@user`');
|
||||
});
|
||||
});
|
||||
|
||||
it('github issue 12118, method crashes when square brackets are used', async () => {
|
||||
const text = '[test]';
|
||||
|
||||
let err;
|
||||
|
||||
try {
|
||||
await highlightMentions(text);
|
||||
} catch (e) {
|
||||
err = e;
|
||||
}
|
||||
|
||||
expect(err).to.be.undefined;
|
||||
});
|
||||
|
||||
it('github issue 12138, method crashes when regex chars are used in code block', async () => {
|
||||
const text = '`[test]`';
|
||||
|
||||
let err;
|
||||
|
||||
try {
|
||||
await highlightMentions(text);
|
||||
} catch (e) {
|
||||
err = e;
|
||||
}
|
||||
|
||||
expect(err).to.be.undefined;
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,64 @@
|
||||
import moment from 'moment';
|
||||
import { calculateSubscriptionTerminationDate } from '../../../../../../website/server/libs/payments/util';
|
||||
import api from '../../../../../../website/server/libs/payments/payments';
|
||||
|
||||
describe('#calculateSubscriptionTerminationDate', () => {
|
||||
let plan;
|
||||
let nextBill;
|
||||
|
||||
beforeEach(() => {
|
||||
plan = {
|
||||
customerId: 'customer-id',
|
||||
extraMonths: 0,
|
||||
};
|
||||
nextBill = moment();
|
||||
});
|
||||
it('should extend date to the exact amount of days left before the next bill will occur', () => {
|
||||
nextBill = moment()
|
||||
.add(5, 'days');
|
||||
const expectedTerminationDate = moment()
|
||||
.add(5, 'days');
|
||||
|
||||
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
|
||||
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
|
||||
});
|
||||
it('if nextBill is null, add 30 days to termination date', () => {
|
||||
nextBill = null;
|
||||
const expectedTerminationDate = moment()
|
||||
.add(30, 'days');
|
||||
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
|
||||
|
||||
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
|
||||
});
|
||||
it('if nextBill is null and it\'s a group plan, add 2 days instead of 30', () => {
|
||||
nextBill = null;
|
||||
plan.customerId = api.constants.GROUP_PLAN_CUSTOMER_ID;
|
||||
const expectedTerminationDate = moment()
|
||||
.add(2, 'days');
|
||||
|
||||
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
|
||||
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
|
||||
});
|
||||
it('should add 30.5 days for each extraMonth', () => {
|
||||
plan.extraMonths = 4;
|
||||
const expectedTerminationDate = moment()
|
||||
.add(30.5 * 4, 'days');
|
||||
|
||||
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
|
||||
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
|
||||
});
|
||||
it('should round up if total days gained by extraMonth is a decimal number', () => {
|
||||
plan.extraMonths = 5;
|
||||
const expectedTerminationDate = moment()
|
||||
.add(Math.ceil(30.5 * 5), 'days');
|
||||
|
||||
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
|
||||
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
|
||||
});
|
||||
it('behaves like extraMonths is 0 if it\'s set to a negative number', () => {
|
||||
plan.extraMonths = -5;
|
||||
const expectedTerminationDate = moment();
|
||||
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
|
||||
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
|
||||
});
|
||||
});
|
||||
@@ -170,6 +170,7 @@ describe('errorHandler', () => {
|
||||
originalUrl: req.originalUrl,
|
||||
headers: req.headers,
|
||||
body: req.body,
|
||||
query: req.query,
|
||||
httpCode: 400,
|
||||
isHandledError: true,
|
||||
});
|
||||
|
||||
@@ -538,52 +538,74 @@ describe('Group Model', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('sends a chat message if no progress is made on quest with multiple items', async () => {
|
||||
progress.collectedItems = 0;
|
||||
party.quest.key = 'dilatoryDistress1';
|
||||
party.quest.active = false;
|
||||
describe('collection quests with multiple items', () => {
|
||||
it('sends a chat message if no progress is made on quest with multiple items', async () => {
|
||||
progress.collectedItems = 0;
|
||||
party.quest.key = 'dilatoryDistress1';
|
||||
party.quest.active = false;
|
||||
|
||||
await party.startQuest(questLeader);
|
||||
Group.prototype.sendChat.resetHistory();
|
||||
await party.save();
|
||||
await party.startQuest(questLeader);
|
||||
Group.prototype.sendChat.resetHistory();
|
||||
await party.save();
|
||||
|
||||
await Group.processQuestProgress(participatingMember, progress);
|
||||
await Group.processQuestProgress(participatingMember, progress);
|
||||
|
||||
party = await Group.findOne({ _id: party._id });
|
||||
party = await Group.findOne({ _id: party._id });
|
||||
|
||||
expect(Group.prototype.sendChat).to.be.calledOnce;
|
||||
expect(Group.prototype.sendChat).to.be.calledWith({
|
||||
message: '`Participating Member found 0 Fire Coral, 0 Blue Fins.`',
|
||||
info: {
|
||||
items: { blueFins: 0, fireCoral: 0 },
|
||||
quest: 'dilatoryDistress1',
|
||||
type: 'user_found_items',
|
||||
user: 'Participating Member',
|
||||
},
|
||||
expect(Group.prototype.sendChat).to.be.calledOnce;
|
||||
expect(Group.prototype.sendChat).to.be.calledWith({
|
||||
message: '`Participating Member found 0 Fire Coral, 0 Blue Fins.`',
|
||||
info: {
|
||||
items: { blueFins: 0, fireCoral: 0 },
|
||||
quest: 'dilatoryDistress1',
|
||||
type: 'user_found_items',
|
||||
user: 'Participating Member',
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('handles collection quests with multiple items', async () => {
|
||||
progress.collectedItems = 10;
|
||||
party.quest.key = 'evilsanta2';
|
||||
party.quest.active = false;
|
||||
it('handles correctly', async () => {
|
||||
progress.collectedItems = 10;
|
||||
party.quest.key = 'evilsanta2';
|
||||
party.quest.active = false;
|
||||
|
||||
await party.startQuest(questLeader);
|
||||
Group.prototype.sendChat.resetHistory();
|
||||
await party.save();
|
||||
await party.startQuest(questLeader);
|
||||
Group.prototype.sendChat.resetHistory();
|
||||
await party.save();
|
||||
|
||||
await Group.processQuestProgress(participatingMember, progress);
|
||||
await Group.processQuestProgress(participatingMember, progress);
|
||||
|
||||
party = await Group.findOne({ _id: party._id });
|
||||
party = await Group.findOne({ _id: party._id });
|
||||
|
||||
expect(Group.prototype.sendChat).to.be.calledOnce;
|
||||
expect(Group.prototype.sendChat).to.be.calledWithMatch({
|
||||
message: sinon.match(/`Participating Member found/).and(sinon.match(/\d* (Tracks|Broken Twigs)/)),
|
||||
info: {
|
||||
quest: 'evilsanta2',
|
||||
type: 'user_found_items',
|
||||
user: 'Participating Member',
|
||||
},
|
||||
expect(Group.prototype.sendChat).to.be.calledOnce;
|
||||
expect(Group.prototype.sendChat).to.be.calledWithMatch({
|
||||
message: sinon.match(/`Participating Member found/).and(sinon.match(/\d* (Tracks|Broken Twigs)/)),
|
||||
info: {
|
||||
quest: 'evilsanta2',
|
||||
type: 'user_found_items',
|
||||
user: 'Participating Member',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('cannot collect excess items', async () => {
|
||||
// Make sure the quest progress isn't erased
|
||||
sandbox.stub(Group.prototype, 'finishQuest').returns(Promise.resolve());
|
||||
|
||||
progress.collectedItems = 500;
|
||||
party.quest.key = 'evilsanta2';
|
||||
party.quest.active = false;
|
||||
|
||||
await party.startQuest(questLeader);
|
||||
await party.save();
|
||||
|
||||
await Group.processQuestProgress(participatingMember, progress);
|
||||
party = await Group.findOne({ _id: party._id });
|
||||
|
||||
expect(party.quest.progress.collect.tracks)
|
||||
.to.eql(questScrolls.evilsanta2.collect.tracks.count);
|
||||
expect(party.quest.progress.collect.branches)
|
||||
.to.eql(questScrolls.evilsanta2.collect.branches.count);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -2380,29 +2402,29 @@ describe('Group Model', () => {
|
||||
});
|
||||
});
|
||||
|
||||
context('isSubscribed', () => {
|
||||
context('hasActiveGroupPlan', () => {
|
||||
it('returns false if group does not have customer id', () => {
|
||||
expect(party.isSubscribed()).to.be.undefined;
|
||||
expect(party.hasActiveGroupPlan()).to.be.undefined;
|
||||
});
|
||||
|
||||
it('returns true if group does not have plan.dateTerminated', () => {
|
||||
party.purchased.plan.customerId = 'test-id';
|
||||
|
||||
expect(party.isSubscribed()).to.be.true;
|
||||
expect(party.hasActiveGroupPlan()).to.be.true;
|
||||
});
|
||||
|
||||
it('returns true if group if plan.dateTerminated is after today', () => {
|
||||
party.purchased.plan.customerId = 'test-id';
|
||||
party.purchased.plan.dateTerminated = moment().add(1, 'days').toDate();
|
||||
|
||||
expect(party.isSubscribed()).to.be.true;
|
||||
expect(party.hasActiveGroupPlan()).to.be.true;
|
||||
});
|
||||
|
||||
it('returns false if group if plan.dateTerminated is before today', () => {
|
||||
party.purchased.plan.customerId = 'test-id';
|
||||
party.purchased.plan.dateTerminated = moment().subtract(1, 'days').toDate();
|
||||
|
||||
expect(party.isSubscribed()).to.be.false;
|
||||
expect(party.hasActiveGroupPlan()).to.be.false;
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ import { v4 as generateUUID } from 'uuid';
|
||||
import {
|
||||
each,
|
||||
} from 'lodash';
|
||||
import moment from 'moment';
|
||||
import {
|
||||
generateChallenge,
|
||||
checkExistence,
|
||||
@@ -12,6 +13,7 @@ import {
|
||||
} from '../../../../helpers/api-integration/v3';
|
||||
import { model as User } from '../../../../../website/server/models/user';
|
||||
import payments from '../../../../../website/server/libs/payments/payments';
|
||||
import { calculateSubscriptionTerminationDate } from '../../../../../website/server/libs/payments/util';
|
||||
|
||||
describe('POST /groups/:groupId/leave', () => {
|
||||
const typesOfGroups = {
|
||||
@@ -338,4 +340,48 @@ describe('POST /groups/:groupId/leave', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
each(typesOfGroups, (groupDetails, groupType) => {
|
||||
context(`Leaving a group with extraMonths left plan when the group is a ${groupType}`, () => {
|
||||
const extraMonths = 12;
|
||||
let groupWithPlan;
|
||||
let member;
|
||||
|
||||
beforeEach(async () => {
|
||||
const { group, members } = await createAndPopulateGroup({
|
||||
groupDetails,
|
||||
members: 1,
|
||||
upgradeToGroupPlan: true,
|
||||
});
|
||||
[member] = members;
|
||||
groupWithPlan = group;
|
||||
await member.update({
|
||||
'purchased.plan.extraMonths': extraMonths,
|
||||
});
|
||||
});
|
||||
it('calculates dateTerminated and sets extraMonths to zero after user leaves the group', async () => {
|
||||
const userBeforeLeave = await User.findById(member._id).exec();
|
||||
|
||||
await member.post(`/groups/${groupWithPlan._id}/leave`);
|
||||
const userAfterLeave = await User.findById(member._id).exec();
|
||||
|
||||
const dateTerminatedBefore = userBeforeLeave.purchased.plan.dateTerminated;
|
||||
const extraMonthsBefore = userBeforeLeave.purchased.plan.extraMonths;
|
||||
const dateTerminatedAfter = userAfterLeave.purchased.plan.dateTerminated;
|
||||
const extraMonthsAfter = userAfterLeave.purchased.plan.extraMonths;
|
||||
|
||||
const expectedTerminationDate = calculateSubscriptionTerminationDate(null, {
|
||||
customerId: payments.constants.GROUP_PLAN_CUSTOMER_ID,
|
||||
extraMonths,
|
||||
}, payments.constants);
|
||||
|
||||
expect(extraMonthsBefore).to.gte(12);
|
||||
expect(extraMonthsAfter).to.equal(0);
|
||||
expect(dateTerminatedBefore).to.be.null;
|
||||
expect(dateTerminatedAfter).to.exist;
|
||||
|
||||
expect(moment(dateTerminatedAfter).diff(expectedTerminationDate, 'days')).to.equal(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -112,7 +112,7 @@ describe('POST /groups/:groupId/quests/accept', () => {
|
||||
|
||||
await Promise.all([partyMembers[0].sync(), questingGroup.sync()]);
|
||||
expect(leader.party.quest.RSVPNeeded).to.equal(false);
|
||||
expect(questingGroup.quest.members[partyMembers[0]._id]);
|
||||
expect(questingGroup.quest.members[partyMembers[0]._id]).to.equal(true);
|
||||
});
|
||||
|
||||
it('does not begin the quest if pending invitations remain', async () => {
|
||||
|
||||
@@ -89,6 +89,18 @@ describe('shared.ops.feed', () => {
|
||||
}
|
||||
});
|
||||
|
||||
it('does not allow feeding of wacky pets', done => {
|
||||
user.items.pets['Wolf-Veggie'] = 5;
|
||||
user.items.food.Meat = 1;
|
||||
try {
|
||||
feed(user, { params: { pet: 'Wolf-Veggie', food: 'Meat' } });
|
||||
} catch (err) {
|
||||
expect(err).to.be.an.instanceof(NotAuthorized);
|
||||
expect(err.message).to.equal(i18n.t('messageCannotFeedPet'));
|
||||
done();
|
||||
}
|
||||
});
|
||||
|
||||
it('does not allow feeding of mounts', done => {
|
||||
user.items.pets['Wolf-Base'] = -1;
|
||||
user.items.mounts['Wolf-Base'] = true;
|
||||
|
||||
@@ -5,6 +5,8 @@ import { v4 as generateUUID } from 'uuid';
|
||||
import { ApiUser, ApiGroup, ApiChallenge } from '../api-classes';
|
||||
import { requester } from '../requester';
|
||||
import * as Tasks from '../../../../website/server/models/task';
|
||||
import payments from '../../../../website/server/libs/payments/payments';
|
||||
import { model as User } from '../../../../website/server/models/user';
|
||||
|
||||
// Creates a new user and returns it
|
||||
// If you need the user to have specific requirements,
|
||||
@@ -83,14 +85,35 @@ export async function generateGroup (leader, details = {}, update = {}) {
|
||||
return apiGroup;
|
||||
}
|
||||
|
||||
async function _upgradeToGroupPlan (groupLeader, group) {
|
||||
const groupLeaderModel = await User.findById(groupLeader._id).exec();
|
||||
|
||||
// Create subscription
|
||||
const paymentData = {
|
||||
user: groupLeaderModel,
|
||||
groupId: group._id,
|
||||
sub: {
|
||||
key: 'basic_3mo',
|
||||
},
|
||||
customerId: 'customer-id',
|
||||
paymentMethod: 'Payment Method',
|
||||
headers: {
|
||||
'x-client': 'habitica-web',
|
||||
'user-agent': '',
|
||||
},
|
||||
};
|
||||
await payments.createSubscription(paymentData);
|
||||
}
|
||||
|
||||
// This is generate group + the ability to create
|
||||
// real users to populate it. The settings object
|
||||
// takes in:
|
||||
// members: Number - the number of group members to create.
|
||||
// Defaults to 0. Does not include group leader.
|
||||
// inivtes: Number - the number of users to create and invite to the group. Defaults to 0.
|
||||
// invites: Number - the number of users to create and invite to the group. Defaults to 0.
|
||||
// groupDetails: Object - how to initialize the group
|
||||
// leaderDetails: Object - defaults for the leader, defaults with a gem balance so the user
|
||||
// addGroupPlan: boolean - will add group plan with basic subscription. Defaults to false
|
||||
// can create the group
|
||||
//
|
||||
// Returns an object with
|
||||
@@ -101,6 +124,7 @@ export async function generateGroup (leader, details = {}, update = {}) {
|
||||
export async function createAndPopulateGroup (settings = {}) {
|
||||
const numberOfMembers = settings.members || 0;
|
||||
const numberOfInvites = settings.invites || 0;
|
||||
const upgradeToGroupPlan = settings.upgradeToGroupPlan || false;
|
||||
const { groupDetails } = settings;
|
||||
const leaderDetails = settings.leaderDetails || { balance: 10 };
|
||||
|
||||
@@ -130,6 +154,10 @@ export async function createAndPopulateGroup (settings = {}) {
|
||||
|
||||
await Promise.all(invitees.map(invitee => invitee.sync()));
|
||||
|
||||
if (upgradeToGroupPlan) {
|
||||
await _upgradeToGroupPlan(groupLeader, group);
|
||||
}
|
||||
|
||||
return {
|
||||
groupLeader,
|
||||
group,
|
||||
|
||||
@@ -58,7 +58,6 @@
|
||||
"vue-mugen-scroll": "^0.2.6",
|
||||
"vue-router": "^3.1.6",
|
||||
"vue-template-compiler": "^2.6.11",
|
||||
"vue2-perfect-scrollbar": "^1.4.0",
|
||||
"vuedraggable": "^2.23.1",
|
||||
"vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec",
|
||||
"webpack": "^4.42.1"
|
||||
|
||||
@@ -6,37 +6,37 @@
|
||||
}
|
||||
.promo_armoire_backgrounds_202004 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -500px;
|
||||
background-position: -433px -337px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_egg_quest {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -355px -648px;
|
||||
background-position: 0px -648px;
|
||||
width: 354px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_mystery_202004 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -875px 0px;
|
||||
background-position: 0px -796px;
|
||||
width: 282px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_pastel_skin_hair {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -648px;
|
||||
background-position: -355px -648px;
|
||||
width: 354px;
|
||||
height: 147px;
|
||||
}
|
||||
.customize-option.promo_pastel_skin_hair {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -25px -663px;
|
||||
background-position: -380px -663px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_seasonal_shop_spring {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -875px -299px;
|
||||
background-position: -875px -524px;
|
||||
width: 162px;
|
||||
height: 138px;
|
||||
}
|
||||
@@ -60,16 +60,22 @@
|
||||
}
|
||||
.promo_spring_potions_2020 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -433px -337px;
|
||||
background-position: 0px -500px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_take_this {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -1026px -148px;
|
||||
background-position: -875px -663px;
|
||||
width: 96px;
|
||||
height: 69px;
|
||||
}
|
||||
.scene_citrusella {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -875px -196px;
|
||||
width: 152px;
|
||||
height: 176px;
|
||||
}
|
||||
.scene_hat_guild {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px 0px;
|
||||
@@ -78,7 +84,13 @@
|
||||
}
|
||||
.scene_meditation {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -875px -148px;
|
||||
background-position: -875px -373px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.scene_tasks {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -875px 0px;
|
||||
width: 240px;
|
||||
height: 195px;
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
}
|
||||
.quest_dustbunnies {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1320px -660px;
|
||||
background-position: -440px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
@@ -30,19 +30,19 @@
|
||||
}
|
||||
.quest_evilsanta2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -220px -232px;
|
||||
background-position: 0px -232px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_falcon {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -440px -232px;
|
||||
background-position: -220px -232px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_ferret {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -660px 0px;
|
||||
background-position: -440px -232px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
@@ -54,13 +54,13 @@
|
||||
}
|
||||
.quest_ghost_stag {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: 0px -452px;
|
||||
background-position: -660px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_goldenknight1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -220px -452px;
|
||||
background-position: -660px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
@@ -84,13 +84,13 @@
|
||||
}
|
||||
.quest_guineapig {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -880px -220px;
|
||||
background-position: 0px -452px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_harpy {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -880px -440px;
|
||||
background-position: -220px -452px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
@@ -102,43 +102,43 @@
|
||||
}
|
||||
.quest_hippo {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -220px -672px;
|
||||
background-position: -440px -452px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_horse {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -440px -672px;
|
||||
background-position: -660px -452px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_kangaroo {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -660px -672px;
|
||||
background-position: -880px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_kraken {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1311px -1332px;
|
||||
background-position: -660px -1332px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_lostMasterclasser1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1100px 0px;
|
||||
background-position: -880px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_lostMasterclasser2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1100px -220px;
|
||||
background-position: -880px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_lostMasterclasser3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1100px -440px;
|
||||
background-position: 0px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
@@ -150,61 +150,61 @@
|
||||
}
|
||||
.quest_mayhemMistiflying2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: 0px -892px;
|
||||
background-position: -220px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_mayhemMistiflying3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -220px -892px;
|
||||
background-position: -440px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_monkey {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -440px -892px;
|
||||
background-position: -660px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moon1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1540px -1082px;
|
||||
background-position: -1540px -214px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_moon2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -880px -892px;
|
||||
background-position: -880px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moon3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1100px -892px;
|
||||
background-position: -1100px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moonstone1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1320px 0px;
|
||||
background-position: -1100px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moonstone2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1320px -220px;
|
||||
background-position: -1100px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moonstone3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1320px -440px;
|
||||
background-position: -1100px -660px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_nudibranch {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1540px -865px;
|
||||
background-position: -1540px -431px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
@@ -216,7 +216,7 @@
|
||||
}
|
||||
.quest_owl {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: 0px -1112px;
|
||||
background-position: 0px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
@@ -234,25 +234,25 @@
|
||||
}
|
||||
.quest_pterodactyl {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -660px -1112px;
|
||||
background-position: -220px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_rat {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -880px -1112px;
|
||||
background-position: -440px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_robot {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1100px -1112px;
|
||||
background-position: -660px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_rock {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1540px -214px;
|
||||
background-position: -1540px -865px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
@@ -264,43 +264,43 @@
|
||||
}
|
||||
.quest_ruby {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -440px -1112px;
|
||||
background-position: -880px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_sabretooth {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -220px -1112px;
|
||||
background-position: -1100px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_seaserpent {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1320px -880px;
|
||||
background-position: -1320px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_sheep {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -660px -892px;
|
||||
background-position: -1320px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_silver {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1100px -660px;
|
||||
background-position: -1320px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_slime {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -880px -672px;
|
||||
background-position: -1320px -660px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_sloth {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: 0px -672px;
|
||||
background-position: -1320px -880px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
@@ -312,7 +312,7 @@
|
||||
}
|
||||
.quest_snake {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -660px -1332px;
|
||||
background-position: -877px -1332px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
@@ -324,43 +324,43 @@
|
||||
}
|
||||
.quest_squirrel {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -880px 0px;
|
||||
background-position: 0px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_stoikalmCalamity1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1762px -872px;
|
||||
background-position: -1762px -721px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_stoikalmCalamity2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -440px -452px;
|
||||
background-position: -220px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_stoikalmCalamity3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -660px -220px;
|
||||
background-position: -440px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_taskwoodsTerror1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1762px -721px;
|
||||
background-position: -1762px -872px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_taskwoodsTerror2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -1540px -431px;
|
||||
background-position: -1540px -1082px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_taskwoodsTerror3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: 0px -232px;
|
||||
background-position: -660px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
@@ -378,19 +378,19 @@
|
||||
}
|
||||
.quest_trex_undead {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -877px -1332px;
|
||||
background-position: -1311px -1332px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_triceratops {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -440px 0px;
|
||||
background-position: -880px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_turtle {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
|
||||
background-position: -660px -452px;
|
||||
background-position: -1100px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
||||
@@ -1,84 +1,84 @@
|
||||
.Mount_Head_Wolf-RoyalPurple {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -136px 0px;
|
||||
background-position: 0px 0px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Ruby {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -136px -408px;
|
||||
background-position: -136px 0px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Shade {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: 0px -408px;
|
||||
background-position: 0px -136px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Shadow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: 0px -136px;
|
||||
background-position: -136px -136px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Shimmer {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -136px -136px;
|
||||
background-position: -272px 0px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Silver {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -272px 0px;
|
||||
background-position: -272px -136px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Skeleton {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -272px -136px;
|
||||
background-position: 0px -272px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Spooky {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: 0px -272px;
|
||||
background-position: -136px -272px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-StarryNight {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -136px -272px;
|
||||
background-position: -272px -272px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Sunshine {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -272px -272px;
|
||||
background-position: -408px 0px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Thunderstorm {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -408px 0px;
|
||||
background-position: -408px -136px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Watery {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -408px -136px;
|
||||
background-position: -408px -272px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-White {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -408px -272px;
|
||||
background-position: 0px -408px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Zombie {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: 0px 0px;
|
||||
background-position: -136px -408px;
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
@@ -90,55 +90,55 @@
|
||||
}
|
||||
.Mount_Head_Yarn-CottonCandyBlue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -544px -212px;
|
||||
background-position: -378px -408px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Yarn-CottonCandyPink {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -378px -408px;
|
||||
background-position: -544px 0px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Yarn-Desert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -544px 0px;
|
||||
background-position: -544px -106px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Yarn-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -544px -106px;
|
||||
background-position: -544px -212px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Yarn-Red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -212px -544px;
|
||||
background-position: -544px -318px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Yarn-Shade {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -544px -318px;
|
||||
background-position: -544px -424px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Yarn-Skeleton {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -544px -424px;
|
||||
background-position: 0px -544px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Yarn-White {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: 0px -544px;
|
||||
background-position: -106px -544px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Yarn-Zombie {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -106px -544px;
|
||||
background-position: -212px -544px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
@@ -942,7 +942,7 @@
|
||||
}
|
||||
.Mount_Icon_Cactus-Rainbow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -1716px -700px;
|
||||
background-position: -492px -1150px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
@@ -1878,7 +1878,7 @@
|
||||
}
|
||||
.Mount_Icon_FlyingPig-IcySnow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
|
||||
background-position: -492px -1150px;
|
||||
background-position: -1716px -700px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
.Mount_Icon_Rooster-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -82px 0px;
|
||||
background-position: 0px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Rooster-Red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -164px -1100px;
|
||||
background-position: -82px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
@@ -1002,7 +1002,7 @@
|
||||
}
|
||||
.Mount_Icon_Triceratops-CottonCandyPink {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: 0px 0px;
|
||||
background-position: -164px -1100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
@@ -1242,757 +1242,757 @@
|
||||
}
|
||||
.Mount_Icon_Whale-Base {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -1096px;
|
||||
background-position: -1640px -400px;
|
||||
width: 78px;
|
||||
height: 86px;
|
||||
}
|
||||
.Mount_Icon_Whale-CottonCandyBlue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -1009px;
|
||||
background-position: -1640px -487px;
|
||||
width: 78px;
|
||||
height: 86px;
|
||||
}
|
||||
.Mount_Icon_Whale-CottonCandyPink {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -922px;
|
||||
background-position: -1640px -574px;
|
||||
width: 78px;
|
||||
height: 86px;
|
||||
}
|
||||
.Mount_Icon_Whale-Desert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -835px;
|
||||
background-position: -1640px -661px;
|
||||
width: 78px;
|
||||
height: 86px;
|
||||
}
|
||||
.Mount_Icon_Whale-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -1183px;
|
||||
background-position: -1640px -748px;
|
||||
width: 78px;
|
||||
height: 86px;
|
||||
}
|
||||
.Mount_Icon_Whale-Red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -661px;
|
||||
background-position: -1640px -835px;
|
||||
width: 78px;
|
||||
height: 86px;
|
||||
}
|
||||
.Mount_Icon_Whale-Shade {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -574px;
|
||||
background-position: -1640px -922px;
|
||||
width: 78px;
|
||||
height: 86px;
|
||||
}
|
||||
.Mount_Icon_Whale-Skeleton {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -487px;
|
||||
background-position: -1640px -1009px;
|
||||
width: 78px;
|
||||
height: 86px;
|
||||
}
|
||||
.Mount_Icon_Whale-White {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -748px;
|
||||
background-position: -1640px -1096px;
|
||||
width: 78px;
|
||||
height: 86px;
|
||||
}
|
||||
.Mount_Icon_Whale-Zombie {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -400px;
|
||||
background-position: -1640px -1183px;
|
||||
width: 78px;
|
||||
height: 86px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Amber {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -900px;
|
||||
background-position: -1230px -1200px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Aquatic {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -1000px;
|
||||
background-position: -1312px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Aurora {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -1100px;
|
||||
background-position: -1312px -100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Base {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -1200px;
|
||||
background-position: -1312px -200px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-BirchBark {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px 0px;
|
||||
background-position: -1312px -300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Bronze {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -100px;
|
||||
background-position: -1312px -400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Celestial {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -200px;
|
||||
background-position: -1312px -500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-CottonCandyBlue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -300px;
|
||||
background-position: -1312px -600px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-CottonCandyPink {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -400px;
|
||||
background-position: -1312px -700px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Cupid {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -500px;
|
||||
background-position: -1312px -800px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Desert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -600px;
|
||||
background-position: -1312px -900px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Ember {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -700px;
|
||||
background-position: -1312px -1000px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Fairy {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -800px;
|
||||
background-position: -1312px -1100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Floral {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -900px;
|
||||
background-position: -1312px -1200px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Frost {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -1000px;
|
||||
background-position: -1394px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Ghost {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -1100px;
|
||||
background-position: -1394px -100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Glass {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -1200px;
|
||||
background-position: -1394px -200px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Glow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: 0px -1300px;
|
||||
background-position: -1394px -300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -82px -1300px;
|
||||
background-position: -1394px -400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Holly {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -164px -1300px;
|
||||
background-position: -1394px -500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-IcySnow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -246px -1300px;
|
||||
background-position: -1394px -600px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Peppermint {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -328px -1300px;
|
||||
background-position: -1394px -700px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Rainbow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -410px -1300px;
|
||||
background-position: -1394px -800px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -492px -1300px;
|
||||
background-position: -1394px -900px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-RoseQuartz {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -574px -1300px;
|
||||
background-position: -1394px -1000px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-RoyalPurple {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -656px -1300px;
|
||||
background-position: -1394px -1100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Ruby {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -738px -1300px;
|
||||
background-position: -1394px -1200px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Shade {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -820px -1300px;
|
||||
background-position: 0px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Shadow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -902px -1300px;
|
||||
background-position: -82px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Shimmer {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -984px -1300px;
|
||||
background-position: -164px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Silver {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1066px -1300px;
|
||||
background-position: -246px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Skeleton {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1148px -1300px;
|
||||
background-position: -328px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Spooky {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1230px -1300px;
|
||||
background-position: -410px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-StarryNight {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -1300px;
|
||||
background-position: -492px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Sunshine {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -1300px;
|
||||
background-position: -574px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Thunderstorm {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px 0px;
|
||||
background-position: -656px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Watery {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -100px;
|
||||
background-position: -738px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-White {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -200px;
|
||||
background-position: -820px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Wolf-Zombie {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -300px;
|
||||
background-position: -902px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Yarn-Base {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -400px;
|
||||
background-position: -984px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Yarn-CottonCandyBlue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -500px;
|
||||
background-position: -1066px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Yarn-CottonCandyPink {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -600px;
|
||||
background-position: -1148px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Yarn-Desert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -700px;
|
||||
background-position: -1230px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Yarn-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -800px;
|
||||
background-position: -1312px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Yarn-Red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -900px;
|
||||
background-position: -1394px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Yarn-Shade {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -1000px;
|
||||
background-position: -1476px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Yarn-Skeleton {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -1100px;
|
||||
background-position: -1476px -100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Yarn-White {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -1200px;
|
||||
background-position: -1476px -200px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Mount_Icon_Yarn-Zombie {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -1300px;
|
||||
background-position: -1476px -300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Alligator-Base {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: 0px -1400px;
|
||||
background-position: -1476px -400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Alligator-CottonCandyBlue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -82px -1400px;
|
||||
background-position: -1476px -500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Alligator-CottonCandyPink {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -164px -1400px;
|
||||
background-position: -1476px -600px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Alligator-Desert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -246px -1400px;
|
||||
background-position: -1476px -700px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Alligator-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -328px -1400px;
|
||||
background-position: -1476px -800px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Alligator-Red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -410px -1400px;
|
||||
background-position: -1476px -900px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Alligator-Shade {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -492px -1400px;
|
||||
background-position: -1476px -1000px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Alligator-Skeleton {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -574px -1400px;
|
||||
background-position: -1476px -1100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Alligator-White {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -656px -1400px;
|
||||
background-position: -1476px -1200px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Alligator-Zombie {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -738px -1400px;
|
||||
background-position: -1476px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Armadillo-Base {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -820px -1400px;
|
||||
background-position: 0px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Armadillo-CottonCandyBlue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -902px -1400px;
|
||||
background-position: -82px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Armadillo-CottonCandyPink {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -984px -1400px;
|
||||
background-position: -164px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Armadillo-Desert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1066px -1400px;
|
||||
background-position: -246px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Armadillo-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1148px -1400px;
|
||||
background-position: -328px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Armadillo-Red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1230px -1400px;
|
||||
background-position: -410px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Armadillo-Shade {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -1400px;
|
||||
background-position: -492px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Armadillo-Skeleton {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -1400px;
|
||||
background-position: -574px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Armadillo-White {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -1400px;
|
||||
background-position: -656px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Armadillo-Zombie {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px 0px;
|
||||
background-position: -738px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Axolotl-Base {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -100px;
|
||||
background-position: -820px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Axolotl-CottonCandyBlue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -200px;
|
||||
background-position: -902px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Axolotl-CottonCandyPink {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -300px;
|
||||
background-position: -984px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Axolotl-Desert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -400px;
|
||||
background-position: -1066px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Axolotl-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -500px;
|
||||
background-position: -1148px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Axolotl-Red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -600px;
|
||||
background-position: -1230px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Axolotl-Shade {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -700px;
|
||||
background-position: -1312px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Axolotl-Skeleton {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -800px;
|
||||
background-position: -1394px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Axolotl-White {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -900px;
|
||||
background-position: -1476px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Axolotl-Zombie {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -1000px;
|
||||
background-position: -1558px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Badger-Base {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -1100px;
|
||||
background-position: -1558px -100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Badger-CottonCandyBlue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -1200px;
|
||||
background-position: -1558px -200px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Badger-CottonCandyPink {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -1300px;
|
||||
background-position: -1558px -300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Badger-Desert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -1400px;
|
||||
background-position: -1558px -400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Badger-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: 0px -1500px;
|
||||
background-position: -1558px -500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Badger-Red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -82px -1500px;
|
||||
background-position: -1558px -600px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Badger-Shade {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -164px -1500px;
|
||||
background-position: -1558px -700px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Badger-Skeleton {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -246px -1500px;
|
||||
background-position: -1558px -800px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Badger-White {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -328px -1500px;
|
||||
background-position: -1558px -900px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Badger-Zombie {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -410px -1500px;
|
||||
background-position: -1558px -1000px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Bear-Veteran {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -492px -1500px;
|
||||
background-position: -1558px -1100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Amber {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -574px -1500px;
|
||||
background-position: -1558px -1200px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Aquatic {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -656px -1500px;
|
||||
background-position: -1558px -1300px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Aurora {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -738px -1500px;
|
||||
background-position: -1558px -1400px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Base {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -820px -1500px;
|
||||
background-position: 0px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-BirchBark {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -902px -1500px;
|
||||
background-position: -82px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Bronze {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -984px -1500px;
|
||||
background-position: -164px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Celestial {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1066px -1500px;
|
||||
background-position: -246px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-CottonCandyBlue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1148px -1500px;
|
||||
background-position: -328px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-CottonCandyPink {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1230px -1500px;
|
||||
background-position: -410px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Cupid {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -1500px;
|
||||
background-position: -492px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Desert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1394px -1500px;
|
||||
background-position: -574px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Dessert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1476px -1500px;
|
||||
background-position: -656px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Ember {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1558px -1500px;
|
||||
background-position: -738px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Fairy {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px 0px;
|
||||
background-position: -820px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Floral {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -100px;
|
||||
background-position: -902px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Frost {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1640px -200px;
|
||||
background-position: -984px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Ghost {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -800px;
|
||||
background-position: -1066px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Glass {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -700px;
|
||||
background-position: -1148px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Glow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -600px;
|
||||
background-position: -1230px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -500px;
|
||||
background-position: -1312px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Holly {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -400px;
|
||||
background-position: -1394px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-IcySnow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -300px;
|
||||
background-position: -1476px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Peppermint {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -200px;
|
||||
background-position: -1558px -1500px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Polar {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px -100px;
|
||||
background-position: -1640px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Rainbow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1312px 0px;
|
||||
background-position: -1640px -100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
|
||||
background-position: -1230px -1200px;
|
||||
background-position: -1640px -200px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
.Pet-Hippo-Base {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-26.png');
|
||||
background-position: -82px 0px;
|
||||
background-position: 0px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Hippo-CottonCandyBlue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-26.png');
|
||||
background-position: -82px -1100px;
|
||||
background-position: -82px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
@@ -996,7 +996,7 @@
|
||||
}
|
||||
.Pet-Parrot-Golden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-26.png');
|
||||
background-position: 0px 0px;
|
||||
background-position: -82px -1100px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
.Pet-Spider-Zombie {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
|
||||
background-position: -82px 0px;
|
||||
background-position: 0px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Squirrel-Base {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
|
||||
background-position: -984px 0px;
|
||||
background-position: -82px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
@@ -648,7 +648,7 @@
|
||||
}
|
||||
.Pet-Velociraptor-Desert {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
|
||||
background-position: 0px 0px;
|
||||
background-position: -984px 0px;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
@@ -1062,13 +1062,13 @@
|
||||
}
|
||||
.Pet_HatchingPotion_Amber {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
|
||||
background-position: -1053px -1100px;
|
||||
background-position: -984px -1100px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.Pet_HatchingPotion_Aquatic {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
|
||||
background-position: 0px -1200px;
|
||||
background-position: -1053px -1100px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
@@ -1182,7 +1182,7 @@
|
||||
}
|
||||
.Pet_HatchingPotion_IcySnow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
|
||||
background-position: -984px -1100px;
|
||||
background-position: 0px -1200px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
|
||||
@@ -12,25 +12,25 @@
|
||||
}
|
||||
.hair_bangs_3_peppermint {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
|
||||
background-position: -91px 0px;
|
||||
background-position: 0px 0px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.customize-option.hair_bangs_3_peppermint {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
|
||||
background-position: -116px -15px;
|
||||
background-position: -25px -15px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.hair_bangs_3_pgreen {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
|
||||
background-position: -728px -1092px;
|
||||
background-position: -91px 0px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.customize-option.hair_bangs_3_pgreen {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
|
||||
background-position: -753px -1107px;
|
||||
background-position: -116px -15px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
@@ -1512,13 +1512,13 @@
|
||||
}
|
||||
.hair_base_11_ppurple2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
|
||||
background-position: 0px 0px;
|
||||
background-position: -728px -1092px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.customize-option.hair_base_11_ppurple2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
|
||||
background-position: -25px -15px;
|
||||
background-position: -753px -1107px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
.hair_base_15_white {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
|
||||
background-position: -91px 0px;
|
||||
background-position: 0px 0px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.customize-option.hair_base_15_white {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
|
||||
background-position: -116px -0px;
|
||||
background-position: -25px -0px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.hair_base_15_winternight {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
|
||||
background-position: -728px -1092px;
|
||||
background-position: -91px 0px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.customize-option.hair_base_15_winternight {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
|
||||
background-position: -753px -1092px;
|
||||
background-position: -116px -0px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
@@ -2448,13 +2448,13 @@
|
||||
}
|
||||
.hair_base_2_blue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
|
||||
background-position: 0px 0px;
|
||||
background-position: -728px -1092px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.customize-option.hair_base_2_blue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
|
||||
background-position: -25px -15px;
|
||||
background-position: -753px -1107px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
@@ -12,25 +12,25 @@
|
||||
}
|
||||
.hair_base_5_holly {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
|
||||
background-position: -91px 0px;
|
||||
background-position: 0px 0px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.customize-option.hair_base_5_holly {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
|
||||
background-position: -116px -15px;
|
||||
background-position: -25px -15px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.hair_base_5_hollygreen {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
|
||||
background-position: -728px -1092px;
|
||||
background-position: -91px 0px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.customize-option.hair_base_5_hollygreen {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
|
||||
background-position: -753px -1107px;
|
||||
background-position: -116px -15px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
@@ -1980,13 +1980,13 @@
|
||||
}
|
||||
.hair_base_9_porange {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
|
||||
background-position: 0px 0px;
|
||||
background-position: -728px -1092px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.customize-option.hair_base_9_porange {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
|
||||
background-position: -25px -15px;
|
||||
background-position: -753px -1107px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 469 KiB After Width: | Height: | Size: 470 KiB |
|
Before Width: | Height: | Size: 643 KiB After Width: | Height: | Size: 643 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 424 KiB After Width: | Height: | Size: 424 KiB |
|
Before Width: | Height: | Size: 224 KiB After Width: | Height: | Size: 224 KiB |
|
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 177 KiB After Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 184 KiB |
|
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 142 KiB |
@@ -49,11 +49,13 @@
|
||||
target="_blank"
|
||||
>{{ $t('oldNews') }}</a>
|
||||
</li>
|
||||
<!-- Commenting out merch page see https://github.com/HabitRPG/habitica/issues/12039
|
||||
<li>
|
||||
<router-link to="/static/merch">
|
||||
{{ $t('merch') }}
|
||||
</router-link>
|
||||
</li>
|
||||
-->
|
||||
<li>
|
||||
<router-link to="/static/press-kit">
|
||||
{{ $t('presskit') }}
|
||||
@@ -214,7 +216,7 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-5">
|
||||
© 2019 Habitica. All rights reserved.
|
||||
© 2020 Habitica. All rights reserved.
|
||||
<div
|
||||
v-if="!IS_PRODUCTION && isUserLoaded"
|
||||
class="debug float-left"
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>
|
||||
<strong v-once>{{ $t('privacySettings') }} *</strong>
|
||||
<strong v-once>{{ $t('privacySettings') }}</strong>
|
||||
</label>
|
||||
<br>
|
||||
<div class="custom-control custom-checkbox">
|
||||
@@ -115,7 +115,8 @@ label.custom-control-label(v-once) {{ $t('allowGuildInvitationsFromNonMembers')
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>
|
||||
<strong v-once>{{ $t('groupDescription') }} *</strong>
|
||||
<strong v-if="isParty">{{ $t('groupDescription') }}</strong>
|
||||
<strong v-else>{{ $t('groupDescription') }} *</strong>
|
||||
</label>
|
||||
<a
|
||||
v-markdown="$t('markdownFormattingHelp')"
|
||||
@@ -254,7 +255,7 @@ label.custom-control-label(v-once) {{ $t('allowGuildInvitationsFromNonMembers')
|
||||
<button
|
||||
v-if="workingGroup.id"
|
||||
class="btn btn-primary btn-md"
|
||||
:disabled="!workingGroup.name || !workingGroup.description"
|
||||
:disabled="!workingGroup.name || (!isParty && !workingGroup.description)"
|
||||
>
|
||||
{{ isParty ? $t('updateParty') : $t('updateGuild') }}
|
||||
</button>
|
||||
@@ -540,7 +541,7 @@ export default {
|
||||
if (!this.workingGroup.name) errors.push(this.$t('nameRequired'));
|
||||
if (!this.workingGroup.summary) errors.push(this.$t('summaryRequired'));
|
||||
if (this.workingGroup.summary.length > MAX_SUMMARY_SIZE_FOR_GUILDS) errors.push(this.$t('summaryTooLong'));
|
||||
if (!this.workingGroup.description) errors.push(this.$t('descriptionRequired'));
|
||||
if (!this.isParty && !this.workingGroup.description) errors.push(this.$t('descriptionRequired'));
|
||||
if (!this.isParty && (!this.workingGroup.categories || this.workingGroup.categories.length === 0)) errors.push(this.$t('categoiresRequired'));
|
||||
|
||||
if (errors.length > 0) {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
{{ `${$t('lockedItem')}` }}
|
||||
</h4>
|
||||
<div
|
||||
v-if="item.specialClass"
|
||||
v-if="isWrongClass"
|
||||
class="popover-content-text"
|
||||
>
|
||||
{{ `${$t('classLockedItem')}` }}
|
||||
@@ -71,6 +71,11 @@ export default {
|
||||
}
|
||||
return this.item.notes;
|
||||
},
|
||||
isWrongClass () {
|
||||
const wrongKlass = this.item.klass && !['special', 'armoire', this.user.stats.class].includes(this.item.klass);
|
||||
const wrongSpecialClass = this.item.klass === 'special' && this.item.specialClass && this.item.specialClass !== this.user.stats.class;
|
||||
return wrongKlass || wrongSpecialClass;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -1,21 +1,23 @@
|
||||
<template>
|
||||
<perfect-scrollbar
|
||||
<div
|
||||
ref="container"
|
||||
class="container-fluid"
|
||||
:class="{'disable-perfect-scroll': disablePerfectScroll}"
|
||||
:options="psOptions"
|
||||
>
|
||||
<div class="row loadmore">
|
||||
<div v-if="canLoadMore && !isLoading">
|
||||
<div class="loadmore-divider-holder">
|
||||
<div class="loadmore-divider"></div>
|
||||
</div>
|
||||
<button
|
||||
class="btn btn-secondary"
|
||||
@click="triggerLoad()"
|
||||
>
|
||||
{{ $t('loadEarlierMessages') }}
|
||||
</button>
|
||||
<div class="loadmore-divider-holder">
|
||||
<div class="loadmore-divider"></div>
|
||||
</div>
|
||||
</div>
|
||||
<h2
|
||||
v-show="isLoading"
|
||||
class="col-12 loading"
|
||||
@@ -30,11 +32,10 @@
|
||||
:class="{ 'margin-right': user._id !== msg.uuid}"
|
||||
>
|
||||
<div
|
||||
v-if="user._id !== msg.uuid"
|
||||
class="d-flex flex-grow-1"
|
||||
>
|
||||
<avatar
|
||||
v-if="conversationOpponentUser"
|
||||
v-if="user._id !== msg.uuid && conversationOpponentUser"
|
||||
class="avatar-left"
|
||||
:member="conversationOpponentUser"
|
||||
:avatar-only="true"
|
||||
@@ -42,20 +43,10 @@
|
||||
:hide-class-badge="true"
|
||||
@click.native="showMemberModal(msg.uuid)"
|
||||
/>
|
||||
<div class="card card-right">
|
||||
<message-card
|
||||
:msg="msg"
|
||||
@message-removed="messageRemoved"
|
||||
@show-member-modal="showMemberModal"
|
||||
@message-card-mounted="itemWasMounted"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="user._id === msg.uuid"
|
||||
class="d-flex flex-grow-1"
|
||||
>
|
||||
<div class="card card-left">
|
||||
<div
|
||||
class="card"
|
||||
:class="{'card-right': user._id !== msg.uuid, 'card-left': user._id === msg.uuid}"
|
||||
>
|
||||
<message-card
|
||||
:msg="msg"
|
||||
@message-removed="messageRemoved"
|
||||
@@ -64,7 +55,7 @@
|
||||
/>
|
||||
</div>
|
||||
<avatar
|
||||
v-if="user"
|
||||
v-if="user && user._id === msg.uuid"
|
||||
class="avatar-right"
|
||||
:member="user"
|
||||
:avatar-only="true"
|
||||
@@ -74,16 +65,11 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</perfect-scrollbar>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
@import '~vue2-perfect-scrollbar/dist/vue2-perfect-scrollbar.css';
|
||||
|
||||
.disable-perfect-scroll {
|
||||
overflow-y: inherit !important;
|
||||
}
|
||||
|
||||
.avatar {
|
||||
width: 170px;
|
||||
@@ -162,6 +148,8 @@
|
||||
.loadmore {
|
||||
justify-content: center;
|
||||
margin-right: 12px;
|
||||
margin-top: 12px;
|
||||
margin-bottom: 24px;
|
||||
|
||||
> div {
|
||||
display: flex;
|
||||
@@ -171,15 +159,11 @@
|
||||
button {
|
||||
text-align: center;
|
||||
color: $gray-50;
|
||||
margin-top: 12px;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.loadmore-divider {
|
||||
height: 1px;
|
||||
background-color: $gray-500;
|
||||
.loadmore-divider-holder {
|
||||
flex: 1;
|
||||
margin-left: 24px;
|
||||
margin-right: 24px;
|
||||
@@ -189,6 +173,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
.loadmore-divider {
|
||||
height: 1px;
|
||||
border-top: 1px $gray-500 solid;
|
||||
width: 100%;
|
||||
|
||||
}
|
||||
|
||||
.loading {
|
||||
padding-left: 1.5rem;
|
||||
margin-bottom: 1rem;
|
||||
@@ -200,7 +191,6 @@
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
import debounce from 'lodash/debounce';
|
||||
import { PerfectScrollbar } from 'vue2-perfect-scrollbar';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
import Avatar from '../avatar';
|
||||
@@ -210,7 +200,6 @@ export default {
|
||||
components: {
|
||||
Avatar,
|
||||
messageCard,
|
||||
PerfectScrollbar,
|
||||
},
|
||||
props: {
|
||||
chat: {},
|
||||
@@ -248,15 +237,10 @@ export default {
|
||||
messages () {
|
||||
return this.chat;
|
||||
},
|
||||
psOptions () {
|
||||
return {
|
||||
suppressScrollX: true,
|
||||
};
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async triggerLoad () {
|
||||
const container = this.$refs.container.$el;
|
||||
const { container } = this.$refs;
|
||||
|
||||
// get current offset
|
||||
this.lastOffset = container.scrollTop - (container.scrollHeight - container.clientHeight);
|
||||
@@ -274,8 +258,9 @@ export default {
|
||||
}
|
||||
},
|
||||
displayDivider (message) {
|
||||
if (this.currentDayDividerDisplay !== moment(message.timestamp).day()) {
|
||||
this.currentDayDividerDisplay = moment(message.timestamp).day();
|
||||
const day = moment(message.timestamp).day();
|
||||
if (this.currentDayDividerDisplay !== day) {
|
||||
this.currentDayDividerDisplay = day;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -288,7 +273,7 @@ export default {
|
||||
if (this.handleScrollBack) {
|
||||
this.handleScrollBack = false;
|
||||
|
||||
const container = this.$refs.container.$el;
|
||||
const { container } = this.$refs;
|
||||
const offset = container.scrollHeight - container.clientHeight;
|
||||
|
||||
const newOffset = offset + this.lastOffset;
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
|
||||
<style lang='scss'>
|
||||
@import '~@/assets/scss/static.scss';
|
||||
</style>
|
||||
|
||||
<style lang='scss' scoped>
|
||||
.static-view {
|
||||
height: 400px;
|
||||
text-align: center;
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
<template>
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-6 offset-3">
|
||||
<h1>{{ $t('merch') }}</h1>
|
||||
<!-- @TODO: Visual experience: Separate each
|
||||
merch items with new line? Or to show items in a table?-->
|
||||
<div
|
||||
v-for="(merchant) in merchants"
|
||||
:key="merchant.key"
|
||||
class="col-lg-6 col-md-6 col-sm-12"
|
||||
>
|
||||
<div class="merch-block">
|
||||
<img
|
||||
v-if="merchant.logo"
|
||||
:src="`/static/merch/${merchant.key}-logo.png`"
|
||||
>
|
||||
<h2 v-else>
|
||||
{{ merchant.name }}
|
||||
</h2>
|
||||
<div>
|
||||
<a
|
||||
:href="merchant.link"
|
||||
target="_blank"
|
||||
>
|
||||
<img
|
||||
class="img-rendering-auto"
|
||||
:src="`/static/merch/${merchant.key}.png`"
|
||||
>
|
||||
</a>
|
||||
</div>
|
||||
<p>{{ $t('merch-' + merchant.key + '-summary') }}</p>
|
||||
<a
|
||||
class="btn btn-primary"
|
||||
:href="merchant.link"
|
||||
target="_blank"
|
||||
>{{ $t('merch-' + merchant.key + '-goto') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
merchants: [
|
||||
{
|
||||
key: 'teespring', logo: true, name: 'Teespring', link: 'https://teespring.com/habitica-gryphon-t-shirt',
|
||||
},
|
||||
{
|
||||
key: 'teespring-eu', logo: true, name: 'Teespring (EU)', link: 'https://teespring.com/habitica-gryphon-t-shirt_eu',
|
||||
},
|
||||
{
|
||||
key: 'teespring-mug', logo: true, name: 'Teespring', link: 'https://teespring.com/shop/habitica-gryphon-mug',
|
||||
},
|
||||
{
|
||||
key: 'teespring-mug-eu', logo: true, name: 'Teespring (EU)', link: 'https://teespring.com/shop/habitica-hydration-mug-eu',
|
||||
},
|
||||
{
|
||||
key: 'stickermule', logo: true, name: 'Stickermule', link: 'https://www.stickermule.com/uk/marketplace/9317-habitica-gryphon-sticker',
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -23,6 +23,6 @@ export function setUpAxios (AUTH_SETTINGS) { // eslint-disable-line import/prefe
|
||||
}
|
||||
|
||||
export function buildAppleAuthUrl () {
|
||||
const redirectUrl = `${window.location.protocol}//${window.location.host}/api/v4/user/auth/apple`;
|
||||
const redirectUrl = encodeURIComponent(`${window.location.protocol}//${window.location.host}/api/v4/user/auth/apple`);
|
||||
return `https://appleid.apple.com/auth/authorize?response_mode=form_post&scope=name%20email&response_type=code&version=2&redirect_uri=${redirectUrl}&client_id=${process.env.APPLE_AUTH_CLIENT_ID}`;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import escapeRegExp from 'lodash/escapeRegExp';
|
||||
|
||||
const optionalAnchorTagRegExStr = '(<\\w[^>]*)?'; // everything including the anchor tag is recognized
|
||||
const mentionRegExStr = '(@[\\w-]+)';
|
||||
const mentionRegExStr = '(@(?:<(?:em|strong)>)?[\\w-]+(?:<\\/(?:em|strong)>)?)';
|
||||
const optionalPostMentionRegExStr = '(\\.\\w+)?'; // like dot-TLD
|
||||
|
||||
const finalMentionRegEx = new RegExp(`${optionalAnchorTagRegExStr}${mentionRegExStr}${optionalPostMentionRegExStr}`, 'gi');
|
||||
@@ -14,9 +14,12 @@ export function highlightUsers (text, userName, displayName) { // eslint-disable
|
||||
return fullMatched;
|
||||
}
|
||||
|
||||
const isUserMention = currentUser.includes(mentionStr) ? 'at-highlight' : '';
|
||||
let fixedStr = mentionStr.replace(/<\/?em>/g, '_');
|
||||
fixedStr = fixedStr.replace(/<\/?strong>/g, '__');
|
||||
|
||||
return fullMatched.replace(mentionStr, `<span class="at-text ${isUserMention}">${mentionStr}</span>`);
|
||||
const isUserMention = currentUser.includes(fixedStr) ? 'at-highlight' : '';
|
||||
|
||||
return fullMatched.replace(mentionStr, `<span class="at-text ${isUserMention}">${fixedStr}</span>`);
|
||||
});
|
||||
|
||||
return text;
|
||||
|
||||
@@ -19,7 +19,10 @@
|
||||
<!-- placeholder -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex selected-conversion">
|
||||
<div
|
||||
v-if="selectedConversation && selectedConversation.key"
|
||||
class="d-flex selected-conversion"
|
||||
>
|
||||
<router-link
|
||||
:to="{'name': 'userProfile', 'params': {'userId': selectedConversation.key}}"
|
||||
>
|
||||
@@ -49,13 +52,6 @@
|
||||
@change="toggleOpt()"
|
||||
/>
|
||||
</div>
|
||||
<div class="search-section">
|
||||
<b-form-input
|
||||
v-model="search"
|
||||
class="input-search"
|
||||
:placeholder="$t('search')"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
v-if="filtersConversations.length > 0"
|
||||
class="conversations"
|
||||
@@ -75,6 +71,13 @@
|
||||
@click="selectConversation(conversation.key)"
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
class="btn btn-secondary"
|
||||
v-if="canLoadMoreConversations"
|
||||
@click="loadConversations()"
|
||||
>
|
||||
{{ $t('loadMore') }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="messages-column d-flex flex-column align-items-center">
|
||||
<div
|
||||
@@ -142,7 +145,7 @@
|
||||
<h4>{{ disabledTexts.title }}</h4>
|
||||
<p>{{ disabledTexts.description }}</p>
|
||||
</div>
|
||||
<div>
|
||||
<div class="full-width">
|
||||
<div
|
||||
class="new-message-row d-flex align-items-center"
|
||||
>
|
||||
@@ -152,10 +155,8 @@
|
||||
class="flex-fill"
|
||||
:placeholder="$t('needsTextPlaceholder')"
|
||||
:maxlength="MAX_MESSAGE_LENGTH"
|
||||
:class="{'has-content': newMessage !== '', 'disabled': newMessageDisabled}"
|
||||
:style="{'--textarea-auto-height': textareaAutoHeight}"
|
||||
:class="{'has-content': newMessage.trim() !== '', 'disabled': newMessageDisabled}"
|
||||
@keyup.ctrl.enter="sendPrivateMessage()"
|
||||
@input="autoSize()"
|
||||
>
|
||||
</textarea>
|
||||
</div>
|
||||
@@ -293,20 +294,6 @@
|
||||
margin-left: 12px;
|
||||
}
|
||||
|
||||
.input-search {
|
||||
background-repeat: no-repeat;
|
||||
background-position: center left 16px;
|
||||
background-size: 16px 16px;
|
||||
background-image: url(~@/assets/svg/for-css/search_gray.svg) !important;
|
||||
padding-left: 40px;
|
||||
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.input-search::placeholder {
|
||||
color: $gray-200 !important;
|
||||
}
|
||||
|
||||
.selected-conversion {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
@@ -321,6 +308,8 @@
|
||||
height: 44px;
|
||||
background-color: $gray-600;
|
||||
padding: 0.75rem 1.5rem;
|
||||
|
||||
border-bottom: 1px solid $gray-500;
|
||||
}
|
||||
|
||||
|
||||
@@ -417,6 +406,10 @@
|
||||
}
|
||||
}
|
||||
|
||||
.full-width {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.new-message-row {
|
||||
width: 100%;
|
||||
padding-left: 1.5rem;
|
||||
@@ -435,8 +428,12 @@
|
||||
background-color: $gray-500;
|
||||
}
|
||||
|
||||
min-height: var(--textarea-auto-height, 40px);
|
||||
&.has-content {
|
||||
--textarea-auto-height: 80px
|
||||
}
|
||||
|
||||
max-height: var(--textarea-auto-height, 40px);
|
||||
min-height: var(--textarea-auto-height, 40px);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -502,11 +499,6 @@
|
||||
padding: 0;
|
||||
border-bottom-left-radius: 8px;
|
||||
|
||||
.search-section {
|
||||
padding: 1rem 1.5rem;
|
||||
border-bottom: 1px solid $gray-500;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 768px) {
|
||||
width: 280px;
|
||||
}
|
||||
@@ -555,7 +547,6 @@
|
||||
<script>
|
||||
import Vue from 'vue';
|
||||
import moment from 'moment';
|
||||
import filter from 'lodash/filter';
|
||||
import groupBy from 'lodash/groupBy';
|
||||
import orderBy from 'lodash/orderBy';
|
||||
import habiticaMarkdown from 'habitica-markdown';
|
||||
@@ -574,7 +565,9 @@ import faceAvatar from '@/components/faceAvatar';
|
||||
import Avatar from '@/components/avatar';
|
||||
import { EVENTS } from '@/libs/events';
|
||||
|
||||
const MAX_TEXTAREA_HEIGHT = 80;
|
||||
// extract to a shared path
|
||||
const CONVERSATIONS_PER_PAGE = 10;
|
||||
const PM_PER_PAGE = 10;
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@@ -597,19 +590,21 @@ export default {
|
||||
messageIcon,
|
||||
mail,
|
||||
}),
|
||||
displayCreate: true,
|
||||
selectedConversation: {},
|
||||
search: '',
|
||||
newMessage: '',
|
||||
showPopover: false,
|
||||
messages: [],
|
||||
messagesByConversation: {}, // cache {uuid: []}
|
||||
loadedConversations: [],
|
||||
loaded: false,
|
||||
messagesLoading: false,
|
||||
showPopover: false,
|
||||
|
||||
/* Conversation-specific data */
|
||||
initiatedConversation: null,
|
||||
updateConversationsCounter: 0,
|
||||
textareaAutoHeight: undefined,
|
||||
selectedConversation: {},
|
||||
conversationPage: 0,
|
||||
canLoadMoreConversations: false,
|
||||
loadedConversations: [],
|
||||
messagesByConversation: {}, // cache {uuid: []}
|
||||
|
||||
newMessage: '',
|
||||
messages: [],
|
||||
messagesLoading: false,
|
||||
MAX_MESSAGE_LENGTH: MAX_MESSAGE_LENGTH.toString(),
|
||||
};
|
||||
},
|
||||
@@ -724,13 +719,9 @@ export default {
|
||||
// Vue-subscribe to changes
|
||||
const subscribeToUpdate = this.updateConversationsCounter > -1;
|
||||
|
||||
const filtered = subscribeToUpdate && !this.search
|
||||
? this.conversations
|
||||
const filtered = subscribeToUpdate && this.conversations;
|
||||
|
||||
/* eslint-disable max-len */
|
||||
: filter(this.conversations, conversation => conversation.name.toLowerCase().indexOf(this.search.toLowerCase()) !== -1);
|
||||
|
||||
const ordered = orderBy(filtered, [o => moment(o.date).toDate()], ['desc']);
|
||||
const ordered = orderBy(filtered, [o => o.date], ['desc']);
|
||||
|
||||
return ordered;
|
||||
},
|
||||
@@ -809,15 +800,27 @@ export default {
|
||||
methods: {
|
||||
async reload () {
|
||||
this.loaded = false;
|
||||
this.conversationPage = 0;
|
||||
|
||||
const conversationRes = await axios.get('/api/v4/inbox/conversations');
|
||||
this.loadedConversations = conversationRes.data.data;
|
||||
this.loadedConversations = [];
|
||||
this.selectedConversation = {};
|
||||
|
||||
await this.loadConversations();
|
||||
|
||||
await this.$store.dispatch('user:markPrivMessagesRead');
|
||||
|
||||
this.loaded = true;
|
||||
},
|
||||
async loadConversations () {
|
||||
const query = ['/api/v4/inbox/conversations'];
|
||||
query.push(`?page=${this.conversationPage}`);
|
||||
this.conversationPage += 1;
|
||||
|
||||
const conversationRes = await axios.get(query.join(''));
|
||||
const loadedConversations = conversationRes.data.data;
|
||||
this.canLoadMoreConversations = loadedConversations.length === CONVERSATIONS_PER_PAGE;
|
||||
this.loadedConversations.push(...loadedConversations);
|
||||
},
|
||||
messageRemoved (message) {
|
||||
const messages = this.messagesByConversation[this.selectedConversation.key];
|
||||
|
||||
@@ -833,9 +836,6 @@ export default {
|
||||
};
|
||||
}
|
||||
},
|
||||
toggleClick () {
|
||||
this.displayCreate = !this.displayCreate;
|
||||
},
|
||||
toggleOpt () {
|
||||
this.$store.dispatch('user:togglePrivateMessagesOpt');
|
||||
},
|
||||
@@ -848,11 +848,7 @@ export default {
|
||||
await this.loadMessages();
|
||||
}
|
||||
|
||||
Vue.nextTick(() => {
|
||||
if (!this.$refs.chatscroll) return;
|
||||
const chatscroll = this.$refs.chatscroll.$el;
|
||||
chatscroll.scrollTop = chatscroll.scrollHeight;
|
||||
});
|
||||
this.scrollToBottom();
|
||||
},
|
||||
sendPrivateMessage () {
|
||||
if (!this.newMessage) return;
|
||||
@@ -890,11 +886,7 @@ export default {
|
||||
this.selectedConversation.lastMessageText = this.newMessage;
|
||||
this.selectedConversation.date = new Date();
|
||||
|
||||
Vue.nextTick(() => {
|
||||
if (!this.$refs.chatscroll) return;
|
||||
const chatscroll = this.$refs.chatscroll.$el;
|
||||
chatscroll.scrollTop = chatscroll.scrollHeight;
|
||||
});
|
||||
this.scrollToBottom();
|
||||
|
||||
this.$store.dispatch('members:sendPrivateMessage', {
|
||||
toUserId: this.selectedConversation.key,
|
||||
@@ -908,7 +900,13 @@ export default {
|
||||
});
|
||||
|
||||
this.newMessage = '';
|
||||
this.autoSize();
|
||||
},
|
||||
scrollToBottom () {
|
||||
Vue.nextTick(() => {
|
||||
if (!this.$refs.chatscroll) return;
|
||||
const chatscroll = this.$refs.chatscroll.$el;
|
||||
chatscroll.scrollTop = chatscroll.scrollHeight;
|
||||
});
|
||||
},
|
||||
removeTags (html) {
|
||||
const tmp = document.createElement('DIV');
|
||||
@@ -943,31 +941,17 @@ export default {
|
||||
const res = await axios.get(requestUrl);
|
||||
const loadedMessages = res.data.data;
|
||||
|
||||
/* eslint-disable max-len */
|
||||
this.messagesByConversation[conversationKey] = this.messagesByConversation[conversationKey] || [];
|
||||
/* eslint-disable max-len */
|
||||
const loadedMessagesToAdd = loadedMessages
|
||||
.filter(m => this.messagesByConversation[conversationKey].findIndex(mI => mI.id === m.id) === -1);
|
||||
this.messagesByConversation[conversationKey].push(...loadedMessagesToAdd);
|
||||
|
||||
// only show the load more Button if the max count was returned
|
||||
this.selectedConversation.canLoadMore = loadedMessages.length === 10;
|
||||
this.selectedConversation.canLoadMore = loadedMessages.length === PM_PER_PAGE;
|
||||
this.messagesLoading = false;
|
||||
},
|
||||
autoSize () {
|
||||
const { textarea } = this.$refs;
|
||||
// weird issue: browser only removing the scrollHeight / clientHeight per key event - 56-54-52
|
||||
let { scrollHeight } = textarea;
|
||||
|
||||
if (this.newMessage === '') {
|
||||
// reset height when the message was removed again
|
||||
scrollHeight = 40;
|
||||
}
|
||||
|
||||
if (scrollHeight > MAX_TEXTAREA_HEIGHT) {
|
||||
scrollHeight = MAX_TEXTAREA_HEIGHT;
|
||||
}
|
||||
|
||||
this.textareaAutoHeight = `${scrollHeight}px`;
|
||||
},
|
||||
selectFirstConversation () {
|
||||
if (this.loadedConversations.length > 0) {
|
||||
this.selectConversation(this.loadedConversations[0].uuid, true);
|
||||
|
||||
@@ -18,7 +18,9 @@ const ContactPage = () => import(/* webpackChunkName: "static" */'@/components/s
|
||||
const FAQPage = () => import(/* webpackChunkName: "static" */'@/components/static/faq');
|
||||
const FeaturesPage = () => import(/* webpackChunkName: "static" */'@/components/static/features');
|
||||
const GroupPlansPage = () => import(/* webpackChunkName: "static" */'@/components/static/groupPlans');
|
||||
const MerchPage = () => import(/* webpackChunkName: "static" */'@/components/static/merch');
|
||||
// Commenting out merch page see
|
||||
// https://github.com/HabitRPG/habitica/issues/12039
|
||||
// const MerchPage = () => import(/* webpackChunkName: "static" */'@/components/static/merch');
|
||||
const NewsPage = () => import(/* webpackChunkName: "static" */'@/components/static/newStuff');
|
||||
const OverviewPage = () => import(/* webpackChunkName: "static" */'@/components/static/overview');
|
||||
const PressKitPage = () => import(/* webpackChunkName: "static" */'@/components/static/pressKit');
|
||||
@@ -300,9 +302,11 @@ const router = new VueRouter({
|
||||
{
|
||||
name: 'front', path: 'front', component: HomePage, meta: { requiresLogin: false },
|
||||
},
|
||||
{
|
||||
name: 'merch', path: 'merch', component: MerchPage, meta: { requiresLogin: false },
|
||||
},
|
||||
// Commenting out merch page see
|
||||
// https://github.com/HabitRPG/habitica/issues/12039
|
||||
// {
|
||||
// name: 'merch', path: 'merch', component: MerchPage, meta: { requiresLogin: false },
|
||||
// },
|
||||
{
|
||||
name: 'news', path: 'new-stuff', component: NewsPage, meta: { requiresLogin: false },
|
||||
},
|
||||
|
||||
@@ -17,6 +17,24 @@ describe('highlightUserAndEmail', () => {
|
||||
expect(result).to.contain('<span class="at-text at-highlight">@user</span>');
|
||||
});
|
||||
|
||||
it('highlights username sandwiched with underscores', () => {
|
||||
const text = 'hello @<em>user</em>';
|
||||
|
||||
const result = highlightUsers(text, '_user_', 'displayedUser');
|
||||
expect(result).to.contain('<span class="at-text at-highlight">@_user_</span>');
|
||||
expect(result).to.not.contain('<em>');
|
||||
expect(result).to.not.contain('</em>');
|
||||
});
|
||||
|
||||
it('highlights username sandwiched with double underscores', () => {
|
||||
const text = 'hello @<strong>user</strong>';
|
||||
|
||||
const result = highlightUsers(text, 'diffUser', 'displayDiffUser');
|
||||
expect(result).to.contain('<span class="at-text ">@__user__</span>');
|
||||
expect(result).to.not.contain('<strong>');
|
||||
expect(result).to.not.contain('</strong>');
|
||||
});
|
||||
|
||||
it('not highlights any email', () => {
|
||||
const text = habiticaMarkdown.render('hello@example.com');
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ module.exports = {
|
||||
.exclude
|
||||
.add(path.resolve(__dirname, 'src/assets/svg/for-css'))
|
||||
.end()
|
||||
.use('svg-ingline-loader')
|
||||
.use('svg-inline-loader')
|
||||
.loader('svg-inline-loader')
|
||||
.end()
|
||||
.use('svgo-loader')
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
"achievementPrimedForPainting": "Sous-couche de peinture",
|
||||
"achievementPurchasedEquipmentModalText": "L'équipement est une façon de customiser votre avatar et d'améliorer vos stats",
|
||||
"achievementPurchasedEquipmentText": "A acheté sa première pièce d'équipement.",
|
||||
"achievementPurchasedEquipment": "Achetez de l'équipement",
|
||||
"achievementPurchasedEquipment": "Achetez une pièce d'équipement",
|
||||
"achievementFedPetModalText": "Il y a plusieurs types de nourriture, mais les familiers peuvent être capricieux",
|
||||
"achievementFedPetText": "A nourri son premier familier.",
|
||||
"achievementFedPet": "Donnez à manger à un familier",
|
||||
@@ -55,15 +55,15 @@
|
||||
"achievementCompletedTask": "Valider une tâche",
|
||||
"achievementCreatedTaskModalText": "Ajouter une tâche pour quelque chose que vous voudriez accomplir cette semaine",
|
||||
"achievementCreatedTaskText": "A créé sa première tâche.",
|
||||
"achievementCreatedTask": "Créer une tâche",
|
||||
"achievementCreatedTask": "Créer votre première tâche",
|
||||
"hideAchievements": "Cacher <%= category %>",
|
||||
"showAllAchievements": "Voir tout <%= category %>",
|
||||
"onboardingCompleteDesc": "Vous avec remporté <strong>5 succès</strong> et <strong class=\"gold-amount\">100</strong> pièces d'or pour avoir complété la liste.",
|
||||
"onboardingCompleteDesc": "Vous avec remporté <strong>5 succès</strong> et <strong class=\"gold-amount\">100 pièces d'or</strong> pour avoir complété la liste.",
|
||||
"earnedAchievement": "Vous avez remporté un succès !",
|
||||
"viewAchievements": "Voir les succès",
|
||||
"letsGetStarted": "Commençons !",
|
||||
"onboardingProgress": "<%= percentage %>% de progression",
|
||||
"gettingStartedDesc": "Créons une tâche, pour ensuite la valider et regarder le résultat. Vous gagnerez <strong>5 succès</strong> et <strong class=\"gold-amount\">100 pièces d'or</strong> quand vous aurez fini !",
|
||||
"gettingStartedDesc": "Complétez ces tâches de démarrage et vous gagnerez <strong>5 succès</strong> et <strong class=\"gold-amount\">100 pièces d'or</strong> quand vous aurez fini !",
|
||||
"achievementRosyOutlookModalText": "Vous avez dompté toutes les montures rose barbe à papa !",
|
||||
"achievementRosyOutlookText": "A dompté toutes les montures rose barbe à papa.",
|
||||
"achievementRosyOutlook": "La vie en rose",
|
||||
@@ -75,5 +75,8 @@
|
||||
"foundNewItems": "Vous avez trouvé de nouveaux objets !",
|
||||
"achievementBugBonanzaModalText": "Vous avez achevé les quêtes des scarabées, papillons, escargots et araignées !",
|
||||
"achievementBugBonanzaText": "A achevé les quêtes des scarabées, papillons, escargots et araignées.",
|
||||
"achievementBugBonanza": "Profusion d'insectes"
|
||||
"achievementBugBonanza": "Profusion d'insectes",
|
||||
"onboardingCompleteDescSmall": "Si vous en voulez plus, allez regarder les succès et commencez à les collectionner !",
|
||||
"onboardingComplete": "Vous avez terminé vos tâches de démarrage !",
|
||||
"yourProgress": "Votre progression"
|
||||
}
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
"mysterySet301703": "クジャクのスチームパンク セット",
|
||||
"mysterySet301704": "キジのスチームパンク セット",
|
||||
"mysterySetwondercon": "Wondercon イベント",
|
||||
"subUpdateCard": "クレジットカード情報を変更する",
|
||||
"subUpdateCard": "クレジットカードを更新する",
|
||||
"subUpdateTitle": "更新",
|
||||
"subUpdateDescription": "支払いに使用するクレジットカード情報を変更します。",
|
||||
"notEnoughHourglasses": "神秘の砂時計が足りません。",
|
||||
@@ -202,9 +202,9 @@
|
||||
"gemBenefit3": "ペットのたまごが手に入る、愉快な連続クエスト。",
|
||||
"gemBenefit4": "あなたのアバターの能力値をリセット、またはクラスを変更する。",
|
||||
"subscriptionBenefitLeadin": "寄付会員になってHabiticaをサポートすることで、これらの便利な特典を受けることができます!",
|
||||
"subscriptionBenefit1": "商人アレクサンダーはジェムを1つにつき20ゴールドで販売します!",
|
||||
"subscriptionBenefit1": "商人のAlexanderは、市場でジェムを1つにつき20ゴールドですぐ売ってくれます!",
|
||||
"subscriptionBenefit2": "完了した To-Do やタスクの履歴が、より長期間閲覧可能になります。",
|
||||
"subscriptionBenefit3": "落とし物の確率を2倍にして、より多くのアイテムを見つけましょう。",
|
||||
"subscriptionBenefit3": "毎日の落とし物上限を2倍にして、Habiticaでより多くのアイテムを見つけましょう。",
|
||||
"subscriptionBenefit4": "あなたのアバターに着せるためのユニークでおしゃれな衣装が毎月。",
|
||||
"subscriptionBenefit5": "特別な、高貴な紫のジャッカロープを受け取りましょう!",
|
||||
"subscriptionBenefit6": "タイムトラベラーの店で使うことのできる神秘の砂時計を手に入れましょう!",
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
"achievementMonsterMagus": "Monster Magiër",
|
||||
"achievementPartyOn": "Je gezelschap is gegroeid tot 4 leden!",
|
||||
"achievementPartyUp": "Je bent gaan samenwerken met een gezelschapslid!",
|
||||
"gettingStartedDesc": "Maak een taak, voltooi deze, en controleer daarna je beloningen. Je verdient <strong>5 prestaties</strong> en <strong class=\"gold-amount\">100 goud</strong>als je klaar bent!",
|
||||
"gettingStartedDesc": "Voltooi deze onboarding-taken en je verdient <strong>5 prestaties</strong>en<strong class= \"gold-amount\">100 goud</strong> als je klaar bent!",
|
||||
"achievementPearlyProModalText": "Je hebt alle Witte Rijdieren getemd!",
|
||||
"achievementPearlyProText": "Heeft alle Witte Rijdieren getemd.",
|
||||
"achievementPearlyPro": "Parelwitte Pro",
|
||||
@@ -53,13 +53,13 @@
|
||||
"achievementHatchedPet": "Laat een Huisdier uitkomen",
|
||||
"achievementCompletedTaskModalText": "Vink je taken af om beloningen te verdienen",
|
||||
"achievementCompletedTaskText": "Heeft zijn/haar eerste taak voltooid.",
|
||||
"achievementCompletedTask": "Voltooi een Taak",
|
||||
"achievementCompletedTask": "Voltooi een taak",
|
||||
"achievementCreatedTaskModalText": "Voeg een taak toe voor iets wat je deze week zou willen bereiken",
|
||||
"achievementCreatedTaskText": "Heeft zijn/haar eerste taak gecreëerd.",
|
||||
"achievementCreatedTask": "Creëer een Taak",
|
||||
"achievementCreatedTask": "Creëer je eerste taak",
|
||||
"hideAchievements": "Verberg <%= category %>",
|
||||
"showAllAchievements": "Laat alles zien <%= category %>",
|
||||
"onboardingCompleteDesc": "Je hebt <strong>5 prestaties</strong> en <strong class=\"gold-amount\">100</strong> goud verdient voor het voltooien van de lijst.",
|
||||
"onboardingCompleteDesc": "Je hebt <strong>5 prestaties</strong> en <strong class=\"gold-amount\">100 goud</strong> verdient voor het voltooien van de lijst.",
|
||||
"earnedAchievement": "Je hebt een prestatie verricht!",
|
||||
"viewAchievements": "Bekijk Prestaties",
|
||||
"letsGetStarted": "Laten we beginnen!",
|
||||
@@ -75,5 +75,8 @@
|
||||
"foundNewItems": "Je hebt nieuwe voorwerpen gevonden!",
|
||||
"achievementBugBonanzaModalText": "Je hebt de kever-, vlinder-, slak- en spin-huisdierzoektochten voltooid!",
|
||||
"achievementBugBonanzaText": "Heeft kever-, vlinder-, slak- en spin-huisdierzoektochten voltooid.",
|
||||
"achievementBugBonanza": "Bug Bonanza"
|
||||
"achievementBugBonanza": "Bug Bonanza",
|
||||
"onboardingCompleteDescSmall": "Als je nog meer wilt, bekijk dan prestaties en begin met verzamelen!",
|
||||
"onboardingComplete": "Je hebt je onboarding-taken voltooid!",
|
||||
"yourProgress": "Jouw vooruitgang"
|
||||
}
|
||||
|
||||
@@ -41,13 +41,13 @@
|
||||
"achievementPrimedForPaintingModalText": "Você coletou todos os Mascotes brancos!",
|
||||
"achievementPrimedForPaintingText": "Coletou todos os Mascotes brancos.",
|
||||
"achievementPrimedForPainting": "Preparado para pintura",
|
||||
"achievementPurchasedEquipmentModalText": "Equipamento é um meio de personalizar seu avatar e melhorar suas estatísticas",
|
||||
"achievementPurchasedEquipmentModalText": "Equipamento é um meio de personalizar seu avatar e melhorar seus pontos de Atributos",
|
||||
"achievementPurchasedEquipmentText": "Comprou sua primeira peça de equipamento.",
|
||||
"achievementPurchasedEquipment": "Comprar equipamento",
|
||||
"achievementFedPetModalText": "Há diferentes tipos de comida, mas os mascotes podem ser exigentes",
|
||||
"achievementPurchasedEquipment": "Comprar uma peça de Equipamento",
|
||||
"achievementFedPetModalText": "Há diferentes tipos de comida, mas os Mascotes podem ser exigentes",
|
||||
"achievementFedPetText": "Alimentou seu primeiro mascote.",
|
||||
"achievementFedPet": "Alimentar um Mascote",
|
||||
"achievementHatchedPetModalText": "Vá até o seu inventário e tente combinar uma poção de eclosão e um ovo",
|
||||
"achievementHatchedPetModalText": "Vá até o seu inventário e tente combinar uma Poção de Eclosão com algum Ovo",
|
||||
"achievementHatchedPetText": "Chocou seu primeiro mascote.",
|
||||
"achievementHatchedPet": "Chocar um Mascote",
|
||||
"achievementCompletedTaskModalText": "Marque qualquer uma das suas tarefas para ganhar recompensas",
|
||||
@@ -55,15 +55,15 @@
|
||||
"achievementCompletedTask": "Concluir uma tarefa",
|
||||
"achievementCreatedTaskModalText": "Adicione uma tarefa para algo que você gostaria de realizar esta semana",
|
||||
"achievementCreatedTaskText": "Criou sua primeira tarefa.",
|
||||
"achievementCreatedTask": "Criar uma Tarefa",
|
||||
"achievementCreatedTask": "Crie sua primeira tarefa",
|
||||
"hideAchievements": "Ocultar <%= category %>",
|
||||
"showAllAchievements": "Exibir todas as <%= category %>",
|
||||
"onboardingCompleteDesc": "Você ganhou <strong>5 conquistas</strong> e <strong class=\"gold-amount\">100</strong> peças de ouro por completar a lista.",
|
||||
"onboardingCompleteDesc": "Você ganhou <strong>5 Conquistas</strong> e <strong class=\"gold-amount\">100 peças de Ouro</strong> por completar a lista.",
|
||||
"earnedAchievement": "Você ganhou uma conquista!",
|
||||
"viewAchievements": "Visualizar Conquistas",
|
||||
"letsGetStarted": "Vamos começar!",
|
||||
"onboardingProgress": "<%= percentage %>% concluído",
|
||||
"gettingStartedDesc": "Vamos criar uma tarefa, concluí-la e, então, conferir suas recompensas. Você ganhará <strong>5 conquistas</strong> e <strong class=\"gold-amount\">100 peças ouro</strong> assim que terminar!",
|
||||
"gettingStartedDesc": "Complete essas tarefas de integração e você ganhará <strong>5 Conquistas</strong> e <strong class=\"gold-amount\">100 peças de Ouro</strong> assim que terminar!",
|
||||
"achievementRosyOutlookModalText": "Você domou todas as Montarias algodão-doce rosa!",
|
||||
"achievementRosyOutlookText": "Coletou todas as Montarias algodão-doce rosa.",
|
||||
"achievementRosyOutlook": "Perspectiva rosada",
|
||||
@@ -75,5 +75,8 @@
|
||||
"foundNewItems": "Você encontrou todos os novos itens!",
|
||||
"achievementBugBonanzaModalText": "Você completou as missões dos mascotes Besouro, Borboleta, Caracol e Aranha!",
|
||||
"achievementBugBonanzaText": "Completou as missões dos mascotes Besouro, Borboleta, Caracol e Aranha.",
|
||||
"achievementBugBonanza": "Inseto próspero"
|
||||
"achievementBugBonanza": "Inseto próspero",
|
||||
"yourProgress": "Seu progresso",
|
||||
"onboardingCompleteDescSmall": "Se você quiser ainda mais, dê uma olhada nas Conquistas e comece a coletá-las!",
|
||||
"onboardingComplete": "Você completou suas tarefas de integração!"
|
||||
}
|
||||
|
||||
@@ -95,8 +95,8 @@
|
||||
"joinedChallenge": "Entrou em um Desafio",
|
||||
"joinedChallengeText": "Este usuário testou seus limites ao entrar em um Desafio!",
|
||||
"myChallenges": "Meus Desafios",
|
||||
"findChallenges": "Encontre Desafios",
|
||||
"noChallengeTitle": "Você não participa de nenhum desafio.",
|
||||
"findChallenges": "Encontrar Desafios",
|
||||
"noChallengeTitle": "Você não está participando de nenhum Desafio.",
|
||||
"challengeDescription1": "Desafios são eventos comunitários em que os jogadores competem e ganham prêmios ao completarem um grupo de tarefas relacionadas a esses desafios.",
|
||||
"challengeDescription2": "Encontre Desafios recomendados baseado nos seus interesses. Pesquise nos Desafios Públicos do Habitica ou crie seus próprios Desafios.",
|
||||
"noChallengeMatchFilters": "Não foi possível encontrar nenhum Desafio correspondente.",
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
"youSure": "Tem certeza?",
|
||||
"submit": "Enviar",
|
||||
"close": "Fechar",
|
||||
"saveAndClose": "Salvar e Fechar",
|
||||
"saveAndClose": "Salvar e fechar",
|
||||
"saveAndConfirm": "Salvar & Confirmar",
|
||||
"cancel": "Cancelar",
|
||||
"ok": "OK",
|
||||
@@ -169,7 +169,7 @@
|
||||
"achievementBurnoutText": "Ajudou a derrotar o Desgaste e recuperar os Espíritos Exaustos durante o Evento Festival de Outono de 2015!",
|
||||
"achievementBewilder": "Salvador de Borbópolis",
|
||||
"achievementBewilderText": "Ajudou a derrotar o Ilusion-lista durante o Festival de Primavera de 2016!",
|
||||
"achievementDysheartener": "Redentor de O Descouraçado",
|
||||
"achievementDysheartener": "Redentor d'O Descouraçado",
|
||||
"achievementDysheartenerText": "Ajudou a derrotar o Descoraçador durante o Dia dos Namorados de 2018!",
|
||||
"checkOutProgress": "Veja o meu progresso no Habitica!",
|
||||
"cards": "Cartões",
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"mattBoch": "Matt Boch",
|
||||
"mattShall": "Devo trazer seu corcel, <%= name %>? Uma vez que você alimentou o seu mascote o suficiente para torná-lo uma montaria, ele aparecerá aqui. Clique em uma montaria para montá-la!",
|
||||
"mattBochText1": "Bem-vindo ao meu Estábulo! Sou Matt, o mestre das bestas. Sempre que você completar uma tarefa, poderá obter, randomicamente, um Ovo ou uma Poção de eclosão para chocar Mascotes. Quando você choca um Mascote no, ele aparecerá aqui! Clique na imagem de um Mascote para adicioná-lo ao seu Avatar. Alimente-os usando a comida que você encontrar e eles se transformarão em poderosas Montarias.",
|
||||
"welcomeToTavern": "Bem-vindo(a) a Taverna!",
|
||||
"welcomeToTavern": "Boas-vindas à Taverna!",
|
||||
"sleepDescription": "Precisa de um descanso? Faça uma visita à Pousada do Daniel e pare algumas das mecânicas de jogo mais difíceis do Habitica:",
|
||||
"sleepBullet1": "Diárias não feitas não lhe causarão dano",
|
||||
"sleepBullet2": "Tarefas não perderão combos",
|
||||
@@ -31,7 +31,7 @@
|
||||
"daniel": "Daniel",
|
||||
"danielText": "Boas vindas à Pousada! Fique um pouco e conheça os nativos. Se precisar descansar (férias? problemas de saúde?), eu me encarregarei de deixá-lo à vontade na Pousada. Enquanto descansa, suas Diárias não lhe causarão dano na virada do dia, mas você ainda pode marcá-las como realizadas.",
|
||||
"danielText2": "Tenha cuidado: Se estiver participando de uma missão contra um Chefão, ele ainda lhe causará danos pelas Diárias não feitas dos seus companheiros de grupo! Além disso, o seu dano no Chefão (ou itens coletados) não serão calculados até que você saia da Pousada.",
|
||||
"danielTextBroken": "Bem-vindo(a) a Taverna... Eu acho... Se você precisa descansar, eu irei te hospedar na Pousada... Enquanto estiver na Pousada, suas Diárias não te machucarão no final do dia, mas você ainda pode marcá-las como realizadas... se você tiver energia...",
|
||||
"danielTextBroken": "Boas-vindas à Taverna... Eu acho... Se você precisa descansar, eu irei te hospedar na Pousada... Enquanto estiver na Pousada, suas Diárias não te machucarão no final do dia, mas você ainda pode marcá-las como realizadas... se você tiver energia...",
|
||||
"danielText2Broken": "Oh... Se você estiver participando de uma missão de Chefão, ele ainda te causará dano pelas Diárias não feitas dos teus colegas de grupo... Além disso, seu dano no Chefão (ou itens coletados) não serão calculados até que você saia da Pousada...",
|
||||
"worldBossEvent": "Evento de Chefão Global",
|
||||
"worldBossDescription": "Descrição do Chefão Global",
|
||||
@@ -134,10 +134,10 @@
|
||||
"tourScrollDown": "Certifique-se de rolar a página até o final para ver todas as opções! Clique no seu avatar novamente para retornar à página de tarefas.",
|
||||
"tourMuchMore": "Quando tiver terminado suas tarefas, você pode formar um grupo com amigos, conversar nas guildas temáticas, participar de desafios e mais!",
|
||||
"tourStatsPage": "Essa é a sua página de Atributos! Conquiste medalhas completando as tarefas listadas.",
|
||||
"tourTavernPage": "Bem-vindo(a) a Taverna, uma sala de bate-papo para todas as idades! Clicando em \"Pausar Diárias\" você poderá prevenir que suas Diárias te causem dano em caso de doença ou viajem . Venha dizer 'Olá'!",
|
||||
"tourPartyPage": "Seu Grupo vai te ajudar a se manter responsável. Convide amigos para destravar um Pergaminho de Missão!",
|
||||
"tourGuildsPage": "Guildas são grupos de chat com interesses em comum criados por jogadores e para jogadores. Navegue pela lista e entre na Guilda que te interessar. Verifique também a popular guilda Brasil, onde brasileiros ajudam brasileiros!",
|
||||
"tourChallengesPage": "Desafios são listas de tarefas temáticas criadas por usuários! Participar de um Desafio adicionará tarefas à sua conta. Compita contra outros usuários para ganhar prêmios em gemas!",
|
||||
"tourTavernPage": "Boas-vindas à Taverna, uma sala de bate-papo para todas as idades! Clicando em \"Pausar Diárias\" você poderá prevenir que suas Diárias te causem dano em caso de doença ou viajem . Venha dizer 'Olá'!",
|
||||
"tourPartyPage": "Seu Grupo vai te ajudar a manter-se responsável. Convide amigos para desbloquear um Pergaminho de Missão!",
|
||||
"tourGuildsPage": "Guildas são grupos com assuntos de interesses em comum criados por jogadores e para jogadores. Navegue pela lista e entre na Guilda que te interessar. Dê uma olhada na guilda Habitica Help: Ask a Question, onde qualquer usuário pode tirar suas dúvidas sobre Habitica! Verifique também a popular guilda Brasil, onde brasileiros ajudam brasileiros!",
|
||||
"tourChallengesPage": "Desafios são listas de tarefas temáticas criadas por usuários! Participar de um Desafio adicionará tarefas à sua conta. Dispute contra outros usuários para ganhar prêmios em Gemas!",
|
||||
"tourMarketPage": "Sempre que você completar uma tarefa, poderá obter, randomicamente, um Ovo ou uma Poção de eclosão ou Comida para mascote. Você também pode comprar esses itens aqui.",
|
||||
"tourHallPage": "Boas Vindas ao Salão dos Heróis, onde os contribuidores do código aberto do Habitica são honrados. Seja através de programação, arte, música, escrita ou apenas prestatividade, eles receberam Gemas, equipamentos exclusivos e títulos prestigiosos. Você também pode contribuir para o Habitica!",
|
||||
"tourPetsPage": "Bem-vindo(a) ao Estábulo! Sempre que você concluir uma tarefa, obterá, randomicamente, um Ovo ou uma Poção de eclosão para chocar Mascotes. Quando você eclodir um ovo de Mascote no Mercado, ele vai aparecer aqui! Clique na imagem de um Mascote para adicioná-lo a seu Avatar. Alimente-os com a comida que encontrar e eles se tornarão Montarias poderosas.",
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
"fixValuesText2": "Note que aqui você não pode restaurar Combos em tarefas individuais. Para fazer isso, edite a Diária, nas Configurações Avançadas, onde você encontrará o campo de Restauração de Combos.",
|
||||
"disabledWinterEvent": "Desativado durante o Evento Maravilhas de Inverno Pt.4 (já que as recompensas são compráveis com ouro).",
|
||||
"fix21Streaks": "Combos de 21 Dias",
|
||||
"discardChanges": "Descartar Alterações",
|
||||
"discardChanges": "Descartar alterações",
|
||||
"deleteDo": "Sim, delete minha conta!",
|
||||
"enterNumber": "Favor digitar um número entre 0 e 24",
|
||||
"fillAll": "Favor preencher todos os campos",
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
"subscriptionAlreadySubscribedLeadIn": "Obrigado por tornar-se um assinante!",
|
||||
"subscriptionAlreadySubscribed1": "Para ver os detalhes, cancelamento, renovação ou mudanças na sua assinatura, por favor vá para <a href='/user/settings/subscription'>Usuário > Configurações > Assinatura</a>.",
|
||||
"purchaseAll": "Comprar Conjunto",
|
||||
"gemsPurchaseNote": "Assinantes podem comprar Gemas com Ouro no Mercado! Para fácil acesso, você pode marcar a Gema na sua coluna de Recompensas.",
|
||||
"gemsPurchaseNote": "Assinantes podem comprar Gemas com Ouro no Mercado! Para facilitar o acesso, você pode fixar a Gema na sua coluna de Recompensas.",
|
||||
"gemsRemaining": "Gemas restantes",
|
||||
"notEnoughGemsToBuy": "Você não pode comprar essa quantidade de Gemas",
|
||||
"mysterySet201902": "Conjunto do crush enigmático",
|
||||
|
||||
@@ -9,5 +9,25 @@
|
||||
"questMounts": "Thú cưỡi Nhiệm vụ",
|
||||
"mounts": "Thú cưỡi",
|
||||
"magicPets": "Thú cưng Ma thuật",
|
||||
"petsFound": "Thú cưng Đã có"
|
||||
"petsFound": "Thú cưng Đã có",
|
||||
"rareMounts": "Thú cưỡi Hiếm",
|
||||
"mountsTamed": "Thú cưỡi đã Thuần hóa",
|
||||
"noActiveMount": "Không có Thú cưỡi Hiện tại",
|
||||
"activeMount": "Thú cưỡi Hiện tại",
|
||||
"wackyPets": "Thú cưng Kỳ quái",
|
||||
"hopefulHippogriffPet": "Hippogriff Hy vọng",
|
||||
"magicalBee": "Ong Ma thuật",
|
||||
"phoenix": "Phượng hoàng",
|
||||
"royalPurpleGryphon": "Gryphon Hoàng gia Màu tím",
|
||||
"orca": "Cá voi sát thủ",
|
||||
"mammoth": "Ma mút Mềm mại",
|
||||
"mantisShrimp": "Tôm tít",
|
||||
"hydra": "Hydra",
|
||||
"cerberusPup": "Chó con Cerberus",
|
||||
"veteranFox": "Cáo Cựu binh",
|
||||
"veteranBear": "Gấu Cựu binh",
|
||||
"veteranLion": "Sư tử Cựu binh",
|
||||
"veteranTiger": "Hổ Cựu binh",
|
||||
"veteranWolf": "Sói Cựu binh",
|
||||
"etherealLion": "Sư tử Thanh khiết"
|
||||
}
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
"optOutOfClasses": "有权退出",
|
||||
"optOutOfPMs": "有权退出",
|
||||
"chooseClass": "选择你的职业",
|
||||
"chooseClassLearnMarkdown": "[想知道更多关于Habitica的职业系统](http://habitica.fandom.com/wiki/Class_System)",
|
||||
"chooseClassLearnMarkdown": "[想知道更多关于Habitica的职业系统](http://habitica.fandom.com/zh/wiki/职业)",
|
||||
"optOutOfClassesText": "不知道选什么职业?想以后再选?没问题 - 你现在可以先做一个没有特殊技能的战士。我们的维基页面上有关于职业系统的介绍,你看了之后随时可以在用户图标->设定界面确定你的职业。",
|
||||
"selectClass": "选择 <%= heroClass %>",
|
||||
"select": "选择",
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
"commGuidePara029": "<strong>公开的公会就像酒馆,只是除了一般讨论外,他们有一个关注的主题 </strong>。公会聊天应该聚焦在这个主题上。例如 语言大师公会 如果突然专注起园艺而不是写作,这个公会就会被取消;或者 龙的发烧友公会 对解密古老卢恩文字就不会有兴趣。一些公会对这样要求比较宽松,但整体而言,<strong>尽量不要跑题 </strong>!",
|
||||
"commGuidePara031": "一些公开的公会可能包含敏感话题,比如关于抑郁、宗教或政治的话题。只要不违反条款与条件,以及公共空间准则,并将讨论限制在话题范围内,这些讨论是不被限制的。",
|
||||
"commGuidePara033": "<strong> 公开公会不能含有18禁内容。如果打算在里面定期地讨论这些敏感内容,应该在公会名称上标明。</strong> 这条规定是为了让所有玩家安全舒适的进行游戏。",
|
||||
"commGuidePara035": "<strong> 如果一个可疑的公会里包含了不同种类的敏感议题,请尊重你的小伙伴,在警告后面加以注明(例如“警告:里面含有自残内容”)</strong>。这些将会被定性为触发警告或是有备注的内容,除了既定的规则之外管理者可以定制自己的规则。如果可以的话,请使用 <a href='http://habitica.fandom.com/wiki/Markdown_Cheat_Sheet' target='_blank'>Markdown语法</a> 来隐藏换行符下的潜在敏感内容,以便那些希望避免阅读该内容的人不会在滚动阅读时看见该内容。Habitica工作人员和管理员可以自行决定保留或移除这些内容。",
|
||||
"commGuidePara035": "<strong> 如果一个可疑的公会里包含了不同种类的敏感议题,请尊重你的小伙伴,在警告后面加以注明(例如“警告:里面含有自残内容”)</strong>。这些将会被定性为触发警告或是有备注的内容,除了既定的规则之外管理者可以定制自己的规则。如果可以的话,请使用 <a href='http://habitica.fandom.com/zh/wiki/Markdown格式帮助' target='_blank'>Markdown语法</a> 来隐藏换行符下的潜在敏感内容,以便那些希望避免阅读该内容的人不会在滚动阅读时看见该内容。Habitica工作人员和管理员可以自行决定保留或移除这些内容。",
|
||||
"commGuidePara036": "另外,敏感成份必须和主题有关——在对抗抑郁症的公会里谈到自残是可理解的,但在音乐公会里谈就不适当了。如果你看到有人一直违反社区准则,屡劝不听的话,请举报该帖子并且通过<a href='http://contact.habitica.com/' target='_blank'>管理员联系表格</a>通知管理员。",
|
||||
"commGuidePara037": "<strong> 不应该建立任何用于攻击任何团体或个人的公会,不论是公开或是私人</strong>。建立这样的公会将会被立刻封禁。对抗坏习惯,而不是你的冒险者小伙伴!",
|
||||
"commGuidePara038": "<strong> 所有的酒馆挑战和公共公会的挑战也必须遵守这些规则 </strong>。",
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
"androidFaqAnswer1": "好习惯(有+号的那些)养成任务你能够在一天之内完成很多次,比如多吃蔬菜。坏习惯(带有-号的)则是你需要避免去做的,比如啃指甲。同时带有+和-号的任务表示某件事可以有好坏两个选择,比如走楼梯上楼或乘坐电梯。养成好习惯会奖励你经验值和金币,坏习惯则会减少生命值。\n\n每日任务是你每天都必须完成的事项,比如刷牙,或者检查你的邮件。可以通过点击每日任务编辑任务完成期限,如果在一个任务到期前你没能完成它,你的生命值将降低,注意,不要一次性加太多每日任务!\n\n待办任务就是你的待办项列表,完成一个待办任务可以获得金币和经验值,你不会因为待办任务损失生命值,可以点击编辑一个待办任务来为它添加完成期限。",
|
||||
"webFaqAnswer1": "你可以每天完成很多次良好的习惯(带有:heavy_plus_sign:的习惯),比如吃点蔬菜。同时,你也应该避免坏习惯(带有:heavy_minus_sign:的习惯)的发生,比如说啃手指甲。而同时带有 :heavy_plus_sign:和 :heavy_minus_sign:,说明这个习惯可能有好的方向,也有坏的方向,比如爬楼梯vs.坐电梯。养成良好的习惯可以给你带来金币和经验,而坏习惯则会减少你的生命。\n每日任务则是一些你每天都应该完成的事情,比如啥刷牙、检查邮件。你可以点击任务右上角的铅笔图标,来调整一个每日任务在周几会重复出现。如果你某天没有勾选对应的每日任务,你的角色就会收到对应的伤害。所以添加每日任务的时候,一定要三思。\n待办任务就是你的待办项列表,完成一个待办任务可以获得金币和经验值,你不会因为待办任务损失生命值,可以点击编辑一个待办任务来为它添加完成期限。",
|
||||
"faqQuestion2": "有没有可供参考的任务范例?",
|
||||
"iosFaqAnswer2": "wiki有四个范例:\n<br><br>\n* [习惯](http://habitica.fandom.com/wiki/Sample_Habits)\n* [每日任务](http://habitica.fandom.com/wiki/Sample_Dailies)\n* [待办事项](http://habitica.fandom.com/wiki/Sample_To-Dos)\n* [自订奖励](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
|
||||
"androidFaqAnswer2": "wiki有上四个任务范例,或许能给你带来启发:\n<br><br>\n* [习惯](http://habitica.fandom.com/wiki/Sample_Habits)\n* [每日任务](http://habitica.fandom.com/wiki/Sample_Dailies)\n* [待办事项](http://habitica.fandom.com/wiki/Sample_To-Dos)\n* [自订奖励](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
|
||||
"webFaqAnswer2": "wiki有四个范例:\n* [习惯](http://habitica.fandom.com/wiki/Sample_Habits)\n* [每日任务](http://habitica.fandom.com/wiki/Sample_Dailies)\n* [待办事项](http://habitica.fandom.com/wiki/Sample_To-Dos)\n* [自订奖励](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
|
||||
"iosFaqAnswer2": "wiki有四个范例:\n<br><br>\n* [习惯](http://habitica.fandom.com/zh/wiki/习惯范例)\n* [每日任务](http://habitica.fandom.com/zh/wiki/每日任务范例)\n* [待办事项](http://habitica.fandom.com/zh/wiki/待办事项范例)\n* [自定义奖励](http://habitica.fandom.com/zh/wiki/自定义奖励范例)",
|
||||
"androidFaqAnswer2": "wiki有上四个任务范例,或许能给你带来启发:\n<br><br>\n* [习惯](http://habitica.fandom.com/zh/wiki/习惯范例)\n* [每日任务](http://habitica.fandom.com/zh/wiki/每日任务范例)\n* [待办事项](http://habitica.fandom.com/zh/wiki/待办事项范例)\n* [自定义奖励](http://habitica.fandom.com/zh/wiki/自定义奖励范例)",
|
||||
"webFaqAnswer2": "wiki有四个范例:\n* [习惯](http://habitica.fandom.com/zh/wiki/习惯范例)\n* [每日任务](http://habitica.fandom.com/zh/wiki/每日任务范例)\n* [待办事项](http://habitica.fandom.com/zh/wiki/待办事项范例)\n* [自定义奖励](http://habitica.fandom.com/zh/wiki/自定义奖励范例)",
|
||||
"faqQuestion3": "为什么我的待办任务会变颜色?",
|
||||
"iosFaqAnswer3": "你的任务会根据你完成的情况改变颜色!每一个新任务都用中立的黄色表示,越频繁地完成每日任务或好习惯养成,这些任务项就变得越蓝。错过一个每日任务,或是做了一个坏习惯,这些任务就向红色变化,完成一个颜色越红的任务项,你获得的奖励越多,但如果那是一个每日任务,或是一个坏习惯,那它就会扣除更多的生命值!这样就能激励你去完成那些特别难以完成的任务。",
|
||||
"androidFaqAnswer3": "你的任务会根据你完成的情况改变颜色!每一个新任务都用中立的黄色表示,越频繁地完成每日任务或好习惯养成,这些任务项就变得越蓝。错过一个每日任务,或是做了一个坏习惯,这些任务就向红色变化,完成一个颜色越红的任务项,你获得的奖励越多,但如果那是一个每日任务,或是一个坏习惯,那它就会扣除更多的生命值!这样就能激励你去完成那些特别难以完成的任务。",
|
||||
@@ -22,12 +22,12 @@
|
||||
"webFaqAnswer4": "有这样一些东西会减少你的生命值,第一,如果你有每日任务没完成,它会减少你的生命值,第二,如果你“点击”了一个坏习惯,它也会减少你的生命值,最后,如果你在和你的队员一起进行boss战时,一旦队伍中有一个成员没能完成每日任务,boss就会攻击你。\n\n回复生命值最主要的办法是升级,每一次升级时,所有的生命值都会回复。你也可以用金币从奖励栏里可以购买生命药剂。另外,在达到10级以上的级数时,你可以选择成为一个医师,然后学习治疗技能。如果你的队伍(可在社交>队伍里查看)里有一个医师,他也能治疗你。",
|
||||
"faqQuestion5": "我怎么和朋友们一起玩Habitica?",
|
||||
"iosFaqAnswer5": "最好的办法是邀请他们加入你的战队!战队可以接受副本,和怪物作战,使用技能互相支持。如果你还没有自己的队伍,进入目录 > 队伍点击“建立新的队伍”。然后点击成员列表,在右上角选择邀请,输入朋友们的用户ID(一串由数字和字母组成的列表,可以在手机应用程序的设置 > 账户明细或者网页版的设置 > API下查看)。在网页版中,你还可以使用email地址邀请朋友,手机应用程序会在未来增加这个功能。\n\n在网页版中你和朋友们还能加入公会,即公共聊天室,应用程序也会跟进公会功能!",
|
||||
"androidFaqAnswer5": "最好的办法是邀请他们加入你的队伍!队伍可以接受副本,和怪物作战,通过使用技能来互相帮助。如果你还没有自己的队伍,前往 [网页](https://habitica.com/) 来创建一个队伍。你们也可以一起加入一个公会(社交 > 公会)。公会是一个基于共同兴趣或者共同目标的聊天室,可以是公开聊天室也可以是私密聊天室。你可以加入很多个公会,但是你只能加入一个队伍。\n\n若想获取更多详细信息,请查看wiki关于[队伍](https://habitica.fandom.com/zh/wiki/队伍) 与关于 [公会](http://habitica.fandom.com/wiki/Guilds)的页面。",
|
||||
"webFaqAnswer5": "邀请他们加入你队伍最好的方法是点击导航栏中的“队伍”。队伍可以接受副本卷轴,打怪兽,使用技能帮助彼此。你们也可以一起加入公会(点击导航栏中的“公会”)。公会是基于共同兴趣或者共同目标的聊天室,可以是公开或者私密性质。你可以加任意多的公会,但只能加入一个队伍。欲知更多信息,查看wiki页面的 [队伍](https://habitica.fandom.com/zh/队伍)与 [公会](http://habitica.fandom.com/wiki/Guilds)。",
|
||||
"androidFaqAnswer5": "最好的办法是邀请他们加入你的队伍!队伍可以接受副本,和怪物作战,通过使用技能来互相帮助。如果你还没有自己的队伍,前往 [网页](https://habitica.com/) 来创建一个队伍。你们也可以一起加入一个公会(社交 > 公会)。公会是一个基于共同兴趣或者共同目标的聊天室,可以是公开聊天室也可以是私密聊天室。你可以加入很多个公会,但是你只能加入一个队伍。\n\n若想获取更多详细信息,请查看wiki关于[队伍](https://habitica.fandom.com/zh/wiki/队伍) 与关于 [公会](http://habitica.fandom.com/zh/wiki/公会)的页面。",
|
||||
"webFaqAnswer5": "邀请他们加入你队伍最好的方法是点击导航栏中的“队伍”。队伍可以接受副本卷轴,打怪兽,使用技能帮助彼此。你们也可以一起加入公会(点击导航栏中的“公会”)。公会是基于共同兴趣或者共同目标的聊天室,可以是公开或者私密性质。你可以加任意多的公会,但只能加入一个队伍。欲知更多信息,查看wiki页面的 [队伍](https://habitica.fandom.com/zh/队伍)与 [公会](http://habitica.fandom.com/zh/wiki/公会)。",
|
||||
"faqQuestion6": "我要怎样才能得到宠物或是坐骑呢?",
|
||||
"iosFaqAnswer6": "每当你完成任务时,你就会有一定的机率收到宠物蛋、孵化药水,或是喂养宠物的食物。当你收到时系统就会自动存入「选单」>「物品」。\n \n 想要孵化宠物,你需要同时拥有宠物蛋和孵化药水各一。点选宠物蛋确认你要孵化的种类,接着点击「孵化」,然后选择孵化药水就能够确认宠物的颜色啰!孵化完成后你可以到「选单」>「宠物」,然后点击你的新宠物,将其装备到头像上。\n \n 你也可以用喂食的方式让宠物进化成坐骑。点选宠物选择「喂食」,你会看到一条绿色的状态列随着你喂食次数而增长,当状态列额满后就会进化成坐骑。这需要花点时间,不过如果你能找到宠物最喜欢的食物,就可以加速宠物进化的速度啰!请多多尝试食物种类或者看这个[剧透](http://habitica.fandom.com/wiki/Food#Food_Preferences)\n当你拥有了一只座骑,你可以到「选单」>「坐骑」将它装备到角色上。\n \n 当你完成某些副本卷轴时,你也可能收到副本宠物蛋。(你可以看看下面有一些关于副本卷轴的介绍。)",
|
||||
"androidFaqAnswer6": "每当你完成任务时,你就会有一定的机率收到宠物蛋、孵化药水,或是喂养宠物的食物。当你收到时系统就会自动存入「选单」>「物品」。\n\n想要孵化宠物,你需要同时拥有一个宠物蛋和一瓶孵化药水。点选宠物蛋确认你要孵化的宠物,接着点击「孵化」,然后选择孵化药水就能够确认宠物的颜色!孵化完成后你可以到「选单」>[宠物],然后选择“使用”(你的角色形象不会显示变动),将你的宠物装备到角色上。\n\n你也可以用喂食的方式让宠物进化成坐骑。点选宠物选择「喂食」,你会看到一条绿色的状态列随着你喂食次数而增长,当状态列额满后就会进化成坐骑。这需要花点时间,不过如果你能找到宠物最喜欢的食物,就可以加速宠物进化的速度啰!请多多尝试食物种类或者看这个[揭露] (http://habitica.fandom.com/wiki/Food#Food_Preferences).\n\n当你拥有了一只座骑,你可以到「选单」>「坐骑」选项,选择你需要的坐骑,然后选择“使用”(你的角色形象不会显示变动)将它装备到角色上。)\n\n当你完成某些副本卷轴时,你也可能收到副本宠物蛋。(你可以看看下面有一些关于副本卷轴的介绍。)",
|
||||
"webFaqAnswer6": "每当你完成任务时,你就会有一定的机率收到宠物蛋、孵化药水,或是喂养宠物的食物。当你收到物品时,会自动存入「背包」>「市场」。\n\n如果你想要孵化宠物,你需要同时拥有宠物蛋和孵化药水各一个。点击宠物蛋确认你要孵化的种类,然后选择孵化药水就能够确认宠物的颜色喽!孵化完成后你可以到「背包」>「宠物」将你的宠物显示到角色形象上。\n\n你也可以用喂食的方式让宠物进化成坐骑。点击「背包」>「宠物」后选择宠物,这时画面右方会出现选单,点选食物然后「喂食」就可以了!你会看到一条绿色的状态列随着你喂食次数而增长,当状态列额满后就会进化成坐骑。这需要花点时间,不过如果你能找到宠物最喜欢的食物,就可以加速宠物进化的速度喽!请多多尝试食物种类或者看这个[查看食物种类](http://habitica.fandom.com/wiki/Food#Food_Preferences)。当你拥有了一只座骑,你可以到「背包」>「坐骑」将它显示到角色形象上。\n\n当你完成某些副本卷轴时,你也可能收到副本宠物蛋。(你可以看看下面有一些关于副本卷轴的介绍。)",
|
||||
"iosFaqAnswer6": "每当你完成任务时,你就会有一定的机率收到宠物蛋、孵化药水,或是喂养宠物的食物。当你收到时系统就会自动存入「选单」>「物品」。\n \n 想要孵化宠物,你需要同时拥有宠物蛋和孵化药水各一。点选宠物蛋确认你要孵化的种类,接着点击「孵化」,然后选择孵化药水就能够确认宠物的颜色啰!孵化完成后你可以到「选单」>「宠物」,然后点击你的新宠物,将其装备到头像上。\n \n 你也可以用喂食的方式让宠物进化成坐骑。点选宠物选择「喂食」,你会看到一条绿色的状态列随着你喂食次数而增长,当状态列额满后就会进化成坐骑。这需要花点时间,不过如果你能找到宠物最喜欢的食物,就可以加速宠物进化的速度啰!请多多尝试食物种类或者看这个[剧透](http://habitica.fandom.com/zh/wiki/食物偏好)。当你拥有了一只坐骑,你可以到「选单」>「坐骑」将它装备到角色上。\n \n 当你完成某些副本卷轴时,你也可能收到副本宠物蛋。(你可以看看下面有一些关于副本卷轴的介绍。)",
|
||||
"androidFaqAnswer6": "每当你完成任务时,你就会有一定的机率收到宠物蛋、孵化药水,或是喂养宠物的食物。当你收到时系统就会自动存入「选单」>「物品」。\n\n想要孵化宠物,你需要同时拥有一个宠物蛋和一瓶孵化药水。点选宠物蛋确认你要孵化的宠物,接着点击「孵化」,然后选择孵化药水就能够确认宠物的颜色!孵化完成后你可以到「选单」>[宠物],然后选择“使用”(你的角色形象不会显示变动),将你的宠物装备到角色上。\n\n你也可以用喂食的方式让宠物进化成坐骑。点选宠物选择「喂食」,你会看到一条绿色的状态列随着你喂食次数而增长,当状态列额满后就会进化成坐骑。这需要花点时间,不过如果你能找到宠物最喜欢的食物,就可以加速宠物进化的速度啰!请多多尝试食物种类或者看这个[揭露] (http://habitica.fandom.com/zh/wiki/食物偏好)。当你拥有了一只坐骑,你可以到「选单」>「坐骑」选项,选择你需要的坐骑,然后选择“使用”(你的角色形象不会显示变动)将它装备到角色上。)\n\n当你完成某些副本卷轴时,你也可能收到副本宠物蛋。(你可以看看下面有一些关于副本卷轴的介绍。)",
|
||||
"webFaqAnswer6": "每当你完成任务时,你就会有一定的机率收到宠物蛋、孵化药水,或是喂养宠物的食物。当你收到物品时,会自动存入「背包」>「市场」。如果你想要孵化宠物,你需要同时拥有宠物蛋和孵化药水各一个。点击宠物蛋确认你要孵化的种类,然后选择孵化药水就能够确认宠物的颜色喽!孵化完成后你可以到「背包」>「宠物」将你的宠物显示到角色形象上。你也可以用喂食的方式让宠物进化成坐骑。点击「背包」>「宠物」后选择宠物,这时画面右方会出现选单,点选食物然后「喂食」就可以了!你会看到一条绿色的状态列随着你喂食次数而增长,当状态列额满后就会进化成坐骑。这需要花点时间,不过如果你能找到宠物最喜欢的食物,就可以加速宠物进化的速度喽!请多多尝试食物种类或者看这个[查看食物种类](http://habitica.fandom.com/zh/wiki/食物偏好)。当你拥有了一只坐骑,你可以到「背包」>「坐骑」将它显示到角色形象上。当你完成某些副本卷轴时,你也可能收到副本宠物蛋。(你可以看看下面有一些关于副本卷轴的介绍。)",
|
||||
"faqQuestion7": "我怎样才能够成为战士、法师、盗贼或是医师?",
|
||||
"iosFaqAnswer7": "在10级的时候,你可以选择成为战士、法师、盗贼或是医者。(所有玩家在一开始都会被系统默认为是战士直到你的升到10级)每种职业都有各自的优点以及不同的装备选择,当你11级时还能够施放职业技能。战士可以很轻松地击退魔王,还能够抵挡来自任务的伤害,同时也是队伍攻击主力。法师也能够给予魔王有效的攻击,等级提升快速且能够帮助队伍的成员补充魔力。盗贼能获得最多金币,也是能捡到最多掉落物品的职业,而这些优点也能回馈给队伍。最后是医师,医师拥有特殊技能可以治愈他们自身以及队伍成员的生命值。\n\n如果你还没能够决定该选择哪种作为职业的话--举例,如果你觉得与其马上选择职业,不如先补足目前所需的装备的话--你可以点选「之后再决定」,等你觉得时机到了就可以到「选单」>「选择职业」。",
|
||||
"androidFaqAnswer7": "在10级的时候,你可以选择成为战士、法师、盗贼或是医者。(所有玩家在一开始都会被系统默认为是战士直到你的升到10级)每种职业都有各自的优点以及不同的装备选择,当你11级时还能够施放职业技能。战士可以很轻松地击退魔王,还能够抵挡来自任务的伤害,同时也是队伍攻击主力。法师也能够给予魔王有效的攻击,等级提升快速且能够帮助队伍的成员补充魔力。盗贼能获得最多金币,也是能捡到最多掉落物品的职业,而这些优点也能回馈给队伍。最后是医师,医师拥有特殊技能可以治愈他们自身以及队伍成员的生命值。\n\n如果你还没能够决定该选择哪种作为职业的话--举例,如果你觉得与其马上选择职业,不如先补足目前所需的装备的话--你可以点选「之后再决定」,等你觉得时机到了就可以到「选单」>「选择职业」。",
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"questEvilSantaText": "圣诞陷阱猎手",
|
||||
"questEvilSantaNotes": "冰原深处传来声声痛苦的嘶吼,其中夹杂着刺耳的咯咯笑声。你循声来到了一片林中空地,发现了一头成年北极熊。它被镣铐锁在笼子里,挣扎着想要逃出生天。一个妖精身穿破烂的圣诞装,正踩在笼子顶上开心地手舞足蹈。你决定战胜圣诞陷阱猎手,救出这头北极熊!<br><br><strong>注意</strong>:“圣诞陷阱猎手”奖励可堆叠的副本成就,但会奖励的稀有坐骑只能添加到你的马厩一次。",
|
||||
"questEvilSantaCompletion": "圣诞陷阱猎手气得尖叫起来,纵身跃入夜幕之中。母熊低沉的吼声中充满了感激,似乎在诉说着什么。你把她带回马厩,驯兽师Matt Boch聆听着她带着恐惧的喘息讲述的故事。她还有个熊宝宝!小熊在母熊被陷阱抓住的时候跑入了冰原。",
|
||||
"questEvilSantaBoss": "圣诞陷阱猎手",
|
||||
"questEvilSantaText": "圣诞偷猎者",
|
||||
"questEvilSantaNotes": "冰原深处传来声声痛苦的嘶吼,其中夹杂着刺耳的咯咯笑声。你循声来到了一片林中空地,发现了一头成年北极熊。它被镣铐锁在笼子里,挣扎着想要逃出生天。一个妖精身穿破烂的圣诞装,正踩在笼子顶上开心地手舞足蹈。你决定战胜圣诞偷猎者,救出这头北极熊!<br><br><strong>注意</strong>:“圣诞偷猎者”奖励可堆叠的副本成就,但会奖励的稀有坐骑只能添加到你的马厩一次。",
|
||||
"questEvilSantaCompletion": "圣诞偷猎者气得尖叫起来,纵身跃入夜幕之中。母熊低沉的吼声中充满了感激,似乎在诉说着什么。你把她带回马厩,驯兽师Matt Boch聆听着她带着恐惧的喘息讲述的故事。她还有个熊宝宝!小熊在母熊被陷阱抓住的时候跑入了冰原。",
|
||||
"questEvilSantaBoss": "圣诞偷猎者",
|
||||
"questEvilSantaDropBearCubPolarMount": "北极熊(坐骑)",
|
||||
"questEvilSanta2Text": "找熊崽",
|
||||
"questEvilSanta2Notes": "在北极熊坐骑被圣诞陷阱猎手抓住的时候,她的宝宝跑进了冰原。树枝咔嚓折断,踏雪嘎吱作响,清脆的声音回荡在森林中。这儿有爪印!你们开始追踪着这些足迹前进。只要不漏掉这些爪印和踩断的树枝,应该能找回北极熊的崽!<br><br><strong>注意</strong>:“找熊崽”奖励可堆叠的副本成就,但会奖励的稀有宠物只能添加到你的马厩一次。",
|
||||
"questEvilSanta2Notes": "在北极熊坐骑被圣诞偷猎者抓住的时候,她的宝宝跑进了冰原。树枝咔嚓折断,踏雪嘎吱作响,清脆的声音回荡在森林中。这儿有爪印!你们开始追踪着这些足迹前进。只要不漏掉这些爪印和踩断的树枝,应该能找回北极熊的崽!<br><br><strong>注意</strong>:“找熊崽”奖励可堆叠的副本成就,但会奖励的稀有宠物只能添加到你的马厩一次。",
|
||||
"questEvilSanta2Completion": "恭喜你找到了熊崽!它将永远陪着你。",
|
||||
"questEvilSanta2CollectTracks": "爪印",
|
||||
"questEvilSanta2CollectBranches": "踩断的树枝",
|
||||
@@ -559,7 +559,7 @@
|
||||
"questYarnDropYarnEgg": "毛线(宠物蛋)",
|
||||
"questYarnUnlockText": "在市场中解锁毛线蛋以购买",
|
||||
"winterQuestsText": "“冬天”副本集",
|
||||
"winterQuestsNotes": "包括“圣诞陷阱猎手”、“找熊仔”和“冰霜禽类”。1月31日前可购买。注意,圣诞陷阱猎手和找熊崽奖励可堆叠的副本成就,但会奖励的稀有宠物和坐骑只能添加到你的马厩一次。",
|
||||
"winterQuestsNotes": "包括“圣诞偷猎者”、“找熊仔”和“冰霜禽类”。1月31日前可购买。注意,圣诞偷猎者和找熊崽奖励可堆叠的副本成就,但会奖励的稀有宠物和坐骑只能添加到你的马厩一次。",
|
||||
"questPterodactylText": "翼龙",
|
||||
"questPterodactylNotes": "你在Stoïkalm悬崖边散步时,一声邪恶的尖啸划破长空。你转过头来,看到一只丑陋的生物向着你从天而降,你立刻为巨大的恐惧所支配。当你扭头想逃跑时,@Lilith of Alfheim 一把抓住了你,说道:“别害怕!那只是一只翼龙。”<br><br>@Procyon P 点头赞同道:“它们的巢在附近,翼龙会被坏习惯和完不成的每日任务的气味吸引过来。”<br><br>“不用担心,”@Katy133 说,“我们只要提高效率多干活,就能战胜它!”你重新充满了决心,摆出了接敌的架势。",
|
||||
"questPterodactylCompletion": "伴随着翼龙的最后一声惨叫,它从悬崖边上跌了下去。你跑到悬崖边向下看去,看见翼龙展翅重新飞上天空,掠过广袤的大草原。你松了口气:“嚯,可算是完事了。”@GeraldThePixel 回了句话:“我也这么觉得。”@Edge 递给你3个蛋:“看!它给咱们留下了几个蛋。”在好习惯和蓝色的每日任务的围绕下,你发誓要把它们平安养大。",
|
||||
@@ -675,7 +675,7 @@
|
||||
"questBronzeDropBronzePotion": "青铜孵化药水",
|
||||
"questBronzeBoss": "青铜甲虫",
|
||||
"questBronzeText": "青铜甲虫战斗",
|
||||
"evilSantaAddlNotes": "注意,圣诞陷阱猎手和找熊崽奖励可堆叠的副本成就,但会奖励的稀有宠物和坐骑只能添加到你的马厩一次。",
|
||||
"evilSantaAddlNotes": "注意,圣诞偷猎者和找熊崽奖励可堆叠的副本成就,但会奖励的稀有宠物和坐骑只能添加到你的马厩一次。",
|
||||
"questRubyCompletion": "安全地包装必要的物品后,你们三个人赶回Habit城市,在@beffymaroo 的实验室见面。“做工出色!”@beffymaroo 说。 “你已经收集了药水的成分!”<br><br>@beffymaroo 仔细组合了卢恩和红宝石,制成了亮丽的红药水,并把一些药水倒在两个宠物蛋上。当你观察结果时,你会发现这两只宠物似乎对彼此完全不感兴趣!<br><br>“它失败了吗?”@gully 问。但在任何人能回答之前,你突然意识到-不是药水,而是实现共同目标的共同经验,才会创造友谊和爱情。 从这次的副本中,你获得了一些新朋友...和一些闪亮的新宠物!",
|
||||
"questRubyNotes": "在通常熙熙攘攘的Stoïkalm火山,峰趴雪地里沉默。“我想远足者和观光客正在冬眠?”@gully 对你和@Aspiring_Advocate 说。 “这让我们的搜索更加容易。”<br><br>当你到达山顶时,寒风与火山口滚滚的蒸汽融为一体。 “在那里!” @Aspiring_Advocate惊呼,指向温泉。“冰和火在那里相遇,有什么更好的地方找冰冷的水瓶座卢恩和激情的金星卢恩呢?”<br><br>你们三人朝温泉赶路。 @Aspiring_Advocate 说:“ 根据我的研究,将卢恩与心形的红宝石结合在一起将产生一种可以促进友谊和爱情的孵化药水!”<br><br>对新发现的前景感到兴奋,大家都微笑。 @gully 说:“好吧,让我们开始搜索!”",
|
||||
"questRubyCollectRubyGems": "红宝石",
|
||||
|
||||
@@ -5,7 +5,6 @@ import reduce from 'lodash/reduce';
|
||||
import filter from 'lodash/filter';
|
||||
import pickBy from 'lodash/pickBy';
|
||||
import size from 'lodash/size';
|
||||
import moment from 'moment';
|
||||
import content from '../content/index';
|
||||
import i18n from '../i18n';
|
||||
import { daysSince } from '../cron';
|
||||
@@ -146,7 +145,11 @@ export default function randomDrop (user, options, req = {}, analytics) {
|
||||
}, req.language);
|
||||
}
|
||||
|
||||
if (analytics && moment().diff(user.auth.timestamps.created, 'days') < 7) {
|
||||
user._tmp.drop = drop;
|
||||
user.items.lastDrop.date = Number(new Date());
|
||||
user.items.lastDrop.count += 1;
|
||||
|
||||
if (analytics) {
|
||||
analytics.track('dropped item', {
|
||||
uuid: user._id,
|
||||
itemKey: drop.key,
|
||||
@@ -154,10 +157,15 @@ export default function randomDrop (user, options, req = {}, analytics) {
|
||||
category: 'behavior',
|
||||
headers: req.headers,
|
||||
});
|
||||
}
|
||||
|
||||
user._tmp.drop = drop;
|
||||
user.items.lastDrop.date = Number(new Date());
|
||||
user.items.lastDrop.count += 1;
|
||||
if (user.items.lastDrop.count === maxDropCount) {
|
||||
analytics.track('drop cap reached', {
|
||||
uuid: user._id,
|
||||
dropCap: maxDropCount,
|
||||
category: 'behavior',
|
||||
headers: req.headers,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ export default function feed (user, req = {}, analytics) {
|
||||
throw new NotFound(i18n.t('messageFoodNotFound', req.language));
|
||||
}
|
||||
|
||||
if (pet.type === 'special') {
|
||||
if (pet.type === 'special' || pet.type === 'wacky') {
|
||||
throw new NotAuthorized(i18n.t('messageCannotFeedPet', req.language));
|
||||
}
|
||||
|
||||
|
||||