Compare commits

...

22 Commits

Author SHA1 Message Date
Mandar
a474c6caac System.json update before 1.1.0 2021-01-20 21:16:08 +01:00
Mandar
bc7c80f428 Update style button on dice + equipped + attributes 2021-01-20 21:04:11 +01:00
Vlyan
a5dd8e3eda Spanish specific: Added a disclaimer popup "not translated by Edge" 2021-01-20 17:19:42 +01:00
Vlyan
72e0d22a80 DP diff hidden lock by gm choice 2021-01-20 14:07:49 +01:00
Mandar
3fcfa8689d Fix 20Q line-height 2021-01-20 13:31:51 +01:00
Vlyan
acbb12333e Added System migration stuff
Some reorganisation
2021-01-20 12:38:50 +01:00
Mandar
289ec720de Add css trick border + Style for equiped and review for npc input. 2021-01-20 04:33:07 +01:00
Vlyan
8fbf7f9005 Use of toggleClass 2021-01-19 20:18:15 +01:00
Vlyan
71a3af85dd Xp not in curriculum are now rounded up (down before)
No more automation in stats for Npc (these cheaters !)
20Q Pushed the step3 item's limit to 20 (10 previous)
Gm Tool no longer stuck the escape key process
2021-01-19 12:10:04 +01:00
Vlyan
23db7ed2c2 Xp not in curriculum are now rounded up (down before) 2021-01-19 10:11:04 +01:00
Vlyan
cbd5af8d02 Added a visual indicator for equipped / readied
Now only equipped armor / weapon will show in conflict tab, and all armors/weapons now show in inventory tab
2021-01-17 17:47:42 +01:00
Vlyan
f6a91ab564 Initiative : Ring now limit the success 2021-01-17 16:29:26 +01:00
Vlyan
c8a37ab06f Gm dialog : not closable anymore (esc key) 2021-01-17 13:38:18 +01:00
Vlyan
78423770b1 Compendium : Added some referenced but missing item in core book, and weight 2021-01-17 13:26:07 +01:00
Vlyan
5444671bee Fix code and deleted margin for rank/ring in compendium 2021-01-17 11:38:43 +01:00
Mandar
d5b3a309b1 Style for Stance, dice difficulty, initiative 2021-01-17 01:07:00 +01:00
Vlyan
7fbce1500c Added : Change stance on DicePicker on initiative roll.
Some minors fixes
2021-01-16 13:26:43 +01:00
Vlyan
27e88be49d Initiative rework, with some broken css 2021-01-15 20:14:50 +01:00
Vlyan
58a4e71b32 Working on initiative, and now TN is global with GM tool 2021-01-14 21:55:42 +01:00
Vlyan
30950a0d63 Merge Update ES by Alejabar
Update es-es.json

See merge request teaml5r/l5r5e!2
2021-01-14 21:48:56 +01:00
Alejandro Barranquero
7411120841 Update es-es.json 2021-01-14 11:42:16 +00:00
Mandar
6a3431e6a0 Update Readme with screens 2021-01-13 01:31:07 +01:00
62 changed files with 1970 additions and 948 deletions

View File

@@ -1,15 +1,37 @@
# Changelog
## 1.1.0 - Initiative first !
- Added initiative system :
- Now use the score rule (the real one if you prefer)
- Added global modifiers for Characters, Adversary and Minons in the combat tracker : Confrontation types, Prepared
- Added sheet modifiers for Characters and Adversary: Prepared
- Initiative buttons in character sheet now display the DicePicker and do the initiative roll
- Change the actor stance on initiative roll in DicePicker
- Note : Due to the lack of the Roll & Keep system, the score is computed with the full success score.
- Spanish real translation by Alejabar (thanks !)
- Added a GM Dialog Tool for setting global difficulty (TN) value / hidden (with DicePicker live refresh)
- Compendium now display Ring and Rank if any in list view
- DicePicker :
- Fixed the initial display of "use a void point"
- No free void point anymore
- PC/NPC Sheet :
- Added a visual indicator for equipped / readied
- Now only equipped armor / weapon will show in conflict tab, and all armors/weapons now show in inventory tab
- Xp not in curriculum are now rounded up (down before)
- No more automation in stats for Npc (these cheaters !)
- 20Q Pushed the step3 item's limit to 20 (10 previous)
- Added System migration stuff
## 1.0.0 - First public release
- Removed the 0ds if no skill point
- Added initiative roll (only tactics for the moment)
- Change color of keikogi and add on compendium
- Machine translation for ES
- Update Translation for 1.0.0 Release
- 20Q added step 7 and 17 no point rule
- 20Q added step 7 and 17 no point rule
- Add price icon
- Set vigilance to 1 if compromised
- Seamless update for 20Q (deleted refresh button)
- Seamless update for 20Q (deleted refresh button)
- Update translation for npc + fix h1
- Update compendium : Remove accent on uppercase 1st letter
@@ -26,7 +48,7 @@
- Pass for number and focus on click
- Xp, added some parseInt
- Fix for babele and properties
- Add type percularity in item entry
- Add type peculiarity in item entry
- Fix for cross-loaded French compendium
- 20Q : Scroll on top on next button
- V-Align for Vlyan pleasure !
@@ -43,7 +65,7 @@
- Added babele french translation into system
- Removed DicePiker bulk macro as it was unnecessary now
- Fix for Q13: "skill and disadv" OR "adv"
- Added some text for 20Q 2dn dice
- Added some text for 20Q 2dn dice
- Stop some missing propagation
- Fix adv tooltip
- Fix 20Q wrong var for summary

View File

@@ -76,3 +76,10 @@ Vous êtes libre de contribuer et proposer après fork des corrections, modifica
1. Assurez-vous de bien être à jour par rapport à la branche référente.
2. Des messages de commit clair et précis permettent une relecture rapide du code.
3. Limitez-vous si possible à une Feature par demande de Merge pour ne pas bloquer le processus.
Screens
![FoundryVTT Connection](https://cdn.discordapp.com/attachments/659430710146498583/798684216551407666/unknown.png)
![FoundryVTT L5r5e Character and Roll](https://cdn.discordapp.com/attachments/659430710146498583/798686668361039882/unknown.png)
![FoundryVTT L5r5e Sheets](https://cdn.discordapp.com/attachments/659430710146498583/798686880974503946/unknown.png)
![FoundryVTT L5r5e Itemss](https://cdn.discordapp.com/attachments/659430710146498583/798687268528848987/unknown.png)

486
package-lock.json generated
View File

@@ -732,43 +732,14 @@
"dev": true
},
"node_modules/axios": {
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
"integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
"deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410",
"version": "0.21.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
"dev": true,
"dependencies": {
"follow-redirects": "1.5.10",
"is-buffer": "^2.0.2"
"follow-redirects": "^1.10.0"
}
},
"node_modules/axios/node_modules/debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/axios/node_modules/follow-redirects": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
"dev": true,
"dependencies": {
"debug": "=3.1.0"
},
"engines": {
"node": ">=4.0"
}
},
"node_modules/axios/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
"node_modules/babel-eslint": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
@@ -4681,29 +4652,6 @@
"node": ">=8"
}
},
"node_modules/is-buffer": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"engines": {
"node": ">=4"
}
},
"node_modules/is-core-module": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
@@ -5410,15 +5358,15 @@
}
},
"node_modules/localtunnel": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.0.tgz",
"integrity": "sha512-g6E0aLgYYDvQDxIjIXkgJo2+pHj3sGg4Wz/XP3h2KtZnRsWPbOQY+hw1H8Z91jep998fkcVE9l+kghO+97vllg==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.1.tgz",
"integrity": "sha512-LiaI5wZdz0xFkIQpXbNI62ZnNn8IMsVhwxHmhA+h4vj8R9JG/07bQHWwQlyy7b95/5fVOCHJfIHv+a5XnkvaJA==",
"dev": true,
"dependencies": {
"axios": "0.19.0",
"debug": "4.1.1",
"axios": "0.21.1",
"debug": "4.3.1",
"openurl": "1.1.1",
"yargs": "13.3.0"
"yargs": "16.2.0"
},
"bin": {
"lt": "bin/lt.js"
@@ -5427,172 +5375,101 @@
"node": ">=8.3.0"
}
},
"node_modules/localtunnel/node_modules/ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"node_modules/localtunnel/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=6"
}
},
"node_modules/localtunnel/node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true,
"engines": {
"node": ">=6"
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/localtunnel/node_modules/cliui": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
"integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"dependencies": {
"string-width": "^3.1.0",
"strip-ansi": "^5.2.0",
"wrap-ansi": "^5.1.0"
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"node_modules/localtunnel/node_modules/debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
"node_modules/localtunnel/node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
"ms": "^2.1.1"
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/localtunnel/node_modules/emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
"node_modules/localtunnel/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"node_modules/localtunnel/node_modules/find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"dependencies": {
"locate-path": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/localtunnel/node_modules/is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/localtunnel/node_modules/locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"dependencies": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/localtunnel/node_modules/p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
"dependencies": {
"p-limit": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/localtunnel/node_modules/path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/localtunnel/node_modules/string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"dependencies": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/localtunnel/node_modules/strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"dependencies": {
"ansi-regex": "^4.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/localtunnel/node_modules/wrap-ansi": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
"integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.0",
"string-width": "^3.0.0",
"strip-ansi": "^5.0.0"
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=6"
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/localtunnel/node_modules/y18n": {
"version": "5.0.5",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
"integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/localtunnel/node_modules/yargs": {
"version": "13.3.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
"integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
"dependencies": {
"cliui": "^5.0.0",
"find-up": "^3.0.0",
"get-caller-file": "^2.0.1",
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^3.0.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^13.1.1"
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/localtunnel/node_modules/yargs-parser": {
"version": "13.1.2",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
"integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
"version": "20.2.4",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
"dev": true,
"dependencies": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
"engines": {
"node": ">=10"
}
},
"node_modules/locate-path": {
@@ -10789,39 +10666,12 @@
"dev": true
},
"axios": {
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
"integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
"version": "0.21.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
"dev": true,
"requires": {
"follow-redirects": "1.5.10",
"is-buffer": "^2.0.2"
},
"dependencies": {
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"follow-redirects": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
"dev": true,
"requires": {
"debug": "=3.1.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
}
"follow-redirects": "^1.10.0"
}
},
"babel-eslint": {
@@ -13977,12 +13827,6 @@
"binary-extensions": "^2.0.0"
}
},
"is-buffer": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
"dev": true
},
"is-core-module": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
@@ -14531,153 +14375,89 @@
}
},
"localtunnel": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.0.tgz",
"integrity": "sha512-g6E0aLgYYDvQDxIjIXkgJo2+pHj3sGg4Wz/XP3h2KtZnRsWPbOQY+hw1H8Z91jep998fkcVE9l+kghO+97vllg==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.1.tgz",
"integrity": "sha512-LiaI5wZdz0xFkIQpXbNI62ZnNn8IMsVhwxHmhA+h4vj8R9JG/07bQHWwQlyy7b95/5fVOCHJfIHv+a5XnkvaJA==",
"dev": true,
"requires": {
"axios": "0.19.0",
"debug": "4.1.1",
"axios": "0.21.1",
"debug": "4.3.1",
"openurl": "1.1.1",
"yargs": "13.3.0"
"yargs": "16.2.0"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"cliui": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
"integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"requires": {
"string-width": "^3.1.0",
"strip-ansi": "^5.2.0",
"wrap-ansi": "^5.1.0"
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
"color-name": "~1.1.4"
}
},
"emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"requires": {
"locate-path": "^3.0.0"
}
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
"requires": {
"p-limit": "^2.0.0"
}
},
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"dev": true
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
},
"wrap-ansi": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
"integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.0",
"string-width": "^3.0.0",
"strip-ansi": "^5.0.0"
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
}
},
"y18n": {
"version": "5.0.5",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
"integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
"dev": true
},
"yargs": {
"version": "13.3.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
"integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
"requires": {
"cliui": "^5.0.0",
"find-up": "^3.0.0",
"get-caller-file": "^2.0.1",
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^3.0.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^13.1.1"
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
}
},
"yargs-parser": {
"version": "13.1.2",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
"integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
"version": "20.2.4",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
"dev": true
}
}
},

View File

@@ -2,19 +2,14 @@
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path d="M115.6,20c-23.7,3.2-45.2,30.9-45.2,66.8c0,19.7,6.9,37.4,17,49.4l11.9,14.4l-18.4,3.4c-13.1,2.5-22.5,9.4-30.7,20.5
c-8.2,11.3-14.4,26.9-18.8,44.9c-8.1,32.6-9.8,72.5-10.1,107.7h43.5l11.9,159.6c30.2,6.9,62.4,6.6,91.6,0l10.6-159.6H220
c0-35.7-0.5-76.1-7.7-109.1c-4-18-9.9-33.7-18.2-44.8c-8.3-11.1-18.3-17.9-33-20.1l-18.8-3l11.9-14.8c9.7-12.1,16-29.4,16-48.6
c0-38.3-24-66.7-50-66.7C120.3,20.1,115.6,20,115.6,20z"/>
<g transform="translate(0,0)">
<path d="M360.6,41.8c-14.2,0-25.8,11.6-25.8,25.8c0,8.1,3.8,15.4,9.7,20.1h-24.2l-30.2,90.6h141l-30.2-90.6h-24.2
c5.9-4.7,9.7-12,9.7-20.1C386.4,53.5,374.8,41.8,360.6,41.8z M360.6,53.2c8.1,0,14.5,6.4,14.5,14.5s-6.4,14.5-14.5,14.5
c-8.1,0-14.5-6.4-14.5-14.5S352.5,53.2,360.6,53.2z M334.7,117h7.4v10.5l10.7-10.5h8.6l-13.8,13.6l15.2,15.1h-9.3l-11.4-11.3v11.3
h-7.4V117L334.7,117z M372.5,123.7c1.5,0,2.8,0.3,4,0.9c1.1,0.6,2.2,1.5,3.1,2.8v-3.2h6.9v19.3c0,3.5-1.1,6.1-3.3,7.9
c-2.2,1.8-5.3,2.7-9.5,2.7c-1.3,0-2.6-0.1-3.9-0.3c-1.3-0.2-2.5-0.5-3.8-0.9v-5.4c1.2,0.7,2.4,1.2,3.5,1.5c1.2,0.3,2.3,0.5,3.5,0.5
c2.3,0,3.9-0.5,5-1.5c1.1-1,1.6-2.5,1.6-4.6v-1.5c-0.9,1.3-2,2.2-3.1,2.8c-1.1,0.6-2.5,0.9-4,0.9c-2.6,0-4.8-1-6.5-3.1
c-1.7-2.1-2.6-4.7-2.6-7.9c0-3.2,0.9-5.8,2.6-7.9C367.7,124.8,369.8,123.7,372.5,123.7z M375,128.7c-1.4,0-2.5,0.5-3.3,1.6
c-0.8,1.1-1.2,2.5-1.2,4.5c0,2,0.4,3.5,1.2,4.5c0.8,1,1.9,1.5,3.4,1.5c1.4,0,2.5-0.5,3.3-1.6c0.8-1.1,1.2-2.5,1.2-4.4
c0-1.9-0.4-3.4-1.2-4.5C377.6,129.2,376.5,128.7,375,128.7L375,128.7z"/>
<g>
<path d="M284.4,473.6c0-2.8,0-4.6,0-6.4c0-67.8,0.1-135.7-0.1-203.5c0-4.9,1.3-7.3,6.2-8.9c23.3-7.5,46.4-15.5,69.7-23
c4.9-1.6,6.6-3.9,6.3-8.9c-0.4-5.5-0.3-11,0-16.5c0.2-4.2-1.2-6.4-5.7-5.9c-0.7,0.1-1.3,0-2,0c-68.5,0-137,0-205.5,0
c-7.8,0-7.8,0-7.8,7.6c0,5.3,0.3,10.7-0.1,16c-0.3,4.1,1.5,5.9,5.2,7.1c23.6,7.7,47,15.7,70.6,23.3c4.7,1.5,6.4,3.6,6.4,8.7
c-0.2,68-0.1,136-0.1,204c0,1.7,0,3.5,0,6.3c-8.6-4.1-16.3-7.7-23.9-11.4C163.5,442.7,123.2,423,83,403.4
c-15.4-7.5-20.1-18-15.9-34.8c6-23.9,12.4-47.7,17.7-71.7c5.1-23.3,8-46.9,7.7-70.8c-0.5-30.2,9.3-56.8,27-80.9
c20.7-28.1,46.6-50.8,75.4-70.1c18.2-12.2,37.5-22.8,56.3-34.2c3.3-2,6.2-2,9.7-0.1c38.6,20.1,74.6,44,105.9,74.5
c20.9,20.4,39,43.1,47.6,71.7c3,10.1,5,20.9,5.1,31.4c0.2,41.3,7.2,81.4,17.8,121.1c2.9,10.9,6.1,21.8,8.6,32.8
c3,13-2,23.7-13.8,29.6c-36.6,18-73.3,35.9-110,53.8c-10.6,5.2-21.3,10.3-31.9,15.5C288.6,471.7,287.1,472.4,284.4,473.6z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -58,6 +58,12 @@
"name": "Vêtements ordinaires",
"description": "",
"book_reference": "LdR p.239"
},
{
"id": "Inconspicuous garb",
"name": "Tenue discrète",
"description": "",
"book_reference": "LdR"
}
]
}

View File

@@ -184,6 +184,24 @@
"name": "Tente (Yourte)",
"description": "",
"book_reference": "LdR p.245"
},
{
"id": "Scroll satchel",
"name": "Sacoche à rouleaux",
"description": "",
"book_reference": "LdR"
},
{
"id": "Traveling pack",
"name": "Sac de Voyage",
"description": "",
"book_reference": "LdR"
},
{
"id": "Journal of observations",
"name": "Journal d'observations",
"description": "",
"book_reference": "LdR"
}
]
}

View File

