Squashed commit of the following:

commit cf7ce46860c97841018f0cc2af4be94ccfd3b44b
Merge: 8387e7a4c 5e54e9270
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Fri Oct 15 14:39:44 2021 -0500

    Merge branch 'master' into gg-rifts-1.2

commit 8387e7a4cd8e6ad197eac1ce2ab87c801320ed3e
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Fri Oct 15 14:21:00 2021 -0500

    changelog

commit 59a47bd058a095d00afde94a24569b9cf3773132
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Fri Oct 15 14:01:29 2021 -0500

    Add option to include IQ bonus on skill-based abilities

commit e412bbb33ca83160c978a72cf403e2297c4a44b4
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Mon Oct 4 18:39:02 2021 -0500

    Add initiative roll button that adds to the turn tracker, palladium style

commit 427d17f878883c7c335d257f5d0914034eed2b6e
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Mon Oct 4 12:00:02 2021 -0500

    Fix css on psi vs.

commit f86131f3c0b2c1590c9dce3f5b5c3d75a99eb1c9
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Mon Oct 4 11:51:04 2021 -0500

    Reorder range disarm modifier list

commit 8d2c1189b005db6f32760a5a316022cb310e1c8b
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Sun Oct 3 17:24:06 2021 -0500

    Add number of actions as title attribute for range attacks. Prompt for additional modifier on range disarm.

commit 388e195f952a16c1da32b0396490f9929878054d
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Sun Oct 3 14:02:06 2021 -0500

    Add other RPA and space fighter bonuses from Phase World

commit c6e6f4527295350819d6ed962b7053ea98d80a65
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Sun Oct 3 11:48:51 2021 -0500

    Various additions and fixes.
    - Add "ly" (Light Year) to distance units
    - Add RPA Elite: Silverhawk
    - Fix issue with skills not updating when character level changes
    - Fix issue with export of units (range, damage, dc, duration)

commit 17d45bb63cd181f6b0b0bf260eeafaa42a54a19f
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Sat Sep 25 11:29:35 2021 -0500

    css

commit 2aeb2b222eacb044f9b9b74ed91a1c1990dd0bea
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Fri Sep 24 14:45:31 2021 -0500

    burst to pulse/burst

commit 2f268bb15b6bec2f44dd42ab3622d07e0b4c446b
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Fri Sep 24 14:07:59 2021 -0500

    more css

commit d32a9f128512d54bedc6c509d722130a72d18a71
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Fri Sep 24 13:45:59 2021 -0500

    more css

commit 02c22a6a82b1d4ff9d2c3c06002938458b67c9a7
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Fri Sep 24 13:42:18 2021 -0500

    more css

commit 01ed9fdccb04c6de13543302fe3367dc97f37266
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Fri Sep 24 13:36:48 2021 -0500

    Better styling on active section

commit 378b1bb96f3707ce8d6baa32f4f99aaceb80a516
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Fri Sep 24 13:17:12 2021 -0500

    Fix text on strike: burst roll. Make Disease save a roll query

commit b9dd1ec8c3c21d8ac3139c270bd5ee3b7bf2d8bb
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 23 22:39:46 2021 -0500

    changelog

commit a7451df9ccf9497fa15b05f5fafb360a6a80e957
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 23 22:33:40 2021 -0500

    Reorganize bonus sections

commit 5235f0c7c59bb52a88e7ed6e9321dcebea74f3b2
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 23 21:51:21 2021 -0500

    Indentation

commit 96bee65c99a8cd0f2baa106393d35a072c043ec0
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 23 21:42:49 2021 -0500

    Fix some active profile rolls

commit be574eddb5f083abfbace0aacd06ed008efb58a4
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Wed Sep 22 11:05:18 2021 -0500

    Instructions fixes

commit a6fa6a26852838892543ec33149ef7ac204a1551
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Tue Sep 21 23:01:43 2021 -0500

    Changelog

commit e92804f65e2a5fa82d984254798d5c987dcdc6af
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Tue Sep 21 22:59:08 2021 -0500

    todo

commit 77d31e8f6d8238183219943a647769effad27522
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Tue Sep 21 22:58:49 2021 -0500

    Verbiage update to sheet.json

commit bb803ccefca9fa5acf49f73a029029370289cd02
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Tue Sep 21 22:57:21 2021 -0500

    Updated instructions

commit 9c12a4a9d14f32bbf56720bfb14a79061167749c
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Tue Sep 21 22:47:41 2021 -0500

    Continuing with instructions

commit eca16f5ac5c65c4df0c712828f8a273001d4671f
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Tue Sep 21 21:50:49 2021 -0500

    Beginning of better instructions. Make Active section more useable. Stylin'

commit d7d7be7a7db292ba04579ef888a3f8e34a1611fb
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Mon Sep 20 21:14:41 2021 -0500

    todo

commit e76c903507c60cc7f98046ff4da858740edbb48b
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Mon Sep 20 21:10:15 2021 -0500

    Update global active armor when active armor checkbox is changed

commit b30a1da92bab3025f03af8f699c38bb4a96b254e
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Mon Sep 20 20:52:08 2021 -0500

    Change `currentmdc` and `basemdc` armor attributes to `mdc` and `mdc_max` respectively, including migration

commit 2c671ffc772856239b62c40b5702c6bf532eab73
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Mon Sep 20 19:11:44 2021 -0500

    comments and docs

commit 7aab9fa82a017e790c9c4cfe36d3ec6de6b04ba8
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Mon Sep 20 19:10:07 2021 -0500

    Add active.html

commit cca10d4ed0d691d0e1eeec5e51b5bb287cc0a4ed
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Mon Sep 20 19:09:45 2021 -0500

    Add global profile and armor section for easier use with roll20 Attributes / token bar/bubble

commit 125ba567f46acb60b6491b64fcde3b614c8403f6
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Mon Sep 20 16:00:55 2021 -0500

    Change overflow:scroll to overflow:auto

commit 0c1e2b6f56c1e21d8b746fa5b822507bd47d4c92
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Sat Sep 18 23:08:35 2021 -0500

    changelog

commit b8bd1fddb9f7a32c9121fa6bbb9bf72898d01f52
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Sat Sep 18 23:07:41 2021 -0500

    Move combat section above attributes section in profiles

commit a23f92a60c2f95166edfb977f2c899c3bfc0b77f
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Sat Sep 18 23:04:40 2021 -0500

    Add hand-to-hand from GM guide

commit 0575e6443d8aa2d18e834ec9e5d0550dc45a314e
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Sat Sep 18 21:29:00 2021 -0500

    Update changelog

commit 4b480140f6
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Fri Sep 17 15:09:07 2021 -0500

    Factor spell strength from h2h:dragon

commit ad29a22c6b
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 16 21:51:06 2021 -0500

    Add Racial and Other skill categories. Add Break Fall defense bonus. Make h2h import/exportable. Add Aikido.

commit 35ed811836
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 16 20:07:47 2021 -0500

    Add H2H:Dragon and RPA Combat

commit 18929e169c
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 16 19:04:26 2021 -0500

    Allow custom H2H

commit 8a330a565c
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 16 18:39:40 2021 -0500

    Update H2H when character level changes

commit 8eb17bb24f
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 16 18:31:55 2021 -0500

    Add hand-to-hand selector and calculator. Change WPs tab to Combat Skills

commit fdfd938367
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 9 22:11:33 2021 -0500

    Fix issue with absolute value calculation in profile

commit cc9abf73de
Author: Garth Gutenberg <garth.gutenberg@gmail.com>
Date:   Thu Sep 9 16:36:46 2021 -0500

    Prompt for gunfire dodge penalty if option is enabled
