Merge pull request #85 from TheLastScrub/jalenml/refactor-rolls

Roll Refactor | Sheet Restyle
This commit is contained in:
jalensailin
2023-09-23 15:10:19 -04:00
committed by GitHub
60 changed files with 1608 additions and 943 deletions
+46 -27
View File
@@ -1,5 +1,15 @@
## Release/Patch Notes
### Version 1.2.7 - 2023-XX-XX
* Refactor roll system
* Slight restyle of roll chat messages.
* Restyled actor sheets to be more in-line with the core book's design. You can change back to the old style in the settings for the Delta Green system.
* Weapons can now have modifiers for their rolls built-in.
* Weapons can choose a custom target for their rolls. This can be used for unnatural creature attacks that may not line up with one of the skills.
* Damage rolls can now utilize math functions like base Foundry rolls.
* Hide untrained skills toggle turned into toggleable eye icon rather than a checkbox.
### Version 1.2.6 - 2023-09-13
* Fix [Github #82] - New packaging workflow from @jalensailin will hopefully resolve issues with the Forge by deploying the v11 compendium packs directly.
@@ -8,7 +18,7 @@
* Fix - Removing more places where system still says 'Unofficial' at Arc Dream's request
### Version 1.2.4 - 2023-08-03
### Version 1.2.4 - 2023-08-03
The system is now officially recognized by Arc Dream!
@@ -55,25 +65,28 @@ The system is now officially recognized by Arc Dream!
### Version 1.0.4 - 2022-02-05
* Fix [GitHub #50] - The custom background images used on the Actor sheets was also showing up for other free-floating windows, such as when the encounter tracker is undocked. Because of the bright background, it was hard to read the text or see buttons, so have changed the CSS to try to exclude these windows from the custom background image.
* Fix [GitHub #43] - Bond Scores on Agent Pregens from u/jets_or_chasm fixed to correctly match charisma score of the agent. Also re-created the compendium using a newer version of the pregen sheet that has more
* Fix [GitHub #43] - Bond Scores on Agent Pregens from u/jets_or_chasm fixed to correctly match charisma score of the agent. Also re-created the compendium using a newer version of the pregen sheet that has more
### Version 1.0.3 - 2022-02-04
* Other - Update compatible version to v9 (Note - this update could potentially have some effects on older Foundry versions)
* Fix [GitHub #48] - The new system option to hide SAN score was not also hiding Ritual proficiency, making it trivial to back-calculate the SAN score for players that know the formula for the Ritual skill.
* Fix [GitHub #50] - In Foundry v9, seems like the sections below the nav were anchored to the bottom of the window, so as the window got bigger the section would float away from the nav leaving a big gap. Attempted to fix CSS for this by setting how the grid should flex more specifically.
### Version 1.0.2 - 2021-11-04
* Fix - Pregen Agents were getting duplicated Unarmed Strike items added on creation.
* Fix - Unarmed Strike item in the compendium was using 'Melee Combat' instead of 'Unarmed Combat' as its skill.
* Enhancment - Added system option for a world to make SAN target and skill rolls hidden from non-GM players. SAN tests change to blind rolls for players who are not GM.
### Version 1.0.1 - 2021-08-14
* Fix [GitHub #31] - Default Type Skill of Art-Painting that is added automatically when making a new agent should be localizable now.
* Enhancement - Added a separate Actor type and sheet for _Unnatural_ creatures and a similar sheet that for non-agent NPC characters.
* Enhancement - The system will try to automatically add an 'Unarmed Attack' item to a new agent when they are created to make it more obvious how this is handled within the system. [Update - accidentally had this disabled in logic when packaging system, will re-add later...]
* Enhancement - DEX x5 is now selectable as an option to roll for a weapon's skill test, which is useful for items like hand grenades that are rolled or thrown.
* Enhancement - Eduard Cot (trombonecot) submitted a Catalan language pack for the system.
* Enhancement - Added list of Pregen Agents (originaly from Reddit user u/jets_or_chasm, AKA jimstorch) as a compendium pack to allow a player to jump back in quickly after a death, or to make playing for the first time easier by presenting a list of agents of 24 professions. See https://github.com/jimstorch/DGGen for more information.
* Enhancement - Added list of Pregen Agents (originaly from Reddit user u/jets_or_chasm, AKA jimstorch) as a compendium pack to allow a player to jump back in quickly after a death, or to make playing for the first time easier by presenting a list of agents of 24 professions. See <https://github.com/jimstorch/DGGen> for more information.
* Enhancement - Added some roll tables that allow making Fall of Delta Green-style Operation Code names (e.g. 'Operation Able Archer'). These tables are based on roll tables created by Reddit user u/Travern. Note - there is also a compendium with a macro that will randomly pick a combination of the tables, then draw from those tables to make a random 2-part operation name to send to the chat.
### Version 1.0.0 - 2021-06-05 [BREAKING CHANGE: THIS VERSION FORWARD COMPATIBILE WITH FOUNDRY 0.8.6 OR HIGHER ONLY!!!]
@@ -97,47 +110,50 @@ The system is now officially recognized by Arc Dream!
### Version 0.9.9 - 2021-03-27
* Fix - [GitHub #23] - Localization mistake, had two spaces in between "Critical" and "Success" or "Failure" in chat cards.
* Fix - [GitHub #24] - The chat card that was generated from rolling a skill check by clicking on a weapon (e.g. Firearms for a pistol) was not being localized. Fixed this along with a related tooltip that wasn't being localized either.
* Fix - [GitHub #25] - The chat card for damage and lethality was not bolding those terms like it would for other skill or percentile rolls.
* Fix - [GitHub #26] - When clicking on the 'Roll Luck' button in the character sheet header, the resulting chat card was not being localized properly.
* Fix - [GitHub #27] - Using a language setting that did not have a full translation was breaking adding skills to the agent's actor sheet. Should not break quite so quickly now, but will likely need a better long term fix at some point.
* Fix - [GitHub #28] - Missing localization keys for break point tooltips added.
* Fix - Made Agent sheet default width a little wider so skills with longer names aren't getting clipped off. Also a few other alignment fixes in the CSS.
* Fix - [GitHub #23] - Localization mistake, had two spaces in between "Critical" and "Success" or "Failure" in chat cards.
* Fix - [GitHub #24] - The chat card that was generated from rolling a skill check by clicking on a weapon (e.g. Firearms for a pistol) was not being localized. Fixed this along with a related tooltip that wasn't being localized either.
* Fix - [GitHub #25] - The chat card for damage and lethality was not bolding those terms like it would for other skill or percentile rolls.
* Fix - [GitHub #26] - When clicking on the 'Roll Luck' button in the character sheet header, the resulting chat card was not being localized properly.
* Fix - [GitHub #27] - Using a language setting that did not have a full translation was breaking adding skills to the agent's actor sheet. Should not break quite so quickly now, but will likely need a better long term fix at some point.
* Fix - [GitHub #28] - Missing localization keys for break point tooltips added.
* Fix - Made Agent sheet default width a little wider so skills with longer names aren't getting clipped off. Also a few other alignment fixes in the CSS.
* Enhancement - [GitHub #28] - Spanish language translation, many thanks to CthulhuRol for providing it!
* Enhancement - Added a macro that allows for rolling the skill check on a weapon, so there can be macro buttons for both the damage and the skill check if desired.
* Sample syntax: game.deltagreen.rollItemSkillCheckMacro("Combat Dagger");
* Enhancement - Thanks to *Uriele* - Added functionality from the Handler's Guide (page 188) for 'Inhuman' stat tests, test where the stat (e.g. CON) is 20 or higher, giving a x5 target of 100 or higher. In this event, the test auto succeeds on a roll of anything other than 100, and a roll lower than the stat value is a critical (along with regular critical logic).
* Enhancement - Added 'Ritual' skill, which is calculated and is equal to 99 - current sanity (thanks to *Uriele* for mentioning it). See page 166 under 'Ritual Activation' for the full rules.
* Enhancement - Total protection rating of all _equipped_ armor now displayed by HP.
* Enhancement - [GitHub #28] - Spanish language translation, many thanks to CthulhuRol for providing it!
* Enhancement - Added a macro that allows for rolling the skill check on a weapon, so there can be macro buttons for both the damage and the skill check if desired.
* Sample syntax: game.deltagreen.rollItemSkillCheckMacro("Combat Dagger");
* Enhancement - Thanks to _Uriele_ - Added functionality from the Handler's Guide (page 188) for 'Inhuman' stat tests, test where the stat (e.g. CON) is 20 or higher, giving a x5 target of 100 or higher. In this event, the test auto succeeds on a roll of anything other than 100, and a roll lower than the stat value is a critical (along with regular critical logic).
* Enhancement - Added 'Ritual' skill, which is calculated and is equal to 99 - current sanity (thanks to _Uriele_ for mentioning it). See page 166 under 'Ritual Activation' for the full rules.
* Enhancement - Total protection rating of all _equipped_ armor now displayed by HP.
* Font and Background Change and Configuration Options - *NOTE THIS CAN BE CHANGED IN THE SYSTEM SETTINGS BACK TO WHAT IT WAS!*
* Enhancement - Added system setting for font choice, with a few options. For example you can set a world to use typewriter style font for an older feel.
* Enhancement - Added system setting for background image choice, with a few options. Changed default from normal Foundry parchment to a lighter, more moder looking paper. Also included option for old, used/crinkled paper for a more unsettling or hard-used look.
* Font and Background Change and Configuration Options - *NOTE THIS CAN BE CHANGED IN THE SYSTEM SETTINGS BACK TO WHAT IT WAS!*
* Enhancement - Added system setting for font choice, with a few options. For example you can set a world to use typewriter style font for an older feel.
* Enhancement - Added system setting for background image choice, with a few options. Changed default from normal Foundry parchment to a lighter, more moder looking paper. Also included option for old, used/crinkled paper for a more unsettling or hard-used look.
### Version 0.9.7
* Enhancement - Can now click on the icon for armor/other gear to equip or unequip it.
* Enhancement - Changed so that players with the 'Limited' permission on an actor now only see the C.V. tab of the actor's character sheet, instead of the entire sheet. Previously the 'Limited' permission and the 'Observer' permission gave the same result. The 'Observer' permission is unchanged and still shows a read-only view of the entire sheet.
* Enhancement - Added ability to alter formula for damage rolls by either __right clicking__ *or* __holding shift and left clicking__.
* Enhancement - Added ability to alter targets for tests by either __right clicking__ *or* __holding shift and left clicking__. Applies to the following rolls:
* Skill tests
* Attribute tests
* Enhancement - Added ability to alter formula for damage rolls by either **right clicking** _or_ **holding shift and left clicking**.
* Enhancement - Added ability to alter targets for tests by either **right clicking** _or_ **holding shift and left clicking**. Applies to the following rolls:
* Skill tests
* Attribute tests
* Lethality tests
* Improved CSS on actor sheet in a few places.
* New Font (was previously in style sheet, but not properly applied).
* Nav bar alignment/border consistent across tabs for a cleaner look moving between sections.
* Gear sheet alignment cleaner with certain fields now being centered.
* CV sheet now has some padding on fields so things aren't so cramped looking.
* New Font (was previously in style sheet, but not properly applied).
* Nav bar alignment/border consistent across tabs for a cleaner look moving between sections.
* Gear sheet alignment cleaner with certain fields now being centered.
* CV sheet now has some padding on fields so things aren't so cramped looking.
* Fix - Thanks to @Hrunh for submitting update to localization in item sheet
* Fix - typo in Alertness skill (English locale), thanks to roestrei for report
### Version 0.9.6
* Incremented Core Compatible Version after testing against release version of Foundry 0.7.5.
* Made the gear section a little less ugly by adding some nicer section dividers.
* Fixed some awkward tooltip wording.
### Version 0.9.4
* Fix - Pharmacy and Surgery skills were missing.
* Fix - Accounting and Disguise base skill rating were 0%, should be 10%.
* Fix - Damage on medium pistol in compendium was wrong, also fixed some base range values that were off.
@@ -146,12 +162,15 @@ The system is now officially recognized by Arc Dream!
* Enhancement - Added support for Dice So Nice module, since moving to custom chat message broke out of the box compatibility with it.
### Version 0.9.3
We will never speak of 0.9.1 or 0.9.2 ever again.
### Version 0.9.1
Added a few compendium packs with some common armor and weapon choices for Agents to equip themselves with.
Note that weapon/armor statistics are not covered by the Open Game License like the other rules used in the system, they are included as an exception with permission from Arc Dream publishing.
### Version 0.9.0
Basic system functionality complete and submitted to Foundry VTT as an official system.
+15 -3
View File
@@ -71,6 +71,12 @@ Comes from a character generator created by jimstorch, who graciously posted the
The roll tables added to generate operation code names comes from Reddit user /u/Travern.
## Localization
Portugese (BR) Translation submitted by IgorAK25
Spanish Translation submitted by CthulhuRol
Catalonian Translation submitted by trombonecot
## Fonts (Some in use, others that I would like to use at some point)
### MARTEL FONT
@@ -109,6 +115,12 @@ By Johan Holmdahl
License: None given
https://www.dafont.com/another-typewriter.font
### PUBLIC SANS FONT
Designed by USWDS, Dan Williams, Pablo Impallari, Rodrigo Fuenzalida
License: Open Font License.
https://github.com/uswds/public-sans
## Game Icons
ICONS - https://game-icons.net/
@@ -152,6 +164,6 @@ https://creativecommons.org/licenses/by/3.0/
* Magic Hand icon by Lorc under CC BY 3.0
* Magic Shield icon by Lorc under CC BY 3.0
* Sly icon by Lorc under CC BY 3.0
Portugese Translation submitted by IgorAK25
* Swap Bag icon by Lorc under CC BY 3.0
* Person icon by Delapouite under CC BY 3.0
* Cowled icon by Lorc under CC BY 3.0
+93
View File
@@ -0,0 +1,93 @@
Copyright 2015 The Public Sans Project Authors (https://github.com/uswds/public-sans)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
+81
View File
@@ -0,0 +1,81 @@
Public Sans Variable Font
=========================
This download contains Public Sans as both variable fonts and static fonts.
Public Sans is a variable font with this axis:
wght
This means all the styles are contained in these files:
PublicSans-VariableFont_wght.ttf
PublicSans-Italic-VariableFont_wght.ttf
If your app fully supports variable fonts, you can now pick intermediate styles
that aren’t available as static fonts. Not all apps support variable fonts, and
in those cases you can use the static font files for Public Sans:
static/PublicSans-Thin.ttf
static/PublicSans-ExtraLight.ttf
static/PublicSans-Light.ttf
static/PublicSans-Regular.ttf
static/PublicSans-Medium.ttf
static/PublicSans-SemiBold.ttf
static/PublicSans-Bold.ttf
static/PublicSans-ExtraBold.ttf
static/PublicSans-Black.ttf
static/PublicSans-ThinItalic.ttf
static/PublicSans-ExtraLightItalic.ttf
static/PublicSans-LightItalic.ttf
static/PublicSans-Italic.ttf
static/PublicSans-MediumItalic.ttf
static/PublicSans-SemiBoldItalic.ttf
static/PublicSans-BoldItalic.ttf
static/PublicSans-ExtraBoldItalic.ttf
static/PublicSans-BlackItalic.ttf
Get started
-----------
1. Install the font files you want to use
2. Use your app's font picker to view the font family and all the
available styles
Learn more about variable fonts
-------------------------------
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts
In desktop apps
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
Online
https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
Installing fonts
MacOS: https://support.apple.com/en-us/HT201749
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
Android Apps
https://developers.google.com/fonts/docs/android
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
License
-------
Please read the full license text (OFL.txt) to understand the permissions,
restrictions and requirements for usage, redistribution, and modification.
You can use them in your products & projects – print or digital,
commercial or otherwise.
This isn't legal advice, please consider consulting a lawyer and see the full
license for all details.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" transform="translate(0,0)" style=""><path d="M254.1 18.63c-81.4 0-231.43 155.97-171.63 300.77 8 25.3 27.83 50.4 49.13 77.1 24.4 30.6 51.6 63.2 68.7 96.9h20.5c-18.1-39.8-48.5-75.9-74.6-108.6-27.4-34.3-48.73-65.2-48.73-87.9.1-9.1 2.23-18.1 5.53-26.3 23-61.4 114-119.7 148.5-135l3.6-2 3.9 1.3c60.9 20.9 129.3 66.7 154 135.7 4.1 11.7 5.9 18 5.6 27.3-.5 15.8-24.5 54.7-55 88.7-29.1 32.4-62.4 67.7-80 106.7h20.5c16.8-32.2 46.2-64 73.3-94.2 23.2-25.6 45.3-50 54.9-74.8 52.9-124-99.2-305.67-178.2-305.67zm.8 135.47c-38.7 21.5-85.1 52.2-113.7 88.2 9.7 83 59 146.1 118.3 146.1 59.2 0 108.3-62.7 118.2-145.3-28.9-42.1-78-72.9-122.8-89zm-58.3 83h2.4c13.1.1 26.1 2.7 39.1 7.4-16.8 40.6-59 42-78.1 0 12.2-4.8 24.4-7.2 36.6-7.4zm124.9 0c13-.1 26 2.3 39.1 7.4-19.2 42-61.3 40.6-78.2 0 13.1-4.7 26.1-7.3 39.1-7.4z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 1017 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" transform="translate(0,0)" style=""><path d="M250.882 22.802c-23.366 3.035-44.553 30.444-44.553 65.935 0 19.558 6.771 36.856 16.695 48.815l11.84 14.263-18.217 3.424c-12.9 2.425-22.358 9.24-30.443 20.336-8.085 11.097-14.266 26.558-18.598 44.375-7.843 32.28-9.568 71.693-9.842 106.436h42.868l11.771 157.836c29.894 6.748 61.811 6.51 90.602.025l10.414-157.86h40.816c-.027-35.169-.477-75.126-7.584-107.65-3.918-17.934-9.858-33.372-18.04-44.343-8.185-10.97-18.08-17.745-32.563-19.989l-18.592-2.88 11.736-14.704c9.495-11.897 15.932-28.997 15.932-48.082 0-37.838-23.655-65.844-49.399-65.844z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 804 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" transform="translate(0,0)" style=""><path d="M363.783 23.545c-9.782.057-16.583 3.047-20.744 10.22-17.51 30.18-38.432 61.645-48.552 97.245 2.836.83 5.635 1.787 8.373 2.853 7.353 2.863 14.38 6.482 20.542 10.858 27.534-25.542 58.165-45.21 87.45-65.462 11.356-7.854 12.273-13.584 10.183-20.83-2.09-7.246-9.868-16.365-20.525-23.176-10.658-6.81-23.87-11.33-34.73-11.68-.68-.022-1.345-.03-1.997-.027zm-68.998.746c-10.02-.182-17.792 6.393-23.924 20.24-8.94 20.194-10.212 53.436-1.446 83.185.156-.008.31-.023.467-.03 1.99-.087 3.99-.072 6 .03 9.436-34.822 27.966-64.72 44.013-91.528-10.31-8.496-18.874-11.782-25.108-11.896zM197.5 82.5L187 97.97c14.82 10.04 29.056 19.725 39.813 31.374 3.916 4.24 7.37 8.722 10.31 13.607 3.77-4.73 8.51-8.378 13.69-10.792.407-.188.82-.355 1.228-.53-3.423-5.44-7.304-10.418-11.51-14.972C227.765 102.83 212.29 92.52 197.5 82.5zm223.77 12.27c-29.255 20.228-58.575 39.152-84.348 62.78.438.576.848 1.168 1.258 1.76 20.68-6.75 49.486-15.333 73.916-19.41 11.484-1.916 15.66-6.552 17.574-13.228 1.914-6.676.447-16.71-5.316-26.983-.924-1.647-1.96-3.29-3.083-4.92zm-223.938 47.87c-14.95.2-29.732 4.3-43.957 12.766l9.563 16.03c21.657-12.89 42.626-14.133 65.232-4.563.52-5.592 1.765-10.66 3.728-15.21.35-.806.73-1.586 1.123-2.354-11.87-4.52-23.83-6.827-35.688-6.67zm75.8 3.934c-5.578-.083-10.597.742-14.427 2.526-4.377 2.038-7.466 4.914-9.648 9.97-.884 2.047-1.572 4.54-1.985 7.494.456-.007.91-.03 1.365-.033 16.053-.084 32.587 2.77 49.313 9.19 7.714 2.96 15.062 7.453 22.047 13.184 3.217-2.445 4.99-4.72 5.773-6.535 1.21-2.798 1.095-5.184-.634-8.82-3.46-7.275-15.207-16.955-28.856-22.27-6.824-2.658-13.98-4.224-20.523-4.614-.818-.05-1.627-.08-2.424-.092zm-24.757 38.457c-22.982.075-44.722 7.386-65 19.782-32.445 19.835-60.565 53.124-80.344 90.032-19.777 36.908-31.133 77.41-31.186 110.53-.053 33.06 10.26 57.27 32.812 67.782.043.02.082.043.125.063h.032c24.872 11.51 65.616 19.337 108.407 20.092 42.79.756 87.79-5.457 121.874-20.187 21.96-9.49 34.545-28.452 40.5-54.156 5.954-25.705 4.518-57.657-2.375-89.314-6.894-31.657-19.2-63.06-34.095-87.875-14.894-24.814-32.614-42.664-48.063-48.593-14.664-5.627-28.898-8.2-42.687-8.156z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

+151 -17
View File
@@ -28,23 +28,66 @@
src: url('../assets/font/special_elite/SpecialElite-Regular.ttf') format('truetype'); /* Chrome 4+, Firefox 3.5, Opera 10+, Safari 3—5 */
}
@font-face {
font-family: 'PublicSans';
src: url('../assets/font/public-sans/PublicSans-VariableFont_wght.ttf') format('truetype'); /* Chrome 4+, Firefox 3.5, Opera 10+, Safari 3—5 */
}
/* Global styles */
/*
.window-app {
font-family: "TypeWriterCondensed", "atwriter", "Martel", 'Signika', sans-serif !important;
height: auto;
/* Hacky overrides of outer Foundry stuff */
/* Override default foundry CSS to remove padding, so that our background image can take up the whole window */
.deltagreen section.window-content{
padding: 0 !important;
}
*/
/* Override the default Foundry CSS to add the padding we removed from the outer window back in */
.deltagreen section.window-content form.editable{
padding: 6px 6px 6px 6px !important;
}
/* Character Sheet Style Options */
form.outlaw-style,
form.cowboy-style{
background: url("../assets/img/StainedPlainPaper10b.webp") !important;
background-size: 100% !important;
}
form.program-style{
background: url("../assets/img/StainedPlainPaper10a.webp") !important;
background-size: 100% !important;
}
.cowboy-style{
font-family: "SpecialElite", sans-serif !important;
}
.outlaw-style,
.program-style{
font-family: "PublicSans", sans-serif !important;
}
.outlaw-style
.cowboy-style .tabs .item {
background: rgba(173, 151, 101, 0.3);
}
.program-style .tabs .item {
background: rgba(138, 136, 133, 0.3);
}
/*
section.window-content{
background: url("../assets/img/old_paper.jpg") !important;
#pause img {
content: url(../assets/img/DG_Pause_Icon.webp);
}
*/
.old-paper-background{
background: url("../assets/img/old_paper.jpg") !important;
background: url("../assets/img/StainedPlainPaper10.webp") !important;
}
.default-parchment-background{
background: url("/ui/parchment.jpg") repeat !important;
@@ -70,6 +113,13 @@ section.window-content{
font-family: "SpecialElite", sans-serif !important;
}
.public-sans-font{
font-family: "PublicSans", sans-serif !important;
}
.rollable:hover, .rollable:focus {
color: #000;
text-shadow: 0 0 10px red;
@@ -84,6 +134,10 @@ section.window-content{
color:rgb(117, 0, 0);
}
.bottom-margin-5px{
margin-bottom: 5px !important;
}
.grid-1col{
display: grid;
grid-column: span 1 / span 1;
@@ -161,7 +215,17 @@ section.window-content{
align-items: center;
text-align: center;
padding: 2px;
}
.flex-thin-border{
border: 1px solid #999;
border-radius: 2px;
}
.flex-mid-border{
border: 1.5px solid rgb(0, 0, 0);
border-radius: 2px;
}
.flex-group-left {
@@ -223,6 +287,7 @@ section.window-content{
-webkit-box-pack: start;
-ms-flex-pack: start;
justify-content: flex-start;
margin-bottom: 8px;
}
.deltagreen .sheet-header .profile-img {
@@ -255,6 +320,7 @@ section.window-content{
margin: 0;
}
.deltagreen .sheet-body,
.deltagreen .sheet-body .tab,
.deltagreen .sheet-body .tab .editor {
@@ -272,6 +338,15 @@ section.window-content{
border-top: transparent !important;
}
.deltagreen section.sheet-body{
border: #000 !important;
border-width: 2px !important;
border-style: solid !important;
border-radius: 3px 3px 3px 3px;
padding: 5px;
}
.deltagreen .tabs {
height: auto;
text-align: center;
@@ -290,7 +365,7 @@ section.window-content{
border: gray;
border-width: 1px 1px 0px 1px;
border-style: solid;
background: rgba(173, 151, 101, 0.3);
/*background: rgba(173, 151, 101, 0.3);*/
}
.deltagreen .tabs .item.active {
@@ -301,6 +376,16 @@ section.window-content{
border-style: solid;
}
.deltagreen .program-style .tabs .item.active {
background-color: #000000;
color: #ffffff;
}
.deltagreen .cowboy-style .tabs .item.active {
background-color: rgba(156, 115, 18, 0.3);
color: #000000;
}
.deltagreen .items-list {
list-style: none;
/*margin: 7px 0; */
@@ -454,7 +539,7 @@ div span.bio-grid-label{
}
.bio-grid-top-border{
border-top: 1px solid #AAA;
border-top: 0px solid #AAA;
padding-top: 10px;
}
@@ -479,7 +564,7 @@ div span.bio-grid-label{
.breaking-point-grid-3col{
display: grid;
grid-template-columns: 100px 70px 65px;
border-top: 1px solid #AAA;
border-top: 0px solid #AAA;
margin-bottom: 10px;
border-bottom: 1px solid #AAA;
align-content: center;
@@ -498,7 +583,7 @@ div span.bio-grid-label{
justify-content: left;
align-items: center;
padding-bottom: 5px;
border-bottom: 1px solid #AAA;
border-bottom: 0px solid #AAA;
}
.adapted-label{
@@ -550,7 +635,7 @@ div .first-aid-received-section{
}
.bonds-section-header{
border-top: 1px solid #AAA;
/* border-top: 1px solid #AAA; */
width: 100%;
display: flex;
justify-content: center;
@@ -583,10 +668,11 @@ textarea.wounds{
grid-template-columns: 100%;
align-items: center;
justify-content: center;
border: 1px solid #999;
border: 1.5px solid #000000;
padding: 5px;
grid-gap: 3px;
text-align: center;
border-radius: 2px;
}
div.max-resource-value{
@@ -608,16 +694,65 @@ div.max-resource-value{
grid-gap: 5px;
}
div.gear-section-header{
.physical-stats-and-feature{
border-radius: 2px;
border: 1.5px solid #000000;
}
div.horizontal-bar-section-divider{
display: grid;
grid-template-columns: 100%;
justify-content: center;
align-items: center;
text-align: center;
margin-bottom: 3px;
background: #000;
color: #fff;
height: 30px;
border-radius: 3px 3px 3px 3px;
}
div.horizontal-bar-section-divider.contains-hide-button {
display: grid;
grid-template-columns: repeat(3, 1fr);
justify-content: center;
align-items: center;
text-align: center;
margin-bottom: 3px;
background: #000;
color: #fff;
height: 30px;
border-radius: 3px 3px 3px 3px;
}
.horizontal-bar-section-divider .contains-hide-button-title {
grid-column: 2;
}
.horizontal-bar-section-divider .toggle-untrained {
grid-column: 3;
padding-right: 0.5rem;
justify-self: end;
}
div.horizontal-bar-section-header{
display: grid;
grid-template-columns: 100%;
justify-content: center;
align-items: center;
text-align: center;
margin-bottom: 3px;
background: #000;
color: #fff;
height: 50px;
}
.physical-description-label{
@@ -633,7 +768,6 @@ div.motivation-editor-container div.editor{
background: none !important;
}
.deltagreen .tox-editor-header {
background: none !important;
}
@@ -826,7 +960,7 @@ input.item-sheet-short-input{
.weapon-sheet-horizontal-grid-left-2col{
display: grid;
grid-template-columns: 40% 60%;
grid-template-columns: 50% 50%;
align-items: center;
text-align: left;
padding-bottom: 10px;
+16 -2
View File
@@ -128,7 +128,6 @@
"DG.CV.NationalityPlaceholder": "Nacionalitat",
"DG.CV.Education": "Educació",
"DG.CV.EducationPlaceholder": "Educació o entrenament",
"DG.CV.PhysicalDescriptionLabel": "Descripció física/notes",
"DG.Bonds.Bond": "Vincle",
"DG.Bonds.Name": "Nom",
@@ -227,6 +226,17 @@
"DG.TypeSkills.Subskills.Painting": "Pintar",
"DG.Sheet.BlockHeaders.Attributes": "ATTRIBUTES",
"DG.Sheet.BlockHeaders.Statistics": "STATISTICS",
"DG.Sheet.BlockHeaders.PhysicalDescriptionNotes": "Descripció física/notes",
"DG.Sheet.BlockHeaders.SkillsAndTraining": "SKILLS AND TRAINING",
"DG.Sheet.BlockHeaders.Injuries": "INJURIES",
"DG.Sheet.BlockHeaders.BreakingPointAndAdaptations": "BREAKING POINT AND ADAPTATIONS",
"DG.Sheet.BlockHeaders.MotivationsAndDisorders": "MOTIVATIONS AND DISDORDERS",
"DG.Sheet.BlockHeaders.PersonalInfoCV": "PERSONAL INFORMATION / CV",
"DG.Sheet.BlockHeaders.BondsRelationshipsContacts": "BONDS / RELATIONSHIPS / CONTACTS",
"DG.UnnaturalSheet.HideUntrainedSkillsLabel": "Amagar habilitats no entrenades",
"DG.UnnaturalSheet.NotesLabel": "Notes",
"DG.UnnaturalSheet.ShortDescriptionFallbackText": "Descripció de la criatura o tipus de criatura",
@@ -249,5 +259,9 @@
"DG.Generic.CheckDamagedBondsBoxUntilNextHomeScene": "Check a damaged Bond's box until the next Home Scene ends.",
"DG.Generic.ClearAll": "Clear All",
"DG.Generic.SanDamage": "SAN Damage"
"DG.Generic.SanDamage": "SAN Damage",
"DG.ItemWindow.Weapons.CustomSkillTarget": "Target",
"DG.ItemWindow.Weapons.SkillModifier": "Skill Modifier",
"DG.ItemWindow.Custom": "Custom"
}
+20 -6
View File
@@ -112,8 +112,8 @@
"DG.Mental.Helplessness": "Helplessness",
"DG.Mental.AdaptedToViolence": "Adapted to Violence",
"DG.Mental.AdaptedToHelplessness": "Adapted to Helplessness",
"DG.Mental.Motivations": "Motivations",
"DG.Mental.Disorders": "Disorders",
"DG.Mental.Motivations": "Motivation",
"DG.Mental.Disorders": "Disorder",
"DG.Gear.Weapons": "WEAPONS",
"DG.Gear.Armor": "ARMOR",
@@ -134,7 +134,6 @@
"DG.CV.NationalityPlaceholder": "Nationality",
"DG.CV.Education": "Education",
"DG.CV.EducationPlaceholder": "Education or Training",
"DG.CV.PhysicalDescriptionLabel": "Physical Description/Notes",
"DG.Bonds.Bond": "Bond",
"DG.Bonds.Name": "Name",
@@ -233,9 +232,20 @@
"DG.TypeSkills.Subskills.Painting": "Painting",
"DG.UnnaturalSheet.HideUntrainedSkillsLabel": "Hide Untrained Skills",
"DG.Sheet.BlockHeaders.Attributes": "ATTRIBUTES",
"DG.Sheet.BlockHeaders.Statistics": "STATISTICS",
"DG.Sheet.BlockHeaders.PhysicalDescriptionNotes": "PHYSICAL DESCRIPTION / NOTES",
"DG.Sheet.BlockHeaders.SkillsAndTraining": "SKILLS AND TRAINING",
"DG.Sheet.BlockHeaders.Injuries": "INJURIES",
"DG.Sheet.BlockHeaders.BreakingPointAndAdaptations": "BREAKING POINT AND ADAPTATIONS",
"DG.Sheet.BlockHeaders.MotivationsAndDisorders": "MOTIVATIONS AND DISDORDERS",
"DG.Sheet.BlockHeaders.PersonalInfoCV": "PERSONAL INFORMATION / CV",
"DG.Sheet.BlockHeaders.BondsRelationshipsContacts": "BONDS / RELATIONSHIPS / CONTACTS",
"DG.UnnaturalSheet.HideUntrainedSkillsLabel": "Hide Untrained",
"DG.UnnaturalSheet.NotesLabel": "Notes",
"DG.UnnaturalSheet.ShortDescriptionFallbackText": "Description of creature or creature type",
"DG.UnnaturalSheet.ShowUntrainedSkillsLabel": "Show Untrained",
"DG.UnnaturalSheet.Tabs.NotesTabLabel": "Skills & Notes",
"DG.UnnaturalSheet.Tabs.ItemsTabLabel": "Attacks & Abilities",
"DG.NPCSheet.BreakPointAbbreviation": "BP",
@@ -253,7 +263,11 @@
"DG.VehicleSheet.DescriptionPlaceHolder": "Vehicle Description",
"DG.Generic.CheckDamagedBondsBoxUntilNextHomeScene": "Check a damaged Bond's box until the next Home Scene ends.",
"DG.Generic.ClearAll": "Clear All",
"DG.Generic.ClearAll": "Clear Checks",
"DG.Generic.SanDamage": "SAN Damage"
"DG.Generic.SanDamage": "SAN Damage",
"DG.ItemWindow.Weapons.CustomSkillTarget": "Target",
"DG.ItemWindow.Weapons.SkillModifier": "Skill Modifier",
"DG.ItemWindow.Custom": "Custom"
}
+15 -2
View File
@@ -128,7 +128,6 @@
"DG.CV.NationalityPlaceholder": "Nacionalidad",
"DG.CV.Education": "Educación",
"DG.CV.EducationPlaceholder": "Educación o Entrenamiento",
"DG.CV.PhysicalDescriptionLabel": "Descripción Física/Notas",
"DG.Bonds.Bond": "Vínculo",
"DG.Bonds.Name": "Nombre",
@@ -227,6 +226,16 @@
"DG.TypeSkills.Subskills.Painting": "Cuadro",
"DG.Sheet.BlockHeaders.Attributes": "ATTRIBUTES",
"DG.Sheet.BlockHeaders.Statistics": "STATISTICS",
"DG.Sheet.BlockHeaders.PhysicalDescriptionNotes": "Descripción Física/Notas",
"DG.Sheet.BlockHeaders.SkillsAndTraining": "SKILLS AND TRAINING",
"DG.Sheet.BlockHeaders.Injuries": "INJURIES",
"DG.Sheet.BlockHeaders.BreakingPointAndAdaptations": "BREAKING POINT AND ADAPTATIONS",
"DG.Sheet.BlockHeaders.MotivationsAndDisorders": "MOTIVATIONS AND DISDORDERS",
"DG.Sheet.BlockHeaders.PersonalInfoCV": "PERSONAL INFORMATION / CV",
"DG.Sheet.BlockHeaders.BondsRelationshipsContacts": "BONDS / RELATIONSHIPS / CONTACTS",
"DG.UnnaturalSheet.HideUntrainedSkillsLabel": "Hide Untrained Skills",
"DG.UnnaturalSheet.NotesLabel": "Notes",
"DG.UnnaturalSheet.ShortDescriptionFallbackText": "Description of creature or creature type",
@@ -260,5 +269,9 @@
"DG.Generic.CheckDamagedBondsBoxUntilNextHomeScene": "Check a damaged Bond's box until the next Home Scene ends.",
"DG.Generic.ClearAll": "Clear All",
"DG.Generic.SanDamage": "SAN Damage"
"DG.Generic.SanDamage": "SAN Damage",
"DG.ItemWindow.Weapons.CustomSkillTarget": "Target",
"DG.ItemWindow.Weapons.SkillModifier": "Skill Modifier",
"DG.ItemWindow.Custom": "Custom"
}
+15 -2
View File
@@ -128,7 +128,6 @@
"DG.CV.NationalityPlaceholder": "国籍",
"DG.CV.Education": "教育",
"DG.CV.EducationPlaceholder": "教育",
"DG.CV.PhysicalDescriptionLabel": "身体的特徴とメモ",
"DG.Bonds.Bond": "絆",
"DG.Bonds.Name": "名前",
@@ -227,6 +226,16 @@
"DG.TypeSkills.Subskills.Painting": "ペインティング",
"DG.Sheet.BlockHeaders.Attributes": "ATTRIBUTES",
"DG.Sheet.BlockHeaders.Statistics": "STATISTICS",
"DG.Sheet.BlockHeaders.PhysicalDescriptionNotes": "身体的特徴とメモ",
"DG.Sheet.BlockHeaders.SkillsAndTraining": "SKILLS AND TRAINING",
"DG.Sheet.BlockHeaders.Injuries": "INJURIES",
"DG.Sheet.BlockHeaders.BreakingPointAndAdaptations": "BREAKING POINT AND ADAPTATIONS",
"DG.Sheet.BlockHeaders.MotivationsAndDisorders": "MOTIVATIONS AND DISDORDERS",
"DG.Sheet.BlockHeaders.PersonalInfoCV": "PERSONAL INFORMATION / CV",
"DG.Sheet.BlockHeaders.BondsRelationshipsContacts": "BONDS / RELATIONSHIPS / CONTACTS",
"DG.UnnaturalSheet.HideUntrainedSkillsLabel": "持たないスキルを表示しない",
"DG.UnnaturalSheet.NotesLabel": "ノート",
"DG.UnnaturalSheet.ShortDescriptionFallbackText": "外見・種類・など",
@@ -249,5 +258,9 @@
"DG.Generic.CheckDamagedBondsBoxUntilNextHomeScene": "すぎのホーム・シーヌまで、傷つけた絆のボックスにチェクを",
"DG.Generic.ClearAll": "全てのチェックを消す",
"DG.Generic.SanDamage": "SAN ダメージ"
"DG.Generic.SanDamage": "SAN ダメージ",
"DG.ItemWindow.Weapons.CustomSkillTarget": "ターゲット",
"DG.ItemWindow.Weapons.SkillModifier": "ターゲットに加えて",
"DG.ItemWindow.Custom": "カスタム"
}
+14 -2
View File
@@ -115,7 +115,6 @@
"DG.CV.NationalityPlaceholder": "Nacionalidade",
"DG.CV.Education": "Educação",
"DG.CV.EducationPlaceholder": "Educação ou Treinamento",
"DG.CV.PhysicalDescriptionLabel": "Descrição Física/Notas",
"DG.Bonds.Bond": "Vínculo",
"DG.Bonds.Name": "Nome",
"DG.Bonds.Score": "Pontuação",
@@ -199,6 +198,17 @@
"DG.RollMode": "Modo de Rolagem",
"DG.Bonds.Relationship": "Relacionamento",
"DG.TypeSkills.Subskills.Painting": "Pintura",
"DG.Sheet.BlockHeaders.Attributes": "ATTRIBUTES",
"DG.Sheet.BlockHeaders.Statistics": "STATISTICS",
"DG.Sheet.BlockHeaders.PhysicalDescriptionNotes": "Descrição Física/Notas",
"DG.Sheet.BlockHeaders.SkillsAndTraining": "SKILLS AND TRAINING",
"DG.Sheet.BlockHeaders.Injuries": "INJURIES",
"DG.Sheet.BlockHeaders.BreakingPointAndAdaptations": "BREAKING POINT AND ADAPTATIONS",
"DG.Sheet.BlockHeaders.MotivationsAndDisorders": "MOTIVATIONS AND DISDORDERS",
"DG.Sheet.BlockHeaders.PersonalInfoCV": "PERSONAL INFORMATION / CV",
"DG.Sheet.BlockHeaders.BondsRelationshipsContacts": "BONDS / RELATIONSHIPS / CONTACTS",
"DG.UnnaturalSheet.HideUntrainedSkillsLabel": "Esconder Habilidade não Treinadas",
"DG.UnnaturalSheet.NotesLabel": "Notas",
"DG.UnnaturalSheet.ShortDescriptionFallbackText": "Descrição de Criatura ou Tipo de Criatura",
@@ -215,5 +225,7 @@
"DG.Generic.CheckDamagedBondsBoxUntilNextHomeScene": "Check a damaged Bond's box until the next Home Scene ends.",
"DG.Generic.ClearAll": "Clear All",
"DG.Generic.SanDamage": "SAN Damage"
"DG.Generic.SanDamage": "SAN Damage",
"DG.Generic.Custom": "Custom"
}
+100 -138
View File
@@ -1,10 +1,10 @@
/* globals $ game Roll ChatMessage AudioHelper ActorSheet mergeObject Dialog TextEditor ActiveEffect ui duplicate fromUuidSync */
import {
sendPercentileTestToChat,
sendLethalityTestToChat,
sendDamageRollToChat,
showModifyPercentileTestDialogue,
showModifyDamageRollDialogue,
sendSanityDamageToChat
DGPercentileRoll,
DGLethalityRoll,
DGDamageRoll,
DGSanityDamageRoll,
} from "../roll/roll.js"
/**
* Extend the basic ActorSheet with some very simple modifications
@@ -99,8 +99,6 @@ export class DeltaGreenActorSheet extends ActorSheet {
// Iterate through items, allocating to containers
// let totalWeight = 0;
for (let i of sheetData.items) {
let item = i;
i.img = i.img || DEFAULT_TOKEN;
// Append to armor.
if (i.type === 'armor') {
armor.push(i);
@@ -142,21 +140,30 @@ export class DeltaGreenActorSheet extends ActorSheet {
// This only exists to give a chance to activate the modifier dialogue if desired
// Cannot seem to trigger the event on a right-click, so unfortunately only applies to a shift-click currently.
luckRollOnClick(event, actor, label){
async luckRollOnClick(event){
if(event && event.which === 2){
// probably don't want rolls to trigger from a middle mouse click so just kill it here
return;
}
let requestedModifyRoll = (event && event.shiftKey || event.which === 3);
let target = 50;
if(requestedModifyRoll){
showModifyPercentileTestDialogue(actor, label, target, false);
const rollOptions = {
rollType: "luck",
key: "luck",
actor: this.actor,
}
else{
sendPercentileTestToChat(actor, label, target, game.settings.get("core", "rollMode"));
}
// Create a default 1d100 roll just in case.
let roll = new DGPercentileRoll("1D100", {}, rollOptions);
// Open dialog if user requests it.
if (event.shiftKey || event.which === 3) {
const dialogData = await roll.showDialog();
if (!dialogData) return;
roll.modifier += dialogData.targetModifier;
roll.options.rollMode = dialogData.rollMode;
}
// Evaluate the roll.
await roll.evaluate({ async: true });
// Send the roll to chat.
roll.toChat();
}
activeEffectTest(sheet){
@@ -211,8 +218,9 @@ export class DeltaGreenActorSheet extends ActorSheet {
});
// Rollable abilities - bind to everything with the 'Rollable' class
//html.find('.rollable').click(this._onRoll.bind(this));
html.find('.rollable').mouseup(this._onRoll.bind(this));
html.find('.rollable').click(this._onRoll.bind(this));
html.find('.toggle-untrained').click(() => this.actor.update({"system.showUntrainedSkills": !this.actor.system.showUntrainedSkills}));
// Macro for toggling an item's equipped state
html.find('.equipped-item').mousedown(this._onEquippedStatusChange.bind(this));
@@ -560,16 +568,17 @@ export class DeltaGreenActorSheet extends ActorSheet {
};
if(type == "weapon"){
itemData.system.skill = "firearms"; //default skill to firearms, since that will be most common
itemData.system.expense = "Standard";
//itemData.system.skill = "firearms"; //default skill to firearms, since that will be most common
//itemData.system.expense = "Standard";
}
else if(type == "armor"){
itemData.system.armor = 3;
itemData.system.expense = "Standard";
//itemData.system.armor = 3;
//itemData.system.expense = "Standard";
}
else if(type == "bond"){
// try to default bonds for an agent to their current CHA
itemData.system.score = this.object.system.statistics.cha.value; // Can vary, but at character creation starting bond score is usually agent's charisma
itemData.img = "icons/svg/mystery-man.svg"
//itemData.img = "icons/svg/mystery-man.svg"
}
// create the item
@@ -578,133 +587,86 @@ export class DeltaGreenActorSheet extends ActorSheet {
/**
* Handle clickable rolls.
*
* @param {Event} event The originating click event
* @async
* @private
*/
_onRoll(event) {
async _onRoll(event) {
event.preventDefault();
const element = event.currentTarget;
const dataset = element.dataset;
const { dataset } = element;
if(event && event.which === 2){
if(event && event.which === 2) {
// probably don't want rolls to trigger from a middle mouse click so just kill it here
return;
}
if (dataset.roll) {
let key = dataset.label ? dataset.label : '';
let label = dataset.label ? `${dataset.label}` : '';
let targetVal = "";
let rollType = dataset.rolltype ? dataset.rolltype : '';
let isDamageRoll = false;
let isLethalityRoll = false;
let isSanityDamageRoll = false;
// if shift-click or right click, bring up roll editor dialog
let requestedModifyRoll = (event && event.shiftKey || event.which === 3); //(event && (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey));
const item = this.actor.items.get(dataset.iid);
const rollOptions = {
rollType: dataset.rolltype,
key: dataset.key,
actor: this.actor,
item
}
// check the 'data-target="something" property to determine how to grab the target for the roll
if(rollType === "skill" || rollType === "typeskill"){
targetVal = dataset.target;
label = game.i18n.localize(label).toUpperCase();
}
else if(rollType === "weaponskill"){
targetVal = dataset.target;
// some weapons randomly can just use dexterity x5, so try to trap on that
// otherwise roll a regular skill test
if(targetVal === "dex"){
label = game.i18n.localize("DG.Attributes.dex").toUpperCase() + "x5";
targetVal = this.actor.system.statistics.dex.x5;
}
else if(targetVal === "int"){
label = game.i18n.localize("DG.Attributes.int").toUpperCase() + "x5";
targetVal = this.actor.system.statistics.int.x5;
}
else if(targetVal === "str"){
label = game.i18n.localize("DG.Attributes.str").toUpperCase() + "x5";
targetVal = this.actor.system.statistics.str.x5;
}
else if(targetVal === "con"){
label = game.i18n.localize("DG.Attributes.con").toUpperCase() + "x5";
targetVal = this.actor.system.statistics.con.x5;
}
else if(targetVal === "pow"){
label = game.i18n.localize("DG.Attributes.pow").toUpperCase() + "x5";
targetVal = this.actor.system.statistics.pow.x5;
}
else if(targetVal === "cha"){
label = game.i18n.localize("DG.Attributes.cha").toUpperCase() + "x5";
targetVal = this.actor.system.statistics.cha.x5;
}
else{
label = game.i18n.localize("DG.Skills." + targetVal).toUpperCase();
targetVal = this.actor.system.skills[targetVal].proficiency;
}
}
else if(dataset.target === "statistic.x5"){
let stat = this.actor.system.statistics[key];
targetVal = stat.x5;
label = game.i18n.localize("DG.Attributes." + key).toUpperCase() + "x5";
}
else if(rollType === "sanity"){
targetVal = this.actor.system.sanity.value;
label = game.i18n.localize("DG.Attributes.SAN").toUpperCase();
}
else if(rollType === "damage"){
// damage roll, not a skill check
isDamageRoll = true;
label = dataset.label ? dataset.label : '';
}
else if(rollType === "lethality"){
// a lethality roll
isLethalityRoll = true;
targetVal = dataset.target;
}
else if(rollType === 'sanity-damage'){
isSanityDamageRoll = true;
}
if(isDamageRoll){
let diceFormula = dataset.roll;
let skillType = dataset.skill ? dataset.skill : '';
if(this.actor.type === 'agent' && (skillType === 'unarmed_combat' || skillType === 'melee_weapons')){
// Create a default 1d100 roll just in case.
let roll = new Roll("1d100", {});
switch (dataset.rolltype) {
case "stat":
case "skill":
case "sanity":
case "weapon":
roll = new DGPercentileRoll("1D100", {}, rollOptions);
break;
case "lethality":
roll = new DGLethalityRoll("1D100", {}, rollOptions)
break;
case "damage": {
let diceFormula = item.system.damage;
const { skill } = item.system;
if(this.actor.type === 'agent' && (skill === 'unarmed_combat' || skill === 'melee_weapons')){
diceFormula += this.actor.system.statistics.str.meleeDamageBonusFormula;
}
if(requestedModifyRoll){
showModifyDamageRollDialogue(this.actor, label, diceFormula);
}
else{
sendDamageRollToChat(this.actor, label, diceFormula, game.settings.get("core", "rollMode"));
}
roll = new DGDamageRoll(diceFormula, {}, rollOptions)
break;
}
else if(isSanityDamageRoll){
let lowRollFormula = dataset.roll;
let highRollFormula = dataset.roll2;
sendSanityDamageToChat(this.actor, label, lowRollFormula, highRollFormula, game.settings.get("core", "rollMode"))
}
else{
if(requestedModifyRoll){
showModifyPercentileTestDialogue(this.actor, label, targetVal, isLethalityRoll);
}
else{
if(isLethalityRoll)
{
sendLethalityTestToChat(this.actor, label, targetVal, game.settings.get("core", "rollMode"));
}
else{
sendPercentileTestToChat(this.actor, label, targetVal, game.settings.get("core", "rollMode"));
}
}
case "sanity-damage":{
const { successLoss, failedLoss } = this.actor.system.sanity;
const combinedFormula = `{${successLoss}, ${failedLoss}}`;
roll = new DGSanityDamageRoll(combinedFormula, {}, rollOptions);
break;
}
default:
break;
}
return this.processRoll(event, roll, rollOptions)
}
/**
* Show a dialog for the roll and then send to chat.
* Broke this logic out from `_onRoll()` so that other files can call it,
* namely the macro logic.
*
* @param {Event} event The originating click event
* @param {Event} roll The roll to show a dialog for and then send to chat.
* @async
*/
async processRoll(event, roll) {
// Open dialog if user requests it (no dialog for Sanity Damage rolls)
if ((event.shiftKey || event.which === 3) && !(roll instanceof DGSanityDamageRoll)) {
const dialogData = await roll.showDialog();
if (!dialogData) return;
if (dialogData.newFormula) {
roll = new DGDamageRoll(dialogData.newFormula, {}, roll.options)
}
roll.modifier += dialogData.targetModifier;
roll.options.rollMode = dialogData.rollMode;
}
// Evaluate the roll.
await roll.evaluate({ async: true });
// Send the roll to chat.
return roll.toChat();
}
_resetBreakingPoint(event){
@@ -873,7 +835,7 @@ export class DeltaGreenActorSheet extends ActorSheet {
// This is from Foundry. It will get the item data from the event.
const dragData = TextEditor.getDragEventData(event);
// Make sure that we are dragging an item, otherwise this doesn't make sense.
if (dragData.type = "Item") {
if (dragData.type === "Item") {
const item = fromUuidSync(dragData.uuid);
await item.delete()
}
@@ -883,6 +845,6 @@ export class DeltaGreenActorSheet extends ActorSheet {
activateEditor(target, editorOptions, initialContent) {
editorOptions.content_css = "./systems/deltagreen/css/editor.css";
return super.activateEditor(target, editorOptions, initialContent);
};
}
}
+4
View File
@@ -73,6 +73,10 @@ export class DeltaGreenActor extends Actor {
system.sanity.max = 99 - system.skills.unnatural.proficiency;
system.wp.max = system.statistics.pow.value;
system.health.max = Math.ceil((system.statistics.con.value + system.statistics.str.value) / 2);
system.skills.ritual = {
label: "Ritual",
proficiency: 99 - system.sanity.value,
+97 -40
View File
@@ -1,13 +1,15 @@
/* globals $ Hooks game CONFIG Actors Items ActorSheet ItemSheet Handlebars Macro ChatMessage ui duplicate */
// Import Modules
import { DeltaGreenActor } from "./actor/actor.js";
import { DeltaGreenActorSheet } from "./actor/actor-sheet.js";
import { DeltaGreenItem } from "./item/item.js";
import { DeltaGreenItemSheet } from "./item/item-sheet.js";
import { sendPercentileTestToChat, sendLethalityTestToChat, sendDamageRollToChat } from "./roll/roll.js";
import * as DGRolls from "./roll/roll.js";
import { registerSystemSettings } from "./settings.js"
import { preloadHandlebarsTemplates } from "./templates.js";
import { ParseDeltaGreenStatBlock } from "./other/stat-parser-macro.js";
import { localizeWithFallback } from "./other/utility-functions.js";
import DGUtils from "./other/utility-functions.js";
Hooks.once('init', async function() {
@@ -29,6 +31,9 @@ Hooks.once('init', async function() {
decimals: 0
};
// Register custom dice rolls
Object.values(DGRolls).forEach((cls) => CONFIG.Dice.rolls.push(cls))
// Register System Settings
registerSystemSettings();
@@ -47,7 +52,7 @@ Hooks.once('init', async function() {
// Add Handlebars helpers
Handlebars.registerHelper('localizeWithFallback', function(value, fallbackValue) {
return localizeWithFallback(value, fallbackValue);
return DGUtils.localizeWithFallback(value, fallbackValue);
});
Handlebars.registerHelper('concat', function() {
@@ -98,7 +103,7 @@ Hooks.once('init', async function() {
});
Handlebars.registerHelper('cite_ahb', function(page) {
return "See page " + str(page) + " of the Agent's Handbook.";
return `See page ${page} of the Agent's Handbook.`;
});
Handlebars.registerHelper('formatLethality', function(lethality) {
@@ -179,6 +184,9 @@ Hooks.once('init', async function() {
if(skill === 'dex'){
label = game.i18n.localize("DG.Attributes.dex");
}
if(skill === 'DG.Skills.custom'){
label = game.i18n.localize('DG.ItemWindow.Custom');
}
else{
label = game.i18n.localize("DG.Skills." + skill);
}
@@ -217,7 +225,10 @@ Hooks.once('init', async function() {
// generates the character sheet.
Handlebars.registerHelper('getFontFamilySystemSettingClass', function() {
let setting = game.settings.get("deltagreen", "characterSheetFont");
let characterSheetStyle = game.settings.get("deltagreen", "characterSheetStyle");
/*
if(setting === "TypeWriterCondensed"){
return "typewriter-condensed-font";
}
@@ -233,9 +244,37 @@ Hooks.once('init', async function() {
else if(setting === "SpecialElite"){
return "special-elite-font";
}
else if(setting === "PublicSans"){
return "public-sans-font";
}
else{
return "martel-font";
}
*/
/*
if(characterSheetStyle === "cowboy"){
return "special-elite-font";
}
else{
return "public-sans-font";
}
*/
});
Handlebars.registerHelper('getCharacterSheetStyle', function() {
let characterSheetStyle = game.settings.get("deltagreen", "characterSheetStyle");
if(characterSheetStyle === "cowboy"){
return "cowboy-style";
}
else if(characterSheetStyle === "outlaw"){
return "outlaw-style";
}
else{
return "program-style";
}
});
@@ -282,13 +321,15 @@ Hooks.once("ready", async function() {
Hooks.on("ready", ()=> {
let backgroundImageSetting = game.settings.get("deltagreen", "characterSheetBackgroundImageSetting");
//let backgroundImageSetting = game.settings.get("deltagreen", "characterSheetBackgroundImageSetting");
//let characterSheetStyle = game.settings.get("deltagreen", "characterSheetStyle");
let customCss = "";
//let customCss = "";
let customStyle = document.createElement("style");
customStyle.id = "dg-custom-css";
//let customStyle = document.createElement("style");
//customStyle.id = "dg-custom-css";
/*
if(backgroundImageSetting === "OldPaper1"){
customCss += `div.deltagreen.sheet.actor section.window-content{
background: url("systems/deltagreen/assets/img/old_paper.jpg") !important;
@@ -299,15 +340,46 @@ Hooks.on("ready", ()=> {
background-size: 100% !important;
}`;
}
*/
/*
if(characterSheetStyle === "cowboy"){
customCss += `div.deltagreen.sheet.actor section.window-content{
background: url("systems/deltagreen/assets/img/old_paper.jpg") !important;
}`;
}
else if(characterSheetStyle === "program"){
customCss += `div.deltagreen.sheet.actor section.window-content{
background: url("systems/deltagreen/assets/img/CrumpledPlainPaper10.webp") !important;
}`;
}
customStyle.innerHTML = customCss;
if(customCss != ""){
document.querySelector("head").appendChild(customStyle);
//document.querySelector("head").appendChild(customStyle);
}
*/
});
Hooks.on("preCreateItem", (item) => {
console.log("preCreateItem");
console.log(item.img);
console.log(item.type);
if(item.img === 'icons/svg/item-bag.svg'){
if(item.type === 'bond'){
item.updateSource({ img: 'systems/deltagreen/assets/icons/person-black-bg.svg'});
}
else{
item.updateSource({ img: 'systems/deltagreen/assets/icons/swap-bag-black-bg.svg'});
}
}
});
Hooks.on("renderSidebarTab", async (app, html) => {
if (app.options.id == "actors") {
let button = $("<button class='import-cd'><i class='fas fa-file-import'></i> Parse Stat Block</button>")
@@ -326,9 +398,9 @@ Hooks.on('createActor', async function(actor, options, userId){
// use this to trap on if this hook is firing for the same user that triggered the create
// can put logic specific to a particular user session below
if (userId != game.user.id) { return; };
if (userId !== game.user.id) return;
if(actor != null){
if (actor !== null){
if(actor.type === 'agent'){
// update the default type skill of Art - Painting's labels to try to be localized
@@ -348,7 +420,7 @@ Hooks.on('createActor', async function(actor, options, userId){
actor.AddUnarmedAttackItemIfMissing();
}
else if(actor.type === 'unnatural'){
// Do nothing.
}
else if(actor.type === 'vehicle'){
actor.AddBaseVehicleItemsIfMissing();
@@ -374,14 +446,16 @@ Hooks.on('createActor', async function(actor, options, userId){
* @returns {Promise}
*/
async function createDeltaGreenMacro(data, slot) {
// Definitely should not be doing assignments in conditionals but if we fix this, it breaks macro creation.
// eslint-disable-next-line no-cond-assign
if (data.type = "Item" && data.itemData.type !== "weapon") return;
//if (!("data" in data)) return ui.notifications.warn("You can only create macro buttons for owned Items");
const item = data.itemData.system;
const item = data.itemData;
// Create the macro command
let command = '// Uncomment line below to also roll skill check if desired.'
command += '\n' + `//game.deltagreen.rollItemSkillCheckMacro("${data._id}");`;
command += '\n' + `game.deltagreen.rollItemMacro("${data._id}");`;
command += '\n' + `//game.deltagreen.rollItemSkillCheckMacro("${item._id}");`;
command += '\n' + `game.deltagreen.rollItemMacro("${item._id}");`;
//let macro = game.macros.entities.find(m => (m.name === data.name) && (m.command === command));
//if (!macro) {
@@ -422,7 +496,7 @@ async function rollItemMacro(itemId) {
if (!item) return ui.notifications.warn(`Your controlled Actor does not have an item named ${itemId}`);
// Trigger the item roll
let r = await item.roll();
const r = await item.roll();
return r;
}
@@ -433,7 +507,7 @@ function rollItemSkillCheckMacro(itemId) {
if (speaker.token) actor = game.actors.tokens[speaker.token];
if (!actor) actor = game.actors.get(speaker.actor);
if(!actor) return ui.notifications.warn('Must have an Actor selected first.');
if (!actor) return ui.notifications.warn('Must have an Actor selected first.');
let item = actor ? actor.items.find(i => i._id === itemId) : null;
@@ -442,22 +516,12 @@ function rollItemSkillCheckMacro(itemId) {
item = actor ? actor.items.find(i => i.name === itemId) : null;
}
if (!item) return ui.notifications.warn(`Your controlled Actor does not have an item '${itemName}'`);
if (!item) return ui.notifications.warn(`Your controlled Actor does not have an item '${item.name}'`);
let skillName = item.system.skill.toString();
let skill = actor.system.skills[skillName];
let translatedSkillLabel = "";
try{
translatedSkillLabel = game.i18n.localize("DG.Skills." + skillName)
}
catch{
translatedSkillLabel = skillName;
}
sendPercentileTestToChat(actor, translatedSkillLabel, skill.proficiency);
}
const roll = new DGRolls.DGPercentileRoll("1D100", {}, { rollType: "weapon", key: skillName, actor, item });
return actor.sheet.processRoll({}, roll)}
function rollSkillMacro(skillName) {
const speaker = ChatMessage.getSpeaker();
@@ -471,14 +535,7 @@ function rollSkillMacro(skillName) {
if(!skill) return ui.notifications.warn('Bad skill name passed to macro.');
let translatedSkillLabel = "";
try{
translatedSkillLabel = game.i18n.localize("DG.Skills." + skillName)
}
catch{
translatedSkillLabel = skillName;
}
sendPercentileTestToChat(actor, translatedSkillLabel, skill.proficiency);
const roll = new DGRolls.DGPercentileRoll("1D100", {}, { rollType: "skill", key: skillName, actor });
actor.sheet.processRoll({}, roll)
// sendPercentileTestToChat(actor, translatedSkillLabel, skill.proficiency);
}
+1 -1
View File
@@ -9,7 +9,7 @@ export class DeltaGreenItemSheet extends ItemSheet {
return mergeObject(super.defaultOptions, {
classes: ["deltagreen", "sheet", "item"],
width: 520,
height: 480,
height: 600,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "attributes" }]
});
}
+11 -9
View File
@@ -1,4 +1,6 @@
import { sendPercentileTestToChat, sendLethalityTestToChat, sendDamageRollToChat } from "../roll/roll.js"
/* globals Item */
import { DGDamageRoll, DGLethalityRoll } from "../roll/roll.js";
/**
* Extend the basic Item with some very simple modifications.
@@ -24,24 +26,24 @@ export class DeltaGreenItem extends Item {
*/
async roll() {
// Basic template rendering data
const item = this;
const { actor } = this;
const actorSystemData = this.actor.system || {};
if(item.system.isLethal){
sendLethalityTestToChat(this.actor, item.name, item.system.lethality, game.settings.get("core", "rollMode"))
}
else{
let roll;
if (item.system.isLethal) {
roll = new DGLethalityRoll("1D100", {}, { rollType: "lethality", actor, item })
} else {
// regular damage roll
let diceFormula = item.system.damage;
let skillType = item.system.skill;
if(skillType === 'unarmed_combat' || skillType === 'melee_weapons'){
if (skillType === 'unarmed_combat' || skillType === 'melee_weapons') {
diceFormula += actorSystemData.statistics.str.meleeDamageBonusFormula;
}
sendDamageRollToChat(this.actor, item.name, diceFormula);
roll = new DGDamageRoll(diceFormula, {}, { rollType: "damage", actor, item })
}
return actor.sheet.processRoll({}, roll);
}
}
+36 -20
View File
@@ -1,24 +1,40 @@
// Attempt to localize a keyword, and gracefully fallback to something else if the key does not exist.
// This way people using incomplete translations will not as many crashes or bugs when playing against a newly updated system.
export function localizeWithFallback(key, fallback){
try{
let translatedValue = game.i18n.localize(key);
/* globals game */
if(translatedValue != key){
return translatedValue;
}
else{
console.warn(`Untranslated localization key '${key}'.`);
// can't have single quotes in a handlebars string literal input, so sort of hack in an escape character for them.
fallback = fallback.replace("&#39;", "'");
return fallback;
}
}
catch(ex){
console.warn(ex);
return fallback;
export default class DGUtils {
/**
* Attempt to localize a keyword, and gracefully fallback to something else if the key does not exist.
* This way people using incomplete translations will not as many crashes or bugs when playing against a newly updated system.
*
* @param {String} key - localization key
* @param {String} fallback - string to fall back to if translation does not exist for key
* @returns
*/
static localizeWithFallback(key, fallback){
try {
let translatedValue = game.i18n.localize(key);
if (translatedValue != key) {
return translatedValue;
} else {
console.warn(`Untranslated localization key '${key}'.`);
// can't have single quotes in a handlebars string literal input, so sort of hack in an escape character for them.
fallback = fallback.replace("&#39;", "'");
return fallback;
}
} catch(ex) {
console.warn(ex);
return fallback;
}
}
/**
* Format a number with a leading plus.
*
* @param {Number} number
* @returns {String} - the stringified number with a leading plus if applicable
*
*/
static formatStringWithLeadingPlus(number){
return number > 0 ? `+${number}` : number.toString() ;
}
}
+562 -439
View File
File diff suppressed because it is too large Load Diff
+98 -69
View File
@@ -1,74 +1,103 @@
export const registerSystemSettings = function() {
game.settings.register('deltagreen', 'characterSheetFont', {
name: "World Font Choice",
hint: "Choose font style for use throughout this world.",
scope: "world", // This specifies a world-stored setting
config: true, // This specifies that the setting appears in the configuration view
type: String,
choices: { // If choices are defined, the resulting setting will be a select menu
"SpecialElite": "Special Elite (Classic Typewriters Font)",
"Martel": "Martel (Clean Modern Font)",
"Signika": "Signika (Foundry Default Font)",
"TypeWriterCondensed": "Condensed Typewriter (Modern, Small Typewriter Font)"
//"atwriter": "Another Typewriter (Alternate Old-style Typewriter Font)"
},
default: "SpecialElite", // The default value for the setting
onChange: value => { // A callback function which triggers when the setting is changed
//console.log(value)
}
});
export const registerSystemSettings = function () {
game.settings.register("deltagreen", "characterSheetStyle", {
name: "Character Sheet Style",
hint: "Choose how actor sheets should be styled. 'Program' is a more modern government style, where 'Cowboy/Outlaw' is an older, grittier looking typewriter style.",
scope: "world", // This specifies a world-stored setting
config: true, // This specifies that the setting appears in the configuration view
requiresReload: true,
type: String,
choices: {
// If choices are defined, the resulting setting will be a select menu
cowboy: "The Cowboys",
outlaw: "The Outlaws",
program: "The Program",
},
default: "program", // The default value for the setting
onChange: (value) => {
// A callback function which triggers when the setting is changed
//console.log(value)
},
});
game.settings.register('deltagreen', 'characterSheetBackgroundImageSetting', {
name: "World Sheet Background Image",
hint: "Choose background image for use throughout this world. (Refresh page to see change.)",
scope: "world", // This specifies a world-stored setting
config: true, // This specifies that the setting appears in the configuration view
type: String,
choices: { // If choices are defined, the resulting setting will be a select menu
"OldPaper1": "Old Dirty Paper (Good with Special Elite Font)",
"IvoryPaper": "Ivory White Paper (Good with Martel Font)",
"DefaultParchment": "Default Parchment (Good with Signika Font)"
},
default: "OldPaper1", // The default value for the setting
onChange: value => { // A callback function which triggers when the setting is changed
//console.log(value)
}
});
game.settings.register("deltagreen", "keepSanityPrivate", {
name: "Keep Sanity Private",
hint: "Hide sanity from players on both character sheet and rolls.",
scope: "world",
config: true,
type: Boolean,
default: false,
});
game.settings.register('deltagreen', 'keepSanityPrivate', {
name: "Keep Sanity Private",
hint: "Hide sanity from players on both character sheet and rolls.",
scope: "world",
config: true,
type: Boolean,
default: false
});
game.settings.register("deltagreen", "skillImprovementFormula", {
name: "Default Skill Improvement Roll",
hint: " Default 1d4. There have been multiple errata on this, choose which fits best for the pace of your game.",
scope: "world", // This specifies a world-stored setting
config: true, // This specifies that the setting appears in the configuration view
type: String,
choices: {
// If choices are defined, the resulting setting will be a select menu
1: "Flat +1",
"1d3": "+1D3%",
"1d4": "+1D4%",
"1d4-1": "+1D4-1%",
},
default: "1d4", // The default value for the setting, per the most recent errata.
onChange: (value) => {
// A callback function which triggers when the setting is changed
//console.log(value)
},
});
game.settings.register('deltagreen', 'skillImprovementFormula', {
name: "Default Skill Improvement Roll",
hint: " Default 1d4. There have been multiple errata on this, choose which fits best for the pace of your game.",
scope: "world", // This specifies a world-stored setting
config: true, // This specifies that the setting appears in the configuration view
type: String,
choices: { // If choices are defined, the resulting setting will be a select menu
"1": "Flat +1",
"1d3": "+1D3%",
"1d4": "+1D4%",
"1d4-1": "+1D4-1%"
},
default: "1d4", // The default value for the setting, per the most recent errata.
onChange: value => { // A callback function which triggers when the setting is changed
//console.log(value)
}
});
game.settings.register('deltagreen', 'showImpossibleLandscapesContent', {
name: "Show Impossible Landscapes Content",
hint: "Show Impossible Landscapes-specific fields from character sheets.",
scope: "world",
config: true,
type: Boolean,
default: true
});
// These two settings are obsolete now
game.settings.register("deltagreen", "showImpossibleLandscapesContent", {
name: "Show Impossible Landscapes Content",
hint: "Show Impossible Landscapes-specific fields from character sheets.",
scope: "world",
config: true,
type: Boolean,
default: true,
});
}
game.settings.register("deltagreen", "characterSheetFont", {
name: "World Font Choice",
hint: "Choose font style for use throughout this world.",
scope: "world", // This specifies a world-stored setting
config: false, // This specifies that the setting appears in the configuration view
type: String,
choices: {
// If choices are defined, the resulting setting will be a select menu
SpecialElite: "Special Elite (Classic Typewriters Font)",
Martel: "Martel (Clean Modern Font)",
Signika: "Signika (Foundry Default Font)",
TypeWriterCondensed:
"Condensed Typewriter (Modern, Small Typewriter Font)",
PublicSans: "Public Sans (US Government-style sans serif font)",
//"atwriter": "Another Typewriter (Alternate Old-style Typewriter Font)"
},
default: "SpecialElite", // The default value for the setting
onChange: (value) => {
// A callback function which triggers when the setting is changed
//console.log(value)
},
});
game.settings.register("deltagreen", "characterSheetBackgroundImageSetting", {
name: "World Sheet Background Image",
hint: "Choose background image for use throughout this world. (Refresh page to see change.)",
scope: "world", // This specifies a world-stored setting
config: false, // This specifies that the setting appears in the configuration view
type: String,
choices: {
// If choices are defined, the resulting setting will be a select menu
OldPaper1: "Old Dirty Paper (Good with Special Elite Font)",
IvoryPaper: "Ivory White Paper (Good with Martel Font)",
DefaultParchment: "Default Parchment (Good with Signika Font)",
},
default: "OldPaper1", // The default value for the setting
onChange: (value) => {
// A callback function which triggers when the setting is changed
//console.log(value)
},
});
};
+3 -1
View File
@@ -537,10 +537,12 @@
"base"
],
"skill": "",
"skillModifier": 0,
"customSkillTarget": 50,
"range": "10M",
"damage": "1D8",
"armorPiercing": 0,
"lethality": 0,
"lethality": 10,
"isLethal": false,
"killRadius": "N/A",
"ammo": "",
+58 -50
View File
@@ -1,10 +1,10 @@
<form class="{{cssClass}} {{getFontFamilySystemSettingClass}} flexcol" autocomplete="off">
<form class="{{cssClass}} {{getCharacterSheetStyle}} flexcol" autocomplete="off">
{{!-- Sheet Header --}}
<header class="sheet-header">
<div class="header-fields">
{{!-- <div class="horizontal-bar-section-header"><h1>DELTA GREEN</h1></div> --}}
{{!-- Name, Profession, Portrait --}}
<div class="flexrow">
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="150" width="100"/>
@@ -49,7 +49,7 @@
{{!-- Sanity --}}
<div class="resource-outer-grid-1col">
<label for="system.san.value" class="resource-label rollable"
data-rolltype="sanity" data-roll="d100" data-target="sanity" data-label="SAN" title="{{localize 'DG.Tooltip.SanityLabel'}}"
data-rolltype="sanity" title="{{localize 'DG.Tooltip.SanityLabel'}}"
>{{localize 'DG.Attributes.SAN' }} <i class="fas fa-dice"></i></label>
<div class="resource-inner-grid-3col">
@@ -91,13 +91,17 @@
<section class="sheet-body">
{{!-- Skills Tab --}}
<div class="tab skills" data-group="primary" data-tab="skills">
<div class="tab skills" data-group="primary" data-tab="skills" >
<div class="horizontal-bar-section-divider">
<span>{{localize "DG.Sheet.BlockHeaders.SkillsAndTraining"}}</span>
</div>
<div class="grid grid-3col">
{{#each actor.system.skills as |skill key|}}
<div class="flexrow flex-group-center">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-rolltype="skill" data-roll="d100" data-target="{{skill.proficiency}}" data-label="{{localize (concat 'DG.Skills.' key)}}" for="system.skills.{{key}}.value"
<div class="flexrow flex-group-center flex-thin-border">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-key="{{key}}" data-rolltype="skill" for="system.skills.{{key}}.value"
{{#if skill.proficiency}}title="{{localize 'DG.Tooltip.SkillLabel'}}"{{/if}}
{{#unless skill.proficiency}}title="{{localize 'DG.Tooltip.CannotRollSkillLabel'}}"{{/unless}}
>
@@ -140,8 +144,8 @@
</div>
<div class="grid-2col">
{{#each actor.system.typedSkills as |skill key|}}
<div class="item flexrow flex-group-center">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-rolltype="skill" data-roll="d100" data-target="{{skill.proficiency}}" data-label="{{skill.label}}"
<div class="item flexrow flex-group-center flex-thin-border">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-key="{{key}}" data-rolltype="skill" data-roll="d100" data-target="{{skill.proficiency}}" data-label="{{skill.label}}"
{{#if skill.proficiency}}title="{{localize 'DG.Tooltip.SkillLabel'}}"{{/if}}
{{#unless skill.proficiency}}title="{{localize 'DG.Tooltip.CannotRollSkillLabel'}}"{{/unless}}
>
@@ -161,14 +165,18 @@
{{!-- Physical Statistics like STR, CON, etc. --}}
<div class="tab physical" data-group="primary" data-tab="physical">
<div class="horizontal-bar-section-divider">
<span>{{localize "DG.Sheet.BlockHeaders.Attributes"}}</span>
</div>
<div class="grid grid-3col">
{{#each actor.system.statistics as |statistic key|}}
<div class="flex-group-center">
<div class="flex-group-center flex-mid-border">
<div class="">
<div class="physical-stats-outer-grid-3col">
<label class="rollable" data-rolltype="statistic.x5" data-roll="d100" data-target="statistic.x5" data-label="{{key}}" title="{{localize 'DG.Tooltip.x5AttributeLabel'}}" for="system.statistics.{{key}}.value" class="resource-label">{{localize (concat 'DG.Attributes.' key)}}</label>
<label class="rollable resource-label" data-rolltype="stat" data-key="{{key}}" title="{{localize 'DG.Tooltip.x5AttributeLabel'}}" for="system.statistics.{{key}}.value">{{localize (concat 'DG.Attributes.' key)}}</label>
<input type="text" name="system.statistics.{{key}}.value" value="{{statistic.value}}" data-dtype="Number"/>
<span class="rollable" data-rolltype="statistic.x5" data-roll="d100" data-target="statistic.x5" data-label="{{key}}" title="{{localize 'DG.Tooltip.x5AttributeLabel'}}">({{numberFormat statistic.x5 decimals=0 sign=false}}%)</span>
<span class="rollable" data-rolltype="stat" data-key="{{key}}" title="{{localize 'DG.Tooltip.x5AttributeLabel'}}">({{numberFormat statistic.x5 decimals=0 sign=false}}%)</span>
</div >
<div >
<input type="text" name="system.statistics.{{key}}.distinguishing_feature" value="{{statistic.distinguishing_feature}}" data-dtype="String" title="{{localize 'DG.Tooltip.DistinguishingFeature'}}" />
@@ -177,6 +185,11 @@
</div>
{{/each}}
</div>
<br />
<div class="horizontal-bar-section-divider">
<span>{{localize "DG.Sheet.BlockHeaders.Injuries"}}</span>
</div>
<div>
<div class="first-aid-received-section resource">
<label class="bolded-label first-aid-label"
@@ -193,15 +206,18 @@
</div>
</div>
{{!-- Mental Tab (formerly 'Motivations') --}}
{{!-- Psychological Tab (formerly 'Mental', formerly 'Motivations') --}}
<div class="tab motivations" data-group="primary" data-tab="motivations">
<div class="horizontal-bar-section-divider">
<span>{{localize "DG.Sheet.BlockHeaders.BreakingPointAndAdaptations"}}</span>
</div>
<div class="">
<div class="breaking-point-grid-3col">
<label class="bolded-label">{{localize 'DG.Mental.BreakingPoint'}}</label>
<input class="centered-input-value" title="{{localize 'DG.Tooltip.BreakPoint'}}" type="text" name="system.sanity.currentBreakingPoint" value="{{actor.system.sanity.currentBreakingPoint}}" data-dtype="Number"/>
<a class="btn-tiny btn-reset-breaking-point" title="Reset breaking point to be current SAN - WP.">{{localize 'DG.Mental.Reset'}}</a>
</div>
<div class="">
<h4 class="bolded-label">{{localize 'DG.Mental.SanityLossIncidentsLabel'}}</h4>
<div class="adaptation-grid-5col">
@@ -236,6 +252,10 @@
</div>
</div>
<div class="horizontal-bar-section-divider">
<span>{{localize "DG.Sheet.BlockHeaders.MotivationsAndDisorders"}}</span>
</div>
<div>
<ol class="items-list">
@@ -279,7 +299,7 @@
<div class="tab items" data-group="primary" data-tab="gear">
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.Weapons'}}</span>
</div>
@@ -300,41 +320,27 @@
<li class="item flexrow" data-item-id="{{item._id}}">
<div
class="item-image rollable"
data-roll="d100"
data-rolltype="weaponskill"
data-target="{{item.system.skill}}"
data-label="{{localizeWeaponSkill item.system.skill}}"
class="flexrow rollable"
data-iid="{{item._id}}"
data-rolltype="weapon"
data-key="{{item.system.skill}}"
title="{{localize 'DG.Tooltip.SkillLabel'}} ({{localizeWeaponSkill item.system.skill}})"
><img src="{{item.img}}" width="24" height="24"/></div>
><img class="item-image" src="{{item.img}}" width="24" height="24"/>
<h4 style="word-wrap: break-word;"
class="item-name rollable"
data-roll="d100"
data-rolltype="weaponskill"
data-target="{{item.system.skill}}"
data-label="{{localizeWeaponSkill item.system.skill}}"
title="{{localize 'DG.Tooltip.SkillLabel'}} ({{localizeWeaponSkill item.system.skill}})"
>
<h4 style="word-wrap: break-word;" class="item-name">
{{item.name}}
</h4>
</div>
<span class = "centered-item-property">
{{#unless item.system.isLethal}}
<span class="rollable"
data-rolltype="damage"
data-target="damage"
data-label="{{toUpperCase item.name}}"
data-roll="{{toUpperCase item.system.damage}}"
data-skill="{{item.system.skill}}"
>
{{toUpperCase item.system.damage}}{{#if_eq item.system.skill 'unarmed_combat'}}{{actor.system.statistics.str.meleeDamageBonusFormula}}{{/if_eq}}{{#if_eq item.system.skill 'melee_weapons'}}{{actor.system.statistics.str.meleeDamageBonusFormula}}{{/if_eq}}</span>
<span class="rollable" data-rolltype="damage" data-iid="{{item._id}}">
{{toUpperCase item.system.damage}}{{#if_eq item.system.skill 'unarmed_combat'}}{{actor.system.statistics.str.meleeDamageBonusFormula}}{{/if_eq}}{{#if_eq item.system.skill 'melee_weapons'}}{{actor.system.statistics.str.meleeDamageBonusFormula}}{{/if_eq}}
</span>
{{/unless}}
{{#if item.system.isLethal}}
<span class="rollable" data-rolltype="lethality" data-target="{{item.system.lethality}}" data-label="{{item.name}}" data-roll="d100"
<span class="rollable" data-rolltype="lethality" data-iid="{{item._id}}"
title="{{localize 'DG.ItemWindow.Weapons.LethalityTooltip'}}">
{{item.system.lethality}}%</span>
{{/if}}
@@ -349,7 +355,6 @@
{{/if}}
</span>
<span class="centered-item-property">{{item.system.armorPiercing}}</span>
<div class="item-controls">
@@ -365,7 +370,7 @@
</div>
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.Armor'}}</span>
</div>
@@ -409,15 +414,15 @@
</div>
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.OtherGear'}}</span>
</div>
<ol class="items-list">
<li class="item flexrow item-header">
<div class="item-image"></div>
<div class="item-name">{{localize 'DG.Gear.Name'}}</div>
<div class="item-name"></div>
<div style="min-width: 55%;" class="item-name">{{localize 'DG.Gear.Name'}}</div>
<span class="centered-item-property">{{localize 'DG.Gear.Equipped'}}</span>
<div class="item-controls">
<a class="item-control item-create" title="Create item" data-type="gear"><i class="fas fa-plus"></i> {{localize 'DG.Generic.AddButtonLabel'}}</a>
@@ -425,13 +430,12 @@
</li>
{{#each actor.items as |item id|}}
{{#if_eq item.type 'gear'}}
<li class="item flexrow" data-item-id="{{item.id}}">
<div class="item-image"><img src="{{item.img}}" title="{{item.name}}" width="24" height="24"/></div>
<h4 style="word-wrap: break-word;" class="item-name">{{item.name}}</h4>
<span></span> <!-- This is just here to get things to align nicely with the other sections-->
<h4 style="word-wrap: break-word; min-width: 55%;" class="item-name">{{item.name}}</h4>
<span class="equipped-item centered-item-property" data-id="{{item.id}}" title="{{localize 'DG.Tooltip.ToggleEquippedState'}}" >
@@ -456,16 +460,20 @@
</div>
</div>
{{!-- Biography Tab --}}
{{!-- PERSONAL (Biography) Tab --}}
<div class="tab bio" data-group="primary" data-tab="bio">
<div class="horizontal-bar-section-divider">
<span>{{localize "DG.Sheet.BlockHeaders.PersonalInfoCV"}}</span>
</div>
{{> "systems/deltagreen/templates/actor/cv-partial.html" }}
</div>
{{!-- Bonds Tab --}}
<div class="tab bonds" data-group="primary" data-tab="bonds">
<div class="bonds-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize "DG.Sheet.BlockHeaders.BondsRelationshipsContacts"}}</span>
</div>
<div>
<ol class="items-list">
<li class="item flexrow item-header">
+5 -2
View File
@@ -45,8 +45,11 @@
{{/if}}
<div style="padding: 2px; margin-bottom: 5px;">
<span class="physical-description-label">{{localize 'DG.CV.PhysicalDescriptionLabel'}}</span>
{{!-- <div style="padding: 2px; margin-bottom: 5px;"> --}}
<div class="horizontal-bar-section-divider">
<span class="">{{localize "DG.Sheet.BlockHeaders.PhysicalDescriptionNotes"}}</span>
</div>
<div class="editor-host">
+1 -1
View File
@@ -1,4 +1,4 @@
<form class="{{cssClass}} {{getFontFamilySystemSettingClass}} flexcol" autocomplete="off">
<form class="{{cssClass}} {{getCharacterSheetStyle}} flexcol" autocomplete="off">
{{!-- Sheet Header --}}
<header class="sheet-header">
+64 -44
View File
@@ -1,4 +1,4 @@
<form class="{{cssClass}} {{getFontFamilySystemSettingClass}} flexcol" autocomplete="off">
<form class="{{cssClass}} {{getCharacterSheetStyle}} flexcol" autocomplete="off">
{{!-- Sheet Header --}}
<header class="sheet-header">
@@ -17,7 +17,7 @@
</div>
</div>
<div class="resources grid grid-3col">
<div class="resources grid grid-3col bottom-margin-5px">
{{!-- HP --}}
<div class="resource-outer-grid-1col">
@@ -25,7 +25,10 @@
<div class="resource-inner-grid-3col">
<input type="text" name="system.health.value" value="{{actor.system.health.value}}" data-dtype="Number"/>
<span> / </span>
<input type="text" name="system.health.max" value="{{actor.system.health.max}}" data-dtype="Number"/>
<!-- <input type="text" name="system.health.max" value="{{actor.system.health.max}}" data-dtype="Number"/> -->
<div class="max-resource-value" title="{{localize 'DG.Tooltip.MaximumHP'}}">
<div>{{numberFormat actor.system.health.max decimals=0 sign=false}}</div>
</div>
</div>
</div>
@@ -35,14 +38,17 @@
<div class="resource-inner-grid-3col">
<input type="text" name="system.wp.value" value="{{actor.system.wp.value}}" data-dtype="Number"/>
<span> / </span>
<input type="text" name="system.wp.max" value="{{actor.system.wp.max}}" data-dtype="Number"/>
<!-- <input type="text" name="system.wp.max" value="{{actor.system.wp.max}}" data-dtype="Number"/> -->
<div class="max-resource-value" title="{{localize 'DG.Tooltip.MaximumWP'}}">
<div>{{numberFormat actor.system.wp.max decimals=0 sign=false}}</div>
</div>
</div>
</div>
{{!-- Sanity --}}
<div class="resource-outer-grid-1col">
<label for="system.wp.value" class="resource-label rollable"
data-rolltype="sanity" data-roll="d100" data-target="sanity" data-label="SAN" title="{{localize 'DG.Tooltip.SanityLabel'}}"
data-rolltype="sanity" title="{{localize 'DG.Tooltip.SanityLabel'}}"
>{{localize 'DG.Attributes.SAN' }}</label>
<div class="resource-inner-grid-3col">
<input type="text" name="system.sanity.value" value="{{actor.system.sanity.value}}" data-dtype="Number" title="{{localize 'DG.Tooltip.CurrentSanityPartOne'}}{{actor.system.sanity.currentBreakingPoint}}{{localize 'DG.Tooltip.CurrentSanityPartTwo'}}" />
@@ -52,18 +58,19 @@
</div>
</div>
<br>
{{!-- Physical Statistics like STR, CON, etc. --}}
<div class="">
<div class="horizontal-bar-section-divider">
<span>{{localize "DG.Sheet.BlockHeaders.Statistics"}}</span>
</div>
<div class="grid grid-3col">
{{#each actor.system.statistics as |statistic key|}}
<div class="flex-group-center">
<div class="flex-group-center flex-mid-border">
<div class="">
<div class="physical-stats-outer-grid-3col">
<label class="rollable" data-rolltype="statistic.x5" data-roll="d100" data-target="statistic.x5" data-label="{{key}}" title="{{localize 'DG.Tooltip.x5AttributeLabel'}}" for="system.statistics.{{key}}.value" class="resource-label">{{localize (concat 'DG.Attributes.' key)}}</label>
<label class="rollable resource-label" data-rolltype="stat" data-key="{{key}}" title="{{localize 'DG.Tooltip.x5AttributeLabel'}}" for="system.statistics.{{key}}.value">{{localize (concat 'DG.Attributes.' key)}}</label>
<input type="text" name="system.statistics.{{key}}.value" value="{{statistic.value}}" data-dtype="Number"/>
<span >({{numberFormat statistic.x5 decimals=0 sign=false}}%)</span>
<span class="rollable" data-rolltype="stat" data-key="{{key}}" title="{{localize 'DG.Tooltip.x5AttributeLabel'}}">({{numberFormat statistic.x5 decimals=0 sign=false}}%)</span>
</div >
{{!-- <div> <input type="text" name="system.statistics.{{key}}.distinguishing_feature" value="{{statistic.distinguishing_feature}}" data-dtype="String" title="{{localize 'DG.Tooltip.DistinguishingFeature'}}" /> </div> --}}
</div>
@@ -86,19 +93,27 @@
<section class="sheet-body">
{{!-- Descriptions/Notes/Skills Tab --}}
<div class="tab skills top-div-border" data-group="primary" data-tab="skills">
{{!-- Checkbox to hide/show skills that are at zero --}}
<div>
<span class="resource-label" for="system.showUntrainedSkills">{{localize 'DG.UnnaturalSheet.HideUntrainedSkillsLabel'}}:</label>
<input class="labeled-resource-checkbox" type="checkbox" name="system.showUntrainedSkills" {{checked actor.system.showUntrainedSkills}} data-dtype="Boolean" />
<div class="tab skills" data-group="primary" data-tab="skills">
<div class="horizontal-bar-section-divider contains-hide-button">
<span class="contains-hide-button-title">
{{localize "DG.Sheet.BlockHeaders.SkillsAndTraining"}}
{{!-- Checkbox to hide/show skills that are at zero --}}
</span>
<a class="toggle-untrained">
{{#if actor.system.showUntrainedSkills}}
{{localize 'DG.UnnaturalSheet.ShowUntrainedSkillsLabel'}}
{{else}}
{{localize 'DG.UnnaturalSheet.HideUntrainedSkillsLabel'}}
{{/if}}&nbsp;
<i class="far fa-eye{{#if actor.system.showUntrainedSkills}}-slash{{/if}}"></i>
</a>
</div>
<div class="grid grid-3col">
{{#each actor.system.skills as |skill key|}}
{{#if (hideSkillBasedOnProficiencyAndUserChoice ../actor.system.showUntrainedSkills skill.proficiency)}}
<div class="flexrow flex-group-center">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-rolltype="skill" data-roll="d100" data-target="{{skill.proficiency}}" data-label="{{localize (concat 'DG.Skills.' key)}}" for="system.skills.{{key}}.value"
<div class="flexrow flex-group-center flex-thin-border">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-rolltype="skill" data-key="{{key}}" for="system.skills.{{key}}.value"
{{#if skill.proficiency}}title="{{localize 'DG.Tooltip.SkillLabel'}}"{{/if}}
{{#unless skill.proficiency}}title="{{localize 'DG.Tooltip.CannotRollSkillLabel'}}"{{/unless}}
>
@@ -119,8 +134,8 @@
<div class="grid-2col">
{{#each actor.system.typedSkills as |skill key|}}
{{#if (hideSkillBasedOnProficiencyAndUserChoice ../actor.system.showUntrainedSkills skill.proficiency)}}
<div class="item flexrow flex-group-center">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-rolltype="skill" data-roll="d100" data-target="{{skill.proficiency}}" data-label="{{skill.label}}"
<div class="item flexrow flex-group-center flex-thin-border">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-rolltype="skill" data-roll="d100" data-target="{{skill.proficiency}}" data-key="{{key}}"
{{#if skill.proficiency}}title="{{localize 'DG.Tooltip.SkillLabel'}}"{{/if}}
{{#unless skill.proficiency}}title="{{localize 'DG.Tooltip.CannotRollSkillLabel'}}"{{/unless}}
>
@@ -129,6 +144,7 @@
<input class="percentile-skill-input" type="text" name="system.typedSkills.{{key}}.proficiency" value="{{skill.proficiency}}" data-dtype="Number"/>
<div class="item-controls">
<a class="item-control typed-skill-edit" title="Edit Skill"><i class="fas fa-edit" data-typedskill="{{key}}" ></i></a>
<a class="item-control typed-skill-delete" title="Delete Skill"><i class="fas fa-trash" data-typedskill="{{key}}" ></i></a>
</div>
</div>
@@ -152,7 +168,7 @@
<div class="tab items" data-group="primary" data-tab="gear">
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.Weapons'}}</span>
</div>
@@ -175,34 +191,38 @@
<div class="item-image"><img src="{{item.img}}" title="{{item.name}}" width="24" height="24"/></div>
<h4 style="word-wrap: break-word;"
class="item-name rollable"
data-roll="d100"
data-rolltype="weaponskill"
data-target="{{item.system.skill}}"
data-label="{{localizeWeaponSkill item.system.skill}}"
data-rolltype="weapon"
data-key="{{item.system.skill}}"
data-iid="{{item._id}}"
title="{{localize 'DG.Tooltip.SkillLabel'}} ({{localizeWeaponSkill item.system.skill}})"
>
{{item.name}}
</h4>
{{#unless item.system.isLethal}}
<span class="rollable centered-item-property"
data-rolltype="damage"
data-target="damage"
data-label="{{toUpperCase item.name}}"
data-roll="{{toUpperCase item.system.damage}}"
data-skill="{{item.system.skill}}"
>
{{toUpperCase item.system.damage}}</span>
{{/unless}}
<span class="centered-item-property">
{{#unless item.system.isLethal}}
<span class="rollable" data-rolltype="damage" data-iid="{{item._id}}">
{{toUpperCase item.system.damage}}
</span>
{{/unless}}
{{#if item.system.isLethal}}
<span class="rollable" data-rolltype="lethality" data-label="{{item.name}}" data-iid="{{item._id}}"
title="{{localize 'DG.ItemWindow.Weapons.LethalityTooltip'}}"
>{{formatLethality item.system.lethality}}</span>
{{/if}}
{{#if item.system.lethality}}
-
{{#if item.system.isLethal}}
<a class="item-control toggle-lethality dg-red" title="Toggle Lethality (Current Lethality: {{item.system.lethality}}%)"><i class="fas fa-skull-crossbones" item-id="{{item.id}}" is-lethal="true"></i></a>
{{else}}
<a class="item-control toggle-lethality" title="Toggle Lethality (Currently No Lethality)"><i class="fas fa-user-injured" item-id="{{item.id}}" is-lethal="false"></i></a>
{{/if}}
{{/if}}
</span>
{{#if item.system.isLethal}}
<span class="rollable centered-item-property" data-rolltype="lethality" data-target="{{item.system.lethality}}" data-label="{{item.name}}" data-roll="d100"
title="{{localize 'DG.ItemWindow.Weapons.LethalityTooltip'}}"
>{{formatLethality item.system.lethality}}</span>
{{/if}}
<span class="centered-item-property">{{item.system.armorPiercing}}</span>
@@ -219,7 +239,7 @@
</div>
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.Armor'}}</span>
</div>
@@ -263,7 +283,7 @@
</div>
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.OtherGear'}}</span>
</div>
+56 -41
View File
@@ -1,4 +1,4 @@
<form class="{{cssClass}} {{getFontFamilySystemSettingClass}} flexcol" autocomplete="off">
<form class="{{cssClass}} {{getCharacterSheetStyle}} flexcol" autocomplete="off">
{{!-- Sheet Header --}}
<header class="sheet-header">
@@ -17,7 +17,7 @@
</div>
</div>
<div class="resources grid grid-3col">
<div class="resources grid grid-3col bottom-margin-5px">
{{!-- HP --}}
<div class="resource-outer-grid-1col">
@@ -41,7 +41,7 @@
{{!-- Sanity Damage --}}
<div class="resource-outer-grid-1col">
<label for="system.wp.value" class="resource-label rollable" data-roll="{{actor.system.sanity.successLoss}}" data-roll2="{{actor.system.sanity.failedLoss}}" data-rolltype="sanity-damage">{{localize 'DG.Attributes.SAN'}} <i class="fas fa-dice"></i></label>
<label class="resource-label rollable" data-rolltype="sanity-damage">{{localize 'DG.Attributes.SAN'}} <i class="fas fa-dice"></i></label>
<div class="resource-inner-grid-3col">
<input type="text" name="system.sanity.successLoss" value="{{actor.system.sanity.successLoss}}" />
<span> / </span>
@@ -50,18 +50,21 @@
</div>
</div>
<br>
{{!-- Physical Statistics like STR, CON, etc. --}}
<div class="">
<div class="horizontal-bar-section-divider">
<span>{{localize "DG.Sheet.BlockHeaders.Statistics"}}</span>
</div>
<div class="grid grid-3col">
{{#each actor.system.statistics as |statistic key|}}
<div class="flex-group-center">
<div class="flex-group-center flex-mid-border">
<div class="">
<div class="physical-stats-outer-grid-3col">
<label class="rollable" data-rolltype="statistic.x5" data-roll="d100" data-target="statistic.x5" data-label="{{key}}" for="system.statistics.{{key}}.value" class="resource-label">{{localize (concat 'DG.Attributes.' key)}}</label>
<label class="rollable resource-label" data-rolltype="stat" data-key="{{key}}" for="system.statistics.{{key}}.value">{{localize (concat 'DG.Attributes.' key)}}</label>
<input type="text" name="system.statistics.{{key}}.value" value="{{statistic.value}}" data-dtype="Number"/>
<span >({{numberFormat statistic.x5 decimals=0 sign=false}}%)</span>
<span class="rollable" data-rolltype="stat" data-key="{{key}}" title="{{localize 'DG.Tooltip.x5AttributeLabel'}}">({{numberFormat statistic.x5 decimals=0 sign=false}}%)</span>
</div >
</div>
</div>
@@ -83,19 +86,27 @@
<section class="sheet-body">
{{!-- Descriptions/Notes/Skills Tab --}}
<div class="tab skills top-div-border" data-group="primary" data-tab="skills">
{{!-- Checkbox to hide/show skills that are at zero --}}
<div>
<span class="resource-label" for="system.showUntrainedSkills">{{localize 'DG.UnnaturalSheet.HideUntrainedSkillsLabel'}}:</label>
<input class="labeled-resource-checkbox" type="checkbox" name="system.showUntrainedSkills" {{checked actor.system.showUntrainedSkills}} data-dtype="Boolean" />
<div class="tab skills" data-group="primary" data-tab="skills">
<div class="horizontal-bar-section-divider contains-hide-button">
<span class="contains-hide-button-title">
{{localize "DG.Sheet.BlockHeaders.SkillsAndTraining"}}
{{!-- Checkbox to hide/show skills that are at zero --}}
</span>
<a class="toggle-untrained">
{{#if actor.system.showUntrainedSkills}}
{{localize 'DG.UnnaturalSheet.ShowUntrainedSkillsLabel'}}
{{else}}
{{localize 'DG.UnnaturalSheet.HideUntrainedSkillsLabel'}}
{{/if}}&nbsp;
<i class="far fa-eye{{#if actor.system.showUntrainedSkills}}-slash{{/if}}"></i>
</a>
</div>
<div class="grid grid-3col">
{{#each actor.system.skills as |skill key|}}
{{#if (hideSkillBasedOnProficiencyAndUserChoice ../actor.system.showUntrainedSkills skill.proficiency)}}
<div class="flexrow flex-group-center">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-rolltype="skill" data-roll="d100" data-target="{{skill.proficiency}}" data-label="{{localize (concat 'DG.Skills.' key)}}" for="system.skills.{{key}}.value"
<div class="flexrow flex-group-center flex-thin-border">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-rolltype="skill" data-roll="d100" data-key="{{key}}" for="system.skills.{{key}}.value"
{{#if skill.proficiency}}title="{{localize 'DG.Tooltip.SkillLabel'}}"{{/if}}
{{#unless skill.proficiency}}title="{{localize 'DG.Tooltip.CannotRollSkillLabel'}}"{{/unless}}
>
@@ -116,8 +127,8 @@
<div class="grid-2col">
{{#each actor.system.typedSkills as |skill key|}}
{{#if (hideSkillBasedOnProficiencyAndUserChoice ../actor.system.showUntrainedSkills skill.proficiency)}}
<div class="item flexrow flex-group-center">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-rolltype="skill" data-roll="d100" data-target="{{skill.proficiency}}" data-label="{{skill.label}}"
<div class="item flexrow flex-group-center flex-thin-border">
<label class="{{if_gt skill.proficiency 0 'rollable' 'not-rollable'}} skill-label" data-rolltype="skill" data-key="{{key}}"
{{#if skill.proficiency}}title="{{localize 'DG.Tooltip.SkillLabel'}}"{{/if}}
{{#unless skill.proficiency}}title="{{localize 'DG.Tooltip.CannotRollSkillLabel'}}"{{/unless}}
>
@@ -126,6 +137,7 @@
<input class="percentile-skill-input" type="text" name="system.typedSkills.{{key}}.proficiency" value="{{skill.proficiency}}" data-dtype="Number"/>
<div class="item-controls">
<a class="item-control typed-skill-edit" title="Edit Skill"><i class="fas fa-edit" data-typedskill="{{key}}" ></i></a>
<a class="item-control typed-skill-delete" title="Delete Skill"><i class="fas fa-trash" data-typedskill="{{key}}" ></i></a>
</div>
</div>
@@ -149,7 +161,7 @@
<div class="tab items" data-group="primary" data-tab="gear">
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.Weapons'}}</span>
</div>
@@ -172,34 +184,37 @@
<div class="item-image"><img src="{{item.img}}" title="{{item.name}}" width="24" height="24"/></div>
<h4 style="word-wrap: break-word;"
class="item-name rollable"
data-roll="d100"
data-rolltype="weaponskill"
data-target="{{item.system.skill}}"
data-label="{{localizeWeaponSkill item.system.skill}}"
data-rolltype="weapon"
data-key="{{item.system.skill}}"
data-iid="{{item._id}}"
title="{{localize 'DG.Tooltip.SkillLabel'}} ({{localizeWeaponSkill item.system.skill}})"
>
{{item.name}}
</h4>
{{#unless item.system.isLethal}}
<span class="rollable centered-item-property"
data-rolltype="damage"
data-target="damage"
data-label="{{toUpperCase item.name}}"
data-roll="{{toUpperCase item.system.damage}}"
data-skill="{{item.system.skill}}"
>
{{toUpperCase item.system.damage}}</span>
{{/unless}}
<span class="centered-item-property">
{{#unless item.system.isLethal}}
<span class="rollable" data-rolltype="damage" data-iid="{{item._id}}">
{{toUpperCase item.system.damage}}
</span>
{{/unless}}
{{#if item.system.isLethal}}
<span class="rollable centered-item-property" data-rolltype="lethality" data-target="{{item.system.lethality}}" data-label="{{item.name}}" data-roll="d100"
title="{{localize 'DG.ItemWindow.Weapons.LethalityTooltip'}}"
>{{formatLethality item.system.lethality}}</span>
{{/if}}
{{#if item.system.isLethal}}
<span class="rollable" data-rolltype="lethality" data-iid="{{item._id}}"
title="{{localize 'DG.ItemWindow.Weapons.LethalityTooltip'}}"
>{{formatLethality item.system.lethality}}</span>
{{/if}}
{{#if item.system.lethality}}
-
{{#if item.system.isLethal}}
<a class="item-control toggle-lethality dg-red" title="Toggle Lethality (Current Lethality: {{item.system.lethality}}%)"><i class="fas fa-skull-crossbones" item-id="{{item.id}}" is-lethal="true"></i></a>
{{else}}
<a class="item-control toggle-lethality" title="Toggle Lethality (Currently No Lethality)"><i class="fas fa-user-injured" item-id="{{item.id}}" is-lethal="false"></i></a>
{{/if}}
{{/if}}
</span>
<span class="centered-item-property">{{item.system.armorPiercing}}</span>
@@ -216,7 +231,7 @@
</div>
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.Armor'}}</span>
</div>
@@ -260,7 +275,7 @@
</div>
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.OtherGear'}}</span>
</div>
+3 -3
View File
@@ -1,4 +1,4 @@
<form class="{{cssClass}} {{getFontFamilySystemSettingClass}} flexcol" autocomplete="off">
<form class="{{cssClass}} {{getCharacterSheetStyle}} flexcol" autocomplete="off">
{{!-- Sheet Header --}}
<header class="sheet-header">
@@ -62,7 +62,7 @@
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.Armor'}}</span>
</div>
@@ -106,7 +106,7 @@
</div>
<div>
<div class="gear-section-header">
<div class="horizontal-bar-section-divider">
<span>{{localize 'DG.Gear.OtherGear'}}</span>
</div>
+2 -2
View File
@@ -24,8 +24,8 @@
<input class="numeric-label-field" type="number" name="targetModifier" value="{{data.targetModifier}}" title="{{localize 'DG.ModifySkillRollDialogue.ModifierTooltip'}}" />
</div>
<label for="targetRollMode">{{ localize "DG.RollMode" }}:</label>
<select name="targetRollMode">
<label for="rollMode">{{ localize "DG.RollMode" }}:</label>
<select name="rollMode">
{{selectOptions (getAvailableRollModes) selected=(getDefaultRollMode) localize=true}}
</select>
</div>
+1 -1
View File
@@ -1,4 +1,4 @@
<form class="{{cssClass}} {{getFontFamilySystemSettingClass}}" autocomplete="off">
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
<header class="">
<div class="armor-sheet-grid-2col">
+1 -1
View File
@@ -1,4 +1,4 @@
<form class="{{cssClass}} {{getFontFamilySystemSettingClass}}" autocomplete="off">
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
<header class="">
<div class="bond-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
+1 -1
View File
@@ -1,4 +1,4 @@
<form class="{{cssClass}} {{getFontFamilySystemSettingClass}}" autocomplete="off">
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
<header class="">
<div class="gear-sheet-grid-2col">
+1 -1
View File
@@ -1,4 +1,4 @@
<form class="{{cssClass}} {{getFontFamilySystemSettingClass}}" autocomplete="off">
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
+34 -18
View File
@@ -1,4 +1,4 @@
<form class="{{cssClass}} {{getFontFamilySystemSettingClass}}" autocomplete="off">
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
<header class="">
<div class="weapon-sheet-grid-2col">
@@ -24,7 +24,7 @@
</div>
</div>
<div class="weapon-sheet-outer-grid-2col">
<div class="weapon-sheet-horizontal-grid-left-2col">
@@ -44,22 +44,41 @@
<option {{#if_eq item.system.skill 'int'}}selected{{/if_eq}} value="int">{{localize 'DG.Attributes.int'}}x5</option>
<option {{#if_eq item.system.skill 'pow'}}selected{{/if_eq}} value="pow">{{localize 'DG.Attributes.pow'}}x5</option>
<option {{#if_eq item.system.skill 'cha'}}selected{{/if_eq}} value="cha">{{localize 'DG.Attributes.cha'}}x5</option>
</select>
<option {{#if_eq item.system.skill 'custom'}}selected{{/if_eq}} value="custom">{{localize 'DG.ItemWindow.Custom'}}</option>
</select>
</div>
<div class="weapon-sheet-horizontal-grid-right-2col">
{{#if_eq item.system.skill 'custom'}}
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.CustomSkillTarget'}}:</span>
<input type="text" name="system.customSkillTarget" value="{{item.system.customSkillTarget}}" data-dtype="Number"/>
{{/if_eq}}
</div>
<!-- left 'column' (label and value)-->
<div class="weapon-sheet-horizontal-grid-left-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.ArmorPiercing'}}:</span>
<input type="text" name="system.armorPiercing" value="{{item.system.armorPiercing}}" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.SkillModifier'}}:</span>
<input type="text" name="system.skillModifier" value="{{item.system.skillModifier}}" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.IsLethality'}}:</span>
<input class="labeled-resource-checkbox" type="checkbox" name="system.isLethal" {{checked item.system.isLethal}} data-dtype="Boolean"
title="{{localize 'DG.ItemWindow.Weapons.IsLethalityTooltip'}}"
/>
/>
</div>
<!-- right 'column' (label and value)-->
<div class="weapon-sheet-horizontal-grid-right-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Range'}}:</span>
<input type="text" name="system.range" value="{{item.system.range}}" data-dtype="String"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.KillRadius'}}:</span>
<input type="text" name="system.killRadius" value="{{item.system.killRadius}}" data-dtype="String"/>
</div>
<div class="weapon-sheet-horizontal-grid-right-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Range'}}:</span>
<input type="text" name="system.range" value="{{item.system.range}}" data-dtype="String"/>
{{!-- If a weapon is 'Lethal', need to show the d100% Lethality input, otherwise only show the regular Damage formula (e.g. 1D6, 1D4+2, etc...) --}}
@@ -78,10 +97,7 @@
/>
{{/if}}
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.ArmorPiercing'}}:</span>
<input type="text" name="system.armorPiercing" value="{{item.system.armorPiercing}}" data-dtype="Number"/>
</div>
</div>
@@ -90,7 +106,7 @@
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Ammo'}}:</span>
<input type="text" name="system.ammo" value="{{item.system.ammo}}" data-dtype="String"/>
</div>
<br>
</header>
{{!-- Sheet Tab Navigation --}}
@@ -100,10 +116,10 @@
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body">
<section class="sheet-body" style="max-height: 25%;">
{{!-- Description Tab --}}
<div class="tab top-div-border" data-group="primary" data-tab="description">
<div class="tab" data-group="primary" data-tab="description">
{{editor enrichedDescription target="system.description" button=true owner=owner editable=editable}}
</div>
</section>