@@ -25,7 +25,8 @@
"add": "Add",
"edit": "Edit",
"delete": "Delete",
"drop_here": "Drop here"
"drop_here": "Drop here",
"edge_translation_disclaimer": ""
},
"logo": {
"title": "Need help?",
@@ -283,7 +284,11 @@
"intrigue": "Intrigue",
"duel": "Duel",
"skirmish": "Skirmish",
"mass_battle": "Mass Battle"
"mass_battle": "Mass Battle",
"prepared_true": "Prepared",
"prepared_false": "Surprised",
"prepared_null": "Defined in the character sheet (default)",
"already_set": "Your initiative has already been drawn"
}
},
"advancements": {
@@ -299,11 +304,10 @@
"curriculum": "In curriculum",
"curriculum_validate": "Complete this rank"
},
"npc": {
"types": {
"adversary": "Adversary",
"minion": "Minion"
}
"character_types": {
"character": "Player Character",
"adversary": "Adversary",
"minion": "Minion"
},
"twenty_questions": {
"title": "Twenty questions",

View File

@@ -7,17 +7,17 @@
"None": "Sin opción"
},
"ACTOR": {
"TypeCharacter": "Carácter de Jugador",
"TypeCharacter": "Personaje jugador",
"TypeNpc": "Personaje no jugador"
},
"ITEM": {
"TypeItem": "Artículo",
"TypeItem": "Objeto",
"TypeArmor": "Armadura",
"TypeWeapon": "Arma",
"TypeTechnique": "Técnica",
"TypeProperty": "Propiedad",
"TypePeculiarity": "Peculiaridad",
"TypeAdvancement": "Avance"
"TypeAdvancement": "Mejora"
},
"l5r5e": {
"global": {
@@ -25,21 +25,22 @@
"add": "Añadir",
"edit": "Editar",
"delete": "Borrar",
"drop_here": "Caída aquí"
"drop_here": "Dejar caer aquí",
"edge_translation_disclaimer": "Edge Studio nos da su permiso para ofrecer este módulo a la comunidad, pero tanto los textos así como los códigos que lo constituyen no tienen su aprobación explícita."
},
"logo": {
"títle": "¿Necesitas ayuda?",
"content": "Sigue la guía :",
"edge": "Ir a la página web de Edge-Studio",
"drivethrurpg": "¿Comprar un PDF del juego?",
"discord": "Discordia oficial de FoundryVTT",
"discord": "Discord oficial de FoundryVTT",
"src": "systems/l5r5e/assets/l5r-logo.webp",
"alt": "Ayuda en línea",
"edge-info": "Tu navegador abrirá la página web de EDGE STUDIO",
"edge-link": "https://edge-studio.net/",
"drivethrurpg-info": "tu navegador abrirá el sitio DriveThruRpg de Edge Studio",
"drivethrurpg-link": "https://www.drivethrurpg.com/browse/pub/17946/EDGE-Studio",
"discord-info": "Su navegador se abrirá a la discordia oficial de la Fundición",
"discord-info": "Su navegador se abrirá el discord oficial de Foundry",
"discord-link": "https://discordapp.com/invite/DDBZUDf"
},
"rings": {
@@ -67,75 +68,75 @@
"passionstip": "Después de efectuar una tirada relacionada con tu pasión, descarta tres puntos de Conflicto.",
"personality": "Personalidad",
"description": "Descripción",
"bought_at_rank": "Comprado en rango",
"bought_at_rank": "Adquirido en rango",
"effects": "Efectos",
"types": "Tipos",
"book_reference": "Referencia",
"value": "Valor",
"rarity": "Rareza",
"chatdices": {
"successes": "Sucesos",
"explosives": "Explosivos",
"successes": "Éxitos",
"explosives": "Relanzables",
"opportunities": "Oportunidades",
"strives": "Esfuerzos",
"difficulty": "TN",
"difficulty_hidden": "TN ???",
"dicepicker": "Recogedor de dados",
"strives": "Conflictos",
"difficulty": "NO",
"difficulty_hidden": "NO ???",
"dicepicker": "Dice Picker",
"void_point_used": "Punto de vacío utilizado",
"roll_n_keep": "Roll & Keep",
"initiative_roll": "Iniciativa rollo"
"roll_n_keep": "Tirar y guardar",
"initiative_roll": "Tirada de Iniciativa"
},
"dicepicker": {
"difficulty_title": "Dificultad",
"difficulty_hidden_label": "Ocultar TN",
"difficulty_hidden_label": "Ocultar NO",
"use_void_point_label": "Gasta un",
"void_point_tooltip": "Punto vacío",
"roll_label": "Roll",
"bt_add_macro": "Añadir un macro"
"void_point_tooltip": "Punto de vacío",
"roll_label": "Tirar",
"bt_add_macro": "Añadir una macro"
},
"roll_n_keep": {
"title": "L5R Roll & Keep",
"discard_drop_here": "Descarte",
"reroll_drop_here": "Re-roll",
"reroll_chat": "Dados relaminados",
"keep_drop_here": "Mantener",
"keep_chat": "Nueva tirada de un dado explosivo",
"discard_drop_here": "Descartar",
"reroll_drop_here": "Relanzar",
"reroll_chat": "Dados relanzados",
"keep_drop_here": "Guardar",
"keep_chat": "Nueva tirada de un dado relanzable",
"bt_validate": "Finalizar"
},
"max": "Max",
"max": "Máx",
"current": "Actuales",
"quantity": "Cantidad",
"weight": "Peso",
"properties": "Propiedades",
"weapons": {
"title": "Armas",
"title_new": "Arma nueva",
"title_new": "Nueva arma",
"damage": "Daño",
"range": "Rango",
"range": "Alcance",
"stats": "Estadísticas",
"sheathed": "Equipado / Envainado",
"sheathed": "Equipado / Envainada",
"readied": "Preparado",
"category": "Categoría",
"deadliness": "Mortalidad",
"deadliness": "Letalidad",
"grips": "Agarres"
},
"armors": {
"title": "Armaduras",
"title_new": "Nueva Armadura",
"type": "Defensa",
"physical": "físico",
"physical": "física",
"supernatural": "sobrenatural",
"equipped": "Equipado"
},
"items": {
"title": "Artículos",
"title_new": "nuevo artículo"
"title": "Objetos",
"title_new": "Nuevo objeto"
},
"feats": "Hechos",
"feats": "Logros",
"techniques": {
"title": "Técnicas",
"type": "Tipo accesible",
"not_allowed": "Tu personaje no utiliza este tipo de técnica.",
"type": "Técnicas permitidas",
"not_allowed": "Tu personaje no puede utilizar este tipo de técnica.",
"only_one": "Tu personaje sólo puede poseer una de estas técnicas.",
"title_new": "Nueva Técnica",
"kata": "Kata",
@@ -208,7 +209,7 @@
"ranged": "A distancia",
"unarmed": "Sin armas",
"meditation": "Meditación",
"tactics": "Tácticas",
"tactics": "Estrategia",
"air": "Amagar",
"earth": "Resistir",
"fire": "Abrumar",
@@ -255,7 +256,7 @@
}
},
"attributes": {
"title": "Attributes",
"title": "Atributos",
"endurance": "Aguante",
"endurancetip": "(Tierra + Fuego) x2",
"composure": "Compostura",
@@ -283,7 +284,11 @@
"intrigue": "Intriga",
"duel": "Duelo",
"skirmish": "Escaramuza",
"mass_battle": "Batalla en masas"
"mass_battle": "Batalla a gran escala",
"prepared_true": "Prepared",
"prepared_false": "Surprised",
"prepared_null": "Defined in the character sheet (default)",
"already_set": "Your initiative has already been drawn"
}
},
"advancements": {
@@ -292,94 +297,93 @@
"school_rank": "Rango de la escuela",
"school_rank_0": "Bg",
"total": "Total",
"cost": "Costo",
"spent": "Usada",
"saved": "Salvado",
"total_xp_rank": "Xp gastado",
"curriculum": "En curriculum",
"cost": "Coste",
"spent": "Gastado",
"saved": "Guardado",
"total_xp_rank": "PE gastados",
"curriculum": "En programa de estudio",
"curriculum_validate": "Completar este rango"
},
"npc": {
"types": {
"adversary": "Adversario",
"minion": "Adlátere"
}
"character_types": {
"character": "Personaje jugador",
"adversary": "Adversario",
"minion": "Esbirro"
},
"twenty_questions": {
"title": "Veinte preguntas",
"bt_abrev": "20Q",
"bt_abrev": "20P",
"bt_next": "Siguiente",
"increase_ring1": "Aumento del anillo (1)",
"increase_ring2": "Aumento del anillo (2)",
"increase_skill1": "Aumenta la habilidad (1)",
"increase_skill2": "Aumenta la habilidad (2)",
"increase_skill3": "Aumenta la habilidad (3-5)",
"increase_ring1": "Incremento de anillo (1)",
"increase_ring2": "Incremento de anillo (2)",
"increase_skill1": "Incremento de habilidad (1)",
"increase_skill2": "Incremento de habilidad (2)",
"increase_skill3": "Incremento de habilidad (3-5)",
"choose_one_ring": "Elige uno",
"choose_one_skill": "Elige uno",
"choose_one_skill": "Elige una",
"or": "O",
"and": "Y",
"error": "Uy, parece que hay un error:",
"part0": {
"intro": "Puedes usar esta hoja para rellenar tus respuestas al Juego de las 20 Preguntas, y para tomar notas para más tarde!",
"section": "Leyenda de los Cinco Anillos, capítulo 2: Creación de un personaje, p. 41-95"
"section": "Leyenda de los Cinco Anillos, capítulo 2: Creación de personajes, p. 41-95"
},
"part1": {
"title": "Parte I: Identidad básica (Clan y Familia)",
"q1": "1. ¿A qué clan pertenece tu personaje? (p. 41)",
"status": "Estado",
"status": "Estatus",
"q2": "2. ¿A qué familia pertenece tu personaje? (p. 49)",
"money": "Iniciar la riqueza en Koku",
"money": "Riqueza inicial en Koku",
"glory": "Gloria"
},
"part2": {
"title": "Parte II: Papel y escuela",
"q3": "3. ¿Cuál es la escuela de tu personaje, y en qué roles se encuentra esa escuela? (p. 56)",
"title": "Parte II: Función y escuela",
"q3": "3. ¿Cuál es la escuela de tu personaje, y en qué funciones cumple esa escuela? (p. 56)",
"school": "Escuela",
"role": "Roles",
"role": "Funciones",
"honor": "Honor",
"access": "Tipos de técnicas disponibles",
"school_ability": "Habilidad escolar",
"starting_techniques": "Técnicas de arranque (2-5)",
"outfit": "Equipo para empezar",
"q4": "4. ¿Cómo se destaca tu personaje dentro de su escuela? (p. 88)"
"school_ability": "Capacidad de escuela",
"starting_techniques": "Técnicas iniciales (2-5)",
"outfit": "Equipo inicial",
"q4": "4. ¿De qué manera destaca tu personaje dentro de su escuela? (p. 88)"
},
"part3": {
"title": "Parte III: Honor y Gloria",
"q5": "5. ¿Quién es su señor y cuál es su deber de carácter con ellos? (p. 88)",
"choose_giri": "Elija una giri:",
"q6": "6. ¿Qué anhela su personaje y cómo podría esto impedir su deber? (p. 90)",
"choose_ninjo": "Elija una ninjō:",
"q7": "7. ¿Cuál es la relación de tu personaje con su clan? (p. 91)",
"q5": "5. ¿Quién es tu señor y cuál es el deber de tu personaje hacia él? (p. 88)",
"choose_giri": "Elige un giri:",
"q6": "6. ¿Qué es lo que anhela tu personaje, y cómo podría esto interferir con su deber? (p. 90)",
"choose_ninjo": "Elige un ninjō:",
"q7": "7. ¿Cuál es la relación de tu personaje con tu clan? (p. 91)",
"increase_glory": "Aumento de la gloria",
"q8": "8. ¿Qué piensa tu personaje de Bushidō? (p. 91)",
"q8": "8. ¿Qué piensa tu personaje acerca del Bushidō? (p. 91)",
"increase_honor": "Aumento del honor"
},
"part4": {
"title": "Parte IV: Fortalezas y Debilidades",
"q9": "9. ¿Cuál es el mayor logro de su personaje hasta ahora? (p. 92)",
"q9": "9. ¿Cuál es el mayor logro de tu personaje hasta ahora? (p. 92)",
"distinction": "Distinción (1)",
"q10": "10. ¿Qué es lo que más te frena en la vida? (p. 92)",
"q10": "10. ¿Qué es lo que más frena a tu personaje en la vida? (p. 92)",
"adversity": "Adversidad (1)",
"q11": "11. ¿Qué actividad hace que tu personaje se sienta más en paz? (p. 93)",
"passion": "Pasión (1)",
"q12": "12. ¿Qué preocupación, miedo o falta de sensibilidad le preocupa más a su carácter? (p. 93)",
"q12": "12. ¿Qué preocupación, miedo o debilidad perturba más a tu personaje? (p. 93)",
"anxiety": "Ansiedad (1)",
"q13": "13. De quién ha aprendido más tu personaje durante su vida (p. 93)",
"q13": "13. ¿Quién ha sido la persona de la que más ha aprendido tu personaje en el transcurso de su vida? (p. 93)",
"disadvantage": "Desventaja (1)",
"advantage": "Ventaja (1)"
},
"part5": {
"title": "Parte V: Personalidad y Comportamiento",
"q14": "14. ¿Qué es lo primero que la gente nota al encontrarse con su personaje? (p. 93)",
"accoutrement": "Acumulación personal",
"q15": "15. ¿Cómo reacciona tu personaje ante situaciones estresantes? (p. 94)",
"q16": "16. ¿Cuáles son las relaciones preexistentes de tu personaje con otros clanes, familias, organizaciones y tradiciones? (p. 94)",
"q14": "14. ¿Qué es lo que advierte primero la gente al encontrarse con tu personaje? (p. 93)",
"accoutrement": "Accesorio estético distintivo",
"q15": "15. ¿Cómo reacciona tu personaje ante situaciones de tensión? (p. 94)",
"q16": "16. ¿Cuáles son las relaciones previas de tu personaje con otros clanes, familias, organizaciones y tradiciones? (p. 94)",
"object": "Objeto (Rareza 7 o inferior)"
},
"part6": {
"title": "Parte VI: Ascendencia y familia",
"q17": "17. ¿Cómo los describirían los padres de tu personaje? (p. 95)",
"q18": "18. ¿A quién se le nombró para honrar a tu personaje? (p. 95)",
"title": "Parte VI: Ascestros y familia",
"q17": "17. ¿Cómo describirían sus padres a tu personaje? (p. 95)",
"q18": "18. ¿En honor de quién se eligio el nombre de tu personaje? (p. 95)",
"d10r1": "Resultado D10 (1/2)",
"d10r1_choice": "Primer efecto de D10",
"d10r2": "Resultado D10 (2/2)",
@@ -389,7 +393,7 @@
},
"part7": {
"title": "Parte VII: Muerte",
"q20": "20. ¿Cómo debe morir tu personaje? (p. 95)",
"q20": "20. ¿Cómo debería morir tu personaje? (p. 95)",
"summary": "Resumen",
"generchar": "Generar el personaje",
"generchar_disclaimer": "Advertencia, esto borrará los datos actuales del personaje!",

View File

@@ -25,7 +25,8 @@
"add": "Ajouter",
"edit": "Modifier",
"delete": "Supprimer",
"drop_here": "Déposez ici"
"drop_here": "Déposez ici",
"edge_translation_disclaimer": ""
},
"logo": {
"title": "Besoin d'aide ?",
@@ -163,7 +164,7 @@
"notes": "Notes",
"inventory": "Inventaire",
"money": {
"title": "Fortune personnelle",
"title": "Fortune",
"koku": "Koku",
"bu": "Bu",
"zeni": "Zeni"
@@ -283,7 +284,11 @@
"intrigue": "Intrigue",
"duel": "Duel",
"skirmish": "Escarmouche",
"mass_battle": "Bataille rangée"
"mass_battle": "Bataille rangée",
"prepared_true": "Prêt(e)",
"prepared_false": "Surpris(e)",
"prepared_null": "Défini par la fiche de personnage (défaut)",
"already_set": "Votre initiative a déjà été tirée"
}
},
"advancements": {
@@ -299,11 +304,10 @@
"curriculum": "Inclus dans le cursus",
"curriculum_validate": "Valider la progression"
},
"npc": {
"types": {
"adversary": "Antagoniste",
"minion": "Sous-fifre"
}
"character_types": {
"character": "Personnage Joueur",
"adversary": "Antagoniste",
"minion": "Sous-fifre"
},
"twenty_questions": {
"title": "Le jeu des Vingt questions",

View File

@@ -1,9 +1,10 @@
{"_id":"L5RCoreArm000001","name":"Ashigaru Armor","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"3","zeni":"5 koku","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"armor":{"physical":"3","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/armor.svg","effects":[]}
{"_id":"L5RCoreArm000002","name":"Plated Armor","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"8","zeni":"40 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000015","name":" Durable"},{"id":"L5RCorePro000011","name":" Wargear"}],"armor":{"physical":"5","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/armor.svg","effects":[]}
{"_id":"L5RCoreArm000003","name":"Concealed Armor","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"4","zeni":"5 koku","properties":[{"id":"L5RCorePro000005","name":"Concealable"}],"armor":{"physical":"2","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/armor.svg","effects":[]}
{"_id":"L5RCoreArm000004","name":"Lacquered Armor","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"6","zeni":"25 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000006","name":" Cumbersome"},{"id":"L5RCorePro000011","name":" Wargear"}],"armor":{"physical":"4","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/armor.svg","effects":[]}
{"_id":"L5RCoreArm000005","name":"Ceremonial Clothes","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"4","zeni":"1 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000010","name":" Resplendent"}],"armor":{"physical":"1","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}
{"_id":"L5RCoreArm000006","name":"Traveling Clothes","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"2","zeni":"2 bu","properties":[{"id":"L5RCorePro000015","name":"Durable"},{"id":"L5RCorePro000012","name":" Mundane"},{"id":"L5RCorePro000016","name":" Subtle"}],"armor":{"physical":"2","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}
{"_id":"L5RCoreArm000007","name":"Sanctified Robes","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"7","zeni":"4 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"}],"armor":{"physical":"1","supernatural":"3"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}
{"_id":"L5RCoreArm000008","name":"Sleeping Garb","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"2","zeni":"1 koku","properties":[],"armor":{"physical":"-","supernatural":""},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}
{"_id":"L5RCoreArm000009","name":"Common Clothes","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"1 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"armor":{"physical":"1","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}
{"_id":"L5RCoreArm000001","name":"Ashigaru Armor","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"3","zeni":"5 koku","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"armor":{"physical":"3","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/armor.svg","effects":[]}
{"_id":"L5RCoreArm000002","name":"Plated Armor","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"2","rarity":"8","zeni":"40 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000015","name":" Durable"},{"id":"L5RCorePro000011","name":" Wargear"}],"armor":{"physical":"5","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/armor.svg","effects":[]}
{"_id":"L5RCoreArm000003","name":"Concealed Armor","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"4","zeni":"5 koku","properties":[{"id":"L5RCorePro000005","name":"Concealable"}],"armor":{"physical":"2","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/armor.svg","effects":[]}
{"_id":"L5RCoreArm000004","name":"Lacquered Armor","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"2","rarity":"6","zeni":"25 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000006","name":" Cumbersome"},{"id":"L5RCorePro000011","name":" Wargear"}],"armor":{"physical":"4","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/armor.svg","effects":[]}
{"_id":"L5RCoreArm000005","name":"Ceremonial Clothes","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"4","zeni":"1 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000010","name":" Resplendent"}],"armor":{"physical":"1","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}
{"_id":"L5RCoreArm000006","name":"Traveling Clothes","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"2","zeni":"2 bu","properties":[{"id":"L5RCorePro000015","name":"Durable"},{"id":"L5RCorePro000012","name":" Mundane"},{"id":"L5RCorePro000016","name":" Subtle"}],"armor":{"physical":"2","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}
{"_id":"L5RCoreArm000007","name":"Sanctified Robes","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"7","zeni":"4 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"}],"armor":{"physical":"1","supernatural":"3"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}
{"_id":"L5RCoreArm000008","name":"Sleeping Garb","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"2","zeni":"1 koku","properties":[],"armor":{"physical":"-","supernatural":""},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}
{"_id":"L5RCoreArm000009","name":"Common Clothes","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"1","zeni":"1 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"armor":{"physical":"1","supernatural":"-"},"description":"","book_reference":"Core p.239"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}
{"_id":"L5RCoreArm000010","name":"Inconspicuous garb","permission":{"default":0},"type":"armor","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"3","zeni":"3 bu","properties":[{"id":"L5RCorePro000016","name":"Subtle"}],"armor":{"physical":"-","supernatural":"-"},"description":"","book_reference":"Core"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/keikogi.svg","effects":[]}

View File

@@ -5,26 +5,29 @@
{"_id":"L5RCoreIte000005","name":"Rope (By the Foot)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"5-20 zeni","properties":[],"description":"","book_reference":"Core p.244"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000006","name":"Sake Cup","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"2","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000007","name":"Lucky Cricket","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"4","zeni":"4 bu","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000008","name":"Bottle of Sake","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000008","name":"Bottle of Sake","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"1","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000009","name":"Dice and Cup","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"2","zeni":"25 zeni","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000010","name":"Sweets (Four Servings)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000011","name":"Spices","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"5-7","zeni":"1-5 bu","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000012","name":"Musical Instrument","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"2-6","zeni":"1-5 bu","properties":[],"description":"","book_reference":"Core p.243"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000012","name":"Musical Instrument","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"2-6","zeni":"1-5 bu","properties":[],"description":"","book_reference":"Core p.243"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000013","name":"Games","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"3","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000014","name":"Kubi Bukuro","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"2","zeni":"2 zeni","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000015","name":"Pillow Book","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"2","zeni":"3 zeni","properties":[],"description":"","book_reference":"Core p.243"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000016","name":"Bowyers Kit","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000017","name":"Calligraphy Set","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"3","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000018","name":"Divination Kit","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"4","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000019","name":"Medicine Kit","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"3","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.243"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000016","name":"Bowyers Kit","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"1","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000017","name":"Calligraphy Set","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"3","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000018","name":"Divination Kit","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"4","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000019","name":"Medicine Kit","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"3","zeni":"1 bu","properties":[],"description":"","book_reference":"Core p.243"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000020","name":"Omamori","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"2","zeni":"5 bu","properties":[],"description":"","book_reference":"Core p.243"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000021","name":"Umbrella","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"4","zeni":"2 bu","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000022","name":"Whetstone","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"1 zeni","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000023","name":"Poison (One Vial)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"5","zeni":"30 zeni","properties":[{"id":"L5RCorePro000009","name":"Forbidden"}],"description":"","book_reference":"Core p.244"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000024","name":"Daishō Stand","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"4","zeni":"1 koku","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000025","name":"Traveling Rations","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"5 zeni","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000024","name":"Daishō Stand","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"4","zeni":"1 koku","properties":[],"description":"","book_reference":"Core p.242"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000025","name":"Traveling Rations","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"1","zeni":"5 zeni","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000026","name":"Personal Seal or Chop","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"6","zeni":"4 bu","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"}],"description":"","book_reference":"Core p.243"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000027","name":"Tea Set (Portable)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"6","zeni":"1 koku","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000028","name":"Tent (Chomchong)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"7","zeni":"20 koku","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000029","name":"Tent (Small)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"3","zeni":"1 koku","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000030","name":"Tent (Yurt)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"5","zeni":"10 koku","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000027","name":"Tea Set (Portable)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"6","zeni":"1 koku","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000028","name":"Tent (Chomchong)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"2","rarity":"7","zeni":"20 koku","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000029","name":"Tent (Small)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"3","zeni":"1 koku","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000030","name":"Tent (Yurt)","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"2","rarity":"5","zeni":"10 koku","properties":[],"description":"","book_reference":"Core p.245"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000031","name":"Scroll satchel","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"3","zeni":"1 bu","properties":[],"description":"","book_reference":"Core"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000032","name":"Traveling pack","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"10 koku","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"description":"","book_reference":"Core"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}
{"_id":"L5RCoreIte000033","name":"Journal of observations","permission":{"default":0},"type":"item","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"3","zeni":"1 bu","properties":[],"description":"","book_reference":"Core"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/items/item.svg","effects":[]}

View File

@@ -24,7 +24,7 @@
{"_id":"L5RCoreShu000024","name":"Sear the Wound","permission":{"default":0},"type":"technique","data":{"in_curriculum":false,"xp_used":0,"rank":"5","bought_at_rank":0,"ring":"fire","technique_type":"shuji","xp_cost":"3","description":"","book_reference":"Core p.219"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/techs/shuji.svg","effects":[]}
{"_id":"L5RCoreShu000025","name":"Lightning Raid","permission":{"default":0},"type":"technique","data":{"in_curriculum":false,"xp_used":0,"rank":"2","bought_at_rank":0,"ring":"fire","technique_type":"shuji","xp_cost":"3","description":"","book_reference":"Core p.219"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/techs/shuji.svg","effects":[]}
{"_id":"L5RCoreShu000026","name":"Stirring the Embers","permission":{"default":0},"type":"technique","data":{"in_curriculum":false,"xp_used":0,"rank":"1","bought_at_rank":0,"ring":"fire","technique_type":"shuji","xp_cost":"3","description":"","book_reference":"Core p.219"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/techs/shuji.svg","effects":[]}
{"_id":"L5RCoreShu000027","name":"Tributaries of Trade","permission":{"default":0},"type":"technique","data":{"in_curriculum":false,"xp_used":0,"rank":"2","bought_at_rank":0,"ring":"water","technique_type":"shuji","xp_cost":"3","description":"","book_reference":""},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/techs/shuji.svg","effects":[]}
{"_id":"L5RCoreShu000027","name":"Tributaries of Trade","permission":{"default":0},"type":"technique","data":{"in_curriculum":false,"xp_used":0,"rank":"2","bought_at_rank":0,"ring":"water","technique_type":"shuji","xp_cost":"3","description":"","book_reference":"Core"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/techs/shuji.svg","effects":[]}
{"_id":"L5RCoreShu000028","name":"All in Jest","permission":{"default":0},"type":"technique","data":{"in_curriculum":false,"xp_used":0,"rank":"1","bought_at_rank":0,"ring":"water","technique_type":"shuji","xp_cost":"3","description":"","book_reference":"Core p.220"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/techs/shuji.svg","effects":[]}
{"_id":"L5RCoreShu000029","name":"Buoyant Arrival","permission":{"default":0},"type":"technique","data":{"in_curriculum":false,"xp_used":0,"rank":"5","bought_at_rank":0,"ring":"water","technique_type":"shuji","xp_cost":"3","description":"","book_reference":"Core p.220"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/techs/shuji.svg","effects":[]}
{"_id":"L5RCoreShu000030","name":"Ebb and Flow","permission":{"default":0},"type":"technique","data":{"in_curriculum":false,"xp_used":0,"rank":"3","bought_at_rank":0,"ring":"water","technique_type":"shuji","xp_cost":"3","description":"","book_reference":"Core p.220"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/techs/shuji.svg","effects":[]}

View File

@@ -1,38 +1,38 @@
{"_id":"L5RCoreWea000001","name":"Bokken","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"3","zeni":"1 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"category":"Swords","skill":"melee","readied":false,"range":"1","damage":"3","deadliness":"3","grip_1":"-","grip_2":"Damage +2","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000002","name":"Chokutō","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"7","zeni":"20 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000001","name":" Razor-Edged"}],"category":"Swords","skill":"melee","readied":false,"range":"0-1","damage":"4","deadliness":"5","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000003","name":"Scimitar","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"8","zeni":"20 koku","properties":[{"id":"L5RCorePro000015","name":"Durable"},{"id":"L5RCorePro000001","name":" Razor-Edged"}],"category":"Swords","skill":"melee","readied":false,"range":"1","damage":"4","deadliness":"5","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.233"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000004","name":"Dao","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"6","zeni":"15 koku","properties":[],"category":"Swords","skill":"melee","readied":false,"range":"1","damage":"3","deadliness":"5","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000005","name":"Gao","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"7","zeni":"15 koku","properties":[{"id":"L5RCorePro000007","name":"Snaring"}],"category":"Swords","skill":"melee","readied":false,"range":"1","damage":"4","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000006","name":"Jian","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"7","zeni":"15 koku","properties":[],"category":"Swords","skill":"melee","readied":false,"range":"0-1","damage":"4","deadliness":"4","grip_1":"-","grip_2":"Deadliness +1","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000007","name":"Katana","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"7","zeni":"20 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000001","name":" Razor-Edged"}],"category":"Swords","skill":"melee","readied":false,"range":"1","damage":"4","deadliness":"5","grip_1":"-","grip_2":"Deadliness +2","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000008","name":"Nodachi","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"8","zeni":"20 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000001","name":" Razor-Edged"}],"category":"Swords","skill":"melee","readied":false,"range":"1-2","damage":"5","deadliness":"6","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000009","name":"Wakizashi","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"7","zeni":"15 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000001","name":" Razor-Edged"}],"category":"Swords","skill":"melee","readied":false,"range":"0-1","damage":"3","deadliness":"5","grip_1":"-","grip_2":"Deadliness +2","description":"","book_reference":"Core p.233"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000010","name":"Zanbatō","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"8","zeni":"40 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Swords","skill":"melee","readied":false,"range":"1-2","damage":"6","deadliness":"7","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.233"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000011","name":"Masakari","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"5","zeni":"3 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"category":"Axes","skill":"melee","readied":false,"range":"0-1","damage":"3","deadliness":"4","grip_1":"-","grip_2":"Deadliness +2","description":"","book_reference":"Core p.233"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/axe.svg","effects":[]}
{"_id":"L5RCoreWea000012","name":"Ono","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"7","zeni":"5 koku","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"category":"Axes","skill":"melee","readied":false,"range":"1-2","damage":"5","deadliness":"6","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.233"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/axe.svg","effects":[]}
{"_id":"L5RCoreWea000013","name":"Club","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"1 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"category":"Blunt Weapons","skill":"melee","readied":false,"range":"0-1","damage":"5","deadliness":"2","grip_1":"-","grip_2":"Damage +1","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/mace.svg","effects":[]}
{"_id":"L5RCoreWea000014","name":"Kiseru","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"5","zeni":"1 koku","properties":[{"id":"L5RCorePro000005","name":"Concealable"},{"id":"L5RCorePro000012","name":" Mundane"}],"category":"Blunt Weapons","skill":"melee","readied":false,"range":"","damage":"2","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/mace.svg","effects":[]}
{"_id":"L5RCoreWea000015","name":"Hammer","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"4","zeni":"2 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"category":"Blunt Weapons","skill":"melee","readied":false,"range":"0-1","damage":"5","deadliness":"2","grip_1":"-","grip_2":"Damage +2","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/mace.svg","effects":[]}
{"_id":"L5RCoreWea000016","name":"Otsuchi","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"8","zeni":"30 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Blunt Weapons","skill":"melee","readied":false,"range":"1","damage":"8","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/mace.svg","effects":[]}
{"_id":"L5RCoreWea000017","name":"Tetsubō","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"5","zeni":"20 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000015","name":" Durable"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Blunt Weapons","skill":"melee","readied":false,"range":"1-2","damage":"7","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/mace.svg","effects":[]}
{"_id":"L5RCoreWea000018","name":"Jitte","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"5","zeni":"5 bu","properties":[{"id":"L5RCorePro000007","name":" Snaring"}],"category":"Hand Weapons","skill":"melee","readied":false,"range":"","damage":"3","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/knife.svg","effects":[]}
{"_id":"L5RCoreWea000019","name":"Knife","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"1 koku","properties":[{"id":"L5RCorePro000001","name":"Razor-Edged"},{"id":"L5RCorePro000005","name":" Concealable"},{"id":"L5RCorePro000012","name":" Mundane"}],"category":"Hand Weapons","skill":"melee","readied":false,"range":"","damage":"2","deadliness":"4","grip_1":"-","grip_2":"Deadliness +2","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/knife.svg","effects":[]}
{"_id":"L5RCoreWea000020","name":"Nunchaku","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"6","zeni":"1 koku","properties":[],"category":"Hand Weapons","skill":"melee","readied":false,"range":"0-1","damage":"4","deadliness":"2","grip_1":"-","grip_2":"Snaring","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/nunchaku.svg","effects":[]}
{"_id":"L5RCoreWea000021","name":"Tessen","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"7","zeni":"15 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000005","name":" Concealable"}],"category":"Hand Weapons","skill":"melee","readied":false,"range":"0-1","damage":"4","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/knife.svg","effects":[]}
{"_id":"L5RCoreWea000022","name":"Bisentō","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"8","zeni":"15 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000015","name":" Durable"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Polearms","skill":"melee","readied":false,"range":"2","damage":"4","deadliness":"6","grip_1":"Range 1","grip_2":"Damage +2","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000023","name":"Bō","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"2","zeni":"2 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"category":"Polearms","skill":"melee","readied":false,"range":"1-2","damage":"6","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000024","name":"Ji","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"6","zeni":"7 koku","properties":[{"id":"L5RCorePro000007","name":"Snaring"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Polearms","skill":"melee","readied":false,"range":"2","damage":"5","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000025","name":"Naginata","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"8","zeni":"10 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000001","name":" Razor-Edged"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Polearms","skill":"melee","readied":false,"range":"2","damage":"6","deadliness":"6","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000026","name":"Trident","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"7","zeni":"10 koku","properties":[{"id":"L5RCorePro000007","name":"Snaring"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Polearms","skill":"melee","readied":false,"range":"2","damage":"4","deadliness":"4","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000027","name":"Yari","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"3","zeni":"5 koku","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"category":"Polearms","skill":"melee","readied":false,"range":"2","damage":"5","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000028","name":"Horsebow","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"4","zeni":"6 koku","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"category":"Bows","skill":"ranged","readied":false,"range":"2-4","damage":"4","deadliness":"5","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.236"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bow.svg","effects":[]}
{"_id":"L5RCoreWea000029","name":"Daikyū","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"6","zeni":"6 koku","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"category":"Bows","skill":"ranged","readied":false,"range":"3-5","damage":"6","deadliness":"4","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.236"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bow.svg","effects":[]}
{"_id":"L5RCoreWea000030","name":"Yumi","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"3","zeni":"3 koku","properties":[],"category":"Bows","skill":"ranged","readied":false,"range":"2-5","damage":"5","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.236"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bow.svg","effects":[]}
{"_id":"L5RCoreWea000031","name":"Oyumi","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"8","zeni":"40 koku","properties":[{"id":"L5RCorePro000013","name":"Prepare"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Crossbows","skill":"ranged","readied":false,"range":"2-5","damage":"7","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.236"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bow.svg","effects":[]}
{"_id":"L5RCoreWea000032","name":"Kama","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"4","zeni":"1 koku","properties":[{"id":"L5RCorePro000005","name":"Concealable"}],"category":"Specialist Weapons","skill":"melee","readied":false,"range":"0-1","damage":"3","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/kusarigama.svg","effects":[]}
{"_id":"L5RCoreWea000033","name":"Kusari-gama","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"6","zeni":"5 koku","properties":[{"id":"L5RCorePro000005","name":"Concealable"},{"id":"L5RCorePro000007","name":" Snaring"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Specialist Weapons","skill":"melee","readied":false,"range":"","damage":"3","deadliness":"3","grip_1":"-","grip_2":"Range 2-3","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/kusarigama.svg","effects":[]}
{"_id":"L5RCoreWea000034","name":"Blowgun","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"1","zeni":"5 bu","properties":[{"id":"L5RCorePro000005","name":"Concealable"}],"category":"Specialist Weapons","skill":"ranged","readied":false,"range":"2-3","damage":"1","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/kusarigama.svg","effects":[]}
{"_id":"L5RCoreWea000035","name":"Shuriken","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"6","zeni":"1 koku","properties":[{"id":"L5RCorePro000005","name":"Concealable"}],"category":"Specialist Weapons","skill":"unarmed","readied":false,"range":"","damage":"2","deadliness":"4","grip_1":"(thrown) Martial Arts (Ranged), Range 1-3","grip_2":"-","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/kusarigama.svg","effects":[]}
{"_id":"L5RCoreWea000001","name":"Bokken","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"3","zeni":"1 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"category":"Swords","skill":"melee","readied":false,"range":"1","damage":"3","deadliness":"3","grip_1":"-","grip_2":"Damage +2","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000002","name":"Chokutō","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"7","zeni":"20 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000001","name":" Razor-Edged"}],"category":"Swords","skill":"melee","readied":false,"range":"0-1","damage":"4","deadliness":"5","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000003","name":"Scimitar","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"8","zeni":"20 koku","properties":[{"id":"L5RCorePro000015","name":"Durable"},{"id":"L5RCorePro000001","name":" Razor-Edged"}],"category":"Swords","skill":"melee","readied":false,"range":"1","damage":"4","deadliness":"5","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.233"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000004","name":"Dao","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"6","zeni":"15 koku","properties":[],"category":"Swords","skill":"melee","readied":false,"range":"1","damage":"3","deadliness":"5","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000005","name":"Gao","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"7","zeni":"15 koku","properties":[{"id":"L5RCorePro000007","name":"Snaring"}],"category":"Swords","skill":"melee","readied":false,"range":"1","damage":"4","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000006","name":"Jian","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"7","zeni":"15 koku","properties":[],"category":"Swords","skill":"melee","readied":false,"range":"0-1","damage":"4","deadliness":"4","grip_1":"-","grip_2":"Deadliness +1","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000007","name":"Katana","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"7","zeni":"20 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000001","name":" Razor-Edged"}],"category":"Swords","skill":"melee","readied":false,"range":"1","damage":"4","deadliness":"5","grip_1":"-","grip_2":"Deadliness +2","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000008","name":"Nodachi","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"8","zeni":"20 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000001","name":" Razor-Edged"}],"category":"Swords","skill":"melee","readied":false,"range":"1-2","damage":"5","deadliness":"6","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.232"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000009","name":"Wakizashi","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"7","zeni":"15 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000001","name":" Razor-Edged"}],"category":"Swords","skill":"melee","readied":false,"range":"0-1","damage":"3","deadliness":"5","grip_1":"-","grip_2":"Deadliness +2","description":"","book_reference":"Core p.233"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000010","name":"Zanbatō","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"2","rarity":"8","zeni":"40 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Swords","skill":"melee","readied":false,"range":"1-2","damage":"6","deadliness":"7","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.233"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/katana.svg","effects":[]}
{"_id":"L5RCoreWea000011","name":"Masakari","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"5","zeni":"3 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"category":"Axes","skill":"melee","readied":false,"range":"0-1","damage":"3","deadliness":"4","grip_1":"-","grip_2":"Deadliness +2","description":"","book_reference":"Core p.233"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/axe.svg","effects":[]}
{"_id":"L5RCoreWea000012","name":"Ono","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"7","zeni":"5 koku","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"category":"Axes","skill":"melee","readied":false,"range":"1-2","damage":"5","deadliness":"6","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.233"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/axe.svg","effects":[]}
{"_id":"L5RCoreWea000013","name":"Club","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"1","zeni":"1 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"category":"Blunt Weapons","skill":"melee","readied":false,"range":"0-1","damage":"5","deadliness":"2","grip_1":"-","grip_2":"Damage +1","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/mace.svg","effects":[]}
{"_id":"L5RCoreWea000014","name":"Kiseru","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"5","zeni":"1 koku","properties":[{"id":"L5RCorePro000005","name":"Concealable"},{"id":"L5RCorePro000012","name":" Mundane"}],"category":"Blunt Weapons","skill":"melee","readied":false,"range":"","damage":"2","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/mace.svg","effects":[]}
{"_id":"L5RCoreWea000015","name":"Hammer","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"4","zeni":"2 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"category":"Blunt Weapons","skill":"melee","readied":false,"range":"0-1","damage":"5","deadliness":"2","grip_1":"-","grip_2":"Damage +2","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/mace.svg","effects":[]}
{"_id":"L5RCoreWea000016","name":"Otsuchi","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"2","rarity":"8","zeni":"30 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Blunt Weapons","skill":"melee","readied":false,"range":"1","damage":"8","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/mace.svg","effects":[]}
{"_id":"L5RCoreWea000017","name":"Tetsubō","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"2","rarity":"5","zeni":"20 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000015","name":" Durable"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Blunt Weapons","skill":"melee","readied":false,"range":"1-2","damage":"7","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/mace.svg","effects":[]}
{"_id":"L5RCoreWea000018","name":"Jitte","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"5","zeni":"5 bu","properties":[{"id":"L5RCorePro000007","name":" Snaring"}],"category":"Hand Weapons","skill":"melee","readied":false,"range":"","damage":"3","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/knife.svg","effects":[]}
{"_id":"L5RCoreWea000019","name":"Knife","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"1","zeni":"1 koku","properties":[{"id":"L5RCorePro000001","name":"Razor-Edged"},{"id":"L5RCorePro000005","name":" Concealable"},{"id":"L5RCorePro000012","name":" Mundane"}],"category":"Hand Weapons","skill":"melee","readied":false,"range":"","damage":"2","deadliness":"4","grip_1":"-","grip_2":"Deadliness +2","description":"","book_reference":"Core p.234"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/knife.svg","effects":[]}
{"_id":"L5RCoreWea000020","name":"Nunchaku","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"6","zeni":"1 koku","properties":[],"category":"Hand Weapons","skill":"melee","readied":false,"range":"0-1","damage":"4","deadliness":"2","grip_1":"-","grip_2":"Snaring","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/nunchaku.svg","effects":[]}
{"_id":"L5RCoreWea000021","name":"Tessen","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"7","zeni":"15 koku","properties":[{"id":"L5RCorePro000002","name":"Ceremonial"},{"id":"L5RCorePro000005","name":" Concealable"}],"category":"Hand Weapons","skill":"melee","readied":false,"range":"0-1","damage":"4","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/knife.svg","effects":[]}
{"_id":"L5RCoreWea000022","name":"Bisentō","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"2","rarity":"8","zeni":"15 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000015","name":" Durable"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Polearms","skill":"melee","readied":false,"range":"2","damage":"4","deadliness":"6","grip_1":"Range 1","grip_2":"Damage +2","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000023","name":"Bō","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"2","zeni":"2 bu","properties":[{"id":"L5RCorePro000012","name":"Mundane"}],"category":"Polearms","skill":"melee","readied":false,"range":"1-2","damage":"6","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000024","name":"Ji","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"6","zeni":"7 koku","properties":[{"id":"L5RCorePro000007","name":"Snaring"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Polearms","skill":"melee","readied":false,"range":"2","damage":"5","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000025","name":"Naginata","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"2","rarity":"8","zeni":"10 koku","properties":[{"id":"L5RCorePro000006","name":"Cumbersome"},{"id":"L5RCorePro000001","name":" Razor-Edged"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Polearms","skill":"melee","readied":false,"range":"2","damage":"6","deadliness":"6","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000026","name":"Trident","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"7","zeni":"10 koku","properties":[{"id":"L5RCorePro000007","name":"Snaring"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Polearms","skill":"melee","readied":false,"range":"2","damage":"4","deadliness":"4","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000027","name":"Yari","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"3","zeni":"5 koku","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"category":"Polearms","skill":"melee","readied":false,"range":"2","damage":"5","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.235"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bo.svg","effects":[]}
{"_id":"L5RCoreWea000028","name":"Horsebow","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"4","zeni":"6 koku","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"category":"Bows","skill":"ranged","readied":false,"range":"2-4","damage":"4","deadliness":"5","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.236"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bow.svg","effects":[]}
{"_id":"L5RCoreWea000029","name":"Daikyū","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"6","zeni":"6 koku","properties":[{"id":"L5RCorePro000011","name":"Wargear"}],"category":"Bows","skill":"ranged","readied":false,"range":"3-5","damage":"6","deadliness":"4","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.236"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bow.svg","effects":[]}
{"_id":"L5RCoreWea000030","name":"Yumi","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"3","zeni":"3 koku","properties":[],"category":"Bows","skill":"ranged","readied":false,"range":"2-5","damage":"5","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.236"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bow.svg","effects":[]}
{"_id":"L5RCoreWea000031","name":"Oyumi","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"8","zeni":"40 koku","properties":[{"id":"L5RCorePro000013","name":"Prepare"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Crossbows","skill":"ranged","readied":false,"range":"2-5","damage":"7","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.236"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/bow.svg","effects":[]}
{"_id":"L5RCoreWea000032","name":"Kama","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"4","zeni":"1 koku","properties":[{"id":"L5RCorePro000005","name":"Concealable"}],"category":"Specialist Weapons","skill":"melee","readied":false,"range":"0-1","damage":"3","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/kusarigama.svg","effects":[]}
{"_id":"L5RCoreWea000033","name":"Kusari-gama","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"6","zeni":"5 koku","properties":[{"id":"L5RCorePro000005","name":"Concealable"},{"id":"L5RCorePro000007","name":" Snaring"},{"id":"L5RCorePro000011","name":" Wargear"}],"category":"Specialist Weapons","skill":"melee","readied":false,"range":"","damage":"3","deadliness":"3","grip_1":"-","grip_2":"Range 2-3","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/kusarigama.svg","effects":[]}
{"_id":"L5RCoreWea000034","name":"Blowgun","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"1","zeni":"5 bu","properties":[{"id":"L5RCorePro000005","name":"Concealable"}],"category":"Specialist Weapons","skill":"ranged","readied":false,"range":"2-3","damage":"1","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/kusarigama.svg","effects":[]}
{"_id":"L5RCoreWea000035","name":"Shuriken","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"1","rarity":"6","zeni":"1 koku","properties":[{"id":"L5RCorePro000005","name":"Concealable"}],"category":"Specialist Weapons","skill":"unarmed","readied":false,"range":"","damage":"2","deadliness":"4","grip_1":"(thrown) Martial Arts (Ranged), Range 1-3","grip_2":"-","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/kusarigama.svg","effects":[]}
{"_id":"L5RCoreWea000036","name":"Punch","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"0","zeni":"0","properties":[{"id":"L5RCorePro000007","name":"Snaring"}],"category":"Unarmed profiles","skill":"unarmed","readied":false,"range":"","damage":"1","deadliness":"2","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/unarmed.svg","effects":[]}
{"_id":"L5RCoreWea000037","name":"Kick","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"0","zeni":"0","properties":[],"category":"Unarmed profiles","skill":"unarmed","readied":false,"range":"1","damage":"2","deadliness":"1","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/unarmed.svg","effects":[]}
{"_id":"L5RCoreWea000038","name":"BIte","permission":{"default":0},"type":"weapon","data":{"equipped":false,"quantity":1,"weight":"0","rarity":"0","zeni":"0","properties":[],"category":"Unarmed profiles","skill":"unarmed","readied":false,"range":"","damage":"","deadliness":"3","grip_1":"-","grip_2":"-","description":"","book_reference":"Core p.237"},"sort":100001,"flags":{},"img":"systems/l5r5e/assets/icons/weapons/unarmed.svg","effects":[]}

View File

@@ -76,22 +76,22 @@ export class ActorL5r5e extends Actor {
if (["character", "npc"].includes(this.data.type)) {
const data = this.data.data;
data.endurance = (Number(data.rings.earth) + Number(data.rings.fire)) * 2;
data.composure = (Number(data.rings.earth) + Number(data.rings.water)) * 2;
data.focus = Number(data.rings.air) + Number(data.rings.fire);
// Attributes bars
data.void_points.max = data.rings.void;
data.fatigue.max = data.endurance;
data.strife.max = data.composure;
// if compromise, vigilance = 1
if (data.strife.value > data.strife.max) {
data.vigilance = 1;
} else {
// No automation for npc as they cheat in stats
if (this.data.type === "character") {
data.endurance = (Number(data.rings.earth) + Number(data.rings.fire)) * 2;
data.composure = (Number(data.rings.earth) + Number(data.rings.water)) * 2;
data.focus = Number(data.rings.air) + Number(data.rings.fire);
data.vigilance = Math.ceil((Number(data.rings.air) + Number(data.rings.water)) / 2);
}
// Attributes bars
data.fatigue.max = data.endurance;
data.strife.max = data.composure;
data.void_points.max = data.rings.void;
// if compromise, vigilance = 1
data.is_compromised = data.strife.value > data.strife.max;
// Make sure void points are never greater than max
if (data.void_points.value > data.void_points.max) {
data.void_points.value = data.void_points.max;

View File

@@ -159,7 +159,7 @@ export class BaseSheetL5r5e extends ActorSheet {
event.stopPropagation();
const elmt = $(event.currentTarget).data("toggle");
const tgt = html.find("." + elmt);
tgt.hasClass("toggle-active") ? tgt.removeClass("toggle-active") : tgt.addClass("toggle-active");
tgt.toggleClass("toggle-active");
});
// *** Everything below here is only needed if the sheet is editable ***
@@ -175,7 +175,7 @@ export class BaseSheetL5r5e extends ActorSheet {
new game.l5r5e.DicePickerDialog({
skillId: li.data("skill") || null,
skillCatId: li.data("skillcat") || null,
difficulty: li.data("diff") || 2,
isInitiativeRoll: li.data("initiative") || false,
actor: this.actor,
}).render(true);
});
@@ -187,6 +187,23 @@ export class BaseSheetL5r5e extends ActorSheet {
event.target.select();
});
// Prepared (Initiative)
html.find(".prepared-control").on("click", (event) => {
event.preventDefault();
event.stopPropagation();
const preparedId = $(event.currentTarget).data("id");
if (["adversary", "character"].includes(preparedId)) {
this._switchPrepared();
}
});
// Equipped / Readied
html.find(".equip-readied-control").on("click", (event) => {
event.preventDefault();
event.stopPropagation();
this._switchEquipReadied(event);
});
// *** Items : add, edit, delete ***
html.find(".item-add").on("click", (event) => {
event.preventDefault();
@@ -205,6 +222,20 @@ export class BaseSheetL5r5e extends ActorSheet {
});
}
/**
* Switch the state "prepared" (initiative)
* @private
*/
_switchPrepared() {
this.actor.data.data.prepared = !this.actor.data.data.prepared;
this.actor.update({
data: {
prepared: this.actor.data.data.prepared,
},
});
this.render(false);
}
/**
* Add a generic item with sub type
* @private
@@ -315,4 +346,32 @@ export class BaseSheetL5r5e extends ActorSheet {
}
return false;
}
/**
* Switch Readied state on a weapon
* @private
*/
_switchEquipReadied(event) {
const type = $(event.currentTarget).data("type");
if (!["equipped", "readied"].includes(type)) {
return;
}
const itemId = $(event.currentTarget).data("item-id");
const tmpItem = this.actor.getOwnedItem(itemId);
if (!tmpItem || tmpItem.data.data[type] === undefined) {
return;
}
tmpItem.data.data[type] = !tmpItem.data.data[type];
const data = {
equipped: tmpItem.data.data.equipped,
};
// Only weapons
if (tmpItem.data.data.readied !== undefined) {
data.readied = tmpItem.data.data.readied;
}
tmpItem.update({ data });
}
}

View File

@@ -116,7 +116,7 @@ export class CharacterSheetL5r5e extends BaseSheetL5r5e {
// if not in curriculum, xp spent /2 for this item
if (!item.data.in_curriculum && xp > 0) {
xp = Math.floor(xp / 2);
xp = Math.ceil(xp / 2);
}
const rank = Math.max(0, item.data.bought_at_rank);

View File

@@ -21,7 +21,7 @@ export class NpcSheetL5r5e extends BaseSheetL5r5e {
sheetData.data.types = NpcSheetL5r5e.types.map((e) => ({
id: e,
label: game.i18n.localize("l5r5e.npc.types." + e),
label: game.i18n.localize("l5r5e.character_types." + e),
}));
return sheetData;

View File

@@ -165,7 +165,7 @@ export class TwentyQuestionsDialog extends FormApplication {
event.stopPropagation();
const elmt = $(event.currentTarget).data("toggle");
const tgt = html.find("." + elmt);
tgt.hasClass("toggle-active") ? tgt.removeClass("toggle-active") : tgt.addClass("toggle-active");
tgt.toggleClass("toggle-active");
});
// BT Next

View File

@@ -184,7 +184,7 @@ export class TwentyQuestions {
const actorDatas = actor.data.data;
// already 20q struct ?
if (actorDatas.twenty_questions?.step1?.clan) {
if (!isObjectEmpty(actorDatas.twenty_questions)) {
this.data = {
...this.data,
...actorDatas.twenty_questions,
@@ -216,6 +216,8 @@ export class TwentyQuestions {
const actorDatas = actor.data.data;
const formData = this.data;
this.data.generated = true;
const status = parseInt(formData.step1.social_status) + parseInt(formData.step18.heritage_add_status);
const glory =

View File

@@ -1,61 +1,138 @@
/**
* Roll initiative for one or multiple Combatants within the Combat entity
* @param {string|string[]} ids A Combatant id or Array of ids for which to roll
* @param {string|null} [formula] A non-default initiative formula to roll. Otherwise the system default is used.
* @param {boolean} [updateTurn] Update the Combat turn after adding new initiative scores to keep the turn on
* the same Combatant.
* @param {object} [messageOptions] Additional options with which to customize created Chat Messages
* @return {Promise<Combat>} A promise which resolves to the updated Combat entity once updates are complete.
* Extends the actor to process special things from L5R.
*/
export async function rollInitiative(ids, { formula = null, updateTurn = true, messageOptions = {} } = {}) {
if (!Array.isArray(ids)) {
ids = [ids];
}
const updatedCombatants = [];
ids.forEach((combatantId) => {
const combatant = game.combat.combatants.find((c) => c._id === combatantId);
if (!combatant || !combatant.actor) {
return;
}
const data = combatant.actor.data.data;
const formula = [`${data.rings[data.stance]}dr`];
const skillValue =
combatant.actor.data.type === "npc" ? data.skills["martial"] : data.skills["martial"]["tactics"];
if (skillValue > 0) {
formula.push(`${skillValue}ds`);
export class CombatL5r5e extends Combat {
// game.combat.settings.resource = "fatigue.value"; // nope :/
// constructor(...args) {
// super(...args);
// console.log(args);
// }
/**
* Roll initiative for one or multiple Combatants within the Combat entity
* @param {string|string[]} ids A Combatant id or Array of ids for which to roll
* @param {string|null} [formula] A non-default initiative formula to roll. Otherwise the system default is used.
* @param {boolean} [updateTurn] Update the Combat turn after adding new initiative scores to keep the turn on
* the same Combatant.
* @param {object} [messageOptions] Additional options with which to customize created Chat Messages
* @return {Promise<Combat>} A promise which resolves to the updated Combat entity once updates are complete.
*/
async rollInitiative(ids, { formula = null, updateTurn = true, messageOptions = {} } = {}) {
if (!Array.isArray(ids)) {
ids = [ids];
}
const roll = new game.l5r5e.RollL5r5e(formula.join("+"));
// Get global modifiers
const cfg = {
difficulty: game.settings.get("l5r5e", "initiative.difficulty.value"),
difficultyHidden: game.settings.get("l5r5e", "initiative.difficulty.hidden"),
prepared: {
character: game.settings.get("l5r5e", "initiative.prepared.character"),
adversary: game.settings.get("l5r5e", "initiative.prepared.adversary"),
minion: game.settings.get("l5r5e", "initiative.prepared.minion"),
},
};
roll.actor = combatant.actor;
roll.l5r5e.stance = data.stance;
roll.l5r5e.skillId = "tactics";
roll.l5r5e.summary.difficulty = 1;
// SkillId from DicePicker or global
const skillId = messageOptions.skillId
? messageOptions.skillId
: CONFIG.l5r5e.initiativeSkills[game.settings.get("l5r5e", "initiative.encounter")];
const skillCat = CONFIG.l5r5e.skills.get(skillId);
roll.roll();
roll.toMessage({ flavor: game.i18n.localize("l5r5e.chatdices.initiative_roll") });
// Get score for each combatant
const updatedCombatants = [];
ids.forEach((combatantId) => {
const combatant = game.combat.combatants.find((c) => c._id === combatantId);
updatedCombatants.push({
_id: combatant._id,
initiative: roll.l5r5e.summary.success,
// Skip if combatant already have a initiative value
if (!messageOptions.rerollInitiative && (!combatant || !combatant.actor)) {
return;
}
// Shortcut to data
const data = combatant.actor.data.data;
// A characters initiative value is based on their state of preparedness when the conflict began.
// If the character was ready for the conflict, their base initiative value is their focus attribute.
// If the character was unprepared (such as when surprised), their base initiative value is their vigilance attribute.
let initiative;
if (combatant.actor.data.type === "npc" && combatant.actor.data.data.type === "minion") {
// Minion NPCs can generate initiative value without a check, using their focus or vigilance attribute
initiative = cfg.prepared.minion ? data.focus : data.is_compromised ? 1 : data.vigilance;
} else {
// PC and Adversary
const isPc = combatant.actor.data.type === "character";
// prepared is a boolean or if null we get the info in the actor sheet
let isPrepared = isPc ? cfg.prepared.character : cfg.prepared.adversary;
if (isPrepared === "null") {
isPrepared = data.prepared;
}
initiative = isPrepared ? data.focus : data.is_compromised ? 1 : data.vigilance;
// Roll formula
if (!formula) {
const createFormula = [`${data.rings[data.stance]}dr`];
const skillValue = isPc ? data.skills[skillCat][skillId] : data.skills[skillCat];
if (skillValue > 0) {
createFormula.push(`${skillValue}ds`);
}
formula = createFormula.join("+");
}
const roll = new game.l5r5e.RollL5r5e(formula);
roll.actor = combatant.actor;
roll.l5r5e.stance = data.stance;
roll.l5r5e.skillId = skillId;
roll.l5r5e.skillCatId = skillCat;
roll.l5r5e.summary.difficulty =
messageOptions.difficulty !== undefined ? messageOptions.difficulty : cfg.difficulty;
roll.l5r5e.summary.difficultyHidden =
messageOptions.difficultyHidden !== undefined
? messageOptions.difficultyHidden
: cfg.difficultyHidden;
roll.l5r5e.summary.voidPointUsed = !!messageOptions.useVoidPoint;
roll.roll();
roll.toMessage({
flavor:
game.i18n.localize("l5r5e.chatdices.initiative_roll") +
" (" +
game.i18n.localize(`l5r5e.conflict.initiative.prepared_${isPrepared}`) +
")",
});
// if the character succeeded on their Initiative check, they add 1 to their base initiative value,
// plus an additional amount equal to their bonus successes.
const successes = Math.min(roll.l5r5e.summary.ringsUsed, roll.l5r5e.summary.success);
if (successes >= roll.l5r5e.summary.difficulty) {
initiative = initiative + 1 + Math.max(successes - roll.l5r5e.summary.difficulty, 0);
}
}
updatedCombatants.push({
_id: combatant._id,
initiative: initiative,
});
});
});
// Update all combatants at once
await this.updateEmbeddedEntity("Combatant", updatedCombatants);
return this;
}
/**
* Define how the array of Combatants is sorted in the displayed list of the tracker.
* This method can be overridden by a system or module which needs to display combatants in an alternative order.
* By default sort by initiative, falling back to name
* @private
*/
export function _sortCombatants(a, b) {
// if tie, sort by honor, less honorable first
if (a.initiative === b.initiative) {
return a.actor.data.data.social.honor - b.actor.data.data.social.honor;
// Update all combatants at once
await this.updateEmbeddedEntity("Combatant", updatedCombatants);
return this;
}
/**
* Define how the array of Combatants is sorted in the displayed list of the tracker.
* This method can be overridden by a system or module which needs to display combatants in an alternative order.
* By default sort by initiative, falling back to name
* @private
*/
_sortCombatants(a, b) {
// if tie, sort by honor, less honorable first
if (a.initiative === b.initiative) {
return a.actor.data.data.social.honor - b.actor.data.data.social.honor;
}
return b.initiative - a.initiative;
}
return b.initiative - a.initiative;
}

View File

@@ -5,16 +5,24 @@ L5R5E.paths = {
templates: `systems/l5r5e/templates/`,
};
L5R5E.money = [50, 10];
L5R5E.stances = ["earth", "air", "water", "fire", "void"];
L5R5E.techniques = ["kata", "kiho", "invocation", "ritual", "shuji", "maho", "ninjutsu"];
L5R5E.techniques_school = ["school_ability", "mastery_ability"];
L5R5E.xp = {
costPerRank: [0, 20, 24, 32, 44, 60],
ringCostMultiplier: 3,
skillCostMultiplier: 2,
techniqueCost: 3,
};
L5R5E.money = [50, 10];
L5R5E.initiativeSkills = {
intrigue: "sentiment",
duel: "meditation",
skirmish: "tactics",
mass_battle: "command",
};
// Map SkillId - CategoryId
L5R5E.skills = new Map();

View File

@@ -5,9 +5,17 @@
export class DicePickerDialog extends FormApplication {
/**
* Current Actor
* @type {Actor}
* @private
*/
_actor = null;
/**
* If GM as set to hidden, lock the player choice so he cannot look the TN
* @type {boolean}
*/
_difficultyHiddenIsLock = false;
/**
* Payload Object
*/
@@ -26,9 +34,10 @@ export class DicePickerDialog extends FormApplication {
difficulty: {
value: 2,
hidden: false,
add_void_point: true,
add_void_point: false,
},
useVoidPoint: false,
isInitiativeRoll: false,
};
/**
@@ -84,8 +93,9 @@ export class DicePickerDialog extends FormApplication {
* skillCatId string (artisan)
* difficulty number (0-9)
* difficultyHidden boolean
* isInitiativeRoll boolean
*
* @param options actor, actorId, ringId, actorName, skillId, skillCatId, difficulty, difficultyHidden
* @param options actor, actorId, ringId, actorName, skillId, skillCatId, difficulty, difficultyHidden, isInitiativeRoll
*/
constructor(options = {}) {
super({}, options);
@@ -104,29 +114,41 @@ export class DicePickerDialog extends FormApplication {
});
// Ring
if (options?.ringId) {
if (options.ringId) {
this.ringId = options.ringId;
}
// Skill / SkillCategory
if (options?.skillId) {
if (options.skillId) {
this.skillId = options.skillId;
}
// SkillCategory skillCatId
if (options?.skillCatId) {
if (options.skillCatId) {
this.skillCatId = options.skillCatId;
}
// Difficulty
if (options?.difficulty) {
if (options.difficulty) {
this.difficulty = options.difficulty;
} else {
this.difficulty = game.settings.get("l5r5e", "initiative.difficulty.value");
}
// difficultyHidden
if (options?.difficultyHidden) {
this.difficultyHidden = options.difficultyHidden;
}
// DifficultyHidden
this.difficultyHidden = !!options.difficultyHidden;
// InitiativeRoll
this.object.isInitiativeRoll = !!options.isInitiativeRoll;
}
/**
* Refresh data (used from socket)
*/
async refresh() {
this.difficulty = game.settings.get("l5r5e", "initiative.difficulty.value");
this.difficultyHidden = false;
this.render(false);
}
/**
@@ -221,7 +243,14 @@ export class DicePickerDialog extends FormApplication {
* @param isHidden
*/
set difficultyHidden(isHidden) {
// If GM hide, then player choice don't matter
this._difficultyHiddenIsLock = game.settings.get("l5r5e", "initiative.difficulty.hidden");
if (this._difficultyHiddenIsLock) {
isHidden = true;
}
this.object.difficulty.hidden = !!isHidden;
this.object.difficulty.add_void_point = this.object.difficulty.hidden;
this._updateVoidPointUsage();
}
/**
@@ -247,6 +276,7 @@ export class DicePickerDialog extends FormApplication {
canUseVoidPoint:
this.object.difficulty.add_void_point || !this._actor || this._actor.data.data.void_points.value > 0,
disableSubmit: this.object.skill.value < 1 && this.object.ring.value < 1,
difficultyHiddenIsLock: this._difficultyHiddenIsLock,
};
}
@@ -342,20 +372,23 @@ export class DicePickerDialog extends FormApplication {
return false;
}
let formula = [];
if (this.object.ring.value > 0) {
formula.push(`${this.object.ring.value}dr`);
}
if (this.object.skill.value > 0) {
formula.push(`${this.object.skill.value}ds`);
// If initiative roll, check if player already have
if (this.object.isInitiativeRoll) {
const combatant = game.combat.combatants.find((c) => c.actor._id === this._actor._id && c.initiative > 0);
if (combatant) {
ui.notifications.error(game.i18n.localize("l5r5e.conflict.initiative.already_set"));
return this.close();
}
}
// Update Actor
if (this._actor) {
const actorData = duplicate(this._actor.data.data);
// TODO update actor stance ? good idea or not, choice-able ?
// actorData.stance = approach;
// Update the actor stance on initiative only
if (this.object.isInitiativeRoll) {
actorData.stance = this.object.ring.id;
}
// If hidden add 1 void pt
if (this.object.difficulty.add_void_point) {
@@ -368,24 +401,50 @@ export class DicePickerDialog extends FormApplication {
}
// Update actor
this._actor.update({
await this._actor.update({
data: diffObject(this._actor.data.data, actorData),
});
}
// Let's roll !
const roll = await new game.l5r5e.RollL5r5e(formula.join("+"));
// Build the formula
let formula = [];
if (this.object.ring.value > 0) {
formula.push(`${this.object.ring.value}dr`);
}
if (this.object.skill.value > 0) {
formula.push(`${this.object.skill.value}ds`);
}
roll.actor = this._actor;
roll.l5r5e.stance = this.object.ring.id;
roll.l5r5e.skillId = this.object.skill.id;
roll.l5r5e.skillCatId = this.object.skill.cat;
roll.l5r5e.summary.difficulty = this.object.difficulty.value;
roll.l5r5e.summary.difficultyHidden = this.object.difficulty.hidden;
roll.l5r5e.summary.voidPointUsed = this.object.useVoidPoint;
if (this.object.isInitiativeRoll) {
// Initiative roll
this._actor.rollInitiative({
initiativeOptions: {
formula: formula.join("+"),
// updateTurn: true,
messageOptions: {
skillId: this.object.skill.id,
difficulty: this.object.difficulty.value,
difficultyHidden: this.object.difficulty.hidden,
useVoidPoint: this.object.useVoidPoint,
},
},
});
} else {
// Regular roll, so let's roll !
const roll = await new game.l5r5e.RollL5r5e(formula.join("+"));
roll.actor = this._actor;
roll.l5r5e.stance = this.object.ring.id;
roll.l5r5e.skillId = this.object.skill.id;
roll.l5r5e.skillCatId = this.object.skill.cat;
roll.l5r5e.summary.difficulty = this.object.difficulty.value;
roll.l5r5e.summary.difficultyHidden = this.object.difficulty.hidden;
roll.l5r5e.summary.voidPointUsed = this.object.useVoidPoint;
await roll.roll();
await roll.toMessage();
}
await roll.roll();
await roll.toMessage();
return this.close();
}

View File

@@ -0,0 +1,154 @@
/**
* L5R Initiative Roll dialog
* @extends {FormApplication}
*/
export class GmToolsDialog extends FormApplication {
/**
* Settings
*/
object = {};
/**
* Assign the default options
* @override
*/
static get defaultOptions() {
const x = $(window).width();
const y = $(window).height();
return mergeObject(super.defaultOptions, {
id: "l5r5e-gm-tools-dialog",
classes: ["l5r5e", "gm-tools-dialog"],
template: CONFIG.l5r5e.paths.templates + "dice/gm-tools-dialog.html",
title: game.i18n.localize("l5r5e.dicepicker.difficulty_title"),
width: 200, // ignored under 200px
height: 130, // ignored under 50px
scale: 0.5, // so scale /2 :D
left: x - 470,
top: y - 94,
closeOnSubmit: false,
submitOnClose: false,
submitOnChange: true,
});
}
/**
* Constructor
* @param {ApplicationOptions} options
*/
constructor(options = {}) {
super(options);
this.object = {
difficulty: game.settings.get("l5r5e", "initiative.difficulty.value"),
difficultyHidden: game.settings.get("l5r5e", "initiative.difficulty.hidden"),
};
}
/**
* Do not close this dialog
* @override
*/
close() {
// TODO better implementation needed : see KeyboardManager._onEscape(event, up, modifiers)
// This windows is always open, so esc key si stuck at step 2 : Object.keys(ui.windows).length > 0
// Case 3 (GM) - release controlled objects
if (canvas?.ready && game.user.isGM && Object.keys(canvas.activeLayer._controlled).length) {
canvas.activeLayer.releaseAll();
} else {
// Case 4 - toggle the main menu
ui.menu.toggle();
}
}
/**
* Prevent non GM to render this windows
* @override
*/
render(force = false, options = {}) {
if (!game.user.isGM) {
return false;
}
return super.render(force, options);
}
/**
* Remove the close button
* @override
*/
_getHeaderButtons() {
return [];
}
/**
* Construct and return the data object used to render the HTML template for this form application.
* @param options
* @return {Object}
* @override
*/
getData(options = null) {
return {
...super.getData(options),
data: this.object,
};
}
/**
* Listen to html elements
* @override
*/
activateListeners(html) {
super.activateListeners(html);
if (!game.user.isGM) {
return;
}
// Modify difficulty hidden
html.find(`.difficulty_hidden`).on("click", (event) => {
this.object.difficultyHidden = !this.object.difficultyHidden;
game.settings
.set("l5r5e", "initiative.difficulty.hidden", this.object.difficultyHidden)
.then(() => this.submit());
});
// Modify difficulty (TN)
html.find(`.difficulty`).on("mousedown", (event) => {
event.preventDefault();
event.stopPropagation();
switch (event.which) {
case 1:
// left clic - add 1
this.object.difficulty = Math.min(9, this.object.difficulty + 1);
break;
case 2:
// middle clic - reset to 2
this.object.difficulty = 2;
break;
case 3:
// right clic - minus 1
this.object.difficulty = Math.max(0, this.object.difficulty - 1);
break;
}
game.settings.set("l5r5e", "initiative.difficulty.value", this.object.difficulty).then(() => this.submit());
});
}
/**
* This method is called upon form submission after form data is validated
* @param event The initial triggering submission event
* @param formData The object of validated form data with which to update the object
* @returns A Promise which resolves once the update operation has completed
* @override
*/
async _updateObject(event, formData) {
// Notify the change to other players if they already have opened the DicePicker
game.l5r5e.sockets.refreshAppId("l5r5e-dice-picker-dialog");
// If the current GM also have the DP open
const app = Object.values(ui.windows).find((e) => e.id === "l5r5e-dice-picker-dialog");
if (app && typeof app.refresh === "function") {
app.refresh();
}
this.render(false);
}
}

View File

@@ -1,6 +1,3 @@
import { L5rBaseDie } from "./dietype/l5r-base-die.js";
import { ActorL5r5e } from "../actor.js";
/**
* Roll for L5R5e
*/
@@ -24,6 +21,7 @@ export class RollL5r5e extends Roll {
difficulty: 2,
difficultyHidden: false,
voidPointUsed: false,
ringsUsed: 0,
success: 0,
explosive: 0,
opportunity: 0,
@@ -79,8 +77,14 @@ export class RollL5r5e extends Roll {
// Store final outputs
this._rolled = true;
this.l5r5e.dicesTypes.std = this.dice.some((term) => term instanceof DiceTerm && !(term instanceof L5rBaseDie)); // ignore math symbols
this.l5r5e.dicesTypes.l5r = this.dice.some((term) => term instanceof L5rBaseDie);
this.l5r5e.dicesTypes.std = this.dice.some(
(term) => term instanceof DiceTerm && !(term instanceof game.l5r5e.L5rBaseDie)
); // ignore math symbols
this.l5r5e.dicesTypes.l5r = this.dice.some((term) => term instanceof game.l5r5e.L5rBaseDie);
this.l5r5e.summary.ringsUsed = this.dice.reduce(
(acc, term) => (term instanceof game.l5r5e.RingDie ? acc + term.number : acc),
0
);
return this;
}
@@ -92,7 +96,7 @@ export class RollL5r5e extends Roll {
* @private
*/
_l5rSummary(term) {
if (!(term instanceof L5rBaseDie)) {
if (!(term instanceof game.l5r5e.L5rBaseDie)) {
return;
}
@@ -140,7 +144,7 @@ export class RollL5r5e extends Roll {
getTooltip(contexte = null) {
const parts = this.dice.map((term) => {
const cls = term.constructor;
const isL5rDie = term instanceof L5rBaseDie;
const isL5rDie = term instanceof game.l5r5e.L5rBaseDie;
return {
formula: term.formula,
@@ -223,7 +227,7 @@ export class RollL5r5e extends Roll {
canRnK: canRnK,
dices: this.dice.map((d) => {
return {
diceTypeL5r: d instanceof L5rBaseDie,
diceTypeL5r: d instanceof game.l5r5e.L5rBaseDie,
rolls: d.results.map((r) => {
return {
result: d.constructor.getResultLabel(r.result),
@@ -290,7 +294,7 @@ export class RollL5r5e extends Roll {
roll.l5r5e = duplicate(data.l5r5e);
// get real Actor object
if (data.l5r5e.actor && !(data.l5r5e.actor instanceof ActorL5r5e)) {
if (data.l5r5e.actor && !(data.l5r5e.actor instanceof game.l5r5e.ActorL5r5e)) {
const actor = game.actors.get(data.l5r5e.actor.id);
if (actor) {
roll.l5r5e.actor = actor;

View File

@@ -0,0 +1,99 @@
/**
* Custom Handlebars for L5R5e
*/
export const RegisterHandlebars = function () {
/* ------------------------------------ */
/* Localizations */
/* ------------------------------------ */
Handlebars.registerHelper("localizeSkill", function (categoryId, skillId) {
const key = "l5r5e.skills." + categoryId.toLowerCase() + "." + skillId.toLowerCase();
return game.i18n.localize(key);
});
Handlebars.registerHelper("localizeSkillId", function (skillId) {
const key = "l5r5e.skills." + CONFIG.l5r5e.skills.get(skillId.toLowerCase()) + "." + skillId.toLowerCase();
return game.i18n.localize(key);
});
Handlebars.registerHelper("localizeRing", function (ringId) {
const key = "l5r5e.rings." + ringId.toLowerCase();
return game.i18n.localize(key);
});
Handlebars.registerHelper("localizeStanceTip", function (ringId) {
const key = "l5r5e.conflict.stances." + ringId.toLowerCase() + "tip";
return game.i18n.localize(key);
});
Handlebars.registerHelper("localizeTechnique", function (techniqueName) {
return game.i18n.localize("l5r5e.techniques." + techniqueName.toLowerCase());
});
/* ------------------------------------ */
/* Utility */
/* ------------------------------------ */
/**
* Json - Display a object in textarea (for debug)
*/
Handlebars.registerHelper("json", function (...objects) {
objects.pop(); // remove this function call
return new Handlebars.SafeString(objects.map((e) => `<textarea>${JSON.stringify(e)}</textarea>`));
});
/**
* Add props "checked" if a and b are equal ({{radioChecked a b}}
*/
Handlebars.registerHelper("radioChecked", function (a, b) {
return a === b ? new Handlebars.SafeString('checked="checked"') : "";
});
/**
* Utility conditional, usable in nested expression
* {{#ifCond (ifCond advancement.type '==' 'technique') '||' (ifCond item.data.technique_type '==' 'kata')}}
* {{#ifCond '["distinction","passion"]' 'includes' item.data.peculiarity_type}}
*/
Handlebars.registerHelper("ifCond", function (a, operator, b, options) {
let result = false;
switch (operator) {
case "==":
result = a == b;
break;
case "===":
result = a === b;
break;
case "!=":
result = a != b;
break;
case "!==":
result = a !== b;
break;
case "<":
result = a < b;
break;
case "<=":
result = a <= b;
break;
case ">":
result = a > b;
break;
case ">=":
result = a >= b;
break;
case "&&":
result = a && b;
break;
case "||":
result = a || b;
break;
case "includes":
result = a && b && a.includes(b);
break;
default:
break;
}
if (typeof options.fn === "function") {
return result ? options.fn(this) : options.inverse(this);
}
return result;
});
};

217
system/scripts/hooks.js Normal file
View File

@@ -0,0 +1,217 @@
/* eslint-disable no-undef */
export default class HooksL5r5e {
/**
* Do anything after initialization but before ready
*/
static setup() {
// Embed Babele compendiums
if (
typeof Babele !== "undefined" &&
Babele.get().modules.every((module) => module.lang !== "fr" || module.module !== "l5r5e-dev")
) {
Babele.get().register({
module: "../systems/l5r5e", // babele only accept modules, so... well :D
lang: "fr",
dir: "babele/fr-fr",
});
}
}
/**
* Do anything once the system is ready
*/
static ready() {
// Migration stuff
if (game.l5r5e.migrations.needUpdate()) {
game.l5r5e.migrations.migrateWorld();
}
// Settings TN and EncounterType
if (game.user.isGM) {
new game.l5r5e.GmToolsDialog().render(true);
}
// ***** UI *****
// Add title on button dice icon
$(".chat-control-icon")[0].title = game.i18n.localize("l5r5e.chatdices.dicepicker");
// Open Help dialog on clic on logo
$("#logo")
.on("click", () => new game.l5r5e.HelpDialog().render(true))
.prop("title", game.i18n.localize("l5r5e.logo.alt"));
// Spanish specific - Disclaimer "not translated by Edge"
if (game.i18n.lang === "es") {
ui.notifications.info(game.i18n.localize("l5r5e.global.edge_translation_disclaimer"));
}
}
/**
* SidebarTab
*/
static renderSidebarTab(app, html, data) {
// Add button on dice icon
html.find(".chat-control-icon").click(async () => {
new game.l5r5e.DicePickerDialog().render();
});
}
/**
* Chat Message
*/
static renderChatMessage(message, html, data) {
// Add a extra CSS class to roll
if (message.isRoll) {
html.addClass("roll");
html.on("click", ".chat-dice-rnk", game.l5r5e.RollnKeepDialog.onChatAction.bind(this));
}
}
/**
* Combat tracker
*/
static async renderCombatTracker(app, html, data) {
// Display Combat bar (only for GMs)
await this._gmCombatBar(app, html, data);
}
/**
* Display a GM bar for Combat/Initiative
* @private
*/
static async _gmCombatBar(app, html, data) {
// Only for GMs
if (!game.user.isGM) {
return;
}
// *** Conf ***
const encounterTypeList = Object.keys(CONFIG.l5r5e.initiativeSkills);
const prepared = {
character: game.settings.get("l5r5e", "initiative.prepared.character"),
adversary: game.settings.get("l5r5e", "initiative.prepared.adversary"),
minion: game.settings.get("l5r5e", "initiative.prepared.minion"),
};
// *** Template ***
const tpl = await renderTemplate(`${CONFIG.l5r5e.paths.templates}gm/combat-tracker-bar.html`, {
encounterType: game.settings.get("l5r5e", "initiative.encounter"),
encounterTypeList,
prepared,
});
// Add/replace in bar
const elmt = html.find("#l5r5e_gm_combat_tracker_bar");
if (elmt.length > 0) {
elmt.replaceWith(tpl);
} else {
html.find("#combat-round").append(tpl);
}
// Buttons Listeners
// TODO event for multiple GM
html.find(".encounter-control").on("click", (event) => {
event.preventDefault();
event.stopPropagation();
const encounter = $(event.currentTarget).data("id");
if (!encounterTypeList.includes(encounter)) {
return;
}
game.settings
.set("l5r5e", "initiative.encounter", encounter)
.then(() => HooksL5r5e._gmCombatBar(app, html, data));
});
html.find(".prepared-control").on("click", (event) => {
event.preventDefault();
event.stopPropagation();
let preparedId = $(event.currentTarget).data("id");
if (!Object.hasOwnProperty.call(prepared, preparedId)) {
return;
}
let value = prepared[preparedId];
switch (value) {
case "false":
value = "true";
break;
case "true":
value = preparedId === "minion" ? "false" : "null";
break;
case "null":
value = "false";
break;
}
game.settings
.set("l5r5e", `initiative.prepared.${preparedId}`, value)
.then(() => HooksL5r5e._gmCombatBar(app, html, data));
});
}
/**
* Compendium display
*/
static async renderCompendium(app, html, data) {
// Add Rank & Ring in the compendium
if (app.entity === "Item") {
const content = await app.getContent();
content.forEach((item) => {
if (!!item.data.data.ring || !!item.data.data.rank) {
html.find(`[data-entry-id="${item._id}"]`).append(
`<i` +
(item.data.data.ring ? ` class="i_${item.data.data.ring}"` : ``) +
`>` +
(item.data.data.rank ? game.i18n.localize("l5r5e.rank") + " " + item.data.data.rank : "") +
`</i>`
);
}
});
return false;
}
}
/**
* DiceSoNice Hook
*/
static diceSoNiceReady(dice3d) {
const texturePath = `${CONFIG.l5r5e.paths.assets}dices/default/3d/`;
// dice3d.addSystem({
// id: "l5r5e",
// name: "Legend of the Five Rings 5E"
// }, "force");
// Rings
dice3d.addDicePreset(
{
name: "L5R Ring Dice",
type: "ddr", // don't known why the "dd" prefix is required, term is "r"
labels: Object.keys(game.l5r5e.RingDie.FACES).map(
(e) => `${texturePath}${game.l5r5e.RingDie.FACES[e].image.replace("ring_", "")}.png`
),
bumpMaps: Object.keys(game.l5r5e.RingDie.FACES).map(
(e) => `${texturePath}${game.l5r5e.RingDie.FACES[e].image.replace("ring_", "")}_bm.png`
),
colorset: "black",
system: "standard",
},
"d6"
);
// Skills
dice3d.addDicePreset(
{
name: "L5R Skill Dice",
type: "dds",
labels: Object.keys(game.l5r5e.AbilityDie.FACES).map(
(e) => `${texturePath}${game.l5r5e.AbilityDie.FACES[e].image.replace("skill_", "")}.png`
),
bumpMaps: Object.keys(game.l5r5e.AbilityDie.FACES).map(
(e) => `${texturePath}${game.l5r5e.AbilityDie.FACES[e].image.replace("skill_", "")}_bm.png`
),
colorset: "white",
system: "standard",
},
"d12"
);
}
}

View File

@@ -89,7 +89,7 @@ export class ItemSheetL5r5e extends ItemSheet {
event.stopPropagation();
const elmt = $(event.currentTarget).data("toggle");
const tgt = html.find("." + elmt);
tgt.hasClass("toggle-active") ? tgt.removeClass("toggle-active") : tgt.addClass("toggle-active");
tgt.toggleClass("toggle-active");
});
// Everything below here is only needed if the sheet is editable

View File

@@ -1,4 +1,3 @@
import { L5R5E } from "../config.js";
import { ItemSheetL5r5e } from "./item-sheet.js";
/**
@@ -20,7 +19,7 @@ export class WeaponSheetL5r5e extends ItemSheetL5r5e {
const sheetData = await super.getData();
// Martial skills only
sheetData.data.skills = Array.from(L5R5E.skills)
sheetData.data.skills = Array.from(CONFIG.l5r5e.skills)
.filter(([id, cat]) => cat === "martial")
.map(([id, cat]) => id);

View File

@@ -4,18 +4,22 @@ import { HelpersL5r5e } from "./helpers.js";
import { SocketHandlerL5r5e } from "./socket-handler.js";
import { RegisterSettings } from "./settings.js";
import { PreloadTemplates } from "./preloadTemplates.js";
import { RegisterHandlebars } from "./handlebars.js";
import { HelpDialog } from "./help/help-dialog.js";
import HooksL5r5e from "./hooks.js";
// Actors
import { ActorL5r5e } from "./actor.js";
import { CharacterSheetL5r5e } from "./actors/character-sheet.js";
import { NpcSheetL5r5e } from "./actors/npc-sheet.js";
// Dice and rolls
import { L5rBaseDie } from "./dice/dietype/l5r-base-die.js";
import { AbilityDie } from "./dice/dietype/ability-die.js";
import { RingDie } from "./dice/dietype/ring-die.js";
import { RollL5r5e } from "./dice/roll.js";
import { DicePickerDialog } from "./dice/dice-picker-dialog.js";
import { RollnKeepDialog } from "./dice/roll-n-keep-dialog.js";
import { _sortCombatants, rollInitiative } from "./combat.js";
import { CombatL5r5e } from "./combat.js";
import { GmToolsDialog } from "./dice/gm-tools-dialog.js";
// Items
import { ItemL5r5e } from "./item.js";
import { ItemSheetL5r5e } from "./items/item-sheet.js";
@@ -28,11 +32,13 @@ import { PeculiaritySheetL5r5e } from "./items/peculiarity-sheet.js";
// JournalEntry
import { JournalL5r5e } from "./journal.js";
import { BaseJournalSheetL5r5e } from "./journals/base-journal-sheet.js";
// Specific
import { MigrationL5r5e } from "./migration.js";
/* ------------------------------------ */
/* Initialize system */
/* ------------------------------------ */
Hooks.once("init", async function () {
Hooks.once("init", async () => {
// ***** Initializing l5r5e *****
// Ascii art :p
console.log(
@@ -48,6 +54,7 @@ Hooks.once("init", async function () {
CONFIG.l5r5e = L5R5E;
// Assign custom classes and constants here
CONFIG.Combat.entityClass = CombatL5r5e;
CONFIG.Actor.entityClass = ActorL5r5e;
CONFIG.Actor.sheetClasses = CharacterSheetL5r5e;
CONFIG.Item.entityClass = ItemL5r5e;
@@ -64,25 +71,29 @@ Hooks.once("init", async function () {
// Add some classes in game
game.l5r5e = {
L5rBaseDie,
RingDie,
AbilityDie,
HelpersL5r5e,
RollL5r5e,
DicePickerDialog,
RollnKeepDialog,
GmToolsDialog,
ActorL5r5e,
HelpDialog,
sockets: new SocketHandlerL5r5e(),
migrations: MigrationL5r5e,
};
// Register custom system settings
RegisterSettings();
// Register custom Handlebars Helpers
RegisterHandlebars();
// Preload Handlebars templates
await PreloadTemplates();
// ***** Combat *****
Combat.prototype.rollInitiative = rollInitiative;
Combat.prototype._sortCombatants = _sortCombatants;
// game.combat.settings.resource = "fatigue.value"; // nope :/
// ***** Register custom sheets *****
// Actors
Actors.unregisterSheet("core", ActorSheet);
@@ -102,186 +113,19 @@ Hooks.once("init", async function () {
// Journal
Items.unregisterSheet("core", JournalSheet);
Items.registerSheet("l5r5e", BaseJournalSheetL5r5e, { makeDefault: true });
// ***** Handlebars *****
// for debug
Handlebars.registerHelper("json", function (...objects) {
objects.pop(); // remove this function call
return new Handlebars.SafeString(objects.map((e) => `<textarea>${JSON.stringify(e)}</textarea>`));
});
// Add props "checked" if a and b are equal ({{radioChecked a b}}
Handlebars.registerHelper("radioChecked", function (a, b) {
return a === b ? new Handlebars.SafeString('checked="checked"') : "";
});
Handlebars.registerHelper("localizeSkill", function (categoryId, skillId) {
const key = "l5r5e.skills." + categoryId.toLowerCase() + "." + skillId.toLowerCase();
return game.i18n.localize(key);
});
Handlebars.registerHelper("localizeSkillId", function (skillId) {
const key = "l5r5e.skills." + L5R5E.skills.get(skillId.toLowerCase()) + "." + skillId.toLowerCase();
return game.i18n.localize(key);
});
Handlebars.registerHelper("localizeRing", function (ringId) {
const key = "l5r5e.rings." + ringId.toLowerCase();
return game.i18n.localize(key);
});
Handlebars.registerHelper("localizeStanceTip", function (ringId) {
const key = "l5r5e.conflict.stances." + ringId.toLowerCase() + "tip";
return game.i18n.localize(key);
});
Handlebars.registerHelper("localizeTechnique", function (techniqueName) {
return game.i18n.localize("l5r5e.techniques." + techniqueName.toLowerCase());
});
// Utility conditional, usable in nested expression
// {{#ifCond (ifCond advancement.type '==' 'technique') '||' (ifCond item.data.technique_type '==' 'kata')}}
// {{#ifCond '["distinction","passion"]' 'includes' item.data.peculiarity_type}}
Handlebars.registerHelper("ifCond", function (a, operator, b, options) {
let result = false;
switch (operator) {
case "==":
result = a == b;
break;
case "===":
result = a === b;
break;
case "!=":
result = a != b;
break;
case "!==":
result = a !== b;
break;
case "<":
result = a < b;
break;
case "<=":
result = a <= b;
break;
case ">":
result = a > b;
break;
case ">=":
result = a >= b;
break;
case "&&":
result = a && b;
break;
case "||":
result = a || b;
break;
case "includes":
result = a && b && a.includes(b);
break;
default:
break;
}
if (typeof options.fn === "function") {
return result ? options.fn(this) : options.inverse(this);
}
return result;
});
});
/* ------------------------------------ */
/* Setup system */
/* Hooks Once */
/* ------------------------------------ */
Hooks.once("setup", function () {
// Do anything after initialization but before ready
// Embed Babele compendiums
/* eslint-disable no-undef */
if (
typeof Babele !== "undefined" &&
Babele.get().modules.every((module) => module.lang !== "fr" || module.module !== "l5r5e-dev")
) {
Babele.get().register({
module: "../systems/l5r5e", // babele only accept modules, so... well :D
lang: "fr",
dir: "babele/fr-fr",
});
}
});
Hooks.once("setup", HooksL5r5e.setup);
Hooks.once("ready", HooksL5r5e.ready);
Hooks.once("diceSoNiceReady", (dice3d) => HooksL5r5e.diceSoNiceReady(dice3d));
/* ------------------------------------ */
/* Do anything once the system is ready */
/* Hooks On */
/* ------------------------------------ */
Hooks.once("ready", function () {
// Add title on button dice icon
$(".chat-control-icon")[0].title = game.i18n.localize("l5r5e.chatdices.dicepicker");
// Open Help dialog on clic on logo
$("#logo")
.on("click", () => new game.l5r5e.HelpDialog().render(true))
.prop("title", game.i18n.localize("l5r5e.logo.alt"));
});
/* ------------------------------------ */
/* SidebarTab */
/* ------------------------------------ */
Hooks.on("renderSidebarTab", (app, html, data) => {
// Add button on dice icon
html.find(".chat-control-icon").click(async () => {
new game.l5r5e.DicePickerDialog().render();
});
});
/* ------------------------------------ */
/* Chat Message */
/* ------------------------------------ */
Hooks.on("renderChatMessage", (message, html, data) => {
// Add a extra CSS class to roll
if (message.isRoll) {
html.addClass("roll");
html.on("click", ".chat-dice-rnk", RollnKeepDialog.onChatAction.bind(this));
}
});
/* ------------------------------------ */
/* DiceSoNice Hook */
/* ------------------------------------ */
Hooks.once("diceSoNiceReady", (dice3d) => {
const texturePath = `${CONFIG.l5r5e.paths.assets}dices/default/3d/`;
// dice3d.addSystem({
// id: "l5r5e",
// name: "Legend of the Five Rings 5E"
// }, "force");
// Rings
dice3d.addDicePreset(
{
name: "L5R Ring Dice",
type: "ddr", // don't known why the "dd" prefix is required, term is "r"
labels: Object.keys(RingDie.FACES).map(
(e) => `${texturePath}${RingDie.FACES[e].image.replace("ring_", "")}.png`
),
bumpMaps: Object.keys(RingDie.FACES).map(
(e) => `${texturePath}${RingDie.FACES[e].image.replace("ring_", "")}_bm.png`
),
colorset: "black",
system: "standard",
},
"d6"
);
// Skills
dice3d.addDicePreset(
{
name: "L5R Skill Dice",
type: "dds",
labels: Object.keys(AbilityDie.FACES).map(
(e) => `${texturePath}${AbilityDie.FACES[e].image.replace("skill_", "")}.png`
),
bumpMaps: Object.keys(AbilityDie.FACES).map(
(e) => `${texturePath}${AbilityDie.FACES[e].image.replace("skill_", "")}_bm.png`
),
colorset: "white",
system: "standard",
},
"d12"
);
});
Hooks.on("renderSidebarTab", (app, html, data) => HooksL5r5e.renderSidebarTab(app, html, data));
Hooks.on("renderChatMessage", (message, html, data) => HooksL5r5e.renderChatMessage(message, html, data));
Hooks.on("renderCombatTracker", (app, html, data) => HooksL5r5e.renderCombatTracker(app, html, data));
Hooks.on("renderCompendium", async (app, html, data) => HooksL5r5e.renderCompendium(app, html, data));

227
system/scripts/migration.js Normal file
View File

@@ -0,0 +1,227 @@
/**
* L5R Migration class
*/
export class MigrationL5r5e {
/**
* Version needed for migration stuff to trigger
* @type {string}
*/
static NEEDED_VERSION = "1.1.0";
/**
* Return true if the current world need some updates
* @returns {boolean}
*/
static needUpdate() {
const currentVersion = game.settings.get("l5r5e", "systemMigrationVersion");
return currentVersion && isNewerVersion(MigrationL5r5e.NEEDED_VERSION, currentVersion);
}
/**
* Perform a system migration for the entire World, applying migrations for Actors, Items, and Compendium packs
* @return {Promise} A Promise which resolves once the migration is completed
*/
static async migrateWorld() {
if (!game.user.isGM) {
return;
}
ui.notifications.info(
`Applying L5R5e System Migration for version ${game.system.data.version}.` +
` Please be patient and do not close your game or shut down your server.`,
{ permanent: true }
);
// Migrate World Actors
for (let a of game.actors.entities) {
try {
const updateData = MigrationL5r5e._migrateActorData(a.data);
if (!isObjectEmpty(updateData)) {
console.log(`Migrating Actor entity ${a.name}`);
await a.update(updateData, { enforceTypes: false });
}
} catch (err) {
err.message = `Failed L5R5e system migration for Actor ${a.name}: ${err.message}`;
console.error(err);
}
}
// Migrate World Items
for (let i of game.items.entities) {
try {
const updateData = MigrationL5r5e._migrateItemData(i.data);
if (!isObjectEmpty(updateData)) {
console.log(`Migrating Item entity ${i.name}`);
await i.update(updateData, { enforceTypes: false });
}
} catch (err) {
err.message = `Failed L5R5e system migration for Item ${i.name}: ${err.message}`;
console.error(err);
}
}
// Migrate Actor Override Tokens
for (let s of game.scenes.entities) {
try {
const updateData = MigrationL5r5e._migrateSceneData(s.data);
if (!isObjectEmpty(updateData)) {
console.log(`Migrating Scene entity ${s.name}`);
await s.update(updateData, { enforceTypes: false });
}
} catch (err) {
err.message = `Failed L5R5e system migration for Scene ${s.name}: ${err.message}`;
console.error(err);
}
}
// Migrate World Compendium Packs
for (let p of game.packs) {
if (p.metadata.package !== "world") {
continue;
}
if (!["Actor", "Item", "Scene"].includes(p.metadata.entity)) {
continue;
}
await MigrationL5r5e._migrateCompendium(p);
}
// Set the migration as complete
await game.settings.set("l5r5e", "systemMigrationVersion", game.system.data.version);
ui.notifications.info(`L5R5e System Migration to version ${game.system.data.version} completed!`, {
permanent: true,
});
}
/**
* Apply migration rules to all Entities within a single Compendium pack
* @param pack
* @return {Promise}
*/
static async _migrateCompendium(pack) {
const entity = pack.metadata.entity;
if (!["Actor", "Item", "Scene"].includes(entity)) {
return;
}
// Unlock the pack for editing
const wasLocked = pack.locked;
await pack.configure({ locked: false });
// Begin by requesting server-side data model migration and get the migrated content
await pack.migrate();
const content = await pack.getContent();
// Iterate over compendium entries - applying fine-tuned migration functions
for (let ent of content) {
let updateData = {};
try {
switch (entity) {
case "Actor":
updateData = MigrationL5r5e._migrateActorData(ent.data);
break;
case "Item":
updateData = MigrationL5r5e._migrateItemData(ent.data);
break;
case "Scene":
updateData = MigrationL5r5e._migrateSceneData(ent.data);
break;
}
if (isObjectEmpty(updateData)) {
continue;
}
// Save the entry, if data was changed
updateData["_id"] = ent._id;
await pack.updateEntity(updateData);
console.log(`Migrated ${entity} entity ${ent.name} in Compendium ${pack.collection}`);
} catch (err) {
// Handle migration failures
err.message = `Failed L5R5e system migration for entity ${ent.name} in pack ${pack.collection}: ${err.message}`;
console.error(err);
}
}
// Apply the original locked status for the pack
pack.configure({ locked: wasLocked });
console.log(`Migrated all ${entity} entities from Compendium ${pack.collection}`);
}
/**
* Migrate a single Scene entity to incorporate changes to the data model of it's actor data overrides
* Return an Object of updateData to be applied
* @param {Object} scene The Scene data to Update
* @return {Object} The updateData to apply
*/
static _migrateSceneData(scene) {
const tokens = duplicate(scene.tokens);
return {
tokens: tokens.map((t) => {
if (!t.actorId || t.actorLink || !t.actorData.data) {
t.actorData = {};
return t;
}
const token = new Token(t);
if (!token.actor) {
t.actorId = null;
t.actorData = {};
} else if (!t.actorLink) {
const updateData = MigrationL5r5e._migrateActorData(token.data.actorData);
t.actorData = mergeObject(token.data.actorData, updateData);
}
return t;
}),
};
}
/**
* Migrate a single Actor entity to incorporate latest data model changes
* Return an Object of updateData to be applied
* @param {Actor} actor The actor to Update
* @return {Object} The updateData to apply
*/
static _migrateActorData(actor) {
const updateData = {};
const actorData = actor.data;
// ***** Start of 1.1.0 *****
// Add "Prepared" in actor
if (actorData.prepared === undefined) {
updateData["data.prepared"] = true;
}
// NPC are now without autostats, we need to save the value
if (actor.type === "npc") {
if (actorData.endurance < 1) {
updateData["data.endurance"] = (Number(actorData.rings.earth) + Number(actorData.rings.fire)) * 2;
updateData["data.composure"] = (Number(actorData.rings.earth) + Number(actorData.rings.water)) * 2;
updateData["data.focus"] = Number(actorData.rings.air) + Number(actorData.rings.fire);
updateData["data.vigilance"] = Math.ceil(
(Number(actorData.rings.air) + Number(actorData.rings.water)) / 2
);
}
}
// ***** End of 1.1.0 *****
return updateData;
}
/**
* Scrub an Actor's system data, removing all keys which are not explicitly defined in the system template
* @param {Object} actorData The data object for an Actor
* @return {Object} The scrubbed Actor data
*/
static cleanActorData(actorData) {
const model = game.system.model.Actor[actorData.type];
actorData.data = filterObject(actorData.data, model);
return actorData;
}
/**
* Migrate a single Item entity to incorporate latest data model changes
* @param item
*/
static _migrateItemData(item) {
// Nothing for now
return {};
}
}

View File

@@ -21,6 +21,7 @@ export const PreloadTemplates = async function () {
"systems/l5r5e/templates/actors/npc/social.html",
"systems/l5r5e/templates/actors/npc/rings.html",
"systems/l5r5e/templates/actors/npc/attributes.html",
"systems/l5r5e/templates/actors/npc/conflict.html",
"systems/l5r5e/templates/actors/npc/skill.html",
"systems/l5r5e/templates/actors/npc/techniques.html",
// items

View File

@@ -1,4 +1,61 @@
/**
* Custom system settings register
*/
export const RegisterSettings = function () {
/* ------------------------------------ */
/* Update */
/* ------------------------------------ */
game.settings.register("l5r5e", "systemMigrationVersion", {
name: "System Migration Version",
scope: "world",
config: false,
type: String,
default: 0,
});
export const RegisterSettings = function() {
// Register any custom system settings here
}
/* ------------------------------------ */
/* Initiative Roll Dialog (GM only) */
/* ------------------------------------ */
game.settings.register("l5r5e", "initiative.difficulty.hidden", {
name: "Initiative difficulty is hidden",
scope: "world",
config: false,
type: Boolean,
default: false,
});
game.settings.register("l5r5e", "initiative.difficulty.value", {
name: "Initiative difficulty value",
scope: "world",
config: false,
type: Number,
default: 2,
});
game.settings.register("l5r5e", "initiative.encounter", {
name: "Initiative encounter type",
scope: "world",
config: false,
type: String,
default: "skirmish",
});
game.settings.register("l5r5e", "initiative.prepared.character", {
name: "Initiative PC prepared or not",
scope: "world",
config: false,
type: String,
default: "null",
});
game.settings.register("l5r5e", "initiative.prepared.adversary", {
name: "Initiative NPC adversary are prepared or not",
scope: "world",
config: false,
type: String,
default: "null",
});
game.settings.register("l5r5e", "initiative.prepared.minion", {
name: "Initiative NPC minion are prepared or not",
scope: "world",
config: false,
type: String,
default: "true",
});
};

View File

@@ -48,7 +48,7 @@ export class SocketHandlerL5r5e {
}
/**
* Refresh a app by it's id, not windowsId (ex "l5r5e-twenty-questions-dialog-kZHczAFghMNYFRWe", not "65")
* Refresh a app by it's htmlId, not windowsId (ex "l5r5e-twenty-questions-dialog-kZHczAFghMNYFRWe", not "65")
* usage : game.l5r5e.sockets.refreshAppId(appId);
* @param appId
*/
@@ -60,10 +60,7 @@ export class SocketHandlerL5r5e {
}
_onRefreshAppId(data) {
const app = Object.values(ui.windows).find((e) => e.id === data.appId);
if (!app) {
return;
}
if (typeof app.refresh !== "function") {
if (!app || typeof app.refresh !== "function") {
return;
}
app.refresh();

File diff suppressed because one or more lines are too long

View File

@@ -47,11 +47,13 @@ form .form-group .form-fields button,
.dialog .dialog-buttons button,
.item-edit,
.item-delete,
.item-equip,
.technique-edit,
.technique-delete,
.peculiarity-edit,
.peculiarity-delete,
.attribute-dtype,
.equip-readied-control,
form button,
label {
cursor: url("../assets/cursors/pointer.webp"), pointer !important;

View File

@@ -67,6 +67,7 @@
text-align: center;
background: none;
border: none;
height: calc(100% - 3rem);
td:first-child {
width: 200px;
@@ -184,3 +185,59 @@
border: 3px solid green;
}
}
#l5r5e-gm-tools-dialog {
bottom: 0;
right: 0.5rem;
display: flex;
background-position: center;
background-size: 100%;
background: linear-gradient(
$l5r5e-linear-gradient-second,
$l5r5e-linear-gradient-second-dark,
$l5r5e-linear-gradient-second
);
background-origin: padding-box;
border: 1px solid rgb(195, 165, 130);
background-origin: padding-box;
border-image: url("../assets/ui/macro-button.webp") 10 repeat;
border-image-width: 0.5rem;
border-image-outset: 0px;
.window-header {
text-align: center;
border-bottom: 1px solid rgb(195, 165, 130);
h4 {
font-family: $font-primary;
text-transform: uppercase;
letter-spacing: 0.15rem;
}
}
.window-content {
text-align: center;
vertical-align: middle;
background: transparent;
color: $white-light;
.gm-tools-container {
flex: 1;
display: flex;
flex-flow: wrap;
a {
flex: 1;
cursor: url("../assets/cursors/pointer.webp"), pointer;
i {
font-size: 3rem;
line-height: 4rem;
vertical-align: middle;
}
}
.difficulty {
flex: 1;
font-size: 3rem;
}
}
}
// hide "search anywhere" draggable icon
.window-draggable-handle {
display: none;
}
}

View File

@@ -279,3 +279,15 @@ i.i_skill {
height: 1rem;
width: 1rem;
}
// Compendium
.compendium {
.item {
i {
font-family: $font-primary;
&:before {
font-family: $font-logoType;
}
}
}
}

View File

@@ -62,6 +62,28 @@ body {
}
}
}
// Compendium
.compendium {
.item {
position: relative;
i {
float: right;
line-height: 1rem;
text-align: right;
font-size: 0.75rem;
color: rgba(240, 240, 225, 0.75);
font-style: italic;
flex: 0 0 auto;
position: absolute;
right: 0;
text-shadow: 0 0 0 rgba(255, 255, 255, 0.1);
&:before {
margin: 0 0.25rem 0 0;
font-style: normal;
}
}
}
}
}
&.sheet,
&.npc,
@@ -166,7 +188,7 @@ fieldset {
flex: 1;
display: flex;
margin: 0 0.25rem;
padding: 0.25rem 0.5rem;
padding: 0.5rem;
border: 1px solid $l5r5e-title;
legend {
color: $l5r5e-label;
@@ -181,16 +203,21 @@ input[type="text"],
input[type="number"],
input[type="password"],
input[type="date"],
input[type="time"] {
text-align: center;
input[type="time"],
textarea {
padding: 0.25rem;
background: $l5r5e-white;
border: 1px solid $l5r5e-title;
color: $l5r5e-bold;
resize: vertical;
border-radius: 0;
&[disabled] {
background: $l5r5e-white-light;
}
}
input[type="number"] {
text-align: center;
}
// Editors
.editor,
@@ -264,6 +291,39 @@ sup {
}
}
.prepared {
&-character {
color: $l5r5e-earth;
}
&-adversary {
color: $l5r5e-fire;
}
&-minion {
color: $l5r5e-water;
}
&-icon {
font-weight: 900;
font-family: "Font Awesome 5 Free";
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: inline-block;
font-style: normal;
font-variant: normal;
text-rendering: auto;
line-height: 1;
width: 1.5rem;
&-true:before {
content: "\f06e";
}
&-false:before {
content: "\f070";
}
&-null:before {
content: "\f2a8";
}
}
}
// Fix for "search anywhere" draggable icon
.window-draggable-handle {
z-index: 2;

View File

@@ -19,6 +19,7 @@
}
.item-edit,
.item-delete,
.item-equip,
.technique-edit,
.technique-delete,
.peculiarity-edit,
@@ -29,6 +30,7 @@
font-size: 0.75rem;
flex: 0 0 1rem;
padding: 0 0.1rem;
color: $black-light;
}
.icon-stat-container {
line-height: 1rem;
@@ -38,6 +40,7 @@
}
.item-edit,
.item-delete,
.item-equip,
.technique-edit,
.technique-delete,
.peculiarity-edit,
@@ -46,6 +49,7 @@
.property-delete {
&:hover {
text-shadow: 0 0 3px $red;
color: $black;
}
}
}
@@ -68,6 +72,12 @@
margin-right: 0;
}
}
.equip-readied-control {
&:hover {
color: $l5r5e-red;
background: $white;
}
}
}
p {
font-size: 0.85rem;

View File

@@ -96,6 +96,7 @@
width: 100%;
line-height: 2rem;
font-size: 0.75rem;
margin: 0.25rem 0.25rem 0.5rem;
text-align: center;
li {
flex: 1;
@@ -144,6 +145,12 @@
flex: 0 0 calc(100% - 0.5rem);
margin: 1rem 0.25rem 0;
}
.initiative-wrapper {
margin-bottom: 0.5rem;
}
&:last-child {
padding-bottom: 1rem;
}
}
.npc-note {
.editor {

View File

@@ -8,7 +8,7 @@
}
&.actor {
.sheet-header {
height: 27rem;
height: 26rem;
h1 {
flex: auto;
margin: 0 0 0.25rem 0.5rem;
@@ -24,25 +24,6 @@
}
}
}
.initiative {
&-wrapper {
display: block;
flex: 100%;
text-align: center;
}
button {
width: 22%;
margin: 0 0.25rem 0.25rem;
padding: 0 0.5rem;
color: #5a6e5a;
background: rgba(255, 255, 255, 0.5);
border: 1px solid #5a6e5a;
border-radius: 1rem;
}
button:focus {
box-shadow: none;
}
}
fieldset {
&.advancement {
display: block;
@@ -53,12 +34,6 @@
line-height: 2rem;
font-size: 1rem;
}
.compromised {
input {
border: 1px solid $l5r5e-red;
box-shadow: 0 1px 5px $l5r5e-red;
}
}
}
form {
display: flex;
@@ -126,6 +101,12 @@
0% calc(100% - var(--notchSize))
);
}
.compromised {
input {
border: 1px solid $l5r5e-red;
box-shadow: 0 1px 5px $l5r5e-red;
}
}
.header-fields {
position: relative;
flex: 0 0 100%;
@@ -235,14 +216,14 @@
width: 40%;
padding: 0;
position: relative;
top: -2.5rem;
top: -1.5rem;
}
.social-content,
.attributes-wrapper {
flex: none;
float: left;
width: 30%;
flex-direction: column;
flex-wrap: wrap;
display: flex;
padding: 0.5rem 0 0 0.25rem;
border-left: 2px solid $l5r5e-title;
@@ -289,12 +270,33 @@
margin: 0 0.25rem;
height: 2rem;
&[disabled] {
flex: 0 0 3rem;
background: $l5r5e-white-light;
}
}
}
}
.focus-content,
.vigilance-content {
flex: 0 0 50%;
padding-bottom: 0.5rem;
.attribute-label {
flex-wrap: wrap;
height: auto;
strong {
flex: 100%;
text-align: center;
}
input {
flex: 1 0 3rem;
}
&:before {
top: auto;
bottom: 0.1rem;
height: calc(100% - 1.45rem);
width: calc(100% - 0.4rem);
}
}
}
.attributes-wrapper {
padding: 0.5rem 0.25rem 0 0;
border-left: 0 none;
@@ -304,31 +306,38 @@
left: auto;
right: -0.25rem;
}
&.void-content {
&.focus-content {
&:before {
width: 0;
}
}
&.vigilance-content {
&:before {
width: 160%;
}
}
&.void-content {
&:before {
width: 90%;
}
}
}
label {
flex-direction: row;
width: 100%;
strong {
text-align: right;
}
&:nth-child(2) {
position: relative;
flex: 50%;
right: 1.5rem;
strong {
position: absolute;
top: 0;
left: 0;
font-size: 0.65rem;
width: 3rem;
color: $l5r5e-black;
color: $l5r5e-black-light;
}
input {
border-top: 0 none;
font-size: 1.25rem;
padding-top: 0.75rem;
}
@@ -336,19 +345,24 @@
}
.endurance-content,
.composure-content {
input {
&[disabled] {
flex: 0 0 5rem;
label:nth-child(1) {
strong {
flex: 0 0 calc(100% - 6rem);
}
input {
flex: 0 0 5.5rem;
padding-right: 3rem;
}
}
label:nth-child(2) {
position: absolute;
right: 0;
width: 3.5rem;
}
}
.void-content {
display: flex;
position: absolute;
bottom: 0.25rem;
right: 35%;
width: 10rem;
width: 100%;
padding-top: 0.25rem;
label {
margin: 0;
strong {
@@ -357,7 +371,7 @@
&:after {
content: "/";
position: absolute;
right: 2.9rem;
right: 1.25rem;
font-size: 1rem;
bottom: 0.6rem;
color: $l5r5e-bold;
@@ -375,8 +389,9 @@
text-align: right;
padding-left: 0.25rem;
padding-top: 0.75rem;
position: relative;
right: 2rem;
position: absolute;
right: 0.25rem;
width: 1rem;
}
}
}
@@ -414,6 +429,71 @@
}
}
}
.focus-content,
.vigilance-content {
p {
bottom: -3.75rem;
}
}
}
.attribute-label {
position: relative;
&:before {
z-index: -1;
content: "";
position: absolute;
height: calc(100% - 0.85rem);
width: 3.1rem;
border: 1px solid $l5r5e-title;
border-radius: 0;
top: 0.15rem;
left: 0.15rem;
}
}
.identity-content {
.attribute-label {
&:before {
height: calc(100% - 0.6rem);
width: calc(100% - 0.65rem);
left: auto;
top: 0.15rem;
right: 0.85rem;
}
}
li:nth-child(3),
li:nth-child(5) {
.attribute-label {
&:before {
height: calc(100% - 0.6rem);
width: calc(100% + 0.25rem);
left: auto;
top: 0.15rem;
right: -0.15rem;
}
}
}
}
.attributes-wrapper {
.attribute-label {
&:nth-child(2) {
&:before {
left: auto;
right: 3.15rem;
width: 2.6rem;
}
}
&:before {
left: auto;
right: 0.15rem;
}
}
}
.void-content {
.attribute-label {
&:before {
width: 3.85rem;
}
}
}
}
article {
@@ -476,7 +556,9 @@
}
}
.stances-content {
flex: 0 0 100%;
flex: 100%;
height: 100%;
align-self: flex-start;
.item-list {
position: relative;
padding-top: 2rem;
@@ -529,7 +611,7 @@
}
.xp,
.money-wrapper {
flex: 0 0 5rem;
flex: 0 0 6rem;
flex-direction: column;
color: $black-light;
label {
@@ -592,6 +674,27 @@
}
&.actor,
&.npc {
.initiative {
&-wrapper {
flex: 100%;
height: 100%;
align-self: flex-start;
text-align: center;
display: block;
}
button {
width: 22%;
margin: 0 0.25rem 0.25rem;
padding: 0 0.5rem;
color: #5a6e5a;
background: rgba(255, 255, 255, 0.5);
border: 1px solid #5a6e5a;
border-radius: 1rem;
}
button:focus {
box-shadow: none;
}
}
.limited {
h1 {
margin: 0.5rem 0;

View File

@@ -60,8 +60,6 @@
article {
padding: 2% 2% 2% 18%;
label {
font-size: 0.85rem;
line-height: 2rem;
&.full {
display: block;
width: 100%;
@@ -79,6 +77,10 @@
> label {
font-size: 1rem;
padding: 0 0 0 1rem;
line-height: 2rem;
> * {
line-height: 1rem;
}
}
table {
width: 100%;
@@ -93,6 +95,17 @@
border: 1px solid $l5r5e-title;
font-size: 0.85rem;
padding: 0.25rem;
> * {
line-height: 1rem;
}
> ul {
li {
line-height: 2rem;
> * {
line-height: 1rem;
}
}
}
&.done {
border: 1px solid $l5r5e-earth;
box-shadow: 0 1px 5px $l5r5e-earth;
@@ -116,11 +129,6 @@
border: 1px solid rgba(255, 255, 255, 0.5);
margin: 0 0.25rem 1rem;
}
> ul {
li {
line-height: 2rem;
}
}
hr {
border-top: 1px solid $l5r5e-black-light;
}

View File

@@ -568,30 +568,66 @@ button {
h3 {
font-size: 0.85rem;
}
}
}
}
// Dialog
.dialo {
.logo-dialog {
height: 125px;
.dialog-buttons {
button {
line-height: 1rem;
ul {
display: flex;
color: $l5r5e-white;
&.encounter {
border-right: 1px solid $l5r5e-white-light;
}
li {
flex: 1;
cursor: url("../assets/cursors/pointer.webp"), pointer;
}
}
}
.dialog-content {
height: 1rem;
p {
margin: 0;
.encounter {
i {
font-size: 23px;
vertical-align: middle;
&:hover {
text-shadow: 0 0 8px $red;
}
}
.active {
color: $l5r5e-maho;
&:hover {
text-shadow: none;
}
}
&-icon {
font-weight: 900;
font-family: "Font Awesome 5 Free";
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: inline-block;
font-style: normal;
font-variant: normal;
text-rendering: auto;
line-height: 1;
&-intrigue:before {
content: "\f21b";
}
&-duel:before {
content: "\f506";
}
&-skirmish:before {
content: "\f505";
}
&-mass_battle:before {
content: "\f447";
}
}
}
}
}
}
// Pause
#pause {
img {
content: url("../assets/icons/pause.svg");

View File

@@ -1,12 +1,32 @@
{
"name": "l5r5e",
"title": "Legend of the Five Rings (5th Edition)",
"description": "This is a game system, multilingual in En/FR/ES, for Legend of the Five Rings (5th Edition) by <a href='https://edge-studio.net/'>Edge Studio</a> <p> - Join the official Discord server: <a href='https://discord.gg/foundryvtt'> Official Discord</a></p><p> - Rejoignez la communauté Francophone: <a href='https://discord.gg/pPSDNJk'>Francophone Discord</a></p>",
"version": "1.0.0",
"description": "This is an authorised multilingual game system En|Fr|Es, for Legend of the Five Rings (5th Edition) by <a href='https://edge-studio.net/'>Edge Studio</a> <p> - Join the official Discord server: <a href='https://discord.gg/foundryvtt'> Official Discord</a></p><p> - Rejoignez la communauté Francophone: <a href='https://discord.gg/pPSDNJk'>Francophone Discord</a></p>",
"version": "1.1.0",
"minimumCoreVersion": "0.7.9",
"compatibleCoreVersion": "0.7.9",
"manifestPlusVersion": "1.0.0",
"socket": true,
"author": "Team L5R",
"authors": [
{
"name": "Vlyan",
"discord": "Vlyan#6771"
},
{
"name": "Mandar",
"discord": "Mandar#3440"
},
{
"name": "Carter"
},
{
"name": "Hrunh"
},
{
"name": "Sasmira"
}
],
"background": "L5R-Header.webp",
"scripts": [],
"esmodules": ["./scripts/main-l5r5e.js"],
@@ -140,5 +160,5 @@
],
"url": "https://gitlab.com/teaml5r/l5r5e",
"manifest": "https://gitlab.com/teaml5r/l5r5e/-/raw/master/system/system.json",
"download": "https://gitlab.com/teaml5r/l5r5e/-/jobs/artifacts/v1.0.0/raw/l5r5e.zip?job=build"
"download": "https://gitlab.com/teaml5r/l5r5e/-/jobs/artifacts/v1.1.0/raw/l5r5e.zip?job=build"
}

View File

@@ -85,7 +85,8 @@
"max": 1,
"value": 0
},
"stance": "void"
"stance": "void",
"prepared": true
},
"advancement": {
"xp_total": 0,

View File

@@ -2,7 +2,7 @@
<li class="endurance-content">
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.endurance' }}</strong>
<input class="centered-input" type="text" name="data.endurance" value="{{data.endurance}}" data-dtype="Number" disabled/>
<input class="centered-input" type="number" name="data.endurance" value="{{data.endurance}}" data-dtype="Number" disabled/>
</label>
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.fatigue' }}</strong>
@@ -13,7 +13,7 @@
<li class="composure-content">
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.composure' }}</strong>
<input class="centered-input" type="text" name="data.composure" value="{{data.composure}}" data-dtype="Number" disabled/>
<input class="centered-input" type="number" name="data.composure" value="{{data.composure}}" data-dtype="Number" disabled/>
</label>
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.strife' }}</strong>
@@ -24,14 +24,18 @@
<li class="focus-content">
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.focus' }}</strong>
<input class="centered-input" type="text" name="data.focus" value="{{data.focus}}" data-dtype="Number" disabled/>
<input class="centered-input" type="number" name="data.focus" value="{{data.focus}}" data-dtype="Number" disabled/>
</label>
<p class="item-description"> {{ localize 'l5r5e.attributes.focustip' }}</p>
</li>
<li class="vigilance-content {{#ifCond data.strife.value '>' data.strife.max}}compromised{{/ifCond}}">
<li class="vigilance-content {{#if data.is_compromised}}compromised{{/if}}">
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.vigilance' }}</strong>
<input class="centered-input" type="text" name="data.vigilance" value="{{data.vigilance}}" data-dtype="Number" disabled/>
{{#if data.is_compromised}}
<input class="centered-input" type="number" value="1" disabled/>
{{else}}
<input class="centered-input" type="number" name="data.vigilance" value="{{data.vigilance}}" data-dtype="Number" disabled/>
{{/if}}
</label>
<p class="item-description"> {{ localize 'l5r5e.attributes.vigilancetip' }}</p>
</li>
@@ -39,7 +43,7 @@
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.voidpoints' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.void_points.value" value="{{data.void_points.value}}" data-dtype="Number" placeholder="0" min="0" max="{{data.void_points.max}}"/>
<input class="centered-input" type="text" name="data.void_points.max" value="{{data.void_points.max}}" data-dtype="Number" disabled/>
<input class="centered-input" type="number" name="data.void_points.max" value="{{data.void_points.max}}" data-dtype="Number" disabled/>
</label>
</li>
</ul>

View File

@@ -1,9 +1,14 @@
<fieldset class="initiative initiative-wrapper">
<legend class="section-header">{{ localize 'l5r5e.conflict.initiative.title' }}</legend>
<button class="initiative dice-picker" data-skill="sentiment" data-diff="1">{{ localize 'l5r5e.conflict.initiative.intrigue'}}</button>
<button class="initiative dice-picker" data-skill="meditation" data-diff="1">{{ localize 'l5r5e.conflict.initiative.duel'}}</button>
<button class="initiative dice-picker" data-skill="tactics" data-diff="1">{{ localize 'l5r5e.conflict.initiative.skirmish'}}</button>
<button class="initiative dice-picker" data-skill="command" data-diff="1">{{ localize 'l5r5e.conflict.initiative.mass_battle'}}</button>
<legend class="section-header">
{{ localize 'l5r5e.conflict.initiative.title' }}
<a class="encounter prepared-control" data-id="{{entity.type}}">
<i class="fa fas prepared-icon prepared-icon-{{data.prepared}} prepared-{{entity.type}}" title="{{localize (localize 'l5r5e.conflict.initiative.prepared_{value}' value=data.prepared)}}"></i>
</a>
</legend>
<button class="initiative dice-picker" data-initiative="true" data-skill="sentiment">{{ localize 'l5r5e.conflict.initiative.intrigue'}}</button>
<button class="initiative dice-picker" data-initiative="true" data-skill="meditation">{{ localize 'l5r5e.conflict.initiative.duel'}}</button>
<button class="initiative dice-picker" data-initiative="true" data-skill="tactics">{{ localize 'l5r5e.conflict.initiative.skirmish'}}</button>
<button class="initiative dice-picker" data-initiative="true" data-skill="command">{{ localize 'l5r5e.conflict.initiative.mass_battle'}}</button>
</fieldset>
<fieldset class="stances-content flexrow">
<legend class="section-header">{{ localize 'l5r5e.conflict.stance' }}</legend>

View File

@@ -2,13 +2,13 @@
<fieldset>
<legend class="text-block-header">{{ localize 'l5r5e.social.title' }}</legend>
<label class="attribute-label">{{ localize 'l5r5e.social.ninjo' }}
<input type="text" name="data.social.ninjo" value="{{data.social.ninjo}}"/>
<textarea type="text" name="data.social.ninjo" value="{{data.social.ninjo}}"></textarea>
</label>
<label class="attribute-label">{{ localize 'l5r5e.social.giri' }}
<input type="text" name="data.social.giri" value="{{data.social.giri}}"/>
<textarea type="text" name="data.social.giri" value="{{data.social.giri}}"></textarea>
</label>
<label class="attribute-label">{{ localize 'l5r5e.social.titles' }}
<input type="text" name="data.social.titles" value="{{data.social.titles}}"/>
<input type="text" name="data.social.titles" value="{{data.social.titles}}" />
</label>
</fieldset>
<fieldset>

View File

@@ -1,34 +1,34 @@
<ul class="rings">
<li id="earth">
<label class="attribute-label earth centered-input">
<label class="earth">
<i class="i_earth"></i>
<strong>{{ localizeRing 'earth' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.rings.earth" value="{{data.rings.earth}}" data-dtype="Number" min="1" max="9" placeholder="0"/>
</label>
</li>
<li id="air">
<label class="attribute-label air centered-input">
<label class="air">
<i class="i_air"></i>
<strong>{{ localizeRing 'air' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.rings.air" value="{{data.rings.air}}" data-dtype="Number" min="1" max="9" placeholder="0"/>
</label>
</li>
<li id="water">
<label class="attribute-label water centered-input">
<label class="water">
<i class="i_water"></i>
<strong>{{ localizeRing 'water' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.rings.water" value="{{data.rings.water}}" data-dtype="Number" min="1" max="9" placeholder="0"/>
</label>
</li>
<li id="fire">
<label class="attribute-label fire centered-input">
<label class="fire">
<i class="i_fire"></i>
<strong>{{ localizeRing 'fire' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.rings.fire" value="{{data.rings.fire}}" data-dtype="Number" min="1" max="9" placeholder="0"/>
</label>
</li>
<li id="void">
<label class="attribute-label void centered-input">
<label class="void">
<i class="i_void"></i>
<strong>{{ localizeRing 'void' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.rings.void" value="{{data.rings.void}}" data-dtype="Number" min="1" max="9" placeholder="0"/>

View File

@@ -20,7 +20,12 @@
</header>
{{!-- Sheet Body --}}
<section class="sheet-body">
<article>
{{> 'systems/l5r5e/templates/actors/npc/skill.html' }}
{{#ifCond data.type '==' 'adversary'}}
{{> 'systems/l5r5e/templates/actors/npc/conflict.html' }}
{{/ifCond}}
</article>
<article>
{{> 'systems/l5r5e/templates/actors/npc/narrative.html' }}
</article>

View File

@@ -2,7 +2,7 @@
<li class="endurance-content">
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.endurance' }}</strong>
<input class="centered-input" type="text" name="data.endurance" value="{{data.endurance}}" data-dtype="Number" disabled/>
<input class="centered-input" type="number" name="data.endurance" value="{{data.endurance}}" data-dtype="Number" min="0" placeholder="0"/>
</label>
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.fatigue' }}</strong>
@@ -13,7 +13,7 @@
<li class="composure-content">
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.composure' }}</strong>
<input class="centered-input" type="text" name="data.composure" value="{{data.composure}}" data-dtype="Number" disabled/>
<input class="centered-input" type="number" name="data.composure" value="{{data.composure}}" data-dtype="Number" min="0" placeholder="0"/>
</label>
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.strife' }}</strong>
@@ -24,14 +24,18 @@
<li class="focus-content">
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.focus' }}</strong>
<input class="centered-input" type="text" name="data.focus" value="{{data.focus}}" data-dtype="Number" disabled/>
<input class="centered-input" type="number" name="data.focus" value="{{data.focus}}" data-dtype="Number" min="0" placeholder="0"/>
</label>
<p class="item-description"> {{ localize 'l5r5e.attributes.focustip' }}</p>
</li>
<li class="vigilance-content {{#ifCond data.strife.value '>' data.strife.max}}compromised{{/ifCond}}">
<li class="vigilance-content {{#if data.is_compromised}}compromised{{/if}}">
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.vigilance' }}</strong>
<input class="centered-input" type="text" name="data.vigilance" value="{{data.vigilance}}" data-dtype="Number" disabled/>
{{#if data.is_compromised}}
<input class="centered-input" type="number" value="1" disabled/>
{{else}}
<input class="centered-input" type="number" name="data.vigilance" value="{{data.vigilance}}" data-dtype="Number" min="0" placeholder="0"/>
{{/if}}
</label>
<p class="item-description"> {{ localize 'l5r5e.attributes.vigilancetip' }}</p>
</li>
@@ -39,7 +43,7 @@
<label class="attribute-label">
<strong>{{ localize 'l5r5e.attributes.voidpoints' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.void_points.value" value="{{data.void_points.value}}" data-dtype="Number" placeholder="0" min="0" max="{{data.void_points.max}}"/>
<input class="centered-input" type="text" name="data.void_points.max" value="{{data.void_points.max}}" data-dtype="Number" disabled/>
<input class="centered-input" type="number" name="data.void_points.max" value="{{data.void_points.max}}" data-dtype="Number" disabled/>
</label>
</li>
</ul>

View File

@@ -1,6 +1,18 @@
<fieldset class="initiative initiative-wrapper">
<legend class="section-header">
{{ localize 'l5r5e.conflict.initiative.title' }}
<a class="encounter prepared-control" data-id="{{data.type}}">
<i class="fa fas prepared-icon prepared-icon-{{data.prepared}} prepared-{{data.type}}" title="{{localize (localize 'l5r5e.conflict.initiative.prepared_{value}' value=data.prepared)}}"></i>
</a>
</legend>
<button class="initiative dice-picker" data-initiative="true" data-skill="sentiment">{{ localize 'l5r5e.conflict.initiative.intrigue'}}</button>
<button class="initiative dice-picker" data-initiative="true" data-skill="meditation">{{ localize 'l5r5e.conflict.initiative.duel'}}</button>
<button class="initiative dice-picker" data-initiative="true" data-skill="tactics">{{ localize 'l5r5e.conflict.initiative.skirmish'}}</button>
<button class="initiative dice-picker" data-initiative="true" data-skill="command">{{ localize 'l5r5e.conflict.initiative.mass_battle'}}</button>
</fieldset>
<fieldset class="stances-content flexrow">
<legend class="section-header">{{ localize 'l5r5e.conflict.stance' }}</legend>
<ul>
<ul class="item-list">
{{#each data.rings as |ringValue ringId|}}
{{> 'systems/l5r5e/templates/actors/character/stance.html' stance=../data.stance ringId=ringId }}
{{/each}}

View File

@@ -1,34 +1,34 @@
<ul class="rings">
<li id="earth">
<label class="attribute-label earth centered-input">
<label class="earth">
<i class="i_earth"></i>
<strong>{{ localizeRing 'earth' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.rings.earth" value="{{data.rings.earth}}" data-dtype="Number" min="1" max="9" placeholder="0"/>
</label>
</li>
<li id="air">
<label class="attribute-label air centered-input">
<label class="air">
<i class="i_air"></i>
<strong>{{ localizeRing 'air' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.rings.air" value="{{data.rings.air}}" data-dtype="Number" min="1" max="9" placeholder="0"/>
</label>
</li>
<li id="water">
<label class="attribute-label water centered-input">
<label class="water">
<i class="i_water"></i>
<strong>{{ localizeRing 'water' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.rings.water" value="{{data.rings.water}}" data-dtype="Number" min="1" max="9" placeholder="0"/>
</label>
</li>
<li id="fire">
<label class="attribute-label fire centered-input">
<label class="fire">
<i class="i_fire"></i>
<strong>{{ localizeRing 'fire' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.rings.fire" value="{{data.rings.fire}}" data-dtype="Number" min="1" max="9" placeholder="0"/>
</label>
</li>
<li id="void">
<label class="attribute-label void centered-input">
<label class="void">
<i class="i_void"></i>
<strong>{{ localizeRing 'void' }}</strong>
<input class="centered-input select-on-focus" type="number" name="data.rings.void" value="{{data.rings.void}}" data-dtype="Number" min="1" max="9" placeholder="0"/>

View File

@@ -236,7 +236,7 @@
</td>
<td class="fifty">
{{localize 'l5r5e.twenty_questions.part2.outfit'}}
{{> 'systems/l5r5e/templates/actors/character/twenty-questions-item.html' itemsList=cache.step3.equipment stepName='step3.equipment' itemType='items' hideDndAt=10 }}
{{> 'systems/l5r5e/templates/actors/character/twenty-questions-item.html' itemsList=cache.step3.equipment stepName='step3.equipment' itemType='items' hideDndAt=20 }}
</td>
</tr>
</table>

View File

@@ -148,10 +148,12 @@
{{!-- Fourth line--}}
<tr>
<td>
{{^if difficultyHiddenIsLock}}
<label>
<input type="checkbox" id="diff_hidden" name="difficulty.hidden" value="1" {{checked data.difficulty.hidden}}>
{{localize 'l5r5e.dicepicker.difficulty_hidden_label'}}
</label>
{{/if}}
</td>
<td>
{{#if canUseVoidPoint}}

View File

@@ -0,0 +1,6 @@
<form class="l5r5e gm-tools-dialog" autocomplete="off">
<p class="gm-tools-container">
<a class="difficulty_hidden"><i class="fa fa-eye{{#if data.difficultyHidden}}-slash{{/if}}"></i></a>
<strong class="difficulty">{{data.difficulty}}</strong>
</p>
</form>

View File

@@ -0,0 +1,16 @@
<nav class="encounters flexrow" id="l5r5e_gm_combat_tracker_bar">
<ul class="encounter">
{{#each encounterTypeList}}
<li class="encounter encounter-control" data-id="{{this}}">
<i class="fa fas encounter-icon-{{this}}{{#ifCond this '==' ../encounterType}} active{{/ifCond}}" title="{{localize (localize 'l5r5e.conflict.initiative.{id}' id=this)}}"></i>
</li>
{{/each}}
</ul>
<ul class="prepared">
{{#each prepared as |prepared charType|}}
<li class="encounter prepared-control" data-id="{{charType}}">
<i class="fa fas prepared-icon-{{prepared}} prepared-{{charType}}" title="{{localize (localize 'l5r5e.conflict.initiative.prepared_{value}' value=prepared)}} ({{localize (localize 'l5r5e.character_types.{type}' type=charType)}})"></i>
</li>
{{/each}}
</ul>
</nav>

View File

@@ -7,7 +7,7 @@
</legend>
<ul class="item-list">
{{#each actor.items as |item id|}}
{{#ifCond item.type '==' 'armor'}}
{{#ifCond (ifCond item.type '==' 'armor') '&&' (ifCond item.data.equipped '==' true)}}
{{> 'systems/l5r5e/templates/items/armor/armor-entry.html' item=item id=id editable=../editable }}
{{/ifCond}}
{{/each}}

View File

@@ -3,8 +3,9 @@
<li class="item-img"><img src="{{item.img}}" title="{{item.name}}" width="32px" height="32px"/></li>
<li class="item-name">{{ item.name }} <sub>x{{ item.data.quantity }}</sub></li>
{{#if editable}}
<li data-item-id="{{item._id}}" class="item-edit" title="{{localize 'l5r5e.global.edit'}}"><i class="fas fa-edit"></i></li>
<li data-item-id="{{item._id}}" class="item-delete" title="{{localize 'l5r5e.global.delete'}}"><i class="fas fa-trash"></i></li>
<li data-item-id="{{item._id}}" data-type="equipped" class="item-equip equip-readied-control" title="{{localize 'l5r5e.armors.equipped'}}"><i class="fas {{#if item.data.equipped}}fa-tshirt{{else}}fa-weight-hanging{{/if}}"></i></li>
<li data-item-id="{{item._id}}" class="item-edit" title="{{localize 'l5r5e.global.edit'}}"><i class="fas fa-edit"></i></li>
<li data-item-id="{{item._id}}" class="item-delete" title="{{localize 'l5r5e.global.delete'}}"><i class="fas fa-trash"></i></li>
{{/if}}
</ul>
<ul class="item-properties">
@@ -13,6 +14,6 @@
{{/each}}
</ul>
{{#if item.data.description}}
<div class="item-description item-description-{{item._id}}">{{{ item.data.description }}}</div>
<div class="item-description item-description-{{item._id}}">{{{ item.data.description }}}</div>
{{/if}}
</li>

View File

@@ -7,7 +7,7 @@
</legend>
<ul class="item-list">
{{#each actor.items as |item id|}}
{{#ifCond item.type '==' 'item'}}
{{#ifCond '["item", "armor", "weapon"]' 'includes' item.type}}
{{> 'systems/l5r5e/templates/items/item/item-entry.html' item=item id=id editable=../editable }}
{{/ifCond}}
{{/each}}

View File

@@ -13,11 +13,14 @@
{{/if}}
</ul>
<ul class="item-properties">
<li class="equip-readied-control" data-item-id="{{item._id}}" data-type="readied">
<i class="i_readied fa{{^if item.data.readied}}r{{/if}} fa-check-circle" title="{{#if item.data.readied}}{{localize 'l5r5e.weapons.readied'}}{{else}}{{localize 'l5r5e.weapons.sheathed'}}{{/if}}"></i>
</li>
{{#each item.data.properties as |property id|}}
<li>{{{ property.name }}}</li>
{{/each}}
</ul>
{{#if item.data.description}}
<div class="item-description item-description-{{item._id}}">{{{ item.data.description }}}</div>
<div class="item-description item-description-{{item._id}}">{{{ item.data.description }}}</div>
{{/if}}
</li>

View File

@@ -7,7 +7,7 @@
</legend>
<ul class="item-list">
{{#each actor.items as |item id|}}
{{#ifCond item.type '==' 'weapon'}}
{{#ifCond (ifCond item.type '==' 'weapon') '&&' (ifCond item.data.equipped '==' true)}}
{{> 'systems/l5r5e/templates/items/weapon/weapon-entry.html' item=item id=id editable=../editable }}
{{/ifCond}}
{{/each}}