This commit is contained in:
Garth Gutenberg
2021-10-15 14:43:07 -05:00
parent 5e54e92704
commit 1e23cef655
30 changed files with 15606 additions and 5282 deletions
@@ -4,6 +4,34 @@
### Added
- Prompt for gunfire dodge penalty if option is enabled
- Add hand-to-hand selector and calculator
- Add RPA Combat selector and calculator
- Add "Racial" and "Other" skill categories
- Add Break Fall defense bonus
- Add Body Block/Tackle, Leg Hook, and Backward Sweep Kick bonuses
- Global Active Profile and Active Armor section
- Add "ly" (Light Years) to distance units
- Add number of actions as title attribute for range attacks
- Add initiative roll button that adds to turn tracker, Palladium style (requires `dup-turn` API script)
- Add option to include IQ bonus on skill-based abilities
### Changed
- Fix issue with absolute value calculation in profile
- Change "WPs" tab to "Combat Skills"
- Move Combat section above Attributes section in profile
- Change `currentmdc` and `basemdc` armor attributes to `mdc` and `mdc_max` respectively, including migration
- Change readonly spans from `overflow:scroll` to `overflow:auto` to get rid of the non-functional scrollbars on Windows
- Moved all instructions to the Options tab and updated them / made them more thorough
- Reorganized Ancient and Modern bonus sections
- Fix text on `strike: burst` roll
- Make Disease save a roll query
- Fix issue with skills not updating when character level changes
- Fix issue with export of units (range, damage, dc, duration)
- Prompt for additional modifier on range disarm
- Styling changes/fixes
## [1.1.0] - 2021-09-06
### Added
+115 -23
View File
@@ -62,6 +62,7 @@ a {
.withoutavatars .sheet-rolltemplate-strike,
.withoutavatars .sheet-rolltemplate-goe,
.withoutavatars .sheet-rolltemplate-skill,
.withoutavatars .sheet-rolltemplate-initiative,
.withoutavatars .sheet-rolltemplate-custom {
margin-left: -7px;
}
@@ -70,12 +71,14 @@ a {
.sheet-rolltemplate-strike,
.sheet-rolltemplate-goe,
.sheet-rolltemplate-skill,
.sheet-rolltemplate-initiative,
.sheet-rolltemplate-custom {
margin-left: -37px;
}
.sheet-rolltemplate-strike .sheet-container,
.sheet-rolltemplate-goe .sheet-container,
.sheet-rolltemplate-skill .sheet-container,
.sheet-rolltemplate-initiative .sheet-container,
.sheet-rolltemplate-custom .sheet-container {
border: 1px solid;
/* by default, the border is the same color as the header. You can change this here, e.g. to black */
@@ -86,12 +89,14 @@ a {
.sheet-rolltemplate-strike .sheet-container.sheet-color-red,
.sheet-rolltemplate-goe .sheet-container.sheet-color-red,
.sheet-rolltemplate-skill .sheet-container.sheet-color-red,
.sheet-rolltemplate-initiative .sheet-container.sheet-color-red,
.sheet-rolltemplate-custom .sheet-container.sheet-color-red {
--header-bg-color: #f00;
}
.sheet-rolltemplate-strike .sheet-container.sheet-color-green,
.sheet-rolltemplate-goe .sheet-container.sheet-color-green,
.sheet-rolltemplate-skill .sheet-container.sheet-color-green,
.sheet-rolltemplate-initiative .sheet-container.sheet-color-green,
.sheet-rolltemplate-custom .sheet-container.sheet-color-green {
--header-bg-color: #0f0;
--header-text-color: #000;
@@ -99,6 +104,7 @@ a {
.sheet-rolltemplate-strike .sheet-header,
.sheet-rolltemplate-goe .sheet-header,
.sheet-rolltemplate-skill .sheet-header,
.sheet-rolltemplate-initiative .sheet-header,
.sheet-rolltemplate-custom .sheet-header {
background-color: var(--header-bg-color);
/* change text-align to center to center the header text */
@@ -109,18 +115,21 @@ a {
.sheet-rolltemplate-strike .sheet-title,
.sheet-rolltemplate-goe .sheet-title,
.sheet-rolltemplate-skill .sheet-title,
.sheet-rolltemplate-initiative .sheet-title,
.sheet-rolltemplate-custom .sheet-title {
font-size: 1.1em;
}
.sheet-rolltemplate-strike .sheet-subtitle,
.sheet-rolltemplate-goe .sheet-subtitle,
.sheet-rolltemplate-skill .sheet-subtitle,
.sheet-rolltemplate-initiative .sheet-subtitle,
.sheet-rolltemplate-custom .sheet-subtitle {
font-size: 0.9em;
}
.sheet-rolltemplate-strike .sheet-content,
.sheet-rolltemplate-goe .sheet-content,
.sheet-rolltemplate-skill .sheet-content,
.sheet-rolltemplate-initiative .sheet-content,
.sheet-rolltemplate-custom .sheet-content {
display: grid;
background: #fff;
@@ -132,12 +141,14 @@ a {
.sheet-rolltemplate-strike .sheet-content > div,
.sheet-rolltemplate-goe .sheet-content > div,
.sheet-rolltemplate-skill .sheet-content > div,
.sheet-rolltemplate-initiative .sheet-content > div,
.sheet-rolltemplate-custom .sheet-content > div {
padding: 5px;
}
.sheet-rolltemplate-strike .sheet-content .sheet-key,
.sheet-rolltemplate-goe .sheet-content .sheet-key,
.sheet-rolltemplate-skill .sheet-content .sheet-key,
.sheet-rolltemplate-initiative .sheet-content .sheet-key,
.sheet-rolltemplate-custom .sheet-content .sheet-key {
font-weight: bold;
padding-right: 10px;
@@ -149,6 +160,8 @@ a {
.sheet-rolltemplate-goe .sheet-content :nth-child(4n),
.sheet-rolltemplate-skill .sheet-content :nth-child(4n+3),
.sheet-rolltemplate-skill .sheet-content :nth-child(4n),
.sheet-rolltemplate-initiative .sheet-content :nth-child(4n+3),
.sheet-rolltemplate-initiative .sheet-content :nth-child(4n),
.sheet-rolltemplate-custom .sheet-content :nth-child(4n+3),
.sheet-rolltemplate-custom .sheet-content :nth-child(4n) {
background: #eee;
@@ -156,6 +169,7 @@ a {
.sheet-rolltemplate-strike .sheet-desc,
.sheet-rolltemplate-goe .sheet-desc,
.sheet-rolltemplate-skill .sheet-desc,
.sheet-rolltemplate-initiative .sheet-desc,
.sheet-rolltemplate-custom .sheet-desc {
grid-column: span 2;
padding: 5px;
@@ -163,8 +177,8 @@ a {
}
.danger {
background-color: #dc3545;
color: white;
background-color: #dc3545 !important;
color: white !important;
}
.charsheet .debug[value="0"] ~ main#megaverse .debuggable {
@@ -183,6 +197,10 @@ a {
.charsheet main#megaverse button[type=roll].no-dice::before {
content: "";
}
.charsheet main#megaverse button.action-roll::before {
font-family: "dicefontd20";
content: "t";
}
.charsheet main#megaverse h4 {
text-decoration: underline;
}
@@ -193,22 +211,40 @@ a {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.charsheet main#megaverse textarea[readonly] {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow-y: auto;
}
.charsheet main#megaverse details {
display: revert;
margin-bottom: 1rem;
}
.charsheet main#megaverse details.info {
display: block;
margin-bottom: 0;
}
.charsheet main#megaverse details.info > summary {
display: block;
}
.charsheet main#megaverse details summary {
display: revert;
cursor: pointer;
}
.charsheet main#megaverse details summary > h3 {
.charsheet main#megaverse details summary h2, .charsheet main#megaverse details summary > h3 {
display: inline-block;
}
.charsheet main#megaverse details .details-body {
@@ -234,13 +270,6 @@ a {
.charsheet main#megaverse .repeating_profiles-inner details.info {
display: inline-block;
}
.charsheet main#megaverse details.info {
display: block;
margin-bottom: 0;
}
.charsheet main#megaverse details.info > summary {
display: block;
}
.charsheet main#megaverse .full {
width: 100% !important;
}
@@ -282,18 +311,24 @@ a {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.charsheet main#megaverse .macro-help label {
display: grid;
gap: 0.5rem;
grid-template-columns: 1fr 7fr !important;
}
.charsheet main#megaverse .psi-vs {
justify-content: left !important;
}
.charsheet main#megaverse .psi-vs > span {
padding-right: 0.5rem;
}
.charsheet main#megaverse .finance-grid {
display: grid;
gap: 0.5rem;
@@ -400,12 +435,12 @@ a {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.charsheet main#megaverse .bonus-type-container {
display: grid;
@@ -421,6 +456,14 @@ a {
.charsheet main#megaverse .bonus-type-container.attributes > label input[type=text] {
width: auto;
}
.charsheet main#megaverse .bonus-type-container hr {
width: 100%;
height: 1px;
margin: 0;
border: 0;
background-color: #ccc;
border: 0;
}
.charsheet main#megaverse .bonus-type-container input {
width: 5rem;
}
@@ -439,12 +482,12 @@ a {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.charsheet main#megaverse .bonus-type-container.allow-absolute label {
grid-template-columns: 1fr 2rem 5rem;
@@ -514,7 +557,7 @@ a {
gap: 0.5rem;
grid-template-columns: 2.5rem 1fr 10rem 5rem 5rem 5rem 5rem 4rem 4rem;
}
.charsheet main#megaverse .armor .armor-active label {
.charsheet main#megaverse .armor-damage label {
display: inline;
}
.charsheet main#megaverse .armor .armor-labels {
@@ -566,6 +609,14 @@ a {
.charsheet main#megaverse .profile-builder span.picker-title {
font-weight: bold;
}
.charsheet main#megaverse .profile-builder .profiles hr {
width: 100%;
height: 1px;
margin: 0;
border: 0;
background-color: #ccc;
border: 0;
}
.charsheet main#megaverse .profile-builder .profiles .bonus-ps-container {
grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
}
@@ -590,6 +641,9 @@ a {
.charsheet main#megaverse .profile-builder .profiles .bonus-type-container label.roller {
grid-template-columns: 1fr 1rem 5rem 4rem;
}
.charsheet main#megaverse .profile-builder .profiles .bonus-type-container label.roller.initiative {
grid-template-columns: 1fr 1rem 5rem 4rem 5rem;
}
.charsheet main#megaverse .profile-builder .profiles .bonus-type-container label.abs {
display: none;
}
@@ -615,12 +669,12 @@ a {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.charsheet main#megaverse .powersabilities .heading,
.charsheet main#megaverse .powersabilities .abilities-list {
@@ -640,6 +694,44 @@ a {
gap: 0.5rem;
grid-template-columns: 2.5rem 1fr 6rem 8rem 8rem 4rem 8rem 4rem 4rem 5rem 4rem;
}
.charsheet main#megaverse .active-container {
padding: 0.5rem;
background-color: #eee;
box-shadow: rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px;
}
.charsheet main#megaverse .active-container[open] {
padding: 1rem;
background-color: #ccc;
box-shadow: rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px 0px inset;
}
.charsheet main#megaverse .active-container .profile-builder hr {
width: 100%;
height: 1px;
margin: 0;
border: 0;
background-color: #eee;
border: 0;
}
.charsheet main#megaverse .active-container .modifiers-combat > div,
.charsheet main#megaverse .active-container .modifiers-attributes > div {
border: 1px solid #eee;
padding: 0.5rem;
}
.charsheet main#megaverse .active-container .armor-row {
display: grid;
gap: 0.5rem;
grid-template-columns: 15rem 10rem 10rem 10rem 11rem;
align-items: center;
}
.charsheet main#megaverse .active-container .armor-row > label {
display: flex;
align-self: center;
text-align: center;
align-items: center;
}
.charsheet main#megaverse .armor-profiles {
margin-left: 1rem;
}
img.logo {
max-height: 30px;
@@ -664,12 +756,12 @@ img.logo {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.ss-2b {
File diff suppressed because it is too large Load Diff
+115 -23
View File
@@ -62,6 +62,7 @@ a {
.withoutavatars .sheet-rolltemplate-strike,
.withoutavatars .sheet-rolltemplate-goe,
.withoutavatars .sheet-rolltemplate-skill,
.withoutavatars .sheet-rolltemplate-initiative,
.withoutavatars .sheet-rolltemplate-custom {
margin-left: -7px;
}
@@ -70,12 +71,14 @@ a {
.sheet-rolltemplate-strike,
.sheet-rolltemplate-goe,
.sheet-rolltemplate-skill,
.sheet-rolltemplate-initiative,
.sheet-rolltemplate-custom {
margin-left: -37px;
}
.sheet-rolltemplate-strike .sheet-container,
.sheet-rolltemplate-goe .sheet-container,
.sheet-rolltemplate-skill .sheet-container,
.sheet-rolltemplate-initiative .sheet-container,
.sheet-rolltemplate-custom .sheet-container {
border: 1px solid;
/* by default, the border is the same color as the header. You can change this here, e.g. to black */
@@ -86,12 +89,14 @@ a {
.sheet-rolltemplate-strike .sheet-container.sheet-color-red,
.sheet-rolltemplate-goe .sheet-container.sheet-color-red,
.sheet-rolltemplate-skill .sheet-container.sheet-color-red,
.sheet-rolltemplate-initiative .sheet-container.sheet-color-red,
.sheet-rolltemplate-custom .sheet-container.sheet-color-red {
--header-bg-color: #f00;
}
.sheet-rolltemplate-strike .sheet-container.sheet-color-green,
.sheet-rolltemplate-goe .sheet-container.sheet-color-green,
.sheet-rolltemplate-skill .sheet-container.sheet-color-green,
.sheet-rolltemplate-initiative .sheet-container.sheet-color-green,
.sheet-rolltemplate-custom .sheet-container.sheet-color-green {
--header-bg-color: #0f0;
--header-text-color: #000;
@@ -99,6 +104,7 @@ a {
.sheet-rolltemplate-strike .sheet-header,
.sheet-rolltemplate-goe .sheet-header,
.sheet-rolltemplate-skill .sheet-header,
.sheet-rolltemplate-initiative .sheet-header,
.sheet-rolltemplate-custom .sheet-header {
background-color: var(--header-bg-color);
/* change text-align to center to center the header text */
@@ -109,18 +115,21 @@ a {
.sheet-rolltemplate-strike .sheet-title,
.sheet-rolltemplate-goe .sheet-title,
.sheet-rolltemplate-skill .sheet-title,
.sheet-rolltemplate-initiative .sheet-title,
.sheet-rolltemplate-custom .sheet-title {
font-size: 1.1em;
}
.sheet-rolltemplate-strike .sheet-subtitle,
.sheet-rolltemplate-goe .sheet-subtitle,
.sheet-rolltemplate-skill .sheet-subtitle,
.sheet-rolltemplate-initiative .sheet-subtitle,
.sheet-rolltemplate-custom .sheet-subtitle {
font-size: 0.9em;
}
.sheet-rolltemplate-strike .sheet-content,
.sheet-rolltemplate-goe .sheet-content,
.sheet-rolltemplate-skill .sheet-content,
.sheet-rolltemplate-initiative .sheet-content,
.sheet-rolltemplate-custom .sheet-content {
display: grid;
background: #fff;
@@ -132,12 +141,14 @@ a {
.sheet-rolltemplate-strike .sheet-content > div,
.sheet-rolltemplate-goe .sheet-content > div,
.sheet-rolltemplate-skill .sheet-content > div,
.sheet-rolltemplate-initiative .sheet-content > div,
.sheet-rolltemplate-custom .sheet-content > div {
padding: 5px;
}
.sheet-rolltemplate-strike .sheet-content .sheet-key,
.sheet-rolltemplate-goe .sheet-content .sheet-key,
.sheet-rolltemplate-skill .sheet-content .sheet-key,
.sheet-rolltemplate-initiative .sheet-content .sheet-key,
.sheet-rolltemplate-custom .sheet-content .sheet-key {
font-weight: bold;
padding-right: 10px;
@@ -149,6 +160,8 @@ a {
.sheet-rolltemplate-goe .sheet-content :nth-child(4n),
.sheet-rolltemplate-skill .sheet-content :nth-child(4n+3),
.sheet-rolltemplate-skill .sheet-content :nth-child(4n),
.sheet-rolltemplate-initiative .sheet-content :nth-child(4n+3),
.sheet-rolltemplate-initiative .sheet-content :nth-child(4n),
.sheet-rolltemplate-custom .sheet-content :nth-child(4n+3),
.sheet-rolltemplate-custom .sheet-content :nth-child(4n) {
background: #eee;
@@ -156,6 +169,7 @@ a {
.sheet-rolltemplate-strike .sheet-desc,
.sheet-rolltemplate-goe .sheet-desc,
.sheet-rolltemplate-skill .sheet-desc,
.sheet-rolltemplate-initiative .sheet-desc,
.sheet-rolltemplate-custom .sheet-desc {
grid-column: span 2;
padding: 5px;
@@ -163,8 +177,8 @@ a {
}
.danger {
background-color: #dc3545;
color: white;
background-color: #dc3545 !important;
color: white !important;
}
.charsheet .debug[value="0"] ~ main#megaverse .debuggable {
@@ -183,6 +197,10 @@ a {
.charsheet main#megaverse button[type=roll].no-dice::before {
content: "";
}
.charsheet main#megaverse button.action-roll::before {
font-family: "dicefontd20";
content: "t";
}
.charsheet main#megaverse h4 {
text-decoration: underline;
}
@@ -193,22 +211,40 @@ a {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.charsheet main#megaverse textarea[readonly] {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow-y: auto;
}
.charsheet main#megaverse details {
display: revert;
margin-bottom: 1rem;
}
.charsheet main#megaverse details.info {
display: block;
margin-bottom: 0;
}
.charsheet main#megaverse details.info > summary {
display: block;
}
.charsheet main#megaverse details summary {
display: revert;
cursor: pointer;
}
.charsheet main#megaverse details summary > h3 {
.charsheet main#megaverse details summary h2, .charsheet main#megaverse details summary > h3 {
display: inline-block;
}
.charsheet main#megaverse details .details-body {
@@ -234,13 +270,6 @@ a {
.charsheet main#megaverse .repeating_profiles-inner details.info {
display: inline-block;
}
.charsheet main#megaverse details.info {
display: block;
margin-bottom: 0;
}
.charsheet main#megaverse details.info > summary {
display: block;
}
.charsheet main#megaverse .full {
width: 100% !important;
}
@@ -282,18 +311,24 @@ a {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.charsheet main#megaverse .macro-help label {
display: grid;
gap: 0.5rem;
grid-template-columns: 1fr 7fr !important;
}
.charsheet main#megaverse .psi-vs {
justify-content: left !important;
}
.charsheet main#megaverse .psi-vs > span {
padding-right: 0.5rem;
}
.charsheet main#megaverse .finance-grid {
display: grid;
gap: 0.5rem;
@@ -400,12 +435,12 @@ a {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.charsheet main#megaverse .bonus-type-container {
display: grid;
@@ -421,6 +456,14 @@ a {
.charsheet main#megaverse .bonus-type-container.attributes > label input[type=text] {
width: auto;
}
.charsheet main#megaverse .bonus-type-container hr {
width: 100%;
height: 1px;
margin: 0;
border: 0;
background-color: #ccc;
border: 0;
}
.charsheet main#megaverse .bonus-type-container input {
width: 5rem;
}
@@ -439,12 +482,12 @@ a {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.charsheet main#megaverse .bonus-type-container.allow-absolute label {
grid-template-columns: 1fr 2rem 5rem;
@@ -514,7 +557,7 @@ a {
gap: 0.5rem;
grid-template-columns: 2.5rem 1fr 10rem 5rem 5rem 5rem 5rem 4rem 4rem;
}
.charsheet main#megaverse .armor .armor-active label {
.charsheet main#megaverse .armor-damage label {
display: inline;
}
.charsheet main#megaverse .armor .armor-labels {
@@ -566,6 +609,14 @@ a {
.charsheet main#megaverse .profile-builder span.picker-title {
font-weight: bold;
}
.charsheet main#megaverse .profile-builder .profiles hr {
width: 100%;
height: 1px;
margin: 0;
border: 0;
background-color: #ccc;
border: 0;
}
.charsheet main#megaverse .profile-builder .profiles .bonus-ps-container {
grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
}
@@ -590,6 +641,9 @@ a {
.charsheet main#megaverse .profile-builder .profiles .bonus-type-container label.roller {
grid-template-columns: 1fr 1rem 5rem 4rem;
}
.charsheet main#megaverse .profile-builder .profiles .bonus-type-container label.roller.initiative {
grid-template-columns: 1fr 1rem 5rem 4rem 5rem;
}
.charsheet main#megaverse .profile-builder .profiles .bonus-type-container label.abs {
display: none;
}
@@ -615,12 +669,12 @@ a {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.charsheet main#megaverse .powersabilities .heading,
.charsheet main#megaverse .powersabilities .abilities-list {
@@ -640,6 +694,44 @@ a {
gap: 0.5rem;
grid-template-columns: 2.5rem 1fr 6rem 8rem 8rem 4rem 8rem 4rem 4rem 5rem 4rem;
}
.charsheet main#megaverse .active-container {
padding: 0.5rem;
background-color: #eee;
box-shadow: rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px;
}
.charsheet main#megaverse .active-container[open] {
padding: 1rem;
background-color: #ccc;
box-shadow: rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px 0px inset;
}
.charsheet main#megaverse .active-container .profile-builder hr {
width: 100%;
height: 1px;
margin: 0;
border: 0;
background-color: #eee;
border: 0;
}
.charsheet main#megaverse .active-container .modifiers-combat > div,
.charsheet main#megaverse .active-container .modifiers-attributes > div {
border: 1px solid #eee;
padding: 0.5rem;
}
.charsheet main#megaverse .active-container .armor-row {
display: grid;
gap: 0.5rem;
grid-template-columns: 15rem 10rem 10rem 10rem 11rem;
align-items: center;
}
.charsheet main#megaverse .active-container .armor-row > label {
display: flex;
align-self: center;
text-align: center;
align-items: center;
}
.charsheet main#megaverse .armor-profiles {
margin-left: 1rem;
}
img.logo {
max-height: 30px;
@@ -664,12 +756,12 @@ img.logo {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
.ss-2b {
File diff suppressed because it is too large Load Diff
+16 -1
View File
@@ -4,9 +4,17 @@
"authors": "Grinning Gecko",
"roll20userid": "6479616",
"preview": "preview.jpg",
"instructions": "Rifts is a complicated game, and this is a complicated sheet. Please expand and review the instructions on each tab of the sheet in order to use it to its fullest. Happy gaming!",
"instructions": "Rifts is a complicated game, and this is a complicated sheet. Please expand and review the instructions on the Options tab of the sheet in order to use it to its fullest. Happy gaming!",
"legacy": false,
"useroptions": [
{
"attribute": "opt_dodge_penalty",
"displayname": "Apply Rifts: Ultimate Edition penalties to dodging gunfire",
"description": "In Rifts: Ultimate Edition, characters are -10 to dodge gunfire at less than 10 feet, and -5 between 10 and 50 feet.",
"type": "checkbox",
"value": "?{Dodging gunfire?|> 50 feet,0|10-50 feet,5|< 10 feet,10}",
"checked": "checked"
},
{
"attribute": "opt_pp_extras",
"displayname": "Add PP bonus to Disarm and Entangle",
@@ -37,6 +45,13 @@
"type": "checkbox",
"value": "1",
"checked": "checked"
},
{
"attribute": "opt_iq_bonus",
"displayname": "Apply IQ bonus to skill-based abilities",
"description": "Adds IQ bonus to abilities/magic/psionic that use a skill-based percentage. Some examples include, but are not limited to, Telemechanics, Object Read, Locate, etc.",
"type": "checkbox",
"value": "1"
}
]
}
@@ -3,7 +3,7 @@ async function applyDamageToNextActiveArmor(section, damage) {
const ids = await getSectionIDsOrderedAsync(section);
const attrKeys = ids.flatMap((id) => [
`repeating_${section}_${id}_is_active`,
`repeating_${section}_${id}_currentmdc`,
`repeating_${section}_${id}_mdc`,
]);
const attrs = {};
const a = await getAttrsAsync(attrKeys);
@@ -19,21 +19,49 @@ async function applyDamageToNextActiveArmor(section, damage) {
}, []);
let i = 0;
for (const id of activeIds) {
currentMdc = +a[`repeating_${section}_${id}_currentmdc`] - damageCarry;
let activeRowId;
for (activeRowId of activeIds) {
currentMdc = +a[`repeating_${section}_${activeRowId}_mdc`] - damageCarry;
if (currentMdc < 0 && ++i < activeIds.length) {
attrs[`repeating_${section}_${id}_currentmdc`] = 0;
attrs[`repeating_${section}_${activeRowId}_mdc`] = 0;
damageCarry = Math.abs(currentMdc);
} else {
attrs[`repeating_${section}_${id}_currentmdc`] = currentMdc;
attrs[`repeating_${section}_${activeRowId}_mdc`] = currentMdc;
break;
}
}
await setAttrsAsync(attrs);
await updateActiveArmor(activeRowId);
}
/**
* Updates the global active_armor attributes with the values
* from the currently active repeating armor row
* @param {string} rowId Row ID of the active armor row
*/
async function updateActiveArmor(rowId) {
console.log("updateActiveArmor", ARMOR_KEYS.length);
const attrKeys = ARMOR_KEYS.map((key) => `repeating_armor_${rowId}_${key}`);
const a = await getAttrsAsync(attrKeys);
const attrs = ARMOR_KEYS.reduce((acc, cur) => {
if (a[`repeating_armor_${rowId}_${cur}`] !== undefined) {
if (cur === "mdc") {
acc[`active_armor_mdc`] = a[`repeating_armor_${rowId}_${cur}`];
} else if (cur === "mdc_max") {
acc[`active_armor_mdc_max`] = a[`repeating_armor_${rowId}_${cur}`];
} else {
acc[`active_armor_${cur}`] = a[`repeating_armor_${rowId}_${cur}`];
acc[`active_armor_${cur}_max`] = a[`repeating_armor_${rowId}_${cur}`];
}
}
return acc;
}, {});
console.log(attrs);
await setAttrsAsync(attrs);
}
on("change:repeating_armor:movementpenalty", async (e) => {
recalculateMovement();
await recalculateMovement();
});
on("clicked:armorapplydamage", async (e) => {
@@ -45,11 +73,13 @@ on("clicked:armorapplydamage", async (e) => {
on("clicked:repeating_armor:resetmdc", async (e) => {
console.log("clicked:repeating_armor:resetmdc", e);
const [r, section, rowId] = e.sourceAttribute.split("_");
const a = await getAttrsAsync([`repeating_armor_${rowId}_basemdc`]);
const a = await getAttrsAsync([`repeating_armor_${rowId}_mdc_max`]);
await setAttrsAsync({
[`repeating_armor_${rowId}_currentmdc`]:
a[`repeating_armor_${rowId}_basemdc`],
[`repeating_armor_${rowId}_mdc`]: a[`repeating_armor_${rowId}_mdc_max`],
});
});
on("change:repeating_armor:is_active", (e) => recalculateMovement());
on("change:repeating_armor:is_active", async (e) => {
await recalculateMovement();
await applyDamageToNextActiveArmor("armor", 0);
});
@@ -94,14 +94,17 @@ async function repeatingAbsoluteAttributes(rowIds, destinationPrefix) {
rowIds.forEach((rowId) => {
const rowFieldAbs = a[`repeating_bonuses_${rowId}_${field}_abs`];
if (Boolean(Number(rowFieldAbs)) == true) {
rowFieldValue = a[`repeating_bonuses_${rowId}_mod_${field}`];
fieldAbsValue =
fieldAbsValue > rowFieldValue ? fieldAbsValue : rowFieldValue;
rowFieldValue = +a[`repeating_bonuses_${rowId}_mod_${field}`];
fieldAbsValue = +(fieldAbsValue > rowFieldValue
? fieldAbsValue
: rowFieldValue);
}
});
if (fieldAbsValue) {
// compare the modified absolute value against the original attribute
const coreValue = (await getAttrsAsync([field]))[field];
// const coreValue = (await getAttrsAsync([field]))[field];
const { [field]: rawCoreValue } = await getAttrsAsync([field]);
const coreValue = +rawCoreValue;
const newValue = coreValue > fieldAbsValue ? coreValue : fieldAbsValue;
const attr = {
[`${destinationPrefix}_mod_${field}`]: newValue,
@@ -191,6 +194,7 @@ async function combineBonuses(rowIds, destinationPrefix) {
"initiative",
"pull",
"roll",
"breakfall",
"strike_range",
"strike_range_single",
"strike_range_burst",
@@ -210,6 +214,9 @@ async function combineBonuses(rowIds, destinationPrefix) {
"dodge_motion",
"dodge_underwater",
"flipthrow",
"tackle",
"leghook",
"backwardsweepkick",
];
const ppExtras = ["disarm", "entangle"];
@@ -0,0 +1,66 @@
async function updateHandToHands(section, newCharacterLevel) {
const ids = await getSectionIDsAsync(section);
const attrNames = ids.map((id) => `repeating_${section}_${id}_name`);
const a = await getAttrsAsync(attrNames);
for (rowId of ids) {
const rowPrefix = `repeating_${section}_${rowId}`;
await calculateH2h(
section,
rowId,
rowPrefix,
a[`${rowPrefix}_name`],
newCharacterLevel
);
}
}
async function calculateH2h(section, rowId, keyPrefix, name, level) {
console.log("calculateH2h", name, keyPrefix, level);
const lowerCaseName = name.toLowerCase();
if (!Object.keys(H2H).includes(lowerCaseName)) {
// Exit if this isn't one of the pre-defined skills
return;
}
const attrs = {};
const levelBonuses = H2H[lowerCaseName].slice(0, level);
const totalBonuses = mergeAndAddObjects(levelBonuses);
console.log(totalBonuses);
for (const [key, val] of Object.entries(totalBonuses)) {
attrs[`${keyPrefix}_${key}`] = val;
}
attrs[`${keyPrefix}_level`] = level;
console.log(attrs);
await setAttrsAsync(attrs);
await addModifierToBonusesAsync(section, rowId);
}
on("change:repeating_h2h", async (e) => {
/**
* Allow custom Hand to Hand
*/
if (e.sourceType === "sheetworker") {
return;
}
const [r, section, rowId] = e.sourceAttribute.split("_");
const rowPrefix = `repeating_${section}_${rowId}`;
const { [`${rowPrefix}_name`]: h2hName } = await getAttrsAsync([
`${rowPrefix}_name`,
]);
const lowerCaseName = h2hName.toLowerCase();
if (Object.keys(H2H).includes(lowerCaseName)) {
return;
}
console.log("change:repeating_h2h", e);
await addModifierToBonusesAsync(section, rowId);
});
on("change:repeating_h2h:name change:repeating_h2h:level", async (e) => {
console.log("change:repeating_h2h:name change:repeating_h2h:level", e);
const [r, section, rowId] = e.sourceAttribute.split("_");
const rowPrefix = `repeating_${section}_${rowId}`;
const { [`${rowPrefix}_level`]: level, [`${rowPrefix}_name`]: h2hName } =
await getAttrsAsync([`${rowPrefix}_level`, `${rowPrefix}_name`]);
await calculateH2h(section, rowId, rowPrefix, h2hName, +level);
});
File diff suppressed because it is too large Load Diff
@@ -33,6 +33,7 @@
on("clicked:export", async (e) => {
console.log("export", e);
const attrs = {};
attrs.h2h = await getRepeatingRowsAsync("h2h");
attrs.wp = await getRepeatingRowsAsync("wp");
attrs.wpmodern = await getRepeatingRowsAsync("wpmodern");
attrs.skills = await getRepeatingRowsAsync("skills");
@@ -98,6 +99,7 @@
// importAll(data);
// return;
await setAttrsAsync(data.core);
await setRepeatingRowsAsync("h2h", data.h2h);
await setRepeatingRowsAsync("wp", data.wp);
await setRepeatingRowsAsync("wpmodern", data.wpmodern);
await setRepeatingRowsAsync("skills", data.skills);
@@ -12,6 +12,21 @@ async function migrateAttributes() {
},
],
},
{
version: "1.2.0",
attributes: [
{
repeating: ["armor"],
from: "currentmdc",
to: ["mdc"],
},
{
repeating: ["armor"],
from: "basemdc",
to: ["mdc_max"],
},
],
},
];
const { version, migrated } = await getAttrsAsync(["version", "migrated"]);
@@ -3,6 +3,24 @@ async function getDefaultProfileID() {
return default_profile;
}
async function updateActiveProfile(rowId) {
console.log("updateActiveProfile", REPEATING_BONUS_KEYS.length);
const attrKeys = REPEATING_BONUS_KEYS.map(
(key) => `repeating_profiles_${rowId}_${key}`
);
const a = await getAttrsAsync(attrKeys);
const attrs = REPEATING_BONUS_KEYS.reduce((acc, cur, idx) => {
if (a[`repeating_profiles_${rowId}_${cur}`] !== undefined) {
acc[`active_profile_${cur}`] = a[`repeating_profiles_${rowId}_${cur}`];
acc[`active_profile_${cur}_max`] =
a[`repeating_profiles_${rowId}_${cur}`];
}
return acc;
}, {});
console.log(attrs);
await setAttrsAsync(attrs);
}
async function updateProfile(rowId) {
const bonusIds = (
await getAttrsAsync(["repeating_profiles_bonus_ids"])
@@ -20,6 +38,10 @@ async function updateProfile(rowId) {
[`repeating_profiles_${rowId}_rowid`]: `repeating_profiles_${rowId}_`,
});
await combineBonuses(bonusIds, `repeating_profiles_${rowId}`);
const isActive = await isDefault("profiles", rowId);
if (isActive) {
await updateActiveProfile(rowId);
}
}
async function setSingleAttributeFromDefaultProfile(attrName, profileAttrName) {
@@ -124,6 +146,7 @@ on("change:default_profile", async (e) => {
const a = await getAttrsAsync([`${prefix}_mdc`]);
await setAttrsAsync({ default_mdc: a[`${prefix}_mdc`] });
await updateSkills();
await updateActiveProfile(e.newValue);
});
on("change:repeating_profiles:is_default", async (e) => {
@@ -212,32 +235,10 @@ on("clicked:getdefaultprofile", async (e) => {
console.log(a);
});
/**
* Add a token {attack} times to the Turn Tracker in order against other tokens.
* Requires API script access.
* For use on an action button.
*
* [[d20+@{selected|repeating_profiles_-MibcwHG5hZXUJn6A7OG_initiative} &{tracker}]]
*/
async function palladiumAddToTurnTracker(e) {
const [r, section, rowId] = e.sourceAttribute.split("_");
const rowPrefix = `${r}_${section}_${rowId}`;
const {
[`${rowPrefix}_initiative`]: init,
[`${rowPrefix}_attacks`]: attacks,
} = await getAttrsAsync([`${rowPrefix}_initiative`, `${rowPrefix}_attacks`]);
const roll = await startRoll(
`&{template:test} {{name=Test}} {{roll1=[[1d20]]}}`
on("clicked:active_profile_initiative_turntracker", async (e) => {
console.log("clicked:active_profile_initiative_turntracker", e);
await palladiumAddToTurnTracker(
"active_profile_initiative",
"active_profile_attacks"
);
console.log(roll);
const computed = roll.results.roll1.result + init;
console.log(computed);
finishRoll(roll.rollId, {
roll1: computed,
});
const addToTracker = await startRoll(`[[[[${computed}]] &{tracker}]]`);
finishRoll(addToTracker.rollId);
// https://app.roll20.net/forum/post/6817409/multiple-initiative-values-for-a-single-character/?pageforid=6817748#post-6817748
const dupeTracker = await startRoll(`!dup-turn ${attacks}`);
finishRoll(dupeTracker.rollId);
}
});
@@ -105,7 +105,9 @@ async function updateSkillLevels(newCharacterLevel, oldCharacterLevel) {
on("change:repeating_skills", async (e) => {
console.log("change:repeating_skills", e);
if (e.sourceType === "sheetworker") return;
if (e.sourceType === "sheetworker" && !e.sourceAttribute.endsWith("_level")) {
return;
}
if (e.sourceAttribute.endsWith("_name")) return;
const sourceParts = e.sourceAttribute.split("_");
// Return if no attribute is changed and it's the row itself
@@ -258,7 +258,11 @@ function mergeAndAddObjects(data) {
data.forEach((obj) => {
for (let [key, value] of Object.entries(obj)) {
if (result[key]) {
result[key] += value;
if (key === "critical" || key === "knockout" || key === "deathblow") {
result[key] = result[key] > value ? value : result[key];
} else {
result[key] += value;
}
} else {
result[key] = value;
}
@@ -280,3 +284,34 @@ async function getSectionIDsOrderedAsync(sectionName) {
];
return ids;
}
/**
* Add a token {attack} times to the Turn Tracker in order against other tokens.
* Requires API script access.
* For use on an action button.
*
* [[d20+@{selected|repeating_profiles_-MibcwHG5hZXUJn6A7OG_initiative} &{tracker}]]
*/
async function palladiumAddToTurnTracker(initKey, attacksKey) {
const { [initKey]: init, [attacksKey]: attacks } = await getAttrsAsync([
initKey,
attacksKey,
]);
const initString = init > 0 ? `+${init}` : `${init}`;
const roll = await startRoll(
`&{template:initiative} {{title=@{selected|character_name} rolls initiative!}} {{diceroll=[[1d20]]}} {{modifier=${initString}}}`
);
console.log(roll);
const computed = roll.results.diceroll.result + init;
console.log(computed);
finishRoll(roll.rollId, {
diceroll: computed,
});
const addToTracker = await startRoll(
`Setting @{selected|character_name}'s initiative to [[[[${computed}]] &{tracker}]] in the Turn Tracker.`
);
finishRoll(addToTracker.rollId);
// https://app.roll20.net/forum/post/6817409/multiple-initiative-values-for-a-single-character/?pageforid=6817748#post-6817748
const dupeTracker = await startRoll(`!dup-turn ${attacks}`);
finishRoll(dupeTracker.rollId);
}
File diff suppressed because it is too large Load Diff
@@ -3,12 +3,12 @@
/></label>
<input type="text" placeholder="Armor Name" name="attr_name" />
<input type="number" placeholder="%" name="attr_movementpenalty" />
<input type="number" placeholder="Base MDC" name="attr_basemdc" value="0" />
<input type="number" placeholder="Base MDC" name="attr_mdc_max" value="0" />
<input
type="number"
class="danger"
placeholder="Current MDC"
name="attr_currentmdc"
name="attr_mdc"
value="0"
/>
<button type="action" name="act_resetmdc">Reset MDC</button>
@@ -4,6 +4,7 @@
<option value="ft"></option>
<option value="yd"></option>
<option value="mi"></option>
<option value="ly"></option>
</datalist>
<datalist id="damage-units">
<option value="MDC"></option>
@@ -30,14 +31,14 @@
<option value="per year"></option>
</datalist>
<datalist id="spell-schools">
<option value="Invocation"></option>
<option value="Elemental"></option>
<option value="Invocation"></option>
<option value="Necromancy"></option>
<option value="Space"></option>
<option value="Temporal"></option>
</datalist>
<datalist id="combat-modifiers">
<datalist id="modifiers">
<option value="Custom - Type Your Own"></option>
<option value="Hand to Hand: Basic"></option>
<option value="Hand to Hand: Dragon"></option>
<option value="RPA Basic"></option>
<option value="RPA Elite: Glitter Boy"></option>
<option value="Weapon: NG-P7"></option>
@@ -49,6 +50,30 @@
<option value="Psionic: Sixth Sense"></option>
<option value="Magic Amulet: Charm"></option>
</datalist>
<datalist id="hand-to-hand">
<option value="Hand to Hand: Basic"></option>
<option value="Hand to Hand: Expert"></option>
<option value="Hand to Hand: Martial Arts"></option>
<option value="Hand to Hand: Assassin"></option>
<option value="Hand to Hand: Commando"></option>
<option value="Hand to Hand: Aikido"></option>
<option value="Hand to Hand: Judo"></option>
<option value="Hand to Hand: Jujitsu"></option>
<option value="Hand to Hand: Karate"></option>
<option value="Hand to Hand: Kendo"></option>
<option value="Hand to Hand: Ninjitsu"></option>
<option value="Hand to Hand: Samurai"></option>
<option value="Hand to Hand: Teng-Jutsu"></option>
<option value="Hand to Hand: Dragon"></option>
<option value="RPA Combat: Basic"></option>
<option value="RPA Combat: Flying Power Armor"></option>
<option value="RPA Combat: Ground-Based Power Armor"></option>
<option value="RPA Combat: Heavy Vehicular Style Robots"></option>
<option value="RPA Combat: Heavy Ground Robots"></option>
<option value="RPA Combat: Light Ground Robots"></option>
<option value="RPA Combat: Glitter Boy"></option>
<option value="RPA Combat: Silverhawk"></option>
</datalist>
<datalist id="weapon-proficiencies">
<option value="W.P. Archery"></option>
<option value="W.P. Axe"></option>
@@ -23,7 +23,7 @@
<span name="attr_percentage"></span>
<button
type="roll"
value="&{template:skill} {{title=@{character_name} uses @{name}}} {{target=[[{@{percentage}+?{Modifier?|0},98}kl1]]}} {{roll=[[d100]]}}"
value="&{template:skill} {{title=@{character_name} uses @{name}}} {{target=[[{@{percentage} + [[ {{ @{opt_iq_bonus},0 }dl1 } * @{active_profile_mod_iq_bonus} ]] +?{Modifier?|0},98}kl1]]}} {{roll=[[d100]]}}"
name="roll_spell_skill"
></button>
<input type="number" value="0" name="attr_ppecost" />
@@ -1,7 +1,306 @@
<div class="r-tab-content">
<div class="importexport">
<div class="options">
<details>
<summary><b>Instructions</b></summary>
<p>
Welcome to the Rifts Character Sheet on Roll20. Note that whenever you
see this icon <b>&#9432;</b> it means you can click it and expand the
row in order to see and input more detail. Get used to this - you will
use it a lot.
</p>
<p>
Profiles are the key to this sheet. Profiles can consist of any number
of abilities, magic, psionics, weapons, gear, etc. Anything that can
mechanically affect your character can be added to a Profile. Some
examples of Profiles might be:
</p>
<ul>
<li>Walking around town (no armor, no MDC weapons).</li>
<li>Battle ready in a Glitter Boy.</li>
<li>
Prepped for battle with a number of active spells like Armor of Ithan
and Superhuman Speed.
</li>
</ul>
<p>
But before you can create a Profile, you need to populate your Combat
Skills, Abilities, Magic, Psionics, and Modifiers. I'll explain what
each of those tabs is for (not necessarily in the order they appear in
the sheet), and then I'll explain the simpler first three tabs - Core,
Skills, and Equipment.
</p>
<h3>Modifiers</h3>
<p>
Modifiers are those crunchy bits of Palladium games. Combat bonuses,
savings throws, attribute bonuses, etc. The sheet makes use of Modifiers
in a couple of ways.
</p>
<ol>
<li>
A Modifiers tab lets you add generic modifiers. Some examples of items
that could be added to the Modifiers tab are:
<ul>
<li>A magic amulet that gives a +1 vs. magic.</li>
<li>
Boxing, which adds to your PS, attacks, parry, dodge, roll, and
SDC.
</li>
<li>OCC/RCC/Race bonuses.</li>
<li>An NG-P7 that inflicts 1D4*10 MD.</li>
<li>
A vibro-sword daisho with 3D6 MD main hand and 2D6 MD off hand
swords.
</li>
</ul>
The list goes on. Primarily this section is for static things that
don't have an off switch. That doesn't mean your character is always
using these, but they don't require PPE/ISP to activate, and they
don't increase per level. Every row you add to the Modifiers tab will
show up in the <span class="picker-title">Modifier Picker</span> (more
on that later).<br /><br />
</li>
<li>
Modifiers are also a sub-section of Abilities, Magic, and Psionics.
When you add one of those and expand it, you'll see that the first
section is dedicated to how the power increases as you level, but the
section below that is exactly the same as the Modifiers tab. Some
examples of how you'd use these tabs would be:
<ul>
<li>
Firing a laser beam from your eyes that gives +2 to strike and
does 1D6 MD per level.
</li>
<li>
A spell like Call Lightning that costs PPE and does increasing
damage as you level.
</li>
<li>
A spell like Superhuman Speed that costs PPE, provides static
bonuses, and increases its duration as you level.
</li>
<li>
A Techno-Wizard gun that costs PPE to activate and inflicts a
static amount of damage.
</li>
</ul>
In these cases, the top section would be used for the per-level values
(if applicable), and the Modifiers section would be used for the
static bonuses. If a power has a range (or whatever) that doesn't
increase per level, just set that value as Starting and leave Per
Level at 0.
</li>
</ol>
<p>
On some fields in Modifiers, you'll see this button
<label class="abs" title="Relative or absolute value"
><input type="checkbox" value="1" /><span></span></label
>. By default, when the "+" is dark, it indicates that the value is to
be additive. So, for example, if I have a Modifier for a gun that gives
me +1 to strike, and I have a Weapon Proficiency for that gun, those
will be added together. However, if I cast Superhuman Speed, it gives me
an absolute Spd value of of 44. In this case it's not additive - it just
is the value - so press the button to make the "+" grey/inactive -
<label class="abs" title="Relative or absolute value"
><input type="checkbox" value="1" checked /><span></span></label
>.
</p>
<h3>Abilities, Magic, & Psionics</h3>
<p>
As mentioned above, these all contain Modifiers, but each also contains
some additional fields that are specific to the type of power, though
all are very similar.
</p>
<p>
In all cases there are fields for range, duration, damage, D.C., and
skill. Where they differ is that Psionics has an ISP field, Magic has a
PPE field, and Abilities have a frequency (how often the ability can be
performed) field. Magic and Psionics also have <button>Cast</button> /
<button>Use</button> buttons respectively, which will deduct the PPE/ISP
from your total. The total is pulled from your Active Profile (more on
that later).
</p>
<p>
Please note that you can track powers here that don't apply any
Modifiers as well. Magic Pigeon, for example, could be tracked and the
PPE and duration could be filled in. Because of this, not all powers are
automatically added to the
<span class="picker-title">Modifier Picker</span>. If you enter a power
that <i>does</i> have Modifiers, you should check the box that says
<label class="addtobonuses"
><input type="checkbox" value="1" disabled /> Add to Profiles &rarr;
<span class="picker-title">Modifier Picker</span></label
>
so that it's available to be added to a Profile.
</p>
<h3>Combat Skills</h3>
<p>
There are 2 main sections on the Combat Skills tab -
<b>Hand to Hand & RPA Combat</b>, and <b>Weapon Proficiencies</b>. In
both of these sections just add a new row and select from the list. It
will auto-calculate the bonuses based on the level of the entry. If
you're using a Hand to Hand or Weapon Proficiency that isn't part of
Rifts, just type the name and fill in the bonuses yourself. A couple
things to make note of if you go the manual route:
</p>
<ul>
<li>You'll need to adjust the bonuses manually as you level up.</li>
<li>
Don't name it exactly the same as any of the items in the list, or the
automatic level calculator will overwrite your changes.
</li>
<li>
Names are not case sensitive, so "W.P. Sword" is the same as "w.p.
sWORD".
</li>
</ul>
<h3>Profiles</h3>
<p>
Here we get to the golden goose. The Profiles tab has 4 sections -
Active, Armor, Profiles, and Modifier Picker. Unintuitively, I'm going
to start at the bottom and work my way up.
</p>
<h4>Modifier Picker</h4>
<p>
The Modifier Picker is where all of the Abilities, Magic, Psionics (that
you've checked the
<label class="addtobonuses"
><input type="checkbox" value="1" disabled /> Add to Profiles &rarr;
<span class="picker-title">Modifier Picker</span></label
>
checkbox), and Modifiers show up in a list. You pick and choose / mix
and match various Modifiers to create Profiles.
</p>
<h4>Profiles</h4>
<p>
Add a Profile and give it a name. Next select some Modifiers from the
<span class="picker-title">Modifier Picker</span>, and click
<button>
Apply
<span class="picker-title">Picked Modifiers</span>
&#x2190;</button
>. This will attach all of the Modifiers have you have selected to the
current Profile, and add up all of the bonuses.
</p>
<p>
<b
>Note that when adding new Modifiers to a Profile, it's a good idea to
wait a few seconds, and then click <button>Refresh &#x27F3;</button>.
Due to the asynchronous nature of Roll20, sometimes bonuses get
calculated before attributes (and their associated bonuses) get
updated.
</b>
</p>
<p>
If you want to copy a Profile so that you can use it as the baseline for
a new Profile, click
<button>
Replace <span class="picker-title">Picked Modifiers</span> using this
profile &#x2192;</button
>. This will check off all of the Modifiers in the
<span class="picker-title">Modifier Picker</span> that correspond with
the selected Profile.
</p>
<p>
Setting a Profile as Active makes it appear in the Active section (see
below for details). If a Profile is already active and you update it in
some way, press <button>Refresh &#x27F3;</button> to update the data in
the Active section.
</p>
<p>
PP bonus is added to Strike, Parry, Throw, and all the Dodges. It is
added to Disarm and Entangle if the option is enabled. Damage adds
everything together as a rollable field, and prompts to add Punch or PS
damage. Crit/Knockout/Death Blow use the lowest of the available options
(ex. Crit: 17 is better than Crit: 19).
</p>
<h4>Armor</h4>
<p>
Armor is relatively straightforward. Enter as many different armor types
as you have available, providing Name, Movement Modifier %, and Base
MDC. Armor stacks, so you can have more than one Active Armor at a time.
When you enter a value in the Damage field and press
<button>Apply Damage</button>, that value is subtracted from the first
Active Armor in the list. If it's already at 0, it will be subtracted
from the next, and so on. If the last Active Armor is below zero, you're
dead.
</p>
<p>
Pressing
<button>Reset MDC</button> will reset the Current MDC to the Base MDC
value.
</p>
<h4>Active</h4>
<p>
The Active section shows a consolidated view of your active Profile and
Armor. This is especially useful for assigning "active_armor_" or
"active_profile_" attributes to your Token Bar and for use in other
macros. By referencing the "active_" fields, when you switch Profiles,
the macros stay the same, but the values update accordingly.
</p>
<p>
The Active Armor shows the armor that last took damage. If it goes below
zero and there's another Active Armor in the list, the Armor displayed
in the Active section will change to that one. Note that you can also
apply/track damage here.
</p>
<h3>Core</h3>
<p>
The Core tabs is mostly just informational. Attribute bonuses
auto-calculate, so just enter your attributes without worrying about the
bonuses. Beneath those, Hit Points through Perception must be entered
manually, likely as the outcome of some dice rolling. Movement is
calculated automatically based on the Spd attribute in your Active
Profile.
</p>
<h3>Skills</h3>
<p>
Skill Total is calculated automatically. IQ Bonus of your Active Profile
is added automatically. New skills start at level 1. All skills increase
in level as your character does, and the total is recalculated. Ex. if
you select Computer Programming when you're level 1, it will continue to
match your level as you increase. If at level 3 you select Computer
Hacking, it will start at level 1, and when you reach level 4, Computer
Hacking will become level 2. You can adjust individual skill levels
manually as well - they will always remain the same distance from your
character level as it changes.
</p>
<h3>Equipment</h3>
<p>
Just some free-form equipment tracking, with a few fields for different
currencies. Any gear that modifies your character in any way should be
tracked in Modifiers or one of the other Powers tabs.
</p>
<h3>Options</h3>
<p>
This tab. There are a number of options you can select that will affect
dice rolls, calculations, and other mechanics in the sheet. You can also
export/import your character in JSON format so that you can easily move
characters between games.
</p>
<p>
<b>Note that importing a character can take a few minutes.</b> Again,
due to the asynchronous nature of Roll20, it's difficult to
programmatically know when the import is complete. The best way to know
for sure is to open your browser console and wait until no messages have
appeared for at least 30 seconds to a minute.
</p>
<h3>General Info</h3>
<p>
Each repeating row includes a read-only Row ID that can be used in
macros.
</p>
<p>
I intended to have the Description field within
skills/abilities/magic/psionics to be used for copy/pasting the book
description so that it's easier for both the player and the GM to find.
However I've found that this has a tendency to slow down Roll20/the
browser. So do so at your own risk.
</p>
</details>
<p>Click <b>Instructions</b> for detailed instructions.</p>
<hr />
<h3>Options</h3>
<input type="hidden" name="attr_version" value="1.1.0" />
<input type="hidden" name="attr_version" value="1.2.0" />
<label>Version: <span name="attr_version"></span></label>
<input type="hidden" name="attr_migrated" value="0" />
<label>Migrated: <span name="attr_migrated"></span></label>
@@ -10,6 +309,18 @@
Mode</label
>
<hr />
<label
><input
type="checkbox"
name="attr_opt_dodge_penalty"
value="?{Dodging gunfire?|> 50 feet,0|10-50 feet,5|< 10 feet,10}"
/>
Apply Rifts: Ultimate Edition penalties to dodging gunfire</label
>
<p>
In Rifts: Ultimate Edition, characters are -10 to dodge gunfire at less
than 10 feet, and -5 between 10 and 50 feet.
</p>
<label
><input type="checkbox" name="attr_opt_pp_extras" value="1" /> Add PP
bonus to Disarm and Entangle</label
@@ -45,6 +356,15 @@
If a character has a critical on 19-20 or 18-20 from their Hand to Hand
skill, apply this to modern weapons as well.
</p>
<label
><input type="checkbox" name="attr_opt_iq_bonus" value="1" /> Apply IQ
bonus to skill-based abilities</label
>
<p>
Adds IQ bonus to abilities/magic/psionic that use a skill-based
percentage. Some examples include, but are not limited to, Telemechanics,
Object Read, Locate, etc.
</p>
<hr />
<h3>Import/Export</h3>
<details>
@@ -24,7 +24,7 @@
<span name="attr_percentage"></span>
<button
type="roll"
value="&{template:skill} {{title=@{character_name} uses @{name}}} {{target=[[{@{percentage}+?{Modifier?|0},98}kl1]]}} {{roll=[[d100]]}}"
value="&{template:skill} {{title=@{character_name} uses @{name}}} {{target=[[{@{percentage} + [[ {{ @{opt_iq_bonus},0 }dl1 } * @{active_profile_mod_iq_bonus} ]] +?{Modifier?|0},98}kl1]]}} {{roll=[[d100]]}}"
name="roll_powerability_skill"
></button>
</div>
@@ -22,7 +22,7 @@
<span name="attr_percentage"></span>
<button
type="roll"
value="&{template:skill} {{title=@{character_name} uses @{name}}} {{target=[[{@{percentage}+?{Modifier?|0},98}kl1]]}} {{roll=[[d100]]}}"
value="&{template:skill} {{title=@{character_name} uses @{name}}} {{target=[[ {@{percentage} + [[ {{ @{opt_iq_bonus},0 }dl1 } * @{active_profile_mod_iq_bonus} ]] + ?{Modifier?|0},98}kl1 ]]}} {{roll=[[d100]]}}"
name="roll_psionic_skill"
></button>
<input type="number" value="0" name="attr_ispcost" />
@@ -1,27 +0,0 @@
<p>
The Modifiers section has fields for <b>anything</b> that can be modified.
Attributes, PS type, MDC, ISP, PPE, combat bonuses, saving throw bonuses, etc.
This section is available for any Ability, Psionic, Magic, as well in its own
Modifiers tab. If you have a magic amulet that gives +1 to save vs. magic,
create an entry on the Modifier tab and add it. If you have an NG-P7 that does
1d4*10 damage, create an entry on the Modifier tab and add it. Superhuman
Speed sets your speed to an absolute value of 44 and adds +2 to parry and +6
to dodge. Add those in the modifiers section in the spell details on the Magic
tab. Use the
<label class="abs" title="Relative or absolute value"
><input type="checkbox" value="1" /><span></span
></label>
button/toggle next to Spd to indicate that the value is absolute, and not
additive. If adding a Magic Spell, Psionic, or Ability that includes
modifiers, check the <b>Add to Profiles</b> checkbox. This will make those
modifiers available on the Profiles tab to be used in a Profile (see the
Profiles tab instructions for details).
</p>
<p>
Note that each section includes a read-only Row ID that can be used in macros.
</p>
<p>
Don't forget to copy/paste the power description into the Description field to
make life easier for your GM. Also use that field for any macros you may need
like Strike with an arbitrary bonus.
</p>
@@ -407,22 +407,6 @@
><span>Strike</span>
<input type="number" value="0" name="attr_strike" />
</label>
<label
><span>Damage</span>
<input type="text" value="0" name="attr_damage" />
</label>
<label
><span>Damage: Paired</span>
<input type="text" value="0" name="attr_damage_paired" />
</label>
<label
><span>Damage: Main Hand</span>
<input type="text" value="0" name="attr_damage_mainhand" />
</label>
<label
><span>Damage: Off Hand</span>
<input type="text" value="0" name="attr_damage_offhand" />
</label>
<label
><span>Disarm</span>
<input type="number" value="0" name="attr_disarm" />
@@ -443,6 +427,19 @@
><span>Body Flip/Throw</span>
<input type="number" value="0" name="attr_flipthrow" />
</label>
<label
><span>Body Block/Tackle</span>
<input type="number" value="0" name="attr_tackle" />
</label>
<label
><span>Tripping/Leg Hook</span>
<input type="number" value="0" name="attr_leghook" />
</label>
<label
><span>Backward Sweep Kick</span>
<input type="number" value="0" name="attr_backwardsweepkick" />
</label>
<hr />
<label
><span>Critical</span> <input type="number" value="" name="attr_critical"
/></label>
@@ -453,6 +450,23 @@
><span>Death Blow</span>
<input type="number" value="0" name="attr_deathblow"
/></label>
<hr />
<label
><span>Damage</span>
<input type="text" value="0" name="attr_damage" />
</label>
<label
><span>Damage: Paired</span>
<input type="text" value="0" name="attr_damage_paired" />
</label>
<label
><span>Damage: Main Hand</span>
<input type="text" value="0" name="attr_damage_mainhand" />
</label>
<label
><span>Damage: Off Hand</span>
<input type="text" value="0" name="attr_damage_offhand" />
</label>
</div>
<div class="combat-offense-range bonus-type-container">
<h3><span>&#x1F52B;</span> Modern <span>&#x1F4A3;</span></h3>
@@ -460,24 +474,12 @@
><span>Strike</span>
<input type="number" value="0" name="attr_strike_range" />
</label>
<label
><span>Damage</span>
<input type="text" value="0" name="attr_damage_range" />
</label>
<label
><span>Damage: Single</span>
<input type="text" value="0" name="attr_damage_range_single" />
</label>
<label
><span>Damage: Pulse/Burst</span>
<input type="text" value="0" name="attr_damage_range_burst" />
</label>
<label
><span>Strike: Single</span>
<input type="number" value="0" name="attr_strike_range_single" />
</label>
<label
><span>Strike: Burst</span>
><span>Strike: Pulse/Burst</span>
<input type="number" value="0" name="attr_strike_range_burst" />
</label>
<label
@@ -526,10 +528,24 @@
/>
<span name="attr_strike_range_aimed_called_pulse"></span>
</label>
<hr />
<label
><span>Disarm</span>
<input type="number" value="0" name="attr_disarm_range" />
</label>
<hr />
<label
><span>Damage</span>
<input type="text" value="0" name="attr_damage_range" />
</label>
<label
><span>Damage: Single</span>
<input type="text" value="0" name="attr_damage_range_single" />
</label>
<label
><span>Damage: Pulse/Burst</span>
<input type="text" value="0" name="attr_damage_range_burst" />
</label>
</div>
<div class="combat-defense bonus-type-container">
<h3><span>&#x1F6E1;</span> Defense <span>&#x1F977;</span></h3>
@@ -565,6 +581,10 @@
><span>Roll w/ Impact</span>
<input type="number" value="0" name="attr_roll" />
</label>
<label
><span>Break Fall</span>
<input type="number" value="0" name="attr_breakfall" />
</label>
</div>
<div class="bonus-type-container">
<h3><span>&#x1F340;</span> Saving Throws <span>&#x1FAA6;</span></h3>
File diff suppressed because it is too large Load Diff
@@ -87,19 +87,32 @@
{{#allprops() title subtitle desc color}}
<div class="sheet-key">{{key}}</div>
<div class="sheet-value">{{value}}</div>
{{/allprops() title subtitle desc color}} {{#desc}}
{{/allprops() title subtitle desc color}}
<!-- -->
{{#desc}}
<div class="sheet-desc">{{desc}}</div>
{{/desc}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-test">
<div class="sheet-template-container">
<h1>{{name}}</h1>
<div class="sheet-results">
<h4>Result = {{roll1}}</h4>
<h4>Custom Result = {{computed::roll1}}</h4>
<rolltemplate class="sheet-rolltemplate-initiative">
<div class="sheet-container sheet-color-{{color}}">
<div class="sheet-header">
{{#title}}
<div class="sheet-title">{{title}}</div>
{{/title}} {{#subtitle}}
<div class="sheet-subtitle">{{subtitle}}</div>
{{/subtitle}}
</div>
<div class="sheet-content">
<div class="sheet-key">Dice Roll</div>
<div class="sheet-value">{{diceroll}}</div>
<div class="sheet-key">Mod {{modifier}}</div>
<div class="sheet-value">{{computed::diceroll}}</div>
{{#desc}}
<div class="sheet-desc">{{desc}}</div>
{{/desc}}
</div>
</div>
</rolltemplate>
@@ -1,19 +1,5 @@
<div class="skills">
<h3>Skills</h3>
<details>
<summary><b>Instructions</b></summary>
<p>
Note that skills include IQ bonus. New skills will default to level 1. All
skills levels will increase with your character level, and recalculate the
Total.
</p>
<p>
Click the <b>&#9432;</b> icon to expand each row so you can copy/paste the
skill description to make life easier for your GM. Note that each section
includes a read-only Row ID that can be used in macros.
</p>
</details>
<p>Click <b>Instructions</b> for detailed instructions.</p>
<div class="heading">
<h5>Info</h5>
<h5>Skill</h5>
@@ -38,6 +24,8 @@
<option value="related">O.C.C. Related</option>
<option value="secondary">Secondary</option>
<option value="rcc">R.C.C.</option>
<option value="racial">Racial</option>
<option value="other">Other</option>
</select>
<input type="number" value="0" name="attr_base" />
<input type="number" value="0" name="attr_perlevel" />
@@ -1,58 +1,56 @@
<div class="wp">
<h3>Weapon Proficiencies</h3>
<div class="wp-container">
<details>
<summary><b>Instructions</b></summary>
<p>
Add a row and select a WP from the list. Weapon Proficiencies
<b>automatically</b> calculate their bonuses based on level.
</p>
<p>
Weapon Proficiencies are automatically added to Profiles &rarr;
<span class="picker-title">Modifier Picker</span>.
</p>
<p>
W.P. Bayonet comes from Adventure Sourcebook - Mercenary Adventures,
page 45.
</p>
</details>
<p>Click <b>Instructions</b> for detailed instructions.</p>
<h3>Ancient Weapon Proficiencies</h3>
<fieldset class="repeating_wp">
<h5>Weapon Proficiency</h5>
<h5>Strike</h5>
<h5>Parry</h5>
<h5>Disarm</h5>
<h5>Throw</h5>
<h5>Entangle</h5>
<h5 title="Rate of Fire">RoF</h5>
<h5>Level</h5>
<h5>Row ID</h5>
<input type="hidden" name="attr_bonus_id" value="" />
<input type="text" list="weapon-proficiencies" name="attr_name" />
<input type="number" value="0" name="attr_strike" />
<input type="number" value="0" name="attr_parry" />
<input type="number" value="0" name="attr_disarm" />
<input type="number" value="0" name="attr_throw" />
<input type="number" value="0" name="attr_entangle" />
<input type="number" value="0" name="attr_rof" title="Rate of Fire" />
<input type="number" value="0" name="attr_level" />
<input type="string" value="" name="attr_rowid" readonly />
</fieldset>
<hr />
<h3>Modern Weapon Proficiencies</h3>
<fieldset class="repeating_wpmodern">
<h5>Weapon Proficiency</h5>
<h5>Single</h5>
<h5>Burst</h5>
<h5>Level</h5>
<h5>Row ID</h5>
<input type="hidden" name="attr_bonus_id" value="" />
<input type="text" list="weapon-proficiencies-modern" name="attr_name" />
<input type="number" value="0" name="attr_strike_range_single" />
<input type="number" value="0" name="attr_strike_range_burst" />
<input type="number" value="0" name="attr_level" />
<input type="text" value="" name="attr_rowid" readonly />
</fieldset>
</div>
<h3>Weapon Proficiencies</h3>
<div class="wp-container">
<details>
<summary><b>Instructions</b></summary>
<p>
Add a row and select a WP from the list. Weapon Proficiencies
<b>automatically</b> calculate their bonuses based on level.
</p>
<p>
Weapon Proficiencies are automatically added to Profiles &rarr;
<span class="picker-title">Modifier Picker</span>.
</p>
<p>
W.P. Bayonet comes from Adventure Sourcebook - Mercenary Adventures, page
45.
</p>
</details>
<p>Click <b>Instructions</b> for detailed instructions.</p>
<h3>Ancient Weapon Proficiencies</h3>
<fieldset class="repeating_wp">
<h5>Weapon Proficiency</h5>
<h5>Strike</h5>
<h5>Parry</h5>
<h5>Disarm</h5>
<h5>Throw</h5>
<h5>Entangle</h5>
<h5 title="Rate of Fire">RoF</h5>
<h5>Level</h5>
<h5>Row ID</h5>
<input type="hidden" name="attr_bonus_id" value="" />
<input type="text" list="weapon-proficiencies" name="attr_name" />
<input type="number" value="0" name="attr_strike" />
<input type="number" value="0" name="attr_parry" />
<input type="number" value="0" name="attr_disarm" />
<input type="number" value="0" name="attr_throw" />
<input type="number" value="0" name="attr_entangle" />
<input type="number" value="0" name="attr_rof" title="Rate of Fire" />
<input type="number" value="0" name="attr_level" />
<input type="string" value="" name="attr_rowid" readonly />
</fieldset>
<hr />
<h3>Modern Weapon Proficiencies</h3>
<fieldset class="repeating_wpmodern">
<h5>Weapon Proficiency</h5>
<h5>Single</h5>
<h5>Burst</h5>
<h5>Level</h5>
<h5>Row ID</h5>
<input type="hidden" name="attr_bonus_id" value="" />
<input type="text" list="weapon-proficiencies-modern" name="attr_name" />
<input type="number" value="0" name="attr_strike_range_single" />
<input type="number" value="0" name="attr_strike_range_burst" />
<input type="number" value="0" name="attr_level" />
<input type="text" value="" name="attr_rowid" readonly />
</fieldset>
</div>
+224 -280
View File
@@ -23,9 +23,7 @@
</li>
<li class="r-tab"><label for="tab-skills">Skills</label></li>
<li class="r-tab"><label for="tab-equipment">Equipment</label></li>
<li class="r-tab">
<label for="tab-wps" title="Weapon Proficiencies">WPs</label>
</li>
<li class="r-tab"><label for="tab-wps">Combat Skills</label></li>
<li class="r-tab"><label for="tab-powersabilities">Abilities</label></li>
<li class="r-tab"><label for="tab-magic">Magic</label></li>
<li class="r-tab"><label for="tab-psionics">Psionics</label></li>
@@ -174,29 +172,56 @@
</div>
<div class="r-tab-content">
<!-- inject:partials/weapon_proficiencies.html -->
<!-- endinject -->
<div class="wp">
<h3>
Hand to Hand & <span title="Robot/Power Armor">RPA</span> Combat
</h3>
<fieldset class="repeating_h2h">
<details class="info">
<summary>
<div class="bonus-thing-heading">
<b class="click-expand"
><span title="Click for more info">&nbsp;&#9432;</span></b
>
<label
><span>Name</span>
<input type="text" list="hand-to-hand" name="attr_name" />
</label>
<label
><span>Level</span>
<input type="number" value="1" name="attr_level" />
</label>
</div>
</summary>
<div class="details-body">
<label class="description"
><b>Description</b>
<textarea
class="full"
name="attr_description"
value=""
></textarea>
</label>
<div class="macro-help">
<label
><span><b>Row ID:</b></span>
<input type="text" readonly name="attr_rowid" value=""
/></label>
</div>
<!-- inject:partials/repeating_modifiers.html -->
<!-- endinject -->
</div>
</details>
</fieldset>
<hr />
<!-- inject:partials/weapon_proficiencies.html -->
<!-- endinject -->
</div>
</div>
<div class="r-tab-content">
<div class="powersabilities">
<h3>Natural Abilities / Powers</h3>
<details>
<summary><b>Instructions</b></summary>
<p>
Enter some natural abilities/powers that are neither magic nor
psionic in nature. Click the <b>&#9432;</b> icon to expand each row.
</p>
<p>
Range, Duration, Frequency, Damage, D.C., and Skill are all
calculated from the per-level values you enter in the details. For
Starting Damage and Damage per Level enter values that roll20 would
use for dice rolls. Ex. "4d6", "1d6", etc.
</p>
<!-- inject:partials/repeated_instructions.html -->
<!-- endinject -->
</details>
<p>Click <b>Instructions</b> for detailed instructions.</p>
<div class="repeating-bonuses-outer">
<div class="heading">
<h5>Info</h5>
@@ -245,28 +270,6 @@
<div class="r-tab-content">
<div class="magic">
<h3>Magic</h3>
<details>
<summary><b>Instructions</b></summary>
<p>
Enter a Spell name and its PPE. Click the <b>&#9432;</b> icon to
expand each row., and fill in the applicable values.
</p>
<p>
Range, Duration, Damage, D.C., and Skill are all calculated from the
per-level values you enter in the details. For Starting Damage and
Damage per Level enter values that roll20 would use for dice rolls.
Ex. "4d6", "1d6", etc.
</p>
<p>
Press the Cast button to remove the PPE from the
<b>Current PPE</b> input field. Click <b>Reset PPE</b> to set
<b>Current PPE</b> back to the value on your Default Profile. Note
the roll buttons beside Damage and Skill.
</p>
<!-- inject:partials/repeated_instructions.html -->
<!-- endinject -->
</details>
<p>Click <b>Instructions</b> for detailed instructions.</p>
<label
><span>Current P.P.E.</span>
<input type="number" name="attr_currentppe" value="0" />
@@ -329,28 +332,6 @@
<div class="r-tab-content">
<div class="psionics">
<h3>Psionics</h3>
<details>
<summary><b>Instructions</b></summary>
<p>
Enter a Psionic name and its ISP. Click the <b>&#9432;</b> icon to
expand each row, and fill in the applicable values.
</p>
<p>
Range, Duration, Damage, D.C., and Skill are all calculated from the
per-level values you enter in the details. For Starting Damage and
Damage per Level enter values that roll20 would use for dice rolls.
Ex. "4d6", "1d6", etc.
</p>
<p>
Press the Use button to remove the ISP from the
<b>Current ISP</b> input field. Click <b>Reset ISP</b> to set
<b>Current ISP</b> back to the value on your Default Profile. Note
the roll button beside Damage and Skill.
</p>
<!-- inject:partials/repeated_instructions.html -->
<!-- endinject -->
</details>
<p>Click <b>Instructions</b> for detailed instructions.</p>
<label
><span>Current I.S.P.</span>
<input type="number" name="attr_currentisp" value="0" />
@@ -418,18 +399,6 @@
<div class="modifiers">
<div class="bonuses-container">
<h3>Modifiers, Weapons, Armor, Gear</h3>
<details>
<summary><b>Instructions</b></summary>
<p>
Complete the repeating sections for your various combat skills and
modifiers. Modifier dropdowns are free-form, so you can type
anything in them and don't need to select from the list. What's
there is just a small sample.
</p>
<!-- inject:partials/repeated_instructions.html -->
<!-- endinject -->
</details>
<p>Click <b>Instructions</b> for detailed instructions.</p>
<div class="repeating-bonuses-outer">
<fieldset class="repeating_modifiers">
<details class="info">
@@ -440,11 +409,7 @@
>
<label
><span>Name</span>
<input
type="text"
list="combat-modifiers"
name="attr_name"
/>
<input type="text" name="attr_name" />
</label>
<label
><span>Level</span>
@@ -481,193 +446,156 @@
<div class="bonuses">
<div class="bonuses-container">
<div class="combat-combined">
<details>
<summary><b>Instructions</b></summary>
<p></p>
<p>
Any modifiers you add on the Modifiers tab will appear as
checkboxes here. Additionally any Abilities, Magic, or Psionics
that you checked <b>Add to Cumulative Modifiers</b> will appear
here. Any Weapon Proficiencies you add on the WPs tab will
appear on this page as well.
</p>
<p>
Create a new Profile in the Profiles section. Check all of the
items that make up that particular profile, click the
<b>&#9432;</b> icon to expand the details, and click the
<b>Apply Checked Modifiers to this Profile</b> button. This will
aggregate all of the bonuses and values from all of the checked
modifiers and store them in that profile. In simple cases, this
may be all you need - stack all of your gear into one Profile,
and that's that. But you might have a profile where you have
some TW Armor that grants abilities, so that's a different
profile than your default. Or you might have a series of spells
you cast to buff up, which you might want to add to another
profile. Or you might be a Glitter Boy pilot that has a totally
different set of gear and bonuses inside and outside his armor.
</p>
<p>
Profiles also allow you to set up different macros with
different configurations, as you can reference the individual
profiles. Note that each Profile includes a read-only field with
the Row ID for use in macros.
</p>
<p>
PP bonus is added to Strike, Parry, Dodge, Throw, Disarm,
Entangle, Dodge: Flight, Dodge: Auto, Dodge: Teleport, and
Dodge: Motion. Damage adds everything together as a rollable
field, and prompts to add Punch damage. Crit/Knockout/Death Blow
use the lowest of the available options (ex. Crit: 17 is better
than Crit: 19).
</p>
<p>
The first Profile in the list is considered the
<b>Default</b> profile and is used to perform global
calculations like speed over time and skill bonuses. Click the
<b>Modify</b> button and drag to reorder as needed.
</p>
<p>
Note that profiles aren't cumulative, but you can make multiple
profiles that are very similar with only one or two differences.
</p>
<details class="info active-container">
<summary>
<h2>
<span class="not-readonly" title="Click for more info"
>&nbsp;&#9432;</span
>
Active
</h2>
</summary>
<!-- inject:partials/active.html -->
<!-- endinject -->
</details>
<p>Click <b>Instructions</b> for detailed instructions.</p>
<hr />
<div class="armor">
<h3>Armor</h3>
<div class="armor-active">
<label
>Damage
<input
type="number"
placeholder="Damage"
name="attr_armordamage"
/>
</label>
<button type="action" name="act_armorapplydamage">
Apply Damage
</button>
</div>
<div class="armor-labels heading">
<label>Active</label>
<label>Name</label>
<label>Movement Modifier %</label>
<label>Base MDC</label>
<label>Current MDC</label>
</div>
<fieldset class="repeating_armor">
<div class="repeating_armor-inner">
<!-- inject:partials/armor.html -->
<!-- endinject -->
</div>
</fieldset>
</div>
<hr />
<div class="profile-builder">
<div class="profiles repeating-bonuses-outer">
<div class="profiles-inner">
<h3>Profiles</h3>
<button type="action" name="act_getdefaultprofile">
Debug Defaults
</button>
<input type="hidden" name="attr_default_mdc" />
<input type="hidden" name="attr_default_profile" />
<label>Active</label>
<fieldset class="repeating_profiles">
<div class="repeating_profiles-inner">
<label>
<input
type="checkbox"
class="is-default"
name="attr_is_default"
value="1"
/>
</label>
<details class="info profile">
<summary>
<div class="bonus-thing-heading">
<b class="click-expand"
><span title="Click for more info"
>&nbsp;&#9432;</span
></b
>
<label
><span>Name</span>
<input type="text" name="attr_name" />
</label>
</div>
</summary>
<div class="details-body">
<div class="profile-management">
<input
type="text"
class="full"
name="attr_bonus_ids"
/>
<input type="hidden" name="attr_bonus_names" />
<div class="bonus-names">
<span name="attr_bonus_names"></span>
</div>
<div class="buttons">
<button
type="action"
name="act_updateprofile"
class="metal-btn btn-silver-flat"
>
Refresh &#x27F3;
</button>
<button
type="action"
name="act_copybonusids"
class="metal-btn btn-silver-flat"
>
Apply
<span class="picker-title"
>Picked Modifiers</span
>
&#x2190;
</button>
<hr />
<button
type="action"
name="act_checkbonusids"
class="metal-btn btn-silver-flat"
>
Replace
<span class="picker-title"
>Picked Modifiers</span
>
using this profile &#x2192;
</button>
</div>
</div>
<!-- inject:partials/repeating_modifiers_readonly.html -->
<!-- endinject -->
</div>
</details>
</div>
</fieldset>
</div>
</div>
<div class="picker">
<div class="picker-inner">
<h3 class="picker-title">Modifier Picker</h3>
<fieldset class="repeating_bonusselections">
<label>
<input type="checkbox" name="attr_enabled" value="1" />
<span name="attr_name"></span
></label>
<input type="hidden" name="attr_name" value="" />
<input type="hidden" name="attr_bonus_id" value="" />
</fieldset>
<div class="selected-ids">
<b>Selected IDs</b>
<div class="armor-profiles">
<div class="armor">
<h3>Armor</h3>
<div class="armor-damage">
<label
>Damage
<input
class="full"
type="text"
name="attr_bonus_ids_output"
value=""
type="number"
placeholder="Damage"
name="attr_armordamage"
/>
</label>
<button type="action" name="act_armorapplydamage">
Apply Damage
</button>
</div>
<div class="armor-labels heading">
<label>Active</label>
<label>Name</label>
<label>Movement Modifier %</label>
<label>Base MDC</label>
<label>Current MDC</label>
</div>
<fieldset class="repeating_armor">
<div class="repeating_armor-inner">
<!-- inject:partials/armor.html -->
<!-- endinject -->
</div>
</fieldset>
</div>
<hr />
<div class="profile-builder">
<div class="profiles repeating-bonuses-outer">
<div class="profiles-inner">
<h3>Profiles</h3>
<button type="action" name="act_getdefaultprofile">
Debug Defaults
</button>
<input type="hidden" name="attr_default_mdc" />
<input type="hidden" name="attr_default_profile" />
<label>Active</label>
<fieldset class="repeating_profiles">
<div class="repeating_profiles-inner">
<label>
<input
type="checkbox"
class="is-default"
name="attr_is_default"
value="1"
/>
</label>
<details class="info profile">
<summary>
<div class="bonus-thing-heading">
<b class="click-expand"
><span title="Click for more info"
>&nbsp;&#9432;</span
></b
>
<label
><span>Name</span>
<input type="text" name="attr_name" />
</label>
</div>
</summary>
<div class="details-body">
<div class="profile-management">
<input
type="text"
class="full"
name="attr_bonus_ids"
/>
<input type="hidden" name="attr_bonus_names" />
<div class="bonus-names">
<span name="attr_bonus_names"></span>
</div>
<div class="buttons">
<button
type="action"
name="act_updateprofile"
class="metal-btn btn-silver-flat"
>
Refresh &#x27F3;
</button>
<button
type="action"
name="act_copybonusids"
class="metal-btn btn-silver-flat"
>
Apply
<span class="picker-title"
>Picked Modifiers</span
>
&#x2190;
</button>
<hr />
<button
type="action"
name="act_checkbonusids"
class="metal-btn btn-silver-flat"
>
Replace
<span class="picker-title"
>Picked Modifiers</span
>
using this profile &#x2192;
</button>
</div>
</div>
<!-- inject:partials/repeating_modifiers_readonly.html -->
<!-- endinject -->
</div>
</details>
</div>
</fieldset>
</div>
</div>
<div class="picker">
<div class="picker-inner">
<h3 class="picker-title">Modifier Picker</h3>
<fieldset class="repeating_bonusselections">
<label>
<input type="checkbox" name="attr_enabled" value="1" />
<span name="attr_name"></span
></label>
<input type="hidden" name="attr_name" value="" />
<input type="hidden" name="attr_bonus_id" value="" />
</fieldset>
<div class="selected-ids">
<b>Selected IDs</b>
<input
class="full"
type="text"
name="attr_bonus_ids_output"
value=""
/>
</div>
</div>
</div>
</div>
@@ -686,11 +614,7 @@
>
<label
><span>Name</span>
<input
type="text"
list="combat-modifiers"
name="attr_name"
/>
<input type="text" list="modifiers" name="attr_name" />
</label>
<label
><span>Level</span>
@@ -734,6 +658,9 @@
/* inject:js/bonuses.js */
/* endinject */
/* inject:js/combat_skills.js */
/* endinject */
/* inject:js/wps.js */
/* endinject */
@@ -762,11 +689,12 @@
/* endinject */
/**
* [] Add a non-repeating section for Default Profile so that profile attributes can be set on the token
* [] Include non-zero modifier in roll template (ex -10 should appear as a line item to indicate it was factored in)
* [] Represent Critical/Knockout from behind
* [] Add skills (WP Paired) from h2h
* [] Define "combat moves" somewhere - stuff from H2H with damage and penalties (loses initiave and one attack), etc.
* [] Refactor to get rid of the Bonuses repeating section and instead go straight from Modifiers to Picked Modifiers. I think the Bonuses section causes weird issues related to network/multiple updates at the same time.
* [] Fix CSS on "Psionics vs. [n]"
* [] Add range to modifiers (guns)
* [] Add minions/pets/henchmen (could just be equivalent to a Profile)
* [] Factor in "Aimed Attack/Called Shot" (/disarm) from WP Targeting (RUE p328)
* - [] Also factor in the natural 19-20 automatic success with a roll template/green highlight
* - [] Including check has WP Targeting
@@ -783,13 +711,6 @@
* [] Add details/summary to some Core background fields like Insanity, Environment, Family Origin, Disposition
* [] Add roll buttons for punches/kicks
* [] Add WP Sharpshooting that takes into account the PP of the profile it's used in
* [x] Make Imp/Exp -> Options, and add checkboxes for:
* ** Or use sheet options - "useroptions" https://wiki.roll20.net/Sheet.json#Example
* - [x] Add PP to disarm/entangle
* - [x] Add IQ to Perception
* - [x] Apply PS damage to each hand or total in Paired attack
* - [] Add Supernatural (and Robotic) punch damage to melee attacks
* - [] Increased magic at Ley Line (+50%, +100%, +200%)
* [x] Two hands worth of damage
* - [x] Separate Main Hand, Off Hand, and Combined damage
* - [] Each damage should include a checkbox for "stacks" vs. "overrides". Overrides uses greatest of.
@@ -815,6 +736,28 @@
* [] Pressing space when typing an ability name expands and collapses the Details panel
* [] Removing Bonus Sources doesn't remove them from Selections
*
* [x] Add option to include IQ bonus on skill-based abilities (Telemechanics, Object Read, Locate, etc.)
* [x] Fix CSS on "Psionics vs. [n]"
* [x] Note how many actions aimed/called shots take
* [x] Skills don't appear to recalculate when the level changes due to character level adjustment
* [x] Move Instructions to Options tab
* [x] Checking Active armor needs to trigger a global armor update
* [x] replace "currentmdc" and "basemdc" armor attributes with "mdc" and "mdc_max"
* - [x] include migration
* [x] Add a non-repeating section for Default Profile so that profile attributes can be set on the token
* - [x] Also include Armor
* [x] Make Imp/Exp -> Options, and add checkboxes for:
* ** Or use sheet options - "useroptions" https://wiki.roll20.net/Sheet.json#Example
* - [x] Add PP to disarm/entangle
* - [x] Add IQ to Perception
* - [x] Apply PS damage to each hand or total in Paired attack
* - [x] Add Supernatural (and Robotic) punch damage to melee attacks
* [x] Set spell strength modifier from h2h
* [x] Add Break Fall defensive bonus
* [x] Add "racial" and "other" to skill categories
* [x] Add RPA to Combat Skills
* [x] Add Hand to Hand selector / auto calculator
* [x] Roll query for dodge - Range attack? 10', 50', N/A
* [x] Add "vs. #" for rolls that are against a static target
* [x] Fix iq_bonus() function to use default profile, not top.
* - [x] skill bonuses aren't calculating properly.
@@ -944,6 +887,7 @@
e.previousValue = "1";
}
// Update WPs
await updateHandToHands("h2h", e.newValue);
await updateWeaponProficiencies("wp", e.newValue, e.previousValue);
await updateWeaponProficiencies("wpmodern", e.newValue, e.previousValue);
await updateSkillLevels(+e.newValue, +e.previousValue);
@@ -1,4 +1,6 @@
@use 'tabs';
@use "tabs";
$picker-color: #3781bd;
@mixin center {
display: flex;
@@ -7,17 +9,47 @@
}
@mixin readonly {
@include center;
background-color: #f5f5f5;
// background-color: #f5f5f5;
background-color: #eee;
margin: 0.1rem 0.2rem;
border-radius: 0.1rem;
font-weight: normal;
padding-left: 0.5rem;
overflow: scroll;
overflow-y: auto;
}
@mixin section {
border: 1px solid #ccc;
padding: 0.5rem;
}
@mixin section-light {
border: 1px solid #eee;
padding: 0.5rem;
}
@mixin box-shadow-inset {
box-shadow: #b0bbc6 3px 3px 6px 0px inset,
rgba(255, 255, 255, 0.25) -3px -3px 6px 1px inset;
}
@mixin box-shadow-raised {
box-shadow: rgba(6, 24, 44, 0.4) 0px 0px 0px 2px,
rgba(6, 24, 44, 0.65) 0px 4px 6px -1px,
rgba(255, 255, 255, 0.08) 0px 1px 0px inset;
}
@mixin hr-lightweight {
width: 100%;
height: 1px;
margin: 0;
border: 0;
background-color: #ccc;
border: 0;
}
@mixin hr-lightweight-light {
width: 100%;
height: 1px;
margin: 0;
border: 0;
background-color: #eee;
border: 0;
}
/* globals */
@@ -51,6 +83,7 @@ a {
.sheet-rolltemplate-strike,
.sheet-rolltemplate-goe,
.sheet-rolltemplate-skill,
.sheet-rolltemplate-initiative,
.sheet-rolltemplate-custom {
margin-left: -7px;
}
@@ -59,6 +92,7 @@ a {
.sheet-rolltemplate-strike,
.sheet-rolltemplate-goe,
.sheet-rolltemplate-skill,
.sheet-rolltemplate-initiative,
.sheet-rolltemplate-custom {
margin-left: -37px;
@@ -132,8 +166,8 @@ a {
}
.danger {
background-color: rgb(220, 53, 69);
color: white;
background-color: rgb(220, 53, 69) !important;
color: white !important;
}
.charsheet {
@@ -161,6 +195,11 @@ a {
content: "";
}
button.action-roll::before {
font-family: "dicefontd20";
content: "t";
}
h4 {
text-decoration: underline;
}
@@ -173,6 +212,10 @@ a {
@include readonly;
}
textarea[readonly] {
@include readonly;
}
details {
display: revert;
margin-bottom: 1rem;
@@ -181,10 +224,20 @@ a {
// display: none;
// }
&.info {
display: block;
margin-bottom: 0;
& > summary {
display: block;
}
}
summary {
display: revert;
cursor: pointer;
h2,
& > h3 {
display: inline-block;
}
@@ -223,15 +276,6 @@ a {
}
}
details.info {
display: block;
margin-bottom: 0;
& > summary {
display: block;
}
}
.full {
width: 100% !important;
}
@@ -289,6 +333,13 @@ a {
}
}
.psi-vs {
justify-content: left !important;
> span {
padding-right: 0.5rem;
}
}
.finance-grid {
display: grid;
gap: 0.5rem;
@@ -443,6 +494,10 @@ a {
}
}
hr {
@include hr-lightweight;
}
input {
width: 5rem;
}
@@ -547,12 +602,12 @@ a {
}
}
.armor {
.armor-active {
label {
display: inline;
}
.armor-damage {
label {
display: inline;
}
}
.armor {
.armor-labels {
display: grid;
gap: 0.5rem;
@@ -601,7 +656,7 @@ a {
}
.picker-title {
color: #3781bd;
color: $picker-color;
}
.profile-builder {
@@ -614,6 +669,10 @@ a {
}
.profiles {
hr {
@include hr-lightweight;
}
.bonus-ps-container {
grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
}
@@ -640,6 +699,10 @@ a {
&.roller {
grid-template-columns: 1fr 1rem 5rem 4rem;
&.initiative {
grid-template-columns: 1fr 1rem 5rem 4rem 5rem;
}
}
&.abs {
@@ -705,6 +768,50 @@ a {
grid-template-columns: 2.5rem 1fr 6rem 8rem 8rem 4rem 8rem 4rem 4rem 5rem 4rem;
}
}
.active-container {
// border: 0.5rem ridge $picker-color;
padding: 0.5rem;
background-color: #eee;
box-shadow: rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px;
&[open] {
padding: 1rem;
background-color: #ccc;
box-shadow: rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px 0px inset;
}
.profile-builder {
hr {
@include hr-lightweight-light;
}
}
.modifiers-combat,
.modifiers-attributes {
> div {
@include section-light;
}
}
.armor-row {
display: grid;
gap: 0.5rem;
grid-template-columns: 15rem 10rem 10rem 10rem 11rem;
align-items: center;
> label {
display: flex;
align-self: center;
text-align: center;
align-items: center;
}
}
}
.armor-profiles {
margin-left: 1rem;
}
}
}