diff --git a/Savage Worlds - Graph Paper/SavageWorldsGraphPaper.css b/Savage Worlds - Graph Paper/SavageWorldsGraphPaper.css
new file mode 100644
index 0000000000..f0dc0a68ab
--- /dev/null
+++ b/Savage Worlds - Graph Paper/SavageWorldsGraphPaper.css
@@ -0,0 +1,4765 @@
+@import url("https://fonts.googleapis.com/css?family=Roboto:ital,wght@0,300;0,400;0,500;0,700;0,900;1,300;1,400;1,500;1,700;1,900&display=swap");
+.charsheet {
+ padding: 0 !important;
+}
+
+.charsheet button[type=roll] {
+ text-shadow: none;
+ font-size: inherit !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+
+.charsheet button[type=roll]::before {
+ display: none;
+}
+
+.charsheet button[type=roll]:hover, .charsheet button[type=roll]:focus, .charsheet button[type=roll]:active {
+ background-color: transparent;
+ box-shadow: none;
+}
+
+.repcontrol {
+ position: absolute;
+ bottom: -1px;
+ right: 0;
+ z-index: 2;
+ display: flex;
+}
+
+.repcontrol button.btn {
+ position: relative;
+ color: transparent;
+ font-size: 0;
+ height: 16px;
+ width: 16px;
+ transition: color .3s ease-in-out, opacity .3s ease-in-out;
+}
+
+.repcontrol button.btn::after, .repcontrol button.btn::before {
+ transition: color .3s ease-in-out, opacity .3s ease-in-out;
+}
+
+.repcontrol button.btn:hover, .repcontrol button.btn:focus, .repcontrol button.btn:active {
+ background-color: transparent;
+ box-shadow: none;
+}
+
+.repcontrol button.btn::after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #d6d6d6;
+ font-family: Pictos;
+ font-size: 12px;
+ line-height: 1;
+ height: 100%;
+ width: 100%;
+}
+
+.repcontrol button.btn:hover::after {
+ color: #606060;
+}
+
+.repcontrol button.btn:active::after {
+ color: black;
+}
+
+.repcontrol button.btn.repcontrol_add {
+ order: 1;
+}
+
+.repcontrol button.btn.repcontrol_add::after {
+ content: '&';
+}
+
+.repcontrol button.btn.repcontrol_edit {
+ order: 2;
+ float: none;
+}
+
+.repcontrol button.btn.repcontrol_edit::after {
+ content: '_';
+}
+
+.repcontainer.editmode + .repcontrol button.repcontrol_edit::after {
+ content: '3';
+}
+
+.repcontainer.editmode .sheet-repitem__note-box,
+.repcontainer.editmode .sheet-repitem__settings {
+ display: none;
+}
+
+.repcontainer.editmode .itemcontrol {
+ z-index: 10;
+ display: flex !important;
+ justify-content: space-between;
+ background-color: rgba(255, 255, 255, 0.5) !important;
+ border-radius: 2px;
+ margin: 0 2px;
+ width: calc(100% - 4px) !important;
+}
+
+.repcontainer.editmode .itemcontrol a.repcontrol_move {
+ order: 1;
+ font-size: 18px;
+ border-radius: 2px 0 0 2px;
+ padding: 0 2px 0 0;
+}
+
+.repcontainer.editmode .itemcontrol button.repcontrol_del {
+ order: 2;
+ float: none !important;
+ font-family: Pictos;
+ font-size: 12px;
+ border-radius: 0 2px 2px 0;
+ padding: 0 0 0 4px;
+}
+
+.repcontainer.editmode .itemcontrol a.repcontrol_move,
+.repcontainer.editmode .itemcontrol button.repcontrol_del {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: #fff;
+ text-shadow: none;
+ color: #404040;
+ line-height: 1;
+ border: 0;
+ height: 100%;
+ width: 20px;
+ max-height: 20px;
+ box-shadow: none;
+}
+
+.repcontainer.editmode .itemcontrol a.repcontrol_move:hover,
+.repcontainer.editmode .itemcontrol button.repcontrol_del:hover {
+ color: black !important;
+}
+
+.repcontainer.editmode .itemcontrol a.repcontrol_move:active,
+.repcontainer.editmode .itemcontrol button.repcontrol_del:active {
+ color: black !important;
+ box-shadow: none;
+ background: #fff;
+}
+
+.repcontainer.editmode div.repitem:hover .itemcontrol {
+ background-color: rgba(255, 255, 255, 0.7) !important;
+}
+
+*,
+::before,
+::after {
+ box-sizing: border-box;
+}
+
+p {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ margin: 0 0 8px 0;
+}
+
+ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+ul li b:first-child {
+ display: inline-block;
+ padding-right: 8px;
+ min-width: 96px;
+}
+
+textarea,
+select,
+button,
+fieldset,
+input,
+option,
+label {
+ display: flex;
+ background-color: transparent;
+ background-image: none;
+ font-family: inherit;
+ font-weight: 400;
+ text-decoration: none;
+ padding: 0;
+ margin: 0;
+ border: 0;
+ border-radius: 0;
+ outline: 0 !important;
+ min-width: 0;
+ box-shadow: none;
+ appearance: none;
+ -moz-appearance: none;
+ -webkit-appearance: none;
+}
+
+textarea::placeholder,
+select::placeholder,
+button::placeholder,
+fieldset::placeholder,
+input::placeholder,
+option::placeholder,
+label::placeholder {
+ color: #d6d6d6;
+}
+
+button,
+label,
+input[type=checkbox],
+input[type=radio] {
+ cursor: pointer;
+}
+
+button:hover, button:hover > span,
+button > span:hover,
+button > span:hover > span {
+ color: #303030 !important;
+}
+
+button[type=action] {
+ color: #606060;
+ font-size: 10px;
+ font-weight: 500;
+ line-height: 1;
+}
+
+input[type=text]:not(.sheet-hex) {
+ background-color: transparent;
+ color: #404040;
+ font-size: 10px;
+ line-height: 20px;
+ text-overflow: ellipsis;
+}
+
+input[type=text]:not(.sheet-hex)::placeholder {
+ font-size: 8px;
+ line-height: 20px;
+}
+
+input[type=text]:not(.sheet-hex):not(.sheet-align-left) {
+ text-align: center;
+}
+
+input[type=hidden] {
+ display: none;
+}
+
+textarea {
+ color: #606060;
+ font-size: 9px;
+ line-height: 1.6;
+ width: 100%;
+ resize: none;
+}
+
+input.sheet-checkbox[type=checkbox] {
+ background-color: #fff;
+ border: 1px solid #808080;
+ border-radius: 2px;
+ height: 10px;
+ width: 10px;
+}
+
+input.sheet-checkbox[type=checkbox]::before {
+ content: '';
+ display: block;
+ border-radius: 1px;
+ margin: 1px 0 0 1px;
+ height: 6px;
+ width: 6px;
+}
+
+input.sheet-checkbox[type=checkbox]:checked::before {
+ background-color: #808080;
+}
+
+.sheet-wrapper {
+ text-align: center;
+}
+
+.sheet-body {
+ color: #404040;
+ font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-size: 10px;
+ line-height: 1;
+ text-align: left;
+ background-image: linear-gradient(to right, #fbfbfb 1px, transparent 1px), linear-gradient(to bottom, #fbfbfb 1px, transparent 1px);
+ background-size: 8px 8px;
+ background-position: -1px -1px;
+ padding-top: 8px;
+ margin: 0 auto;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+}
+
+.sheet-body > div {
+ margin: 0 auto;
+}
+
+.sheet-body ~ rolltemplate {
+ display: none;
+}
+
+.sheet-variant-radio {
+ display: inline-block;
+}
+
+.sheet-variant-radio::after {
+ content: '';
+ display: inline-block;
+ padding: 3px;
+ border: 1px solid #e0e0e0;
+ border-radius: 50%;
+}
+
+.sheet-variant-radio:checked::after {
+ background-color: #e0e0e0;
+}
+
+.sheet-variant-radio--wildcard:checked ~ .sheet-body {
+ width: 800px;
+}
+
+.sheet-variant-radio--wildcard:checked ~ .sheet-body .sheet-extra {
+ display: none;
+}
+
+.sheet-variant-radio--extra:checked ~ .sheet-body {
+ width: 474px;
+}
+
+.sheet-variant-radio--extra:checked ~ .sheet-body .sheet-wildcard {
+ display: none;
+}
+
+.sheet-wildcard .sheet-section {
+ display: flex;
+ justify-content: space-between;
+}
+
+.sheet-wildcard .sheet-section > .sheet-left {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 0;
+ width: 470px;
+}
+
+.sheet-wildcard .sheet-section > .sheet-right {
+ flex-grow: 1;
+}
+
+.sheet-hidden {
+ display: none;
+}
+
+.sheet-block {
+ position: relative;
+ margin-top: 40px;
+}
+
+.sheet-header {
+ display: flex;
+ justify-content: space-between;
+ padding-bottom: 4px;
+ border-bottom: 1px dotted #e0e0e0;
+ height: 16px;
+}
+
+.sheet-header__title {
+ display: block;
+ flex-grow: 1;
+ color: #606060;
+ font-size: 12px;
+ font-weight: 700;
+ text-transform: uppercase;
+}
+
+.sheet-header__labels {
+ display: flex;
+ align-items: flex-end;
+ line-height: .5;
+ text-align: center;
+ text-transform: uppercase;
+ padding-right: 16px;
+}
+
+.sheet-header__labels > span {
+ display: block;
+}
+
+.sheet-label,
+.sheet-header__labels * {
+ color: #b0b0b0;
+ font-size: 8px;
+}
+
+.sheet-large-label {
+ color: #606060;
+ font-size: 12px;
+ font-weight: 700;
+ text-transform: uppercase;
+}
+
+.sheet-footer {
+ color: #606060;
+ line-height: 16px;
+ height: 16px;
+}
+
+.sheet-toggle:not(:checked):not(.sheet-toggle--special) + *, .sheet-toggle:not(:checked):not(.sheet-toggle--special) ~ .repcontainer, .sheet-toggle:not(:checked):not(.sheet-toggle--special) ~ .repcontrol {
+ display: none;
+}
+
+.sheet-toggle::after {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #808080;
+ line-height: 1;
+ width: 16px;
+}
+
+.sheet-toggle:checked::after {
+ color: #606060;
+}
+
+.sheet-toggle--block {
+ display: none;
+}
+
+.sheet-toggle--visibility {
+ position: absolute;
+ top: 4px;
+ right: 0;
+}
+
+.sheet-toggle--visibility::after {
+ content: '`';
+ color: #d6d6d6;
+ font-size: 10px;
+ font-family: Pictos;
+ height: 10px;
+}
+
+.sheet-toggle--visibility:checked::after {
+ color: #d6d6d6;
+}
+
+.sheet-toggle--visibility:checked::after {
+ content: 'J';
+}
+
+.sheet-toggle--arrow {
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+
+.sheet-toggle--arrow::after {
+ content: '►';
+ font-size: 8px;
+ line-height: 20px;
+ height: 20px;
+ width: 20px;
+ transform-origin: 9px 10px;
+ transition: transform .3s ease-in-out;
+}
+
+.sheet-toggle--arrow:checked::after {
+ transform: rotate(90deg);
+}
+
+.sheet-toggle--settings::after, .sheet-toggle--note-box::after, .sheet-toggle--loss::after {
+ color: #b0b0b0;
+ font-family: Pictos;
+ font-size: 10px;
+ padding-top: 1px;
+ width: 10px;
+}
+
+.sheet-toggle--settings::after {
+ content: 'y';
+}
+
+.sheet-toggle--note-box::after {
+ content: 'n';
+}
+
+.sheet-toggle--loss::after {
+ content: 'Q';
+}
+
+.sheet-toggle--weight::after {
+ content: 'V';
+ color: #b0b0b0;
+ font-family: Pictos;
+ font-size: 12px;
+ padding-top: 1px;
+ width: 10px;
+ transform: rotateZ(-90deg) scaleX(0.75);
+}
+
+.sheet-toggle--spoiler::after {
+ content: '&';
+ color: #606060;
+ font-family: Pictos;
+ font-size: 10px;
+ height: 100%;
+}
+
+.sheet-toggle--spoiler:checked::after {
+ content: '_';
+}
+
+.sheet-toggle--list-roll:not(:checked) ~ .sheet-repitem__skill-roll {
+ display: none;
+}
+
+.sheet-radio-track {
+ position: relative;
+ flex-shrink: 0;
+ background-color: #fff;
+ box-shadow: 0 0 1.5px 0 rgba(0, 0, 0, 0.5);
+}
+
+.sheet-radio-track::before {
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #fff;
+ font-size: 9px;
+ height: 100%;
+ width: 100%;
+}
+
+.sheet-radio-track::after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ display: block;
+ border-radius: inherit;
+ height: 0;
+ width: 0;
+ transform: translate(-50%, -50%);
+ transition: height .3s ease-in-out, width .3s ease-in-out, background-color .1s ease-in-out;
+}
+
+.sheet-radio-track:hover::after, .sheet-radio-track:hover ~ .sheet-radio-track:not(:checked)::after {
+ background-color: #f2f2f2;
+ height: 60%;
+ width: 60%;
+}
+
+.sheet-radio-track:checked::after,
+.sheet-radio-track:checked ~ .sheet-radio-track:not(:checked)::after {
+ background-color: #898989;
+ height: 100%;
+ width: 100%;
+ transition-duration: .1s;
+}
+
+.sheet-tooltip {
+ pointer-events: none;
+ position: absolute;
+ display: flex;
+ align-items: center;
+ background-color: #606060;
+ color: #fff;
+ font-size: 10px;
+ line-height: 1;
+ padding: 2px 6px;
+ border-radius: 2px;
+ opacity: 0;
+ transition: opacity .3s ease-in-out;
+}
+
+.sheet-tooltip span:not(:last-child) {
+ margin-right: 2px;
+}
+
+.sheet-tooltip::after {
+ content: '';
+ position: absolute;
+ height: 10px;
+ width: 10px;
+}
+
+.sheet-tooltip--left {
+ top: 50%;
+ left: -6px;
+ transform: translate(-100%, -50%);
+}
+
+.sheet-tooltip--left::after {
+ top: 50%;
+ right: -8px;
+ border: 5px solid transparent;
+ border-left-color: #606060;
+ transform: translateY(-50%);
+}
+
+.sheet-tooltip--top {
+ top: -6px;
+ left: 50%;
+ transform: translate(-50%, -100%);
+}
+
+.sheet-tooltip--top::after {
+ bottom: -8px;
+ left: 50%;
+ border: 5px solid transparent;
+ border-top-color: #606060;
+ transform: translateX(-50%);
+}
+
+.sheet-damage-roll-toggle-label {
+ display: block;
+ line-height: 4px;
+ text-align: center;
+ padding-right: 10px;
+}
+
+.sheet-damage-roll-toggle-label input[type=checkbox]:checked ~ span {
+ color: #606060;
+ font-weight: 500;
+}
+
+.sheet-damage-roll-toggle-label .sheet-icon {
+ display: inline-block;
+ font-family: Pictos;
+ font-size: 10px;
+ margin-right: 4px;
+}
+
+.sheet-damage-roll-toggle ~ .repcontainer .sheet-damage-button-overlay {
+ position: relative;
+}
+
+.sheet-damage-roll-toggle ~ .repcontainer .sheet-damage-button-overlay button[type=roll] {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ display: block;
+ height: 100%;
+ width: 100%;
+}
+
+.sheet-damage-roll-toggle:checked ~ .repcontainer .sheet-damage-button-overlay button[type=roll] {
+ z-index: 1;
+}
+
+.sheet-damage-roll-toggle:checked ~ .repcontainer .sheet-damage-button-overlay input[type=text] {
+ position: relative;
+ z-index: 0;
+ font-weight: 500;
+}
+
+.sheet-damage-roll-toggle:checked ~ .repcontainer .sheet-damage-button-overlay input[type=text]:placeholder-shown {
+ z-index: 2;
+}
+
+.sheet-label-toggle {
+ user-select: none;
+ flex-shrink: 0;
+ width: auto;
+}
+
+.sheet-label-toggle input.sheet-label-toggle__input[type=text] {
+ background-color: #fff;
+ color: #606060;
+ line-height: 14px;
+ border: 1px solid #898989;
+ border-width: 1px;
+ border-radius: 0 2px 2px 0;
+ padding: 0 4px;
+ margin-left: -2px;
+ height: 14px;
+ width: 96px;
+}
+
+.sheet-label-toggle input.sheet-label-toggle__input[type=text]:first-child {
+ border-left-width: 2px;
+}
+
+.sheet-label-toggle input.sheet-label-toggle__input--tiny[type=text] {
+ width: 32px;
+}
+
+.sheet-label-toggle input.sheet-label-toggle__input[type=text]::placeholder {
+ line-height: 12px;
+}
+
+.sheet-label-toggle span {
+ display: block;
+ flex-shrink: 0;
+ background-color: #898989;
+ color: #fff;
+ font-size: 8px;
+ font-weight: 500;
+ line-height: 15px;
+ border-radius: 2px;
+ padding: 0 4px;
+ height: 14px;
+}
+
+.sheet-label-toggle--full-row {
+ flex-basis: 100%;
+}
+
+.sheet-label-toggle--full-row input.sheet-label-toggle__input[type=text] {
+ text-align: left;
+ width: 100%;
+}
+
+.sheet-label-toggle input[type=checkbox] {
+ display: none;
+}
+
+.sheet-label-toggle input[type=checkbox]:not(:checked) + span {
+ background-color: #d6d6d6;
+}
+
+.sheet-label-toggle input[type=checkbox]:not(:checked) ~ input.sheet-label-toggle__input[type=text] {
+ color: #b0b0b0;
+ border-color: #d6d6d6;
+}
+
+.sheet-toggle-roboto:checked ~ .sheet-body {
+ font-family: Roboto, Arial, Helvetica, sans-serif;
+}
+
+.sheet-toggle-dark-labels:checked ~ .sheet-body .sheet-header__labels *,
+.sheet-toggle-dark-labels:checked ~ .sheet-body .sheet-label,
+.sheet-toggle-dark-labels:checked ~ .sheet-body .sheet-hexfield__label {
+ color: #606060 !important;
+}
+
+.sheet-toggle-skill-die-numbers:not(:checked) ~ .sheet-body .sheet-radio-track::before {
+ display: none;
+}
+
+.sheet-toggle-corners:not(:checked) ~ .sheet-body :not(.sheet-icon):not(.sheet-color-cycle__radio) {
+ border-radius: 0 !important;
+}
+
+.sheet-toggle-corners:not(:checked) ~ .sheet-body :not(.sheet-icon):not(.sheet-color-cycle__radio)::before, .sheet-toggle-corners:not(:checked) ~ .sheet-body :not(.sheet-icon):not(.sheet-color-cycle__radio)::after {
+ border-radius: 0 !important;
+}
+
+.sheet-toggle-transitions:not(:checked) ~ .sheet-body *,
+.sheet-toggle-transitions:not(:checked) ~ .sheet-body ::before,
+.sheet-toggle-transitions:not(:checked) ~ .sheet-body ::after {
+ transition-duration: 0s !important;
+}
+
+.sheet-toggle-delays:not(:checked) ~ .sheet-body *,
+.sheet-toggle-delays:not(:checked) ~ .sheet-body ::before,
+.sheet-toggle-delays:not(:checked) ~ .sheet-body ::after {
+ transition-delay: 0s !important;
+}
+
+.sheet-toggle-grid:not(:checked) ~ .sheet-body {
+ background: none;
+}
+
+.sheet-toggle-description-input:not(:checked) ~ .repcontainer .sheet-roll-description {
+ display: none;
+}
+
+.sheet-toggle-injection-input:not(:checked) ~ .repcontainer .sheet-roll-injection {
+ display: none;
+}
+
+.sheet-hex {
+ position: relative;
+ display: block;
+ background-repeat: no-repeat;
+ background-position: center;
+ color: #606060;
+ font-weight: 700;
+ text-align: center;
+ padding: 0 6px;
+ filter: drop-shadow(rgba(0, 0, 0, 0.5) 0px 0px 0.7px);
+}
+
+.sheet-hex::placeholder {
+ color: #d6d6d6;
+ font-size: inherit;
+ font-weight: inherit;
+ line-height: inherit;
+}
+
+.sheet-hex--36 {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/hexagon_36.svg");
+ font-size: 12px;
+ line-height: 36px;
+ height: 36px !important;
+ width: 36px;
+}
+
+.sheet-hex--48 {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/hexagon_48.svg");
+ font-size: 16px !important;
+ line-height: 48px;
+ height: 48px !important;
+ width: 48px;
+}
+
+.sheet-hex--64 {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/hexagon_64.svg");
+ font-size: 18px !important;
+ line-height: 64px;
+ height: 64px !important;
+ width: 64px;
+}
+
+.sheet-color-cycle {
+ position: relative;
+ height: 16px;
+ width: 16px;
+}
+
+.sheet-color-cycle__radio {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 1;
+ background-color: transparent;
+ padding: 4px;
+ border-radius: 50%;
+ opacity: 0;
+ transform: translate(-50%, -50%);
+}
+
+.sheet-color-cycle__radio:checked {
+ opacity: 1;
+}
+
+.sheet-color-cycle__radio:checked + input {
+ z-index: 3;
+}
+
+.sheet-color-cycle__radio--none, .sheet-color-cycle__radio--novice {
+ z-index: 2;
+}
+
+.sheet-color-cycle__radio--none:checked, .sheet-color-cycle__radio--novice:checked {
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.sheet-color-cycle__radio--red:checked {
+ background-color: #d9534f;
+ border-color: #d9534f;
+}
+
+.sheet-color-cycle__radio--yellow:checked {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
+}
+
+.sheet-color-cycle__radio--blue:checked {
+ background-color: #0275d8;
+ border-color: #0275d8;
+}
+
+.sheet-color-cycle__radio--green:checked {
+ background-color: #5cb85c;
+ border-color: #5cb85c;
+}
+
+.sheet-color-cycle__radio--purple:checked {
+ background-color: #b25afd;
+ border-color: #b25afd;
+}
+
+.sheet-color-cycle__radio--gray:checked {
+ background-color: #545454;
+ border-color: #545454;
+}
+
+.sheet-color-cycle__radio:last-child:checked {
+ z-index: 1;
+}
+
+.sheet-wildcard button.sheet-repitem__skill-roll--extra {
+ display: none;
+}
+
+.sheet-extra button.sheet-repitem__skill-roll--wildcard {
+ display: none;
+}
+
+fieldset,
+.repcontainer {
+ padding: 6px 0;
+ min-height: 32px;
+}
+
+.repcontainer:empty ~ .repcontrol .repcontrol_add::before {
+ content: '+ + +';
+ position: absolute;
+ top: -27px;
+ right: -16px;
+ background-color: #f2f2f2;
+ color: #808080;
+ font-size: 10px;
+ line-height: 21px;
+ border-radius: 2px;
+ height: 20px;
+ width: 470px;
+}
+
+.repitem:not(:first-child) {
+ margin-top: 4px;
+}
+
+.repitem input[type=text]::placeholder {
+ line-height: 20px;
+}
+
+.sheet-repitem {
+ position: relative;
+ background-color: #fdfdfd;
+ border-radius: 2px;
+ width: 100%;
+ box-shadow: 0 0 1.5px 0 rgba(0, 0, 0, 0.5);
+}
+
+.sheet-repitem:not(:last-child) {
+ margin-bottom: 4px;
+}
+
+.sheet-repitem button.sheet-repitem__skill-roll {
+ font-family: Pictos;
+ color: #606060;
+ font-size: 10px;
+ height: 16px;
+ line-height: 15px;
+ margin-right: 4px !important;
+}
+
+.sheet-repitem--full-field textarea {
+ font-size: 10px;
+ line-height: 16px;
+ padding: 2px 16px 2px 6px;
+ height: 20px;
+}
+
+.sheet-repitem__size-radio {
+ position: absolute;
+ right: 0;
+ top: 2px;
+ z-index: 1;
+}
+
+.sheet-repitem__size-radio--1:not(:checked) {
+ z-index: 2;
+}
+
+.sheet-repitem__size-radio:checked {
+ z-index: 0;
+ opacity: 0;
+}
+
+.sheet-repitem__size-radio:checked + input[type=radio] {
+ z-index: 3;
+}
+
+.sheet-repitem__size-radio::after {
+ content: attr(label);
+ display: block;
+ color: #d6d6d6;
+ font-family: Pictos;
+ font-size: 10px;
+ line-height: 15px;
+ text-align: center;
+ height: 16px;
+ width: 16px;
+}
+
+.sheet-repitem__size-radio:hover::after {
+ color: #606060;
+}
+
+.sheet-repitem__primary, .sheet-repitem__secondary {
+ display: flex;
+ align-items: center;
+}
+
+.sheet-repitem__primary > input.sheet-stretch, .sheet-repitem__secondary > input.sheet-stretch {
+ flex-grow: 1;
+ width: auto;
+}
+
+.sheet-repitem__primary {
+ position: relative;
+ padding: 0 16px 0 6px;
+ height: 20px;
+}
+
+.sheet-repitem__primary .sheet-toggle--note-box {
+ padding-right: 4px;
+}
+
+.sheet-repitem__primary .sheet-toggle--note-box::after {
+ padding-top: 0;
+}
+
+.sheet-repitem__secondary {
+ padding-top: 1px;
+ height: 16px;
+}
+
+.sheet-repitem__secondary .sheet-toggle:not(:last-of-type) {
+ margin-right: 4px;
+}
+
+.sheet-repitem__secondary input[type=text]::placeholder {
+ line-height: 16px;
+}
+
+.sheet-repitem__secondary, .sheet-repitem__frame {
+ color: #606060;
+ font-size: 9px;
+ margin: 0 6px;
+ border-top: 1px dotted #e0e0e0;
+}
+
+.sheet-repitem__secondary input[type=text], .sheet-repitem__frame input[type=text] {
+ color: #606060;
+ font-size: 9px;
+ line-height: 16px;
+}
+
+.sheet-repitem__secondary input[type=text]::placeholder, .sheet-repitem__frame input[type=text]::placeholder {
+ font-size: 9px !important;
+}
+
+.sheet-repitem__frame {
+ display: flex;
+ height: 64px;
+}
+
+.sheet-repitem__frame-silhouette {
+ background-repeat: no-repeat;
+ background-size: 80%;
+ background-position: center;
+ height: 100%;
+ width: 64px;
+ opacity: .25;
+}
+
+.sheet-repitem__frame-silhouette-button {
+ height: 100% !important;
+ width: 100%;
+}
+
+.sheet-repitem__frame-build {
+ flex-grow: 1;
+ margin-left: 8px;
+ height: 100%;
+}
+
+.sheet-repitem__frame-build textarea {
+ padding-top: 6px;
+ height: 100%;
+}
+
+.sheet-repitem__settings {
+ position: absolute;
+ bottom: 2px;
+ right: -1px;
+ z-index: 3;
+ background-color: #fdfdfd;
+ padding: 4px 6px 0;
+ border: 1px solid #dbdbdb;
+ border-radius: 0 0 2px 2px;
+ border-width: 0 1px 1px;
+ width: calc(100% + 2px);
+ transform: translateY(100%);
+}
+
+.sheet-repitem__settings-content {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ border-top: 1px dotted #e0e0e0;
+ padding-top: 4px;
+ margin-top: -2px;
+}
+
+.sheet-repitem__settings-content > label {
+ margin-bottom: 4px;
+}
+
+.sheet-repitem__settings-content > :not(:last-child) {
+ margin-right: 4px;
+}
+
+.sheet-repitem__label {
+ font-weight: 500;
+ margin: 0 4px 0 6px;
+ line-height: 16px;
+}
+
+.sheet-repitem__label::after {
+ content: ':';
+}
+
+.sheet-repitem__note-box {
+ position: absolute;
+ top: 4px;
+ right: -1px;
+ z-index: 3;
+ background-color: #fdfdfd;
+ padding: 4px 6px;
+ border: 1px solid #dbdbdb;
+ border-radius: 2px 2px 0 0;
+ border-width: 1px 1px 0 1px;
+ width: calc(100% + 2px);
+ transform: translateY(-100%);
+}
+
+.sheet-repitem__note-box textarea {
+ border-bottom: 1px dotted #e0e0e0;
+ height: 60px;
+}
+
+.sheet-repitem .sheet-toggle--arrow:not(:checked) ~ .sheet-repitem__weapons {
+ display: none;
+}
+
+.sheet-repitem__subitem {
+ position: relative;
+}
+
+.sheet-repitem__subitem .sheet-repitem__primary,
+.sheet-repitem__subitem input[type=text] {
+ font-size: 9px !important;
+ line-height: 16px;
+ height: 16px;
+}
+
+.sheet-repitem__subitem .sheet-repitem__note-box {
+ top: 2px;
+ padding: 4px 6px 2px;
+}
+
+.sheet-repitem .sheet-repitem__weapons .sheet-repitem__note-box {
+ right: -7px;
+ width: calc(100% + 14px);
+}
+
+.sheet-repitem .sheet-repitem__weapons .sheet-toggle--arrow::after {
+ line-height: 16px;
+ margin: 1px 2px 0 0;
+ height: 16px;
+ width: 16px;
+ transform-origin: 7px 8px;
+}
+
+.sheet-repitem .sheet-repitem__weapons .sheet-toggle--note-box::after {
+ padding-top: 1px;
+}
+
+.sheet-repitem__weapons-control[value='0'] + .sheet-repitem__weapons {
+ display: none;
+}
+
+.sheet-repitem__weapons-control[value='1'] + .sheet-repitem__weapons .sheet-repitem__subitem:nth-child(-n + 2), .sheet-repitem__weapons-control[value='2'] + .sheet-repitem__weapons .sheet-repitem__subitem:nth-child(-n + 3), .sheet-repitem__weapons-control[value='3'] + .sheet-repitem__weapons .sheet-repitem__subitem:nth-child(-n + 4), .sheet-repitem__weapons-control[value='4'] + .sheet-repitem__weapons .sheet-repitem__subitem:nth-child(-n + 5), .sheet-repitem__weapons-control[value='5'] + .sheet-repitem__weapons .sheet-repitem__subitem:nth-child(-n + 6), .sheet-repitem__weapons-control[value='6'] + .sheet-repitem__weapons .sheet-repitem__subitem:nth-child(-n + 7), .sheet-repitem__weapons-control[value='7'] + .sheet-repitem__weapons .sheet-repitem__subitem:nth-child(-n + 8), .sheet-repitem__weapons-control[value='8'] + .sheet-repitem__weapons .sheet-repitem__subitem:nth-child(-n + 9), .sheet-repitem__weapons-control[value='9'] + .sheet-repitem__weapons .sheet-repitem__subitem:nth-child(-n + 10), .sheet-repitem__weapons-control[value='10'] + .sheet-repitem__weapons .sheet-repitem__subitem:nth-child(-n + 11) {
+ display: block;
+}
+
+.sheet-repitem__weapons .sheet-header {
+ border-bottom: 1px solid #e0e0e0;
+}
+
+.sheet-repitem__weapons .sheet-header__labels {
+ padding-right: 30px;
+ width: 100%;
+}
+
+.sheet-repitem__weapons .sheet-repitem__subitem {
+ display: none;
+}
+
+.sheet-repitem__weapons .sheet-repitem__subitem:not(.sheet-repitem__subitem--1) .sheet-repitem__primary {
+ border-top: 1px solid #e0e0e0;
+}
+
+.sheet-repitem__weapons .sheet-repitem__primary {
+ margin-right: 6px;
+ padding-right: 10px;
+}
+
+.sheet-repitem__weapons-name {
+ flex-grow: 1;
+ text-align: left;
+ padding-left: 6px;
+}
+
+.sheet-repitem__weapons input.sheet-repitem__weapons-name[type=text] {
+ padding-left: 0;
+}
+
+.sheet-repitem__weapons-damage, .sheet-repitem__weapons-range {
+ width: 85px;
+}
+
+.sheet-repitem__weapons-rof {
+ width: 30px;
+}
+
+div:not(:hover) > .sheet-hide-until-needed > div,
+div:not(:hover) > .sheet-hide-until-needed > input,
+div.sheet-health:not(:hover) .sheet-health__center .sheet-hexfield > div,
+div.sheet-health:not(:hover) .sheet-health__center .sheet-hexfield > input {
+ opacity: 0;
+}
+
+div:not(:hover) > .sheet-hide-until-needed input:hover,
+div:not(:hover) > .sheet-hide-until-needed input:focus,
+div.sheet-health:not(:hover) .sheet-health__center .sheet-hexfield input:hover,
+div.sheet-health:not(:hover) .sheet-health__center .sheet-hexfield input:focus {
+ opacity: 1;
+}
+
+div:not(:hover) > .sheet-hide-until-needed input:hover ~ div,
+div:not(:hover) > .sheet-hide-until-needed input:hover ~ input,
+div:not(:hover) > .sheet-hide-until-needed input:focus ~ div,
+div:not(:hover) > .sheet-hide-until-needed input:focus ~ input,
+div.sheet-health:not(:hover) .sheet-health__center .sheet-hexfield input:hover ~ div,
+div.sheet-health:not(:hover) .sheet-health__center .sheet-hexfield input:hover ~ input,
+div.sheet-health:not(:hover) .sheet-health__center .sheet-hexfield input:focus ~ div,
+div.sheet-health:not(:hover) .sheet-health__center .sheet-hexfield input:focus ~ input {
+ opacity: 1;
+}
+
+.sheet-hexfield {
+ position: relative;
+ white-space: nowrap;
+ color: #606060;
+ height: 36px;
+ width: 36px;
+ transition: color .3s ease-in-out, opacity .3s ease-in-out;
+}
+
+.sheet-hexfield div,
+.sheet-hexfield input {
+ transition: color .3s ease-in-out, opacity .3s ease-in-out;
+ transition-delay: .4s;
+}
+
+.sheet-hexfield-gray, .sheet-hexfield-gray input {
+ color: #b0b0b0;
+}
+
+.sheet-hexfield .sheet-hexfield .sheet-hexfield__label {
+ color: #b0b0b0;
+}
+
+.sheet-hexfield.sheet-stay-on-input input:not(:placeholder-shown) {
+ opacity: 1 !important;
+}
+
+.sheet-hexfield.sheet-stay-on-input input:not(:placeholder-shown) ~ :not(.sheet-exception) {
+ color: #606060;
+ opacity: 1 !important;
+}
+
+.sheet-hexfield__label {
+ position: absolute;
+ top: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ font-size: 9px !important;
+ font-weight: 500;
+ line-height: 10px !important;
+ text-transform: uppercase;
+ height: 16px;
+ transform: translateX(-100%);
+}
+
+.sheet-hexfield__label--right {
+ left: 36px;
+ justify-content: flex-start;
+ transform: translateX(0);
+}
+
+.sheet-hexfield__label--bottom {
+ top: 38px;
+ left: 18px;
+ align-items: flex-start;
+ justify-content: center;
+ transform: translateX(-50%);
+}
+
+.sheet-hexfield__label--up {
+ top: -18px;
+ left: 18px;
+ align-items: flex-end;
+ justify-content: center;
+ transform: translateX(-50%);
+}
+
+.sheet-san-tabs {
+ position: absolute;
+ top: 0;
+ right: 0;
+ border-bottom: 1px dotted #e0e0e0;
+ height: 16px;
+ width: 266px;
+}
+
+.sheet-san-tabs ~ div {
+ flex-basis: 100%;
+}
+
+.sheet-tab ~ div {
+ min-height: 100%;
+}
+
+.sheet-tab::after {
+ content: attr(label);
+ position: relative;
+ z-index: 1;
+ display: block;
+ align-items: center;
+ justify-content: center;
+ color: #b0b0b0;
+ font-size: 10px;
+ font-weight: 500;
+ line-height: 1;
+ padding: 3px 6px 0;
+ border: 1px dotted transparent;
+ border-width: 1px 1px 0 1px;
+ border-radius: 2px;
+ height: 16px;
+ transition: none;
+}
+
+.sheet-tab:hover::after {
+ color: #808080;
+}
+
+.sheet-tab:checked::after {
+ background-color: #fff;
+ color: #606060;
+ border-color: #e0e0e0;
+}
+
+.sheet-tab--skills {
+ margin-left: 72px;
+}
+
+.sheet-tab--notebook ~ .sheet-notebook {
+ height: calc(100% - 64px);
+}
+
+.sheet-tab--skills:not(:checked) ~ .sheet-skills, .sheet-tab--advancements:not(:checked) ~ .sheet-advancements, .sheet-tab--notebook:not(:checked) ~ .sheet-notebook, .sheet-tab--settings:not(:checked) ~ .sheet-settings {
+ display: none;
+}
+
+.sheet-meta {
+ width: 472px;
+ margin-bottom: 44px;
+}
+
+.sheet-meta .sheet-container {
+ display: flex;
+}
+
+.sheet-meta .sheet-container:first-child {
+ margin-bottom: 4px;
+}
+
+.sheet-meta .sheet-label {
+ text-transform: uppercase;
+ margin-top: 4px;
+}
+
+.sheet-meta .sheet-meta-field:not(:last-child) {
+ margin-right: 8px;
+}
+
+.sheet-meta .sheet-meta-field input.sheet-meta-field__input {
+ color: #808080;
+ font-weight: 500;
+ line-height: 15px;
+ text-align: left;
+ border-bottom: 1px dotted #e0e0e0;
+ padding: 0 2px;
+ height: 16px;
+}
+
+.sheet-meta .sheet-meta-field input.sheet-meta-field__input--name {
+ width: 136px;
+}
+
+.sheet-meta .sheet-meta-field input.sheet-meta-field__input--size, .sheet-meta .sheet-meta-field input.sheet-meta-field__input--exp, .sheet-meta .sheet-meta-field input.sheet-meta-field__input--level, .sheet-meta .sheet-meta-field input.sheet-meta-field__input--age, .sheet-meta .sheet-meta-field input.sheet-meta-field__input--bennies {
+ width: 40px;
+}
+
+.sheet-meta .sheet-meta-field input.sheet-meta-field__input--height, .sheet-meta .sheet-meta-field input.sheet-meta-field__input--weight {
+ width: 64px;
+}
+
+.sheet-meta .sheet-meta-field input.sheet-meta-field__input--eyes, .sheet-meta .sheet-meta-field input.sheet-meta-field__input--hair, .sheet-meta .sheet-meta-field input.sheet-meta-field__input--rank, .sheet-meta .sheet-meta-field input.sheet-meta-field__input--origin, .sheet-meta .sheet-meta-field input.sheet-meta-field__input--gender {
+ width: 64px;
+}
+
+.sheet-meta .sheet-meta-field input.sheet-meta-field__input--bits {
+ width: 64px;
+}
+
+.sheet-buttons {
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -4px;
+ width: 274px;
+}
+
+.sheet-buttons::after {
+ content: '';
+ display: block;
+ flex-grow: 1000000;
+}
+
+.sheet-buttons > div,
+.sheet-buttons > label {
+ margin: 0 4px;
+}
+
+.sheet-buttons > div {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ flex-grow: 1;
+ white-space: nowrap;
+ border-radius: 2px;
+ margin-bottom: 8px;
+ height: 16px;
+ overflow: hidden;
+}
+
+.sheet-buttons > div::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ display: block;
+ background-color: #fdfdfd;
+ border: 1px dotted #e0e0e0;
+ border-radius: 2px;
+ width: 100%;
+ height: 100%;
+}
+
+.sheet-buttons button {
+ flex-shrink: 0;
+ flex-grow: 1;
+ justify-content: center;
+ color: #b0b0b0;
+ font-size: 10px;
+ font-weight: 500;
+ line-height: 16px;
+ padding: 0 4px !important;
+ height: 16px;
+}
+
+.sheet-buttons button:hover {
+ background-color: #898989;
+}
+
+.sheet-buttons button:hover > span {
+ color: #fff !important;
+}
+
+.sheet-buttons .sheet-dice-roller input.sheet-dice-roller__input[type=text] {
+ flex-grow: 100;
+ width: auto;
+}
+
+.sheet-buttons .sheet-dice-roller input.sheet-dice-roller__input[type=text]::placeholder {
+ font-size: 10px;
+}
+
+.sheet-buttons .sheet-label-toggle {
+ margin-bottom: 8px;
+}
+
+.sheet-buttons .sheet-label-toggle span {
+ font-size: 10px;
+ line-height: 16px;
+ height: 16px;
+}
+
+.sheet-attribute {
+ position: relative;
+ font-size: 14px;
+ height: 48px;
+ width: 48px;
+}
+
+.sheet-attribute__button {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ color: #606060;
+ font-size: 14px;
+ font-weight: 700;
+ transform: translate(-100%, -50%);
+}
+
+.sheet-attribute:not(:hover) .sheet-hexfield--mod input:not(:focus) + .sheet-hexfield__label {
+ opacity: 0;
+}
+
+.sheet-attribute .sheet-hexfield {
+ position: absolute;
+ top: 37px;
+}
+
+.sheet-attribute .sheet-hexfield--nat {
+ left: 27px;
+}
+
+.sheet-attribute .sheet-hexfield--mod {
+ top: 9px;
+ left: 43px;
+}
+
+.sheet-attribute .sheet-hexfield--mod .sheet-hexfield__label {
+ color: #b0b0b0;
+}
+
+.sheet-attribute .sheet-hexfield--mod .sheet-hexfield__input:not(:placeholder-shown) ~ .sheet-hexfield__label {
+ color: #606060;
+}
+
+.sheet-attribute .sheet-hexfield--wd {
+ left: 59px;
+}
+
+.sheet-toggle-silhouette-markers:not(:checked) + .sheet-silhouette .sheet-color-cycle {
+ display: none;
+}
+
+.sheet-silhouette {
+ position: relative;
+ z-index: 1;
+ height: 300px;
+ width: 200px;
+}
+
+.sheet-silhouette__image {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/female_silhouette.png");
+ background-repeat: no-repeat;
+ background-size: contain;
+ height: 100%;
+ width: 100%;
+}
+
+.sheet-silhouette__image:hover ~ .sheet-color-cycle :checked {
+ opacity: 1;
+ transition-delay: 0.4s;
+}
+
+.sheet-silhouette .sheet-color-cycle {
+ position: absolute;
+ transform: translateX(-50%);
+}
+
+.sheet-silhouette .sheet-color-cycle:hover :checked {
+ opacity: 1;
+}
+
+.sheet-silhouette .sheet-color-cycle__radio {
+ border: 2px solid #fff;
+ opacity: 0;
+ transition: opacity .3s ease-in-out;
+}
+
+.sheet-silhouette .sheet-color-cycle__radio:not(.sheet-color-cycle__radio--none):checked {
+ opacity: 1;
+}
+
+.sheet-silhouette .sheet-color-cycle__radio--none {
+ background-color: #d9d9d9 !important;
+}
+
+.sheet-silhouette__head {
+ top: 26px;
+ left: 99px;
+}
+
+.sheet-silhouette__torso-upper {
+ top: 64px;
+ left: 99px;
+}
+
+.sheet-silhouette__torso-lower {
+ top: 100px;
+ left: 99px;
+}
+
+.sheet-silhouette__left-arm-upper {
+ top: 70px;
+ left: 128px;
+}
+
+.sheet-silhouette__left-arm-lower {
+ top: 109px;
+ left: 138px;
+}
+
+.sheet-silhouette__left-hand {
+ top: 134px;
+ left: 142px;
+}
+
+.sheet-silhouette__right-arm-upper {
+ top: 70px;
+ left: 69px;
+}
+
+.sheet-silhouette__right-arm-lower {
+ top: 109px;
+ left: 59px;
+}
+
+.sheet-silhouette__right-hand {
+ top: 134px;
+ left: 55px;
+}
+
+.sheet-silhouette__left-leg-upper {
+ top: 160px;
+ left: 125px;
+}
+
+.sheet-silhouette__left-leg-lower {
+ top: 230px;
+ left: 129px;
+}
+
+.sheet-silhouette__right-leg-upper {
+ top: 160px;
+ left: 72px;
+}
+
+.sheet-silhouette__right-leg-lower {
+ top: 230px;
+ left: 68px;
+}
+
+.sheet-silhouette__switch {
+ position: absolute;
+ bottom: 12px;
+ left: 50%;
+ z-index: 3;
+}
+
+.sheet-silhouette__switch::after {
+ content: '[ ]';
+ display: block;
+ color: #d6d6d6;
+ font-family: Pictos;
+ font-size: 8px;
+ transform: translateX(-50%);
+}
+
+.sheet-silhouette__switch:checked + .sheet-silhouette__image {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/male_silhouette.png");
+}
+
+.sheet-silhouette__switch:checked ~ .sheet-silhouette__left-arm-upper {
+ top: 70px;
+ left: 141px;
+}
+
+.sheet-silhouette__switch:checked ~ .sheet-silhouette__left-arm-lower {
+ top: 105px;
+ left: 150px;
+}
+
+.sheet-silhouette__switch:checked ~ .sheet-silhouette__left-hand {
+ top: 143px;
+ left: 147px;
+}
+
+.sheet-silhouette__switch:checked ~ .sheet-silhouette__right-arm-upper {
+ top: 70px;
+ left: 56px;
+}
+
+.sheet-silhouette__switch:checked ~ .sheet-silhouette__right-arm-lower {
+ top: 105px;
+ left: 47px;
+}
+
+.sheet-silhouette__switch:checked ~ .sheet-silhouette__right-hand {
+ top: 143px;
+ left: 50px;
+}
+
+.sheet-silhouette__switch:checked ~ .sheet-silhouette__left-leg-upper {
+ top: 172px;
+ left: 126px;
+}
+
+.sheet-silhouette__switch:checked ~ .sheet-silhouette__right-leg-upper {
+ top: 172px;
+ left: 71px;
+}
+
+.sheet-secondary {
+ display: flex;
+ padding-right: 80px;
+}
+
+.sheet-secondary > :not(:last-child) {
+ margin-right: 24px;
+}
+
+.sheet-secondary .sheet-hexfield--run {
+ top: -100px;
+ left: -16px;
+}
+
+.sheet-secondary .sheet-hexfield--flight {
+ top: -64px;
+ left: 16px;
+}
+
+.sheet-secondary .sheet-hexfield--soak-mod {
+ top: -36px;
+ left: 32px;
+}
+
+.sheet-secondary .sheet-hexfield--soak-wd {
+ top: -72px;
+ left: 64px;
+}
+
+.sheet-secondary .sheet-hexfield--soak > button[type=roll] {
+ color: #606060;
+ font-weight: 700;
+}
+
+.sheet-armor {
+ z-index: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ padding-right: 48px;
+}
+
+.sheet-armor > .sheet-hexfield:not(:last-child) {
+ margin-bottom: 36px;
+}
+
+.sheet-armor > .sheet-hexfield--armor-head, .sheet-armor > .sheet-hexfield--armor-legs {
+ margin-right: 16px;
+}
+
+.sheet-armor > .sheet-hexfield .sheet-hexfield__label--left {
+ background-color: #fff;
+ padding-left: 4px;
+}
+
+.sheet-armor > .sheet-hexfield textarea {
+ position: absolute;
+ top: 8px;
+ left: 36px;
+ color: #808080;
+ font-size: 9px !important;
+ line-height: 1.6;
+ padding-top: 4px;
+ height: 60px;
+ width: 80px;
+}
+
+.sheet-armor > .sheet-hexfield textarea::placeholder {
+ color: #f0f0f0;
+ font-size: 22px;
+ font-weight: 700;
+ line-height: 0.6;
+}
+
+.sheet-armor__decoration, .sheet-armor__pointer {
+ position: absolute;
+ background-repeat: no-repeat;
+ background-size: contain;
+ opacity: .12;
+}
+
+.sheet-armor__decoration {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/decoration_line.png");
+ top: 15px;
+ left: -60px;
+ height: 322px;
+ width: 95px;
+}
+
+.sheet-armor__pointer {
+ transform: translateX(-100%);
+}
+
+.sheet-armor__pointer--head {
+ top: 17px;
+ left: -28px;
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/head_line.png");
+ height: 2px;
+ width: 122px;
+}
+
+.sheet-armor__pointer--torso {
+ top: -11px;
+ left: -33px;
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/torso_line.png");
+ height: 30px;
+ width: 131px;
+}
+
+.sheet-armor__pointer--arms {
+ top: -44px;
+ left: -30px;
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/arms_line.png");
+ height: 63px;
+ width: 97px;
+}
+
+.sheet-armor__pointer--legs {
+ top: -23px;
+ left: -27px;
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/legs_line.png");
+ height: 42px;
+ width: 98px;
+}
+
+.sheet-toggle-skill-markers:not(:checked) + .sheet-skills .sheet-color-cycle {
+ display: none;
+}
+
+.sheet-skills {
+ position: relative;
+ padding-top: 8px;
+}
+
+.sheet-skills__lock::after {
+ position: absolute;
+ top: 10px;
+ right: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #b0b0b0;
+ font-family: Pictos;
+ font-size: 8px;
+ height: 16px;
+ width: 16px;
+}
+
+.sheet-skills__lock:not(:checked)::after {
+ content: ')';
+}
+
+.sheet-skills__lock:not(:checked) + .sheet-skills__wrapper .sheet-skills__step-button {
+ display: none;
+}
+
+.sheet-skills__lock:checked::after {
+ content: '(';
+}
+
+.sheet-skills__lock:checked ~ .sheet-skills__wrapper .sheet-skills__track input {
+ cursor: default;
+ pointer-events: none;
+}
+
+.sheet-skills .sheet-header {
+ justify-content: flex-end;
+ border: none;
+}
+
+.sheet-skills__die {
+ width: 18px;
+}
+
+.sheet-skills__die:not(.sheet-a) {
+ margin-right: 3px;
+}
+
+.sheet-skills__mod, .sheet-skills__wd {
+ width: 24px;
+}
+
+.sheet-skills__mod {
+ margin-right: 3px;
+}
+
+.sheet-skills__plus {
+ color: #d6d6d6;
+ font-size: 12px;
+ line-height: 1;
+ text-align: center;
+ width: 18px;
+}
+
+.sheet-skills__color-marker {
+ width: 16px;
+}
+
+.sheet-skills__color-marker .sheet-color-cycle__radio {
+ padding: 3px;
+ border: 1px solid transparent;
+}
+
+.sheet-skills__color-marker .sheet-color-cycle__radio--none {
+ border-color: #e0e0e0;
+}
+
+.sheet-skills__skill {
+ display: flex;
+ flex-direction: row-reverse;
+ align-items: center;
+ justify-content: flex-start;
+ height: 16px;
+}
+
+.sheet-skills__skill:not(:last-child) {
+ margin-bottom: 8px;
+}
+
+.sheet-skills__skill input.sheet-skills__mod[type=text],
+.sheet-skills__skill input.sheet-skills__wd[type=text] {
+ background-color: #fff;
+ font-size: 9px !important;
+ height: 14px;
+ box-shadow: 0 0 1.5px 0 rgba(0, 0, 0, 0.5);
+}
+
+.sheet-skills__skill input.sheet-skills__mod[type=text]::placeholder,
+.sheet-skills__skill input.sheet-skills__wd[type=text]::placeholder {
+ line-height: 14px;
+}
+
+.sheet-skills__skill input.sheet-skills__mod[type=text]:not(:placeholder-shown),
+.sheet-skills__skill input.sheet-skills__wd[type=text]:not(:placeholder-shown) {
+ background-color: #898989;
+ color: #fff;
+}
+
+.sheet-skills__skill .sheet-skills__mod {
+ border-radius: 2px 0 0 2px;
+}
+
+.sheet-skills__skill .sheet-skills__wd {
+ border-radius: 0 2px 2px 0;
+}
+
+.sheet-skills__track {
+ display: flex;
+ flex-direction: row-reverse;
+}
+
+.sheet-skills input.sheet-radio-track[type=radio] {
+ height: 14px;
+ width: 18px;
+}
+
+.sheet-skills input.sheet-radio-track[type=radio]:not(:first-of-type) {
+ margin-right: 3px;
+}
+
+.sheet-skills input.sheet-radio-track[type=radio]:not(.sheet-d4-2):checked::before {
+ content: attr(label);
+}
+
+.sheet-skills input.sheet-radio-track.sheet-d12[type=radio] {
+ border-radius: 0 2px 2px 0;
+}
+
+.sheet-skills input.sheet-radio-track.sheet-d4-2[type=radio] {
+ border-radius: 2px 0 0 2px;
+}
+
+.sheet-skills input.sheet-radio-track.sheet-d4-2[type=radio]:checked {
+ background: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/unskilled_bg.png") repeat;
+}
+
+.sheet-skills input.sheet-radio-track.sheet-d4-2[type=radio]:checked::after {
+ background-color: transparent;
+}
+
+.sheet-skills input.sheet-radio-track.sheet-d4-2[type=radio]:checked ~ button > span {
+ color: #b0b0b0;
+}
+
+.sheet-skills button[type=roll] .sheet-tooltip {
+ z-index: 10;
+ white-space: nowrap;
+}
+
+.sheet-skills button[type=roll] .sheet-tooltip--left {
+ text-transform: uppercase;
+}
+
+.sheet-skills button[type=roll]:hover .sheet-tooltip {
+ opacity: 1;
+ transition-delay: .4s;
+}
+
+.sheet-skills button.sheet-skills__step-button[type=roll] {
+ position: relative;
+ margin-right: -18px !important;
+ height: 14px;
+ width: 18px;
+}
+
+.sheet-skills__button {
+ position: relative;
+ align-items: center;
+ color: #606060;
+ font-size: 10px;
+ font-weight: 500;
+ line-height: 1;
+}
+
+.sheet-skills__button > span {
+ display: block;
+ padding: 1px 8px 1px 0;
+ max-width: 88px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.sheet-advancements {
+ color: #606060;
+ font-size: 10px;
+ line-height: 16px;
+ padding: 8px 0 0 64px;
+}
+
+.sheet-advancements__item {
+ display: flex;
+ background-color: #fff;
+ border-bottom: 1px dotted #e0e0e0;
+ height: 16px;
+ width: 100%;
+}
+
+.sheet-advancements__item:not(:last-child) {
+ margin-bottom: 8px;
+}
+
+.sheet-advancements__rank {
+ font-weight: 700;
+ text-align: center;
+ margin-right: 8px;
+ width: 8px;
+}
+
+.sheet-advancements input[type=text] {
+ flex-grow: 1;
+ color: #606060;
+ font-size: 10px;
+ line-height: 16px;
+}
+
+.sheet-advancements input[type=text]::placeholder {
+ font-size: 10px;
+}
+
+.sheet-notebook {
+ padding: 8px 0 0 64px;
+}
+
+.sheet-notebook textarea {
+ background-image: linear-gradient(to right, #f6f6f6 1px, transparent 1px), linear-gradient(to bottom, #f6f6f6 1px, transparent 1px);
+ background-size: 16px 16px;
+ background-position: 4px -1px;
+ background-color: #fff;
+ color: #606060;
+ font-size: 10px;
+ line-height: 16px;
+ padding: 0 8px;
+ resize: none;
+ height: 100%;
+}
+
+.sheet-settings {
+ text-align: center;
+ padding: 8px 0 0 64px;
+}
+
+.sheet-settings__page {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ text-align: left;
+}
+
+.sheet-settings__page-tab {
+ display: inline-block;
+ color: #b0b0b0;
+ margin-bottom: 7px;
+}
+
+.sheet-settings__page-tab::before, .sheet-settings__page-tab::after {
+ display: inline-block;
+ font-size: 10px;
+ font-weight: 500;
+ line-height: 15px;
+ height: 16px;
+}
+
+.sheet-settings__page-tab::before {
+ content: attr(label);
+}
+
+.sheet-settings__page-tab:not(:last-of-type)::after {
+ content: '|';
+ margin: 0 2px 0 4px;
+}
+
+.sheet-settings__page-tab:checked::before {
+ color: #808080;
+}
+
+.sheet-settings .sheet-settings__page-tab--styles:not(:checked) ~ .sheet-settings__page--styles, .sheet-settings .sheet-settings__page-tab--setup:not(:checked) ~ .sheet-settings__page--setup, .sheet-settings .sheet-settings__page-tab--blocks:not(:checked) ~ .sheet-settings__page--blocks, .sheet-settings .sheet-settings__page-tab--skills:not(:checked) ~ .sheet-settings__page--skills, .sheet-settings .sheet-settings__page-tab--help:not(:checked) ~ .sheet-settings__page--help {
+ display: none;
+}
+
+.sheet-settings__textarea-toggle:not(:checked) + textarea {
+ display: none;
+}
+
+.sheet-settings__item {
+ user-select: none;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ min-height: 16px;
+}
+
+.sheet-settings__item:not(:last-child) {
+ margin-bottom: 8px;
+}
+
+.sheet-settings__item > span:first-of-type {
+ display: block;
+ flex-grow: 1;
+ color: #606060;
+ font-size: 10px;
+ font-weight: 500;
+ line-height: 15px;
+ border-bottom: 1px dotted #e0e0e0;
+ margin-right: 12px;
+ height: 100%;
+}
+
+.sheet-settings__item .sheet-checkbox {
+ margin-right: 4px;
+}
+
+.sheet-settings__item--text-input > span:first-of-type {
+ flex-grow: 0;
+ flex-shrink: 0;
+ margin-right: 0;
+}
+
+.sheet-settings__item--text-input > span:first-of-type ~ input[type=text] {
+ padding-left: 5px;
+}
+
+.sheet-settings__item--text-input input[type=text] {
+ flex-grow: 1;
+ color: #606060;
+ line-height: 15px;
+ border-bottom: 1px dotted #e0e0e0;
+ margin-right: 12px;
+ height: 16px;
+ width: auto;
+}
+
+.sheet-settings__item--text-input input[type=text]::placeholder {
+ font-size: 10px;
+}
+
+.sheet-settings__item--text-input input[type=text]:last-child {
+ margin-right: 26px;
+}
+
+.sheet-settings__item--text-input input[type=text] + span:last-of-type {
+ display: block;
+ flex-shrink: 0;
+ color: #808080;
+ font-family: Pictos;
+ font-size: 11px;
+ margin: 0 4px 0 1px;
+ height: 16px;
+ width: 9px;
+}
+
+.sheet-settings__item--textarea {
+ flex-wrap: wrap;
+}
+
+.sheet-settings__item--textarea textarea {
+ flex-basis: 100%;
+ background-color: #fff;
+ font-size: 10px;
+ line-height: 16px;
+ padding: 4px;
+ border: 1px solid #e0e0e0;
+ border-radius: 2px;
+ height: 64px;
+ margin: 8px 4px 0 0;
+ transition: border-color .3s ease-in-out, height .3s ease-in-out;
+}
+
+.sheet-settings__item--textarea textarea:hover {
+ border-color: #898989;
+}
+
+.sheet-settings__item--textarea textarea:focus {
+ border-color: #898989;
+ height: 192px;
+}
+
+.sheet-settings__item--help {
+ flex-wrap: wrap;
+ height: auto;
+}
+
+.sheet-settings__item--help > span:first-of-type {
+ margin-right: 8px;
+}
+
+.sheet-settings__item--help .sheet-bottom {
+ user-select: text;
+ flex-basis: 100%;
+ text-align: justify;
+ line-height: 1.6;
+ padding: 4px 0;
+}
+
+.sheet-features {
+ position: relative;
+ flex-grow: 1;
+}
+
+.sheet-features fieldset,
+.sheet-features .repcontainer {
+ display: flex;
+ flex-wrap: wrap;
+ padding: 4px 0;
+ margin: 0 -4px;
+}
+
+.sheet-features fieldset::after,
+.sheet-features .repcontainer::after {
+ content: '';
+ display: block;
+ flex-grow: 1000000;
+}
+
+.sheet-features fieldset > *,
+.sheet-features .repcontainer > * {
+ opacity: .6;
+ transition-delay: .4s;
+ transition: opacity .3s ease-in-out;
+}
+
+.sheet-features fieldset:hover > *,
+.sheet-features .repcontainer:hover > * {
+ opacity: 1;
+}
+
+.sheet-features .repitem {
+ flex-grow: 1;
+ margin-top: 0;
+}
+
+.sheet-features .sheet-repitem {
+ position: relative;
+ display: flex;
+ padding-right: 6px;
+ margin: 4px;
+ width: auto;
+}
+
+.sheet-features .sheet-color-cycle__radio {
+ top: 1px;
+ left: 1px;
+ align-items: center;
+ padding: 0;
+ height: 14px;
+ width: 14px;
+ opacity: 1;
+ transform: none;
+}
+
+.sheet-features .sheet-color-cycle__radio::after {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 10px;
+ font-weight: 700;
+ line-height: 1;
+ height: 100%;
+ width: 100%;
+ border-radius: 2px 0 0 2px;
+}
+
+.sheet-features .sheet-color-cycle__radio--novice:checked::after {
+ content: 'N';
+ background-color: rgba(0, 0, 0, 0.05);
+ color: #606060;
+}
+
+.sheet-features .sheet-color-cycle__radio--seasoned:checked::after {
+ content: 'S';
+ background-color: #5cb85c;
+ color: #fff;
+}
+
+.sheet-features .sheet-color-cycle__radio--veteran:checked::after {
+ content: 'V';
+ background-color: #0275d8;
+ color: #fff;
+}
+
+.sheet-features .sheet-color-cycle__radio--heroic:checked::after {
+ content: 'H';
+ background-color: #b25afd;
+ color: #fff;
+}
+
+.sheet-features .sheet-color-cycle__radio--legendary:checked::after {
+ content: 'L';
+ background-color: #f0ad4e;
+ color: #fff;
+}
+
+.sheet-features .sheet-color-cycle__radio--augmentation:checked::after {
+ content: 'A';
+ background-color: #898989;
+ color: #fff;
+}
+
+.sheet-features .sheet-color-cycle__radio--dot:checked::after {
+ content: '';
+ background-color: #606060;
+ border: 4px solid #fdfdfd;
+ border-radius: 50%;
+ height: 14px;
+ width: 14px;
+}
+
+.sheet-features .sheet-color-cycle__radio--hindrance:checked::after {
+ content: '*';
+ background-color: #923836;
+ color: #fff;
+ font-family: Pictos;
+}
+
+.sheet-features .sheet-color-cycle__radio--disabled:checked::after {
+ content: 'e';
+ font-size: 12px;
+ font-family: Pictos;
+}
+
+.sheet-features .sheet-color-cycle__radio--disabled:checked ~ *, .sheet-features .sheet-color-cycle__radio--disabled:checked::after {
+ color: #b0b0b0;
+ text-shadow: 0 0 3px #fff, 0 0 3px #fff, 0 0 3px #fff, 0 0 3px #fff;
+}
+
+.sheet-features .sheet-color-cycle__radio--disabled:checked ~ .sheet-features__inner-background {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: 0;
+ background: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/unskilled_bg.png") repeat;
+}
+
+.sheet-features input.sheet-features__name[type=text] {
+ z-index: 1;
+ line-height: 16px;
+ margin-left: 20px;
+}
+
+.sheet-features input[value="32"] + input {
+ width: 32px;
+}
+
+.sheet-features input[value="36"] + input {
+ width: 36px;
+}
+
+.sheet-features input[value="40"] + input {
+ width: 40px;
+}
+
+.sheet-features input[value="44"] + input {
+ width: 44px;
+}
+
+.sheet-features input[value="48"] + input {
+ width: 48px;
+}
+
+.sheet-features input[value="52"] + input {
+ width: 52px;
+}
+
+.sheet-features input[value="56"] + input {
+ width: 56px;
+}
+
+.sheet-features input[value="60"] + input {
+ width: 60px;
+}
+
+.sheet-features input[value="64"] + input {
+ width: 64px;
+}
+
+.sheet-features input[value="68"] + input {
+ width: 68px;
+}
+
+.sheet-features input[value="72"] + input {
+ width: 72px;
+}
+
+.sheet-features input[value="76"] + input {
+ width: 76px;
+}
+
+.sheet-features input[value="80"] + input {
+ width: 80px;
+}
+
+.sheet-features input[value="84"] + input {
+ width: 84px;
+}
+
+.sheet-features input[value="88"] + input {
+ width: 88px;
+}
+
+.sheet-features input[value="92"] + input {
+ width: 92px;
+}
+
+.sheet-features input[value="96"] + input {
+ width: 96px;
+}
+
+.sheet-features input[value="100"] + input {
+ width: 100px;
+}
+
+.sheet-features input[value="104"] + input {
+ width: 104px;
+}
+
+.sheet-features input[value="108"] + input {
+ width: 108px;
+}
+
+.sheet-features input[value="112"] + input {
+ width: 112px;
+}
+
+.sheet-features input[value="116"] + input {
+ width: 116px;
+}
+
+.sheet-features input[value="120"] + input {
+ width: 120px;
+}
+
+.sheet-features input[value="124"] + input {
+ width: 124px;
+}
+
+.sheet-features input[value="128"] + input {
+ width: 128px;
+}
+
+.sheet-features input[value="132"] + input {
+ width: 132px;
+}
+
+.sheet-features input[value="136"] + input {
+ width: 136px;
+}
+
+.sheet-features input[value="140"] + input {
+ width: 140px;
+}
+
+.sheet-features input[value="144"] + input {
+ width: 144px;
+}
+
+.sheet-features input[value="148"] + input {
+ width: 148px;
+}
+
+.sheet-features input[value="152"] + input {
+ width: 152px;
+}
+
+.sheet-features input[value="156"] + input {
+ width: 156px;
+}
+
+.sheet-features input[value="160"] + input {
+ width: 160px;
+}
+
+.sheet-features input[value="164"] + input {
+ width: 164px;
+}
+
+.sheet-features input[value="168"] + input {
+ width: 168px;
+}
+
+.sheet-features input[value="172"] + input {
+ width: 172px;
+}
+
+.sheet-features input[value="176"] + input {
+ width: 176px;
+}
+
+.sheet-features input[value="180"] + input {
+ width: 180px;
+}
+
+.sheet-features .repcontainer.editmode .itemcontrol {
+ margin: 4px;
+ width: calc(100% - 8px) !important;
+ max-height: 16px;
+}
+
+.sheet-health {
+ position: relative;
+ display: flex;
+ align-items: flex-end;
+}
+
+.sheet-health > .sheet-hex {
+ order: 2;
+}
+
+.sheet-health .sheet-header__title {
+ margin-top: 8px;
+}
+
+.sheet-health:hover .sheet-health__icons * {
+ opacity: 1;
+}
+
+.sheet-health__icons {
+ display: flex;
+}
+
+.sheet-health__icons .sheet-icon {
+ color: #b0b0b0;
+ font-size: 10px;
+ line-height: 1;
+ opacity: 0;
+ transition: opacity .3s ease-in-out;
+ transition-delay: .4s;
+}
+
+.sheet-health__icons .sheet-icon:checked {
+ color: #fff;
+ opacity: 1;
+}
+
+.sheet-health__icons .sheet-icon:checked::after {
+ background-color: #898989;
+ border: 1px solid #898989;
+}
+
+.sheet-health__icons .sheet-icon:not(:last-child) {
+ margin-right: 8px;
+}
+
+.sheet-health__icons .sheet-icon::after {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #fff;
+ font-family: Pictos;
+ border: 1px dotted #e0e0e0;
+ border-radius: 50%;
+ margin: 2px 2px 6px;
+ height: 20px;
+ width: 20px;
+}
+
+.sheet-health__icons .sheet-icon--shield::after {
+ content: 'b';
+}
+
+.sheet-health__icons .sheet-icon--bug::after {
+ content: 'i';
+}
+
+.sheet-health__icons .sheet-icon--fire::after {
+ content: 'r';
+ font-family: 'Pictos Custom';
+}
+
+.sheet-health__icons .sheet-icon--hit::after {
+ content: 't';
+ font-family: 'Pictos Custom';
+}
+
+.sheet-health__icons .sheet-icon--lightning::after {
+ content: 'e';
+}
+
+.sheet-health__icons .sheet-icon--cancel::after {
+ content: 'd';
+}
+
+.sheet-health__icons .sheet-icon--rad::after {
+ content: 'l';
+}
+
+.sheet-health__icons .sheet-icon--tools::after {
+ content: 'x';
+}
+
+.sheet-health__icons .sheet-icon--ecg::after {
+ content: 'Y';
+}
+
+.sheet-health__track {
+ position: relative;
+ display: flex;
+}
+
+.sheet-health__track .sheet-radio-track,
+.sheet-health__track .sheet-reset-button {
+ border-radius: 2px;
+ margin-right: 8px;
+ height: 24px;
+ width: 24px;
+}
+
+.sheet-health__track:hover .sheet-reset-button:not(:checked), .sheet-health__track:hover .sheet-radio-track-toggle {
+ opacity: 1;
+ transition-delay: .4s;
+}
+
+.sheet-health__track .sheet-reset-button {
+ position: absolute;
+ z-index: 2;
+ opacity: 0;
+ transition: opacity .3s ease-in-out;
+}
+
+.sheet-health__track .sheet-reset-button::after {
+ content: '*';
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #898989;
+ color: #fff;
+ font-family: Pictos;
+ line-height: 1;
+ border-radius: 2px;
+ height: 100%;
+ width: 100%;
+}
+
+.sheet-health__track .sheet-reset-button:checked {
+ display: none;
+}
+
+.sheet-health__track .sheet-radio-track-toggle {
+ position: absolute;
+ top: 24px;
+ z-index: 2;
+ height: 16px;
+ width: 24px;
+ opacity: 0;
+ transition: opacity .3s ease-in-out;
+}
+
+.sheet-health__track .sheet-radio-track-toggle::before, .sheet-health__track .sheet-radio-track-toggle::after {
+ content: '';
+ background-color: rgba(0, 0, 0, 0.1);
+ height: 4px;
+ width: 50%;
+}
+
+.sheet-health__track .sheet-radio-track-toggle::after {
+ background-color: rgba(0, 0, 0, 0.05);
+}
+
+.sheet-health__track .sheet-radio-track-toggle:checked {
+ flex-direction: row-reverse;
+}
+
+.sheet-health__track .sheet-radio-track-toggle:checked + input {
+ background: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/unskilled_bg.png") repeat;
+}
+
+.sheet-health__track .sheet-radio-track-toggle:checked + input::before, .sheet-health__track .sheet-radio-track-toggle:checked + input::after {
+ display: none;
+}
+
+.sheet-health__wounds {
+ order: 1;
+}
+
+.sheet-health__wounds .sheet-health__track {
+ flex-direction: row-reverse;
+ justify-content: flex-end;
+}
+
+.sheet-health__wounds .sheet-radio-track--6 {
+ margin-right: 0;
+}
+
+.sheet-health__wounds .sheet-radio-track-toggle--6 {
+ left: 160px;
+}
+
+.sheet-health__wounds .sheet-radio-track-toggle--5 {
+ left: 128px;
+}
+
+.sheet-health__wounds .sheet-radio-track-toggle--4 {
+ left: 96px;
+}
+
+.sheet-health__wounds .sheet-radio-track-toggle--3 {
+ left: 64px;
+}
+
+.sheet-health__wounds .sheet-radio-track-toggle--2 {
+ left: 32px;
+}
+
+.sheet-health__center {
+ order: 3;
+ position: absolute;
+ left: 185px;
+}
+
+.sheet-health__center .sheet-hexfield {
+ position: absolute;
+ bottom: 8px;
+ transform: translateY(100%);
+}
+
+.sheet-health__center .sheet-hexfield--wound-mitigation {
+ left: 1px;
+}
+
+.sheet-health__center .sheet-hexfield--rads {
+ left: 33px;
+}
+
+.sheet-health .sheet-hex--64 {
+ margin: 0 4px;
+}
+
+.sheet-health .sheet-hex--64::after {
+ content: '';
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/skull.png");
+ background-repeat: no-repeat;
+ background-size: 32px;
+ background-position: center;
+ height: 100%;
+ width: 100%;
+ opacity: .15;
+}
+
+.sheet-health .sheet-hex--64:checked::after {
+ opacity: .5;
+}
+
+.sheet-health__fatigue {
+ order: 4;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+}
+
+.sheet-health__fatigue .sheet-reset-button {
+ right: 0;
+ margin: 0;
+}
+
+.sheet-health__fatigue .sheet-radio-track--1 {
+ margin-right: 0;
+}
+
+.sheet-health__fatigue .sheet-radio-track-toggle--3 {
+ right: 64px;
+}
+
+.sheet-health__fatigue .sheet-radio-track-toggle--2 {
+ right: 32px;
+}
+
+.sheet-power {
+ position: relative;
+ margin-right: -8px;
+}
+
+.sheet-power .sheet-header__title {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ transform: translate(-100%, -50%);
+}
+
+.sheet-power .sheet-hexfield {
+ position: absolute;
+ bottom: -28px;
+}
+
+.sheet-power .sheet-hexfield--power-consumed {
+ left: -2px;
+}
+
+.sheet-power .sheet-hexfield--power-maximum {
+ left: 30px;
+}
+
+.sheet-weapons {
+ margin-top: 32px;
+}
+
+.sheet-weapons__damage, .sheet-weapons__range {
+ width: 80px;
+}
+
+.sheet-weapons__ap, .sheet-weapons__rof, .sheet-weapons__weight {
+ width: 30px;
+}
+
+.sheet-weapons__shots {
+ width: 40px;
+}
+
+.sheet-weapons__trapping {
+ width: 64px;
+}
+
+.sheet-weapons__damage-button {
+ position: absolute;
+ top: 0;
+ left: 164px;
+ display: none;
+ height: 20px;
+ width: 80px;
+}
+
+.sheet-weapons input.sheet-toggle:not(:checked) ~ .sheet-weapons__trapping {
+ display: none;
+}
+
+.sheet-apparel__armor {
+ width: 40px;
+ margin-right: 8px;
+}
+
+.sheet-apparel__tags {
+ text-align: left;
+ width: 210px;
+}
+
+.sheet-apparel__weight {
+ width: 30px;
+}
+
+.sheet-integrity {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.sheet-integrity__status {
+ width: 320px;
+}
+
+.sheet-integrity__progress {
+ position: relative;
+ display: flex;
+ justify-content: flex-end;
+ background-color: #e0e0e0;
+ border-radius: 2px;
+ height: 8px;
+ width: 100%;
+ overflow: hidden;
+}
+
+.sheet-integrity__progress-fill {
+ background-color: #898989;
+ height: 100%;
+ width: 100%;
+ transition: width .3s ease-in-out;
+}
+
+.sheet-integrity__bar-width[value="0"] ~ .sheet-integrity__progress-fill {
+ width: 0px;
+}
+
+.sheet-integrity__bar-width[value="1"] ~ .sheet-integrity__progress-fill {
+ width: 4px;
+}
+
+.sheet-integrity__bar-width[value="2"] ~ .sheet-integrity__progress-fill {
+ width: 8px;
+}
+
+.sheet-integrity__bar-width[value="3"] ~ .sheet-integrity__progress-fill {
+ width: 12px;
+}
+
+.sheet-integrity__bar-width[value="4"] ~ .sheet-integrity__progress-fill {
+ width: 16px;
+}
+
+.sheet-integrity__bar-width[value="5"] ~ .sheet-integrity__progress-fill {
+ width: 20px;
+}
+
+.sheet-integrity__bar-width[value="6"] ~ .sheet-integrity__progress-fill {
+ width: 24px;
+}
+
+.sheet-integrity__bar-width[value="7"] ~ .sheet-integrity__progress-fill {
+ width: 28px;
+}
+
+.sheet-integrity__bar-width[value="8"] ~ .sheet-integrity__progress-fill {
+ width: 32px;
+}
+
+.sheet-integrity__bar-width[value="9"] ~ .sheet-integrity__progress-fill {
+ width: 36px;
+}
+
+.sheet-integrity__bar-width[value="10"] ~ .sheet-integrity__progress-fill {
+ width: 40px;
+}
+
+.sheet-integrity__bar-width[value="11"] ~ .sheet-integrity__progress-fill {
+ width: 44px;
+}
+
+.sheet-integrity__bar-width[value="12"] ~ .sheet-integrity__progress-fill {
+ width: 48px;
+}
+
+.sheet-integrity__bar-width[value="13"] ~ .sheet-integrity__progress-fill {
+ width: 52px;
+}
+
+.sheet-integrity__bar-width[value="14"] ~ .sheet-integrity__progress-fill {
+ width: 56px;
+}
+
+.sheet-integrity__bar-width[value="15"] ~ .sheet-integrity__progress-fill {
+ width: 60px;
+}
+
+.sheet-integrity__bar-width[value="16"] ~ .sheet-integrity__progress-fill {
+ width: 64px;
+}
+
+.sheet-integrity__bar-width[value="17"] ~ .sheet-integrity__progress-fill {
+ width: 68px;
+}
+
+.sheet-integrity__bar-width[value="18"] ~ .sheet-integrity__progress-fill {
+ width: 72px;
+}
+
+.sheet-integrity__bar-width[value="19"] ~ .sheet-integrity__progress-fill {
+ width: 76px;
+}
+
+.sheet-integrity__bar-width[value="20"] ~ .sheet-integrity__progress-fill {
+ width: 80px;
+}
+
+.sheet-integrity__bar-width[value="21"] ~ .sheet-integrity__progress-fill {
+ width: 84px;
+}
+
+.sheet-integrity__bar-width[value="22"] ~ .sheet-integrity__progress-fill {
+ width: 88px;
+}
+
+.sheet-integrity__bar-width[value="23"] ~ .sheet-integrity__progress-fill {
+ width: 92px;
+}
+
+.sheet-integrity__bar-width[value="24"] ~ .sheet-integrity__progress-fill {
+ width: 96px;
+}
+
+.sheet-integrity__bar-width[value="25"] ~ .sheet-integrity__progress-fill {
+ width: 100px;
+}
+
+.sheet-integrity__bar-width[value="26"] ~ .sheet-integrity__progress-fill {
+ width: 104px;
+}
+
+.sheet-integrity__bar-width[value="27"] ~ .sheet-integrity__progress-fill {
+ width: 108px;
+}
+
+.sheet-integrity__bar-width[value="28"] ~ .sheet-integrity__progress-fill {
+ width: 112px;
+}
+
+.sheet-integrity__bar-width[value="29"] ~ .sheet-integrity__progress-fill {
+ width: 116px;
+}
+
+.sheet-integrity__bar-width[value="30"] ~ .sheet-integrity__progress-fill {
+ width: 120px;
+}
+
+.sheet-integrity__bar-width[value="31"] ~ .sheet-integrity__progress-fill {
+ width: 124px;
+}
+
+.sheet-integrity__bar-width[value="32"] ~ .sheet-integrity__progress-fill {
+ width: 128px;
+}
+
+.sheet-integrity__bar-width[value="33"] ~ .sheet-integrity__progress-fill {
+ width: 132px;
+}
+
+.sheet-integrity__bar-width[value="34"] ~ .sheet-integrity__progress-fill {
+ width: 136px;
+}
+
+.sheet-integrity__bar-width[value="35"] ~ .sheet-integrity__progress-fill {
+ width: 140px;
+}
+
+.sheet-integrity__bar-width[value="36"] ~ .sheet-integrity__progress-fill {
+ width: 144px;
+}
+
+.sheet-integrity__bar-width[value="37"] ~ .sheet-integrity__progress-fill {
+ width: 148px;
+}
+
+.sheet-integrity__bar-width[value="38"] ~ .sheet-integrity__progress-fill {
+ width: 152px;
+}
+
+.sheet-integrity__bar-width[value="39"] ~ .sheet-integrity__progress-fill {
+ width: 156px;
+}
+
+.sheet-integrity__bar-width[value="40"] ~ .sheet-integrity__progress-fill {
+ width: 160px;
+}
+
+.sheet-integrity__bar-width[value="41"] ~ .sheet-integrity__progress-fill {
+ width: 164px;
+}
+
+.sheet-integrity__bar-width[value="42"] ~ .sheet-integrity__progress-fill {
+ width: 168px;
+}
+
+.sheet-integrity__bar-width[value="43"] ~ .sheet-integrity__progress-fill {
+ width: 172px;
+}
+
+.sheet-integrity__bar-width[value="44"] ~ .sheet-integrity__progress-fill {
+ width: 176px;
+}
+
+.sheet-integrity__bar-width[value="45"] ~ .sheet-integrity__progress-fill {
+ width: 180px;
+}
+
+.sheet-integrity__bar-width[value="46"] ~ .sheet-integrity__progress-fill {
+ width: 184px;
+}
+
+.sheet-integrity__bar-width[value="47"] ~ .sheet-integrity__progress-fill {
+ width: 188px;
+}
+
+.sheet-integrity__bar-width[value="48"] ~ .sheet-integrity__progress-fill {
+ width: 192px;
+}
+
+.sheet-integrity__bar-width[value="49"] ~ .sheet-integrity__progress-fill {
+ width: 196px;
+}
+
+.sheet-integrity__bar-width[value="50"] ~ .sheet-integrity__progress-fill {
+ width: 200px;
+}
+
+.sheet-integrity__bar-width[value="51"] ~ .sheet-integrity__progress-fill {
+ width: 204px;
+}
+
+.sheet-integrity__bar-width[value="52"] ~ .sheet-integrity__progress-fill {
+ width: 208px;
+}
+
+.sheet-integrity__bar-width[value="53"] ~ .sheet-integrity__progress-fill {
+ width: 212px;
+}
+
+.sheet-integrity__bar-width[value="54"] ~ .sheet-integrity__progress-fill {
+ width: 216px;
+}
+
+.sheet-integrity__bar-width[value="55"] ~ .sheet-integrity__progress-fill {
+ width: 220px;
+}
+
+.sheet-integrity__bar-width[value="56"] ~ .sheet-integrity__progress-fill {
+ width: 224px;
+}
+
+.sheet-integrity__bar-width[value="57"] ~ .sheet-integrity__progress-fill {
+ width: 228px;
+}
+
+.sheet-integrity__bar-width[value="58"] ~ .sheet-integrity__progress-fill {
+ width: 232px;
+}
+
+.sheet-integrity__bar-width[value="59"] ~ .sheet-integrity__progress-fill {
+ width: 236px;
+}
+
+.sheet-integrity__bar-width[value="60"] ~ .sheet-integrity__progress-fill {
+ width: 240px;
+}
+
+.sheet-integrity__bar-width[value="61"] ~ .sheet-integrity__progress-fill {
+ width: 244px;
+}
+
+.sheet-integrity__bar-width[value="62"] ~ .sheet-integrity__progress-fill {
+ width: 248px;
+}
+
+.sheet-integrity__bar-width[value="63"] ~ .sheet-integrity__progress-fill {
+ width: 252px;
+}
+
+.sheet-integrity__bar-width[value="64"] ~ .sheet-integrity__progress-fill {
+ width: 256px;
+}
+
+.sheet-integrity__bar-width[value="65"] ~ .sheet-integrity__progress-fill {
+ width: 260px;
+}
+
+.sheet-integrity__bar-width[value="66"] ~ .sheet-integrity__progress-fill {
+ width: 264px;
+}
+
+.sheet-integrity__bar-width[value="67"] ~ .sheet-integrity__progress-fill {
+ width: 268px;
+}
+
+.sheet-integrity__bar-width[value="68"] ~ .sheet-integrity__progress-fill {
+ width: 272px;
+}
+
+.sheet-integrity__bar-width[value="69"] ~ .sheet-integrity__progress-fill {
+ width: 276px;
+}
+
+.sheet-integrity__bar-width[value="70"] ~ .sheet-integrity__progress-fill {
+ width: 280px;
+}
+
+.sheet-integrity__bar-width[value="71"] ~ .sheet-integrity__progress-fill {
+ width: 284px;
+}
+
+.sheet-integrity__bar-width[value="72"] ~ .sheet-integrity__progress-fill {
+ width: 288px;
+}
+
+.sheet-integrity__bar-width[value="73"] ~ .sheet-integrity__progress-fill {
+ width: 292px;
+}
+
+.sheet-integrity__bar-width[value="74"] ~ .sheet-integrity__progress-fill {
+ width: 296px;
+}
+
+.sheet-integrity__bar-width[value="75"] ~ .sheet-integrity__progress-fill {
+ width: 300px;
+}
+
+.sheet-integrity__bar-width[value="76"] ~ .sheet-integrity__progress-fill {
+ width: 304px;
+}
+
+.sheet-integrity__bar-width[value="77"] ~ .sheet-integrity__progress-fill {
+ width: 308px;
+}
+
+.sheet-integrity__bar-width[value="78"] ~ .sheet-integrity__progress-fill {
+ width: 312px;
+}
+
+.sheet-integrity__bar-width[value="79"] ~ .sheet-integrity__progress-fill {
+ width: 316px;
+}
+
+.sheet-integrity__bar-width[value="80"] ~ .sheet-integrity__progress-fill {
+ width: 320px;
+}
+
+.sheet-integrity__marker {
+ position: absolute;
+ top: 0;
+ background-color: #fff;
+ width: 2px;
+ height: 10px;
+ transform: translateX(-50%);
+}
+
+.sheet-integrity__marker--70 {
+ left: 40px;
+}
+
+.sheet-integrity__marker--60 {
+ left: 80px;
+}
+
+.sheet-integrity__marker--50 {
+ left: 120px;
+}
+
+.sheet-integrity__marker--40 {
+ left: 160px;
+}
+
+.sheet-integrity__marker--30 {
+ left: 200px;
+}
+
+.sheet-integrity__marker--20 {
+ left: 240px;
+}
+
+.sheet-integrity__marker--10 {
+ left: 280px;
+}
+
+.sheet-integrity__loss-effects {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 10px;
+ margin: 8px 0;
+ height: 16px;
+ width: 100%;
+}
+
+.sheet-integrity__loss-effects > span {
+ display: block;
+ color: #d6d6d6;
+ font-weight: 500;
+ white-space: nowrap;
+ transition: color .3s ease-in-out;
+}
+
+.sheet-integrity__loss-effects input[type=checkbox]:checked + span {
+ color: #606060;
+}
+
+.sheet-integrity__hexfields {
+ display: flex;
+ align-items: center;
+}
+
+.sheet-integrity__hexfields .sheet-container {
+ position: relative;
+}
+
+.sheet-integrity__hexfields .sheet-hexfield {
+ position: absolute;
+ bottom: -28px;
+}
+
+.sheet-integrity__hexfields .sheet-hexfield--integrity-maximum {
+ right: -6px;
+ transform: translateX(-100%);
+}
+
+.sheet-integrity__hexfields .sheet-hexfield--integrity-mod {
+ left: -5px;
+ transform: translateX(100%);
+}
+
+.sheet-abilities .sheet-repitem__size-radio[value="6"]:checked ~ textarea {
+ height: 20px;
+}
+
+.sheet-abilities .sheet-repitem__size-radio[value="1"]:checked ~ textarea {
+ height: 36px;
+}
+
+.sheet-abilities .sheet-repitem__size-radio[value="2"]:checked ~ textarea {
+ height: 52px;
+}
+
+.sheet-abilities .sheet-repitem__size-radio[value="3"]:checked ~ textarea {
+ height: 68px;
+}
+
+.sheet-abilities .sheet-repitem__size-radio[value="4"]:checked ~ textarea {
+ height: 84px;
+}
+
+.sheet-abilities .sheet-repitem__size-radio[value="5"]:checked ~ textarea {
+ height: 100px;
+}
+
+.sheet-toggle--strain:checked ~ .sheet-augmentations .sheet-augmentations__power, .sheet-toggle--strain:checked ~ .sheet-augmentations .sheet-augmentations__slots {
+ display: none;
+}
+
+.sheet-toggle--strain:checked ~ .sheet-augmentations .sheet-a {
+ display: none;
+}
+
+.sheet-toggle--strain:checked ~ .sheet-augmentations .sheet-b {
+ display: inline;
+}
+
+.sheet-toggle-augmentation-markers:not(:checked) ~ .sheet-augmentations .sheet-color-cycle {
+ display: none;
+}
+
+.sheet-augmentations .sheet-header__labels span {
+ text-transform: uppercase;
+}
+
+.sheet-augmentations__grade {
+ width: 60px;
+}
+
+.sheet-augmentations__power, .sheet-augmentations__slots, .sheet-augmentations__loss {
+ width: 40px;
+}
+
+.sheet-augmentations .sheet-b {
+ display: none;
+}
+
+.sheet-augmentations .sheet-color-cycle__radio {
+ padding: 3px;
+ border: 1px solid transparent;
+}
+
+.sheet-augmentations .sheet-color-cycle__radio--none {
+ border-color: #e0e0e0;
+}
+
+.sheet-augmentations__multiplier {
+ text-align: left;
+ width: 18px;
+}
+
+.sheet-augmentations input.sheet-toggle:not(:checked) ~ .sheet-augmentations__multiplier {
+ display: none;
+}
+
+.sheet-engrams__penalty {
+ width: 40px;
+ padding-right: 8px;
+}
+
+.sheet-engrams__description {
+ flex-shrink: 0;
+ text-align: left;
+ width: 280px;
+}
+
+input.sheet-toggle--pp:checked ~ .sheet-powers .sheet-a {
+ display: none;
+}
+
+input.sheet-toggle--pp:checked ~ .sheet-powers .sheet-b {
+ display: inline;
+}
+
+.sheet-powers__ap, .sheet-powers__pp, .sheet-powers__penalty {
+ width: 40px;
+}
+
+.sheet-powers__duration {
+ width: 60px;
+}
+
+.sheet-powers__damage, .sheet-powers__range {
+ width: 80px;
+}
+
+.sheet-powers__trapping {
+ width: 64px;
+}
+
+.sheet-powers .sheet-b {
+ display: none;
+}
+
+.sheet-powers input.sheet-toggle:not(:checked) ~ .sheet-powers__trapping {
+ display: none;
+}
+
+.sheet-vehicles__size, .sheet-vehicles__handling, .sheet-vehicles__speed, .sheet-vehicles__toughness, .sheet-vehicles__crew, .sheet-vehicles__weapons {
+ width: 45px;
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='0'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/car_01.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='1'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/car_02.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='2'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/car_03.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='3'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/car_04.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='4'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/sports-bike.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='5'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/quad-bike.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='6'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/tank.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='7'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/aircraft_01.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='8'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/aircraft_02.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='9'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/aircraft_03.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='10'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/watercraft_01.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='11'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/watercraft_02.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='12'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/watercraft_03.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='13'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/spacecraft_01.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='14'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/spacecraft_02.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='15'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/spacecraft_03.png");
+}
+
+.sheet-vehicles .sheet-repitem__frame-silhouette-control[value='16'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/spacecraft_04.png");
+}
+
+.sheet-powerarmors__size, .sheet-powerarmors__armor, .sheet-powerarmors__pace, .sheet-powerarmors__mods, .sheet-powerarmors__weight, .sheet-powerarmors__weapons {
+ width: 45px;
+}
+
+.sheet-powerarmors .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/powerarmor_01.png");
+ background-size: contain;
+ margin-top: 4px;
+ height: 56px;
+}
+
+.sheet-walkers__size, .sheet-walkers__pace, .sheet-walkers__crew {
+ width: 35px;
+}
+
+.sheet-walkers__strength {
+ width: 60px;
+}
+
+.sheet-walkers__toughness, .sheet-walkers__mods, .sheet-walkers__weapons {
+ width: 45px;
+}
+
+.sheet-walkers .sheet-repitem__frame-silhouette {
+ background-image: url("https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/walker.png");
+ background-size: contain;
+ margin-top: 4px;
+ height: 56px;
+}
+
+.sheet-allies__pace, .sheet-allies__parry, .sheet-allies__toughness, .sheet-allies__size, .sheet-allies__exp, .sheet-allies__level {
+ width: 45px;
+}
+
+.sheet-allies .sheet-header__labels {
+ padding-right: 30px;
+}
+
+.sheet-allies .sheet-repitem__secondary {
+ align-items: flex-start;
+ justify-content: space-between;
+ height: auto;
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-left {
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ flex-shrink: 0;
+ padding: 5px 0 6px;
+ width: 44px;
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-left button[type=roll],
+.sheet-allies .sheet-repitem__secondary .sheet-left .sheet-allies__health-field input[type=text] {
+ font-weight: 700;
+ border-radius: 2px;
+ height: 20px;
+ width: 20px;
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-left button[type=roll] {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #b0b0b0;
+ font-size: 10px;
+ line-height: 1;
+ border: 1px dotted #e0e0e0;
+ margin-bottom: 4px !important;
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-left button[type=roll]:hover {
+ background-color: #898989;
+ border-color: #898989;
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-left button[type=roll]:hover span {
+ color: #fff !important;
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-left .sheet-allies__health-field {
+ position: relative;
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-left .sheet-allies__health-field::before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block;
+ background-color: #f2f2f2;
+ color: #fff;
+ font-family: Pictos;
+ font-size: 14px;
+ font-weight: 900;
+ line-height: 22px;
+ text-align: center;
+ border-radius: 2px;
+ height: 100%;
+ width: 100%;
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-left .sheet-allies__health-field--wounds::before {
+ content: 'k';
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-left .sheet-allies__health-field--fatigue::before {
+ content: 'Y';
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-left .sheet-allies__health-field input[type=text] {
+ position: relative;
+ z-index: 1;
+ color: #606060;
+ font-size: 14px;
+ line-height: 20px;
+ text-align: center;
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-right {
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ padding: 5px 0 0 8px;
+}
+
+.sheet-allies .sheet-repitem__secondary .sheet-right input.sheet-allies__note-field[type=text] {
+ text-align: left;
+ padding: 0 2px;
+ margin-bottom: 4px;
+ border-bottom: 1px dotted #e0e0e0;
+ height: 20px;
+ width: 76px !important;
+}
+
+.sheet-quick-notes {
+ position: relative;
+ width: 266px;
+}
+
+.sheet-quick-notes__content {
+ padding: 8px 0;
+}
+
+.sheet-quick-notes__content textarea {
+ background-image: linear-gradient(to right, #f6f6f6 1px, transparent 1px), linear-gradient(to bottom, #f6f6f6 1px, transparent 1px);
+ background-size: 16px 16px;
+ background-position: 4px -1px;
+ background-color: #fff;
+ color: #606060;
+ font-size: 10px;
+ line-height: 16px;
+ padding: 0 8px;
+ resize: none;
+ height: 64px;
+}
+
+.sheet-quick-notes__content input[type=checkbox]:checked + textarea {
+ height: 128px;
+}
+
+.sheet-encumbrance {
+ display: flex;
+ text-align: center;
+ margin: 16px 0 24px;
+ width: 266px;
+}
+
+.sheet-encumbrance .sheet-label {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-transform: uppercase;
+ height: 16px;
+}
+
+.sheet-encumbrance__container:not(:last-child) {
+ margin-right: 8px;
+}
+
+.sheet-encumbrance__container:not(:last-child) .sheet-encumbrance__content {
+ width: 48px;
+}
+
+.sheet-encumbrance__container--summary {
+ flex-grow: 1;
+}
+
+.sheet-encumbrance__content {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ background-color: #fff;
+ font-size: 12px;
+ border-radius: 2px;
+ height: 32px;
+ overflow: hidden;
+ box-shadow: 0 0 1.5px 0 rgba(0, 0, 0, 0.5);
+}
+
+.sheet-encumbrance__content span {
+ user-select: none;
+}
+
+.sheet-encumbrance__content input[type=text] {
+ border-radius: 2px;
+}
+
+.sheet-encumbrance__content input[type=text]:hover {
+ background-color: #f2f2f2;
+}
+
+.sheet-encumbrance__content input[type=text]:focus {
+ background-color: #fdfdfd;
+ font-size: 16px !important;
+ font-weight: 700;
+ height: 100%;
+ width: 100%;
+}
+
+.sheet-encumbrance__content input[type=text]:focus ~ * {
+ display: none;
+}
+
+.sheet-encumbrance__content--summary {
+ flex-direction: row-reverse;
+}
+
+.sheet-encumbrance__content--summary > div {
+ padding: 0 4px;
+}
+
+.sheet-encumbrance__content--summary input[type=text],
+.sheet-encumbrance__content--summary span {
+ font-size: 12px;
+ width: 32px;
+}
+
+.sheet-inventory {
+ position: relative;
+ width: 266px;
+}
+
+.sheet-inventory__amount, .sheet-inventory__weight {
+ width: 30px;
+}
+
+.sheet-inventory__multi {
+ color: #b0b0b0;
+ line-height: 11px;
+ text-align: center;
+ width: 8px;
+}
+
+.sheet-inventory .sheet-repitem__note-box {
+ width: 268px;
+}
+
+.sheet-inventory .repcontainer:empty ~ .repcontrol .repcontrol_add::before {
+ width: 266px;
+}
+
+.sheet-ammunition {
+ position: relative;
+ margin-bottom: 16px;
+ width: 266px;
+}
+
+.sheet-ammunition__content {
+ display: flex;
+ padding: 6px 0 14px;
+}
+
+.sheet-ammunition__container {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #fdfdfd;
+ border-radius: 2px;
+ height: 34px;
+ width: 40px;
+}
+
+.sheet-ammunition__container--1, .sheet-ammunition__container--2 {
+ margin-right: 6px;
+}
+
+.sheet-ammunition__container span {
+ position: absolute;
+ left: 0;
+ z-index: 0;
+ display: block;
+ background-color: #d6d6d6;
+ color: #fff;
+ font-size: 8px;
+ font-weight: 500;
+ line-height: 13px;
+ text-align: center;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ height: 12px;
+ width: 100%;
+}
+
+.sheet-ammunition__container span:first-of-type {
+ top: 0;
+ border-radius: 2px 2px 0 0;
+}
+
+.sheet-ammunition__container span:last-of-type {
+ bottom: -10px;
+ letter-spacing: -0.4px;
+ text-transform: uppercase;
+ padding: 0 2px;
+ border-radius: 0 0 2px 2px;
+}
+
+.sheet-ammunition__container input[type=radio] {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ height: 100%;
+ width: 100%;
+}
+
+.sheet-ammunition__container input[type=radio]::after {
+ content: '';
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ z-index: 1;
+ height: 10px;
+ width: 100%;
+}
+
+.sheet-ammunition__container input[type=radio]:checked ~ span {
+ background-color: #898989;
+}
+
+.sheet-ammunition__container input[type=radio]::before {
+ content: '';
+ border: 2px solid #d6d6d6;
+ border-width: 2px 2px 0;
+ border-radius: 2px;
+ height: 100%;
+ width: 100%;
+}
+
+.sheet-ammunition__container input[type=radio]:checked::before {
+ border-color: #898989;
+}
+
+.sheet-ammunition__container input[type=radio]:checked ~ input[type=text] {
+ color: #808080;
+}
+
+.sheet-ammunition__container input[type=text] {
+ position: relative;
+ z-index: 2;
+ color: #d6d6d6;
+ font-size: 14px;
+ font-weight: 700;
+ line-height: 1;
+ margin-top: 9px;
+ height: 14px;
+ width: 36px;
+}
+
+.sheet-ammunition__buttons {
+ flex-grow: 1;
+}
+
+.sheet-ammunition__buttons > div {
+ display: flex;
+ justify-content: space-between;
+}
+
+.sheet-ammunition__buttons > div:first-child {
+ margin-bottom: 4px;
+}
+
+.sheet-ammunition__buttons button[type=action] {
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: center;
+ background-color: #fdfdfd;
+ color: #b0b0b0;
+ border: 1px dotted #e0e0e0;
+ border-radius: 2px;
+ padding: 0 4px;
+ height: 20px;
+}
+
+.sheet-ammunition__buttons button[type=action]:hover {
+ background-color: #898989;
+ color: #fff !important;
+ border: 1px solid #898989;
+}
+
+.sheet-ammunition__buttons button[type=action]:not(:last-child) {
+ margin-right: 4px;
+}
+
+.sheet-ammunition__buttons button[type=action]:last-child {
+ flex-grow: 1;
+ max-width: 21px;
+}
+
+.sheet-simple-trait {
+ position: relative;
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 11px;
+ line-height: 24px;
+ padding-right: 6px;
+ border-radius: 2px;
+ height: 24px;
+ min-width: 66px;
+}
+
+.sheet-simple-trait span {
+ color: #404040;
+}
+
+.sheet-simple-trait .sheet-background {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+}
+
+.sheet-simple-trait__expand {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+ border: 1px solid transparent;
+ border-radius: 2px;
+ height: 100% !important;
+ width: 100%;
+ transition: border .3s ease-in-out;
+}
+
+.sheet-simple-trait__expand:hover, .sheet-simple-trait__expand:checked {
+ border-color: #e0e0e0;
+}
+
+.sheet-simple-trait__expand:checked ~ .sheet-simple-trait__inputs {
+ display: flex;
+ background-color: #fff;
+}
+
+.sheet-simple-trait__expand:checked ~ .sheet-background {
+ background-color: #fff;
+}
+
+.sheet-simple-trait button.sheet-simple-trait__roll[type=roll] {
+ padding-left: 6px !important;
+}
+
+.sheet-simple-trait__roll {
+ position: relative;
+ z-index: 3;
+ font-size: 11px;
+ font-weight: 500;
+ line-height: 24px;
+}
+
+.sheet-simple-trait__roll:hover + .sheet-simple-trait__buttons {
+ pointer-events: all;
+ opacity: 1;
+ transition-delay: .7s;
+}
+
+.sheet-simple-trait__custom-roll {
+ color: #606060;
+ font-size: 10px;
+ font-weight: 500;
+ line-height: 16px;
+}
+
+.sheet-simple-trait__custom-roll:not(:last-child) {
+ margin-right: 4px !important;
+}
+
+.sheet-simple-trait__buttons {
+ pointer-events: none;
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 4;
+ display: flex;
+ background-color: #fff;
+ padding: 0 4px;
+ border-radius: 2px;
+ height: 16px;
+ transform: translateY(-100%);
+ opacity: 0;
+ box-shadow: 0 0 1.5px 0 rgba(0, 0, 0, 0.5);
+ transition: opacity .3s ease-in-out;
+}
+
+.sheet-simple-trait__buttons:hover {
+ pointer-events: all;
+ opacity: 1;
+ transition-delay: .7s;
+}
+
+.sheet-simple-trait__label {
+ position: relative;
+ z-index: 1;
+ font-weight: 500;
+ margin-left: 8px;
+}
+
+.sheet-simple-trait__inputs {
+ position: absolute;
+ bottom: 1px;
+ left: 0;
+ z-index: 4;
+ display: none;
+ background-color: #fff;
+ border: 1px solid #e0e0e0;
+ border-width: 0 1px 1px 1px;
+ border-radius: 0 0 2px 2px;
+ padding: 0 6px;
+ width: 100%;
+ transform: translateY(100%);
+}
+
+.sheet-simple-trait__inputs > input[type=text] {
+ text-align: center;
+ border-top: 1px dotted #e0e0e0;
+ width: 33.3%;
+}
+
+.sheet-extra {
+ width: 100%;
+}
+
+.sheet-extra .sheet-buttons {
+ padding-bottom: 1px;
+ width: 100%;
+}
+
+.sheet-extra .sheet-buttons > div {
+ margin-right: 8px;
+}
+
+.sheet-extra .sheet-block {
+ margin-top: 16px;
+}
+
+.sheet-extra .sheet-simple-trait:not(:last-child) {
+ margin-right: 8px;
+}
+
+.sheet-extra-meta {
+ display: flex;
+ margin-bottom: 19px;
+}
+
+.sheet-extra-meta .sheet-meta-field:first-child {
+ flex-grow: 1;
+}
+
+.sheet-extra-meta .sheet-meta-field input.sheet-meta-field__input--name[type=text] {
+ width: 100%;
+}
+
+.sheet-extra .sheet-features {
+ margin-top: 16px;
+}
+
+.sheet-extra .repcontainer:empty ~ .repcontrol .repcontrol_add::before {
+ width: 474px;
+}
+
+.sheet-extra .sheet-footer {
+ opacity: 0;
+}
+
+.sheet-extra .sheet-quick-notes {
+ width: 100%;
+}
+
+.sheet-extra .sheet-quick-notes__content {
+ padding-bottom: 0;
+}
+
+.sheet-extra-attributes {
+ position: relative;
+}
+
+.sheet-extra-attributes .sheet-container {
+ display: flex;
+ padding-top: 8px;
+}
+
+.sheet-extra-skills {
+ position: relative;
+}
+
+.sheet-extra-skills .sheet-container {
+ display: flex;
+ flex-wrap: wrap;
+ padding-top: 8px;
+}
+
+.sheet-extra-skills .sheet-container::after {
+ content: '';
+ display: block;
+ flex-grow: 1000000;
+}
+
+.sheet-extra-skills__selection-toggle::after {
+ position: absolute;
+ top: 2px;
+ right: 20px;
+ display: block;
+ font-family: Pictos;
+ font-size: 10px;
+ line-height: 14px;
+}
+
+.sheet-extra-skills__selection-toggle:hover::after {
+ color: #606060 !important;
+}
+
+.sheet-extra-skills__selection-toggle:checked ~ .sheet-container .sheet-simple-trait {
+ display: none;
+}
+
+.sheet-extra-skills__selection-toggle:checked ~ .sheet-container {
+ justify-content: space-between;
+}
+
+.sheet-extra-skills__selection-toggle:checked::after {
+ content: '3';
+ color: #606060;
+}
+
+.sheet-extra-skills__selection-toggle:not(:checked) ~ .sheet-container .sheet-extra-skills__toggle-label {
+ display: none;
+}
+
+.sheet-extra-skills__selection-toggle:not(:checked)::after {
+ content: 'W';
+ color: #b0b0b0;
+}
+
+.sheet-extra-skills__toggle-label {
+ flex-shrink: 0;
+ width: auto;
+}
+
+.sheet-extra-skills__toggle:not(:checked) + .sheet-simple-trait {
+ display: none;
+}
+
+.sheet-extra-skills__toggle + span {
+ user-select: none;
+ display: block;
+ color: #b0b0b0;
+ font-size: 11px;
+ font-weight: 500;
+ line-height: 24px;
+ text-transform: capitalize;
+ white-space: nowrap;
+ padding: 0 4px;
+}
+
+.sheet-extra-skills__toggle:hover + span {
+ color: #808080;
+}
+
+.sheet-extra-skills__toggle:checked + span {
+ color: #404040;
+}
+
+.sheet-extra-secondary .sheet-container {
+ display: flex;
+ align-items: flex-start;
+ justify-content: center;
+ padding-top: 8px;
+}
+
+.sheet-extra-secondary__field {
+ flex-grow: 1;
+ width: auto;
+}
+
+.sheet-extra-secondary__field:not(:last-child) {
+ margin-right: 8px;
+}
+
+.sheet-extra-secondary__field .sheet-label {
+ color: #b0b0b0;
+ font-weight: 500;
+ line-height: 16px;
+ text-align: center;
+ text-transform: uppercase;
+ letter-spacing: -0.1px;
+ height: 16px;
+}
+
+.sheet-extra-secondary input[type=text] {
+ line-height: 24px;
+}
+
+.sheet-extra-secondary input[type=text]::placeholder {
+ font-size: 10px;
+ line-height: 24px;
+}
+
+.sheet-extra-secondary input.sheet-extra-secondary__input[type=text], .sheet-extra-secondary__field > span {
+ display: block;
+ background-color: #fff;
+ font-weight: 500;
+ text-align: center;
+ border: 1px solid #e0e0e0;
+ border-radius: 2px;
+ height: 24px;
+ width: 100%;
+}
+
+.sheet-extra-secondary .sheet-simple-trait__expand {
+ border-color: #e0e0e0;
+}
+
+.sheet-extra-secondary .sheet-divider {
+ border-right: 1px dotted #e0e0e0;
+ margin: 0 10px 0 2px;
+ height: 24px;
+}
+
+.sheet-extra-settings {
+ display: flex;
+ padding: 8px 0;
+ margin-top: 15px !important;
+ border-top: 1px dotted #e0e0e0;
+}
+
+.sheet-extra-settings__item {
+ user-select: none;
+ line-height: 16px;
+ width: auto;
+}
+
+.sheet-extra-settings__item:not(:last-child) {
+ margin-right: 8px;
+}
+
+.sheet-extra-settings__item span {
+ color: #d6d6d6;
+ font-size: 10px;
+ font-weight: 500;
+}
+
+.sheet-extra-settings input[type=checkbox]:checked ~ span {
+ color: #808080;
+}
+
+.sheet-rolltemplate-TraitRoll .inlinerollresult.showtip::before,
+.sheet-rolltemplate-DiceRoller .inlinerollresult.showtip::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ display: block;
+ background-color: #fafafa;
+ height: 100%;
+ width: 100%;
+}
+
+.sheet-rolltemplate-TraitRoll,
+.sheet-rolltemplate-DiceRoller,
+.sheet-rolltemplate-RunRoll,
+.sheet-rolltemplate-DamageRoll,
+.sheet-rolltemplate-InfoBox {
+ color: #404040;
+ padding-top: 8px;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+}
+
+.sheet-rolltemplate-TraitRoll .inlinerollresult.showtip,
+.sheet-rolltemplate-DiceRoller .inlinerollresult.showtip,
+.sheet-rolltemplate-RunRoll .inlinerollresult.showtip,
+.sheet-rolltemplate-DamageRoll .inlinerollresult.showtip,
+.sheet-rolltemplate-InfoBox .inlinerollresult.showtip {
+ position: relative;
+ z-index: 1;
+ background-color: transparent;
+ padding: 0;
+ border: 0;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate {
+ position: relative;
+ background-color: #fff;
+ background-image: linear-gradient(to right, #fbfbfb 1px, transparent 1px), linear-gradient(to bottom, #fbfbfb 1px, transparent 1px);
+ background-size: 8px 8px;
+ background-position: -1px -1px;
+ padding: 8px;
+ border-radius: 2px;
+ box-shadow: 0 0 1.5px 0 rgba(0, 0, 0, 0.5);
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__header,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__header,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__header,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__header,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__header {
+ font-size: 12px;
+ font-weight: bold;
+ line-height: 16px;
+ text-align: center;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__header:not(:last-child),
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__header:not(:last-child),
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__header:not(:last-child),
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__header:not(:last-child),
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__header:not(:last-child) {
+ border-bottom: 1px dotted #e0e0e0;
+ padding-bottom: 7px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__content,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__content,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__content,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__content,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__content {
+ position: relative;
+ font-size: 11px;
+ text-align: center;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__content:not(:first-child),
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__content:not(:first-child),
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__content:not(:first-child),
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__content:not(:first-child),
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__content:not(:first-child) {
+ padding-top: 8px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__content:not(:last-child),
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__content:not(:last-child),
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__content:not(:last-child),
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__content:not(:last-child),
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__content:not(:last-child) {
+ border-bottom: 1px dotted #e0e0e0;
+ padding-bottom: 7px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__content span,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__content span,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__content span,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__content span,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__content span {
+ font-size: 11px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__content span.inlinerollresult,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__content span.inlinerollresult,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__content span.inlinerollresult,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__content span.inlinerollresult,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__content span.inlinerollresult {
+ font-weight: 400;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__content-row,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__content-row,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__content-row,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__content-row,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__content-row {
+ display: flex;
+ align-items: center;
+ line-height: 16px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__content-row > div,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__content-row > div,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__content-row > div,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__content-row > div,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__content-row > div {
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__content-row > .sheet-left,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__content-row > .sheet-left,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__content-row > .sheet-left,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__content-row > .sheet-left,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__content-row > .sheet-left {
+ font-weight: 500;
+ text-align: right;
+ padding-right: 8px;
+ width: 96px;
+ min-width: 96px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__content-row > .sheet-right,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__content-row > .sheet-right,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__content-row > .sheet-right,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__content-row > .sheet-right,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__content-row > .sheet-right {
+ text-align: left;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ padding: 0 24px 0 8px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__dice,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__dice,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__dice,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__dice,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__dice {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 11px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__dice span,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__dice span,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__dice span,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__dice span,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__dice span {
+ display: block;
+ font-size: 11px;
+ line-height: 20px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__dice .sheet-left,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__dice .sheet-left,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__dice .sheet-left,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__dice .sheet-left,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__dice .sheet-left {
+ display: flex;
+ flex-wrap: wrap;
+ padding-right: 8px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__dice .sheet-right,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__dice .sheet-right,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__dice .sheet-right,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__dice .sheet-right,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__dice .sheet-right {
+ display: flex;
+ flex-shrink: 0;
+ padding: 0 4px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__dice--damage,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__dice--damage,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__dice--damage,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__dice--damage,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__dice--damage {
+ flex-wrap: wrap;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__roll,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__roll,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__roll,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__roll,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__roll {
+ flex-shrink: 0;
+ text-align: center;
+ border-radius: 2px;
+ min-width: 20px;
+ margin-top: 8px;
+ overflow: hidden;
+ box-shadow: 0 0 1.5px 0 rgba(0, 0, 0, 0.5);
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__roll:not(:last-child),
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__roll:not(:last-child),
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__roll:not(:last-child),
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__roll:not(:last-child),
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__roll:not(:last-child) {
+ margin-right: 8px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__roll span.fullcrit:not([original-title*='"basicdiceroll"'])::before,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__roll span.fullcrit:not([original-title*='"basicdiceroll"'])::before,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__roll span.fullcrit:not([original-title*='"basicdiceroll"'])::before,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__roll span.fullcrit:not([original-title*='"basicdiceroll"'])::before,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__roll span.fullcrit:not([original-title*='"basicdiceroll"'])::before {
+ background-color: #e0e0e0;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__roll span.fullfail:not([original-title*='"basicdiceroll"']),
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__roll span.fullfail:not([original-title*='"basicdiceroll"']),
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__roll span.fullfail:not([original-title*='"basicdiceroll"']),
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__roll span.fullfail:not([original-title*='"basicdiceroll"']),
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__roll span.fullfail:not([original-title*='"basicdiceroll"']) {
+ color: #fff;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__roll span.fullfail:not([original-title*='"basicdiceroll"'])::before,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__roll span.fullfail:not([original-title*='"basicdiceroll"'])::before,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__roll span.fullfail:not([original-title*='"basicdiceroll"'])::before,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__roll span.fullfail:not([original-title*='"basicdiceroll"'])::before,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__roll span.fullfail:not([original-title*='"basicdiceroll"'])::before {
+ background-color: #d9534f;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__roll--wd,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__roll--wd,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__roll--wd,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__roll--wd,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__roll--wd {
+ height: 20px;
+ transform: rotateZ(45deg);
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__roll--wd:not(:last-child),
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__roll--wd:not(:last-child),
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__roll--wd:not(:last-child),
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__roll--wd:not(:last-child),
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__roll--wd:not(:last-child) {
+ margin-right: 16px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__roll--wd span,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__roll--wd span,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__roll--wd span,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__roll--wd span,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__roll--wd span {
+ transform: rotateZ(-45deg);
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__roll--wd span::before,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__roll--wd span::before,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__roll--wd span::before,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__roll--wd span::before,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__roll--wd span::before {
+ transform: rotateZ(45deg);
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__reroll,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__reroll,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__reroll,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__reroll,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__reroll {
+ position: absolute;
+ top: 2px;
+ right: -4px;
+ font-family: Pictos;
+ border: 4px solid #fff;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__roll-damage,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__roll-damage,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__roll-damage,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__roll-damage,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__roll-damage {
+ position: absolute;
+ top: 26px;
+ right: -4px;
+ font-family: 'Pictos Custom';
+ border: 4px solid #fff;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__button a,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__button a,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__button a,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__button a,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__button a {
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #fdfdfd;
+ color: #b0b0b0;
+ font-size: 10px;
+ font-weight: 500;
+ line-height: 9px;
+ border: 1px dotted #e0e0e0;
+ border-radius: 2px;
+ padding: 0 4px;
+ height: 20px;
+ min-width: 20px;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__button a:hover,
+.sheet-rolltemplate-DiceRoller .sheet-rolltemplate__button a:hover,
+.sheet-rolltemplate-RunRoll .sheet-rolltemplate__button a:hover,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__button a:hover,
+.sheet-rolltemplate-InfoBox .sheet-rolltemplate__button a:hover {
+ background-color: #898989;
+ color: #fff !important;
+ border: 1px solid #898989;
+}
+
+.sheet-rolltemplate-TraitRoll .sheet-rolltemplate__description,
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__description {
+ color: #606060;
+ font-size: 9px;
+ font-style: italic;
+ line-height: 16px;
+ text-align: center;
+ padding: 8px 0 7px;
+ border-bottom: 1px dotted #e0e0e0;
+}
+
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__damage-roll {
+ padding-right: 8px;
+ margin: 8px 0 0 8px;
+}
+
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__damage-roll:not(:last-child) {
+ border-right: 1px dotted #e0e0e0;
+}
+
+.sheet-rolltemplate-DamageRoll .sheet-rolltemplate__damage-roll span {
+ font-size: 16px;
+ line-height: 24px;
+}
+
+.sheet-sans {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: flex-start;
+}
+
+.sheet-section > .sheet-right:not(.sheet-sans) {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+}
+
+.sheet-section--footer > .sheet-right {
+ padding-top: 32px;
+}
+
+.sheet-section--traits {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-left: 24px;
+ height: 400px;
+}
+
+.sheet-attributes {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+}
+
+.sheet-attributes .sheet-attribute {
+ position: absolute;
+}
+
+.sheet-attributes .sheet-attribute--agility {
+ top: 0;
+ left: 32px;
+}
+
+.sheet-attributes .sheet-attribute--smarts {
+ top: 80px;
+ left: 16px;
+}
+
+.sheet-attributes .sheet-attribute--spirit {
+ top: 160px;
+ left: 0;
+}
+
+.sheet-attributes .sheet-attribute--strength {
+ top: 240px;
+ left: 16px;
+}
+
+.sheet-attributes .sheet-attribute--vigor {
+ top: 320px;
+ left: 32px;
+}
+
+.sheet-armor {
+ position: absolute;
+ right: 0;
+ top: 22px;
+}
+
+.sheet-silhouette {
+ position: absolute;
+ top: 0;
+ left: 100px;
+}
+
+.sheet-secondary {
+ position: absolute;
+ bottom: 23px;
+ right: 0;
+ z-index: 2;
+}
+
+.sheet-section--features {
+ display: flex;
+ align-items: flex-start;
+ flex-grow: 1;
+ min-height: 176px;
+ padding: 24px 0 8px;
+}
+
+.sheet-section--resources {
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-between;
+ margin-bottom: 32px;
+}
diff --git a/Savage Worlds - Graph Paper/SavageWorldsGraphPaper.html b/Savage Worlds - Graph Paper/SavageWorldsGraphPaper.html
new file mode 100644
index 0000000000..23ad530bd6
--- /dev/null
+++ b/Savage Worlds - Graph Paper/SavageWorldsGraphPaper.html
@@ -0,0 +1,7407 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
AGI
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SMA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SPI
+
+
+
+
+
+
+
+
+
+
+
+
+
+
STR
+
+
+
+
+
+
+
+
+
+
+
+
+
+
VIG
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Soak
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Academics
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Athletics
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Battle
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Boating
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Common Knowl.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Driving
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Electronics
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Spi
Faith
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Fighting
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Spi
Focus
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Gambling
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Hacking
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Healing
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Spi
Intimidation
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Language
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
MAGIC
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Notice
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Occult
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Spi
Persuasion
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Piloting
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Psionics
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Repair
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Research
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Riding
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Science
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Shooting
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Spellcasting
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Stealth
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Survival
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Taunt
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Thievery
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Weird Science
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Custom
Custom Skill 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Custom
Custom Skill 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Background Grid
+
+
+ Dark Labels
+
+
+ Roboto Font (Off: Helvetica Neue)
+
+
+ Rounded Corners
+
+
+ Skill Die Numbers
+
+
+ Transitions
+
+
+ Transition Delays
+
+
+
+
+ Augmentation Markers
+
+
+ Augmentation Strain (SciFi Companion)
+
+
+ Explode Run Die
+
+
+ List Roll Description Inputs
+
+
+ List Roll Injection Inputs
+
+
+ No Power Points (SWADE 140)
+
+
+ Running Ignores Wounds
+
+
+ Running Applies Fatigue
+
+
+ Silhouette Markers
+
+
+ Skill Markers
+
+
+ Extend Quick Notes
+
+
+ [Custom Button #1]
+
+
+
+
+ [Custom Button #2]
+
+
+
+
+ [Custom Button #3]
+
+
+
+
+
+
+ [Abilities]
+
+
+
+ [Allies]
+
+
+
+ [Ammunition]
+
+
+
+ [Ammo #1]
+ p
+
+ [Ammo #2]
+ p
+
+ [Ammo #3]
+ p
+
+ [Augmentations]
+
+
+
+ [Engrams]
+
+
+
+ [Integrity]
+
+
+
+ [Power Armors]
+
+
+
+ [Power/Energy/Mana]
+
+
+
+ [Powers/Spells]
+
+
+
+ [Quick Notes]
+
+
+
+ [Vehicles]
+
+
+
+ [Walkers]
+
+
+
+
+
+ Battle
+
+
+ Boating
+
+
+ Driving
+
+
+ Electronics
+
+
+ Faith
+
+
+ Focus
+
+
+ Gambling
+
+
+ Hacking
+
+
+ Healing
+
+
+ Language
+
+
+ MAGIC
+
+
+ Occult
+
+
+ Performance
+
+
+ Piloting
+
+
+ Repair
+
+
+ Psionics
+
+
+ Research
+
+
+ Riding
+
+
+ Science
+
+
+ Spellcasting
+
+
+ Survival
+
+
+ Taunt
+
+
+ Weird Science
+
+
+ [Custom Skill #1]
+
+
+
+ [Custom Skill #2]
+
+
+
+
+
+
Ammunition
+
+
You can keep track of up to three named "magazines" in the Ammunition block. The buttons allow you to quickly add to or subtract from the values. You can save a value with [S] and restore it with [R].
+
+
Armor & Notes
+
+
Enter your Armor ratings for the corresponding limbs. They are not self-calculating since there are too many factors; this is more convenient. You can add notes for Resistances, circumstance modifiers, or relevant augmentations such as subdermal armor to keep things in one place.
+
+
Attribute Reference
+
+
The attributes of this sheet follow a simple naming pattern and can be easily derived from their labels. Just remove any dots or special characters, expand abbreviations, convert to lowercase, and replace whitespaces with underscores (_). Adjacent attributes are appended with hyphens as well. So "Agility" becomes @{agility}, @{agility_mod}, @{agility_wd}, @{agility_extra_wd} (for extras only), and @{agility_natural}. "Tough." becomes @{toughness} and Armor is referenced with @{armor_head|_torso|_arms|_legs}. English only!
+
+
Damage Rolls
+
+
You can enable damage rolls for list items by clicking the damage label. This will disable editing. Note that the dice codes must be valid, but you can use "Str" or "Agi" (etc.) as shorthands to reference attributes. The parser is not smart, however, so please also refer to the Roll20 Dice Reference.
+
+
Edges & Hindrances
+
+
Manage your Edges and Hindrances here. They follow a horizontal masonry layout to save space and remain visible for convenience. The width is automatically adjusted once you press enter and you can cycle through colored labels to indicate Rank, type, and more. Sorting is wonky though.
+
+
Extra Sheet
+
+
For non-player characters, you can change the layout to a more compact alternative with the switch right above the sheet. This version lacks many features but is primed for Extras without Wild Die. Of course, you can add Wild Dice if needed. Edit Traits by clicking on their die, opening a small menu, and roll with the label. Hovering reveals buttons for direct die rolls. Add skills by clicking the framed pencil icon in the header. Lists work as usual.
+
+
Helper Buttons
+
+
The buttons above the skill section provide selected actions and convenience functions. The dice roller input is parsed, so you can write codes like "Sma+2d6". You may also use references such as @{athletics} or macros, but beware that the parser is not smart. Hidden rolls are sent only to the GM. The toggles can enable/disable additional roll queries for the whole sheet.
+
+
Hexagon Fields
+
+
Your attributes and secondary statistics. They either accept dice codes (d4 to d12) or integers. Positive modifiers are automatically prefixed. Hovering reveals additional fields that are otherwise invisible until relevant. You can leave them empty to use defaults, such as a d6 as Wild Die. The Wild Die can be disabled with "n/a". The labels act as roll buttons.
+
+
List Item Options
+
+
Interactive list items, such as weapons and powers, come with options. When the item is folded out, you can access them via the gear icon. Typical options include toggles for buttons and fields, but some also allow to override the Wild Die and more. Mind that the inputs are not validated; do not enter nonsense!
+
+
Raise Damage
+
+
There is no general function or field to apply raise damage since this modifier is too flexible. But nothing stops you from entering "1d6" when prompted to add a damage modifier. You could also add "2d4+2" or whatever modifier may apply.
+
+
Rate of Fire (Multiple Dice)
+
+
To roll multiple skill dice, you have two options. If you lock the skills, you can click directly on the desired die bubble, always prompting you to enter the Rate of Fire. Alternatively, you can toggle the [Query RoF] helper button, enabling the feature for the whole sheet.
+
+
Roll Injections
+
+
When you enable the option under Setup, you can append and toggle custom code to list item rolls. Mind that the inputs are not validated; do not enter nonsense! Following is a collection of useful template hooks.
{{header}} Header content like "X rolls Y"{{description}} Italic text shown below the header{{reroll}} Link of the reroll button{{damageroll}} Link of the damage button{{source_label}} Label for the source, e.g. "Weapon"{{source}} Content of the source, e.g. "Pistol"{{trait}} Name of the Trait rolled{{traitdie}} Die of the Trait rolled{{flat}} Modifier of the Trait rolled{{wd}} Wild Die of the Trait rolled{{commander}} Commander of an ally{{modifier}} Queried modifier for the roll{{rof}} Rate of Fire as inline roll, e.g. [[ 1 ]]{{wounds}} Wound penalty applied to the roll{{fatigue}} Fatigue penalty applied to the roll{{custom#_label}} [1-3] Label for freeform content{{custom#}} [1-3] Freeform content{{wdroll}} Inline roll of the Wild Die (> -1001){{traitroll#}} [1-8] Inline roll(s) of the Trait(s)
+
+
Silhouette
+
+
Choose your silhouette; it looks fancy! You can set color markers all over the silhouette for any purpose, indicating augmentations or injuries or whatever you like.
+
+
Skill Tracks
+
+
Enter your skill die by clicking on the corresponding bubble (d4-2 to d12). The skill name will darken once you become trained and acts as roll button. You can enter a modifier and custom Wild Die or leave these fields empty to use defaults; the Wild Die can be disabled with "n/a". Positive modifiers are automatically prefixed. On the far right, you can set a color marker for any purpose.
+
+
Track Rolls
+
+
When you lock the skill tracks with the icon in the top-right corner above the color marker column, you can click on the bubbles to roll the corresponding die independently. This is useful for effects that dynamically alter your skill die, such as boost/lower trait .
+
+
Vehicles & More
+
+
You can enable blocks for vehicles and other vessels in the Blocks tab under Settings. The silhouette of vehicles can be cycled through by clicking; the switch can take a moment. Both blocks can display weapons by adding a number to the corresponding attribute (0-10).
+
+
+
+
+
+
+
+
+
+
+
+ {{#description}}
+
{{description}}
{{/description}}
+
{{#reroll}}
+
{{/reroll}}{{#damageroll}}
+
{{/damageroll}}{{#source_label}}
+
+
{{source_label}}
+
{{source}}
+
{{/source_label}}{{#traitdie}}
+
+
{{trait}}
+
{{traitdie}} {{#flat}}({{flat}}) {{/flat}}
+
+
{{/traitdie}}{{#rollLess() global_wdroll 0}}{{#wd}}{{#rollGreater() wdroll -1000}}
+
{{/rollGreater() wdroll -1000}}{{/wd}}{{/rollLess() global_wdroll 0}}{{#rollGreater() global_wdroll -1000}}
+
+
Wild Die
+
{{global_wd}}
+
{{/rollGreater() global_wdroll -1000}}{{#rollGreater() bonus_wdroll -1000}}
+
+
Bonus Wild Die
+
{{bonus_wd}}
+
{{/rollGreater() bonus_wdroll -1000}}{{#commander}}
+
+
Commander
+
{{commander}}
+
{{/commander}}
+
+
Modifier
+
{{modifier}}{{#bonus}} ({{bonus}}){{/bonus}}
+
{{#rollGreater() rof 1}}
+
{{/rollGreater() rof 1}}{{#rollGreater() wounds 0}}
+
+
Wound Penalty
+
{{wounds}}
+
{{/rollGreater() wounds 0}}{{#rollGreater() fatigue 0}}
+
+
Fatigue
+
{{fatigue}}
+
{{/rollGreater() fatigue 0}}{{#custom1_label}}
+
+
{{custom1_label}}
+
{{custom1}}
+
{{/custom1_label}}{{#custom2_label}}
+
+
{{custom2_label}}
+
{{custom2}}
+
{{/custom2_label}}{{#custom3_label}}
+
+
{{custom3_label}}
+
{{custom3}}
+
{{/custom3_label}}
+
+
+
+
{{traitroll1}}
+
{{#rollGreater() rof 1}}
+
{{traitroll2}}
+
{{/rollGreater() rof 1}}{{#rollGreater() rof 2}}
+
{{traitroll3}}
+
{{/rollGreater() rof 2}}{{#rollGreater() rof 3}}
+
{{traitroll4}}
+
{{/rollGreater() rof 3}}{{#rollGreater() rof 4}}
+
{{traitroll5}}
+
{{/rollGreater() rof 4}}{{#rollGreater() rof 5}}
+
{{traitroll6}}
+
{{/rollGreater() rof 5}}{{#rollGreater() rof 6}}
+
{{traitroll7}}
+
{{/rollGreater() rof 6}}{{#rollGreater() rof 7}}
+
{{traitroll8}}
+
{{/rollGreater() rof 7}}
+
+
{{#rollLess() global_wdroll -100}}{{#rollGreater() wdroll -1000}}
+
{{wdroll}}
+
{{/rollGreater() wdroll -1000}}{{/rollLess() global_wdroll -100}}{{#rollGreater() global_wdroll -1000}}
+
{{global_wdroll}}
+
{{/rollGreater() global_wdroll -1000}}{{#rollGreater() bonus_wdroll -1000}}
+
{{bonus_wdroll}}
+
{{/rollGreater() bonus_wdroll -1000}}
+
+
+
+
+
+
+
+
+
+
{{roll1}}
+
{{#rollGreater() rof 1}}
+
{{roll2}}
+
{{/rollGreater() rof 1}}{{#rollGreater() rof 2}}
+
{{roll3}}
+
{{/rollGreater() rof 2}}{{#rollGreater() rof 3}}
+
{{roll4}}
+
{{/rollGreater() rof 3}}{{#rollGreater() rof 4}}
+
{{roll5}}
+
{{/rollGreater() rof 4}}{{#rollGreater() rof 5}}
+
{{roll6}}
+
{{/rollGreater() rof 5}}{{#rollGreater() rof 6}}
+
{{roll7}}
+
{{/rollGreater() rof 6}}{{#rollGreater() rof 7}}
+
{{roll8}}
+
{{/rollGreater() rof 7}}
+
+
+
+
+
+
+
+
+
+
+
+ {{#description}}
+
{{description}}
{{/description}}
+
{{#reroll}}
+
{{/reroll}}{{#source_label}}
+
+
{{source_label}}
+
{{source}}
+
{{/source_label}}
+
{{#modifier}}
+
+
Damage Modifier
+
{{modifier}}
+
{{/modifier}}{{#ap}}
+
+
Armor Piercing
+
{{ap}}
+
{{/ap}}{{#rollGreater() rof 1}}
+
{{/rollGreater() rof 1}}{{#range}}
+
{{/range}}{{#trapping}}
+
+
Trapping
+
{{trapping}}
+
{{/trapping}}{{#custom1_label}}
+
+
{{custom1_label}}
+
{{custom1}}
+
{{/custom1_label}}{{#custom2_label}}
+
+
{{custom2_label}}
+
{{custom2}}
+
{{/custom2_label}}{{#custom3_label}}
+
+
{{custom3_label}}
+
{{custom3}}
+
{{/custom3_label}}
+
+
+
{{roll1}}
+
{{#rollGreater() rof 1}}
+
{{roll2}}
+
{{/rollGreater() rof 1}}{{#rollGreater() rof 2}}
+
{{roll3}}
+
{{/rollGreater() rof 2}}{{#rollGreater() rof 3}}
+
{{roll4}}
+
{{/rollGreater() rof 3}}{{#rollGreater() rof 4}}
+
{{roll5}}
+
{{/rollGreater() rof 4}}{{#rollGreater() rof 5}}
+
{{roll6}}
+
{{/rollGreater() rof 5}}{{#rollGreater() rof 6}}
+
{{roll7}}
+
{{/rollGreater() rof 6}}{{#rollGreater() rof 7}}
+
{{roll8}}
+
{{/rollGreater() rof 7}}
+
+
+
+
diff --git a/Savage Worlds - Graph Paper/SavageWorldsGraphPaper.jpg b/Savage Worlds - Graph Paper/SavageWorldsGraphPaper.jpg
new file mode 100644
index 0000000000..d8a663c8c2
Binary files /dev/null and b/Savage Worlds - Graph Paper/SavageWorldsGraphPaper.jpg differ
diff --git a/Savage Worlds - Graph Paper/browser_preview.html b/Savage Worlds - Graph Paper/browser_preview.html
new file mode 100644
index 0000000000..ddfc225524
--- /dev/null
+++ b/Savage Worlds - Graph Paper/browser_preview.html
@@ -0,0 +1,11357 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
AGI
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SMA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SPI
+
+
+
+
+
+
+
+
+
+
+
+
+
+
STR
+
+
+
+
+
+
+
+
+
+
+
+
+
+
VIG
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Soak
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Academics
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Athletics
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Battle
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Boating
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Common Knowl.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Driving
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Electronics
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Spi
Faith
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Fighting
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Spi
Focus
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Gambling
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Hacking
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Healing
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Spi
Intimidation
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Language
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
MAGIC
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Notice
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Occult
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Spi
Persuasion
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Piloting
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Psionics
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Repair
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Research
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Riding
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Science
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Shooting
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Spellcasting
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Stealth
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Survival
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Taunt
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Agi
Thievery
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Sma
Weird Science
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Custom
Custom Skill 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roll d12 ( RoF 1-8)
+
+
+
+ Roll d10 ( RoF 1-8)
+
+
+
+ Roll d8 ( RoF 1-8)
+
+
+
+ Roll d6 ( RoF 1-8)
+
+
+
+ Roll d4 ( RoF 1-8)
+
+
+
+ Roll d4-2 ( RoF 1-8)
+
+
+
+
+
+
+
+
+
+
+ Custom
Custom Skill 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Background Grid
+
+
+ Dark Labels
+
+
+ Roboto Font (Off: Helvetica Neue)
+
+
+ Rounded Corners
+
+
+ Skill Die Numbers
+
+
+ Transitions
+
+
+ Transition Delays
+
+
+
+
+ Augmentation Markers
+
+
+ Augmentation Strain (SciFi Companion)
+
+
+ Explode Run Die
+
+
+ List Roll Description Inputs
+
+
+ List Roll Injection Inputs
+
+
+ No Power Points (SWADE 140)
+
+
+ Running Ignores Wounds
+
+
+ Running Applies Fatigue
+
+
+ Silhouette Markers
+
+
+ Skill Markers
+
+
+ Extend Quick Notes
+
+
+ [Custom Button #1]
+
+
+
+
+ [Custom Button #2]
+
+
+
+
+ [Custom Button #3]
+
+
+
+
+
+
+ [Abilities]
+
+
+
+ [Allies]
+
+
+
+ [Ammunition]
+
+
+
+ [Ammo #1]
+ p
+
+ [Ammo #2]
+ p
+
+ [Ammo #3]
+ p
+
+ [Augmentations]
+
+
+
+ [Engrams]
+
+
+
+ [Integrity]
+
+
+
+ [Power Armors]
+
+
+
+ [Power/Energy/Mana]
+
+
+
+ [Powers/Spells]
+
+
+
+ [Quick Notes]
+
+
+
+ [Vehicles]
+
+
+
+ [Walkers]
+
+
+
+
+
+ Battle
+
+
+ Boating
+
+
+ Driving
+
+
+ Electronics
+
+
+ Faith
+
+
+ Focus
+
+
+ Gambling
+
+
+ Hacking
+
+
+ Healing
+
+
+ Language
+
+
+ MAGIC
+
+
+ Occult
+
+
+ Performance
+
+
+ Piloting
+
+
+ Repair
+
+
+ Psionics
+
+
+ Research
+
+
+ Riding
+
+
+ Science
+
+
+ Spellcasting
+
+
+ Survival
+
+
+ Taunt
+
+
+ Weird Science
+
+
+ [Custom Skill #1]
+
+
+
+ [Custom Skill #2]
+
+
+
+
+
+
Ammunition
+
+
You can keep track of up to three named "magazines" in the Ammunition block. The buttons allow you to quickly add to or subtract from the values. You can save a value with [S] and restore it with [R].
+
+
Armor & Notes
+
+
Enter your Armor ratings for the corresponding limbs. They are not self-calculating since there are too many factors; this is more convenient. You can add notes for Resistances, circumstance modifiers, or relevant augmentations such as subdermal armor to keep things in one place.
+
+
Attribute Reference
+
+
The attributes of this sheet follow a simple naming pattern and can be easily derived from their labels. Just remove any dots or special characters, expand abbreviations, convert to lowercase, and replace whitespaces with underscores (_). Adjacent attributes are appended with hyphens as well. So "Agility" becomes @{agility}, @{agility_mod}, @{agility_wd}, @{agility_extra_wd} (for extras only), and @{agility_natural}. "Tough." becomes @{toughness} and Armor is referenced with @{armor_head|_torso|_arms|_legs}. English only!
+
+
Damage Rolls
+
+
You can enable damage rolls for list items by clicking the damage label. This will disable editing. Note that the dice codes must be valid, but you can use "Str" or "Agi" (etc.) as shorthands to reference attributes. The parser is not smart, however, so please also refer to the Roll20 Dice Reference.
+
+
Edges & Hindrances
+
+
Manage your Edges and Hindrances here. They follow a horizontal masonry layout to save space and remain visible for convenience. The width is automatically adjusted once you press enter and you can cycle through colored labels to indicate Rank, type, and more. Sorting is wonky though.
+
+
Extra Sheet
+
+
For non-player characters, you can change the layout to a more compact alternative with the switch right above the sheet. This version lacks many features but is primed for Extras without Wild Die. Of course, you can add Wild Dice if needed. Edit Traits by clicking on their die, opening a small menu, and roll with the label. Hovering reveals buttons for direct die rolls. Add skills by clicking the framed pencil icon in the header. Lists work as usual.
+
+
Helper Buttons
+
+
The buttons above the skill section provide selected actions and convenience functions. The dice roller input is parsed, so you can write codes like "Sma+2d6". You may also use references such as @{athletics} or macros, but beware that the parser is not smart. Hidden rolls are sent only to the GM. The toggles can enable/disable additional roll queries for the whole sheet.
+
+
Hexagon Fields
+
+
Your attributes and secondary statistics. They either accept dice codes (d4 to d12) or integers. Positive modifiers are automatically prefixed. Hovering reveals additional fields that are otherwise invisible until relevant. You can leave them empty to use defaults, such as a d6 as Wild Die. The Wild Die can be disabled with "n/a". The labels act as roll buttons.
+
+
List Item Options
+
+
Interactive list items, such as weapons and powers, come with options. When the item is folded out, you can access them via the gear icon. Typical options include toggles for buttons and fields, but some also allow to override the Wild Die and more. Mind that the inputs are not validated; do not enter nonsense!
+
+
Raise Damage
+
+
There is no general function or field to apply raise damage since this modifier is too flexible. But nothing stops you from entering "1d6" when prompted to add a damage modifier. You could also add "2d4+2" or whatever modifier may apply.
+
+
Rate of Fire (Multiple Dice)
+
+
To roll multiple skill dice, you have two options. If you lock the skills, you can click directly on the desired die bubble, always prompting you to enter the Rate of Fire. Alternatively, you can toggle the [Query RoF] helper button, enabling the feature for the whole sheet.
+
+
Roll Injections
+
+
When you enable the option under Setup, you can append and toggle custom code to list item rolls. Mind that the inputs are not validated; do not enter nonsense! Following is a collection of useful template hooks.
{{header}} Header content like "X rolls Y"{{description}} Italic text shown below the header{{reroll}} Link of the reroll button{{damageroll}} Link of the damage button{{source_label}} Label for the source, e.g. "Weapon"{{source}} Content of the source, e.g. "Pistol"{{trait}} Name of the Trait rolled{{traitdie}} Die of the Trait rolled{{flat}} Modifier of the Trait rolled{{wd}} Wild Die of the Trait rolled{{commander}} Commander of an ally{{modifier}} Queried modifier for the roll{{rof}} Rate of Fire as inline roll, e.g. [[ 1 ]]{{wounds}} Wound penalty applied to the roll{{fatigue}} Fatigue penalty applied to the roll{{custom#_label}} [1-3] Label for freeform content{{custom#}} [1-3] Freeform content{{wdroll}} Inline roll of the Wild Die (> -1001){{traitroll#}} [1-8] Inline roll(s) of the Trait(s)
+
+
Silhouette
+
+
Choose your silhouette; it looks fancy! You can set color markers all over the silhouette for any purpose, indicating augmentations or injuries or whatever you like.
+
+
Skill Tracks
+
+
Enter your skill die by clicking on the corresponding bubble (d4-2 to d12). The skill name will darken once you become trained and acts as roll button. You can enter a modifier and custom Wild Die or leave these fields empty to use defaults; the Wild Die can be disabled with "n/a". Positive modifiers are automatically prefixed. On the far right, you can set a color marker for any purpose.
+
+
Track Rolls
+
+
When you lock the skill tracks with the icon in the top-right corner above the color marker column, you can click on the bubbles to roll the corresponding die independently. This is useful for effects that dynamically alter your skill die, such as boost/lower trait .
+
+
Vehicles & More
+
+
You can enable blocks for vehicles and other vessels in the Blocks tab under Settings. The silhouette of vehicles can be cycled through by clicking; the switch can take a moment. Both blocks can display weapons by adding a number to the corresponding attribute (0-10).
+
+
+
+
+
+
+
+
+
+
+
+ {{#description}}
+
{{description}}
{{/description}}
+
{{#reroll}}
+
{{/reroll}}{{#damageroll}}
+
{{/damageroll}}{{#source_label}}
+
+
{{source_label}}
+
{{source}}
+
{{/source_label}}{{#traitdie}}
+
+
{{trait}}
+
{{traitdie}} {{#flat}}({{flat}}) {{/flat}}
+
+
{{/traitdie}}{{#rollLess() global_wdroll 0}}{{#wd}}{{#rollGreater() wdroll -1000}}
+
{{/rollGreater() wdroll -1000}}{{/wd}}{{/rollLess() global_wdroll 0}}{{#rollGreater() global_wdroll -1000}}
+
+
Wild Die
+
{{global_wd}}
+
{{/rollGreater() global_wdroll -1000}}{{#rollGreater() bonus_wdroll -1000}}
+
+
Bonus Wild Die
+
{{bonus_wd}}
+
{{/rollGreater() bonus_wdroll -1000}}{{#commander}}
+
+
Commander
+
{{commander}}
+
{{/commander}}
+
+
Modifier
+
{{modifier}}{{#bonus}} ({{bonus}}){{/bonus}}
+
{{#rollGreater() rof 1}}
+
{{/rollGreater() rof 1}}{{#rollGreater() wounds 0}}
+
+
Wound Penalty
+
{{wounds}}
+
{{/rollGreater() wounds 0}}{{#rollGreater() fatigue 0}}
+
+
Fatigue
+
{{fatigue}}
+
{{/rollGreater() fatigue 0}}{{#custom1_label}}
+
+
{{custom1_label}}
+
{{custom1}}
+
{{/custom1_label}}{{#custom2_label}}
+
+
{{custom2_label}}
+
{{custom2}}
+
{{/custom2_label}}{{#custom3_label}}
+
+
{{custom3_label}}
+
{{custom3}}
+
{{/custom3_label}}
+
+
+
+
{{traitroll1}}
+
{{#rollGreater() rof 1}}
+
{{traitroll2}}
+
{{/rollGreater() rof 1}}{{#rollGreater() rof 2}}
+
{{traitroll3}}
+
{{/rollGreater() rof 2}}{{#rollGreater() rof 3}}
+
{{traitroll4}}
+
{{/rollGreater() rof 3}}{{#rollGreater() rof 4}}
+
{{traitroll5}}
+
{{/rollGreater() rof 4}}{{#rollGreater() rof 5}}
+
{{traitroll6}}
+
{{/rollGreater() rof 5}}{{#rollGreater() rof 6}}
+
{{traitroll7}}
+
{{/rollGreater() rof 6}}{{#rollGreater() rof 7}}
+
{{traitroll8}}
+
{{/rollGreater() rof 7}}
+
+
{{#rollLess() global_wdroll -100}}{{#rollGreater() wdroll -1000}}
+
{{wdroll}}
+
{{/rollGreater() wdroll -1000}}{{/rollLess() global_wdroll -100}}{{#rollGreater() global_wdroll -1000}}
+
{{global_wdroll}}
+
{{/rollGreater() global_wdroll -1000}}{{#rollGreater() bonus_wdroll -1000}}
+
{{bonus_wdroll}}
+
{{/rollGreater() bonus_wdroll -1000}}
+
+
+
+
+
+
+
+
+
+
{{roll1}}
+
{{#rollGreater() rof 1}}
+
{{roll2}}
+
{{/rollGreater() rof 1}}{{#rollGreater() rof 2}}
+
{{roll3}}
+
{{/rollGreater() rof 2}}{{#rollGreater() rof 3}}
+
{{roll4}}
+
{{/rollGreater() rof 3}}{{#rollGreater() rof 4}}
+
{{roll5}}
+
{{/rollGreater() rof 4}}{{#rollGreater() rof 5}}
+
{{roll6}}
+
{{/rollGreater() rof 5}}{{#rollGreater() rof 6}}
+
{{roll7}}
+
{{/rollGreater() rof 6}}{{#rollGreater() rof 7}}
+
{{roll8}}
+
{{/rollGreater() rof 7}}
+
+
+
+
+
+
+
+
+
+
+
+ {{#description}}
+
{{description}}
{{/description}}
+
{{#reroll}}
+
{{/reroll}}{{#source_label}}
+
+
{{source_label}}
+
{{source}}
+
{{/source_label}}
+
{{#modifier}}
+
+
Damage Modifier
+
{{modifier}}
+
{{/modifier}}{{#ap}}
+
+
Armor Piercing
+
{{ap}}
+
{{/ap}}{{#rollGreater() rof 1}}
+
{{/rollGreater() rof 1}}{{#range}}
+
{{/range}}{{#trapping}}
+
+
Trapping
+
{{trapping}}
+
{{/trapping}}{{#custom1_label}}
+
+
{{custom1_label}}
+
{{custom1}}
+
{{/custom1_label}}{{#custom2_label}}
+
+
{{custom2_label}}
+
{{custom2}}
+
{{/custom2_label}}{{#custom3_label}}
+
+
{{custom3_label}}
+
{{custom3}}
+
{{/custom3_label}}
+
+
+
{{roll1}}
+
{{#rollGreater() rof 1}}
+
{{roll2}}
+
{{/rollGreater() rof 1}}{{#rollGreater() rof 2}}
+
{{roll3}}
+
{{/rollGreater() rof 2}}{{#rollGreater() rof 3}}
+
{{roll4}}
+
{{/rollGreater() rof 3}}{{#rollGreater() rof 4}}
+
{{roll5}}
+
{{/rollGreater() rof 4}}{{#rollGreater() rof 5}}
+
{{roll6}}
+
{{/rollGreater() rof 5}}{{#rollGreater() rof 6}}
+
{{roll7}}
+
{{/rollGreater() rof 6}}{{#rollGreater() rof 7}}
+
{{roll8}}
+
{{/rollGreater() rof 7}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Savage Worlds - Graph Paper/img/aircraft_01.png b/Savage Worlds - Graph Paper/img/aircraft_01.png
new file mode 100644
index 0000000000..e9d25cf93f
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/aircraft_01.png differ
diff --git a/Savage Worlds - Graph Paper/img/aircraft_02.png b/Savage Worlds - Graph Paper/img/aircraft_02.png
new file mode 100644
index 0000000000..5337e17d57
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/aircraft_02.png differ
diff --git a/Savage Worlds - Graph Paper/img/aircraft_03.png b/Savage Worlds - Graph Paper/img/aircraft_03.png
new file mode 100644
index 0000000000..92ea425ff8
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/aircraft_03.png differ
diff --git a/Savage Worlds - Graph Paper/img/armor_line.png b/Savage Worlds - Graph Paper/img/armor_line.png
new file mode 100644
index 0000000000..0cabdc3717
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/armor_line.png differ
diff --git a/Savage Worlds - Graph Paper/img/arms_line.png b/Savage Worlds - Graph Paper/img/arms_line.png
new file mode 100644
index 0000000000..a0695a1609
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/arms_line.png differ
diff --git a/Savage Worlds - Graph Paper/img/car_01.png b/Savage Worlds - Graph Paper/img/car_01.png
new file mode 100644
index 0000000000..f525511670
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/car_01.png differ
diff --git a/Savage Worlds - Graph Paper/img/car_02.png b/Savage Worlds - Graph Paper/img/car_02.png
new file mode 100644
index 0000000000..30f60635bb
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/car_02.png differ
diff --git a/Savage Worlds - Graph Paper/img/car_03.png b/Savage Worlds - Graph Paper/img/car_03.png
new file mode 100644
index 0000000000..ad19a1ed1c
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/car_03.png differ
diff --git a/Savage Worlds - Graph Paper/img/car_04.png b/Savage Worlds - Graph Paper/img/car_04.png
new file mode 100644
index 0000000000..73baabe927
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/car_04.png differ
diff --git a/Savage Worlds - Graph Paper/img/decoration_line.png b/Savage Worlds - Graph Paper/img/decoration_line.png
new file mode 100644
index 0000000000..4f4a06039e
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/decoration_line.png differ
diff --git a/Savage Worlds - Graph Paper/img/female_silhouette.png b/Savage Worlds - Graph Paper/img/female_silhouette.png
new file mode 100644
index 0000000000..9c5e030d1b
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/female_silhouette.png differ
diff --git a/Savage Worlds - Graph Paper/img/head_line.png b/Savage Worlds - Graph Paper/img/head_line.png
new file mode 100644
index 0000000000..2b17f0cefc
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/head_line.png differ
diff --git a/Savage Worlds - Graph Paper/img/hexagon_36.svg b/Savage Worlds - Graph Paper/img/hexagon_36.svg
new file mode 100644
index 0000000000..79c1a02f8f
--- /dev/null
+++ b/Savage Worlds - Graph Paper/img/hexagon_36.svg
@@ -0,0 +1 @@
+
diff --git a/Savage Worlds - Graph Paper/img/hexagon_48.svg b/Savage Worlds - Graph Paper/img/hexagon_48.svg
new file mode 100644
index 0000000000..37d5131d87
--- /dev/null
+++ b/Savage Worlds - Graph Paper/img/hexagon_48.svg
@@ -0,0 +1 @@
+
diff --git a/Savage Worlds - Graph Paper/img/hexagon_64.svg b/Savage Worlds - Graph Paper/img/hexagon_64.svg
new file mode 100644
index 0000000000..af913958ea
--- /dev/null
+++ b/Savage Worlds - Graph Paper/img/hexagon_64.svg
@@ -0,0 +1 @@
+
diff --git a/Savage Worlds - Graph Paper/img/legs_line.png b/Savage Worlds - Graph Paper/img/legs_line.png
new file mode 100644
index 0000000000..4d2af470d6
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/legs_line.png differ
diff --git a/Savage Worlds - Graph Paper/img/male_silhouette.png b/Savage Worlds - Graph Paper/img/male_silhouette.png
new file mode 100644
index 0000000000..dbc6115f30
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/male_silhouette.png differ
diff --git a/Savage Worlds - Graph Paper/img/powerarmor_01.png b/Savage Worlds - Graph Paper/img/powerarmor_01.png
new file mode 100644
index 0000000000..de0a7a7aa4
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/powerarmor_01.png differ
diff --git a/Savage Worlds - Graph Paper/img/quad-bike.png b/Savage Worlds - Graph Paper/img/quad-bike.png
new file mode 100644
index 0000000000..e78e32c23a
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/quad-bike.png differ
diff --git a/Savage Worlds - Graph Paper/img/skull.png b/Savage Worlds - Graph Paper/img/skull.png
new file mode 100644
index 0000000000..db4d9f8a48
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/skull.png differ
diff --git a/Savage Worlds - Graph Paper/img/spacecraft_01.png b/Savage Worlds - Graph Paper/img/spacecraft_01.png
new file mode 100644
index 0000000000..de7c2c4240
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/spacecraft_01.png differ
diff --git a/Savage Worlds - Graph Paper/img/spacecraft_02.png b/Savage Worlds - Graph Paper/img/spacecraft_02.png
new file mode 100644
index 0000000000..adf92df860
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/spacecraft_02.png differ
diff --git a/Savage Worlds - Graph Paper/img/spacecraft_03.png b/Savage Worlds - Graph Paper/img/spacecraft_03.png
new file mode 100644
index 0000000000..f805433484
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/spacecraft_03.png differ
diff --git a/Savage Worlds - Graph Paper/img/spacecraft_04.png b/Savage Worlds - Graph Paper/img/spacecraft_04.png
new file mode 100644
index 0000000000..7a810b9014
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/spacecraft_04.png differ
diff --git a/Savage Worlds - Graph Paper/img/sports-bike.png b/Savage Worlds - Graph Paper/img/sports-bike.png
new file mode 100644
index 0000000000..4097c8be2c
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/sports-bike.png differ
diff --git a/Savage Worlds - Graph Paper/img/tank.png b/Savage Worlds - Graph Paper/img/tank.png
new file mode 100644
index 0000000000..06a8ca0c49
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/tank.png differ
diff --git a/Savage Worlds - Graph Paper/img/torso_line.png b/Savage Worlds - Graph Paper/img/torso_line.png
new file mode 100644
index 0000000000..68079e135c
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/torso_line.png differ
diff --git a/Savage Worlds - Graph Paper/img/unskilled_bg.png b/Savage Worlds - Graph Paper/img/unskilled_bg.png
new file mode 100644
index 0000000000..fad1785b1b
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/unskilled_bg.png differ
diff --git a/Savage Worlds - Graph Paper/img/walker.png b/Savage Worlds - Graph Paper/img/walker.png
new file mode 100644
index 0000000000..fc446239cc
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/walker.png differ
diff --git a/Savage Worlds - Graph Paper/img/watercraft_01.png b/Savage Worlds - Graph Paper/img/watercraft_01.png
new file mode 100644
index 0000000000..4747617178
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/watercraft_01.png differ
diff --git a/Savage Worlds - Graph Paper/img/watercraft_02.png b/Savage Worlds - Graph Paper/img/watercraft_02.png
new file mode 100644
index 0000000000..a90d90cc26
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/watercraft_02.png differ
diff --git a/Savage Worlds - Graph Paper/img/watercraft_03.png b/Savage Worlds - Graph Paper/img/watercraft_03.png
new file mode 100644
index 0000000000..d239ea1df6
Binary files /dev/null and b/Savage Worlds - Graph Paper/img/watercraft_03.png differ
diff --git a/Savage Worlds - Graph Paper/previews/ammunition.gif b/Savage Worlds - Graph Paper/previews/ammunition.gif
new file mode 100644
index 0000000000..3ed18d32e5
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/ammunition.gif differ
diff --git a/Savage Worlds - Graph Paper/previews/attributes.gif b/Savage Worlds - Graph Paper/previews/attributes.gif
new file mode 100644
index 0000000000..a196861797
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/attributes.gif differ
diff --git a/Savage Worlds - Graph Paper/previews/augmentations.gif b/Savage Worlds - Graph Paper/previews/augmentations.gif
new file mode 100644
index 0000000000..47cd243338
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/augmentations.gif differ
diff --git a/Savage Worlds - Graph Paper/previews/extra_sheet.png b/Savage Worlds - Graph Paper/previews/extra_sheet.png
new file mode 100644
index 0000000000..27dfa7ae7a
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/extra_sheet.png differ
diff --git a/Savage Worlds - Graph Paper/previews/features.gif b/Savage Worlds - Graph Paper/previews/features.gif
new file mode 100644
index 0000000000..9ffd1a001c
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/features.gif differ
diff --git a/Savage Worlds - Graph Paper/previews/health.gif b/Savage Worlds - Graph Paper/previews/health.gif
new file mode 100644
index 0000000000..d84df7517b
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/health.gif differ
diff --git a/Savage Worlds - Graph Paper/previews/power_options.gif b/Savage Worlds - Graph Paper/previews/power_options.gif
new file mode 100644
index 0000000000..968c7d0350
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/power_options.gif differ
diff --git a/Savage Worlds - Graph Paper/previews/roll_template.png b/Savage Worlds - Graph Paper/previews/roll_template.png
new file mode 100644
index 0000000000..7a36918414
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/roll_template.png differ
diff --git a/Savage Worlds - Graph Paper/previews/settings.gif b/Savage Worlds - Graph Paper/previews/settings.gif
new file mode 100644
index 0000000000..70c586352d
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/settings.gif differ
diff --git a/Savage Worlds - Graph Paper/previews/skills.gif b/Savage Worlds - Graph Paper/previews/skills.gif
new file mode 100644
index 0000000000..a6c026c7a2
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/skills.gif differ
diff --git a/Savage Worlds - Graph Paper/previews/vehicles.gif b/Savage Worlds - Graph Paper/previews/vehicles.gif
new file mode 100644
index 0000000000..b6d0ec82d6
Binary files /dev/null and b/Savage Worlds - Graph Paper/previews/vehicles.gif differ
diff --git a/Savage Worlds - Graph Paper/readme.md b/Savage Worlds - Graph Paper/readme.md
new file mode 100644
index 0000000000..ec71e8e362
--- /dev/null
+++ b/Savage Worlds - Graph Paper/readme.md
@@ -0,0 +1,421 @@
+# Savage Worlds - Graph Paper (SWADE)
+This character sheet was originally made for **Maschinenleben** (released later this year), a fan product for the **Savage Worlds Adventure Edition** (SWADE) about cyborgs struggling with their loss of self. Due to its extensive build and customization options, it can be used for many other settings as well. Join the [support game](https://app.roll20.net/join/8488284/oQJGfg) for bug reports and requests.
+
+## Notable Features
+* **Blocks:** Allies, Augmentations, Integrity/Sanity, Powers, Vehicles, and more
+* **Fields On Demand:** Show only what you really need to keep the view tidy
+* **Extra Sheet:** Alternative sheet with a simplified layout for non-player characters
+* **Customization:** Optional rules and functions, custom skills, and renaming
+* **Setting Rules:** Enable/Disable optional rules and functions, such as *No Power Points* or *Explode Run Die*
+* **Template Rolls:** Multiple dice for multiple targets (RoF 1-8) with a custom Wild Die
+* **Failures/Botches:** Dice that show a [1] or [2] are colored red or gray respectively
+* **Health/Conditions:** Manage Wounds, Fatigue, and more with a simple click
+* **Silhouettes:** They look fancy! You can also add color markers as indicators
+
+## Previews & Gifs
+
+ Full Preview
+
+ 
+
+
+
+ Extra Sheet
+
+ 
+
+
+
+ Roll Template
+
+ 
+
+
+
+ Attributes
+
+ 
+
+
+
+ Edges & Hindrances
+
+ 
+
+
+
+ Skills
+
+ 
+
+
+
+ Health
+
+ 
+
+
+
+ Augmentations & Integrity
+
+ 
+
+
+
+ Repeating Lists & Options
+
+ 
+
+
+
+ Vehicles
+
+ 
+
+
+
+ Ammunition
+
+ 
+
+
+
+ Settings
+
+ 
+
+
+## Latest Changes
+#### Version 1.2.5
+* Refactored all skill rolls
+* Extended [Button] option in lists with a modifier field
+* Added [Ace Damage] toggle to Engrams, Powers, and Weapons
+* Added helper button to toggle global GM rolls
+* Added Abilities block
+#### Version 1.2.4
+* Added three configurable custom buttons to Settings > Setup
+* Fixed some minor CSS issues
+#### Version 1.2.3
+* Added helper button to toggle global Wild Die query
+* Added helper button to toggle global Rate of Fire query
+* Added helper button to toggle global Bonus Wild Die query
+* Fixed critical bug that broke nearly all rolls
+#### Version 1.2.2
+* Added damage (re-)roll buttons to Roll Templates
+* Roll Templates now have hooks for descriptions and three custom fields
+* Added injection hook to list rolls to allow custom code
+* Added setting toggles for list roll descriptions and injections
+* Added [Multiplier] option to Augmentations
+* Added [Wild Die Override] option to Engrams, Powers, and Weapons
+* Added [Roll Description] option to Engrams, Powers, and Weapons
+* Added [Roll Injection] option to Engrams, Powers, and Weapons
+* Added help entries for extra sheet, list item options, and raise damage
+* Updated older help entries and translations
+* Reduced HTML and CSS
+
+
+ Previous Versions
+
+ #### Version 1.2.1
+ * Improved handling for Rate of Fire
+ * Fixed critical bug in Rate of Fire handling
+ * Dice roller codes are now parsed
+ * Added [Query RoF] option to Engrams, Powers, and Weapons
+ * Improved performance
+ * Fixed sheet default settings not being applied
+ * Added setting option to apply Fatigue to run rolls
+ #### Version 1.2.0
+ * Various improvements, refactoring, and bug/style fixes
+ * Enhanced usability of damage roll toggles for repeating lists
+ * Damage codes of powers are now processed by the dice parser
+ * Added setting menu with options to some interactive list items
+ * Powers: Show Damage, Show Trapping, Roll Button (Input)
+ * Engrams: Roll Button (Input)
+ * Weapons: Show Trapping, Roll Button (Input)
+ * Added the saved maximum capacity to ammunition magazines
+ * Updated the sheet’s help section
+
+ #### Version 1.1.1
+ * Added reroll button to Roll Templates
+ * Added additional toggles for skills
+ #### Version 1.1.0
+ * Added Ammunition block
+ * Added options to rename ammunition magazines
+ * Added new help section, *Ammunition: You can keep track of up to three named "magazines" in the Ammunition block. The buttons allow you to quickly add to or subtract from the values. You can save a value with [S] and restore it with [R].*
+ #### Version 1.0.2
+ * Increased Rate of Fire range from 6 to 8
+ #### Version 1.0.1
+ * Made lightest text color a bit darker
+ * Moved `transition` property to class scopes
+ * Dice parser now captures leading attribute shortcodes
+ #### Version 1.0
+ * Initial release
+
+
+## Development
+The character sheet is compiled from [Pug](https://pugjs.org/api/getting-started.html) templates with [SCSS/SASS](https://sass-lang.com/guide) (LibSass). You need both in order to contribute; do not directly modify the compiled HTML and CSS files because these changes will be overwritten! Use the `browser_preview.html` to get a local preview without the need to open Roll20 (non-functional, of course).
+
+### Contribution Guidelines
+* Make sure to always delete `@charset "UTF-8";` from the compiled CSS; Roll20 will not load it otherwise
+* Make sure the compiled HTML has an Unix line ending
+* The default `font-size` is `10px` optimized for 1440p or better resolutions, but keep 1080p in mind
+* Follow the 8×8 pixel grid (starting top-left); the height of each block must be a multiple of 8
+* The devil is in the detail; align and size all elements as precisely as possible (Chrome leads)
+* Use [Block Element Modifiers](http://getbem.com/naming/) to name CSS classes; avoid redundancies as much as reasonable
+* Use sheetworkers instead of auto-calculating fields
+* Always go the "extra mile"
+
+### Translations
+Most of the sheet's strings can be changed via the translation.json. However, some strings need to be manually changed by the GM due to the renaming feature for Traits. Note that certain sheetworker scripts depend on English strings, such as the die codes (e.g. d4, d6, ...) for parsers. If you use [Roll20's translation generation](https://roll20.zendesk.com/hc/en-us/articles/360037773493-Character-Sheet-Translation#CharacterSheetTranslation-StepTwo,GeneratingtheTranslationFile) feature `i18nOutput`, make sure to add the following pairs afterward since they will not be automatically included. Order alphabetically and use ` ` for trailing whitespaces. Put CSS adjustments due to differing word lengths in `_translation_overrides.scss`.
+
+
+ Pseudo-Element Labels
+
+```
+"settings-tab-styles": "Styles",
+"settings-tab-setup": "Setup",
+"settings-tab-blocks": "Blocks",
+"settings-tab-skills": "Skills",
+"settings-tab-help": "Help",
+"tab-skills": "Skills",
+"tab-advancements": "Advancements",
+"tab-notebook": "Notebook",
+"tab-settings": "Settings",
+"skill-track-die-label-d4-2": "2",
+"skill-track-die-label-d4": "4",
+"skill-track-die-label-d6": "6",
+"skill-track-die-label-d8": "8",
+"skill-track-die-label-d10": "10",
+"skill-track-die-label-d12": "12",
+"{": "{",
+"}": "}"
+```
+
+
+
+ Sheet Defaults Translations
+
+```
+"defaults-block-show-abilities": "[Block] Show Abilities",
+"defaults-block-show-abilities-description": "List special abilities or monstrous powers.",
+"defaults-block-show-allies": "[Block] Show Allies",
+"defaults-block-show-allies-description": "Keep track of allied characters with a barebone mini sheet.",
+"defaults-block-show-ammunition": "[Block] Show Ammunition",
+"defaults-block-show-ammunition-description": "Keep track of your \"magazines\" for three weapons.",
+"defaults-block-show-augmentations": "[Block] Show Augmentations",
+"defaults-block-show-augmentations-description": "Install augmentations/cyberware and keep track of the Loss/Strain.",
+"defaults-block-show-engrams": "[Block] Show Engrams",
+"defaults-block-show-engrams-description": "Special programs or hardware to execute Hacking actions.",
+"defaults-block-show-integrity": "[Block] Show Integrity",
+"defaults-block-show-integrity-description": "Quantifies mental health/sanity and keeps track of mental afflictions. Maschinenleben.",
+"defaults-block-show-power": "[Block] Show Power/Energy",
+"defaults-block-show-power-description": "The energy/mana/etc. reserves of a character.",
+"defaults-block-show-powerarmors": "[Block] Show Power Armors",
+"defaults-block-show-powerarmors-description": "Vehicles and their modifications/weapons.",
+"defaults-block-show-powers": "[Block] Show Powers/Spells",
+"defaults-block-show-powers-description": "The known powers/spells of a character.",
+"defaults-block-show-vehicles": "[Block] Show Vehicles",
+"defaults-block-show-vehicles-description": "Vehicles and their modifications/weapons.",
+"defaults-block-show-walkers": "[Block] Show Walkers",
+"defaults-block-show-walkers-description": "Walkers/Mechs and their modifications/weapons.Show/Hide Skills You can show or hide skills from the list in accordance with the played Game Setting. This can also be done manually for each individual sheet in its Settings tab. There are two custom skills that can be renamed and modified within the sheet as well, for example to make specialized skills (e.g. specific weapons with custom bonus or Wild Die).
",
+"defaults-function-explode-run-die": "[Function] Explode Run Die",
+"defaults-function-explode-run-die-description": "Makes the run die Ace.",
+"defaults-function-running-applies-fatigue": "[Function] Running Applies Fatigue",
+"defaults-function-running-applies-fatigue-description": "Fatigue penalties are subtracted from the run roll.Show/Hide Blocks You can show or hide content blocks in accordance with the played Game Setting. This can also be done manually for each individual sheet in its Settings tab. Some blocks that were designed for Maschinenleben, such as Augmentations and Engrams, can be adapted for other purposes as well.
",
+"defaults-function-running-ignores-wounds": "[Function] Running Ignores Wounds",
+"defaults-function-running-ignores-wounds-description": "Wound penalties are not subtracted from the run roll.",
+"defaults-rename-attribute-agi": "[Rename] Attribute: AGI to ",
+"defaults-rename-attribute-agi-description": "Renamed via the attribute rename_agi .",
+"defaults-rename-attribute-agility": "[Rename] Attribute: Agility to ",
+"defaults-rename-attribute-agility-description": "Renamed via the attribute rename_agility .",
+"defaults-rename-attribute-sma": "[Rename] Attribute: SMA to ",
+"defaults-rename-attribute-sma-description": "Renamed via the attribute rename_sma .",
+"defaults-rename-attribute-smarts": "[Rename] Attribute: Smarts to ",
+"defaults-rename-attribute-smarts-description": "Renamed via the attribute rename_smarts .",
+"defaults-rename-attribute-spi": "[Rename] Attribute: SPI to ",
+"defaults-rename-attribute-spi-description": "Renamed via the attribute rename_spi .",
+"defaults-rename-attribute-spirit": "[Rename] Attribute: Spirit to ",
+"defaults-rename-attribute-spirit-description": "Renamed via the attribute rename_spirit .",
+"defaults-rename-attribute-str": "[Rename] Attribute: STR to ",
+"defaults-rename-attribute-str-description": "Renamed via the attribute rename_str .",
+"defaults-rename-attribute-strength": "[Rename] Attribute: Strength to ",
+"defaults-rename-attribute-strength-description": "Renamed via the attribute rename_strength .",
+"defaults-rename-attribute-vig": "[Rename] Attribute: VIG to ",
+"defaults-rename-attribute-vig-description": "Renamed via the attribute rename_vig .Rename Skills You can rename the labels of each skill, best kept below 15 characters due to layout constrains. This can also be done manually with the @{rename_attribute} for each individual sheet. Note that changing the label does not affect the reference @{attribute} for rolls. They will always be in English.
",
+"defaults-rename-attribute-vigor": "[Rename] Attribute: Vigor to ",
+"defaults-rename-attribute-vigor-description": "Renamed via the attribute rename_vigor .",
+"defaults-rename-block-allies": "[Rename] Block: Allies to ",
+"defaults-rename-block-allies-description": "Renamed via the attribute rename_block_allies .",
+"defaults-rename-block-ammunition": "[Rename] Block: Ammunition to ",
+"defaults-rename-block-ammunition-description": "Renamed via the attribute rename_block_ammunition .",
+"defaults-rename-block-apparel": "[Rename] Block: Apparel to ",
+"defaults-rename-block-apparel-description": "Renamed via the attribute rename_block_apparel .",
+"defaults-rename-block-augmentations": "[Rename] Block: Augmentations to ",
+"defaults-rename-block-augmentations-description": "Renamed via the attribute rename_block_augmentations .",
+"defaults-rename-block-engrams": "[Rename] Block: Engrams to ",
+"defaults-rename-block-engrams-description": "Renamed via the attribute rename_block_engrams .",
+"defaults-rename-block-integrity": "[Rename] Block: Integrity to ",
+"defaults-rename-block-integrity-description": "Renamed via the attribute rename_block_integrity .",
+"defaults-rename-block-inventory": "[Rename] Block: Inventory to ",
+"defaults-rename-block-inventory-description": "Renamed via the attribute rename_block_inventory .",
+"defaults-rename-block-power": "[Rename] Block: Power to ",
+"defaults-rename-block-power-description": "Renamed via the attribute rename_block_power .",
+"defaults-rename-block-powerarmors": "[Rename] Block: Power Armors to ",
+"defaults-rename-block-powerarmors-description": "Renamed via the attribute rename_block_powerarmors .",
+"defaults-rename-block-powers": "[Rename] Block: Powers to ",
+"defaults-rename-block-powers-description": "Renamed via the attribute rename_block_powers .",
+"defaults-rename-block-quick-notes": "[Rename] Block: Quick Notes to ",
+"defaults-rename-block-quick-notes-description": "Renamed via the attribute rename_block_quick_notes .",
+"defaults-rename-block-vehicles": "[Rename] Block: Vehicles to ",
+"defaults-rename-block-vehicles-description": "Renamed via the attribute rename_block_vehicles .",
+"defaults-rename-block-walkers": "[Rename] Block: Walkers to ",
+"defaults-rename-block-walkers-description": "Renamed via the attribute rename_block_walkers .",
+"defaults-rename-block-weapons": "[Rename] Block: Weapons to ",
+"defaults-rename-block-weapons-description": "Renamed via the attribute rename_block_weapons .Rename Integrity Hindrances (Maschinenleben) You can rename the Hindrances caused by the loss of Integrity (Sanity, Purity, etc.). This can also be done manually with the @{rename_integrity-attribute} for each individual sheet. Note that they activate in intervals with each fraction of 10 below 70 — Discord triggers on 69.9 or lower, Dissonance on 59.9 or lower, and so forth.
",
+"defaults-rename-integrity-alienation": "[Rename] Integrity: Alienation to ",
+"defaults-rename-integrity-alienation-description": "Renamed via the attribute rename_alienation .",
+"defaults-rename-integrity-depersonalization": "[Rename] Integrity: Depersonalization to ",
+"defaults-rename-integrity-depersonalization-description": "Renamed via the attribute rename_depersonalization .",
+"defaults-rename-integrity-derealization": "[Rename] Integrity: Derealization to ",
+"defaults-rename-integrity-derealization-description": "Renamed via the attribute rename_derealization .",
+"defaults-rename-integrity-discord": "[Rename] Integrity: Discord to ",
+"defaults-rename-integrity-discord-description": "Renamed via the attribute rename_discord .",
+"defaults-rename-integrity-dissonance": "[Rename] Integrity: Dissonance to ",
+"defaults-rename-integrity-dissonance-description": "Renamed via the attribute rename_dissonance .",
+"defaults-rename-integrity-ego-death": "[Rename] Integrity: Ego Death to ",
+"defaults-rename-integrity-ego-death-description": "Renamed via the attribute rename_ego_death .",
+"defaults-rename-integrity-psychosis": "[Rename] Integrity: Psychosis to ",
+"defaults-rename-integrity-psychosis-description": "Renamed via the attribute rename_psychosis .",
+"defaults-rename-integrity-seizures": "[Rename] Integrity: Seizures to ",
+"defaults-rename-integrity-seizures-description": "Renamed via the attribute rename_seizures .",
+"defaults-rename-label-age": "[Rename] Label: Age to ",
+"defaults-rename-label-age-description": "Renamed via the attribute rename_label_age (e.g. Number or Incarnation).",
+"defaults-rename-label-bits": "[Rename] Label: #Bits to ",
+"defaults-rename-label-bits-description": "Renamed via the attribute rename_label_bits (e.g. Money or Gold).Rename Blocks You can rename the blocks to better fit the Game Setting, such as \"Powers\" to \"Talismans\" or \"Walkers\" to \"Frames\". This can also be done manually with the @{rename_block_attribute} for each individual sheet.
",
+"defaults-rename-label-exp": "[Rename] Label: EXP to ",
+"defaults-rename-label-exp-description": "Renamed via the attribute rename_label_exp (e.g. Karma or Gems).",
+"defaults-rename-label-eyes": "[Rename] Label: Eyes to ",
+"defaults-rename-label-eyes-description": "Renamed via the attribute rename_label_eyes (e.g. Sensors or Optics).",
+"defaults-rename-label-gender": "[Rename] Label: Gender to ",
+"defaults-rename-label-gender-description": "Renamed via the attribute rename_label_gender (e.g. Sex or Version).",
+"defaults-rename-label-hair": "[Rename] Label: Hair to ",
+"defaults-rename-label-hair-description": "Renamed via the attribute rename_label_hair (e.g. Horns or Mane).",
+"defaults-rename-label-height": "[Rename] Label: Height to ",
+"defaults-rename-label-height-description": "Renamed via the attribute rename_label_height (e.g. Scale or Length).",
+"defaults-rename-label-level": "[Rename] Label: Level to ",
+"defaults-rename-label-level-description": "Renamed via the attribute rename_label_level (e.g. Circle or Year).",
+"defaults-rename-label-name": "[Rename] Label: Name to ",
+"defaults-rename-label-name-description": "Renamed via the attribute rename_label_name (e.g. Alias or Codename).",
+"defaults-rename-label-origin": "[Rename] Label: Origin to ",
+"defaults-rename-label-origin-description": "Renamed via the attribute rename_label_origin (e.g. Race or Species).",
+"defaults-rename-label-rank": "[Rename] Label: Rank to ",
+"defaults-rename-label-rank-description": "Renamed via the attribute rename_label_rank (e.g. Grade or Titel).",
+"defaults-rename-label-weight": "[Rename] Label: Weight to ",
+"defaults-rename-label-weight-description": "Renamed via the attribute rename_label_weight (e.g. Mass or Your Mom).",
+"defaults-rename-skill-academics": "[Rename] Skill: Academics to ",
+"defaults-rename-skill-academics-description": "Renamed via the attribute rename_academics .",
+"defaults-rename-skill-athletics": "[Rename] Skill: Athletics to ",
+"defaults-rename-skill-athletics-description": "Renamed via the attribute rename_athletics .",
+"defaults-rename-skill-boating": "[Rename] Skill: Boating to ",
+"defaults-rename-skill-boating-description": "Renamed via the attribute rename_boating .",
+"defaults-rename-skill-common-knowledge": "[Rename] Skill: Common Knowl. to ",
+"defaults-rename-skill-common-knowledge-description": "Renamed via the attribute rename_common_knowledge .",
+"defaults-rename-skill-custom-skill-1": "[Rename] Skill: Custom Skill #1 to ",
+"defaults-rename-skill-custom-skill-1-description": "Can be renamed directly in the sheet's Settings tab.",
+"defaults-rename-skill-custom-skill-2": "[Rename] Skill: Custom Skill #2 to ",
+"defaults-rename-skill-custom-skill-2-description": "Can be renamed directly in the sheet's Settings tab.Rename Labels You can rename the labels at the top of the sheet, such as \"Name\" to \"Alias\" or \"Origin\" to \"Race\". This can also be done manually with the @{rename_label_attribute} for each individual sheet. Note that the labels are separated from the actual fields and do not affect the references (e.g. @{name} ). They will always be in English.
",
+"defaults-rename-skill-driving": "[Rename] Skill: Driving to ",
+"defaults-rename-skill-driving-description": "Renamed via the attribute rename_driving .",
+"defaults-rename-skill-electronics": "[Rename] Skill: Electronics to ",
+"defaults-rename-skill-electronics-description": "Renamed via the attribute rename_electronics .",
+"defaults-rename-skill-faith": "[Rename] Skill: Faith to ",
+"defaults-rename-skill-faith-description": "Renamed via the attribute rename_faith .",
+"defaults-rename-skill-fighting": "[Rename] Skill: Fighting to ",
+"defaults-rename-skill-fighting-description": "Renamed via the attribute rename_fighting .",
+"defaults-rename-skill-focus": "[Rename] Skill: Focus to ",
+"defaults-rename-skill-focus-description": "Renamed via the attribute rename_focus .",
+"defaults-rename-skill-gambling": "[Rename] Skill: Gambling to ",
+"defaults-rename-skill-gambling-description": "Renamed via the attribute rename_gambling .",
+"defaults-rename-skill-hacking": "[Rename] Skill: Hacking to ",
+"defaults-rename-skill-hacking-description": "Renamed via the attribute rename_hacking .",
+"defaults-rename-skill-healing": "[Rename] Skill: Healing to ",
+"defaults-rename-skill-healing-description": "Renamed via the attribute rename_healing .",
+"defaults-rename-skill-intimidation": "[Rename] Skill: Intimidation to ",
+"defaults-rename-skill-intimidation-description": "Renamed via the attribute rename_intimidation .",
+"defaults-rename-skill-language": "[Rename] Skill: Language to ",
+"defaults-rename-skill-language-description": "Renamed via the attribute rename_language .",
+"defaults-rename-skill-magic": "[Rename] Skill: Magic to ",
+"defaults-rename-skill-magic-description": "Renamed via the attribute rename_magic .",
+"defaults-rename-skill-notice": "[Rename] Skill: Notice to ",
+"defaults-rename-skill-notice-description": "Renamed via the attribute rename_notice .",
+"defaults-rename-skill-occult": "[Rename] Skill: Occult to ",
+"defaults-rename-skill-occult-description": "Renamed via the attribute rename_occult .",
+"defaults-rename-skill-performance": "[Rename] Skill: Performance to ",
+"defaults-rename-skill-performance-description": "Renamed via the attribute rename_performance .",
+"defaults-rename-skill-persuasion": "[Rename] Skill: Persuasion to ",
+"defaults-rename-skill-persuasion-description": "Renamed via the attribute rename_persuasion .",
+"defaults-rename-skill-piloting": "[Rename] Skill: Piloting to ",
+"defaults-rename-skill-piloting-description": "Renamed via the attribute rename_piloting .",
+"defaults-rename-skill-psionics": "[Rename] Skill: Psionics to ",
+"defaults-rename-skill-psionics-description": "Renamed via the attribute rename_psionics .",
+"defaults-rename-skill-repair": "[Rename] Skill: Repair to ",
+"defaults-rename-skill-repair-description": "Renamed via the attribute rename_repair .",
+"defaults-rename-skill-research": "[Rename] Skill: Research to ",
+"defaults-rename-skill-research-description": "Renamed via the attribute rename_research .",
+"defaults-rename-skill-riding": "[Rename] Skill: Riding to ",
+"defaults-rename-skill-riding-description": "Renamed via the attribute rename_riding .",
+"defaults-rename-skill-science": "[Rename] Skill: Science to ",
+"defaults-rename-skill-science-description": "Renamed via the attribute rename_science .",
+"defaults-rename-skill-shooting": "[Rename] Skill: Shooting to ",
+"defaults-rename-skill-shooting-description": "Renamed via the attribute rename_shooting .",
+"defaults-rename-skill-spellcasting": "[Rename] Skill: Spellcasting to ",
+"defaults-rename-skill-spellcasting-description": "Renamed via the attribute rename_spellcasting .",
+"defaults-rename-skill-stealth": "[Rename] Skill: Stealth to ",
+"defaults-rename-skill-stealth-description": "Renamed via the attribute rename_stealth .",
+"defaults-rename-skill-survival": "[Rename] Skill: Survival to ",
+"defaults-rename-skill-survival-description": "Renamed via the attribute rename_survival .",
+"defaults-rename-skill-taunt": "[Rename] Skill: Taunt to ",
+"defaults-rename-skill-taunt-description": "Renamed via the attribute rename_taunt .",
+"defaults-rename-skill-thievery": "[Rename] Skill: Thievery to ",
+"defaults-rename-skill-thievery-description": "Renamed via the attribute rename_thievery .",
+"defaults-rename-skill-weird-science": "[Rename] Skill: Weird Science to ",
+"defaults-rename-skill-weird-science-description": "Renamed via the attribute rename_weird_science .",
+"defaults-rule-augmentation-strain": "[Rule] Augmentation Strain",
+"defaults-rule-augmentation-strain-description": "Use the Strain rules from the Science Fiction Companion (SFC 29).",
+"defaults-rule-no-power-points": "[Rule] No Power Points",
+"defaults-rule-no-power-points-description": "Use the No Power Points Setting Rule (SWADE 140).",
+"defaults-skill-show-boating": "[Skill] Show Boating Skill",
+"defaults-skill-show-boating-description": "Show the Boating (Agility) skill.",
+"defaults-skill-show-custom-skill-1": "[Skill] Show Custom Skill #1",
+"defaults-skill-show-custom-skill-1-description": "Show the Custom Skill #1, which can be renamed further down.",
+"defaults-skill-show-custom-skill-2": "[Skill] Show Custom Skill #2",
+"defaults-skill-show-custom-skill-2-description": "Show the Custom Skill #2, which can be renamed further down.Rename Attributes You can rename the labels of each attribute and its abbreviation (max. 3 characters). This can also be done manually with the @{rename_attribute} for each individual sheet. Note that changing the label does not affect the reference @{attribute} for rolls. They will always be in English.
",
+"defaults-skill-show-driving": "[Skill] Show Driving Skill",
+"defaults-skill-show-driving-description": "Show the Driving (Agility) skill.",
+"defaults-skill-show-electronics": "[Skill] Show Electronics Skill",
+"defaults-skill-show-electronics-description": "Show the Electronics (Smarts) skill.",
+"defaults-skill-show-faith": "[Skill] Show Faith Skill",
+"defaults-skill-show-faith-description": "Show the Faith (Spirit) skill.",
+"defaults-skill-show-focus": "[Skill] Show Focus Skill",
+"defaults-skill-show-focus-description": "Show the Focus (Spirit) skill.",
+"defaults-skill-show-language": "[Skill] Show Language Skill",
+"defaults-skill-show-language-description": "Show the Language (Smarts) skill.",
+"defaults-skill-show-magic": "[Skill] Show MAGIC Skill",
+"defaults-skill-show-magic-description": "Show the MAGIC (Smarts) skill. Maschinenleben.",
+"defaults-skill-show-occult": "[Skill] Show Occult Skill",
+"defaults-skill-show-occult-description": "Show the Occult (Smarts) skill.",
+"defaults-skill-show-piloting": "[Skill] Show Piloting Skill",
+"defaults-skill-show-piloting-description": "Show the Piloting (Agility) skill.",
+"defaults-skill-show-psionics": "[Skill] Show Psionics Skill",
+"defaults-skill-show-psionics-description": "Show the Psionics (Smarts) skill.",
+"defaults-skill-show-riding": "[Skill] Show Riding Skill",
+"defaults-skill-show-riding-description": "Show the Riding (Agility) skill.",
+"defaults-skill-show-spellcasting": "[Skill] Show Spellcasting Skill",
+"defaults-skill-show-spellcasting-description": "Show the Spellcasting (Smarts) skill.",
+"defaults-skill-show-weird-science": "[Skill] Show Weird Science Skill",
+"defaults-skill-show-weird-science-description": "Show the Weird Science (Smarts) skill."
+```
+
+
+### Legal
+The silhouette images were made from purchased assets and are only licensed for this sheet. Do not take them for any other purposes! This does not go for the human silhouettes which were made with the [HeroMachine 3](http://www.heromachine.com/heromachine-3-lab/) and are therefore free.
diff --git a/Savage Worlds - Graph Paper/sheet.json b/Savage Worlds - Graph Paper/sheet.json
new file mode 100644
index 0000000000..30e318c673
--- /dev/null
+++ b/Savage Worlds - Graph Paper/sheet.json
@@ -0,0 +1,924 @@
+{
+ "html": "SavageWorldsGraphPaper.html",
+ "css": "SavageWorldsGraphPaper.css",
+ "authors": " Tetrakern",
+ "roll20userid": "1940185",
+ "preview": "SavageWorldsGraphPaper.jpg",
+ "instructions": "**Version:** 1.2.5\r\rThis character sheet was originally made for **Maschinenleben** (released later this year), a fan product for the **Savage Worlds Adventure Edition** (SWADE) about cyborgs struggling with their loss of self. Due to its extensive build and customization options, it may be used for many other settings as well.\r\r**Make sure to read the Help section in the Settings tab!**\r\r#### Notable Features\r\r* **Blocks:** Allies, Augmentations, Integrity/Sanity, Powers, Vehicles, and more\r* **Fields On Demand:** Show only what you really need to keep the view tidy\r* **Customization:** Optional rules and functions, custom skills, and renaming\r* **Rolls:** Multiple dice for multiple targets (RoF 1-8) with a custom Wild Die\r* **Failures/Botches:** Dice that show a [1] or [2] are colored red or gray\r* **Health/Conditions:** Manage Wounds, Fatigue, and more with a simple click\r* **Silhouettes:** They look fancy! You can also add color markers as indicators\r* **Extra Sheet:** Alternative sheet with a simplified layout for NPCs\r\r#### Notes\r\r* Boost performance by disabling style features\r* Requires a mouse to fully operate (hover); poor touch support\r* Some attributes have to be translated (renamed) manually\r* Join the [support game](https://app.roll20.net/join/8488284/oQJGfg) for bug reports and requests\r\r---\r\rYou can support development of this sheet by contributing to the [Ko-fi](https://ko-fi.com/tetrakern) of the author. This [Ko-fi](https://ko-fi.com/tetrakern) is not affiliated with Roll20; as such, contributions are voluntary and Roll20 cannot provide support or refunds for contributions.\r\r---\r\r#### Latest Changes\r\r##### Version 1.2.5\r\r* Refactored all skill rolls\r* Extended [Button] option in lists with a modifier field\r* Added [Ace Damage] toggle to Engrams, Powers, and Weapons\r* Added helper button to toggle global GM rolls\r* Added Abilities block\r\r##### Version 1.2.4\r\r* Added three configurable custom buttons to Settings > Setup\r\r##### Version 1.2.3\r\r* Added helper button to toggle global Wild Die query\r* Added helper button to toggle global Rate of Fire query\r* Added helper button to toggle global Bonus Wild Die query\r\r##### Version 1.2.2\r\r* Added damage (re-)roll buttons to Roll Templates\r* Roll Templates now have hooks for descriptions and three custom fields\r* Added injection hook to list rolls to allow custom code\r* Added setting toggles for list roll descriptions and injections\r* Added [Multiplier] option to Augmentations\r* Added [Wild Die Override] option to Engrams, Powers, and Weapons\r* Added [Roll Description] option to Engrams, Powers, and Weapons\r* Added [Roll Injection] option to Engrams, Powers, and Weapons\r* Added help entries for extra sheet, list item options, and raise damage\r* Updated older help entries and translations\r\r---",
+ "useroptions": [
+ {
+ "attribute": "toggle_pp",
+ "displayname": "[Rule] No Power Points",
+ "displaytranslationkey": "defaults-rule-no-power-points",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Use the No Power Points Setting Rule (SWADE 140).",
+ "descriptiontranslationkey": "defaults-rule-no-power-points-description"
+ },
+ {
+ "attribute": "toggle_strain",
+ "displayname": "[Rule] Augmentation Strain",
+ "displaytranslationkey": "defaults-rule-augmentation-strain",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Use the Strain rules from the Science Fiction Companion (SFC 29).",
+ "descriptiontranslationkey": "defaults-rule-augmentation-strain-description"
+ },
+ {
+ "attribute": "toggle_run_explode",
+ "displayname": "[Function] Explode Run Die",
+ "displaytranslationkey": "defaults-function-explode-run-die",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Makes the run die Ace.",
+ "descriptiontranslationkey": "defaults-function-explode-run-die-description"
+ },
+ {
+ "attribute": "toggle_run_wounds",
+ "displayname": "[Function] Running Ignores Wounds",
+ "displaytranslationkey": "defaults-function-running-ignores-wounds",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Wound penalties are not subtracted from the run roll.",
+ "descriptiontranslationkey": "defaults-function-running-ignores-wounds-description"
+ },
+ {
+ "attribute": "toggle_run_fatigue",
+ "displayname": "[Function] Running Applies Fatigue",
+ "displaytranslationkey": "defaults-function-running-applies-fatigue",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Fatigue penalties are subtracted from the run roll.Show/Hide Blocks You can show or hide content blocks in accordance with the played Game Setting. This can also be done manually for each individual sheet in its Settings tab. Some blocks that were designed for Maschinenleben, such as Augmentations and Engrams, can be adapted for other purposes as well.
",
+ "descriptiontranslationkey": "defaults-function-running-applies-fatigue-description"
+ },
+ {
+ "attribute": "toggle_abilities_block",
+ "displayname": "[Block] Show Abilities",
+ "displaytranslationkey": "defaults-block-show-abilities",
+ "type": "checkbox",
+ "value": "on",
+ "description": "List special abilities or monstrous powers.",
+ "descriptiontranslationkey": "defaults-block-show-abilities-description"
+ },
+ {
+ "attribute": "toggle_allies_block",
+ "displayname": "[Block] Show Allies",
+ "displaytranslationkey": "defaults-block-show-allies",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Keep track of allied characters with a barebone mini sheet.",
+ "descriptiontranslationkey": "defaults-block-show-allies-description"
+ },
+ {
+ "attribute": "toggle_ammunition_block",
+ "displayname": "[Block] Show Ammunition",
+ "displaytranslationkey": "defaults-block-show-ammunition",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "Keep track of your loaded ammunition for three weapons.",
+ "descriptiontranslationkey": "defaults-block-show-ammunition-description"
+ },
+ {
+ "attribute": "toggle_augmentations_block",
+ "displayname": "[Block] Show Augmentations",
+ "displaytranslationkey": "defaults-block-show-augmentations",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "Install augmentations/cyberware and keep track of the Loss/Strain.",
+ "descriptiontranslationkey": "defaults-block-show-augmentations-description"
+ },
+ {
+ "attribute": "toggle_engrams_block",
+ "displayname": "[Block] Show Engrams",
+ "displaytranslationkey": "defaults-block-show-engrams",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "Special programs or hardware to execute Hacking actions.",
+ "descriptiontranslationkey": "defaults-block-show-engrams-description"
+ },
+ {
+ "attribute": "toggle_integrity_block",
+ "displayname": "[Block] Show Integrity",
+ "displaytranslationkey": "defaults-block-show-integrity",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "Quantifies mental health/sanity and keeps track of mental afflictions. Maschinenleben.",
+ "descriptiontranslationkey": "defaults-block-show-integrity-description"
+ },
+ {
+ "attribute": "toggle_power_block",
+ "displayname": "[Block] Show Power/Energy",
+ "displaytranslationkey": "defaults-block-show-power",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "The energy/mana/etc. reserves of a character.",
+ "descriptiontranslationkey": "defaults-block-show-power-description"
+ },
+ {
+ "attribute": "toggle_powers_block",
+ "displayname": "[Block] Show Powers/Spells",
+ "displaytranslationkey": "defaults-block-show-powers",
+ "type": "checkbox",
+ "value": "on",
+ "description": "The known powers/spells of a character.",
+ "descriptiontranslationkey": "defaults-block-show-powers-description"
+ },
+ {
+ "attribute": "toggle_powerarmors_block",
+ "displayname": "[Block] Show Power Armors",
+ "displaytranslationkey": "defaults-block-show-powerarmors",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Vehicles and their modifications/weapons.",
+ "descriptiontranslationkey": "defaults-block-show-powerarmors-description"
+ },
+ {
+ "attribute": "toggle_vehicles_block",
+ "displayname": "[Block] Show Vehicles",
+ "displaytranslationkey": "defaults-block-show-vehicles",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Vehicles and their modifications/weapons.",
+ "descriptiontranslationkey": "defaults-block-show-vehicles-description"
+ },
+ {
+ "attribute": "toggle_walkers_block",
+ "displayname": "[Block] Show Walkers",
+ "displaytranslationkey": "defaults-block-show-walkers",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Walkers/Mechs and their modifications/weapons.Show/Hide Skills You can show or hide skills from the list in accordance with the played Game Setting. This can also be done manually for each individual sheet in its Settings tab. There are two custom skills that can be renamed and modified within the sheet as well, for example to make specialized skills (e.g. specific weapons with custom bonus or Wild Die).
",
+ "descriptiontranslationkey": "defaults-block-show-walkers-description"
+ },
+ {
+ "attribute": "toggle_skill_boating",
+ "displayname": "[Skill] Show Boating Skill",
+ "displaytranslationkey": "defaults-skill-show-boating",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "Show the Boating (Agility) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-boating-description"
+ },
+ {
+ "attribute": "toggle_skill_driving",
+ "displayname": "[Skill] Show Driving Skill",
+ "displaytranslationkey": "defaults-skill-show-driving",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "Show the Driving (Agility) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-driving-description"
+ },
+ {
+ "attribute": "toggle_skill_electronics",
+ "displayname": "[Skill] Show Electronics Skill",
+ "displaytranslationkey": "defaults-skill-show-electronics",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "Show the Electronics (Smarts) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-electronics-description"
+ },
+ {
+ "attribute": "toggle_skill_faith",
+ "displayname": "[Skill] Show Faith Skill",
+ "displaytranslationkey": "defaults-skill-show-faith",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Show the Faith (Spirit) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-faith-description"
+ },
+ {
+ "attribute": "toggle_skill_focus",
+ "displayname": "[Skill] Show Focus Skill",
+ "displaytranslationkey": "defaults-skill-show-focus",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Show the Focus (Spirit) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-focus-description"
+ },
+ {
+ "attribute": "toggle_skill_language",
+ "displayname": "[Skill] Show Language Skill",
+ "displaytranslationkey": "defaults-skill-show-language",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Show the Language (Smarts) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-language-description"
+ },
+ {
+ "attribute": "toggle_skill_magic",
+ "displayname": "[Skill] Show MAGIC Skill",
+ "displaytranslationkey": "defaults-skill-show-magic",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "Show the MAGIC (Smarts) skill. Maschinenleben.",
+ "descriptiontranslationkey": "defaults-skill-show-magic-description"
+ },
+ {
+ "attribute": "toggle_skill_occult",
+ "displayname": "[Skill] Show Occult Skill",
+ "displaytranslationkey": "defaults-skill-show-occult",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Show the Occult (Smarts) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-occult-description"
+ },
+ {
+ "attribute": "toggle_skill_piloting",
+ "displayname": "[Skill] Show Piloting Skill",
+ "displaytranslationkey": "defaults-skill-show-piloting",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "Show the Piloting (Agility) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-piloting-description"
+ },
+ {
+ "attribute": "toggle_skill_psionics",
+ "displayname": "[Skill] Show Psionics Skill",
+ "displaytranslationkey": "defaults-skill-show-psionics",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Show the Psionics (Smarts) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-psionics-description"
+ },
+ {
+ "attribute": "toggle_skill_riding",
+ "displayname": "[Skill] Show Riding Skill",
+ "displaytranslationkey": "defaults-skill-show-riding",
+ "type": "checkbox",
+ "value": "on",
+ "checked": "checked",
+ "description": "Show the Riding (Agility) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-riding-description"
+ },
+ {
+ "attribute": "toggle_skill_spellcasting",
+ "displayname": "[Skill] Show Spellcasting Skill",
+ "displaytranslationkey": "defaults-skill-show-spellcasting",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Show the Spellcasting (Smarts) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-spellcasting-description"
+ },
+ {
+ "attribute": "toggle_skill_weird_science",
+ "displayname": "[Skill] Show Weird Science Skill",
+ "displaytranslationkey": "defaults-skill-show-weird-science",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Show the Weird Science (Smarts) skill.",
+ "descriptiontranslationkey": "defaults-skill-show-weird-science-description"
+ },
+ {
+ "attribute": "toggle_skill_custom_skill_1",
+ "displayname": "[Skill] Show Custom Skill #1",
+ "displaytranslationkey": "defaults-skill-show-custom-skill-1",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Show the Custom Skill #1, which can be renamed further down.",
+ "descriptiontranslationkey": "defaults-skill-show-custom-skill-1-description"
+ },
+ {
+ "attribute": "toggle_skill_custom_skill_2",
+ "displayname": "[Skill] Show Custom Skill #2",
+ "displaytranslationkey": "defaults-skill-show-custom-skill-2",
+ "type": "checkbox",
+ "value": "on",
+ "description": "Show the Custom Skill #2, which can be renamed further down.Rename Attributes You can rename the labels of each attribute and its abbreviation (max. 3 characters). This can also be done manually with the @{rename-attribute} for each individual sheet. Note that changing the label does not affect the reference @{attribute} for rolls. They will always be in English.
",
+ "descriptiontranslationkey": "defaults-skill-show-custom-skill-2-description"
+ },
+ {
+ "attribute": "rename_agility",
+ "displayname": "[Rename] Attribute: Agility to ",
+ "displaytranslationkey": "defaults-rename-attribute-agility",
+ "type": "text",
+ "description": "Renamed via the attribute rename_agility .",
+ "descriptiontranslationkey": "defaults-rename-attribute-agility-description"
+ },
+ {
+ "attribute": "rename_agi",
+ "displayname": "[Rename] Attribute: AGI to ",
+ "displaytranslationkey": "defaults-rename-attribute-agi",
+ "type": "text",
+ "description": "Renamed via the attribute rename_agi .",
+ "descriptiontranslationkey": "defaults-rename-attribute-agi-description"
+ },
+ {
+ "attribute": "rename_smarts",
+ "displayname": "[Rename] Attribute: Smarts to ",
+ "displaytranslationkey": "defaults-rename-attribute-smarts",
+ "type": "text",
+ "description": "Renamed via the attribute rename_smarts .",
+ "descriptiontranslationkey": "defaults-rename-attribute-smarts-description"
+ },
+ {
+ "attribute": "rename_sma",
+ "displayname": "[Rename] Attribute: SMA to ",
+ "displaytranslationkey": "defaults-rename-attribute-sma",
+ "type": "text",
+ "description": "Renamed via the attribute rename_sma .",
+ "descriptiontranslationkey": "defaults-rename-attribute-sma-description"
+ },
+ {
+ "attribute": "rename_spirit",
+ "displayname": "[Rename] Attribute: Spirit to ",
+ "displaytranslationkey": "defaults-rename-attribute-spirit",
+ "type": "text",
+ "description": "Renamed via the attribute rename_spirit .",
+ "descriptiontranslationkey": "defaults-rename-attribute-spirit-description"
+ },
+ {
+ "attribute": "rename_spi",
+ "displayname": "[Rename] Attribute: SPI to ",
+ "displaytranslationkey": "defaults-rename-attribute-spi",
+ "type": "text",
+ "description": "Renamed via the attribute rename_spi .",
+ "descriptiontranslationkey": "defaults-rename-attribute-spi-description"
+ },
+ {
+ "attribute": "rename_strength",
+ "displayname": "[Rename] Attribute: Strength to ",
+ "displaytranslationkey": "defaults-rename-attribute-strength",
+ "type": "text",
+ "description": "Renamed via the attribute rename_strength .",
+ "descriptiontranslationkey": "defaults-rename-attribute-strength-description"
+ },
+ {
+ "attribute": "rename_str",
+ "displayname": "[Rename] Attribute: STR to ",
+ "displaytranslationkey": "defaults-rename-attribute-str",
+ "type": "text",
+ "description": "Renamed via the attribute rename_str .",
+ "descriptiontranslationkey": "defaults-rename-attribute-str-description"
+ },
+ {
+ "attribute": "rename_vigor",
+ "displayname": "[Rename] Attribute: Vigor to ",
+ "displaytranslationkey": "defaults-rename-attribute-vigor",
+ "type": "text",
+ "description": "Renamed via the attribute rename_vigor .",
+ "descriptiontranslationkey": "defaults-rename-attribute-vigor-description"
+ },
+ {
+ "attribute": "rename_vig",
+ "displayname": "[Rename] Attribute: VIG to ",
+ "displaytranslationkey": "defaults-rename-attribute-vig",
+ "type": "text",
+ "description": "Renamed via the attribute rename_vig .Rename Skills You can rename the labels of each skill, best kept below 15 characters due to layout constrains. This can also be done manually with the @{rename-attribute} for each individual sheet. Note that changing the label does not affect the reference @{attribute} for rolls. They will always be in English.
",
+ "descriptiontranslationkey": "defaults-rename-attribute-vig-description"
+ },
+ {
+ "attribute": "rename_academics",
+ "displayname": "[Rename] Skill: Academics to ",
+ "displaytranslationkey": "defaults-rename-skill-academics",
+ "type": "text",
+ "description": "Renamed via the attribute rename_academics .",
+ "descriptiontranslationkey": "defaults-rename-skill-academics-description"
+ },
+ {
+ "attribute": "rename_athletics",
+ "displayname": "[Rename] Skill: Athletics to ",
+ "displaytranslationkey": "defaults-rename-skill-athletics",
+ "type": "text",
+ "description": "Renamed via the attribute rename_athletics .",
+ "descriptiontranslationkey": "defaults-rename-skill-athletics-description"
+ },
+ {
+ "attribute": "rename_boating",
+ "displayname": "[Rename] Skill: Boating to ",
+ "displaytranslationkey": "defaults-rename-skill-boating",
+ "type": "text",
+ "description": "Renamed via the attribute rename_boating .",
+ "descriptiontranslationkey": "defaults-rename-skill-boating-description"
+ },
+ {
+ "attribute": "rename_common_knowledge",
+ "displayname": "[Rename] Skill: Common Knowl. to ",
+ "displaytranslationkey": "defaults-rename-skill-common-knowledge",
+ "type": "text",
+ "description": "Renamed via the attribute rename_common_knowledge .",
+ "descriptiontranslationkey": "defaults-rename-skill-common-knowledge-description"
+ },
+ {
+ "attribute": "rename_driving",
+ "displayname": "[Rename] Skill: Driving to ",
+ "displaytranslationkey": "defaults-rename-skill-driving",
+ "type": "text",
+ "description": "Renamed via the attribute rename_driving .",
+ "descriptiontranslationkey": "defaults-rename-skill-driving-description"
+ },
+ {
+ "attribute": "rename_electronics",
+ "displayname": "[Rename] Skill: Electronics to ",
+ "displaytranslationkey": "defaults-rename-skill-electronics",
+ "type": "text",
+ "description": "Renamed via the attribute rename_electronics .",
+ "descriptiontranslationkey": "defaults-rename-skill-electronics-description"
+ },
+ {
+ "attribute": "rename_faith",
+ "displayname": "[Rename] Skill: Faith to ",
+ "displaytranslationkey": "defaults-rename-skill-faith",
+ "type": "text",
+ "description": "Renamed via the attribute rename_faith .",
+ "descriptiontranslationkey": "defaults-rename-skill-faith-description"
+ },
+ {
+ "attribute": "rename_fighting",
+ "displayname": "[Rename] Skill: Fighting to ",
+ "displaytranslationkey": "defaults-rename-skill-fighting",
+ "type": "text",
+ "description": "Renamed via the attribute rename_fighting .",
+ "descriptiontranslationkey": "defaults-rename-skill-fighting-description"
+ },
+ {
+ "attribute": "rename_focus",
+ "displayname": "[Rename] Skill: Focus to ",
+ "displaytranslationkey": "defaults-rename-skill-focus",
+ "type": "text",
+ "description": "Renamed via the attribute rename_focus .",
+ "descriptiontranslationkey": "defaults-rename-skill-focus-description"
+ },
+ {
+ "attribute": "rename_gambling",
+ "displayname": "[Rename] Skill: Gambling to ",
+ "displaytranslationkey": "defaults-rename-skill-gambling",
+ "type": "text",
+ "description": "Renamed via the attribute rename_gambling .",
+ "descriptiontranslationkey": "defaults-rename-skill-gambling-description"
+ },
+ {
+ "attribute": "rename_hacking",
+ "displayname": "[Rename] Skill: Hacking to ",
+ "displaytranslationkey": "defaults-rename-skill-hacking",
+ "type": "text",
+ "description": "Renamed via the attribute rename_hacking .",
+ "descriptiontranslationkey": "defaults-rename-skill-hacking-description"
+ },
+ {
+ "attribute": "rename_healing",
+ "displayname": "[Rename] Skill: Healing to ",
+ "displaytranslationkey": "defaults-rename-skill-healing",
+ "type": "text",
+ "description": "Renamed via the attribute rename_healing .",
+ "descriptiontranslationkey": "defaults-rename-skill-healing-description"
+ },
+ {
+ "attribute": "rename_intimidation",
+ "displayname": "[Rename] Skill: Intimidation to ",
+ "displaytranslationkey": "defaults-rename-skill-intimidation",
+ "type": "text",
+ "description": "Renamed via the attribute rename_intimidation .",
+ "descriptiontranslationkey": "defaults-rename-skill-intimidation-description"
+ },
+ {
+ "attribute": "rename_language",
+ "displayname": "[Rename] Skill: Language to ",
+ "displaytranslationkey": "defaults-rename-skill-language",
+ "type": "text",
+ "description": "Renamed via the attribute rename_language .",
+ "descriptiontranslationkey": "defaults-rename-skill-language-description"
+ },
+ {
+ "attribute": "rename_magic",
+ "displayname": "[Rename] Skill: MAGIC to ",
+ "displaytranslationkey": "defaults-rename-skill-magic",
+ "type": "text",
+ "description": "Renamed via the attribute rename_magic .",
+ "descriptiontranslationkey": "defaults-rename-skill-magic-description"
+ },
+ {
+ "attribute": "rename_notice",
+ "displayname": "[Rename] Skill: Notice to ",
+ "displaytranslationkey": "defaults-rename-skill-notice",
+ "type": "text",
+ "description": "Renamed via the attribute rename_notice .",
+ "descriptiontranslationkey": "defaults-rename-skill-notice-description"
+ },
+ {
+ "attribute": "rename_occult",
+ "displayname": "[Rename] Skill: Occult to ",
+ "displaytranslationkey": "defaults-rename-skill-occult",
+ "type": "text",
+ "description": "Renamed via the attribute rename_occult .",
+ "descriptiontranslationkey": "defaults-rename-skill-occult-description"
+ },
+ {
+ "attribute": "rename_performance",
+ "displayname": "[Rename] Skill: Performance to ",
+ "displaytranslationkey": "defaults-rename-skill-performance",
+ "type": "text",
+ "description": "Renamed via the attribute rename_performance .",
+ "descriptiontranslationkey": "defaults-rename-skill-performance-description"
+ },
+ {
+ "attribute": "rename_persuasion",
+ "displayname": "[Rename] Skill: Persuasion to ",
+ "displaytranslationkey": "defaults-rename-skill-persuasion",
+ "type": "text",
+ "description": "Renamed via the attribute rename_persuasion .",
+ "descriptiontranslationkey": "defaults-rename-skill-persuasion-description"
+ },
+ {
+ "attribute": "rename_piloting",
+ "displayname": "[Rename] Skill: Piloting to ",
+ "displaytranslationkey": "defaults-rename-skill-piloting",
+ "type": "text",
+ "description": "Renamed via the attribute rename_piloting .",
+ "descriptiontranslationkey": "defaults-rename-skill-piloting-description"
+ },
+ {
+ "attribute": "rename_psionics",
+ "displayname": "[Rename] Skill: Psionics to ",
+ "displaytranslationkey": "defaults-rename-skill-psionics",
+ "type": "text",
+ "description": "Renamed via the attribute rename_psionics .",
+ "descriptiontranslationkey": "defaults-rename-skill-psionics-description"
+ },
+ {
+ "attribute": "rename_repair",
+ "displayname": "[Rename] Skill: Repair to ",
+ "displaytranslationkey": "defaults-rename-skill-repair",
+ "type": "text",
+ "description": "Renamed via the attribute rename_repair .",
+ "descriptiontranslationkey": "defaults-rename-skill-repair-description"
+ },
+ {
+ "attribute": "rename_research",
+ "displayname": "[Rename] Skill: Research to ",
+ "displaytranslationkey": "defaults-rename-skill-research",
+ "type": "text",
+ "description": "Renamed via the attribute rename_research .",
+ "descriptiontranslationkey": "defaults-rename-skill-research-description"
+ },
+ {
+ "attribute": "rename_riding",
+ "displayname": "[Rename] Skill: Riding to ",
+ "displaytranslationkey": "defaults-rename-skill-riding",
+ "type": "text",
+ "description": "Renamed via the attribute rename_riding .",
+ "descriptiontranslationkey": "defaults-rename-skill-riding-description"
+ },
+ {
+ "attribute": "rename_science",
+ "displayname": "[Rename] Skill: Science to ",
+ "displaytranslationkey": "defaults-rename-skill-science",
+ "type": "text",
+ "description": "Renamed via the attribute rename_science .",
+ "descriptiontranslationkey": "defaults-rename-skill-science-description"
+ },
+ {
+ "attribute": "rename_shooting",
+ "displayname": "[Rename] Skill: Shooting to ",
+ "displaytranslationkey": "defaults-rename-skill-shooting",
+ "type": "text",
+ "description": "Renamed via the attribute rename_shooting .",
+ "descriptiontranslationkey": "defaults-rename-skill-shooting-description"
+ },
+ {
+ "attribute": "rename_spellcasting",
+ "displayname": "[Rename] Skill: Spellcasting to ",
+ "displaytranslationkey": "defaults-rename-skill-spellcasting",
+ "type": "text",
+ "description": "Renamed via the attribute rename_spellcasting .",
+ "descriptiontranslationkey": "defaults-rename-skill-spellcasting-description"
+ },
+ {
+ "attribute": "rename_stealth",
+ "displayname": "[Rename] Skill: Stealth to ",
+ "displaytranslationkey": "defaults-rename-skill-stealth",
+ "type": "text",
+ "description": "Renamed via the attribute rename_stealth .",
+ "descriptiontranslationkey": "defaults-rename-skill-stealth-description"
+ },
+ {
+ "attribute": "rename_survival",
+ "displayname": "[Rename] Skill: Survival to ",
+ "displaytranslationkey": "defaults-rename-skill-survival",
+ "type": "text",
+ "description": "Renamed via the attribute rename_survival .",
+ "descriptiontranslationkey": "defaults-rename-skill-survival-description"
+ },
+ {
+ "attribute": "rename_taunt",
+ "displayname": "[Rename] Skill: Taunt to ",
+ "displaytranslationkey": "defaults-rename-skill-taunt",
+ "type": "text",
+ "description": "Renamed via the attribute rename_taunt .",
+ "descriptiontranslationkey": "defaults-rename-skill-taunt-description"
+ },
+ {
+ "attribute": "rename_thievery",
+ "displayname": "[Rename] Skill: Thievery to ",
+ "displaytranslationkey": "defaults-rename-skill-thievery",
+ "type": "text",
+ "description": "Renamed via the attribute rename_thievery .",
+ "descriptiontranslationkey": "defaults-rename-skill-thievery-description"
+ },
+ {
+ "attribute": "rename_weird_science",
+ "displayname": "[Rename] Skill: Weird Science to ",
+ "displaytranslationkey": "defaults-rename-skill-weird-science",
+ "type": "text",
+ "description": "Renamed via the attribute rename_weird_science .",
+ "descriptiontranslationkey": "defaults-rename-skill-weird-science-description"
+ },
+ {
+ "attribute": "rename_custom_skill_1",
+ "displayname": "[Rename] Skill: Custom Skill #1 to ",
+ "displaytranslationkey": "defaults-rename-skill-custom-skill-1",
+ "type": "text",
+ "description": "Can be renamed directly in the sheet's Settings tab.",
+ "descriptiontranslationkey": "defaults-rename-skill-custom-skill-1-description"
+ },
+ {
+ "attribute": "rename_custom_skill_2",
+ "displayname": "[Rename] Skill: Custom Skill #2 to ",
+ "displaytranslationkey": "defaults-rename-skill-custom-skill-2",
+ "type": "text",
+ "description": "Can be renamed directly in the sheet's Settings tab.Rename Labels You can rename the labels at the top of the sheet, such as \"Name\" to \"Alias\" or \"Origin\" to \"Race\". This can also be done manually with the @{rename-label-attribute} for each individual sheet. Note that the labels are separated from the actual fields and do not affect the references (e.g. @{name} ). They will always be in English.
",
+ "descriptiontranslationkey": "defaults-rename-skill-custom-skill-2-description"
+ },
+ {
+ "attribute": "rename_label_name",
+ "displayname": "[Rename] Label: Name to ",
+ "displaytranslationkey": "defaults-rename-label-name",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_name (e.g. Alias or Codename).",
+ "descriptiontranslationkey": "defaults-rename-label-name-description"
+ },
+ {
+ "attribute": "rename_label_origin",
+ "displayname": "[Rename] Label: Origin to ",
+ "displaytranslationkey": "defaults-rename-label-origin",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_origin (e.g. Race or Species).",
+ "descriptiontranslationkey": "defaults-rename-label-origin-description"
+ },
+ {
+ "attribute": "rename_label_rank",
+ "displayname": "[Rename] Label: Rank to ",
+ "displaytranslationkey": "defaults-rename-label-rank",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_rank (e.g. Grade or Titel).",
+ "descriptiontranslationkey": "defaults-rename-label-rank-description"
+ },
+ {
+ "attribute": "rename_label_level",
+ "displayname": "[Rename] Label: Level to ",
+ "displaytranslationkey": "defaults-rename-label-level",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_level (e.g. Circle or Year).",
+ "descriptiontranslationkey": "defaults-rename-label-level-description"
+ },
+ {
+ "attribute": "rename_label_exp",
+ "displayname": "[Rename] Label: EXP to ",
+ "displaytranslationkey": "defaults-rename-label-exp",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_exp (e.g. Karma or Gems).",
+ "descriptiontranslationkey": "defaults-rename-label-exp-description"
+ },
+ {
+ "attribute": "rename_label_gender",
+ "displayname": "[Rename] Label: Gender to ",
+ "displaytranslationkey": "defaults-rename-label-gender",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_gender (e.g. Sex or Version).",
+ "descriptiontranslationkey": "defaults-rename-label-gender-description"
+ },
+ {
+ "attribute": "rename_label_age",
+ "displayname": "[Rename] Label: Age to ",
+ "displaytranslationkey": "defaults-rename-label-age",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_age (e.g. Number or Incarnation).",
+ "descriptiontranslationkey": "defaults-rename-label-age-description"
+ },
+ {
+ "attribute": "rename_label_hair",
+ "displayname": "[Rename] Label: Hair to ",
+ "displaytranslationkey": "defaults-rename-label-hair",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_hair (e.g. Horns or Mane).",
+ "descriptiontranslationkey": "defaults-rename-label-hair-description"
+ },
+ {
+ "attribute": "rename_label_eyes",
+ "displayname": "[Rename] Label: Eyes to ",
+ "displaytranslationkey": "defaults-rename-label-eyes",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_eyes (e.g. Sensors or Optics).",
+ "descriptiontranslationkey": "defaults-rename-label-eyes-description"
+ },
+ {
+ "attribute": "rename_label_height",
+ "displayname": "[Rename] Label: Height to ",
+ "displaytranslationkey": "defaults-rename-label-height",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_height (e.g. Scale or Length).",
+ "descriptiontranslationkey": "defaults-rename-label-height-description"
+ },
+ {
+ "attribute": "rename_label_weight",
+ "displayname": "[Rename] Label: Weight to ",
+ "displaytranslationkey": "defaults-rename-label-weight",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_weight (e.g. Mass or Your Mom).",
+ "descriptiontranslationkey": "defaults-rename-label-weight-description"
+ },
+ {
+ "attribute": "rename_label_bits",
+ "displayname": "[Rename] Label: #Bits to ",
+ "displaytranslationkey": "defaults-rename-label-bits",
+ "type": "text",
+ "description": "Renamed via the attribute rename_label_bits (e.g. Money or Gold).Rename Blocks You can rename the blocks to better fit the Game Setting, such as \"Powers\" to \"Talismans\" or \"Walkers\" to \"Frames\". This can also be done manually with the @{rename-block-attribute} for each individual sheet.
",
+ "descriptiontranslationkey": "defaults-rename-label-bits-description"
+ },
+ {
+ "attribute": "rename_block_allies",
+ "displayname": "[Rename] Block: Allies to ",
+ "displaytranslationkey": "defaults-rename-block-allies",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_allies .",
+ "descriptiontranslationkey": "defaults-rename-block-allies-description"
+ },
+ {
+ "attribute": "rename_block_apparel",
+ "displayname": "[Rename] Block: Apparel to ",
+ "displaytranslationkey": "defaults-rename-block-apparel",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_apparel .",
+ "descriptiontranslationkey": "defaults-rename-block-apparel-description"
+ },
+ {
+ "attribute": "rename_block_ammunition",
+ "displayname": "[Rename] Block: Ammunition to ",
+ "displaytranslationkey": "defaults-rename-block-ammunition",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_ammunition .",
+ "descriptiontranslationkey": "defaults-rename-block-ammunition-description"
+ },
+ {
+ "attribute": "rename_block_augmentations",
+ "displayname": "[Rename] Block: Augmentations to ",
+ "displaytranslationkey": "defaults-rename-block-augmentations",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_augmentations .",
+ "descriptiontranslationkey": "defaults-rename-block-augmentations-description"
+ },
+ {
+ "attribute": "rename_block_engrams",
+ "displayname": "[Rename] Block: Engrams to ",
+ "displaytranslationkey": "defaults-rename-block-engrams",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_engrams .",
+ "descriptiontranslationkey": "defaults-rename-block-engrams-description"
+ },
+ {
+ "attribute": "rename_block_integrity",
+ "displayname": "[Rename] Block: Integrity to ",
+ "displaytranslationkey": "defaults-rename-block-integrity",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_integrity .",
+ "descriptiontranslationkey": "defaults-rename-block-integrity-description"
+ },
+ {
+ "attribute": "rename_block_inventory",
+ "displayname": "[Rename] Block: Inventory to ",
+ "displaytranslationkey": "defaults-rename-block-inventory",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_inventory .",
+ "descriptiontranslationkey": "defaults-rename-block-inventory-description"
+ },
+ {
+ "attribute": "rename_block_power",
+ "displayname": "[Rename] Block: Power to ",
+ "displaytranslationkey": "defaults-rename-block-power",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_power .",
+ "descriptiontranslationkey": "defaults-rename-block-power-description"
+ },
+ {
+ "attribute": "rename_block_powers",
+ "displayname": "[Rename] Block: Powers to ",
+ "displaytranslationkey": "defaults-rename-block-powers",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_powers .",
+ "descriptiontranslationkey": "defaults-rename-block-powers-description"
+ },
+ {
+ "attribute": "rename_block_powerarmors",
+ "displayname": "[Rename] Block: Power Armors to ",
+ "displaytranslationkey": "defaults-rename-block-powerarmors",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_powerarmors .",
+ "descriptiontranslationkey": "defaults-rename-block-powerarmors-description"
+ },
+ {
+ "attribute": "rename_block_quick_notes",
+ "displayname": "[Rename] Block: Quick Notes to ",
+ "displaytranslationkey": "defaults-rename-block-quick-notes",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_quick_notes .",
+ "descriptiontranslationkey": "defaults-rename-block-quick-notes-description"
+ },
+ {
+ "attribute": "rename_block_vehicles",
+ "displayname": "[Rename] Block: Vehicles to ",
+ "displaytranslationkey": "defaults-rename-block-vehicles",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_vehicles .",
+ "descriptiontranslationkey": "defaults-rename-block-vehicles-description"
+ },
+ {
+ "attribute": "rename_block_walkers",
+ "displayname": "[Rename] Block: Walkers to ",
+ "displaytranslationkey": "defaults-rename-block-walkers",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_walkers .",
+ "descriptiontranslationkey": "defaults-rename-block-walkers-description"
+ },
+ {
+ "attribute": "rename_block_weapons",
+ "displayname": "[Rename] Block: Weapons to ",
+ "displaytranslationkey": "defaults-rename-block-weapons",
+ "type": "text",
+ "description": "Renamed via the attribute rename_block_weapons .Rename Integrity Hindrances (Maschinenleben) You can rename the Hindrances caused by the loss of Integrity (Sanity, Purity, etc.). This can also be done manually with the @{rename_integrity_attribute} for each individual sheet. Note that they activate in intervals for each fraction of 10 below 70 — Discord triggers on 69.9 or lower, Dissonance on 59.9 or lower, and so forth.
",
+ "descriptiontranslationkey": "defaults-rename-block-weapons-description"
+ },
+ {
+ "attribute": "rename_discord",
+ "displayname": "[Rename] Integrity: Discord to ",
+ "displaytranslationkey": "defaults-rename-integrity-discord",
+ "type": "text",
+ "description": "Renamed via the attribute rename_discord .",
+ "descriptiontranslationkey": "defaults-rename-integrity-discord-description"
+ },
+ {
+ "attribute": "rename_psychosis",
+ "displayname": "[Rename] Integrity: Psychosis to ",
+ "displaytranslationkey": "defaults-rename-integrity-psychosis",
+ "type": "text",
+ "description": "Renamed via the attribute rename_psychosis .",
+ "descriptiontranslationkey": "defaults-rename-integrity-psychosis-description"
+ },
+ {
+ "attribute": "rename_seizures",
+ "displayname": "[Rename] Integrity: Seizures to ",
+ "displaytranslationkey": "defaults-rename-integrity-seizures",
+ "type": "text",
+ "description": "Renamed via the attribute rename_seizures .",
+ "descriptiontranslationkey": "defaults-rename-integrity-seizures-description"
+ },
+ {
+ "attribute": "rename_depersonalization",
+ "displayname": "[Rename] Integrity: Depersonalization to ",
+ "displaytranslationkey": "defaults-rename-integrity-depersonalization",
+ "type": "text",
+ "description": "Renamed via the attribute rename_depersonalization .",
+ "descriptiontranslationkey": "defaults-rename-integrity-depersonalization-description"
+ },
+ {
+ "attribute": "rename_dissonance",
+ "displayname": "[Rename] Integrity: Dissonance to ",
+ "displaytranslationkey": "defaults-rename-integrity-dissonance",
+ "type": "text",
+ "description": "Renamed via the attribute rename_dissonance .",
+ "descriptiontranslationkey": "defaults-rename-integrity-dissonance-description"
+ },
+ {
+ "attribute": "rename_alienation",
+ "displayname": "[Rename] Integrity: Alienation to ",
+ "displaytranslationkey": "defaults-rename-integrity-alienation",
+ "type": "text",
+ "description": "Renamed via the attribute rename_alienation .",
+ "descriptiontranslationkey": "defaults-rename-integrity-alienation-description"
+ },
+ {
+ "attribute": "rename_derealization",
+ "displayname": "[Rename] Integrity: Derealization to ",
+ "displaytranslationkey": "defaults-rename-integrity-derealization",
+ "type": "text",
+ "description": "Renamed via the attribute rename_derealization .",
+ "descriptiontranslationkey": "defaults-rename-integrity-derealization-description"
+ },
+ {
+ "attribute": "rename_ego_death",
+ "displayname": "[Rename] Integrity: Ego Death to ",
+ "displaytranslationkey": "defaults-rename-integrity-ego-death",
+ "type": "text",
+ "description": "Renamed via the attribute rename_ego_death .",
+ "descriptiontranslationkey": "defaults-rename-integrity-ego-death-description"
+ }
+ ]
+}
diff --git a/Savage Worlds - Graph Paper/source/scripts/workers.js b/Savage Worlds - Graph Paper/source/scripts/workers.js
new file mode 100644
index 0000000000..242857fa8d
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/scripts/workers.js
@@ -0,0 +1,822 @@
+
+/* #############################################################################
+VARIABLES
+############################################################################# */
+
+const dice = ['', 'd4', 'd6', 'd8', 'd10', 'd12'];
+
+const renamedAbbr = ['rename_agi', 'rename_sma', 'rename_spi', 'rename_str', 'rename_vig'];
+
+var parseCodes = { agi: '@{agility}!', sma: '@{smarts}!', spi: '@{spirit}!',
+ str: '@{strength}!', vig: '@{vigor}!' };
+
+const parseDieCodes = { d4: 'd4!', d6: 'd6!', d8: 'd8!', d10: 'd10!', d12: 'd12!' };
+
+/* #############################################################################
+TRANSLATION SETUP
+############################################################################# */
+
+on("sheet:opened", function(e){
+ // Translations for query strings
+ setAttrs({
+ 'query_rate_of_fire': getTranslationByKey('rate-of-fire'),
+ 'query_modifier': getTranslationByKey('modifier'),
+ 'query_wild_die': getTranslationByKey('wild-die'),
+ 'query_roll_result': getTranslationByKey('roll-result'),
+ 'query_target_number': getTranslationByKey('target-number'),
+ 'query_damage_modifier': getTranslationByKey('damage-modifier'),
+ 'query_bonus_wild_die': getTranslationByKey('bonus-wild-die'),
+ 'none': getTranslationByKey('none')
+ });
+
+ // Include renamed Trait abbreviations
+ getAttrs(renamedAbbr, (values) => {
+ parseCodes = { agi: '@{agility}!', sma: '@{smarts}!', spi: '@{spirit}!',
+ str: '@{strength}!', vig: '@{vigor}!' };
+
+ _.each(renamedAbbr, (a) => {
+ // Skip if not defined
+ if (_.isUndefined(values[a])) return;
+
+ // Remove erroneous whitsapces
+ let v = values[a].replaceAll(' ', '').toLowerCase();
+
+ // Skip if empty string
+ if (v.length < 1) return;
+
+ parseCodes[v] = parseCodes[a.replace('rename_', '')];
+ });
+ });
+});
+
+/* #############################################################################
+CUSTOM SHEET FUNCTIONS
+############################################################################# */
+
+var TETRA = TETRA || ( function() {
+ 'use strict';
+ var version = '1.0',
+
+ // Parse and evaluate float number
+ toFloat = function(number, old = 0.0) {
+ let n = parseFloat(number);
+ n = _.isUndefined(n) ? old : n;
+
+ return isNaN(n) ? old : n;
+ },
+
+ // Parse and evaluate integer number
+ toInt = function(number, old = 0) {
+ let n = parseInt(number);
+ n = _.isUndefined(n) ? old : n;
+
+ return isNaN(n) ? old : n;
+ },
+
+ parseDiceCode = function(code) {
+ if (_.isUndefined(code)) return '';
+
+ code = code.toLowerCase();
+
+ // Replace abbreviations with attribute references (naive)
+ _.each(_.keys(parseCodes), (k) => {
+ code = code.replaceAll(`+${k}`, `+${parseCodes[k]}`);
+ code = code.replaceAll(`-${k}`, `-${parseCodes[k]}`);
+ code = code.replaceAll(`${k}+`, `${parseCodes[k]}+`);
+ code = code.replaceAll(`${k}-`, `${parseCodes[k]}-`);
+ });
+
+ // Add exclamation mark (!) to make dice explode (naive)
+ _.each(_.keys(parseDieCodes), (k) => {
+ code = code.replaceAll(`${k}`, `${parseDieCodes[k]}`);
+ });
+
+ return code;
+ },
+
+ // Update the roll queries for a trait
+ updateTraitRoll = function(trait) {
+ let traitAttributes = [trait, `${trait}_wd`, `${trait}_mod`];
+
+ // Get trait values: die, Wild Die, and modifier
+ getAttrs(traitAttributes, (values) => {
+ let die = values[trait],
+ wd = values[`${trait}_wd`],
+ ewd = '-10000', // Extra Wild Die
+ mod = values[`${trait}_mod`] || '0',
+ untrained = '0',
+ code = toInt(mod);
+
+ // Set up Wild Die
+ if (dice.includes(wd) && wd != '') {
+ ewd = wd;
+ } else if (wd == '') {
+ wd = '1d6';
+ } else {
+ wd = '-10000'; // Rolltemplate will not show results below -1000
+ }
+
+ // Account for untrained skill
+ if (die == 'd4-2') {
+ die = 'd4';
+ code -= 2;
+ untrained = '-2';
+ }
+
+ // Stringify code
+ if (code != 0) {
+ code = code > 0 ? `+${code}` : code.toString();
+ } else {
+ code = '';
+ }
+
+ // Build base code
+ code = die + code;
+
+ // Add custom Wild Die to code
+ code = ewd != '-10000' ? `${code} [${wd}]` : code;
+
+ setAttrs({ [`${trait}_roll`]: die,
+ [`${trait}_wd_roll`]: wd,
+ [`${trait}_extra_wd_roll`]: ewd,
+ [`${trait}_untrained_mod`]: untrained,
+ [`${trait}_code`]: code });
+ });
+ },
+
+ // Apply custom function to attributes in all rows of repeating section
+ doWithRepList = function(section, attributes, func = (v) => { return v }) {
+ let fullSection = section.includes('repeating_') ? section : `repeating_${section}`;
+
+ attributes = _.isArray(attributes) ? attributes : [attributes];
+
+ function process(idArray, attributes) {
+ let attributeArray = [];
+
+ // List of all requested attributes from all rows
+ _.each(idArray, (id) => {
+ _.each(attributes, (a) => {
+ attributeArray.push(`${fullSection}_${id}_${a}`);
+ });
+ });
+
+ getAttrs(attributeArray, (values) => {
+ func(values); // Pass all attribute values to custom function
+ });
+ }
+
+ getSectionIDs(fullSection, (idArray) => {
+ process(idArray, attributes);
+ });
+ };
+
+ return {
+ updateTraitRoll: updateTraitRoll,
+ doWithRepList: doWithRepList,
+ toFloat: toFloat,
+ toInt: toInt,
+ parseDiceCode: parseDiceCode
+ };
+}());
+
+/* #############################################################################
+ATTRIBUTE DICE (AND SOAK)
+############################################################################# */
+
+const attributes = ['agility', 'smarts', 'spirit', 'strength', 'vigor'];
+
+on('change:soak change:' + attributes.join(' change:'), (e) => {
+ // Derive target attribute and check if input value is a valid die
+ let value = _.isUndefined(e.newValue) ? 'd4' : e.newValue;
+ value = dice.includes(value) && value != '' ? value : 'd4';
+
+ // Set attributes to new value, silent to avoid triggering worker again
+ // but with a callback to update the attribute's roll query
+ setAttrs({ [e.sourceAttribute]: value },
+ { silent: true },
+ TETRA.updateTraitRoll(e.sourceAttribute));
+});
+
+/* #############################################################################
+SKILL DICE
+############################################################################# */
+
+const skills = ['academics', 'athletics', 'battle', 'boating', 'common_knowledge',
+ 'driving', 'electronics', 'fighting', 'healing', 'intimidation',
+ 'magic', 'notice', 'performance', 'persuasion', 'piloting',
+ 'repair', 'research', 'riding', 'science', 'shooting', 'stealth',
+ 'survival', 'taunt', 'thievery', 'gambling', 'hacking', 'faith',
+ 'focus', 'language', 'occult', 'psionics', 'spellcasting',
+ 'weird_science', 'custom_skill_1', 'custom_skill_2', 'unskilled'];
+
+const skillDice = ['d4-2', 'd4', 'd6', 'd8', 'd10', 'd12'];
+
+on('change:' + skills.join(' change:'), (e) => {
+ // Derive target attribute and check if input value is a valid die
+ let value = _.isUndefined(e.newValue) ? 'd4-2' : e.newValue;
+ value = skillDice.includes(value) ? value : 'd4-2';
+
+ // Set attributes to new value, silent to avoid triggering worker again
+ // but with a callback to update the attribute's roll query
+ setAttrs({ [e.sourceAttribute]: value },
+ { silent: true },
+ TETRA.updateTraitRoll(e.sourceAttribute));
+});
+
+/* #############################################################################
+WILD DICE
+############################################################################# */
+
+const wildTraits = ['soak'].concat(attributes).concat(skills).map((s) => { return `${s}_wd` });
+
+on('change:' + wildTraits.join(' change:'), (e) => {
+ // Derive target attribute and check if input value is a valid die
+ let value = _.isUndefined(e.newValue) ? '' : e.newValue;
+ value = dice.includes(value) ? value : 'n/a';
+
+ // Set attributes to new value, silent to avoid triggering worker again
+ // but with a callback to update the attribute's roll query
+ setAttrs({ [e.sourceAttribute]: value },
+ { silent: true },
+ TETRA.updateTraitRoll(e.sourceAttribute.replace('_wd', '')));
+});
+
+/* #############################################################################
+NATURAL DICE
+############################################################################# */
+
+const naturalTraits = attributes.map((s) => { return `${s}_natural` });
+
+on('change:' + naturalTraits.join(' change:'), (e) => {
+ // Check if new value is valid
+ let value = dice.includes(e.newValue) ? e.newValue : '';
+ value = _.isUndefined(e.newValue) ? 'd4' : value;
+
+ // Set attributes to new value, silent to avoid triggering worker again
+ setAttrs({ [e.sourceAttribute]: value }, { silent: true });
+});
+
+/* #############################################################################
+RUN DIE
+############################################################################# */
+
+on('change:run', (e) => {
+ // Check if run value is a valid die
+ let value = dice.includes(e.newValue) ? e.newValue : '';
+
+ // Update run die
+ value = _.isUndefined(e.newValue) ? '' : value;
+
+ // Update run roll
+ let runRoll = value != '' ? value : 'd6';
+
+ // Set attributes to new values, silent to avoid triggering worker again
+ setAttrs({ [e.sourceAttribute]: value, ['run_roll']: runRoll },
+ { silent: true });
+});
+
+/* #############################################################################
+MODIFIERS
+############################################################################# */
+const modifiers = ['soak'].concat(attributes).concat(skills).map((s) => { return `${s}_mod` });
+
+on('change:' + modifiers.join(' change:'), (e) => {
+ // Parse input value as integer
+ let value = TETRA.toInt(e.newValue, '');
+
+ // Set 0 to empty
+ value = value == 0 ? '' : value;
+
+ // Positive or negative prefix (required for roll query)
+ if (value != '') {
+ let s = String(value);
+ value = value > -1 && s.charAt(0) != '+' ? `+${s}` : s;
+ }
+
+ // Set attribute to new value, silent to avoid triggering worker again
+ setAttrs({ [e.sourceAttribute]: value },
+ { silent: true },
+ TETRA.updateTraitRoll(e.sourceAttribute.replace('_mod', '')));
+});
+
+/* #############################################################################
+SIMPLE STATISTICS
+############################################################################# */
+
+const simple = ['pace', 'flight', 'rads', 'power', 'power_consumed',
+ 'power_maximum', 'armor_head', 'armor_torso', 'armor_arms',
+ 'armor_legs', 'parry', 'toughness', 'integrity_maximum',
+ 'carry_weight_maximum'];
+
+on('change:' + simple.join(' change:'), (e) => {
+ // Parse input value as integer unless it is empty
+ let value = TETRA.toInt(e.newValue, '');
+
+ // Cannot be smaller than zero
+ if (value != '') {
+ value = value < 0 ? 0 : value;
+ }
+
+ // Set attribute to new value, silent to avoid triggering worker again
+ setAttrs({ [e.sourceAttribute]: value }, { silent: true });
+});
+
+/* #############################################################################
+WOUND BOXES
+############################################################################# */
+
+const woundToggles = _.range(1, 7).map((n) => { return `wound_toggle_${n.toString()}` });
+
+on('change:wounds change:wound_mitigation change:' + woundToggles.join(' change:'), (e) => {
+ let attributes = ['wounds', 'wound_mitigation'].concat(woundToggles);
+
+ // Get all relevant attributes
+ getAttrs(attributes, (values) => {
+ let setters = {};
+
+ // Get first inactive wound box
+ let firstInactiveWound = _.find(woundToggles, (ws) => {
+ return values[ws] == 'on';
+ });
+
+ // Get number of first inactive wound box
+ let firstInactiveNumber = (() => {
+ if (_.isUndefined(firstInactiveWound)) {
+ return 100;
+ }
+
+ let number = parseInt(firstInactiveWound.split('').pop());
+ return _.isUndefined(number) ? 100 : number;
+ })();
+
+ // Deactive all subsequent wound boxes
+ for (var i = firstInactiveNumber + 1; i < 7; ++i) {
+ setters[`wound_toggle_${i}`] = 'on';
+ };
+
+ // Limit active wounds to active wound boxes
+ if (values['wounds'] >= firstInactiveNumber) {
+ setters['wounds'] = firstInactiveNumber - 1;
+ } else {
+ setters['wounds'] = values['wounds'];
+ };
+
+ // Update wound-mitigation
+ let wm = isNaN(parseInt(values['wound_mitigation'])) ? '' : parseInt(values['wound_mitigation']);
+
+ if (wm != '') {
+ wm = wm < 0 ? 0 : wm;
+ }
+
+ setters['wound_mitigation'] = wm;
+
+ wm = isNaN(wm) ? 0 : wm;
+
+ // Update wound_mod
+ let wmod = setters['wounds'] - wm;
+
+ setters['wound_mod'] = wmod < 0 ? 0 : wmod;
+
+ setAttrs(setters, { silent: true });
+ });
+});
+
+/* #############################################################################
+FATIGUE BOXES
+############################################################################# */
+
+const fatigueToggles = _.range(2, 4).map((n) => { return `fatigue_toggle_${n.toString()}` });
+
+on('change:fatigue change:' + fatigueToggles.join(' change:'), (e) => {
+ let attributes = ['fatigue'].concat(fatigueToggles);
+
+ // Get all relevant attributes
+ getAttrs(attributes, (values) => {
+ let setters = {};
+
+ // Get first inactive box
+ let firstInactiveBox = _.find(fatigueToggles, (fs) => {
+ return values[fs] == 'on';
+ });
+
+ // Get number of first inactive box
+ let firstInactiveNumber = (() => {
+ if (_.isUndefined(firstInactiveBox)) {
+ return 100;
+ }
+
+ let number = parseInt(firstInactiveBox.split('').pop());
+ return _.isUndefined(number) ? 100 : number;
+ })();
+
+ // Deactive all subsequent boxes
+ for (var i = firstInactiveNumber + 1; i < 4; ++i) {
+ setters[`fatigue_toggle_${i}`] = 'on';
+ };
+
+ // Limit active fatigue to active boxes
+ if (values['fatigue'] >= firstInactiveNumber) {
+ setters['fatigue'] = firstInactiveNumber - 1;
+ } else {
+ setters['fatigue'] = values['fatigue'];
+ };
+
+ // Update fatigue_mod
+ let fmod = TETRA.toInt(setters['fatigue']);
+
+ setters['fatigue_mod'] = fmod;
+
+ setAttrs(setters, { silent: true });
+ });
+});
+
+/* #############################################################################
+AUTO SIZE EDGES + HINDRANCES
+############################################################################# */
+
+// 10px Roboto
+// Since Roll20 does not allow DOM access, yes, this BS is necessary.
+// Don't take this as something to learn from! Stars above, no!
+const letters = { 'A': 6.53, 'a': 5.45, 'B': 6.23, 'b': 5.63, 'C': 6.52,
+ 'c': 5.23, 'D': 6.56, 'd': 5.64, 'E': 6.69, 'e': 5.31,
+ 'F': 5.53, 'f': 3.48, 'G': 6.81, 'g': 5.63, 'H': 7.14,
+ 'h': 5.52, 'I': 2.72, 'i': 2.44, 'J': 5.53, 'j': 2.39,
+ 'K': 6.28, 'k': 5.08, 'L': 5.39, 'l': 2.44, 'M': 8.73,
+ 'm': 8.77, 'N': 7.14, 'n': 5.53, 'O': 6.88, 'o': 5.70,
+ 'P': 6.31, 'p': 5.63, 'Q': 6.88, 'q': 5.69, 'R': 6.17,
+ 'r': 3.39, 'S': 5.94, 's': 5.16, 'T': 5.97, 't': 3.28,
+ 'U': 6.48, 'u': 5.52, 'V': 6.38, 'v': 4.84, 'W': 8.88,
+ 'w': 7.52, 'X': 6.28, 'x': 4.97, 'Y': 8.88, 'y': 7.52,
+ 'Z': 6.28, 'z': 4.97, '#': 6.17, '&': 6.22, '(': 3.42,
+ ')': 3.48, '+': 5.67, '-': 2.77, '=': 5.50, '*': 4.31,
+ '!': 2.58, '.': 2.64, ',': 1.97, '@': 8.98, ' ': 2.48,
+ '?': 4.73, '_': 4.52, '%': 7.33, 'Ä': 6.53, 'ä': 5.45,
+ 'Ö': 6.88, 'ö': 5.70, 'Ü': 6.48, 'ü': 5.52, 'ß': 5.95,
+ '°': 3.75, '<': 5.09, '>': 5.23, '[': 2.66, ']': 2.66,
+ '{': 3.39, '}': 3.39, '$': 5.63, '"': 3.20 };
+
+on('change:repeating_features:feature_name', (e) => {
+ let target = e.sourceAttribute.replace('_feature_name', '_feature_size');
+
+ getAttrs([e.sourceAttribute], (value) => {
+ // Split string into array
+ let chars = value[Object.keys(value)[0]].split(''),
+ stringWidth = 0.0;
+
+ // Sum up the width of each character
+ _.each(chars, (c) => {
+ stringWidth += _.has(letters, c) ? letters[c] : 5.0;
+ });
+
+ // Remove decimal points by rounding up
+ stringWidth = Math.ceil(stringWidth);
+
+ let offset = 4 - (stringWidth % 4),
+ elementWidth = stringWidth + offset;
+
+ // Maximum/minimum width
+ elementWidth = elementWidth > 180 ? 180 : elementWidth;
+ elementWidth = elementWidth < 32 ? 32 : elementWidth;
+
+ setAttrs({ [target]: elementWidth }, { silent: true });
+ });
+});
+
+/* #############################################################################
+LOSS PROGRESS
+############################################################################# */
+
+on('change:integrity', (e) => {
+ // Parse as float or keep old value if invalid
+ let value = TETRA.toFloat(e.newValue, e.previousValue),
+ progress = Math.ceil(value),
+ setters = { integrity: value.toFixed(1) };
+
+ // Bar can only take numbers between 0 and 80
+ progress = progress > 80 ? 80 : progress;
+ progress = progress < 0 ? 0 : progress;
+ setters['integrity_bar_size'] = progress;
+
+ // Set corresponding psychological states
+ setters['discord'] = value < 70 ? 'on' : 'off';
+ setters['dissonance'] = value < 60 ? 'on' : 'off';
+ setters['psychosis'] = value < 50 ? 'on' : 'off';
+ setters['alienation'] = value < 40 ? 'on' : 'off';
+ setters['seizures'] = value < 30 ? 'on' : 'off';
+ setters['derealization'] = value < 20 ? 'on' : 'off';
+ setters['depersonalization'] = value < 10 ? 'on' : 'off';
+ setters['ego_death'] = value < 1 ? 'on' : 'off';
+
+ setAttrs(setters, { silent: true });
+});
+
+/* #############################################################################
+REPEATING WEIGHT
+############################################################################# */
+
+function twoColSum(values, target, multi = false) {
+ let sum = 0.0;
+
+ // Turn into two-dimensional array
+ values = Object.entries(values);
+
+ // Continue to remove items from the array
+ while (values.length > 0) {
+ // Values must be in order of weight, toggle, multiplier!
+ let value = TETRA.toFloat(values.shift()[1]),
+ toggle = values.shift()[1],
+ multiplier = 1;
+
+ if (multi) {
+ multiplier = TETRA.toFloat(values.shift()[1]);
+ }
+
+ sum += toggle == 'on' ? value * multiplier : 0.0;
+ }
+
+ setAttrs({ [target]: sum.toFixed(1) });
+}
+
+on('remove:repeating_weapons change:repeating_weapons:weapon_weight change:repeating_weapons:weapon_weight_toggle', (e) => {
+ TETRA.doWithRepList('weapons',
+ ['weapon_weight', 'weapon_weight_toggle'],
+ (v) => { twoColSum(v, 'carry_weight_weapons') });
+});
+
+on('remove:repeating_apparel change:repeating_apparel:apparel_weight change:repeating_apparel:apparel_weight_toggle', (e) => {
+ TETRA.doWithRepList('apparel',
+ ['apparel_weight', 'apparel_weight_toggle'],
+ (v) => { twoColSum(v, 'carry_weight_apparel') });
+});
+
+on('remove:repeating_inventory change:repeating_inventory:inventory_weight change:repeating_inventory:inventory_weight_toggle change:repeating_inventory:inventory_amount', (e) => {
+ TETRA.doWithRepList('inventory',
+ ['inventory_weight', 'inventory_weight_toggle', 'inventory_amount'],
+ (v) => { twoColSum(v, 'carry_weight_inventory', true) });
+});
+
+const carryWeights = ['carry_weight_apparel', 'carry_weight_weapons',
+ 'carry_weight_inventory', 'carry_weight_maximum'];
+
+on('change:' + carryWeights.join(' change:'), (e) => {
+ getAttrs(carryWeights, (value) => {
+ let weapons = TETRA.toFloat(value['carry_weight_weapons']),
+ apparel = TETRA.toFloat(value['carry_weight_apparel']),
+ inventory = TETRA.toFloat(value['carry_weight_inventory']),
+ total = (weapons + apparel + inventory).toFixed(1);
+
+ setAttrs({ ['carry_weight']: total }, { silent: true });
+ });
+});
+
+/* #############################################################################
+LOSS
+############################################################################# */
+
+on('change:repeating_augmentations remove:repeating_augmentations', (e) => {
+ TETRA.doWithRepList('augmentations',
+ ['augmentation_loss', 'augmentation_loss_toggle', 'augmentation_multiplier'],
+ (v) => { twoColSum(v, 'augmentations_total_loss', true) });
+});
+
+/* #############################################################################
+INTEGRITY MOD
+############################################################################# */
+
+on('change:integrity_mod', (e) => {
+ setAttrs({ ['integrity_mod']: TETRA.toInt(e.newValue, '') });
+});
+
+/* #############################################################################
+INTEGRITY CALCULATION
+############################################################################# */
+
+on('change:augmentations_total_loss change:integrity_maximum change:integrity_mod', (e) => {
+ getAttrs(['augmentations_total_loss', 'integrity_maximum', 'integrity_mod'], (values) => {
+ let loss = TETRA.toFloat(values['augmentations_total_loss']),
+ max = TETRA.toFloat(values['integrity_maximum'], 80),
+ mod = TETRA.toFloat(values['integrity_mod']);
+
+ setAttrs({ integrity: (max - loss + mod).toFixed(1) });
+ });
+});
+
+/* #############################################################################
+REAPTING VEHICLE WEAPONS & SILHOUETTES
+############################################################################# */
+
+on('change:repeating_vehicles change:repeating_powerarmors', (e) => {
+ // Weapon count was changed
+ if (e.sourceAttribute.includes('weapons_count')) {
+ let value = TETRA.toInt(e.newValue, 0);
+
+ // Value must be between 0 and 10
+ value = value < 0 ? 0 : value;
+ value = value > 10 ? 10 : value;
+
+ setAttrs({ [e.sourceAttribute]: value }, { silent: true });
+ }
+
+ // Silhouette was changed
+ if (e.sourceAttribute.includes('silhouette')) {
+ let target = e.sourceAttribute.replace('_vehicle_silhouette_cycle', '_vehicle_silhouette');
+
+ getAttrs([target], (values) => {
+ let silhouette = TETRA.toInt(_.values(values)[0], 0);
+
+ setAttrs({ [target]: (silhouette + 1) % 17 }, { silent: true });
+ });
+ }
+});
+
+/* #############################################################################
+AMMUNITION & BUTTONS
+############################################################################# */
+
+const ammoMods = ['1', '3', '5', '10'];
+
+function changeAmmo(triggerName) {
+ let mod = TETRA.toInt(triggerName.replace('clicked:ammunition_', '')),
+ attributes = ['ammunition_select',
+ 'ammunition_container_1',
+ 'ammunition_container_2',
+ 'ammunition_container_3'];
+
+ getAttrs(attributes, (values) => {
+ let target = values['ammunition_select'],
+ current = TETRA.toInt(values[target]); // The selector value is the attribute name of the box
+
+ // Add ammunition modifier
+ updated = current + mod;
+
+ // No negative ammunition
+ updated = updated < 0 ? 0 : updated;
+
+ setAttrs({ [target]: updated }, { silent: true });
+ });
+}
+
+on(`clicked:${ammoMods.map((s) => { return `ammunition_+${s}` }).join(' clicked:')}`, (e) => {
+ changeAmmo(e.triggerName);
+});
+
+on(`clicked:${ammoMods.map((s) => { return `ammunition_-${s}` }).join(' clicked:')}`, (e) => {
+ changeAmmo(e.triggerName);
+});
+
+on(`clicked:ammunition_set`, (e) => {
+ getAttrs(['ammunition_select'], (value) => {
+ let target = `${value['ammunition_select']}_max`;
+
+ getAttrs([value['ammunition_select']], (current) => {
+ update = TETRA.toInt(current[value['ammunition_select']]);
+
+ setAttrs({ [target]: update }, { silent: true });
+ });
+ });
+});
+
+on(`clicked:ammunition_reset`, (e) => {
+ getAttrs(['ammunition_select'], (value) => {
+ let target = value['ammunition_select'];
+
+ getAttrs([`${target}_max`], (max) => {
+ update = TETRA.toInt(max[`${target}_max`]);
+
+ setAttrs({ [target]: update }, { silent: true });
+ });
+ });
+});
+
+/* #############################################################################
+REPEATING LISTS & OPTIONS
+############################################################################# */
+
+const listItems = ['engram', 'power', 'weapon'];
+
+on(listItems.map(s => `change:repeating_${s}s:${s}_damage`).join(' '), (e) => {
+ let code = TETRA.parseDiceCode(e.newValue);
+
+ code = code.replaceAll('!', '@{explode_damage}'); // Toggle exploding damage dice
+ code = code == '' ? '0' : code;
+
+ setAttrs({ [`${e.sourceAttribute}_roll`]: code }, { silent: true });
+});
+
+on(listItems.map(s => `change:repeating_${s}s:skill_name`).join(' '), (e) => {
+ let array = skills.map((s) => { return `rename_${s}` }),
+ id = e.sourceAttribute.replace('skill_name', ''); // All rename_ attributes
+
+ getAttrs(array, (values) => {
+ // Find corresponding attribute
+ let renameAttribute = Object.keys(values).find(key => values[key] === e.newValue),
+ update = {};
+
+ if (_.isUndefined(renameAttribute)) {
+ update[e.sourceAttribute] = e.previousValue; // Reset if input is invalid
+ } else {
+ update[`${id}skill_wd`] = `@{${renameAttribute.replace('rename_', '')}_wd}`;
+ update[`${id}skill_mod`] = `@{${renameAttribute.replace('rename_', '')}_mod}`;
+ update[`${id}skill_untrained_mod`] = `@{${renameAttribute.replace('rename_', '')}_untrained_mod}`;
+ update[`${id}skill_roll`] = `@{${renameAttribute.replace('rename_', '')}_roll}`;
+ update[`${id}skill_wd_roll`] = `@{${renameAttribute.replace('rename_', '')}_wd_roll}`;
+ update[`${id}skill_extra_wd_roll`] = `@{${renameAttribute.replace('rename_', '')}_extra_wd_roll}`;
+ }
+
+ setAttrs(update, { silent: true });
+ });
+});
+
+on(listItems.map(s => `change:repeating_${s}s:skill_bonus`).join(' '), (e) => {
+ let update = TETRA.toInt(e.newValue);
+
+ update = update == 0 ? '' : update > 0 ? `+${update}` : update;
+
+ setAttrs({ [e.sourceAttribute]: update }, { silent: true });
+});
+
+on(listItems.map(s => `change:repeating_${s}s:rof_override_toggle`).join(' '), (e) => {
+ let d = e.sourceAttribute.includes('weapon') ? '@{weapon_rof}' : '1',
+ update = e.newValue == 'on' ? `?{@{query_rate_of_fire}|${d}}` : '1',
+ target = e.sourceAttribute.replace('_toggle', '');
+
+ setAttrs({ [target]: update }, { silent: true });
+});
+
+on(listItems.map(s => `change:repeating_${s}s:wd_override_toggle`).join(' '), (e) => {
+ let update = e.newValue == 'on' ? `{{wd=@{wd_override_die}}} {{wdroll=[[ @{wd_override_die}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}` : '',
+ target = e.sourceAttribute.replace('_toggle', '');
+
+ setAttrs({ [target]: update }, { silent: true });
+});
+
+on(listItems.map(s => `change:repeating_${s}s:roll_description_toggle`).join(' '), (e) => {
+ let update = e.newValue == 'on' ? `@{roll_description_input}` : '',
+ target = e.sourceAttribute.replace('_toggle', '');
+
+ setAttrs({ [target]: update }, { silent: true });
+});
+
+on(listItems.map(s => `change:repeating_${s}s:roll_injection_toggle`).join(' '), (e) => {
+ let update = e.newValue == 'on' ? `@{roll_injection_input}` : '',
+ target = e.sourceAttribute.replace('_toggle', '');
+
+ setAttrs({ [target]: update }, { silent: true });
+});
+
+on(listItems.map(s => `change:repeating_${s}s:explode_damage_toggle`).join(' '), (e) => {
+ let update = e.newValue == 'on' ? '!' : ' ',
+ target = e.sourceAttribute.replace('_toggle', '');
+
+ setAttrs({ [target]: update }, { silent: true });
+});
+
+/* #############################################################################
+HELPER BUTTONS
+############################################################################# */
+
+on('change:dice_roller_input', (e) => {
+ let code = TETRA.parseDiceCode(e.newValue);
+
+ setAttrs({ ['dice_roller_code']: code }, { silent: true });
+});
+
+/* #############################################################################
+SETTINGS
+############################################################################# */
+
+on('change:toggle_global_rof', (e) => {
+ let update = e.newValue == 'on' ? '?{@{query_rate_of_fire}|1}' : '1';
+
+ setAttrs({ ['query_global_rof']: update }, { silent: true });
+});
+
+on('change:toggle_global_wd', (e) => {
+ let update = e.newValue == 'on' ? '?{@{query_wild_die}|d8|d4|d6|d10|d12|@{none},-10000-d20}' : '-10000-d20';
+
+ setAttrs({ ['query_global_wd']: update }, { silent: true });
+});
+
+on('change:toggle_global_bonus_wd', (e) => {
+ let update = e.newValue == 'on' ? '?{@{query_bonus_wild_die}|d4|d6|d8|d10|d12|@{none},-10000-d20}' : '-10000-d20';
+
+ setAttrs({ ['query_global_bonus_wd']: update }, { silent: true });
+});
+
+on('change:toggle_run_wounds', (e) => {
+ let update = e.newValue == 'on' ? '0' : '@{wound_mod}';
+
+ setAttrs({ ['run_wounds']: update }, { silent: true });
+});
+
+on('change:toggle_run_fatigue', (e) => {
+ let update = e.newValue == 'on' ? '@{fatigue_mod}' : '0';
+
+ setAttrs({ ['run_fatigue']: update }, { silent: true });
+});
+
+on('change:toggle_run_explode', (e) => {
+ let update = e.newValue == 'on' ? '@{run_roll}!' : '@{run_roll}';
+
+ setAttrs({ ['run_code']: update }, { silent: true });
+});
diff --git a/Savage Worlds - Graph Paper/source/styles/SavageWorldsGraphPaper.scss b/Savage Worlds - Graph Paper/source/styles/SavageWorldsGraphPaper.scss
new file mode 100644
index 0000000000..5893ccefe9
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/SavageWorldsGraphPaper.scss
@@ -0,0 +1,50 @@
+@import url('https://fonts.googleapis.com/css?family=Roboto:ital,wght@0,300;0,400;0,500;0,700;0,900;1,300;1,400;1,500;1,700;1,900&display=swap');
+
+// Base
+@import 'variables';
+@import 'reset';
+@import 'general';
+@import 'hexagons';
+@import 'color_cycle';
+@import 'repeating';
+@import 'hexfields';
+@import 'tabs';
+
+// Blocks
+@import 'meta';
+@import 'buttons';
+@import 'attributes';
+@import 'silhouette';
+@import 'secondary';
+@import 'armor';
+@import 'skills';
+@import 'advancements';
+@import 'notebook';
+@import 'settings';
+@import 'features';
+@import 'health';
+@import 'power';
+@import 'weapons';
+@import 'apparel';
+@import 'integrity';
+@import 'abilities';
+@import 'augmentations';
+@import 'engrams';
+@import 'powers';
+@import 'vehicles';
+@import 'powerarmor';
+@import 'walkers';
+@import 'allies';
+@import 'quick_notes';
+@import 'encumbrance';
+@import 'inventory';
+@import 'ammunition';
+@import 'simple_trait';
+@import 'extra_sheet';
+@import 'rolltemplates';
+
+// Arrangements
+@import 'sections';
+
+// Overrides
+@import 'translation_overrides';
diff --git a/Savage Worlds - Graph Paper/source/styles/_abilities.scss b/Savage Worlds - Graph Paper/source/styles/_abilities.scss
new file mode 100644
index 0000000000..bd10d60f5c
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_abilities.scss
@@ -0,0 +1,27 @@
+.sheet-abilities {
+ .sheet-repitem__size-radio {
+ &[value="6"]:checked ~ textarea {
+ height: 20px;
+ }
+
+ &[value="1"]:checked ~ textarea {
+ height: 36px;
+ }
+
+ &[value="2"]:checked ~ textarea {
+ height: 52px;
+ }
+
+ &[value="3"]:checked ~ textarea {
+ height: 68px;
+ }
+
+ &[value="4"]:checked ~ textarea {
+ height: 84px;
+ }
+
+ &[value="5"]:checked ~ textarea {
+ height: 100px;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_advancements.scss b/Savage Worlds - Graph Paper/source/styles/_advancements.scss
new file mode 100644
index 0000000000..ea303fa169
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_advancements.scss
@@ -0,0 +1,36 @@
+.sheet-advancements {
+ color: $c-text-light;
+ font-size: $fs-s;
+ line-height: 16px;
+ padding: 8px 0 0 64px;
+
+ &__item {
+ display: flex;
+ background-color: $c-white;
+ border-bottom: 1px dotted $c-outline;
+ height: 16px;
+ width: 100%;
+
+ &:not(:last-child) {
+ margin-bottom: 8px;
+ }
+ }
+
+ &__rank {
+ font-weight: 700;
+ text-align: center;
+ margin-right: 8px;
+ width: 8px;
+ }
+
+ input[type=text] {
+ flex-grow: 1;
+ color: $c-text-light;
+ font-size: $fs-s;
+ line-height: 16px;
+
+ &::placeholder {
+ font-size: $fs-s;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_allies.scss b/Savage Worlds - Graph Paper/source/styles/_allies.scss
new file mode 100644
index 0000000000..7802a68695
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_allies.scss
@@ -0,0 +1,111 @@
+.sheet-allies {
+ &__pace,
+ &__parry,
+ &__toughness,
+ &__size,
+ &__exp,
+ &__level {
+ width: 45px;
+ }
+
+ .sheet-header__labels {
+ padding-right: 30px;
+ }
+
+ .sheet-repitem__secondary {
+ align-items: flex-start;
+ justify-content: space-between;
+ height: auto;
+
+ .sheet-left {
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ flex-shrink: 0;
+ padding: 5px 0 6px;
+ width: 44px;
+
+ button[type=roll],
+ .sheet-allies__health-field input[type=text] {
+ font-weight: 700;
+ border-radius: 2px;
+ height: 20px;
+ width: 20px;
+ }
+
+ button[type=roll] {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: $c-text-lightest;
+ font-size: $fs-s;
+ line-height: 1;
+ border: 1px dotted $c-outline;
+ margin-bottom: 4px !important;
+
+ &:hover {
+ background-color: $c-background-dark;
+ border-color: $c-background-dark;
+
+ span {
+ color: $c-white !important;
+ }
+ }
+ }
+
+ .sheet-allies__health-field {
+ position: relative;
+
+ &::before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block;
+ background-color: $c-background-hover;
+ color: $c-white;
+ font-family: Pictos;
+ font-size: 14px;
+ font-weight: 900;
+ line-height: 22px;
+ text-align: center;
+ border-radius: 2px;
+ height: 100%;
+ width: 100%;
+ }
+
+ &--wounds::before {
+ content: 'k';
+ }
+
+ &--fatigue::before {
+ content: 'Y';
+ }
+
+ input[type=text] {
+ position: relative;
+ z-index: 1;
+ color: $c-text-light;
+ font-size: 14px;
+ line-height: 20px;
+ text-align: center;
+ }
+ }
+ }
+
+ .sheet-right {
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ padding: 5px 0 0 8px;
+
+ input[type=text].sheet-allies__note-field {
+ text-align: left;
+ padding: 0 2px;
+ margin-bottom: 4px;
+ border-bottom: 1px dotted $c-outline;
+ height: 20px;
+ width: 76px !important;
+ }
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_ammunition.scss b/Savage Worlds - Graph Paper/source/styles/_ammunition.scss
new file mode 100644
index 0000000000..35b2aa4e82
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_ammunition.scss
@@ -0,0 +1,149 @@
+.sheet-ammunition {
+ position: relative;
+ margin-bottom: 16px;
+ width: 266px;
+
+ &__content {
+ display: flex;
+ padding: 6px 0 14px;
+ }
+
+ &__container {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: $c-item;
+ border-radius: 2px;
+ height: 34px;
+ width: 40px;
+
+ &--1,
+ &--2 {
+ margin-right: 6px;
+ }
+
+ span {
+ position: absolute;
+ left: 0;
+ z-index: 0;
+ display: block;
+ background-color: $c-text-gray;
+ color: $c-white;
+ font-size: $fs-xs;
+ font-weight: 500;
+ line-height: 13px;
+ text-align: center;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ height: 12px;
+ width: 100%;
+ }
+
+ span:first-of-type {
+ top: 0;
+ border-radius: 2px 2px 0 0;
+ }
+
+ span:last-of-type {
+ bottom: -10px;
+ letter-spacing: -0.4px;
+ text-transform: uppercase;
+ padding: 0 2px;
+ border-radius: 0 0 2px 2px;
+ }
+
+ input[type=radio] {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ height: 100%;
+ width: 100%;
+
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ z-index: 1;
+ height: 10px;
+ width: 100%;
+ }
+
+ &:checked ~ span {
+ background-color: $c-background-dark;
+ }
+
+ &::before {
+ content: '';
+ border: 2px solid $c-text-gray;
+ border-width: 2px 2px 0;
+ border-radius: 2px;
+ height: 100%;
+ width: 100%;
+ }
+
+ &:checked::before {
+ border-color: $c-background-dark;
+ }
+
+ &:checked ~ input[type=text] {
+ color: $c-text-lighter;
+ }
+ }
+
+ input[type=text] {
+ position: relative;
+ z-index: 2;
+ color: $c-text-gray;
+ font-size: 14px;
+ font-weight: 700;
+ line-height: 1;
+ margin-top: 9px;
+ height: 14px;
+ width: 36px;
+ }
+ }
+
+ &__buttons {
+ flex-grow: 1;
+
+ > div {
+ display: flex;
+ justify-content: space-between;
+
+ &:first-child {
+ margin-bottom: 4px;
+ }
+ }
+
+ button[type=action] {
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: center;
+ background-color: $c-item;
+ color: $c-text-lightest;
+ border: 1px dotted $c-outline;
+ border-radius: 2px;
+ padding: 0 4px;
+ height: 20px;
+
+ &:hover {
+ background-color: $c-background-dark;
+ color: $c-white !important;
+ border: 1px solid $c-background-dark;
+ }
+
+ &:not(:last-child) {
+ margin-right: 4px;
+ }
+
+ &:last-child {
+ flex-grow: 1;
+ max-width: 21px;
+ }
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_apparel.scss b/Savage Worlds - Graph Paper/source/styles/_apparel.scss
new file mode 100644
index 0000000000..1c7db1d657
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_apparel.scss
@@ -0,0 +1,15 @@
+.sheet-apparel {
+ &__armor {
+ width: 40px;
+ margin-right: 8px;
+ }
+
+ &__tags {
+ text-align: left;
+ width: 210px;
+ }
+
+ &__weight {
+ width: 30px;
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_armor.scss b/Savage Worlds - Graph Paper/source/styles/_armor.scss
new file mode 100644
index 0000000000..238ec041db
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_armor.scss
@@ -0,0 +1,98 @@
+.sheet-armor {
+ z-index: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ padding-right: 48px;
+
+ > .sheet-hexfield {
+ &:not(:last-child) {
+ margin-bottom: 36px;
+ }
+
+ &--armor-head,
+ &--armor-legs {
+ margin-right: 16px;
+ }
+
+ .sheet-hexfield__label--left {
+ background-color: $c-white;
+ padding-left: 4px;
+ }
+
+ textarea {
+ position: absolute;
+ top: 8px;
+ left: 36px;
+ color: $c-text-lighter;
+ font-size: 9px !important;
+ line-height: 1.6;
+ padding-top: 4px;
+ height: 60px;
+ width: 80px;
+
+ &::placeholder {
+ color: #f0f0f0;
+ font-size: 22px;
+ font-weight: 700;
+ line-height: 0.6;
+ }
+ }
+ }
+
+ &__decoration,
+ &__pointer {
+ position: absolute;
+ background: {
+ repeat: no-repeat;
+ size: contain;
+ }
+ opacity: .12;
+ }
+
+ &__decoration {
+ background: {
+ image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/decoration_line.png');
+ }
+ top: 15px;
+ left: -60px;
+ height: 322px;
+ width: 95px;
+ }
+
+ &__pointer {
+ transform: translateX(-100%);
+
+ &--head {
+ top: 17px;
+ left: -28px;
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/head_line.png');
+ height: 2px;
+ width: 122px;
+ }
+
+ &--torso {
+ top: -11px;
+ left: -33px;
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/torso_line.png');
+ height: 30px;
+ width: 131px;
+ }
+
+ &--arms {
+ top: -44px;
+ left: -30px;
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/arms_line.png');
+ height: 63px;
+ width: 97px;
+ }
+
+ &--legs {
+ top: -23px;
+ left: -27px;
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/legs_line.png');
+ height: 42px;
+ width: 98px;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_attributes.scss b/Savage Worlds - Graph Paper/source/styles/_attributes.scss
new file mode 100644
index 0000000000..51f1928b8a
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_attributes.scss
@@ -0,0 +1,50 @@
+.sheet-attribute {
+ position: relative;
+ font-size: 14px;
+ height: 48px;
+ width: 48px;
+
+ &__button {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ color: $c-text-light;
+ font-size: 14px;
+ font-weight: 700;
+ transform: translate(-100%, -50%);
+ }
+
+ &:not(:hover) .sheet-hexfield--mod {
+ input:not(:focus) + .sheet-hexfield__label {
+ opacity: 0;
+ }
+ }
+
+ .sheet-hexfield {
+ position: absolute;
+ top: 37px;
+
+ &--nat {
+ left: 27px;
+ }
+
+ &--mod {
+ top: 9px;
+ left: 43px;
+
+ .sheet-hexfield__label {
+ color: $c-text-lightest;
+ }
+
+ .sheet-hexfield__input:not(:placeholder-shown) {
+ ~ .sheet-hexfield__label {
+ color: $c-text-light;
+ }
+ }
+ }
+
+ &--wd {
+ left: 59px;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_augmentations.scss b/Savage Worlds - Graph Paper/source/styles/_augmentations.scss
new file mode 100644
index 0000000000..3512ac830d
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_augmentations.scss
@@ -0,0 +1,66 @@
+.sheet-toggle--strain {
+ &:checked ~ .sheet-augmentations {
+ .sheet-augmentations {
+ &__power,
+ &__slots {
+ display: none;
+ }
+ }
+
+ .sheet-a {
+ display: none;
+ }
+
+ .sheet-b {
+ display: inline;
+ }
+ }
+}
+
+.sheet-toggle-augmentation-markers:not(:checked) {
+ ~ .sheet-augmentations .sheet-color-cycle {
+ display: none;
+ }
+}
+
+.sheet-augmentations {
+ .sheet-header__labels span {
+ text-transform: uppercase;
+ }
+
+ &__grade {
+ width: 60px;
+ }
+
+ &__power,
+ &__slots,
+ &__loss {
+ width: 40px;
+ }
+
+ .sheet-b {
+ display: none;
+ }
+
+ .sheet-color-cycle {
+ &__radio {
+ padding: 3px;
+ border: 1px solid transparent;
+
+ &--none {
+ border-color: $c-outline;
+ }
+ }
+ }
+
+ &__multiplier {
+ text-align: left;
+ width: 18px;
+ }
+
+ input.sheet-toggle:not(:checked) {
+ ~ .sheet-augmentations__multiplier {
+ display: none;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_buttons.scss b/Savage Worlds - Graph Paper/source/styles/_buttons.scss
new file mode 100644
index 0000000000..d7d19e06dc
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_buttons.scss
@@ -0,0 +1,84 @@
+.sheet-buttons {
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -4px;
+ width: 274px;
+
+ &::after {
+ content: '';
+ display: block;
+ flex-grow: 1000000;
+ }
+
+ > div,
+ > label {
+ margin: 0 4px;
+ }
+
+ > div {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ flex-grow: 1;
+ white-space: nowrap;
+ border-radius: 2px;
+ margin-bottom: 8px;
+ height: 16px;
+ overflow: hidden;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ display: block;
+ background-color: $c-item;
+ border: 1px dotted $c-outline;
+ border-radius: 2px;
+ width: 100%;
+ height: 100%;
+ }
+ }
+
+ button {
+ flex-shrink: 0;
+ flex-grow: 1;
+ justify-content: center;
+ color: $c-text-lightest;
+ font-size: $fs-s;
+ font-weight: 500;
+ line-height: 16px;
+ padding: 0 4px !important;
+ height: 16px;
+
+ &:hover {
+ background-color: $c-background-dark;
+
+ > span {
+ color: $c-white !important;
+ }
+ }
+ }
+
+ .sheet-dice-roller {
+ input[type=text].sheet-dice-roller__input {
+ flex-grow: 100;
+ width: auto;
+
+ &::placeholder {
+ font-size: $fs-s;
+ }
+ }
+ }
+
+ .sheet-label-toggle {
+ margin-bottom: 8px;
+
+ span {
+ font-size: $fs-s;
+ line-height: 16px;
+ height: 16px;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_color_cycle.scss b/Savage Worlds - Graph Paper/source/styles/_color_cycle.scss
new file mode 100644
index 0000000000..36304a184f
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_color_cycle.scss
@@ -0,0 +1,69 @@
+.sheet-color-cycle {
+ position: relative;
+ height: 16px;
+ width: 16px;
+
+ &__radio {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 1;
+ background-color: transparent;
+ padding: 4px;
+ border-radius: 50%;
+ opacity: 0;
+ transform: translate(-50%, -50%);
+
+ &:checked {
+ opacity: 1;
+
+ & + input {
+ z-index: 3;
+ }
+ }
+
+ &--none,
+ &--novice {
+ z-index: 2;
+
+ &:checked {
+ background-color: transparent;
+ border-color: transparent;
+ }
+ }
+
+ &--red:checked {
+ background-color: $c-red;
+ border-color: $c-red;
+ }
+
+ &--yellow:checked {
+ background-color: $c-yellow;
+ border-color: $c-yellow;
+ }
+
+ &--blue:checked {
+ background-color: $c-blue;
+ border-color: $c-blue;
+ }
+
+ &--green:checked {
+ background-color: $c-green;
+ border-color: $c-green;
+ }
+
+ &--purple:checked {
+ background-color: $c-purple;
+ border-color: $c-purple;
+ }
+
+ &--gray:checked {
+ background-color: $c-gray;
+ border-color: $c-gray;
+ }
+
+ &:last-child:checked {
+ z-index: 1;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_encumbrance.scss b/Savage Worlds - Graph Paper/source/styles/_encumbrance.scss
new file mode 100644
index 0000000000..10345b6df0
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_encumbrance.scss
@@ -0,0 +1,78 @@
+.sheet-encumbrance {
+ display: flex;
+ text-align: center;
+ margin: 16px 0 24px;
+ width: 266px;
+
+ .sheet-label {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-transform: uppercase;
+ height: 16px;
+ }
+
+ &__container {
+ &:not(:last-child) {
+ margin-right: 8px;
+
+ .sheet-encumbrance__content {
+ width: 48px;
+ }
+ }
+
+ &--summary {
+ flex-grow: 1;
+ }
+ }
+
+ &__content {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ background-color: $c-white;
+ font-size: $fs-l;
+ border-radius: 2px;
+ height: 32px;
+ overflow: hidden;
+ box-shadow: $shadow;
+
+ span {
+ user-select: none;
+ }
+
+ input[type=text] {
+ border-radius: 2px;
+
+ &:hover {
+ background-color: $c-background-hover;
+ }
+
+ &:focus {
+ background-color: $c-item;
+ font-size: 16px !important;
+ font-weight: 700;
+ height: 100%;
+ width: 100%;
+
+ ~ * {
+ display: none;
+ }
+ }
+ }
+
+ &--summary {
+ flex-direction: row-reverse;
+
+ > div {
+ padding: 0 4px;
+ }
+
+ input[type=text],
+ span {
+ font-size: $fs-l;
+ width: 32px;
+ }
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_engrams.scss b/Savage Worlds - Graph Paper/source/styles/_engrams.scss
new file mode 100644
index 0000000000..8089be9ce5
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_engrams.scss
@@ -0,0 +1,12 @@
+.sheet-engrams {
+ &__penalty {
+ width: 40px;
+ padding-right: 8px;
+ }
+
+ &__description {
+ flex-shrink: 0;
+ text-align: left;
+ width: 280px;
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_extra_sheet.scss b/Savage Worlds - Graph Paper/source/styles/_extra_sheet.scss
new file mode 100644
index 0000000000..009d6fb330
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_extra_sheet.scss
@@ -0,0 +1,245 @@
+.sheet-extra {
+ width: 100%;
+
+ .sheet-buttons {
+ padding-bottom: 1px;
+ width: 100%;
+
+ > div {
+ margin-right: 8px;
+ }
+ }
+
+ .sheet-block {
+ margin-top: 16px;
+ }
+
+ .sheet-simple-trait {
+ &:not(:last-child) {
+ margin-right: 8px;
+ }
+ }
+
+ &-meta {
+ display: flex;
+ margin-bottom: 19px;
+
+ .sheet-meta-field:first-child {
+ flex-grow: 1;
+ }
+
+ .sheet-meta-field input[type=text].sheet-meta-field__input--name {
+ width: 100%;
+ }
+ }
+
+ .sheet-features {
+ margin-top: 16px;
+ }
+
+ .repcontainer {
+ &:empty ~ .repcontrol .repcontrol_add::before {
+ width: 474px;
+ }
+ }
+
+ .sheet-footer {
+ opacity: 0;
+ }
+
+ .sheet-quick-notes {
+ width: 100%;
+
+ &__content {
+ padding-bottom: 0;
+ }
+ }
+}
+
+.sheet-extra-attributes {
+ position: relative;
+
+ .sheet-container {
+ display: flex;
+ padding-top: 8px;
+ }
+}
+
+.sheet-extra-skills {
+ position: relative;
+
+ .sheet-container {
+ display: flex;
+ flex-wrap: wrap;
+ padding-top: 8px;
+
+ &::after {
+ content: '';
+ display: block;
+ flex-grow: 1000000;
+ }
+ }
+
+ &__selection-toggle {
+ &::after {
+ position: absolute;
+ top: 2px;
+ right: 20px;
+ display: block;
+ font-family: Pictos;
+ font-size: 10px;
+ line-height: 14px;
+ }
+
+ &:hover::after {
+ color: $c-text-light !important;
+ }
+
+ &:checked {
+ ~ .sheet-container .sheet-simple-trait {
+ display: none;
+ }
+
+ ~ .sheet-container {
+ justify-content: space-between;
+ }
+
+ &::after {
+ content: '3';
+ color: $c-text-light;
+ }
+ }
+
+ &:not(:checked) {
+ ~ .sheet-container .sheet-extra-skills__toggle-label {
+ display: none;
+ }
+
+ &::after {
+ content: 'W';
+ color: $c-text-lightest;
+ }
+ }
+ }
+
+ &__toggle {
+ &-label {
+ flex-shrink: 0;
+ width: auto;
+ }
+
+ // Outer checkbox
+ &:not(:checked) + .sheet-simple-trait {
+ display: none;
+ }
+
+ // Inner checkbox
+ + span {
+ user-select: none;
+ display: block;
+ color: $c-text-lightest;
+ font-size: 11px;
+ font-weight: 500;
+ line-height: 24px;
+ text-transform: capitalize;
+ white-space: nowrap;
+ padding: 0 4px;
+ }
+
+ &:hover + span {
+ color: $c-text-lighter;
+ }
+
+ &:checked + span {
+ color: $c-text;
+ }
+ }
+}
+
+.sheet-extra-secondary {
+ .sheet-container {
+ display: flex;
+ align-items: flex-start;
+ justify-content: center;
+ padding-top: 8px;
+ }
+
+ &__field {
+ flex-grow: 1;
+ width: auto;
+
+ &:not(:last-child) {
+ margin-right: 8px;
+ }
+
+ .sheet-label {
+ color: $c-text-lightest;
+ font-weight: 500;
+ line-height: 16px;
+ text-align: center;
+ text-transform: uppercase;
+ letter-spacing: -0.1px;
+ height: 16px;
+ }
+ }
+
+ input[type=text] {
+ line-height: 24px;
+
+ &::placeholder {
+ font-size: $fs-s;
+ line-height: 24px;
+ }
+ }
+
+ input[type=text].sheet-extra-secondary__input,
+ &__field > span {
+ display: block;
+ background-color: $c-white;
+ font-weight: 500;
+ text-align: center;
+ border: 1px solid $c-outline;
+ border-radius: 2px;
+ height: 24px;
+ width: 100%;
+ }
+
+ .sheet-simple-trait__expand {
+ border-color: $c-outline;
+ }
+
+ .sheet-divider {
+ border-right: 1px dotted $c-outline;
+ margin: 0 10px 0 2px;
+ height: 24px;
+ }
+}
+
+.sheet-extra-settings {
+ display: flex;
+ padding: 8px 0;
+ margin-top: 15px !important;
+ border-top: 1px dotted $c-outline;
+
+ &__item {
+ user-select: none;
+ line-height: 16px;
+ width: auto;
+
+ &:not(:last-child) {
+ margin-right: 8px;
+ }
+
+ span {
+ color: $c-text-gray;
+ font-size: $fs-s;
+ font-weight: 500;
+ }
+ }
+
+ input[type=checkbox]:checked {
+ ~ span {
+ color: $c-text-lighter;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_features.scss b/Savage Worlds - Graph Paper/source/styles/_features.scss
new file mode 100644
index 0000000000..40315c1135
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_features.scss
@@ -0,0 +1,164 @@
+.sheet-features {
+ position: relative;
+ flex-grow: 1;
+
+ fieldset,
+ .repcontainer {
+ display: flex;
+ flex-wrap: wrap;
+ padding: 4px 0;
+ margin: 0 -4px;
+
+ &::after {
+ content: '';
+ display: block;
+ flex-grow: 1000000;
+ }
+
+ > * {
+ opacity: .6;
+ transition-delay: .4s;
+ transition: opacity .3s ease-in-out;
+ }
+
+ &:hover > * {
+ opacity: 1;
+ }
+ }
+
+ .repitem {
+ flex-grow: 1;
+ margin-top: 0;
+ }
+
+ .sheet-repitem {
+ position: relative;
+ display: flex;
+ padding-right: 6px;
+ margin: 4px;
+ width: auto;
+ }
+
+ .sheet-color-cycle__radio {
+ top: 1px;
+ left: 1px;
+ align-items: center;
+ padding: 0;
+ height: 14px;
+ width: 14px;
+ opacity: 1;
+ transform: none;
+
+ &::after {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: $fs-s;
+ font-weight: 700;
+ line-height: 1;
+ height: 100%;
+ width: 100%;
+ border-radius: 2px 0 0 2px;
+ }
+
+ &--novice:checked::after {
+ content: 'N';
+ background-color: rgba(0, 0, 0, .05);
+ color: $c-text-light;
+ }
+
+ &--seasoned:checked::after {
+ content: 'S';
+ background-color: $c-green;
+ color: $c-white;
+ }
+
+ &--veteran:checked::after {
+ content: 'V';
+ background-color: $c-blue;
+ color: $c-white;
+ }
+
+ &--heroic:checked::after {
+ content: 'H';
+ background-color: $c-purple;
+ color: $c-white;
+ }
+
+ &--legendary:checked::after {
+ content: 'L';
+ background-color: $c-yellow;
+ color: $c-white;
+ }
+
+ &--augmentation:checked::after {
+ content: 'A';
+ background-color: $c-background-dark;
+ color: $c-white;
+ }
+
+ &--dot:checked::after {
+ content: '';
+ background-color: $c-text-light;
+ border: 4px solid $c-item;
+ border-radius: 50%;
+ height: 14px;
+ width: 14px;
+ }
+
+ &--hindrance:checked::after {
+ content: '*';
+ background-color: $c-dark-red;
+ color: $c-white;
+ font-family: Pictos;
+ }
+
+ &--disabled:checked {
+ &::after {
+ content: 'e';
+ font-size: $fs-l;
+ font-family: Pictos;
+ }
+
+ ~ *,
+ &::after {
+ color: $c-text-lightest;
+ text-shadow: 0 0 3px $c-white, 0 0 3px $c-white, 0 0 3px $c-white, 0 0 3px $c-white;
+ }
+
+ ~ .sheet-features__inner-background {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: 0;
+ background: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/unskilled_bg.png') repeat;
+ }
+ }
+ }
+
+ input[type=text].sheet-features__name {
+ z-index: 1;
+ line-height: 16px;
+ margin-left: 20px;
+ }
+
+ $sizes: 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96,
+ 100, 104, 108, 112,116, 120, 124, 128, 132, 136, 140, 144, 148, 152,
+ 156, 160, 164, 168, 172, 176, 180;
+
+ @each $s in $sizes {
+ input[value="#{$s}"] + input {
+ width: #{$s}px;
+ }
+ }
+
+ .repcontainer.editmode {
+ .itemcontrol {
+ margin: 4px;
+ width: calc(100% - 8px) !important;
+ max-height: 16px;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_footer_section.scss b/Savage Worlds - Graph Paper/source/styles/_footer_section.scss
new file mode 100644
index 0000000000..b5b10d5d05
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_footer_section.scss
@@ -0,0 +1,8 @@
+.sheet-footer-section {
+ margin-top: 23px;
+
+ .sheet-right {
+ width: 330px;
+ padding-left: 64px;
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_general.scss b/Savage Worlds - Graph Paper/source/styles/_general.scss
new file mode 100644
index 0000000000..aeb275746b
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_general.scss
@@ -0,0 +1,688 @@
+// #############################################################################
+// BASIC SETUP
+// #############################################################################
+*,
+::before,
+::after {
+ box-sizing: border-box;
+}
+
+p {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ margin: 0 0 8px 0;
+}
+
+ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+
+ li b:first-child {
+ display: inline-block;
+ padding-right: 8px;
+ min-width: 96px;
+ }
+}
+
+textarea,
+select,
+button,
+fieldset,
+input,
+option,
+label {
+ display: flex;
+ background-color: transparent;
+ background-image: none;
+ font-family: inherit;
+ font-weight: 400;
+ text-decoration: none;
+ padding: 0;
+ margin: 0;
+ border: 0;
+ border-radius: 0;
+ outline: 0 !important;
+ min-width: 0;
+ box-shadow: none;
+ appearance: none;
+ -moz-appearance: none;
+ -webkit-appearance: none;
+
+ &::placeholder {
+ color: $c-text-gray;
+ }
+}
+
+button,
+label,
+input[type=checkbox],
+input[type=radio] {
+ cursor: pointer;
+}
+
+button,
+button > span {
+ &:hover,
+ &:hover > span {
+ color: $c-text-hover !important;
+ }
+}
+
+button[type=action] {
+ color: $c-text-light;
+ font-size: $fs-s;
+ font-weight: 500;
+ line-height: 1;
+}
+
+input[type=text]:not(.sheet-hex) {
+ background-color: transparent;
+ color: $c-text;
+ font-size: $fs-s;
+ line-height: 20px;
+ text-overflow: ellipsis;
+
+ &::placeholder {
+ font-size: $fs-xs;
+ line-height: 20px;
+ }
+
+ &:not(.sheet-align-left) {
+ text-align: center;
+ }
+}
+
+input[type=hidden] {
+ display: none;
+}
+
+textarea {
+ color: $c-text-light;
+ font-size: 9px;
+ line-height: 1.6;
+ width: 100%;
+ resize: none;
+}
+
+input[type=checkbox].sheet-checkbox {
+ background-color: $c-white;
+ border: 1px solid $c-text-lighter;
+ border-radius: 2px;
+ height: 10px;
+ width: 10px;
+
+ &::before {
+ content: '';
+ display: block;
+ border-radius: 1px;
+ margin: 1px 0 0 1px;
+ height: 6px;
+ width: 6px;
+ }
+
+ &:checked::before {
+ background-color: $c-text-lighter;
+ }
+}
+
+.sheet-wrapper {
+ text-align: center;
+}
+
+.sheet-body {
+ color: $c-text;
+ font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-size: $fs-s;
+ line-height: 1;
+ text-align: left;
+ background: {
+ image: linear-gradient(to right, #fbfbfb 1px, transparent 1px),
+ linear-gradient(to bottom, #fbfbfb 1px, transparent 1px);
+ size: 8px 8px;
+ position: -1px -1px;
+ }
+ padding-top: 8px;
+ margin: 0 auto;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+
+ > div {
+ margin: 0 auto;
+ }
+
+ ~ rolltemplate {
+ display: none;
+ }
+}
+
+.sheet-variant-radio {
+ display: inline-block;
+
+ &::after {
+ content: '';
+ display: inline-block;
+ padding: 3px;
+ border: 1px solid $c-outline;
+ border-radius: 50%;
+ }
+
+ &:checked::after {
+ background-color: $c-outline;
+ }
+
+ &--wildcard:checked ~ .sheet-body {
+ width: 800px;
+
+ .sheet-extra {
+ display: none;
+ }
+ }
+
+ &--extra:checked ~ .sheet-body {
+ width: 474px;
+
+ .sheet-wildcard {
+ display: none;
+ }
+ }
+}
+
+.sheet-wildcard {
+ .sheet-section {
+ display: flex;
+ justify-content: space-between;
+
+ > .sheet-left {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 0;
+ width: 470px;
+ }
+
+ > .sheet-right {
+ flex-grow: 1;
+ }
+ }
+}
+
+// #############################################################################
+// GENERICS & COMMON
+// #############################################################################
+
+.sheet-hidden {
+ display: none;
+}
+
+.sheet-block {
+ position: relative;
+ margin-top: 40px;
+}
+
+.sheet-header {
+ display: flex;
+ justify-content: space-between;
+ padding-bottom: 4px;
+ border-bottom: 1px dotted $c-outline;
+ height: 16px;
+
+ &__title {
+ display: block;
+ flex-grow: 1;
+ color: $c-text-light;
+ font-size: $fs-l;
+ font-weight: 700;
+ text-transform: uppercase;
+ }
+
+ &__labels {
+ display: flex;
+ align-items: flex-end;
+ line-height: .5;
+ text-align: center;
+ text-transform: uppercase;
+ padding-right: 16px;
+
+ > span {
+ display: block;
+ }
+ }
+}
+
+.sheet-label,
+.sheet-header__labels * {
+ color: $c-text-lightest;
+ font-size: $fs-xs;
+}
+
+.sheet-large-label {
+ color: $c-text-light;
+ font-size: $fs-l;
+ font-weight: 700;
+ text-transform: uppercase;
+}
+
+.sheet-footer {
+ color: $c-text-light;
+ line-height: 16px;
+ height: 16px;
+}
+
+.sheet-toggle {
+ &:not(:checked):not(.sheet-toggle--special) + *,
+ &:not(:checked):not(.sheet-toggle--special) ~ .repcontainer,
+ &:not(:checked):not(.sheet-toggle--special) ~ .repcontrol {
+ display: none;
+ }
+
+ &::after {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: $c-text-lighter;
+ line-height: 1;
+ width: 16px;
+ }
+
+ &:checked::after {
+ color: $c-text-light;
+ }
+
+ &--block {
+ display: none;
+ }
+
+ &--visibility {
+ position: absolute;
+ top: 4px;
+ right: 0;
+
+ &::after {
+ content: '`';
+ color: $c-text-gray;
+ font-size: $fs-s;
+ font-family: Pictos;
+ height: 10px;
+ }
+
+ &:checked::after {
+ color: $c-text-gray;
+ }
+
+ &:checked::after {
+ content: 'J';
+ }
+ }
+
+ &--arrow {
+ position: absolute;
+ right: 0;
+ top: 0;
+
+ &::after {
+ content: '►';
+ font-size: $fs-xs;
+ line-height: 20px;
+ height: 20px;
+ width: 20px;
+ transform-origin: 9px 10px;
+ transition: transform .3s ease-in-out;
+ }
+
+ &:checked::after {
+ transform: rotate(90deg);
+ }
+ }
+
+ &--settings,
+ &--note-box,
+ &--loss {
+ &::after {
+ color: $c-text-lightest;
+ font-family: Pictos;
+ font-size: $fs-s;
+ padding-top: 1px;
+ width: 10px;
+ }
+ }
+
+ &--settings {
+ &::after {
+ content: 'y';
+ }
+ }
+
+ &--note-box {
+ &::after {
+ content: 'n';
+ }
+ }
+
+ &--loss {
+ &::after {
+ content: 'Q';
+ }
+ }
+
+ &--weight {
+ &::after {
+ content: 'V';
+ color: $c-text-lightest;
+ font-family: Pictos;
+ font-size: $fs-l;
+ padding-top: 1px;
+ width: 10px;
+ transform: rotateZ(-90deg) scaleX(0.75);
+ }
+ }
+
+ &--spoiler {
+ &::after {
+ content: '&';
+ color: $c-text-light;
+ font-family: Pictos;
+ font-size: 10px;
+ height: 100%;
+ }
+
+ &:checked::after {
+ content: '_';
+ }
+ }
+
+ &--list-roll {
+ &:not(:checked) ~ .sheet-repitem__skill-roll {
+ display: none;
+ }
+ }
+}
+
+.sheet-radio-track {
+ position: relative;
+ flex-shrink: 0;
+ background-color: $c-white;
+ box-shadow: $shadow;
+
+ &::before {
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: $c-white;
+ font-size: 9px;
+ height: 100%;
+ width: 100%;
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ display: block;
+ border-radius: inherit;
+ height: 0;
+ width: 0;
+ transform: translate(-50%, -50%);
+ transition: height .3s ease-in-out,
+ width .3s ease-in-out,
+ background-color .1s ease-in-out;
+ }
+
+ &:hover::after,
+ &:hover ~ .sheet-radio-track:not(:checked)::after {
+ background-color: $c-background-hover;
+ height: 60%;
+ width: 60%;
+ }
+
+ &:checked {
+ &::after,
+ ~ .sheet-radio-track:not(:checked)::after {
+ background-color: $c-background-dark;
+ height: 100%;
+ width: 100%;
+ transition-duration: .1s;
+ }
+ }
+}
+
+.sheet-tooltip {
+ pointer-events: none;
+ position: absolute;
+ display: flex;
+ align-items: center;
+ background-color: $c-background-tooltip;
+ color: $c-white;
+ font-size: $fs-s;
+ line-height: 1;
+ padding: 2px 6px;
+ border-radius: 2px;
+ opacity: 0;
+ transition: opacity .3s ease-in-out;
+
+ span:not(:last-child) {
+ margin-right: 2px;
+ }
+
+ // Arrow
+ &::after {
+ content: '';
+ position: absolute;
+ height: 10px;
+ width: 10px;
+ }
+
+ &--left {
+ top: 50%;
+ left: -6px;
+ transform: translate(-100%, -50%);
+
+ &::after {
+ top: 50%;
+ right: -8px;
+ border: 5px solid transparent;
+ border-left-color: $c-background-tooltip;
+ transform: translateY(-50%);
+ }
+ }
+
+ &--top {
+ top: -6px;
+ left: 50%;
+ transform: translate(-50%, -100%);
+
+ &::after {
+ bottom: -8px;
+ left: 50%;
+ border: 5px solid transparent;
+ border-top-color: $c-background-tooltip;
+ transform: translateX(-50%);
+ }
+ }
+}
+
+.sheet-damage-roll-toggle {
+ &-label {
+ display: block;
+ line-height: 4px;
+ text-align: center;
+ padding-right: 10px;
+
+ input[type=checkbox]:checked ~ span {
+ color: $c-text-light;
+ font-weight: 500;
+ }
+
+ .sheet-icon {
+ display: inline-block;
+ font-family: Pictos;
+ font-size: $fs-s;
+ margin-right: 4px;
+ }
+ }
+
+ ~ .repcontainer .sheet-damage-button-overlay {
+ position: relative;
+
+ button[type=roll] {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ display: block;
+ height: 100%;
+ width: 100%;
+ }
+ }
+
+ &:checked ~ .repcontainer .sheet-damage-button-overlay {
+ button[type=roll] {
+ z-index: 1;
+ }
+
+ input[type=text] {
+ position: relative;
+ z-index: 0;
+ font-weight: 500;
+
+ &:placeholder-shown {
+ z-index: 2; // Keeps empty input above button
+ }
+ }
+ }
+}
+
+.sheet-label-toggle {
+ user-select: none;
+ flex-shrink: 0;
+ width: auto;
+
+ input[type=text].sheet-label-toggle__input {
+ background-color: $c-white;
+ color: $c-text-light;
+ line-height: 14px;
+ border: 1px solid $c-background-dark;
+ border-width: 1px;
+ border-radius: 0 2px 2px 0;
+ padding: 0 4px;
+ margin-left: -2px;
+ height: 14px;
+ width: 96px;
+
+ &:first-child {
+ border-left-width: 2px;
+ }
+
+ &--tiny {
+ width: 32px;
+ }
+
+ &::placeholder{
+ line-height: 12px;
+ }
+ }
+
+ span {
+ display: block;
+ flex-shrink: 0;
+ background-color: $c-background-dark;
+ color: $c-white;
+ font-size: $fs-xs;
+ font-weight: 500;
+ line-height: 15px;
+ border-radius: 2px;
+ padding: 0 4px;
+ height: 14px;
+ }
+
+ &--full-row {
+ flex-basis: 100%;
+
+ input[type=text].sheet-label-toggle__input {
+ text-align: left;
+ width: 100%;
+ }
+ }
+
+ input[type=checkbox] {
+ display: none;
+
+ &:not(:checked) {
+ + span {
+ background-color: $c-text-gray;
+ }
+
+ ~ input[type=text].sheet-label-toggle__input {
+ color: $c-text-lightest;
+ border-color: $c-text-gray;
+ }
+ }
+ }
+}
+
+// #############################################################################
+// SETTING TOGGLES
+// #############################################################################
+
+.sheet-toggle-roboto:checked ~ .sheet-body {
+ font-family: $f-roboto;
+}
+
+.sheet-toggle-dark-labels:checked ~ .sheet-body {
+ .sheet-header__labels *,
+ .sheet-label,
+ .sheet-hexfield__label {
+ color: $c-text-light !important;
+ }
+}
+
+.sheet-toggle-skill-die-numbers:not(:checked) ~ .sheet-body {
+ .sheet-radio-track::before {
+ display: none;
+ }
+}
+
+.sheet-toggle-corners:not(:checked) ~ .sheet-body {
+ :not(.sheet-icon):not(.sheet-color-cycle__radio) {
+ border-radius: 0 !important;
+
+ &::before,
+ &::after {
+ border-radius: 0 !important;
+ }
+ }
+}
+
+.sheet-toggle-transitions:not(:checked) ~ .sheet-body {
+ *,
+ ::before,
+ ::after {
+ transition-duration: 0s !important;
+ }
+}
+
+.sheet-toggle-delays:not(:checked) ~ .sheet-body {
+ *,
+ ::before,
+ ::after {
+ transition-delay: 0s !important;
+ }
+}
+
+.sheet-toggle-grid:not(:checked) ~ .sheet-body {
+ background: none;
+}
+
+.sheet-toggle-description-input:not(:checked) ~ .repcontainer {
+ .sheet-roll-description {
+ display: none;
+ }
+}
+
+.sheet-toggle-injection-input:not(:checked) ~ .repcontainer {
+ .sheet-roll-injection {
+ display: none;
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_header_section.scss b/Savage Worlds - Graph Paper/source/styles/_header_section.scss
new file mode 100644
index 0000000000..d0b6c25e68
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_header_section.scss
@@ -0,0 +1,9 @@
+.sheet-header-section {
+ padding-top: 8px;
+
+ .sheet-left {
+ position: relative;
+ display: flex;
+ flex-grow: 1;
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_health.scss b/Savage Worlds - Graph Paper/source/styles/_health.scss
new file mode 100644
index 0000000000..33a4ba540d
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_health.scss
@@ -0,0 +1,284 @@
+$box-size: 24px;
+$box-margin: 8px;
+
+.sheet-health {
+ position: relative;
+ display: flex;
+ align-items: flex-end;
+
+ > .sheet-hex {
+ order: 2;
+ }
+
+ .sheet-header__title {
+ margin-top: 8px;
+ }
+
+ &:hover {
+ .sheet-health__icons * {
+ opacity: 1;
+ }
+ }
+
+ &__icons {
+ display: flex;
+
+ .sheet-icon {
+ color: $c-text-lightest;
+ font-size: $fs-s;
+ line-height: 1;
+ opacity: 0;
+ transition: opacity .3s ease-in-out;
+ transition-delay: .4s;
+
+ &:checked {
+ color: $c-white;
+ opacity: 1;
+
+ &::after {
+ background-color: $c-background-dark;
+ border: 1px solid $c-background-dark;
+ }
+ }
+
+ &:not(:last-child) {
+ margin-right: 8px;
+ }
+
+ &::after {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: $c-white;
+ font-family: Pictos;
+ border: 1px dotted $c-outline;
+ border-radius: 50%;
+ margin: 2px 2px 6px;
+ height: 20px;
+ width: 20px;
+ }
+
+ &--shield::after {
+ content: 'b';
+ }
+
+ &--bug::after {
+ content: 'i';
+ }
+
+ &--fire::after {
+ content: 'r';
+ font-family: 'Pictos Custom';
+ }
+
+ &--hit::after {
+ content: 't';
+ font-family: 'Pictos Custom';
+ }
+
+ &--lightning::after {
+ content: 'e';
+ }
+
+ &--cancel::after {
+ content: 'd';
+ }
+
+ &--rad::after {
+ content: 'l';
+ }
+
+ &--tools::after {
+ content: 'x';
+ }
+
+ &--ecg::after {
+ content: 'Y';
+ }
+ }
+ }
+
+ &__track {
+ position: relative;
+ display: flex;
+
+ .sheet-radio-track,
+ .sheet-reset-button {
+ border-radius: 2px;
+ margin-right: $box-margin;
+ height: $box-size;
+ width: $box-size;
+ }
+
+ &:hover .sheet-reset-button:not(:checked),
+ &:hover .sheet-radio-track-toggle {
+ opacity: 1;
+ transition-delay: .4s;
+ }
+
+ .sheet-reset-button {
+ position: absolute;
+ z-index: 2;
+ opacity: 0;
+ transition: opacity .3s ease-in-out;
+
+ &::after {
+ content: '*';
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: $c-background-dark;
+ color: $c-white;
+ font-family: Pictos;
+ line-height: 1;
+ border-radius: 2px;
+ height: 100%;
+ width: 100%;
+ }
+
+ &:checked {
+ display: none;
+ }
+ }
+
+ .sheet-radio-track-toggle {
+ position: absolute;
+ top: 24px;
+ z-index: 2;
+ height: 16px;
+ width: $box-size;
+ opacity: 0;
+ transition: opacity .3s ease-in-out;
+
+ &::before,
+ &::after {
+ content: '';
+ background-color: rgba(0, 0, 0, .1);
+ height: 4px;
+ width: 50%;
+ }
+
+ &::after {
+ background-color: rgba(0, 0, 0, .05);
+ }
+
+ &:checked {
+ flex-direction: row-reverse;
+ }
+
+ &:checked + input {
+ background: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/unskilled_bg.png') repeat;
+
+ &::before,
+ &::after {
+ display: none;
+ }
+ }
+ }
+ }
+
+ &__wounds {
+ order: 1;
+
+ .sheet-health__track {
+ flex-direction: row-reverse;
+ justify-content: flex-end;
+ }
+
+ .sheet-radio-track--6 {
+ margin-right: 0;
+ }
+
+ .sheet-radio-track-toggle {
+ &--6 {
+ left: 5 * ($box-size + $box-margin);
+ }
+
+ &--5 {
+ left: 4 * ($box-size + $box-margin);
+ }
+
+ &--4 {
+ left: 3 * ($box-size + $box-margin);
+ }
+
+ &--3 {
+ left: 2 * ($box-size + $box-margin);
+ }
+
+ &--2 {
+ left: $box-size + $box-margin;
+ }
+ }
+ }
+
+ &__center {
+ order: 3;
+ position: absolute;
+ left: 185px;
+
+ .sheet-hexfield {
+ position: absolute;
+ bottom: 8px;
+ transform: translateY(100%);
+
+ &--wound-mitigation {
+ left: 1px;
+ }
+
+ &--rads {
+ left: 33px;
+ }
+ }
+ }
+
+ .sheet-hex--64 {
+ margin: 0 4px;
+
+ &::after {
+ content: '';
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: {
+ image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/skull.png');
+ repeat: no-repeat;
+ size: 32px;
+ position: center;
+ }
+ height: 100%;
+ width: 100%;
+ opacity: .15;
+ }
+
+ &:checked::after {
+ opacity: .5;
+ }
+ }
+
+ &__fatigue {
+ order: 4;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+
+ .sheet-reset-button {
+ right: 0;
+ margin: 0;
+ }
+
+ .sheet-radio-track--1 {
+ margin-right: 0;
+ }
+
+ .sheet-radio-track-toggle {
+ &--3 {
+ right: 2 * ($box-size + $box-margin);
+ }
+
+ &--2 {
+ right: $box-size + $box-margin;
+ }
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_hexagons.scss b/Savage Worlds - Graph Paper/source/styles/_hexagons.scss
new file mode 100644
index 0000000000..e75fd8e355
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_hexagons.scss
@@ -0,0 +1,50 @@
+.sheet-hex {
+ position: relative;
+ display: block; // For attribute spans
+ background: {
+ repeat: no-repeat;
+ position: center;
+ }
+ color: $c-text-light;
+ font-weight: 700;
+ text-align: center;
+ padding: 0 6px;
+ filter: drop-shadow(rgba(0, 0, 0, 0.5) 0px 0px 0.7px);
+
+ &::placeholder {
+ color: $c-text-gray;
+ font-size: inherit;
+ font-weight: inherit;
+ line-height: inherit;
+ }
+
+ &--36 {
+ background: {
+ image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/hexagon_36.svg');
+ }
+ font-size: $fs-l;
+ line-height: 36px;
+ height: 36px !important; // Overwrite Roll20!
+ width: 36px;
+ }
+
+ &--48 {
+ background: {
+ image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/hexagon_48.svg');
+ }
+ font-size: 16px !important;
+ line-height: 48px;
+ height: 48px !important; // Overwrite Roll20!
+ width: 48px;
+ }
+
+ &--64 {
+ background: {
+ image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/hexagon_64.svg');
+ }
+ font-size: 18px !important; // Overwrite Roll20!
+ line-height: 64px;
+ height: 64px !important; // Overwrite Roll20!
+ width: 64px;
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_hexfields.scss b/Savage Worlds - Graph Paper/source/styles/_hexfields.scss
new file mode 100644
index 0000000000..416030017a
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_hexfields.scss
@@ -0,0 +1,89 @@
+div:not(:hover) > .sheet-hide-until-needed,
+div.sheet-health:not(:hover) .sheet-health__center .sheet-hexfield {
+ > div,
+ > input {
+ opacity: 0;
+ }
+
+ input:hover,
+ input:focus {
+ opacity: 1;
+
+ ~ div,
+ ~ input {
+ opacity: 1;
+ }
+ }
+}
+
+.sheet-hexfield {
+ position: relative;
+ white-space: nowrap;
+ color: $c-text-light;
+ height: 36px;
+ width: 36px;
+ transition: color .3s ease-in-out, opacity .3s ease-in-out;
+
+ div,
+ input {
+ transition: color .3s ease-in-out, opacity .3s ease-in-out;
+ transition-delay: .4s;
+ }
+
+ &-gray,
+ &-gray input {
+ color: $c-text-lightest;
+ }
+
+ // Nested Hexfields
+ .sheet-hexfield .sheet-hexfield__label {
+ color: $c-text-lightest;
+ }
+
+ &.sheet-stay-on-input {
+ input:not(:placeholder-shown) {
+ opacity: 1 !important;
+
+ ~ :not(.sheet-exception) {
+ color: $c-text-light;
+ opacity: 1 !important;
+ }
+ }
+ }
+
+ &__label {
+ position: absolute;
+ top: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: flex-end; // Left
+ font-size: 9px !important; // Override Roll20!
+ font-weight: 500;
+ line-height: 10px !important; // Override Roll20!
+ text-transform: uppercase;
+ height: 16px;
+ transform: translateX(-100%); // Left
+
+ &--right {
+ left: 36px;
+ justify-content: flex-start;
+ transform: translateX(0);
+ }
+
+ &--bottom {
+ top: 38px;
+ left: 18px;
+ align-items: flex-start;
+ justify-content: center;
+ transform: translateX(-50%);
+ }
+
+ &--up {
+ top: -18px;
+ left: 18px;
+ align-items: flex-end;
+ justify-content: center;
+ transform: translateX(-50%);
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_integrity.scss b/Savage Worlds - Graph Paper/source/styles/_integrity.scss
new file mode 100644
index 0000000000..2931d477fe
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_integrity.scss
@@ -0,0 +1,118 @@
+.sheet-integrity {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ &__status {
+ width: 320px;
+ }
+
+ &__progress {
+ position: relative;
+ display: flex;
+ justify-content: flex-end;
+ background-color: $c-outline;
+ border-radius: 2px;
+ height: 8px;
+ width: 100%;
+ overflow: hidden;
+
+ &-fill {
+ background-color: $c-background-dark;
+ height: 100%;
+ width: 100%; // Default; will be overwritten!
+ transition: width .3s ease-in-out;
+ }
+ }
+
+ @for $i from 0 through 80 {
+ &__bar-width[value="#{$i}"] {
+ & ~ .sheet-integrity__progress-fill {
+ width: #{$i*4}px;
+ }
+ }
+ }
+
+ &__marker {
+ position: absolute;
+ top: 0;
+ background-color: $c-white;
+ width: 2px;
+ height: 10px;
+ transform: translateX(-50%);
+
+ &--70 {
+ left: 40px;
+ }
+
+ &--60 {
+ left: 80px;
+ }
+
+ &--50 {
+ left: 120px;
+ }
+
+ &--40 {
+ left: 160px;
+ }
+
+ &--30 {
+ left: 200px;
+ }
+
+ &--20 {
+ left: 240px;
+ }
+
+ &--10 {
+ left: 280px;
+ }
+ }
+
+ &__loss-effects {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: $fs-s;
+ margin: 8px 0;
+ height: 16px;
+ width: 100%;
+
+ > span {
+ display: block;
+ color: $c-text-gray;
+ font-weight: 500;
+ white-space: nowrap;
+ transition: color .3s ease-in-out;
+ }
+
+ input[type=checkbox]:checked + span {
+ color: $c-text-light;
+ }
+ }
+
+ &__hexfields {
+ display: flex;
+ align-items: center;
+
+ .sheet-container {
+ position: relative;
+ }
+
+ .sheet-hexfield {
+ position: absolute;
+ bottom: -28px;
+
+ &--integrity-maximum {
+ right: -6px;
+ transform: translateX(-100%);
+ }
+
+ &--integrity-mod {
+ left: -5px;
+ transform: translateX(100%);
+ }
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_inventory.scss b/Savage Worlds - Graph Paper/source/styles/_inventory.scss
new file mode 100644
index 0000000000..e3dbd9bce3
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_inventory.scss
@@ -0,0 +1,26 @@
+.sheet-inventory {
+ position: relative;
+ width: 266px;
+
+ &__amount,
+ &__weight {
+ width: 30px;
+ }
+
+ &__multi {
+ color: $c-text-lightest;
+ line-height: 11px;
+ text-align: center;
+ width: 8px;
+ }
+
+ .sheet-repitem__note-box {
+ width: 268px;
+ }
+
+ .repcontainer {
+ &:empty ~ .repcontrol .repcontrol_add::before {
+ width: 266px;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_meta.scss b/Savage Worlds - Graph Paper/source/styles/_meta.scss
new file mode 100644
index 0000000000..59716ca4f2
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_meta.scss
@@ -0,0 +1,62 @@
+.sheet-meta {
+ width: 472px;
+ margin-bottom: 44px;
+
+ .sheet-container {
+ display: flex;
+
+ &:first-child {
+ margin-bottom: 4px;
+ }
+ }
+
+ .sheet-label {
+ text-transform: uppercase;
+ margin-top: 4px;
+ }
+
+ .sheet-meta-field {
+ &:not(:last-child) {
+ margin-right: 8px;
+ }
+
+ input.sheet-meta-field__input {
+ color: $c-text-lighter;
+ font-weight: 500;
+ line-height: 15px;
+ text-align: left;
+ border-bottom: 1px dotted $c-outline;
+ padding: 0 2px;
+ height: 16px;
+
+ &--name {
+ width: 136px;
+ }
+
+ &--size,
+ &--exp,
+ &--level,
+ &--age,
+ &--bennies {
+ width: 40px;
+ }
+
+ &--height,
+ &--weight {
+ width: 64px;
+ }
+
+ &--eyes,
+ &--hair,
+ &--rank,
+ &--origin,
+ &--gender {
+ width: 64px;
+ }
+
+ &--bits {
+ width: 64px;
+ }
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_notebook.scss b/Savage Worlds - Graph Paper/source/styles/_notebook.scss
new file mode 100644
index 0000000000..987ef33268
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_notebook.scss
@@ -0,0 +1,8 @@
+.sheet-notebook {
+ padding: 8px 0 0 64px;
+
+ textarea {
+ @include note-grid;
+ height: 100%;
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_power.scss b/Savage Worlds - Graph Paper/source/styles/_power.scss
new file mode 100644
index 0000000000..f954135a5f
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_power.scss
@@ -0,0 +1,24 @@
+.sheet-power {
+ position: relative;
+ margin-right: -8px;
+
+ .sheet-header__title {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ transform: translate(-100%, -50%);
+ }
+
+ .sheet-hexfield {
+ position: absolute;
+ bottom: -28px;
+
+ &--power-consumed {
+ left: -2px;
+ }
+
+ &--power-maximum {
+ left: 30px;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_powerarmor.scss b/Savage Worlds - Graph Paper/source/styles/_powerarmor.scss
new file mode 100644
index 0000000000..cf164ef9c9
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_powerarmor.scss
@@ -0,0 +1,17 @@
+.sheet-powerarmors {
+ &__size,
+ &__armor,
+ &__pace,
+ &__mods,
+ &__weight,
+ &__weapons {
+ width: 45px;
+ }
+
+ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/powerarmor_01.png');
+ background-size: contain;
+ margin-top: 4px;
+ height: 56px;
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_powers.scss b/Savage Worlds - Graph Paper/source/styles/_powers.scss
new file mode 100644
index 0000000000..2306cd8536
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_powers.scss
@@ -0,0 +1,42 @@
+input.sheet-toggle--pp {
+ &:checked ~ .sheet-powers {
+ .sheet-a {
+ display: none;
+ }
+
+ .sheet-b {
+ display: inline;
+ }
+ }
+}
+
+.sheet-powers {
+ &__ap,
+ &__pp,
+ &__penalty {
+ width: 40px;
+ }
+
+ &__duration {
+ width: 60px;
+ }
+
+ &__damage,
+ &__range {
+ width: 80px;
+ }
+
+ &__trapping {
+ width: 64px;
+ }
+
+ .sheet-b {
+ display: none;
+ }
+
+ input.sheet-toggle:not(:checked) {
+ ~ .sheet-powers__trapping {
+ display: none;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_quick_notes.scss b/Savage Worlds - Graph Paper/source/styles/_quick_notes.scss
new file mode 100644
index 0000000000..c08ef577f9
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_quick_notes.scss
@@ -0,0 +1,19 @@
+.sheet-quick-notes {
+ position: relative;
+ width: 266px;
+
+ &__content {
+ padding: 8px 0;
+ }
+
+ &__content {
+ textarea {
+ @include note-grid;
+ height: 64px;
+ }
+
+ input[type=checkbox]:checked + textarea {
+ height: 128px;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_repeating.scss b/Savage Worlds - Graph Paper/source/styles/_repeating.scss
new file mode 100644
index 0000000000..152d150adf
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_repeating.scss
@@ -0,0 +1,359 @@
+.sheet-wildcard {
+ button.sheet-repitem__skill-roll--extra {
+ display: none;
+ }
+}
+
+.sheet-extra {
+ button.sheet-repitem__skill-roll--wildcard {
+ display: none;
+ }
+}
+
+fieldset,
+.repcontainer {
+ padding: 6px 0;
+ min-height: 32px;
+}
+
+.repcontainer {
+ &:empty ~ .repcontrol .repcontrol_add::before {
+ content: '+ + +';
+ position: absolute;
+ top: -27px;
+ right: -16px;
+ background-color: $c-background-hover;
+ color: $c-text-lighter;
+ font-size: $fs-s;
+ line-height: 21px;
+ border-radius: 2px;
+ height: 20px;
+ width: 470px;
+ }
+}
+
+.repitem {
+ &:not(:first-child) {
+ margin-top: 4px;
+ }
+
+ input[type=text]::placeholder {
+ line-height: 20px;
+ }
+}
+
+.sheet-repitem {
+ position: relative;
+ background-color: $c-item;
+ border-radius: 2px;
+ width: 100%;
+ box-shadow: $shadow;
+
+ &:not(:last-child) {
+ margin-bottom: 4px;
+ }
+
+ button.sheet-repitem__skill-roll {
+ font-family: Pictos;
+ color: $c-text-light;
+ font-size: $fs-s;
+ height: 16px;
+ line-height: 15px;
+ margin-right: 4px !important;
+ }
+
+ &--full-field textarea {
+ font-size: $fs-s;
+ line-height: 16px;
+ padding: 2px 16px 2px 6px;
+ height: 20px;
+ }
+
+ &__size-radio {
+ position: absolute;
+ right: 0;
+ top: 2px;
+ z-index: 1;
+
+ &--1:not(:checked) {
+ z-index: 2;
+ }
+
+ &:checked {
+ z-index: 0;
+ opacity: 0;
+
+ + input[type=radio] {
+ z-index: 3;
+ }
+ }
+
+ &::after {
+ content: attr(label);
+ display: block;
+ color: $c-text-gray;
+ font-family: Pictos;
+ font-size: 10px;
+ line-height: 15px;
+ text-align: center;
+ height: 16px;
+ width: 16px;
+ }
+
+ &:hover::after {
+ color: $c-text-light;
+ }
+ }
+
+ &__primary,
+ &__secondary {
+ display: flex;
+ align-items: center;
+
+ > input.sheet-stretch {
+ flex-grow: 1;
+ width: auto;
+ }
+ }
+
+ &__primary {
+ position: relative;
+ padding: 0 16px 0 6px;
+ height: 20px;
+
+ .sheet-toggle--note-box {
+ padding-right: 4px;
+
+ &::after {
+ padding-top: 0;
+ }
+ }
+ }
+
+ &__secondary {
+ padding-top: 1px;
+ height: 16px;
+
+ .sheet-toggle:not(:last-of-type) {
+ margin-right: 4px;
+ }
+
+ input[type=text]::placeholder {
+ line-height: 16px;
+ }
+ }
+
+ &__secondary,
+ &__frame {
+ color: $c-text-light;
+ font-size: 9px;
+ margin: 0 6px;
+ border-top: 1px dotted $c-outline;
+
+ input[type=text] {
+ color: $c-text-light;
+ font-size: 9px;
+ line-height: 16px;
+
+ &::placeholder {
+ font-size: 9px !important;
+ }
+ }
+ }
+
+ &__frame {
+ display: flex;
+ height: 64px;
+
+ &-silhouette {
+ background: {
+ repeat: no-repeat;
+ size: 80%;
+ position: center;
+ }
+ height: 100%;
+ width: 64px;
+ opacity: .25;
+
+ &-button {
+ height: 100% !important; // Overwrite Roll20!
+ width: 100%;
+ }
+ }
+
+ &-build {
+ flex-grow: 1;
+ margin-left: 8px;
+ height: 100%;
+
+ textarea {
+ padding-top: 6px;
+ height: 100%;
+ }
+ }
+ }
+
+ &__settings {
+ position: absolute;
+ bottom: 2px;
+ right: -1px;
+ z-index: 3;
+ background-color: $c-item;
+ padding: 4px 6px 0;
+ border: 1px solid #dbdbdb;
+ border-radius: 0 0 2px 2px;
+ border-width: 0 1px 1px;
+ width: calc(100% + 2px);
+ transform: translateY(100%);
+
+ &-content {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ border-top: 1px dotted $c-outline;
+ padding-top: 4px;
+ margin-top: -2px;
+
+ > label {
+ margin-bottom: 4px;
+ }
+
+ > :not(:last-child) {
+ margin-right: 4px;
+ }
+ }
+ }
+
+ &__label {
+ font-weight: 500;
+ margin: 0 4px 0 6px;
+ line-height: 16px;
+
+ &::after {
+ content: ':';
+ }
+ }
+
+ &__note-box {
+ position: absolute;
+ top: 4px;
+ right: -1px;
+ z-index: 3;
+ background-color: $c-item;
+ padding: 4px 6px;
+ border: 1px solid #dbdbdb;
+ border-radius: 2px 2px 0 0;
+ border-width: 1px 1px 0 1px;
+ width: calc(100% + 2px);
+ transform: translateY(-100%);
+
+ textarea {
+ border-bottom: 1px dotted $c-outline;
+ height: 60px;
+ }
+ }
+
+ .sheet-toggle--arrow {
+ &:not(:checked) ~ .sheet-repitem__weapons {
+ display: none;
+ }
+ }
+
+ &__subitem {
+ position: relative;
+
+ .sheet-repitem__primary,
+ input[type=text] {
+ font-size: 9px !important;
+ line-height: 16px;
+ height: 16px;
+ }
+
+ .sheet-repitem__note-box {
+ top: 2px;
+ padding: 4px 6px 2px;
+ }
+ }
+
+ .sheet-repitem__weapons {
+ .sheet-repitem__note-box {
+ right: -7px;
+ width: calc(100% + 14px);
+ }
+
+ .sheet-toggle {
+ &--arrow::after {
+ line-height: 16px;
+ margin: 1px 2px 0 0;
+ height: 16px;
+ width: 16px;
+ transform-origin: 7px 8px;
+ }
+
+ &--note-box::after {
+ padding-top: 1px;
+ }
+ }
+ }
+
+ &__weapons {
+ &-control {
+ &[value='0'] + .sheet-repitem__weapons {
+ display: none;
+ }
+
+ @for $i from 1 through 10 {
+ &[value='#{$i}'] + .sheet-repitem__weapons {
+ .sheet-repitem__subitem:nth-child(-n + #{$i+1}) {
+ @extend %show-weapon-row;
+ }
+ }
+ }
+ }
+
+ %show-weapon-row {
+ display: block;
+ }
+
+ .sheet-header {
+ border-bottom: 1px solid $c-outline;
+
+ &__labels {
+ padding-right: 30px;
+ width: 100%;
+ }
+ }
+
+ .sheet-repitem__subitem {
+ display: none;
+
+ &:not(.sheet-repitem__subitem--1) .sheet-repitem__primary {
+ border-top: 1px solid $c-outline;
+ }
+ }
+
+ .sheet-repitem__primary {
+ margin-right: 6px;
+ padding-right: 10px;
+ }
+
+ &-name {
+ flex-grow: 1;
+ text-align: left;
+ padding-left: 6px;
+ }
+
+ input[type=text].sheet-repitem__weapons-name {
+ padding-left: 0;
+ }
+
+ &-damage,
+ &-range {
+ width: 85px;
+ }
+
+ &-rof {
+ width: 30px;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_reset.scss b/Savage Worlds - Graph Paper/source/styles/_reset.scss
new file mode 100644
index 0000000000..6759944fdf
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_reset.scss
@@ -0,0 +1,160 @@
+.charsheet {
+ padding: 0 !important; // Override Roll20!
+}
+
+.charsheet button[type=roll] {
+ text-shadow: none;
+ font-size: inherit !important; // Override Roll20!
+ padding: 0 !important; // Override Roll20!
+ margin: 0 !important; // Override Roll20!
+
+ &::before {
+ display: none;
+ }
+
+ &:hover,
+ &:focus,
+ &:active {
+ background-color: transparent;
+ box-shadow: none;
+ }
+}
+
+.repcontrol {
+ position: absolute;
+ bottom: -1px;
+ right: 0;
+ z-index: 2;
+ display: flex;
+}
+
+.repcontrol button.btn {
+ position: relative;
+ color: transparent;
+ font-size: 0;
+ height: 16px;
+ width: 16px;
+ transition: color .3s ease-in-out, opacity .3s ease-in-out;
+
+ &::after,
+ &::before {
+ transition: color .3s ease-in-out, opacity .3s ease-in-out;
+ }
+
+ &:hover,
+ &:focus,
+ &:active {
+ background-color: transparent;
+ box-shadow: none;
+ }
+
+ &::after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: $c-text-gray;
+ font-family: Pictos;
+ font-size: 12px;
+ line-height: 1;
+ height: 100%;
+ width: 100%;
+ }
+
+ &:hover::after {
+ color: $c-text-light;
+ }
+
+ &:active::after {
+ color: black;
+ }
+
+ &.repcontrol_add {
+ order: 1;
+
+ &::after {
+ content: '&';
+ }
+ }
+
+ &.repcontrol_edit {
+ order: 2;
+ float: none;
+
+ &::after {
+ content: '_';
+ }
+ }
+}
+
+.repcontainer.editmode {
+ + .repcontrol {
+ button.repcontrol_edit::after {
+ content: '3';
+ }
+ }
+
+ .sheet-repitem__note-box,
+ .sheet-repitem__settings {
+ display: none;
+ }
+
+ .itemcontrol {
+ z-index: 10;
+ display: flex !important; // Override Roll20!
+ justify-content: space-between;
+ background-color: rgba(255, 255, 255, 0.5) !important; // Override Roll20!
+ border-radius: 2px;
+ margin: 0 2px;
+ width: calc(100% - 4px) !important;
+
+ a.repcontrol_move {
+ order: 1;
+ font-size: 18px;
+ border-radius: 2px 0 0 2px;
+ padding: 0 2px 0 0;
+ }
+
+ button.repcontrol_del {
+ order: 2;
+ float: none !important; // Override Roll20!
+ font-family: Pictos;
+ font-size: 12px;
+ border-radius: 0 2px 2px 0;
+ padding: 0 0 0 4px;
+ }
+
+ a.repcontrol_move,
+ button.repcontrol_del {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: $c-white;
+ text-shadow: none;
+ color: $c-text;
+ line-height: 1;
+ border: 0;
+ height: 100%;
+ width: 20px;
+ max-height: 20px;
+ box-shadow: none;
+
+ &:hover {
+ color: black !important;
+ }
+
+ &:active {
+ color: black !important;
+ box-shadow: none;
+ background: $c-white;
+ }
+ }
+ }
+
+ div.repitem:hover .itemcontrol {
+ background-color: rgba(255, 255, 255, 0.7) !important; // Override Roll20!
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_rolltemplates.scss b/Savage Worlds - Graph Paper/source/styles/_rolltemplates.scss
new file mode 100644
index 0000000000..8389ef4a5e
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_rolltemplates.scss
@@ -0,0 +1,261 @@
+.sheet-rolltemplate-TraitRoll,
+.sheet-rolltemplate-DiceRoller {
+ // Use .showtip to increase specificity!
+ // Necessary to override other adjoining classes!
+ .inlinerollresult.showtip {
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ display: block;
+ background-color: $c-background-die;
+ height: 100%;
+ width: 100%;
+ }
+ }
+}
+
+.sheet-rolltemplate-TraitRoll,
+.sheet-rolltemplate-DiceRoller,
+.sheet-rolltemplate-RunRoll,
+.sheet-rolltemplate-DamageRoll,
+.sheet-rolltemplate-InfoBox {
+ color: $c-text;
+ padding-top: 8px;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+
+ .inlinerollresult.showtip {
+ position: relative;
+ z-index: 1;
+ background-color: transparent;
+ padding: 0;
+ border: 0;
+ }
+
+ .sheet-rolltemplate {
+ position: relative;
+ background: {
+ color: $c-white;
+ image: linear-gradient(to right, #fbfbfb 1px, transparent 1px),
+ linear-gradient(to bottom, #fbfbfb 1px, transparent 1px);
+ size: 8px 8px;
+ position: -1px -1px;
+ }
+ padding: 8px;
+ border-radius: 2px;
+ box-shadow: $shadow;
+
+ &__header {
+ font-size: 12px;
+ font-weight: bold;
+ line-height: 16px;
+ text-align: center;
+
+ &:not(:last-child) {
+ border-bottom: 1px dotted $c-outline;
+ padding-bottom: 7px;
+ }
+ }
+
+ &__content {
+ position: relative;
+ font-size: 11px;
+ text-align: center;
+
+ &:not(:first-child) {
+ padding-top: 8px;
+ }
+
+ &:not(:last-child) {
+ border-bottom: 1px dotted $c-outline;
+ padding-bottom: 7px;
+ }
+
+ span {
+ font-size: 11px;
+ }
+
+ span.inlinerollresult {
+ font-weight: 400;
+ }
+ }
+
+ &__content-row {
+ display: flex;
+ align-items: center;
+ line-height: 16px;
+
+ > div {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ }
+
+ > .sheet-left {
+ font-weight: 500;
+ text-align: right;
+ padding-right: 8px;
+ width: 96px;
+ min-width: 96px;
+ }
+
+ > .sheet-right {
+ text-align: left;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ padding: 0 24px 0 8px;
+ }
+ }
+
+ &__dice {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 11px;
+
+ span {
+ display: block;
+ font-size: 11px;
+ line-height: 20px;
+ }
+
+ .sheet-left {
+ display: flex;
+ flex-wrap: wrap;
+ padding-right: 8px;
+ }
+
+ .sheet-right {
+ display: flex;
+ flex-shrink: 0;
+ padding: 0 4px;
+ }
+
+ &--damage {
+ flex-wrap: wrap;
+ }
+ }
+
+ &__roll {
+ flex-shrink: 0;
+ text-align: center;
+ border-radius: 2px;
+ min-width: 20px;
+ margin-top: 8px;
+ overflow: hidden;
+ box-shadow: $shadow;
+
+ &:not(:last-child) {
+ margin-right: 8px;
+ }
+
+ // [original-title*='"basicdiceroll"'] watches for exploding dice!
+ // This only occurs if there is no fullcrit and/or critfail!
+ span:not([original-title*='"basicdiceroll"']).fullcrit {
+ &::before {
+ background-color: $c-outline;
+ }
+ }
+
+ span:not([original-title*='"basicdiceroll"']).fullfail {
+ color: $c-white;
+
+ &::before {
+ background-color: $c-red;
+ }
+ }
+
+ &--wd {
+ height: 20px;
+ transform: rotateZ(45deg);
+
+ &:not(:last-child) {
+ margin-right: 16px;
+ }
+
+ span {
+ transform: rotateZ(-45deg);
+
+ &::before {
+ transform: rotateZ(45deg);
+ }
+ }
+ }
+ }
+
+ &__reroll {
+ position: absolute;
+ top: 2px;
+ right: -4px;
+ font-family: Pictos;
+ border: 4px solid $c-white;
+ }
+
+ &__roll-damage {
+ position: absolute;
+ top: 26px;
+ right: -4px;
+ font-family: 'Pictos Custom';
+ border: 4px solid $c-white;
+ }
+
+ &__button a {
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: $c-item;
+ color: $c-text-lightest;
+ font-size: $fs-s;
+ font-weight: 500;
+ line-height: 9px;
+ border: 1px dotted $c-outline;
+ border-radius: 2px;
+ padding: 0 4px;
+ height: 20px;
+ min-width: 20px;
+
+ &:hover {
+ background-color: $c-background-dark;
+ color: $c-white !important;
+ border: 1px solid $c-background-dark;
+ }
+ }
+ }
+}
+
+.sheet-rolltemplate-TraitRoll,
+.sheet-rolltemplate-DamageRoll {
+ .sheet-rolltemplate {
+ &__description {
+ color: $c-text-light;
+ font-size: 9px;
+ font-style: italic;
+ line-height: 16px;
+ text-align: center;
+ padding: 8px 0 7px;
+ border-bottom: 1px dotted $c-outline;
+ }
+ }
+}
+
+.sheet-rolltemplate-DamageRoll {
+ .sheet-rolltemplate {
+ &__damage-roll {
+ padding-right: 8px;
+ margin: 8px 0 0 8px;
+
+ &:not(:last-child) {
+ border-right: 1px dotted $c-outline;
+ }
+
+ span {
+ font-size: 16px;
+ line-height: 24px;
+ }
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_secondary.scss b/Savage Worlds - Graph Paper/source/styles/_secondary.scss
new file mode 100644
index 0000000000..b4a8cec944
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_secondary.scss
@@ -0,0 +1,35 @@
+.sheet-secondary {
+ display: flex;
+ padding-right: 80px;
+
+ > :not(:last-child) {
+ margin-right: 24px;
+ }
+
+ .sheet-hexfield {
+ &--run {
+ top: -100px;
+ left: -16px;
+ }
+
+ &--flight {
+ top: -64px;
+ left: 16px;
+ }
+
+ &--soak-mod {
+ top: -36px;
+ left: 32px;
+ }
+
+ &--soak-wd {
+ top: -72px;
+ left: 64px;
+ }
+ }
+
+ .sheet-hexfield--soak > button[type=roll] {
+ color: $c-text-light;
+ font-weight: 700;
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_sections.scss b/Savage Worlds - Graph Paper/source/styles/_sections.scss
new file mode 100644
index 0000000000..0c497a41dd
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_sections.scss
@@ -0,0 +1,95 @@
+.sheet-sans {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: flex-start;
+}
+
+.sheet-section > .sheet-right:not(.sheet-sans) {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+}
+
+.sheet-section--footer > .sheet-right {
+ padding-top: 32px;
+}
+
+.sheet-section--traits {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-left: 24px;
+ height: 400px;
+}
+
+.sheet-attributes {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+
+ .sheet-attribute {
+ position: absolute;
+
+ &--agility {
+ top: 0;
+ left: 32px;
+ }
+
+ &--smarts {
+ top: 80px;
+ left: 16px;
+ }
+
+ &--spirit {
+ top: 160px;
+ left: 0;
+ }
+
+ &--strength {
+ top: 240px;
+ left: 16px;
+ }
+
+ &--vigor {
+ top: 320px;
+ left: 32px;
+ }
+ }
+}
+
+.sheet-armor {
+ position: absolute;
+ right: 0;
+ top: 22px;
+}
+
+.sheet-silhouette {
+ position: absolute;
+ top: 0;
+ left: 100px;
+}
+
+.sheet-secondary {
+ position: absolute;
+ bottom: 23px;
+ right: 0;
+ z-index: 2;
+}
+
+.sheet-section--features {
+ display: flex;
+ align-items: flex-start;
+ flex-grow: 1;
+ min-height: 176px;
+ padding: 24px 0 8px;
+}
+
+.sheet-section--resources {
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-between;
+ margin-bottom: 32px;
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_settings.scss b/Savage Worlds - Graph Paper/source/styles/_settings.scss
new file mode 100644
index 0000000000..e92a2c6e32
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_settings.scss
@@ -0,0 +1,192 @@
+.sheet-settings {
+ text-align: center;
+ padding: 8px 0 0 64px;
+
+ &__page {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ text-align: left;
+
+ &-tab {
+ display: inline-block;
+ color: $c-text-lightest;
+ margin-bottom: 7px;
+
+ &::before,
+ &::after {
+ display: inline-block;
+ font-size: $fs-s;
+ font-weight: 500;
+ line-height: 15px;
+ height: 16px;
+ }
+
+ &::before {
+ content: attr(label);
+ }
+
+ &:not(:last-of-type)::after {
+ content: '|';
+ margin: 0 2px 0 4px;
+ }
+
+ &:checked::before {
+ color: $c-text-lighter;
+ }
+
+ &--styles {
+ &:not(:checked) ~ .sheet-settings__page--styles {
+ @extend %hide-disabled-settings-tab;
+ }
+ }
+
+ &--setup {
+ &:not(:checked) ~ .sheet-settings__page--setup {
+ @extend %hide-disabled-settings-tab;
+ }
+ }
+
+ &--blocks {
+ &:not(:checked) ~ .sheet-settings__page--blocks {
+ @extend %hide-disabled-settings-tab;
+ }
+ }
+
+ &--skills {
+ &:not(:checked) ~ .sheet-settings__page--skills {
+ @extend %hide-disabled-settings-tab;
+ }
+ }
+
+ &--help {
+ &:not(:checked) ~ .sheet-settings__page--help {
+ @extend %hide-disabled-settings-tab;
+ }
+ }
+ }
+ }
+
+ %hide-disabled-settings-tab {
+ display: none;
+ }
+
+ &__textarea-toggle {
+ &:not(:checked) + textarea {
+ display: none;
+ }
+ }
+
+ &__item {
+ user-select: none;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ min-height: 16px;
+
+ &:not(:last-child) {
+ margin-bottom: 8px;
+ }
+
+ > span:first-of-type {
+ display: block;
+ flex-grow: 1;
+ color: $c-text-light;
+ font-size: $fs-s;
+ font-weight: 500;
+ line-height: 15px;
+ border-bottom: 1px dotted $c-outline;
+ margin-right: 12px;
+ height: 100%;
+ }
+
+ .sheet-checkbox {
+ margin-right: 4px;
+ }
+
+ &--text-input {
+ > span:first-of-type {
+ flex-grow: 0;
+ flex-shrink: 0;
+ margin-right: 0;
+
+ ~ input[type=text] {
+ padding-left: 5px;
+ }
+ }
+
+ input[type=text] {
+ flex-grow: 1;
+ color: $c-text-light;
+ line-height: 15px;
+ border-bottom: 1px dotted $c-outline;
+ margin-right: 12px;
+ height: 16px;
+ width: auto;
+
+ &::placeholder {
+ font-size: $fs-s;
+ }
+
+ &:last-child {
+ margin-right: 26px;
+ }
+
+ + span:last-of-type {
+ display: block;
+ flex-shrink: 0;
+ color: $c-text-lighter;
+ font-family: Pictos;
+ font-size: 11px;
+ margin: 0 4px 0 1px;
+ height: 16px;
+ width: 9px;
+ }
+ }
+ }
+
+ &--textarea {
+ flex-wrap: wrap;
+
+ textarea {
+ flex-basis: 100%;
+ background-color: $c-white;
+ font-size: $fs-s;
+ line-height: 16px;
+ padding: 4px;
+ border: 1px solid $c-outline;
+ border-radius: 2px;
+ height: 64px;
+ margin: 8px 4px 0 0;
+ transition: border-color .3s ease-in-out,
+ height .3s ease-in-out;
+
+ &:hover {
+ border-color: $c-background-dark;
+ }
+
+ &:focus {
+ border-color: $c-background-dark;
+ height: 192px;
+ }
+ }
+ }
+
+ &--help {
+ flex-wrap: wrap;
+ height: auto;
+
+ > span:first-of-type {
+ margin-right: 8px;
+ }
+
+ .sheet-bottom {
+ user-select: text;
+ flex-basis: 100%;
+ text-align: justify;
+ line-height: 1.6;
+ padding: 4px 0;
+ }
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_silhouette.scss b/Savage Worlds - Graph Paper/source/styles/_silhouette.scss
new file mode 100644
index 0000000000..fce7b4e740
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_silhouette.scss
@@ -0,0 +1,178 @@
+.sheet-toggle-silhouette-markers:not(:checked) {
+ + .sheet-silhouette .sheet-color-cycle {
+ display: none;
+ }
+}
+
+.sheet-silhouette {
+ position: relative;
+ z-index: 1;
+ height: 300px;
+ width: 200px;
+
+ &__image {
+ background: {
+ image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/female_silhouette.png');
+ repeat: no-repeat;
+ size: contain;
+ }
+ height: 100%;
+ width: 100%;
+
+ &:hover ~ .sheet-color-cycle :checked {
+ opacity: 1;
+ transition-delay: 0.4s;
+ }
+ }
+
+ .sheet-color-cycle {
+ position: absolute;
+ transform: translateX(-50%);
+
+ &:hover :checked {
+ opacity: 1;
+ }
+
+ &__radio {
+ border: 2px solid $c-white;
+ opacity: 0;
+ transition: opacity .3s ease-in-out;
+
+ &:not(.sheet-color-cycle__radio--none):checked {
+ opacity: 1;
+ }
+
+ &--none {
+ background-color: #d9d9d9 !important;
+ }
+ }
+ }
+
+ &__head {
+ top: 26px;
+ left: 99px;
+ }
+
+ &__torso-upper {
+ top: 64px;
+ left: 99px;
+ }
+
+ &__torso-lower {
+ top: 100px;
+ left: 99px;
+ }
+
+ &__left-arm-upper {
+ top: 70px;
+ left: 128px;
+ }
+
+ &__left-arm-lower {
+ top: 109px;
+ left: 138px;
+ }
+
+ &__left-hand {
+ top: 134px;
+ left: 142px;
+ }
+
+ &__right-arm-upper {
+ top: 70px;
+ left: 69px;
+ }
+
+ &__right-arm-lower {
+ top: 109px;
+ left: 59px;
+ }
+
+ &__right-hand {
+ top: 134px;
+ left: 55px;
+ }
+
+ &__left-leg-upper {
+ top: 160px;
+ left: 125px;
+ }
+
+ &__left-leg-lower {
+ top: 230px;
+ left: 129px;
+ }
+
+ &__right-leg-upper {
+ top: 160px;
+ left: 72px;
+ }
+
+ &__right-leg-lower {
+ top: 230px;
+ left: 68px;
+ }
+
+ &__switch {
+ position: absolute;
+ bottom: 12px;
+ left: 50%;
+ z-index: 3;
+
+ &::after {
+ content: '[ ]';
+ display: block;
+ color: $c-text-gray;
+ font-family: Pictos;
+ font-size: 8px;
+ transform: translateX(-50%);
+ }
+
+ &:checked + .sheet-silhouette__image {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/male_silhouette.png');
+ }
+
+ // Marker position overwrites
+ &:checked ~ .sheet-silhouette {
+ &__left-arm-upper {
+ top: 70px;
+ left: 141px;
+ }
+
+ &__left-arm-lower {
+ top: 105px;
+ left: 150px;
+ }
+
+ &__left-hand {
+ top: 143px;
+ left: 147px;
+ }
+
+ &__right-arm-upper {
+ top: 70px;
+ left: 56px;
+ }
+
+ &__right-arm-lower {
+ top: 105px;
+ left: 47px;
+ }
+
+ &__right-hand {
+ top: 143px;
+ left: 50px;
+ }
+
+ &__left-leg-upper {
+ top: 172px;
+ left: 126px;
+ }
+
+ &__right-leg-upper {
+ top: 172px;
+ left: 71px;
+ }
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_simple_trait.scss b/Savage Worlds - Graph Paper/source/styles/_simple_trait.scss
new file mode 100644
index 0000000000..4b6a6724e8
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_simple_trait.scss
@@ -0,0 +1,133 @@
+$container-height: 24px;
+
+.sheet-simple-trait {
+ position: relative;
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 11px;
+ line-height: $container-height;
+ padding-right: 6px;
+ border-radius: 2px;
+ height: $container-height;
+ min-width: 66px;
+
+ span {
+ color: $c-text;
+ }
+
+ .sheet-background {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ }
+
+ &__expand {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+ border: 1px solid transparent;
+ border-radius: 2px;
+ height: 100% !important; // Override Roll20!
+ width: 100%;
+ transition: border .3s ease-in-out;
+
+ &:hover,
+ &:checked {
+ border-color: $c-outline;
+ }
+
+ &:checked ~ .sheet-simple-trait__inputs {
+ display: flex;
+ background-color: $c-white;
+ }
+
+ &:checked ~ .sheet-background {
+ background-color: $c-white;
+ }
+ }
+
+ button[type=roll].sheet-simple-trait__roll {
+ padding-left: 6px !important;
+ }
+
+ &__roll {
+ position: relative;
+ z-index: 3;
+ font-size: 11px;
+ font-weight: 500;
+ line-height: $container-height;
+
+ &:hover + .sheet-simple-trait__buttons {
+ pointer-events: all;
+ opacity: 1;
+ transition-delay: .7s;
+ }
+ }
+
+ &__custom-roll {
+ color: $c-text-light;
+ font-size: 10px;
+ font-weight: 500;
+ line-height: 16px;
+
+ &:not(:last-child) {
+ margin-right: 4px !important;
+ }
+ }
+
+ &__buttons {
+ pointer-events: none;
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 4;
+ display: flex;
+ background-color: $c-white;
+ padding: 0 4px;
+ border-radius: 2px;
+ height: 16px;
+ transform: translateY(-100%);
+ opacity: 0;
+ box-shadow: $shadow;
+ transition: opacity .3s ease-in-out;
+
+ &:hover {
+ pointer-events: all;
+ opacity: 1;
+ transition-delay: .7s;
+ }
+ }
+
+ &__label {
+ position: relative;
+ z-index: 1;
+ font-weight: 500;
+ margin-left: 8px;
+ }
+
+ &__inputs {
+ position: absolute;
+ bottom: 1px;
+ left: 0;
+ z-index: 4;
+ display: none;
+ background-color: $c-white;
+ border: 1px solid $c-outline;
+ border-width: 0 1px 1px 1px;
+ border-radius: 0 0 2px 2px;
+ padding: 0 6px;
+ width: 100%;
+ transform: translateY(100%);
+
+ > input[type=text] {
+ text-align: center;
+ border-top: 1px dotted $c-outline;
+ width: 33.3%;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_skills.scss b/Savage Worlds - Graph Paper/source/styles/_skills.scss
new file mode 100644
index 0000000000..732545ab0a
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_skills.scss
@@ -0,0 +1,207 @@
+.sheet-toggle-skill-markers:not(:checked) {
+ + .sheet-skills .sheet-color-cycle {
+ display: none;
+ }
+}
+
+.sheet-skills {
+ position: relative;
+ padding-top: 8px;
+
+ &__lock {
+ &::after {
+ position: absolute;
+ top: 10px;
+ right: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: $c-text-lightest;
+ font-family: Pictos;
+ font-size: 8px;
+ height: 16px;
+ width: 16px;
+ }
+
+ &:not(:checked) {
+ &::after {
+ content: ')';
+ }
+
+ + .sheet-skills__wrapper {
+ .sheet-skills__step-button {
+ display: none;
+ }
+ }
+ }
+
+ &:checked::after {
+ content: '(';
+ }
+
+ &:checked ~ .sheet-skills__wrapper .sheet-skills__track {
+ input {
+ cursor: default;
+ pointer-events: none;
+ }
+ }
+ }
+
+ .sheet-header {
+ justify-content: flex-end;
+ border: none;
+ }
+
+ &__die {
+ width: 18px;
+
+ &:not(.sheet-a) {
+ margin-right: 3px;
+ }
+ }
+
+ &__mod,
+ &__wd {
+ width: 24px;
+ }
+
+ &__mod {
+ margin-right: 3px;
+ }
+
+ &__plus {
+ color: $c-text-gray;
+ font-size: $fs-l;
+ line-height: 1;
+ text-align: center;
+ width: 18px;
+ }
+
+ &__color-marker {
+ width: 16px;
+
+ .sheet-color-cycle__radio {
+ padding: 3px;
+ border: 1px solid transparent;
+
+ &--none {
+ border-color: $c-outline;
+ }
+ }
+ }
+
+ &__skill {
+ display: flex;
+ flex-direction: row-reverse;
+ align-items: center;
+ justify-content: flex-start;
+ height: 16px;
+
+ &:not(:last-child) {
+ margin-bottom: 8px;
+ }
+
+ input[type=text].sheet-skills__mod,
+ input[type=text].sheet-skills__wd {
+ background-color: $c-white;
+ font-size: 9px !important;
+ height: 14px;
+ box-shadow: $shadow;
+
+ &::placeholder {
+ line-height: 14px;
+ }
+
+ &:not(:placeholder-shown) {
+ background-color: $c-background-dark;
+ color: $c-white;
+ }
+ }
+
+ .sheet-skills__mod {
+ border-radius: 2px 0 0 2px;
+ }
+
+ .sheet-skills__wd {
+ border-radius: 0 2px 2px 0;
+ }
+ }
+
+ &__track {
+ display: flex;
+ flex-direction: row-reverse;
+ }
+
+ input[type=radio].sheet-radio-track {
+ height: 14px;
+ width: 18px;
+
+ &:not(:first-of-type) {
+ margin-right: 3px;
+ }
+
+ &:not(.sheet-d4-2):checked::before{
+ content: attr(label);
+ }
+
+ &.sheet-d12 {
+ border-radius: 0 2px 2px 0;
+ }
+
+ &.sheet-d4-2 {
+ border-radius: 2px 0 0 2px;
+
+ &:checked {
+ background: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/unskilled_bg.png') repeat;
+
+ &::after {
+ background-color: transparent;
+ }
+
+ ~ button > span {
+ color: $c-text-lightest; // Untrained skill
+ }
+ }
+ }
+ }
+
+ button[type=roll] {
+ .sheet-tooltip {
+ z-index: 10;
+ white-space: nowrap;
+
+ &--left {
+ text-transform: uppercase;
+ }
+ }
+
+ &:hover .sheet-tooltip {
+ opacity: 1;
+ transition-delay: .4s;
+ }
+ }
+
+ button[type=roll].sheet-skills__step-button {
+ position: relative;
+ margin-right: -18px !important;
+ height: 14px;
+ width: 18px;
+ }
+
+ &__button {
+ position: relative;
+ align-items: center;
+ color: $c-text-light;
+ font-size: $fs-s;
+ font-weight: 500;
+ line-height: 1;
+
+ > span {
+ display: block;
+ padding: 1px 8px 1px 0;
+ max-width: 88px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_tabs.scss b/Savage Worlds - Graph Paper/source/styles/_tabs.scss
new file mode 100644
index 0000000000..eade2317b6
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_tabs.scss
@@ -0,0 +1,81 @@
+.sheet-san-tabs {
+ position: absolute;
+ top: 0;
+ right: 0;
+ border-bottom: 1px dotted $c-outline;
+ height: 16px;
+ width: 266px;
+
+ ~ div {
+ flex-basis: 100%;
+ }
+}
+
+.sheet-tab {
+ ~ div {
+ min-height: 100%;
+ }
+
+ &::after {
+ content: attr(label);
+ position: relative;
+ z-index: 1;
+ display: block;
+ align-items: center;
+ justify-content: center;
+ color: $c-text-lightest;
+ font-size: $fs-s;
+ font-weight: 500;
+ line-height: 1;
+ padding: 3px 6px 0;
+ border: 1px dotted transparent;
+ border-width: 1px 1px 0 1px;
+ border-radius: 2px;
+ height: 16px;
+ transition: none;
+ }
+
+ &:hover::after {
+ color: $c-text-lighter;
+ }
+
+ &:checked::after {
+ background-color: $c-white;
+ color: $c-text-light;
+ border-color: $c-outline;
+ }
+
+ &--skills {
+ margin-left: 72px;
+
+ &:not(:checked) ~ .sheet-skills {
+ @extend %hide-disabled-tab;
+ }
+ }
+
+ &--advancements {
+ &:not(:checked) ~ .sheet-advancements {
+ @extend %hide-disabled-tab;
+ }
+ }
+
+ &--notebook {
+ &:not(:checked) ~ .sheet-notebook {
+ @extend %hide-disabled-tab;
+ }
+
+ ~ .sheet-notebook {
+ height: calc(100% - 64px);
+ }
+ }
+
+ &--settings {
+ &:not(:checked) ~ .sheet-settings {
+ @extend %hide-disabled-tab;
+ }
+ }
+}
+
+%hide-disabled-tab {
+ display: none;
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_trait_section.scss b/Savage Worlds - Graph Paper/source/styles/_trait_section.scss
new file mode 100644
index 0000000000..1b6934d1ef
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_trait_section.scss
@@ -0,0 +1,218 @@
+.sheet-trait-section {
+ > .sheet-left {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 470px;
+ }
+
+ .sheet-section-container--center-top {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-between;
+ padding-bottom: 112px;
+ width: 100%;
+ }
+
+ .sheet-section-container--center-bottom {
+ position: relative;
+ display: flex;
+ align-items: center;
+ padding: 24px 0 32px 0;
+ width: 100%;
+ height: 100%;
+ }
+
+ .sheet-section-container--bottom {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 0 32px;
+ width: 100%;
+ }
+}
+
+.sheet-silhouette {
+ margin-left: -50px;
+}
+
+.sheet-secondary-block {
+ position: absolute;
+ left: 166px;
+ top: 350px;
+ z-index: 2;
+ display: flex;
+ align-items: center;
+ transform: translateY(-50%);
+
+ > *:not(:last-child) {
+ margin-right: 23px;
+ }
+
+ .sheet-hexfield {
+ &:hover .sheet-hexfield * {
+ opacity: 1 !important;
+ transition-delay: 0.4s;
+ }
+
+ .sheet-hexfield {
+ > * {
+ opacity: 0;
+ }
+
+ .sheet-hexfield__trait-field {
+ &:focus {
+ opacity: 1;
+
+ & ~ * {
+ opacity: 1;
+ }
+ }
+ }
+
+ .sheet-hexfield__label {
+ opacity: 0;
+ }
+ }
+
+ .sheet-hexfield--flight {
+ top: -28px;
+ left: 16px;
+
+ .sheet-hexfield__trait-field:not(:placeholder-shown) {
+ opacity: 1;
+
+ & ~ * {
+ opacity: 1;
+ color: $c-text-light;
+ }
+ }
+ }
+
+ .sheet-hexfield--running,
+ .sheet-hexfield--soak-bonus {
+ .sheet-hexfield__trait-field:not(:placeholder-shown) {
+ opacity: 1;
+
+ & + .sheet-hexfield__hexagon {
+ opacity: 1;
+ }
+ }
+ }
+
+ .sheet-hexfield--running {
+ top: -64px;
+ left: -17px;
+ }
+
+ .sheet-hexfield--soak-bonus {
+ top: 0;
+ left: 33px;
+ }
+
+ .sheet-hexfield--soak-wd {
+ top: -36px;
+ left: 66px;
+
+ .sheet-hexfield__trait-field {
+ color: $c-text-gray;
+ }
+ }
+ }
+}
+
+.sheet-armor-block {
+ position: absolute;
+ right: -25px;
+ top: 20px;
+ z-index: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ transform: translateX(-100px);
+
+ > *:not(:last-child) {
+ margin-bottom: 40px;
+ }
+
+ .sheet-hexfield--armor {
+ &-head {
+ margin-right: 16px;
+ }
+
+ &-legs {
+ margin-right: 16px;
+ }
+ }
+
+ .sheet-textarea {
+ position: absolute;
+ top: 8px;
+ left: 37px;
+ color: $c-text-lighter;
+ font-size: 9px;
+ line-height: 1.5;
+ padding-top: 4px;
+ height: 56px;
+ width: 105px;
+ resize: none;
+
+ &::placeholder {
+ color: #f0f0f0;
+ font-size: 22px;
+ font-weight: 700;
+ line-height: 0.5;
+ }
+ }
+
+ .sheet-armor-decoration {
+ position: absolute;
+ top: 15px;
+ right: 16px;
+ opacity: .08 !important;
+ background: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/armor_line.png') no-repeat;
+ height: 316px;
+ width: 82px;
+ }
+
+ .sheet-armor-pointer {
+ position: absolute;
+ transform: translateX(-100%);
+ opacity: .08 !important;
+
+ &--head {
+ background: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/head_line.png') no-repeat;
+ top: 17px;
+ right: -48px;
+ height: 3px;
+ width: 111px;
+ }
+
+ &--torso {
+ background: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/torso_line.png') no-repeat;
+ top: -17px;
+ right: -42px;
+ height: 38px;
+ width: 110px;
+ }
+
+ &--arms {
+ background: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/arms_line.png') no-repeat;
+ top: -46px;
+ right: -13px;
+ height: 66px;
+ width: 78px;
+ }
+
+ &--legs {
+ background: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/legs_line.png') no-repeat;
+ top: -31px;
+ right: -15px;
+ height: 53px;
+ width: 76px;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_translation_overrides.scss b/Savage Worlds - Graph Paper/source/styles/_translation_overrides.scss
new file mode 100644
index 0000000000..889a00c19d
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_translation_overrides.scss
@@ -0,0 +1 @@
+// Put overrides for translations (width, size, etc.) here.
diff --git a/Savage Worlds - Graph Paper/source/styles/_variables.scss b/Savage Worlds - Graph Paper/source/styles/_variables.scss
new file mode 100644
index 0000000000..248a0a9189
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_variables.scss
@@ -0,0 +1,49 @@
+// FONTS
+$f-roboto: Roboto, Arial, Helvetica, sans-serif;
+
+// FONT SIZES (Overwrite Roll20!)
+$fs-l: 12px;
+$fs-s: 10px;
+$fs-xs: 8px;
+
+// COLORS
+$c-text: #404040;
+$c-text-light: #606060;
+$c-text-lighter: #808080;
+$c-text-lightest: #b0b0b0;
+$c-text-gray: #d6d6d6;
+$c-text-hover: #303030;
+
+$c-outline: #e0e0e0;
+$c-item: #fdfdfd;
+$c-background-die: #fafafa;
+$c-background-dark: #898989;
+$c-background-hover: #f2f2f2;
+$c-background-tooltip: #606060;
+
+$c-white: #fff;
+$c-red: #d9534f;
+$c-dark-red: #923836;
+$c-yellow: #f0ad4e;
+$c-blue: #0275d8;
+$c-green: #5cb85c;
+$c-purple: #b25afd;
+$c-gray: #545454;
+
+// SHADOWS
+$shadow: 0 0 1.5px 0 rgba(0, 0, 0, 0.5);
+
+@mixin note-grid {
+ background: {
+ image: linear-gradient(to right, #f6f6f6 1px, transparent 1px),
+ linear-gradient(to bottom, #f6f6f6 1px, transparent 1px);
+ size: 16px 16px;
+ position: 4px -1px;
+ color: $c-white;
+ }
+ color: $c-text-light;
+ font-size: $fs-s;
+ line-height: 16px;
+ padding: 0 8px;
+ resize: none;
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_vehicles.scss b/Savage Worlds - Graph Paper/source/styles/_vehicles.scss
new file mode 100644
index 0000000000..99ba2f8a55
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_vehicles.scss
@@ -0,0 +1,80 @@
+.sheet-vehicles {
+ &__size,
+ &__handling,
+ &__speed,
+ &__toughness,
+ &__crew,
+ &__weapons {
+ width: 45px;
+ }
+
+ .sheet-repitem__frame-silhouette-control {
+ &[value='0'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/car_01.png');
+ }
+
+ &[value='1'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/car_02.png');
+ }
+
+ &[value='2'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/car_03.png');
+ }
+
+ &[value='3'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/car_04.png');
+ }
+
+ &[value='4'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/sports-bike.png');
+ }
+
+ &[value='5'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/quad-bike.png');
+ }
+
+ &[value='6'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/tank.png');
+ }
+
+ &[value='7'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/aircraft_01.png');
+ }
+
+ &[value='8'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/aircraft_02.png');
+ }
+
+ &[value='9'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/aircraft_03.png');
+ }
+
+ &[value='10'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/watercraft_01.png');
+ }
+
+ &[value='11'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/watercraft_02.png');
+ }
+
+ &[value='12'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/watercraft_03.png');
+ }
+
+ &[value='13'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/spacecraft_01.png');
+ }
+
+ &[value='14'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/spacecraft_02.png');
+ }
+
+ &[value='15'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/spacecraft_03.png');
+ }
+
+ &[value='16'] ~ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/spacecraft_04.png');
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_walkers.scss b/Savage Worlds - Graph Paper/source/styles/_walkers.scss
new file mode 100644
index 0000000000..2a47587084
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_walkers.scss
@@ -0,0 +1,24 @@
+.sheet-walkers {
+ &__size,
+ &__pace,
+ &__crew {
+ width: 35px;
+ }
+
+ &__strength {
+ width: 60px;
+ }
+
+ &__toughness,
+ &__mods,
+ &__weapons {
+ width: 45px;
+ }
+
+ .sheet-repitem__frame-silhouette {
+ background-image: url('https://raw.githubusercontent.com/Tetrakern/roll20-character-sheets/master/Savage%20Worlds%20-%20Graph%20Paper/img/walker.png');
+ background-size: contain;
+ margin-top: 4px;
+ height: 56px;
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/styles/_weapons.scss b/Savage Worlds - Graph Paper/source/styles/_weapons.scss
new file mode 100644
index 0000000000..f0416d55ee
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/styles/_weapons.scss
@@ -0,0 +1,37 @@
+.sheet-weapons {
+ margin-top: 32px;
+
+ &__damage,
+ &__range {
+ width: 80px;
+ }
+
+ &__ap,
+ &__rof,
+ &__weight {
+ width: 30px;
+ }
+
+ &__shots {
+ width: 40px;
+ }
+
+ &__trapping {
+ width: 64px;
+ }
+
+ &__damage-button {
+ position: absolute;
+ top: 0;
+ left: 164px;
+ display: none;
+ height: 20px;
+ width: 80px;
+ }
+
+ input.sheet-toggle:not(:checked) {
+ ~ .sheet-weapons__trapping {
+ display: none;
+ }
+ }
+}
diff --git a/Savage Worlds - Graph Paper/source/templates/SavageWorldsGraphPaper.pug b/Savage Worlds - Graph Paper/source/templates/SavageWorldsGraphPaper.pug
new file mode 100644
index 0000000000..ccc54b5f00
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/SavageWorldsGraphPaper.pug
@@ -0,0 +1,4 @@
+script(type="text/worker")
+ include ../scripts/workers.js
+
+include _sheet.pug
diff --git a/Savage Worlds - Graph Paper/source/templates/_abilities.pug b/Savage Worlds - Graph Paper/source/templates/_abilities.pug
new file mode 100644
index 0000000000..e548759dcf
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_abilities.pug
@@ -0,0 +1,41 @@
+input(type='checkbox',
+ name='attr_toggle_abilities_block',
+ checked=false,
+ class='sheet-toggle sheet-toggle--block')
+
+.sheet-block.sheet-abilities
+ .sheet-header
+ span.sheet-header__title.sheet-apparel__name(name='attr_rename_block_abilities', data-i18n='abilities') Abilities
+
+ input(type='checkbox',
+ name='attr_abilities_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ fieldset.repeating_abilities
+ .sheet-repitem.sheet-repitem--full-field
+ input(type='radio',
+ name='attr_ability_size',
+ value='1',
+ label='}',
+ data-i18n-label='}',
+ class='sheet-repitem__size-radio sheet-repitem__size-radio--1')
+
+ - var i = 1
+
+ while i < 6
+ - ++i
+
+ input(type='radio',
+ name='attr_ability_size',
+ value=`${i}`,
+ label='}',
+ data-i18n-label='}',
+ class='sheet-repitem__size-radio')
+
+ textarea(name='attr_ability',
+ placeholder='Ability: Description',
+ data-i18n-placeholder='ability-placeholder',
+ spellcheck='false')
+
+ .sheet-footer
diff --git a/Savage Worlds - Graph Paper/source/templates/_advancements.pug b/Savage Worlds - Graph Paper/source/templates/_advancements.pug
new file mode 100644
index 0000000000..36d7f4e317
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_advancements.pug
@@ -0,0 +1,34 @@
+-
+ const levelRanks = [['N', 'Novice'], ['S', 'Seasoned'], ['V', 'Veteran'],
+ ['H', 'Heroic'], ['L', 'Legendary']]
+
+.sheet-advancements
+ - var i = 0, j = 2, r = 0
+
+ while i < 5
+ - ++i
+ .sheet-advancements__item
+ input(type='text',
+ name=`attr_chargen_edge_${i}`,
+ placeholder='Novice',
+ data-i18n-placeholder='advancements-novice-placeholder',
+ spellcheck='false',
+ class='sheet-align-left')
+
+ while i < 27
+ .sheet-advancements__item
+ .sheet-advancements__rank
+ span(data-i18n=`advancements-rank-${levelRanks[r][0].toLowerCase()}`)= levelRanks[r][0]
+ - ++i
+
+ input(type='text',
+ name=`attr_advancement_${(i - 5)}`,
+ placeholder=levelRanks[r][1],
+ data-i18n-placeholder=`advancements-${levelRanks[r][1].toLowerCase()}-placeholder`,
+ spellcheck='false',
+ class='sheet-align-left')
+
+ if j % 4 == 0 && r < 4
+ - ++r
+
+ - ++j
diff --git a/Savage Worlds - Graph Paper/source/templates/_allies.pug b/Savage Worlds - Graph Paper/source/templates/_allies.pug
new file mode 100644
index 0000000000..dcd1951072
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_allies.pug
@@ -0,0 +1,118 @@
+input(type='checkbox',
+ name='attr_toggle_allies_block',
+ class='sheet-toggle sheet-toggle--block')
+
+.sheet-block.sheet-allies
+ .sheet-header
+ span.sheet-header__title.sheet-allies__name(name='attr_rename_block_allies', data-i18n='allies') Allies
+ .sheet-header__labels
+ .sheet-allies__pace(data-i18n='pace') Pace
+ .sheet-allies__parry(data-i18n='parry') Parry
+ .sheet-allies__toughness(data-i18n='toughness') Tough.
+ .sheet-allies__size(data-i18n='size') Size
+ .sheet-allies__exp(data-i18n='exp') EXP
+ .sheet-allies__level(data-i18n='level') Level
+
+ input(type='checkbox',
+ name='attr_allies_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ fieldset.repeating_allies
+ .sheet-repitem
+ .sheet-repitem__primary
+ input(type='text',
+ name='attr_ally_name',
+ placeholder='Name',
+ data-i18n-placeholder='allies-name-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-allies__name sheet-stretch')
+
+ input(type='text',
+ name='attr_ally_pace',
+ placeholder='6',
+ spellcheck='false',
+ class='sheet-allies__pace')
+
+ input(type='text',
+ name='attr_ally_parry',
+ placeholder='4',
+ spellcheck='false',
+ class='sheet-allies__parry')
+
+ input(type='text',
+ name='attr_ally_toughness',
+ placeholder='4',
+ spellcheck='false',
+ class='sheet-allies__toughness')
+
+ input(type='text',
+ name='attr_ally_size',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-allies__size')
+
+ input(type='text',
+ name='attr_ally_exp',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-allies__exp')
+
+ input(type='text',
+ name='attr_ally_level',
+ placeholder='1',
+ spellcheck='false',
+ class='sheet-allies__level')
+
+ input(type='checkbox',
+ name='attr_ally_note_box_toggle',
+ class='sheet-toggle sheet-toggle--note-box')
+
+ .sheet-repitem__note-box
+ textarea(name='attr_ally_note_box',
+ placeholder='Notes',
+ data-i18n-placeholder='allies-note-box-placeholder',
+ spellcheck='false')
+
+ input(type='checkbox',
+ name='attr_ally_notes_toggle',
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__secondary
+ .sheet-left
+ - var rolls = ['2', '4', '6', '8', '10', '12']
+ - var i = 0
+
+ while i < 6
+ - var die = rolls[i] == 2 ? 'd4!cs2-2' : `d${rolls[i]}!cs2`
+
+ button(type='roll',
+ name=`roll_ally_roll_${die.replace('!cs2', '')}`,
+ value!=`&{template:TraitRoll} {{header=[^{ally}] @{ally_name} ^{rolls}: ${die.replace('!cs2', '')}}} {{commander=@{name}}} {{rof=[[ ?{@{query_rate_of_fire}|1} ]]}} {{modifier=?{@{query_modifier}|0}}} {{wd=?{@{query_wild_die}|@{none},-10000|d4|d6|d8|d10|d12}}} ${maxRof.map(n => `{{traitroll${n}=[[ ${die} + ?{@{query_modifier}|0} ]]}}`).join(' ')} {{wdroll=[[ ?{@{query_wild_die}|@{none},-10000|d4|d6|d8|d10|d12}!cs2 + ?{@{query_modifier}|0} ]]}} {{reroll=[r](~repeating_allies_ally_roll_${die.replace('!cs2', '')})}}`)
+ span(data-i18n=`die-button-number-${rolls[i]}`)= rolls[i]
+
+ - ++i
+
+ .sheet-allies__health-field.sheet-allies__health-field--wounds
+ input(type='text',
+ name='attr_ally_note_wounds',
+ spellcheck='false')
+
+ .sheet-allies__health-field.sheet-allies__health-field--fatigue
+ input(type='text',
+ name='attr_ally_note_fatigue',
+ spellcheck='false')
+
+ .sheet-right
+ - var i = 0
+
+ while i < 20
+ - ++i
+ input(type='text',
+ name=`attr_ally_note_field_${i}`,
+ placeholder=`Note #${i}`,
+ data-i18n-placeholder=`allies-note-field-${i}-placeholder`,
+ spellcheck='false',
+ class=`sheet-allies__note-field sheet-allies__note-field--${i}`)
+
+ .sheet-footer
diff --git a/Savage Worlds - Graph Paper/source/templates/_ammunition.pug b/Savage Worlds - Graph Paper/source/templates/_ammunition.pug
new file mode 100644
index 0000000000..12940da8b6
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_ammunition.pug
@@ -0,0 +1,42 @@
+input(type='checkbox',
+ name='attr_toggle_ammunition_block',
+ checked=true,
+ class='sheet-hidden sheet-toggle sheet-toggle-block')
+
+.sheet-ammunition
+ .sheet-header
+ span.sheet-header__title(name='attr_rename_block_ammunition', data-i18n='ammunition') Ammunition
+
+ input(type='checkbox',
+ name='attr_ammunition_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ .sheet-ammunition__content
+ - var i = 0
+
+ while i < 3
+ - ++i
+
+ .sheet-ammunition__container.sheet-ammunition__container--1
+ input(type='radio', name='attr_ammunition_select', value=`ammunition_container_${i}`, checked= i==1)
+ span(name=`attr_ammunition_container_${i}_max`) 0
+ input(type='text', name=`attr_ammunition_container_${i}`)
+ span(name=`attr_rename_ammunition_container_${i}`)= `Ammo #${i}`
+
+ .sheet-ammunition__buttons
+ .sheet-top
+ button(type='action' name='act_ammunition_+1') +1
+ button(type='action' name='act_ammunition_+3') +3
+ button(type='action' name='act_ammunition_+5') +5
+ button(type='action' name='act_ammunition_+10') +10
+ button(type='action' name='act_ammunition_set', data-i18n='ammunition-set') S
+
+ .sheet-bottom
+ button(type='action' name='act_ammunition_-1') −1
+ button(type='action' name='act_ammunition_-3') −3
+ button(type='action' name='act_ammunition_-5') −5
+ button(type='action' name='act_ammunition_-10') −10
+ button(type='action' name='act_ammunition_reset', data-i18n='ammunition-reset') R
+
+ .sheet-footer
diff --git a/Savage Worlds - Graph Paper/source/templates/_apparel.pug b/Savage Worlds - Graph Paper/source/templates/_apparel.pug
new file mode 100644
index 0000000000..5b9a5d52c1
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_apparel.pug
@@ -0,0 +1,78 @@
+.sheet-block.sheet-apparel
+ .sheet-header
+ span.sheet-header__title.sheet-apparel__name(name='attr_rename_block_apparel', data-i18n='apparel') Apparel
+ .sheet-header__labels
+ .sheet-apparel__armor(data-i18n='apparel-armor') Armor
+ .sheet-apparel__tags(data-i18n='apparel-properties') Properties
+ .sheet-apparel__weight(data-i18n='apparel-weight') WGT
+
+ input(type='checkbox',
+ name='attr_apparel_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ fieldset.repeating_apparel
+ .sheet-repitem
+ .sheet-repitem__primary
+ input(type='text',
+ name='attr_apparel_name',
+ placeholder='Apparel',
+ data-i18n-placeholder='apparel-name-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-apparel__name sheet-stretch')
+
+ input(type='text',
+ name='attr_apparel_armor',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-apparel__armor')
+
+ input(type='text',
+ name='attr_apparel_tags',
+ placeholder='Protection/Resistance/Tags',
+ data-i18n-placeholder='apparel-properties-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-apparel__tags')
+
+ input(type='text',
+ name='attr_apparel_weight',
+ placeholder='WGT',
+ data-i18n-placeholder='apparel-weight-placeholder',
+ spellcheck='false',
+ class='sheet-apparel__weight')
+
+ input(type='checkbox',
+ name='attr_apparel_notes_toggle',
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__secondary
+ .sheet-repitem__label(data-i18n='notes') Notes
+
+ input(type='text',
+ name='attr_apparel_notes',
+ placeholder='Notes, Tags, Trappings, Requirements, etc.',
+ data-i18n-placeholder='apparel-notes-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-repitem__note sheet-stretch')
+
+ input(type='checkbox',
+ name='attr_apparel_weight_toggle',
+ checked=true,
+ title='Weight On/Off',
+ data-i18n-title='apparel-weight-toggle-title',
+ class='sheet-toggle sheet-toggle--special sheet-toggle--weight')
+
+ input(type='checkbox',
+ name='attr_apparel_note_box_toggle',
+ class='sheet-toggle sheet-toggle--note-box')
+
+ .sheet-repitem__note-box
+ textarea(name='attr_apparel_note_box',
+ placeholder='Notes',
+ data-i18n-placeholder='apparel-note-box-placeholder',
+ spellcheck='false')
+
+ .sheet-footer
+ span.sheet-label(data-i18n='apparel-total-weight') Total Weight:
+ span(name='attr_carry_weight_apparel',
+ class='sheet-label sheet-label--weight') 0.0
diff --git a/Savage Worlds - Graph Paper/source/templates/_armor.pug b/Savage Worlds - Graph Paper/source/templates/_armor.pug
new file mode 100644
index 0000000000..3b3642de08
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_armor.pug
@@ -0,0 +1,29 @@
+.sheet-armor
+ .sheet-armor__decoration
+ +hexfield('armor_head', 'Head', 'left', '0')
+ textarea(name='attr_head_notes',
+ placeholder='NOTES',
+ data-i18n-placeholder='armor-notes-u',
+ spellcheck='false')
+ .sheet-armor__pointer.sheet-armor__pointer--head
+
+ +hexfield('armor_torso', 'Torso', 'left', '0')
+ textarea(name='attr_torso_notes',
+ placeholder='NOTES',
+ data-i18n-placeholder='armor-notes-u',
+ spellcheck='false')
+ .sheet-armor__pointer.sheet-armor__pointer--torso
+
+ +hexfield('armor_arms', 'Arms', 'left', '0')
+ textarea(name='attr_arms_notes',
+ placeholder='NOTES',
+ data-i18n-placeholder='armor-notes-u',
+ spellcheck='false')
+ .sheet-armor__pointer.sheet-armor__pointer--arms
+
+ +hexfield('armor_legs', 'Legs', 'left', '0')
+ textarea(name='attr_legs_notes',
+ placeholder='NOTES',
+ data-i18n-placeholder='armor-notes-u',
+ spellcheck='false')
+ .sheet-armor__pointer.sheet-armor__pointer--legs
diff --git a/Savage Worlds - Graph Paper/source/templates/_attributes.pug b/Savage Worlds - Graph Paper/source/templates/_attributes.pug
new file mode 100644
index 0000000000..58838c8cf8
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_attributes.pug
@@ -0,0 +1,6 @@
+.sheet-attributes
+ +attribute('Agility', 'AGI')
+ +attribute('Smarts', 'SMA')
+ +attribute('Spirit', 'SPI')
+ +attribute('Strength', 'STR')
+ +attribute('Vigor', 'VIG')
diff --git a/Savage Worlds - Graph Paper/source/templates/_augmentations.pug b/Savage Worlds - Graph Paper/source/templates/_augmentations.pug
new file mode 100644
index 0000000000..9fe2633886
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_augmentations.pug
@@ -0,0 +1,126 @@
+input(type='checkbox',
+ name='attr_toggle_strain',
+ class='sheet-hidden sheet-toggle--strain')
+
+input(type='checkbox',
+ name='attr_toggle_augmentation_markers',
+ checked=true,
+ class='sheet-hidden sheet-toggle-augmentation-markers')
+
+input(type='checkbox',
+ name='attr_toggle_augmentations_block',
+ checked=true,
+ class='sheet-toggle sheet-toggle--block')
+
+.sheet-block.sheet-augmentations
+ .sheet-header
+ span.sheet-header__title.sheet-augmentations__name(name='attr_rename_block_augmentations', data-i18n='augmentations') Augmentations
+ .sheet-header__labels
+ .sheet-augmentations__grade(data-i18n='augmentations-grade') Grade
+ .sheet-augmentations__power(data-i18n='augmentations-power') Power
+ .sheet-augmentations__slots(data-i18n='augmentations-slots') Slots
+ .sheet-augmentations__loss
+ span.sheet-a(data-i18n='augmentations-loss') Loss
+ span.sheet-b(data-i18n='augmentations-strain') Strain
+
+ input(type='checkbox',
+ name='attr_augmentations_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ fieldset.repeating_augmentations
+ .sheet-repitem
+ .sheet-repitem__primary
+ input(type='text',
+ name='attr_augmentation_name',
+ placeholder='[Advanced/Superior] Augmentation [Level] (Upgrades)',
+ data-i18n-placeholder='augmentations-name-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-augmentations__name sheet-stretch')
+
+ +color_circle('augmentation-color')
+
+ input(type='text',
+ name='attr_augmentation_grade',
+ placeholder='Iron',
+ data-i18n-placeholder='augmentations-grade-placeholder',
+ spellcheck='false',
+ class='sheet-augmentations__grade')
+
+ input(type='text',
+ name='attr_augmentation_power',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-augmentations__power')
+
+ input(type='text',
+ name='attr_augmentation_slots',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-augmentations__slots')
+
+ input(type='text',
+ name='attr_augmentation_loss',
+ placeholder='4.0',
+ spellcheck='false',
+ class='sheet-augmentations__loss')
+
+ input(type='checkbox',
+ name='attr_augmentation_notes_toggle',
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__secondary
+ input(type='checkbox',
+ name='attr_multiplier_toggle',
+ checked=true,
+ class='sheet-hidden sheet-toggle')
+
+ .sheet-repitem__label(data-i18n='multiplier') Multiplier
+
+ input(type='text',
+ name='attr_augmentation_multiplier',
+ value='1.0',
+ placeholder='1.0',
+ class='sheet-augmentations__multiplier')
+
+ .sheet-repitem__label(data-i18n='notes') Notes
+
+ input(type='text',
+ name='attr_augmentation_notes',
+ placeholder='Effect/Description',
+ data-i18n-placeholder='augmentations-notes-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-repitem__note sheet-stretch')
+
+ input(type='checkbox',
+ name='attr_settings_toggle',
+ class='sheet-toggle sheet-toggle--settings')
+
+ .sheet-repitem__settings
+ .sheet-repitem__settings-content
+ label.sheet-label-toggle
+ input(type='checkbox', name='attr_multiplier_toggle', checked=true)
+ span(data-i18n='multiplier') Multiplier
+
+ input(type='checkbox',
+ name='attr_augmentation_loss_toggle',
+ checked=true,
+ title='Loss/Strain On/Off',
+ data-i18n-title='augmentations-toggle-title',
+ class='sheet-toggle sheet-toggle--special sheet-toggle--loss')
+
+ input(type='checkbox',
+ name='attr_augmentation_note_box_toggle',
+ class='sheet-toggle sheet-toggle--note-box')
+
+ .sheet-repitem__note-box
+ textarea(name='attr_augmentation_note_box',
+ placeholder='Notes',
+ data-i18n-placeholder='augmentations-note-box-placeholder',
+ spellcheck='false')
+
+ .sheet-footer
+ span.sheet-label.sheet-a(data-i18n='augmentations-total-loss') Total Loss:
+ span.sheet-label.sheet-b(data-i18n='augmentations-total-strain') Total Strain:
+ span(name='attr_augmentations_total_loss',
+ class='sheet-label sheet-label--loss') 0.0
diff --git a/Savage Worlds - Graph Paper/source/templates/_buttons.pug b/Savage Worlds - Graph Paper/source/templates/_buttons.pug
new file mode 100644
index 0000000000..c2c926c2ae
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_buttons.pug
@@ -0,0 +1,78 @@
+.sheet-buttons
+ .sheet-dice-roller
+ input(type='hidden', name='attr_dice_roller_code', value='0')
+ input(type='hidden',
+ name='attr_dice_roller_template',
+ value=`{{rof=[[ 0 + ?{@{query_rate_of_fire}|1} ]]}} ${maxRof.map(n => `{{roll${n}=[[ @{dice_roller_code} ]]}}`).join(' ')}`)
+
+ input(type='text',
+ name='attr_dice_roller_input',
+ placeholder= '2d6!+2',
+ data-i18n-placeholder='dice-roller-code-placeholder',
+ class='sheet-dice-roller__input')
+
+ button(type='roll',
+ name='roll_dice_roller_damage',
+ value!=`@{gm_roll} &{template:DamageRoll} {{header=@{name} ^{rolls} ^{damage}}} {{code=@{dice_roller_input}}} @{dice_roller_template} {{reroll=[r](~dice_roller_damage)}}`)
+ span(data-i18n='dice-roller-damage') Damage
+
+ button(type='roll',
+ name='roll_dice_roller_hidden',
+ value!=`/w gm &{template:DiceRoller} {{header=@{name} ^{rolls} @{dice_roller_input}}} @{dice_roller_template} {{reroll=[r](~dice_roller_hidden)}}`)
+ span(data-i18n='dice-roller-hidden') Hidden
+
+ button(type='roll',
+ name='roll_dice_roller_open',
+ value!=`&{template:DiceRoller} {{header=@{name} ^{rolls} @{dice_roller_input}}} @{dice_roller_template} {{reroll=[r](~dice_roller_open)}}`)
+ span(data-i18n='dice-roller-roll') Roll
+
+ .sheet-run-roller
+ input(type='hidden', name='attr_run_wounds', value='@{wound_mod}')
+ input(type='hidden', name='attr_run_fatigue', value='0')
+ input(type='hidden', name='attr_run_code', value='@{run_roll}')
+
+ button(type='roll',
+ name='roll_run',
+ value!='@{gm_roll} &{template:RunRoll} {{header=@{name} ^{runs-ellipsis} [[ @{run_code} + @{pace} - @{run_wounds} - @{run_fatigue} + ?{@{query_modifier}|0} ]]^{exclamation-mark}}} {{content=^{run} (@{pace} + @{run_code}) + ^{mod} (?{@{query_modifier}|0}) - ^{penalty} ([[ @{run_wounds} + @{run_fatigue} ]])}}')
+ span(data-i18n='dice-roller-run') Run
+
+ .sheet-raise-calculator
+ button(type='roll',
+ name='roll_raise_calculator',
+ value!='@{gm_roll} &{template:InfoBox} {{content=^{roll-of} (?{@{query_roll_result}}) ^{vs-tn} (?{@{query_target_number}|4}) = [[ floor((?{@{query_roll_result}} - ?{@{query_target_number}|4}) / 4) ]] ^{raises}}}')
+ span(data-i18n='raise-calculator') Raise Calculator
+
+ label.sheet-label-toggle
+ input(type='hidden', name=`attr_query_global_rof`, value='1')
+ input(type='checkbox', name='attr_toggle_global_rof')
+ span(data-i18n='query-rof') Query RoF
+
+ label.sheet-label-toggle
+ input(type='hidden', name=`attr_query_global_wd`, value='-10000-d20')
+ input(type='checkbox', name='attr_toggle_global_wd')
+ span(data-i18n='query-wd') Query WD
+
+ label.sheet-label-toggle
+ input(type='hidden', name=`attr_query_global_bonus_wd`, value='-10000-d20')
+ input(type='checkbox', name='attr_toggle_global_bonus_wd')
+ span(data-i18n='bonus-wd') Bonus WD
+
+ label.sheet-label-toggle
+ input(type='checkbox', name='attr_gm_roll', value='/w gm')
+ span(data-i18n='gm-roll') GM Roll
+
+ - var i = 0
+
+ while i < 3
+ - ++i
+
+ input(type='checkbox',
+ name=`attr_toggle_custom_button_${i}`,
+ class='sheet-hidden sheet-toggle')
+
+ .sheet-custom-button
+ button(type='roll',
+ name=`roll_custom_button_${i}`,
+ value!=`@{custom_button_${i}_macro}`)
+ span(name=`attr_rename_custom_button_${i}`)
+ = i == 1 ? 'UnShake' : `Button #${i}`
diff --git a/Savage Worlds - Graph Paper/source/templates/_common_fields.pug b/Savage Worlds - Graph Paper/source/templates/_common_fields.pug
new file mode 100644
index 0000000000..6f7d75445f
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_common_fields.pug
@@ -0,0 +1,13 @@
+input(type='hidden', name='attr_unskilled', value='d4-2')
+input(type='hidden', name='attr_unskilled_untrained_mod', value='-2')
+input(type='hidden', name='attr_unskilled_roll', value='1d4')
+input(type='hidden', name='attr_unskilled_wd_roll', value='1d6')
+input(type='hidden', name='attr_unskilled_extra_wd_roll', value='-10000')
+
+input(type='hidden', name=`attr_unskilled_global_wd_roll`, value=`{{global_wd=@{query_global_wd}}} {{global_wdroll=[[ @{query_global_wd}!cs2 + (@{unskilled_untrained_mod})[Untrained] + (@{unskilled_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+input(type='hidden', name=`attr_unskilled_global_bonus_wd_roll`, value=`{{bonus_wd=@{query_global_bonus_wd}}} {{bonus_wdroll=[[ @{query_global_bonus_wd}!cs2 + (@{unskilled_untrained_mod})[Untrained] + (@{unskilled_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+input(type='hidden',
+ name=`attr_unskilled_roll_body`,
+ value!=`@{gm_roll} &{template:TraitRoll} {{rof=[[ 0 + @{query_global_rof} ]]}} {{header=@{name} ^{rolls} ^{unskilled}}} {{trait=^{unskilled}}} {{traitdie=@{unskilled}}} {{flat=@{unskilled_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{modifier=?{@{query_modifier}|0}}} ${maxRof.map(n => `{{traitroll${n}=[[ @{unskilled_roll}!cs2 + (@{unskilled_untrained_mod})[Untrained] + (@{unskilled_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`).join(' ')} @{unskilled_global_wd_roll} @{unskilled_global_bonus_wd_roll}`)
diff --git a/Savage Worlds - Graph Paper/source/templates/_encumbrance.pug b/Savage Worlds - Graph Paper/source/templates/_encumbrance.pug
new file mode 100644
index 0000000000..de5cf196d8
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_encumbrance.pug
@@ -0,0 +1,27 @@
+.sheet-encumbrance
+ .sheet-encumbrance__container
+ .sheet-label(data-i18n='weapons') Weapons
+ .sheet-encumbrance__content
+ span(name='attr_carry_weight_weapons') 0.0
+
+ .sheet-encumbrance__container
+ .sheet-label(data-i18n='apparel') Apparel
+ .sheet-encumbrance__content
+ span(name='attr_carry_weight_apparel') 0.0
+
+ .sheet-encumbrance__container
+ .sheet-label(data-i18n='inventory') Inventory
+ .sheet-encumbrance__content
+ span(name='attr_carry_weight_inventory') 0.0
+
+ .sheet-encumbrance__container.sheet-encumbrance__container--summary
+ .sheet-label(data-i18n='carried-weight-total') Total Carried Weight
+ .sheet-encumbrance__content.sheet-encumbrance__content--summary
+ input(type='text',
+ name='attr_carry_weight_maximum',
+ placeholder='20',
+ value='20')
+
+ div /
+
+ span(name='attr_carry_weight') 0.0
diff --git a/Savage Worlds - Graph Paper/source/templates/_engrams.pug b/Savage Worlds - Graph Paper/source/templates/_engrams.pug
new file mode 100644
index 0000000000..80c69d2a6e
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_engrams.pug
@@ -0,0 +1,163 @@
+input(type='checkbox',
+ name='attr_toggle_engrams_block',
+ checked=true,
+ class='sheet-toggle sheet-toggle--block')
+
+.sheet-block.sheet-engrams
+ .sheet-header
+ span.sheet-header__title.sheet-engrams__name(name='attr_rename_block_engrams', data-i18n='engrams') Engrams
+ .sheet-header__labels
+ .sheet-engrams__penalty(data-i18n='engrams-penalty') Penalty
+ .sheet-engrams__description(data-i18n='engrams-description') Description
+
+ input(type='checkbox',
+ name='attr_engrams_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ input(type='checkbox',
+ name='attr_toggle_description_input_visibility',
+ checked=true,
+ class='sheet-toggle-description-input sheet-hidden')
+
+ input(type='checkbox',
+ name='attr_toggle_injection_input_visibility',
+ class='sheet-toggle-injection-input sheet-hidden')
+
+ fieldset.repeating_engrams
+ .sheet-repitem
+ .sheet-repitem__primary
+ input(type='checkbox',
+ name='attr_roll_button_toggle',
+ class='sheet-hidden sheet-toggle sheet-toggle--list-roll')
+
+ button(type='roll',
+ name='roll_skill',
+ value!=`@{skill_roll_body} {{wd=@{skill_wd}}} {{wdroll=[[ @{skill_wd_roll}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}} @{wd_override} {{reroll=[r](~repeating_engrams_skill)}} {{description=@{roll_description}}} @{roll_injection}`,
+ class='sheet-repitem__skill-roll sheet-repitem__skill-roll--wildcard') 9
+
+ button(type='roll',
+ name='roll_extra_skill',
+ value!=`@{skill_roll_body} {{wd=@{skill_wd}}} {{wdroll=[[ @{skill_extra_wd_roll}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}} @{wd_override} {{reroll=[r](~repeating_engrams_skill)}} {{description=@{roll_description}}} @{roll_injection}`,
+ class='sheet-repitem__skill-roll sheet-repitem__skill-roll--extra') 9
+
+ input(type='text',
+ name='attr_engram_name',
+ placeholder='Engram',
+ data-i18n-placeholder='engrams-name-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-engrams__name sheet-stretch')
+
+ input(type='text',
+ name='attr_engram_penalty',
+ placeholder='-1',
+ spellcheck='false',
+ class='sheet-engrams__penalty')
+
+ input(type='text',
+ name='attr_engram_description',
+ placeholder='e.g. entangle (SWADE 161) power but resisted by Smarts',
+ data-i18n-placeholder='engrams-description-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-engrams__description')
+
+ input(type='checkbox',
+ name='attr_engram_notes_toggle',
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__secondary
+ .sheet-repitem__label(data-i18n='notes') Notes
+
+ input(type='text',
+ name='attr_engram_notes',
+ placeholder='Effect/Description',
+ data-i18n-placeholder='engrams-notes-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-repitem__note sheet-stretch')
+
+ input(type='checkbox',
+ name='attr_engram_settings_toggle',
+ class='sheet-toggle sheet-toggle--settings')
+
+ .sheet-repitem__settings
+ .sheet-repitem__settings-content
+ label.sheet-label-toggle.sheet-label-toggle--full-row.sheet-roll-description
+ input(type="hidden", name='attr_roll_description')
+ input(type='checkbox', name='attr_roll_description_toggle')
+ span(data-i18n='roll-description') Description
+ input(type='text',
+ name='attr_roll_description_input',
+ placeholder='Narrative or functional description below the header in the Roll Template. Leave empty to disable.',
+ data-i18n-placeholder='roll-description-placeholder',
+ value='',
+ spellcheck='false',
+ class='sheet-label-toggle__input')
+
+ label.sheet-label-toggle.sheet-label-toggle--full-row.sheet-roll-injection
+ input(type="hidden", name='attr_roll_injection')
+ input(type='checkbox', name='attr_roll_injection_toggle')
+ span(data-i18n='roll-injection') Roll Injection
+ input(type='text',
+ name='attr_roll_injection_input',
+ placeholder='{{source_label=}} {{source=}} {{custom3_label=}} {{custom3=}} {{rof=[[ 1 ]]}} {{traitroll8=}}',
+ data-i18n-placeholder='roll-injection-placeholder',
+ value='',
+ spellcheck='false',
+ class='sheet-label-toggle__input')
+
+ label.sheet-label-toggle
+ input(type='hidden', name='attr_skill_wd', value='@{hacking_wd}')
+ input(type='hidden', name='attr_skill_mod', value='@{hacking_mod}')
+ input(type='hidden', name='attr_skill_untrained_mod', value='@{hacking_untrained_mod}')
+ input(type='hidden', name='attr_skill_roll', value='@{hacking_roll}')
+ input(type='hidden', name='attr_skill_wd_roll', value='@{hacking_wd_roll}')
+ input(type='hidden', name='attr_skill_extra_wd_roll', value='@{hacking_wd_roll}')
+
+ input(type='hidden', name=`attr_skill_global_wd_roll`, value=`{{global_wd=@{query_global_wd}}} {{global_wdroll=[[ @{query_global_wd}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+ input(type='hidden', name=`attr_skill_global_bonus_wd_roll`, value=`{{bonus_wd=@{query_global_bonus_wd}}} {{bonus_wdroll=[[ @{query_global_bonus_wd}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+ input(type='hidden',
+ name=`attr_skill_roll_body`,
+ value!=`@{gm_roll} &{template:TraitRoll} {{rof=[[ 0 + @{rof_override} ]]}} {{header=@{name} ^{rolls} @{skill_name}}} {{trait=@{skill_name}}} {{source_label=^{source}}} {{source=@{engram_name}}} {{traitdie=@{skill_roll}}} {{flat=@{skill_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{modifier=?{@{query_modifier}|0}}} {{bonus=@{skill_bonus}}} ${maxRof.map(n => `{{traitroll${n}=[[ @{skill_roll}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`).join(' ')} @{skill_global_wd_roll} @{skill_global_bonus_wd_roll}`)
+
+ input(type='checkbox', name='attr_roll_button_toggle')
+ span(data-i18n='roll-button') Roll Button
+ input(type='text',
+ name='attr_skill_name',
+ placeholder='Hacking',
+ data-i18n-placeholder='engrams-skill-placeholder',
+ value='Hacking',
+ spellcheck='false',
+ class='sheet-label-toggle__input')
+ input(type='text',
+ name='attr_skill_bonus',
+ placeholder='+0',
+ class='sheet-label-toggle__input sheet-label-toggle__input--tiny')
+
+ label.sheet-label-toggle
+ input(type="hidden", name='attr_rof_override', value='1')
+ input(type='checkbox', name='attr_rof_override_toggle')
+ span(data-i18n='query-rof') Query RoF
+
+ label.sheet-label-toggle
+ input(type="hidden", name='attr_wd_override', value='')
+ input(type='checkbox', name='attr_wd_override_toggle')
+ span(data-i18n='wild-die-override') WD Override
+ input(type='text',
+ name='attr_wd_override_die',
+ value='',
+ spellcheck='false',
+ class='sheet-label-toggle__input sheet-label-toggle__input--tiny')
+
+ input(type='checkbox',
+ name='attr_engram_note_box_toggle',
+ class='sheet-toggle sheet-toggle--note-box')
+
+ .sheet-repitem__note-box
+ textarea(name='attr_engram_note_box',
+ placeholder='Notes',
+ data-i18n-placeholder='engrams-note-box-placeholder',
+ spellcheck='false')
+
+ .sheet-footer
diff --git a/Savage Worlds - Graph Paper/source/templates/_extra_sheet.pug b/Savage Worlds - Graph Paper/source/templates/_extra_sheet.pug
new file mode 100644
index 0000000000..e3c9afb685
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_extra_sheet.pug
@@ -0,0 +1,262 @@
+.sheet-meta.sheet-extra-meta
+ +meta_field('name', 'Name')
+ +meta_field('size', 'Size')
+ +meta_field('height', 'Height')
+ +meta_field('weight', 'Weight')
+ +meta_field('bennies', 'Bennies')
+
+include _buttons.pug
+
+.sheet-block.sheet-extra-attributes
+ .sheet-header
+ .sheet-header__title
+ span(data-i18n='attributes') Attributes
+
+ input(type='checkbox',
+ name='attr_simple_attributes_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ .sheet-container
+ +simple_trait('agility', 'Agility', 'd4', 'sheet-simple-trait--attribute', true)
+ +simple_trait('smarts', 'Smarts', 'd4', 'sheet-simple-trait--attribute', true)
+ +simple_trait('spirit', 'Spirit', 'd4', 'sheet-simple-trait--attribute', true)
+ +simple_trait('strength', 'Strength', 'd4', 'sheet-simple-trait--attribute', true)
+ +simple_trait('vigor', 'Vigor', 'd4', 'sheet-simple-trait--attribute', true)
+
+.sheet-block.sheet-extra-skills
+ .sheet-header
+ .sheet-header__title
+ span(data-i18n='skills') Skills
+
+ input(type='checkbox',
+ name='attr_simple_skill_selection_toggle',
+ class='sheet-extra-skills__selection-toggle')
+
+ input(type='checkbox',
+ name='attr_simple_skills_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ .sheet-container
+ -
+ var skills = [['Academics', 'Sma'], ['Athletics', 'Agi'], ['Battle', 'Sma'],
+ ['Boating', 'Agi'], ['Driving', 'Agi'], ['Common Knowledge', 'Sma'],
+ ['Electronics', 'Sma'], ['Faith', 'Spi'], ['Fighting', 'Agi'],
+ ['Focus', 'Spi'], ['Gambling', 'Sma'], ['Hacking', 'Sma'],
+ ['Healing', 'Sma'], ['Intimidation', 'Spi'], ['Language', 'Sma'],
+ ['MAGIC', 'Sma'], ['Notice', 'Sma'], ['Occult', 'Sma'],
+ ['Performance', 'Spi'], ['Persuasion', 'Spi'], ['Piloting', 'Agi'],
+ ['Psionics', 'Sma'], ['Repair', 'Sma'], ['Research', 'Sma'],
+ ['Riding', 'Agi'], ['Science', 'Sma'], ['Shooting', 'Agi'],
+ ['Spellcasting', 'Sma'], ['Stealth', 'Agi'], ['Survival', 'Sma'],
+ ['Taunt', 'Sma'], ['Thievery', 'Agi'], ['Weird Science', 'Sma'],
+ ['Custom Skill 1', 'Custom'], ['Custom Skill 2', 'Custom'],
+ ['Unskilled', 'Custom']]
+
+ - var defaultSkills = ['athletics', 'common-knowledge', 'notice', 'persuasion', 'stealth']
+
+ each skill in skills
+ - var trait = skill[0].toLowerCase().replace('.', '').replace(/ /g, '_')
+ - var skill_name = skill[0] == 'Common Knowledge' ? 'Common Knowl.' : skill[0]
+
+ label.sheet-extra-skills__toggle-label
+ input(type='checkbox',
+ name=`attr_extra_skill_toggle_${trait}`,
+ checked= defaultSkills.includes(trait) || trait == 'unskilled',
+ class='sheet-extra-skills__toggle')
+ span(name='attr_rename_' + trait)!= skill_name
+
+ input(type='checkbox',
+ name=`attr_extra_skill_toggle_${trait}`,
+ checked= defaultSkills.includes(trait) || trait == 'unskilled',
+ class='sheet-hidden sheet-extra-skills__toggle')
+
+ +simple_trait(trait,
+ skill_name,
+ 'd4-2',
+ 'sheet-simple-trait--skill',
+ trait != 'unskilled')
+
+.sheet-block.sheet-block.sheet-extra-secondary
+ .sheet-header
+ span.sheet-header__title(data-i18n='armor-and-statistics') Armor & Statistics
+
+ input(type='checkbox',
+ name='attr_simple_secondary_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ .sheet-container
+ .sheet-extra-secondary__field
+ input(type='text',
+ name='attr_pace',
+ placeholder='6',
+ spellcheck='false',
+ class='sheet-extra-secondary__input')
+ .sheet-label
+ span(data-i18n='pace') Pace
+
+ .sheet-extra-secondary__field
+ input(type='text',
+ name='attr_run',
+ placeholder='d6',
+ spellcheck='false',
+ class='sheet-extra-secondary__input')
+ .sheet-label
+ span(data-i18n='run') Run
+
+ .sheet-extra-secondary__field
+ input(type='text',
+ name='attr_parry',
+ placeholder='2',
+ spellcheck='false',
+ class='sheet-extra-secondary__input')
+ .sheet-label
+ span(data-i18n='parry') Parry
+
+ .sheet-extra-secondary__field
+ input(type='text',
+ name='attr_toughness',
+ placeholder='4',
+ spellcheck='false',
+ class='sheet-extra-secondary__input')
+ .sheet-label
+ span(data-i18n='toughness') Tough.
+
+ .sheet-divider
+
+ .sheet-extra-secondary__field
+ input(type='text',
+ name='attr_armor_head',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-extra-secondary__input')
+ .sheet-label
+ span(data-i18n='armor-head') Head
+
+ .sheet-extra-secondary__field
+ input(type='text',
+ name='attr_armor_torso',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-extra-secondary__input')
+ .sheet-label
+ span(data-i18n='armor-torso') Torso
+
+ .sheet-extra-secondary__field
+ input(type='text',
+ name='attr_armor_arms',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-extra-secondary__input')
+ .sheet-label
+ span(data-i18n='armor-arms') Arms
+
+ .sheet-extra-secondary__field
+ input(type='text',
+ name='attr_armor_legs',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-extra-secondary__input')
+ .sheet-label
+ span(data-i18n='armor-legs') Legs
+
+ .sheet-divider
+
+ .sheet-extra-secondary__field
+ input(type='text',
+ name='attr_wound_mod',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-extra-secondary__input')
+ .sheet-label
+ span(data-i18n='extra-wounds') WDS
+
+ .sheet-extra-secondary__field
+ input(type='text',
+ name='attr_fatigue_mod',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-extra-secondary__input')
+ .sheet-label
+ span(data-i18n='extra-fatigue') FTG
+
+ +simple_trait('soak', 'Soak', 'd4', 'sheet-simple-trait--attribute')
+
+.sheet-block.sheet-quick-notes
+ .sheet-header
+ span.sheet-header__title(name='attr_rename_block_quick_notes', data-i18n='quick-notes') Quick Notes
+
+ input(type='checkbox',
+ name='attr_simple_quick_notes_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ .sheet-quick-notes__content
+ input.sheet-hidden(type='checkbox', name='attr_toggle_quick_notes_extension')
+
+ textarea(name='attr_quick_notes', spellcheck='false')
+
+include _features.pug
+include _abilities.pug
+include _weapons.pug
+include _apparel.pug
+include _augmentations.pug
+include _engrams.pug
+include _powers.pug
+include _vehicles.pug
+include _walkers.pug
+include _powerarmor.pug
+include _allies.pug
+
+.sheet-block.sheet-extra-settings
+ label.sheet-extra-settings__item
+ input(type='checkbox',
+ name='attr_toggle_abilities_block',
+ class='sheet-hidden')
+ span(name='attr_rename_block_abilities', data-i18n='abilities') Abilities
+
+ label.sheet-extra-settings__item
+ input(type='checkbox',
+ name='attr_toggle_augmentations_block',
+ checked=true,
+ class='sheet-hidden')
+ span(name='attr_rename_block_augmentations', data-i18n='augmentations') Augmentations
+
+ label.sheet-extra-settings__item
+ input(type='checkbox',
+ name='attr_toggle_engrams_block',
+ checked=true,
+ class='sheet-hidden')
+ span(name='attr_rename_block_engrams', data-i18n='engrams') Engrams
+
+ label.sheet-extra-settings__item
+ input(type='checkbox',
+ name='attr_toggle_powerarmors_block',
+ class='sheet-hidden')
+ span(name='attr_rename_block_powerarmor', data-i18n='powerarmors') Power Armors
+
+ label.sheet-extra-settings__item
+ input(type='checkbox',
+ name='attr_toggle_powers_block',
+ class='sheet-hidden')
+ span(name='attr_rename_block_powers', data-i18n='powers') Powers
+
+ label.sheet-extra-settings__item
+ input(type='checkbox',
+ name='attr_toggle_vehicles_block',
+ class='sheet-hidden')
+ span(name='attr_rename_block_vehicles', data-i18n='vehicles') Vehicles
+
+ label.sheet-extra-settings__item
+ input(type='checkbox',
+ name='attr_toggle_walkers_block',
+ class='sheet-hidden')
+ span(name='attr_rename_block_walkers', data-i18n='walkers') Walkers
+
+ label.sheet-extra-settings__item
+ input(type='checkbox',
+ name='attr_toggle_allies_block',
+ class='sheet-hidden')
+ span(name='attr_rename_block_allies', data-i18n='allies') Allies
diff --git a/Savage Worlds - Graph Paper/source/templates/_features.pug b/Savage Worlds - Graph Paper/source/templates/_features.pug
new file mode 100644
index 0000000000..5023ccd502
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_features.pug
@@ -0,0 +1,31 @@
+.sheet-features
+ .sheet-header
+ .sheet-header__title(data-i18n='edges-and-hindrances') Edges & Hindrances
+
+ fieldset.repeating_features
+ .sheet-repitem
+ -
+ var ranks = ['novice', 'seasoned', 'veteran', 'heroic', 'legendary',
+ 'augmentation', 'dot', 'hindrance', 'disabled']
+
+ each rank in ranks
+ input(type='radio',
+ name='attr_feature_rank',
+ value=rank,
+ class='sheet-color-cycle__radio sheet-color-cycle__radio--' + rank,
+ checked= rank == 'novice')
+
+ .sheet-features__inner-background
+
+ input(type='hidden',
+ name='attr_feature_size',
+ value='72')
+
+ input(type='text',
+ name='attr_feature_name',
+ placeholder='New',
+ data-i18n-placeholder='feature-name-new',
+ spellcheck='false',
+ class='sheet-align-left sheet-features__name')
+
+ .sheet-footer
diff --git a/Savage Worlds - Graph Paper/source/templates/_health.pug b/Savage Worlds - Graph Paper/source/templates/_health.pug
new file mode 100644
index 0000000000..cb9ef92f0d
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_health.pug
@@ -0,0 +1,97 @@
+.sheet-health
+ input(type='hidden', name='attr_wound_mod', value='0')
+ input(type='hidden', name='attr_fatigue_mod', value='0')
+
+ input(type='checkbox',
+ name='attr_incap',
+ class='sheet-hex sheet-hex--64 sheet-hex--incap')
+
+ .sheet-health__wounds
+ .sheet-health__icons
+ input(type='checkbox',
+ name='attr_health_icon_shield',
+ class='sheet-icon sheet-icon--shield')
+
+ input(type='checkbox',
+ name='attr_health_icon_bug',
+ class='sheet-icon sheet-icon--bug')
+
+ input(type='checkbox',
+ name='attr_health_icon_fire',
+ class='sheet-icon sheet-icon--fire')
+
+ input(type='checkbox',
+ name='attr_health_icon_hit',
+ class='sheet-icon sheet-icon--hit')
+
+ input(type='checkbox',
+ name='attr_health_icon_lightning',
+ class='sheet-icon sheet-icon--lightning')
+
+ input(type='checkbox',
+ name='attr_health_icon_cancel',
+ class='sheet-icon sheet-icon--cancel')
+
+ .sheet-health__track
+ - for (var i = 6; i > 0; --i) {
+ - if (i > 1) {
+ input(type='checkbox',
+ name='attr_wound_toggle_' + i,
+ class='sheet-radio-track-toggle sheet-radio-track-toggle--' + i,
+ checked= i > 3 ? true : false)
+ - }
+
+ input(type='radio',
+ name='attr_wounds',
+ value=i,
+ class='sheet-radio-track sheet-radio-track--' + i)
+ - }
+
+ input(type='radio',
+ name='attr_wounds',
+ value=0,
+ class='sheet-reset-button',
+ checked= true)
+
+ .sheet-header__title(data-i18n='wounds') Wounds
+
+ .sheet-health__center
+ +hexfield('wound_mitigation', 'Wound Mitigation', 'left', '0', '', 'sheet-stay-on-input')
+ +hexfield('rads', 'Rads', 'right', '0', '', 'sheet-stay-on-input')
+
+ .sheet-health__fatigue
+ .sheet-health__icons
+ input(type='checkbox',
+ name='attr_health_icon_rad',
+ class='sheet-icon sheet-icon--rad')
+
+ input(type='checkbox',
+ name='attr_health_icon_tools',
+ class='sheet-icon sheet-icon--tools')
+
+ input(type='checkbox',
+ name='attr_health_icon_ecg',
+ class='sheet-icon sheet-icon--ecg')
+
+ .sheet-health__track
+ - for (var i = 3; i > 0; --i) {
+ - if (i > 1) {
+ input(type='checkbox',
+ name='attr_fatigue_toggle_' + i,
+ class='sheet-radio-track-toggle sheet-radio-track-toggle--' + i,
+ checked= i > 2)
+ - }
+
+ input(type='radio',
+ name='attr_fatigue',
+ value=i,
+ class='sheet-radio-track sheet-radio-track--' + i,
+ checked= i == 0)
+ - }
+
+ input(type='radio',
+ name='attr_fatigue',
+ class='sheet-reset-button',
+ checked= true)
+
+ .sheet-header__title(data-i18n='fatigue') Fatigue
diff --git a/Savage Worlds - Graph Paper/source/templates/_integrity.pug b/Savage Worlds - Graph Paper/source/templates/_integrity.pug
new file mode 100644
index 0000000000..005dff2c3a
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_integrity.pug
@@ -0,0 +1,61 @@
+input(type='checkbox',
+ name='attr_toggle_integrity_block',
+ checked=true,
+ class='sheet-toggle sheet-toggle--block')
+
+.sheet-integrity.sheet-block
+ .sheet-integrity__status
+ .sheet-integrity__loss-effects
+ input(type='checkbox', name='attr_discord', class='sheet-hidden')
+ span.sheet-integrity__discord(name='attr_rename_discord', data-i18n='integrity-discord') Discord
+
+ input(type='checkbox', name='attr_psychosis', class='sheet-hidden')
+ span.sheet-integrity__psychosis(name='attr_rename_psychosis', data-i18n='integrity-psychosis') Psychosis
+
+ input(type='checkbox', name='attr_seizures', class='sheet-hidden')
+ span.sheet-integrity__seizures(name='attr_rename_seizures', data-i18n='integrity-seizures') Seizures
+
+ input(type='checkbox', name='attr_depersonalization', class='sheet-hidden')
+ span.sheet-integrity__depersonalization(name='attr_rename_depersonalization', data-i18n='integrity-depersonalization') Depersonalization
+
+ .sheet-integrity__progress
+ input(type='hidden',
+ name='attr_integrity_bar_size',
+ value='80',
+ readonly=true,
+ class='sheet-integrity__bar-width')
+
+ .sheet-integrity__progress-fill
+
+ .sheet-integrity__marker.sheet-integrity__marker--70
+ .sheet-integrity__marker.sheet-integrity__marker--60
+ .sheet-integrity__marker.sheet-integrity__marker--50
+ .sheet-integrity__marker.sheet-integrity__marker--40
+ .sheet-integrity__marker.sheet-integrity__marker--30
+ .sheet-integrity__marker.sheet-integrity__marker--20
+ .sheet-integrity__marker.sheet-integrity__marker--10
+
+ .sheet-integrity__loss-effects
+ input(type='checkbox', name='attr_dissonance', class='sheet-hidden')
+ span.sheet-integrity__dissonance(name='attr_rename_dissonance', data-i18n='integrity-dissonance') Dissonance
+
+ input(type='checkbox', name='attr_alienation', class='sheet-hidden')
+ span.sheet-integrity__alienation(name='attr_rename_alienation', data-i18n='integrity-alienation') Alienation
+
+ input(type='checkbox', name='attr_derealization', class='sheet-hidden')
+ span.sheet-integrity__derealization(name='attr_rename_derealization', data-i18n='integrity-derealization') Derealization
+
+ input(type='checkbox', name='attr_ego_death', class='sheet-hidden')
+ span.sheet-integrity__egodeath(name='attr_rename_ego_death', data-i18n='integrity-ego-death') Ego Death
+
+ .sheet-integrity__hexfields
+ .sheet-container
+ span(name='attr_integrity',
+ class='sheet-hex sheet-hex--64 sheet-hexfield__input') 80.0
+
+ -// Cannot use 'integrity_max' because this would also trigger with 'integrity'
+ +hexfield('integrity_maximum', 'Max', 'left', '0', '80', 'sheet-hide-until-needed sheet-hexfield-gray')
+ +hexfield('integrity_mod', 'Mod', 'right', '0', '', 'sheet-hide-until-needed sheet-hexfield-gray')
+
+ .sheet-large-label
+ span(name='attr_rename_block_integrity', data-i18n='integrity') Integrity
diff --git a/Savage Worlds - Graph Paper/source/templates/_inventory.pug b/Savage Worlds - Graph Paper/source/templates/_inventory.pug
new file mode 100644
index 0000000000..daffe897dc
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_inventory.pug
@@ -0,0 +1,74 @@
+.sheet-inventory
+ .sheet-header
+ span.sheet-header__title(name='attr_rename_block_inventory', data-i18n='inventory') Inventory
+ .sheet-header__labels
+ .sheet-inventory__amount #
+ .sheet-inventory__multi
+ .sheet-inventory__weight(data-i18n='inventory-weight-u') WGT
+
+ input(type='checkbox',
+ name='attr_inventory_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ fieldset.repeating_inventory
+ .sheet-repitem
+ .sheet-repitem__primary
+ input(type='text',
+ name='attr_inventory_name',
+ placeholder='Item',
+ data-i18n-placeholder='inventory-name-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-inventory__name sheet-stretch')
+
+ input(type='text',
+ name='attr_inventory_amount',
+ placeholder='0',
+ value='1',
+ spellcheck='false',
+ class='sheet-inventory__amount')
+
+ .sheet-inventory__multi ×
+
+ input(type='text',
+ name='attr_inventory_weight',
+ placeholder='WGT',
+ data-i18n-placeholder='inventory-weight-placeholder-u',
+ spellcheck='false',
+ class='sheet-inventory__weight')
+
+ input(type='checkbox',
+ name='attr_inventory_notes_toggle',
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__secondary
+ .sheet-repitem__label(data-i18n='notes') Notes
+
+ input(type='text',
+ name='attr_inventory_notes',
+ placeholder='About this item...',
+ data-i18n-placeholder='inventory-notes-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-repitem__note sheet-stretch')
+
+ input(type='checkbox',
+ name='attr_inventory_weight_toggle',
+ checked=true,
+ title='Weight On/Off',
+ data-i18n-title='inventory-weight-toggle-title',
+ class='sheet-toggle sheet-toggle--special sheet-toggle--weight')
+
+ input(type='checkbox',
+ name='attr_inventory_note_box_toggle',
+ class='sheet-toggle sheet-toggle--note-box')
+
+ .sheet-repitem__note-box
+ textarea(name='attr_inventory_note_box',
+ placeholder='Notes',
+ data-i18n-placeholder='inventory-note-box-placeholder',
+ spellcheck='false')
+
+ .sheet-footer
+ span.sheet-label(data-i18n='inventory-total-weight') Total Weight:
+ span(name='attr_carry_weight_inventory',
+ class='sheet-label sheet-label--weight') 0.0
diff --git a/Savage Worlds - Graph Paper/source/templates/_meta.pug b/Savage Worlds - Graph Paper/source/templates/_meta.pug
new file mode 100644
index 0000000000..c812a7dea1
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_meta.pug
@@ -0,0 +1,18 @@
+.sheet-meta
+ .sheet-container
+ +meta_field('name', 'Name')
+ +meta_field('origin', 'Origin')
+ +meta_field('rank', 'Rank')
+ +meta_field('size', 'Size')
+ +meta_field('level', 'Level')
+ +meta_field('exp', 'EXP')
+ +meta_field('bennies', 'Bennies')
+
+ .sheet-container
+ +meta_field('gender', 'Gender')
+ +meta_field('age', 'Age')
+ +meta_field('hair', 'Hair')
+ +meta_field('eyes', 'Eyes')
+ +meta_field('height', 'Height')
+ +meta_field('weight', 'Weight')
+ +meta_field('bits', '#Bits')
diff --git a/Savage Worlds - Graph Paper/source/templates/_mixin_attribute.pug b/Savage Worlds - Graph Paper/source/templates/_mixin_attribute.pug
new file mode 100644
index 0000000000..3b6685441e
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_mixin_attribute.pug
@@ -0,0 +1,36 @@
+mixin attribute(name, short)
+ - var trait = name.toLowerCase()
+
+ .sheet-attribute(class=`sheet-attribute--${trait}`)
+
+ input(type='hidden', name=`attr_rename_${trait}`, value=name)
+ input(type='hidden', name=`attr_${trait}_roll`, value='1d4')
+ input(type='hidden', name=`attr_${trait}_wd_roll`, value='1d6')
+ input(type='hidden', name=`attr_${trait}_extra_wd_roll`, value='-10000')
+
+ input(type='hidden', name=`attr_${trait}_global_wd_roll`, value=`{{global_wd=@{query_global_wd}}} {{global_wdroll=[[ @{query_global_wd}!cs2 + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+ input(type='hidden', name=`attr_${trait}_global_bonus_wd_roll`, value=`{{bonus_wd=@{query_global_bonus_wd}}} {{bonus_wdroll=[[ @{query_global_bonus_wd}!cs2 + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+ input(type='hidden',
+ name=`attr_${trait}_roll_body`,
+ value!=`@{gm_roll} &{template:TraitRoll} {{rof=[[ 0 + @{query_global_rof} ]]}} {{header=@{name} ^{rolls} @{rename_${trait}}}} {{trait=@{rename_${trait}}}} {{traitdie=@{${trait}}}} {{flat=@{${trait}_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{modifier=?{@{query_modifier}|0}}} ${maxRof.map(n => `{{traitroll${n}=[[ @{${trait}_roll}!cs2 + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`).join(' ')} @{${trait}_global_wd_roll} @{${trait}_global_bonus_wd_roll}`)
+
+ button(type='roll',
+ name=`roll_${trait}`,
+ value!=`@{${trait}_roll_body} {{wd=@{${trait}_wd}}} {{wdroll=[[ @{${trait}_wd_roll}!cs2 + (@{${trait}_mod}+0)[Flat] - @{fatigue_mod}[FTG] - @{wound_mod}[WND] + (?{@{query_modifier}|0})[Modifier] ]]}} {{reroll=[r](~${trait})}}`,
+ class='sheet-attribute__button')
+ span(name=`attr_rename_${short.toLowerCase()}`, data-i18n=`${short.toLowerCase()}-u`)= short
+
+ input(type='text',
+ name=`attr_${trait}`,
+ placeholder='d4',
+ value='d4',
+ spellcheck='false',
+ class='sheet-hex sheet-hex--48 sheet-hexfield__input')
+
+ +hexfield(`${trait}_natural`, 'Natural', 'left', 'd4', '', 'sheet-hide-until-needed sheet-hexfield-gray sheet-hexfield--nat')
+
+ +hexfield(`${trait}_mod`, 'Bonus', 'right sheet-exception', '0', '', 'sheet-hide-until-needed sheet-stay-on-input sheet-hexfield--mod')
+
+ +hexfield(`${trait}_wd`, 'WD', 'right', 'd6', '', 'sheet-hide-until-needed sheet-hexfield-gray sheet-hexfield--wd')
diff --git a/Savage Worlds - Graph Paper/source/templates/_mixin_color_circle.pug b/Savage Worlds - Graph Paper/source/templates/_mixin_color_circle.pug
new file mode 100644
index 0000000000..3e425d516c
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_mixin_color_circle.pug
@@ -0,0 +1,10 @@
+- var colors = ['none', 'red', 'yellow', 'blue', 'green', 'purple', 'gray']
+
+mixin color_circle(attribute, classes)
+ .sheet-color-cycle(class=classes)
+ each color in colors
+ input(type='radio',
+ name=`attr_color_marker_${attribute}`,
+ value=color,
+ class=`sheet-color-cycle__radio sheet-color-cycle__radio--${color}`,
+ checked= color == 'none')
diff --git a/Savage Worlds - Graph Paper/source/templates/_mixin_hexfield.pug b/Savage Worlds - Graph Paper/source/templates/_mixin_hexfield.pug
new file mode 100644
index 0000000000..d65735cfef
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_mixin_hexfield.pug
@@ -0,0 +1,14 @@
+mixin hexfield(trait, label, alignment, placeholder=' ', value='', classes='')
+ .sheet-hexfield(class=`${classes} sheet-hexfield--${trait.toLowerCase().replace(/_/g, '-')}`)
+ input(type='text',
+ name=`attr_${trait.toLowerCase()}`,
+ placeholder=placeholder,
+ value=value,
+ spellcheck='false',
+ class='sheet-hex sheet-hex--36 sheet-hexfield__input')
+
+ if block
+ block
+
+ .sheet-hexfield__label(class=`sheet-hexfield__label--${alignment}`)
+ span(data-i18n=trait.toLowerCase().replace(/_/g, '-'))!= label
diff --git a/Savage Worlds - Graph Paper/source/templates/_mixin_meta_field.pug b/Savage Worlds - Graph Paper/source/templates/_mixin_meta_field.pug
new file mode 100644
index 0000000000..9e859acede
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_mixin_meta_field.pug
@@ -0,0 +1,12 @@
+mixin meta_field(attribute, label, placeholder=' ')
+ .sheet-meta-field
+ input(type='text',
+ name=`attr_${attribute}`,
+ placeholder=placeholder,
+ spellcheck='false',
+ class=`sheet-meta-field__input sheet-meta-field__input--${attribute}`)
+
+ - // Roll20 replaces "height" with "Page Height"
+ - var i18n = attribute == 'height' ? '_height' : attribute
+ .sheet-label
+ span(name=`attr_rename_label_${attribute}`, data-i18n=i18n)!= label
diff --git a/Savage Worlds - Graph Paper/source/templates/_mixin_simple_trait.pug b/Savage Worlds - Graph Paper/source/templates/_mixin_simple_trait.pug
new file mode 100644
index 0000000000..12236b899a
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_mixin_simple_trait.pug
@@ -0,0 +1,51 @@
+mixin simple_trait(name, label, value='d4-2', classes='', rename=false)
+ - var trait = name.toLowerCase()
+ - var trait_name = rename ? `@{rename_${trait}}` : label
+
+ .sheet-simple-trait(class=classes)
+ input.sheet-simple-trait__expand(type='checkbox',
+ name=`attr_expand_simple_${trait}`)
+
+ .sheet-background
+
+ - // Label roll
+ button(type='roll',
+ name=`roll_simple_${trait}`,
+ value!=`@{${trait}_roll_body} {{wd=@{${trait}_wd}}} {{wdroll=[[ @{${trait}_extra_wd_roll}!cs2 + (@{${trait}_untrained_mod})[Untrained] + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}} {{reroll=[r](~simple_${trait})}}`,
+ class='sheet-simple-trait__roll')
+ if rename
+ span(name=`attr_rename_${trait}`)!= label
+ else
+ span(data-i18n=trait)!= label
+
+ if trait != 'unskilled'
+ .sheet-simple-trait__buttons
+ - var dice = ['4', '6', '8', '10', '12']
+
+ each die in dice
+ - // Die button rolls
+ button(type='roll',
+ name=`roll_simple_${trait}_${die}`,
+ value!= `@{gm_roll} &{template:TraitRoll} {{rof=[[ 0 + @{query_global_rof} ]]}} {{header=@{name} ^{rolls} @{rename_${trait}}}} {{trait=@{rename_${trait}}}} {{traitdie=d${die}}} {{flat=@{${trait}_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{modifier=?{@{query_modifier}|0}}} ${maxRof.map(n => `{{traitroll${n}=[[ 1d${die}!cs2 + (@{${trait}_untrained_mod})[Untrained] + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`).join(' ')} @{${trait}_global_wd_roll} @{${trait}_global_bonus_wd_roll} {{wd=@{${trait}_wd}}} {{wdroll=[[ @{${trait}_extra_wd_roll}!cs2 + (@{${trait}_untrained_mod})[Untrained] + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}} {{reroll=[r](~simple_${trait}_${die})}}`,
+ class='sheet-simple-trait__custom-roll')= `d${die}`
+
+ span.sheet-simple-trait__label(name=`attr_${trait}_code`)= value
+
+ .sheet-simple-trait__inputs
+ input(type='text',
+ name=`attr_${trait}`,
+ placeholder='d4',
+ value=value,
+ spellcheck='false')
+
+ input(type='text',
+ name=`attr_${trait}_mod`,
+ placeholder='+/−',
+ data-i18n-placeholder='extra-trait-mod-placeholder',
+ spellcheck='false')
+
+ input(type='text',
+ name=`attr_${trait}_wd`,
+ placeholder='WD',
+ data-i18n-placeholder='extra-trait-wd-placeholder',
+ spellcheck='false')
diff --git a/Savage Worlds - Graph Paper/source/templates/_mixin_vehicle_weapons_sub_list.pug b/Savage Worlds - Graph Paper/source/templates/_mixin_vehicle_weapons_sub_list.pug
new file mode 100644
index 0000000000..fa637b4a2b
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_mixin_vehicle_weapons_sub_list.pug
@@ -0,0 +1,73 @@
+mixin vehicle_weapons_sub_list(classes='', item=10)
+ .sheet-repitem__weapons(class=classes)
+ .sheet-header
+ .sheet-header__labels
+ .sheet-repitem__weapons-name(data-i18n='sublist-weapons-name') Weapon
+ .sheet-repitem__weapons-damage(data-i18n='sublist-weapons-ap-damage') AP Damage
+ .sheet-repitem__weapons-damage(data-i18n='sublist-weapons-he-damage') HE Damage
+ .sheet-repitem__weapons-range(data-i18n='sublist-weapons-range') Range
+ .sheet-repitem__weapons-rof(data-i18n='sublist-weapons-rof') ROF
+
+ - var i = 0
+
+ while i < 10
+ - ++i
+ .sheet-repitem__subitem(class=`sheet-repitem__subitem--${i}`)
+ .sheet-repitem__primary
+ input(type='text',
+ name=`attr_vehicle_weapon_${i}_name`,
+ placeholder=`Weapon #${i}`,
+ data-i18n-placeholder=`sublist-weapons-name-placeholder-${i}`,
+ spellcheck='false',
+ class='sheet-align-left sheet-repitem__weapons-name sheet-stretch')
+
+ input(type='text',
+ name=`attr_vehicle_weapon_${i}_ap_damage`,
+ placeholder='3d10, AP 8',
+ data-i18n-placeholder='sublist-weapons-ap-damage-placeholder',
+ spellcheck='false',
+ class='sheet-repitem__weapons-damage')
+
+ input(type='text',
+ name=`attr_vehicle_weapon_${i}_he_damage`,
+ placeholder='3d8, AP 4, MBT',
+ data-i18n-placeholder='sublist-weapons-he-damage-placeholder',
+ spellcheck='false',
+ class='sheet-repitem__weapons-damage')
+
+ input(type='text',
+ name=`attr_vehicle_weapon_${i}_range`,
+ placeholder='50/100/200',
+ data-i18n-placeholder='sublist-weapons-range-placeholder',
+ spellcheck='false',
+ class='sheet-repitem__weapons-range')
+
+ input(type='text',
+ name=`attr_vehicle_weapon_${i}_rof`,
+ placeholder='1',
+ spellcheck='false',
+ class='sheet-repitem__weapons-rof')
+
+ input(type='checkbox',
+ name=`attr_vehicle_weapon_note_box_toggle_${i}`,
+ class='sheet-toggle sheet-toggle--note-box')
+
+ .sheet-repitem__note-box
+ textarea(name=`attr_vehicle_weapon_note_box_${i}`,
+ placeholder='Notes',
+ data-i18n-placeholder='sublist-weapons-note-box-placeholder',
+ spellcheck='false')
+
+ input(type='checkbox',
+ name=`attr_vehicle_weapon_${i}_notes_toggle`,
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__secondary
+ .sheet-repitem__note-label
+ span(data-i18n='sublist-weapons-notes-label') Notes:
+ input(type='text',
+ name=`attr_vehicle_weapon_${i}_notes`,
+ placeholder='Notes, Tags, Trappings, etc.',
+ data-i18n-placeholder='sublist-weapons-notes-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-repitem__note sheet-stretch')
diff --git a/Savage Worlds - Graph Paper/source/templates/_notebook.pug b/Savage Worlds - Graph Paper/source/templates/_notebook.pug
new file mode 100644
index 0000000000..0affc5c39b
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_notebook.pug
@@ -0,0 +1,4 @@
+.sheet-notebook
+ textarea(name='attr_notebook',
+ placeholder=' ',
+ spellcheck='false')
diff --git a/Savage Worlds - Graph Paper/source/templates/_power.pug b/Savage Worlds - Graph Paper/source/templates/_power.pug
new file mode 100644
index 0000000000..b3700eb491
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_power.pug
@@ -0,0 +1,15 @@
+input(type='checkbox',
+ name='attr_toggle_power_block',
+ checked=true,
+ class='sheet-toggle sheet-toggle--block')
+
+.sheet-power
+ input(type='text',
+ name='attr_power',
+ placeholder='0',
+ class='sheet-hex sheet-hex--64 sheet-hexfield__input')
+
+ span.sheet-header__title(name='attr_rename_block_power', data-i18n='power-energy') Power
+
+ +hexfield('power_consumed', 'Consumed', 'left', '0', '', 'sheet-hide-until-needed')
+ +hexfield('power_maximum', 'Max', 'right', '0', '', 'sheet-hide-until-needed')
diff --git a/Savage Worlds - Graph Paper/source/templates/_powerarmor.pug b/Savage Worlds - Graph Paper/source/templates/_powerarmor.pug
new file mode 100644
index 0000000000..d71a8a4398
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_powerarmor.pug
@@ -0,0 +1,89 @@
+input(type='checkbox',
+ name='attr_toggle_powerarmors_block',
+ class='sheet-toggle sheet-toggle--block')
+
+.sheet-block.sheet-powerarmors
+ .sheet-header
+ span.sheet-header__title.sheet-powerarmors__name(name='attr_rename_block_powerarmors', data-i18n='powerarmors') Power Armors
+ .sheet-header__labels
+ .sheet-powerarmors__size(data-i18n='powerarmors-size') Size
+ .sheet-powerarmors__armor(data-i18n='powerarmors-armor') Armor
+ .sheet-powerarmors__pace(data-i18n='powerarmors-pace') Pace
+ .sheet-powerarmors__mods(data-i18n='powerarmors-mods') Mods
+ .sheet-powerarmors__weight(data-i18n='powerarmors-weight') Weight
+ .sheet-powerarmors__weapons(data-i18n='powerarmors-weapons') Weap.
+
+ input(type='checkbox',
+ name='attr_powerarmors_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ fieldset.repeating_powerarmors
+ .sheet-repitem
+ .sheet-repitem__primary
+ input(type='text',
+ name='attr_powerarmor_name',
+ placeholder='Power Armor Type',
+ data-i18n-placeholder='powerarmors-name-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-powerarmors__name sheet-stretch')
+
+ input(type='text',
+ name='attr_powerarmor_size',
+ placeholder='1',
+ spellcheck='false',
+ class='sheet-powerarmors__size')
+
+ input(type='text',
+ name='attr_powerarmor_armor',
+ placeholder='8',
+ spellcheck='false',
+ class='sheet-powerarmors__armor')
+
+ input(type='text',
+ name='attr_powerarmor_pace',
+ placeholder='8',
+ spellcheck='false',
+ class='sheet-powerarmors__pace')
+
+ input(type='text',
+ name='attr_powerarmor_mods',
+ placeholder='0/5',
+ data-i18n-placeholder='powerarmors-mods-placeholder',
+ spellcheck='false',
+ class='sheet-powerarmors__mods')
+
+ input(type='text',
+ name='attr_powerarmor_weight',
+ placeholder='500',
+ data-i18n-placeholder='powerarmors-weight-placeholder',
+ spellcheck='false',
+ class='sheet-powerarmors__weight')
+
+ input(type='text',
+ name='attr_powerarmor_weapons_count',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-powerarmors__weapons')
+
+ input(type='checkbox',
+ name='attr_powerarmor_notes_toggle',
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__frame
+ .sheet-repitem__frame-silhouette
+
+ .sheet-repitem__frame-build
+ textarea(name='attr_powerarmor_build',
+ placeholder='Chassis | Modifications, Notes, etc.',
+ data-i18n-placeholder='powerarmors-build-placeholder',
+ spellcheck='false')
+
+ input(type='hidden',
+ name='attr_powerarmor_weapons_count',
+ value='0',
+ class='sheet-hidden sheet-repitem__weapons-control')
+
+ +vehicle_weapons_sub_list()
+
+ .sheet-footer
diff --git a/Savage Worlds - Graph Paper/source/templates/_powers.pug b/Savage Worlds - Graph Paper/source/templates/_powers.pug
new file mode 100644
index 0000000000..97c59ade88
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_powers.pug
@@ -0,0 +1,246 @@
+input(type='checkbox',
+ name='attr_toggle_pp',
+ class='sheet-hidden sheet-toggle--pp')
+
+input(type='checkbox',
+ name='attr_toggle_powers_block',
+ class='sheet-toggle sheet-toggle--block')
+
+.sheet-block.sheet-powers
+ .sheet-header
+ span.sheet-header__title.sheet-powers__name(name='attr_rename_block_powers', data-i18n='powers') Powers
+ .sheet-header__labels
+ .sheet-powers__damage
+ label(title='Toggle Damage Rolls',
+ data-i18n-title='toggle-damage-rolls-title',
+ class='sheet-damage-roll-toggle-label')
+ input.sheet-hidden(type='checkbox', name='attr_powers_damage_roll_toggle')
+ span.sheet-icon ;
+ span(data-i18n='powers-damage') Damage
+ .sheet-powers__range(data-i18n='powers-range') Range
+ .sheet-powers__ap(data-i18n='powers-ap') AP
+ .sheet-powers__pp.sheet-a(data-i18n='powers-pp') PP
+ .sheet-powers__penalty.sheet-b(data-i18n='powers-penalty') Penalty
+ .sheet-powers__duration(data-i18n='powers-duration') Duration
+
+ input(type='checkbox',
+ name='attr_powers_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ input(type='checkbox',
+ name='attr_powers_damage_roll_toggle',
+ class='sheet-damage-roll-toggle sheet-hidden')
+
+ input(type='checkbox',
+ name='attr_toggle_description_input_visibility',
+ checked=true,
+ class='sheet-toggle-description-input sheet-hidden')
+
+ input(type='checkbox',
+ name='attr_toggle_injection_input_visibility',
+ class='sheet-toggle-injection-input sheet-hidden')
+
+ fieldset.repeating_powers
+ .sheet-repitem
+ .sheet-repitem__primary
+ input(type='checkbox',
+ name='attr_roll_button_toggle',
+ class='sheet-hidden sheet-toggle sheet-toggle--list-roll')
+
+ button(type='roll',
+ name='roll_skill',
+ value!=`@{skill_roll_body} {{wd=@{skill_wd}}} {{wdroll=[[ @{skill_wd_roll}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}} @{wd_override} {{reroll=[r](~repeating_powers_skill)}} {{damageroll=[t](~repeating_powers_power_damage)}} {{description=@{roll_description}}} @{roll_injection}`,
+ class='sheet-repitem__skill-roll sheet-repitem__skill-roll--wildcard') 9
+
+ button(type='roll',
+ name='roll_extra_skill',
+ value!=`@{skill_roll_body} {{wd=@{skill_wd}}} {{wdroll=[[ @{skill_extra_wd_roll}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}} @{wd_override} {{reroll=[r](~repeating_powers_skill)}} {{damageroll=[t](~repeating_powers_power_damage)}} {{description=@{roll_description}}} @{roll_injection}`,
+ class='sheet-repitem__skill-roll sheet-repitem__skill-roll--extra') 9
+
+ input(type='text',
+ name='attr_power_name',
+ placeholder='Power',
+ data-i18n-placeholder='powers-name-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-powers__name sheet-stretch')
+
+ input(type='checkbox',
+ name='attr_damage_input_toggle',
+ checked=true,
+ class='sheet-hidden sheet-toggle')
+
+ .sheet-damage-button-overlay
+ input(type='hidden', name='attr_power_damage_roll', value='0')
+
+ button(type='roll',
+ name='roll_power_damage',
+ value!=`@{gm_roll} &{template:DamageRoll} {{header=@{name} ^{rolls} ^{damage}}} {{code=@{power_damage}}} {{source_label=^{source}}} {{source=@{power_name}}} {{rof=[[ 0 + @{rof_override} ]]}} {{modifier=?{@{query_damage_modifier}}}} {{range=@{power_range}}} {{ap=@{power_ap}}} {{trapping=@{power_trapping}}} ${maxRof.map(n => `{{roll${n}=[[ @{power_damage_roll} + (?{@{query_damage_modifier}}+0) ]]}}`).join(' ')} {{reroll=[r](~repeating_powers_power_damage)}}`)
+
+ input(type='text',
+ name='attr_power_damage',
+ placeholder='3d6',
+ data-i18n-placeholder='powers-damage-placeholder',
+ spellcheck='false',
+ class='sheet-powers__damage')
+
+ input(type='text',
+ name='attr_power_range',
+ placeholder='Range/Melee',
+ data-i18n-placeholder='powers-range-placeholder',
+ spellcheck='false',
+ class='sheet-powers__range')
+
+ input(type='text',
+ name='attr_power_ap',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-powers__ap')
+
+ input(type='text',
+ name='attr_power_pp',
+ placeholder='2',
+ data-i18n-placeholder='powers-pp-placeholder',
+ spellcheck='false',
+ class='sheet-a sheet-powers__pp')
+
+ input(type='text',
+ name='attr_power_penalty',
+ placeholder='-1',
+ spellcheck='false',
+ class='sheet-b sheet-powers__penalty')
+
+ input(type='text',
+ name='attr_power_duration',
+ placeholder='Duration',
+ data-i18n-placeholder='powers-duration-placeholder',
+ spellcheck='false',
+ class='sheet-powers__duration')
+
+ input(type='checkbox',
+ name='attr_power_notes_toggle',
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__secondary
+ input(type='checkbox',
+ name='attr_trapping_toggle',
+ checked=true,
+ class='sheet-hidden sheet-toggle')
+
+ .sheet-repitem__label(data-i18n='trapping') Trapping
+
+ input(type='text',
+ name='attr_power_trapping',
+ placeholder='Fire, Light, etc.',
+ data-i18n-placeholder='powers-trapping-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-powers__trapping')
+
+ .sheet-repitem__label(data-i18n='notes') Notes
+
+ input(type='text',
+ name='attr_power_notes',
+ placeholder='Effect/Description',
+ data-i18n-placeholder='powers-notes-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-repitem__note sheet-stretch')
+
+ input(type='checkbox',
+ name='attr_power_settings_toggle',
+ class='sheet-toggle sheet-toggle--settings')
+
+ .sheet-repitem__settings
+ .sheet-repitem__settings-content
+ label.sheet-label-toggle.sheet-label-toggle--full-row.sheet-roll-description
+ input(type="hidden", name='attr_roll_description')
+ input(type='checkbox', name='attr_roll_description_toggle')
+ span(data-i18n='roll-description') Description
+ input(type='text',
+ name='attr_roll_description_input',
+ placeholder='Narrative or functional description below the header in the Roll Template. Leave empty to disable.',
+ data-i18n-placeholder='roll-description-placeholder',
+ value='',
+ spellcheck='false',
+ class='sheet-label-toggle__input')
+
+ label.sheet-label-toggle.sheet-label-toggle--full-row.sheet-roll-injection
+ input(type="hidden", name='attr_roll_injection')
+ input(type='checkbox', name='attr_roll_injection_toggle')
+ span(data-i18n='roll-injection') Roll Injection
+ input(type='text',
+ name='attr_roll_injection_input',
+ placeholder='{{source_label=}} {{source=}} {{custom3_label=}} {{custom3=}} {{rof=[[ 1 ]]}} {{traitroll8=}}',
+ data-i18n-placeholder='roll-injection-placeholder',
+ value='',
+ spellcheck='false',
+ class='sheet-label-toggle__input')
+
+ label.sheet-label-toggle
+ input(type='checkbox', name='attr_damage_input_toggle', checked=true)
+ span(data-i18n='damage') Damage
+
+ label.sheet-label-toggle
+ input(type='checkbox', name='attr_trapping_toggle', checked=true)
+ span(data-i18n='trapping') Trapping
+
+ label.sheet-label-toggle
+ input(type='hidden', name='attr_skill_wd', value='@{spellcasting_wd}')
+ input(type='hidden', name='attr_skill_mod', value='@{spellcasting_mod}')
+ input(type='hidden', name='attr_skill_untrained_mod', value='@{spellcasting_untrained_mod}')
+ input(type='hidden', name='attr_skill_roll', value='@{spellcasting_roll}')
+ input(type='hidden', name='attr_skill_wd_roll', value='@{spellcasting_wd_roll}')
+ input(type='hidden', name='attr_skill_extra_wd_roll', value='@{spellcasting_wd_roll}')
+
+ input(type='hidden', name=`attr_skill_global_wd_roll`, value=`{{global_wd=@{query_global_wd}}} {{global_wdroll=[[ @{query_global_wd}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+ input(type='hidden', name=`attr_skill_global_bonus_wd_roll`, value=`{{bonus_wd=@{query_global_bonus_wd}}} {{bonus_wdroll=[[ @{query_global_bonus_wd}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+ input(type='hidden',
+ name=`attr_skill_roll_body`,
+ value!=`@{gm_roll} &{template:TraitRoll} {{rof=[[ 0 + @{rof_override} ]]}} {{header=@{name} ^{rolls} @{skill_name}}} {{trait=@{skill_name}}} {{source_label=^{power}}} {{source=@{power_name}}} {{traitdie=@{skill_roll}}} {{flat=@{skill_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{modifier=?{@{query_modifier}|0}}} {{bonus=@{skill_bonus}}} ${maxRof.map(n => `{{traitroll${n}=[[ @{skill_roll}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`).join(' ')} @{skill_global_wd_roll} @{skill_global_bonus_wd_roll}`)
+
+ input(type='checkbox', name='attr_roll_button_toggle')
+ span(data-i18n='roll-button') Roll Button
+ input(type='text',
+ name='attr_skill_name',
+ placeholder='Spellcasting',
+ data-i18n-placeholder='powers-skill-placeholder',
+ value='Spellcasting',
+ spellcheck='false',
+ class='sheet-label-toggle__input')
+ input(type='text',
+ name='attr_skill_bonus',
+ placeholder='+0',
+ class='sheet-label-toggle__input sheet-label-toggle__input--tiny')
+
+ label.sheet-label-toggle
+ input(type="hidden", name='attr_rof_override', value='1')
+ input(type='checkbox', name='attr_rof_override_toggle')
+ span(data-i18n='query-rof') Query RoF
+
+ label.sheet-label-toggle
+ input(type="hidden", name='attr_wd_override', value='')
+ input(type='checkbox', name='attr_wd_override_toggle')
+ span(data-i18n='wild-die-override') WD Override
+ input(type='text',
+ name='attr_wd_override_die',
+ value='',
+ spellcheck='false',
+ class='sheet-label-toggle__input sheet-label-toggle__input--tiny')
+
+ label.sheet-label-toggle(title='Exploding Damage Dice On/Off', data-i18n-title='ace-damage-title')
+ input(type="hidden", name='attr_explode_damage', value='!')
+ input(type='checkbox', name='attr_explode_damage_toggle', checked=true)
+ span(data-i18n='ace-damage') Ace Damage
+
+ input(type='checkbox',
+ name='attr_power_note_box_toggle',
+ class='sheet-toggle sheet-toggle--note-box')
+
+ .sheet-repitem__note-box
+ textarea(name='attr_power_note_box',
+ placeholder='Notes',
+ data-i18n-placeholder='powers-note-box-placeholder',
+ spellcheck='false')
+
+ .sheet-footer
diff --git a/Savage Worlds - Graph Paper/source/templates/_quick_notes.pug b/Savage Worlds - Graph Paper/source/templates/_quick_notes.pug
new file mode 100644
index 0000000000..ca333cfffc
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_quick_notes.pug
@@ -0,0 +1,20 @@
+input(type='checkbox',
+ name='attr_toggle_quick_notes_block',
+ checked=true,
+ class='sheet-hidden sheet-toggle sheet-toggle-block')
+
+.sheet-quick-notes
+ .sheet-header
+ span.sheet-header__title(name='attr_rename_block_quick_notes', data-i18n='quick-notes') Quick Notes
+
+ input(type='checkbox',
+ name='attr_quick_notes_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ .sheet-quick-notes__content
+ input.sheet-hidden(type='checkbox', name='attr_toggle_quick_notes_extension')
+
+ textarea(name='attr_quick_notes', spellcheck='false')
+
+ .sheet-footer
diff --git a/Savage Worlds - Graph Paper/source/templates/_roll_template.pug b/Savage Worlds - Graph Paper/source/templates/_roll_template.pug
new file mode 100644
index 0000000000..eba007ee0d
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_roll_template.pug
@@ -0,0 +1,205 @@
+rolltemplate.sheet-rolltemplate-TraitRoll
+ .sheet-rolltemplate
+ .sheet-rolltemplate__header {{header}}
+ = '{{#description}}'
+ .sheet-rolltemplate__description {{description}}
+ = '{{/description}}'
+ .sheet-rolltemplate__content
+ = '{{#reroll}}'
+ .sheet-rolltemplate__reroll(title='Reroll', data-i18n-title='rolltemplate-reroll-title')
+ .sheet-rolltemplate__button {{reroll}}
+ = '{{/reroll}}'
+ = '{{#damageroll}}'
+ .sheet-rolltemplate__roll-damage(title='Roll Damage', data-i18n-title='rolltemplate-damage-title')
+ .sheet-rolltemplate__button {{damageroll}}
+ = '{{/damageroll}}'
+ = '{{#source_label}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left {{source_label}}
+ .sheet-right {{source}}
+ = '{{/source_label}}'
+ = '{{#traitdie}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left {{trait}}
+ .sheet-right
+ span {{traitdie}}
+ = '{{#flat}}'
+ span ({{flat}})
+ = '{{/flat}}'
+ = '{{/traitdie}}'
+ = '{{#rollLess() global_wdroll 0}}'
+ = '{{#wd}}'
+ = '{{#rollGreater() wdroll -1000}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-wild-die') Wild Die
+ .sheet-right {{wd}}
+ = '{{/rollGreater() wdroll -1000}}'
+ = '{{/wd}}'
+ = '{{/rollLess() global_wdroll 0}}'
+ = '{{#rollGreater() global_wdroll -1000}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-wild-die') Wild Die
+ .sheet-right {{global_wd}}
+ = '{{/rollGreater() global_wdroll -1000}}'
+ = '{{#rollGreater() bonus_wdroll -1000}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-bonus-wild-die') Bonus Wild Die
+ .sheet-right {{bonus_wd}}
+ = '{{/rollGreater() bonus_wdroll -1000}}'
+ = '{{#commander}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-commander') Commander
+ .sheet-right {{commander}}
+ = '{{/commander}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-modifier') Modifier
+ .sheet-right {{modifier}}{{#bonus}} ({{bonus}}){{/bonus}}
+ = '{{#rollGreater() rof 1}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-dice-rof') Dice/RoF
+ .sheet-right {{rof}}
+ = '{{/rollGreater() rof 1}}'
+ = '{{#rollGreater() wounds 0}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-wound-penalty') Wound Penalty
+ .sheet-right {{wounds}}
+ = '{{/rollGreater() wounds 0}}'
+ = '{{#rollGreater() fatigue 0}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-fatigue') Fatigue
+ .sheet-right {{fatigue}}
+ = '{{/rollGreater() fatigue 0}}'
+ = '{{#custom1_label}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left {{custom1_label}}
+ .sheet-right {{custom1}}
+ = '{{/custom1_label}}'
+ = '{{#custom2_label}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left {{custom2_label}}
+ .sheet-right {{custom2}}
+ = '{{/custom2_label}}'
+ = '{{#custom3_label}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left {{custom3_label}}
+ .sheet-right {{custom3}}
+ = '{{/custom3_label}}'
+ .sheet-rolltemplate__dice
+ .sheet-left
+ each roll in maxRof
+ if roll > 1
+ = `{{#rollGreater() rof ${roll-1}}}`
+ .sheet-rolltemplate__roll(class=`sheet-rolltemplate__roll--${roll}`)
+ = `{{traitroll${roll}}}`
+ if roll > 1
+ = `{{/rollGreater() rof ${roll-1}}}`
+ .sheet-right
+ = '{{#rollLess() global_wdroll -100}}'
+ = '{{#rollGreater() wdroll -1000}}'
+ .sheet-rolltemplate__roll.sheet-rolltemplate__roll--wd
+ = '{{wdroll}}'
+ = '{{/rollGreater() wdroll -1000}}'
+ = '{{/rollLess() global_wdroll -100}}'
+ = '{{#rollGreater() global_wdroll -1000}}'
+ .sheet-rolltemplate__roll.sheet-rolltemplate__roll--wd
+ = '{{global_wdroll}}'
+ = '{{/rollGreater() global_wdroll -1000}}'
+ = '{{#rollGreater() bonus_wdroll -1000}}'
+ .sheet-rolltemplate__roll.sheet-rolltemplate__roll--wd
+ = '{{bonus_wdroll}}'
+ = '{{/rollGreater() bonus_wdroll -1000}}'
+
+rolltemplate.sheet-rolltemplate-DiceRoller
+ .sheet-rolltemplate
+ .sheet-rolltemplate__header {{header}}
+ .sheet-rolltemplate__content
+ .sheet-rolltemplate__reroll(title='Reroll', data-i18n-title='rolltemplate-reroll-title')
+ .sheet-rolltemplate__button {{reroll}}
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-dice-rof') Dice/RoF
+ .sheet-right {{rof}}
+ .sheet-rolltemplate__dice
+ each roll in maxRof
+ if roll > 1
+ = `{{#rollGreater() rof ${roll-1}}}`
+ .sheet-rolltemplate__roll(class=`sheet-rolltemplate__roll--${roll}`)
+ = `{{roll${roll}}}`
+ if roll > 1
+ = `{{/rollGreater() rof ${roll-1}}}`
+
+rolltemplate.sheet-rolltemplate-RunRoll
+ .sheet-rolltemplate
+ .sheet-rolltemplate__header {{header}}
+ .sheet-rolltemplate__content {{content}}
+
+rolltemplate.sheet-rolltemplate-InfoBox
+ .sheet-rolltemplate
+ .sheet-rolltemplate__content {{content}}
+
+rolltemplate.sheet-rolltemplate-DamageRoll
+ .sheet-rolltemplate
+ .sheet-rolltemplate__header {{header}}
+ = '{{#description}}'
+ .sheet-rolltemplate__description {{description}}
+ = '{{/description}}'
+ .sheet-rolltemplate__content
+ = '{{#reroll}}'
+ .sheet-rolltemplate__reroll(title='Reroll', data-i18n-title='rolltemplate-reroll-title')
+ .sheet-rolltemplate__button {{reroll}}
+ = '{{/reroll}}'
+ = '{{#source_label}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left {{source_label}}
+ .sheet-right {{source}}
+ = '{{/source_label}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-damage') Damage
+ .sheet-right {{code}}
+ = '{{#modifier}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-damage-modifier') Damage Modifier
+ .sheet-right {{modifier}}
+ = '{{/modifier}}'
+ = '{{#ap}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-armor-piercing') Armor Piercing
+ .sheet-right {{ap}}
+ = '{{/ap}}'
+ = '{{#rollGreater() rof 1}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-hits-rof') Hits/RoF
+ .sheet-right {{rof}}
+ = '{{/rollGreater() rof 1}}'
+ = '{{#range}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-range') Range
+ .sheet-right {{range}}
+ = '{{/range}}'
+ = '{{#trapping}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left(data-i18n='rolltemplate-trapping') Trapping
+ .sheet-right {{trapping}}
+ = '{{/trapping}}'
+ = '{{#custom1_label}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left {{custom1_label}}
+ .sheet-right {{custom1}}
+ = '{{/custom1_label}}'
+ = '{{#custom2_label}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left {{custom2_label}}
+ .sheet-right {{custom2}}
+ = '{{/custom2_label}}'
+ = '{{#custom3_label}}'
+ .sheet-rolltemplate__content-row
+ .sheet-left {{custom3_label}}
+ .sheet-right {{custom3}}
+ = '{{/custom3_label}}'
+ .sheet-rolltemplate__dice.sheet-rolltemplate__dice--damage
+ each roll in maxRof
+ if roll > 1
+ = `{{#rollGreater() rof ${roll-1}}}`
+ .sheet-rolltemplate__damage-roll
+ = `{{roll${roll}}}`
+ if roll > 1
+ = `{{/rollGreater() rof ${roll-1}}}`
diff --git a/Savage Worlds - Graph Paper/source/templates/_secondary.pug b/Savage Worlds - Graph Paper/source/templates/_secondary.pug
new file mode 100644
index 0000000000..64f8119d0b
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_secondary.pug
@@ -0,0 +1,36 @@
+.sheet-secondary
+ +hexfield('pace', 'Pace', 'bottom', '6', '6')
+ +hexfield('flight', 'Flight', 'right', '0', '', 'sheet-hide-until-needed sheet-stay-on-input')
+ +hexfield('run', 'Run', 'left', 'd6', '', 'sheet-hide-until-needed')
+ input(type='hidden', name='attr_run_roll', value='d6')
+ +hexfield('parry', 'Parry', 'bottom', '2')
+ +hexfield('toughness', 'Tough.', 'bottom', '4')
+
+ .sheet-hexfield(class=' sheet-hexfield--soak')
+ input(type='text',
+ name='attr_soak',
+ placeholder='d4',
+ value='d4',
+ spellcheck='false',
+ class='sheet-hex sheet-hex--36 sheet-hexfield__input')
+
+ +hexfield('soak_mod', 'Bonus', 'up sheet-exception', '0', '', 'sheet-hide-until-needed sheet-stay-on-input')
+ +hexfield('soak_wd', 'WD', 'right', 'd6', '', 'sheet-hide-until-needed')
+
+ input(type='hidden', name='attr_soak_roll', value='1d4!cs2')
+ input(type='hidden', name='attr_soak_wd_roll', value='1d6!cs2')
+ input(type='hidden', name='attr_soak_extra_wd_roll', value='-10000')
+
+ input(type='hidden', name=`attr_soak_global_wd_roll`, value=`{{global_wd=@{query_global_wd}}} {{global_wdroll=[[ @{query_global_wd}!cs2 @{soak_mod} - @{fatigue_mod} - @{wound_mod} + ?{@{query_modifier}|0} ]]}}`)
+
+ input(type='hidden', name=`attr_soak_global_bonus_wd_roll`, value=`{{bonus_wd=@{query_global_bonus_wd}}} {{bonus_wdroll=[[ @{query_global_bonus_wd}!cs2 @{soak_mod} - @{fatigue_mod} - @{wound_mod} + ?{@{query_modifier}|0} ]]}}`)
+
+ input(type='hidden',
+ name=`attr_soak_extra_template`,
+ value!=`@{gm_roll} &{template:TraitRoll} {{header=@{name} ^{rolls} ^{soak}}} {{trait=^{soak}}} {{traitdie=@{soak}}} {{flat=@{soak_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{rof=[[ 1 ]]}} {{modifier=?{@{query_modifier}|0}}} {{wd=@{soak_wd}}} {{traitroll1=[[ @{soak_roll} @{soak_mod} - @{fatigue_mod} - @{wound_mod} + ?{@{query_modifier}|0} ]]}} {{wdroll=[[ @{soak_extra_wd_roll} @{soak_mod} - @{fatigue_mod} - @{wound_mod} + ?{@{query_modifier}|0} ]]}} @{soak_global_wd_roll} @{soak_global_bonus_wd_roll} {{reroll=[r](~soak)}}`)
+
+ button(type='roll',
+ name='roll_soak',
+ value!=`@{gm_roll} &{template:TraitRoll} {{header=@{name} ^{rolls} ^{soak}}} {{trait=^{soak}}} {{traitdie=@{soak}}} {{flat=@{soak_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{rof=[[ 1 ]]}} {{modifier=?{@{query_modifier}|0}}} {{wd=@{soak_wd}}} {{traitroll1=[[ @{soak_roll} @{soak_mod} - @{fatigue_mod} - @{wound_mod} + ?{@{query_modifier}|0} ]]}} {{wdroll=[[ @{soak_wd_roll} @{soak_mod} - @{fatigue_mod} - @{wound_mod} + ?{@{query_modifier}|0} ]]}} @{soak_global_wd_roll} @{soak_global_bonus_wd_roll} {{reroll=[r](~soak)}}`,
+ class='sheet-hexfield__label sheet-hexfield__label--bottom')
+ span(data-i18n='soak') Soak
diff --git a/Savage Worlds - Graph Paper/source/templates/_settings.pug b/Savage Worlds - Graph Paper/source/templates/_settings.pug
new file mode 100644
index 0000000000..0f5bc019ee
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_settings.pug
@@ -0,0 +1,501 @@
+.sheet-settings
+ input(type='radio',
+ name='attr_settings_pages',
+ value='styles',
+ label='Styles',
+ data-i18n-label='settings-tab-styles',
+ checked=true,
+ class='sheet-settings__page-tab sheet-settings__page-tab--styles')
+
+ input(type='radio',
+ name='attr_settings_pages',
+ value='setup',
+ label='Setup',
+ data-i18n-label='settings-tab-setup',
+ class='sheet-settings__page-tab sheet-settings__page-tab--setup')
+
+ input(type='radio',
+ name='attr_settings_pages',
+ value='blocks',
+ label='Blocks',
+ data-i18n-label='settings-tab-blocks',
+ class='sheet-settings__page-tab sheet-settings__page-tab--blocks')
+
+ input(type='radio',
+ name='attr_settings_pages',
+ value='skills',
+ label='Skills',
+ data-i18n-label='settings-tab-skills',
+ class='sheet-settings__page-tab sheet-settings__page-tab--skills')
+
+ input(type='radio',
+ name='attr_settings_pages',
+ value='help',
+ label='Help',
+ data-i18n-label='settings-tab-help',
+ class='sheet-settings__page-tab sheet-settings__page-tab--help')
+
+ .sheet-settings__page.sheet-settings__page--styles
+ label.sheet-settings__item
+ span(data-i18n='settings-style-background-grid') Background Grid
+ input(type='checkbox',
+ name='attr_toggle_style_grid',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-style-dark-labels') Dark Labels
+ input(type='checkbox',
+ name='attr_toggle_style_dark_labels',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-style-roboto-font') Roboto Font (Off: Helvetica Neue)
+ input(type='checkbox',
+ name='attr_toggle_style_roboto',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-style-rounded-corners') Rounded Corners
+ input(type='checkbox',
+ name='attr_toggle_style_corners',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-style-skill-die-numbers') Skill Die Numbers
+ input(type='checkbox',
+ name='attr_toggle_skill_die_numbers',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-style-transitions') Transitions
+ input(type='checkbox',
+ name='attr_toggle_style_transitions',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-style-transition-delays') Transition Delays
+ input(type='checkbox',
+ name='attr_toggle_style_delays',
+ checked=true,
+ class='sheet-checkbox')
+
+ .sheet-settings__page.sheet-settings__page--setup
+ label.sheet-settings__item
+ span(data-i18n='settings-function-augmentation-markers') Augmentation Markers
+ input(type='checkbox',
+ name='attr_toggle_augmentation_markers',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-rule-augmentation-strain') Augmentation Strain (SciFi Companion)
+ input(type='checkbox',
+ name='attr_toggle_strain',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-function-explode-run-die') Explode Run Die
+ input(type='checkbox',
+ name='attr_toggle_run_explode',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-function-roll-description-inputs') List Roll Description Inputs
+ input(type='checkbox',
+ name='attr_toggle_description_input_visibility',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-function-roll-injection-inputs') List Roll Injection Inputs
+ input(type='checkbox',
+ name='attr_toggle_injection_input_visibility',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-rule-no-power-points') No Power Points (SWADE 140)
+ input(type='checkbox',
+ name='attr_toggle_pp',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-function-running-ignores-wounds') Running Ignores Wounds
+ input(type='checkbox',
+ name='attr_toggle_run_wounds',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-function-running-applies-fatigue') Running Applies Fatigue
+ input(type='checkbox',
+ name='attr_toggle_run_fatigue',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-function-silhouette-markers') Silhouette Markers
+ input(type='checkbox',
+ name='attr_toggle_silhouette_markers',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span(data-i18n='settings-function-skill-markers') Skill Markers
+ input(type='checkbox',
+ name='attr_toggle_skill_markers',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item
+ span
+ span(data-i18n='settings-misc-extent-prefix') Extend
+ span(name='attr_rename_block_quick_notes', data-i18n='quick-notes') Quick Notes
+ input(type='checkbox',
+ name='attr_toggle_quick_notes_extension',
+ class='sheet-checkbox')
+
+ - var i = 0
+
+ while i < 3
+ - ++i
+
+ label.sheet-settings__item.sheet-settings__item--text-input.sheet-settings__item--textarea
+ span(data-i18n=`settings-custom-button-${i}-label`)= `[Custom Button #${i}]`
+ input(type='text',
+ name=`attr_rename_custom_button_${i}`,
+ placeholder='UnShake/Detox/etc.',
+ data-i18n-placeholder='settings-custom-buttons-placeholder',
+ value= i == 1 ? 'UnShake' : `Button #${i}`,
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name=`attr_toggle_custom_button_${i}`,
+ class='sheet-checkbox sheet-settings__textarea-toggle')
+ textarea(name=`attr_custom_button_${i}_macro`, spellcheck='false')
+ !=`&{template:TraitRoll} {{header=@{name} ^{rolls} @{rename_spirit}}} {{trait=@{rename_spirit}}} {{traitdie=@{spirit}}} {{flat=@{spirit_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{modifier=?{@{query_modifier}|0}}} {{traitroll1=[[ @{spirit_roll} @{spirit_mod} - @{fatigue_mod} - @{wound_mod} + ?{@{query_modifier}|0} ]]}} {{wd=@{spirit_wd}}} {{wdroll=[[ @{spirit_wd_roll} @{spirit_mod} - @{fatigue_mod} - @{wound_mod} + ?{@{query_modifier}|0} ]]}} @{spirit_global_wd_roll} @{spirit_global_bonus_wd_roll}`
+
+ .sheet-settings__page.sheet-settings__page--blocks
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-abilities-label') [Abilities]
+ input(type='text',
+ name='attr_rename_block_abilities',
+ placeholder='Abilities',
+ data-i18n-placeholder='abilities',
+ value='Abilities',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_abilities_block',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-allies-label') [Allies]
+ input(type='text',
+ name='attr_rename_block_allies',
+ placeholder='Allies',
+ data-i18n-placeholder='allies',
+ value='Allies',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_allies_block',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-ammunition-label') [Ammunition]
+ input(type='text',
+ name='attr_rename_block_ammunition',
+ placeholder='Ammunition',
+ data-i18n-placeholder='ammunition',
+ value='Ammunition',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_ammunition_block',
+ checked=true,
+ class='sheet-checkbox')
+
+ - var i = 0
+
+ while i < 3
+ - ++i
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n=`settings-ammunition-container-${i}-label`)= `[Ammo #${i}]`
+ input(type='text',
+ name=`attr_rename_ammunition_container_${i}`,
+ placeholder=`Ammo #${i}`,
+ data-i18n-placeholder=`settings-ammunition-container-${i}-placeholder`,
+ value=`Ammo #${i}`,
+ spellcheck='false',
+ class='sheet-align-left')
+ span p
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-augmentations-label') [Augmentations]
+ input(type='text',
+ name='attr_rename_block_augmentations',
+ placeholder='Augmentations',
+ data-i18n-placeholder='augmentations',
+ value='Augmentations',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_augmentations_block',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-engrams-label') [Engrams]
+ input(type='text',
+ name='attr_rename_block_engrams',
+ placeholder='Engrams',
+ data-i18n-placeholder='engrams',
+ value='Engrams',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_engrams_block',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-integrity-label') [Integrity]
+ input(type='text',
+ name='attr_rename_block_integrity',
+ placeholder='Integrity',
+ data-i18n-placeholder='integrity',
+ value='Integrity',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_integrity_block',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-powerarmors-label') [Power Armors]
+ input(type='text',
+ name='attr_rename_block_powerarmors',
+ placeholder='Power Armors',
+ data-i18n-placeholder='powerarmors',
+ value='Power Armors',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_powerarmors_block',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-power-energy-label') [Power/Energy/Mana]
+ input(type='text',
+ name='attr_rename_block_power',
+ placeholder='Power',
+ data-i18n-placeholder='power',
+ value='Power',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_power_block',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-powers-spells-label') [Powers/Spells]
+ input(type='text',
+ name='attr_rename_block_powers',
+ placeholder='Powers',
+ data-i18n-placeholder='powers',
+ value='Powers',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_powers_block',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-quick-notes-label') [Quick Notes]
+ input(type='text',
+ name='attr_rename_block_quick_notes',
+ placeholder='Quick Notes',
+ data-i18n-placeholder='quick-notes',
+ value='Quick Notes',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_quick_notes_block',
+ checked=true,
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-vehicles-label') [Vehicles]
+ input(type='text',
+ name='attr_rename_block_vehicles',
+ placeholder='Vehicles',
+ data-i18n-placeholder='vehicles',
+ value='Vehicles',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_vehicles_block',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-walkers-label') [Walkers]
+ input(type='text',
+ name='attr_rename_block_walkers',
+ placeholder='Walkers',
+ data-i18n-placeholder='walkers',
+ value='Walkers',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_walkers_block',
+ class='sheet-checkbox')
+
+ .sheet-settings__page.sheet-settings__page--skills
+ -
+ var skills = ['Battle', 'Boating', 'Driving', 'Electronics', 'Faith', 'Focus',
+ 'Gambling', 'Hacking', 'Healing', 'Language', 'MAGIC', 'Occult',
+ 'Performance', 'Piloting', 'Repair', 'Psionics', 'Research',
+ 'Riding', 'Science', 'Spellcasting', 'Survival', 'Taunt',
+ 'Weird Science']
+
+ var disabledSkills = ['Faith', 'Focus', 'Occult', 'Psionics', 'Language',
+ 'Spellcasting', 'Weird Science']
+
+ each skill in skills
+ - var substring = skill.toLowerCase().replace(/ /g, '_')
+
+ label.sheet-settings__item
+ span(name=`attr_rename_${substring}`)= skill
+ input(type='checkbox',
+ name=`attr_toggle_skill_${substring}`,
+ checked= !disabledSkills.includes(skill),
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-custom-skill-1-label') [Custom Skill #1]
+ input(type='text',
+ name='attr_rename_custom_skill_1',
+ placeholder='Custom Skill 1',
+ data-i18n-placeholder='settings-custom-skill-1-placeholder',
+ value='Custom Skill 1',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_skill_custom_skill_1',
+ class='sheet-checkbox')
+
+ label.sheet-settings__item.sheet-settings__item--text-input
+ span(data-i18n='settings-custom-skill-2-label') [Custom Skill #2]
+ input(type='text',
+ name='attr_rename_custom_skill_2',
+ placeholder='Custom Skill 2',
+ data-i18n-placeholder='settings-custom-skill-2-placeholder',
+ value='Custom Skill 2',
+ spellcheck='false',
+ class='sheet-align-left')
+ input(type='checkbox',
+ name='attr_toggle_skill_custom_skill_2',
+ class='sheet-checkbox')
+
+ .sheet-settings__page.sheet-settings__page--help
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-ammunition') Ammunition
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-ammunition-description') You can keep track of up to three named "magazines" in the Ammunition block. The buttons allow you to quickly add to or subtract from the values. You can save a value with [S] and restore it with [R].
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-armor-and-notes') Armor & Notes
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-armor-and-notes-description') Enter your Armor ratings for the corresponding limbs. They are not self-calculating since there are too many factors; this is more convenient. You can add notes for Resistances, circumstance modifiers, or relevant augmentations such as subdermal armor to keep things in one place.
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-attribute-reference') Attribute Reference
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-attribute-reference-description') The attributes of this sheet follow a simple naming pattern and can be easily derived from their labels. Just remove any dots or special characters, expand abbreviations, convert to lowercase, and replace whitespaces with underscores (_). Adjacent attributes are appended with hyphens as well. So "Agility" becomes @{agility}, @{agility_mod}, @{agility_wd}, @{agility_extra_wd} (for extras only), and @{agility_natural}. "Tough." becomes @{toughness} and Armor is referenced with @{armor_head|_torso|_arms|_legs}. English only!
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-weapon-damage-rolls') Damage Rolls
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-weapon-damage-rolls-description') You can enable damage rolls for list items by clicking the damage label. This will disable editing. Note that the dice codes must be valid, but you can use "Str" or "Agi" (etc.) as shorthands to reference attributes. The parser is not smart, however, so please also refer to the Roll20 Dice Reference.
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-edges-and-hindrances') Edges & Hindrances
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-edges-and-hindrances-description') Manage your Edges and Hindrances here. They follow a horizontal masonry layout to save space and remain visible for convenience. The width is automatically adjusted once you press enter and you can cycle through colored labels to indicate Rank, type, and more. Sorting is wonky though.
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-extra-sheet') Extra Sheet
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-extra-sheet-description') For non-player characters, you can change the layout to a more compact alternative with the switch right above the sheet. This version lacks many features but is primed for Extras without Wild Die. Of course, you can add Wild Dice if needed. Edit Traits by clicking on their die, opening a small menu, and roll with the label. Hovering reveals buttons for direct die rolls. Add skills by clicking the framed pencil icon in the header. Lists work as usual.
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-helper-buttons') Helper Buttons
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-helper-buttons-description') The buttons above the skill section provide selected actions and convenience functions. The dice roller input is parsed, so you can write codes like "Sma+2d6". You may also use references such as @{athletics} or macros, but beware that the parser is not smart. Hidden rolls are sent only to the GM. The toggles can enable/disable additional roll queries for the whole sheet.
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-hexagon-fields') Hexagon Fields
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-hexagon-fields-description') Your attributes and secondary statistics. They either accept dice codes (d4 to d12) or integers. Positive modifiers are automatically prefixed. Hovering reveals additional fields that are otherwise invisible until relevant. You can leave them empty to use defaults, such as a d6 as Wild Die. The Wild Die can be disabled with "n/a". The labels act as roll buttons.
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-list-item-options') List Item Options
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-list-item-options-description')!= 'Interactive list items, such as weapons and powers, come with options. When the item is folded out, you can access them via the gear icon. Typical options include toggles for buttons and fields, but some also allow to override the Wild Die and more. Mind that the inputs are not validated; do not enter nonsense!'
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-raise-damage') Raise Damage
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-raise-damage-description') There is no general function or field to apply raise damage since this modifier is too flexible. But nothing stops you from entering "1d6" when prompted to add a damage modifier. You could also add "2d4+2" or whatever modifier may apply.
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-rate-of-fire') Rate of Fire (Multiple Dice)
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-rate-of-fire-description') To roll multiple skill dice, you have two options. If you lock the skills, you can click directly on the desired die bubble, always prompting you to enter the Rate of Fire. Alternatively, you can toggle the [Query RoF] helper button, enabling the feature for the whole sheet.
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-roll-injections') Roll Injections
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-roll-injections-description')!= 'When you enable the option under Setup, you can append and toggle custom code to list item rolls. Mind that the inputs are not validated; do not enter nonsense! Following is a collection of useful template hooks.
{{header}} Header content like \"X rolls Y\"{{description}} Italic text shown below the header{{reroll}} Link of the reroll button{{damageroll}} Link of the damage button{{source_label}} Label for the source, e.g. \"Weapon\"{{source}} Content of the source, e.g. \"Pistol\"{{trait}} Name of the Trait rolled{{traitdie}} Die of the Trait rolled{{flat}} Modifier of the Trait rolled{{wd}} Wild Die of the Trait rolled{{commander}} Commander of an ally{{modifier}} Queried modifier for the roll{{rof}} Rate of Fire as inline roll, e.g. [[ 1 ]]{{wounds}} Wound penalty applied to the roll{{fatigue}} Fatigue penalty applied to the roll{{custom#_label}} [1-3] Label for freeform content{{custom#}} [1-3] Freeform content{{wdroll}} Inline roll of the Wild Die (> -1001){{traitroll#}} [1-8] Inline roll(s) of the Trait(s) '
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-silhouette') Silhouette
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-silhouette-description') Choose your silhouette; it looks fancy! You can set color markers all over the silhouette for any purpose, indicating augmentations or injuries or whatever you like.
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-skill-tracks') Skill Tracks
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-skill-tracks-description') Enter your skill die by clicking on the corresponding bubble (d4-2 to d12). The skill name will darken once you become trained and acts as roll button. You can enter a modifier and custom Wild Die or leave these fields empty to use defaults; the Wild Die can be disabled with "n/a". Positive modifiers are automatically prefixed. On the far right, you can set a color marker for any purpose.
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-track-rolls') Track Rolls
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-track-rolls-description')!= 'When you lock the skill tracks with the icon in the top-right corner above the color marker column, you can click on the bubbles to roll the corresponding die independently. This is useful for effects that dynamically alter your skill die, such as boost/lower trait .'
+
+ .sheet-settings__item.sheet-settings__item--help
+ span(data-i18n='settings-help-vehicles-and-more') Vehicles & More
+ input(type='checkbox',
+ class='sheet-toggle sheet-toggle--spoiler')
+ .sheet-bottom(data-i18n='settings-help-vehicles-and-more-description') You can enable blocks for vehicles and other vessels in the Blocks tab under Settings. The silhouette of vehicles can be cycled through by clicking; the switch can take a moment. Both blocks can display weapons by adding a number to the corresponding attribute (0-10).
diff --git a/Savage Worlds - Graph Paper/source/templates/_sheet.pug b/Savage Worlds - Graph Paper/source/templates/_sheet.pug
new file mode 100644
index 0000000000..e56869b948
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_sheet.pug
@@ -0,0 +1,106 @@
+- // Global variables
+- var maxRof = [...Array(8).keys()].map(n => ++n)
+
+include _common_fields.pug
+include _mixin_attribute.pug
+include _mixin_hexfield.pug
+include _mixin_color_circle.pug
+include _mixin_meta_field.pug
+include _mixin_vehicle_weapons_sub_list.pug
+include _mixin_simple_trait.pug
+
+.sheet-wrapper
+ input(type='checkbox',
+ name='attr_toggle_style_grid',
+ checked=true,
+ class='sheet-hidden sheet-toggle-grid')
+
+ input(type='checkbox',
+ name='attr_toggle_style_dark_labels',
+ class='sheet-hidden sheet-toggle-dark-labels')
+
+ input(type='checkbox',
+ name='attr_toggle_style_corners',
+ checked=true,
+ class='sheet-hidden sheet-toggle-corners')
+
+ input(type='checkbox',
+ name='attr_toggle_style_transitions',
+ checked=true,
+ class='sheet-hidden sheet-toggle-transitions')
+
+ input(type='checkbox',
+ name='attr_toggle_style_delays',
+ checked=true,
+ class='sheet-hidden sheet-toggle-delays')
+
+ input(type='checkbox',
+ name='attr_toggle_style_roboto',
+ checked=true,
+ class='sheet-hidden sheet-toggle-roboto')
+
+ input(type='checkbox',
+ name='attr_toggle_skill_die_numbers',
+ checked=true,
+ class='sheet-hidden sheet-toggle-skill-die-numbers')
+
+ input(type='radio',
+ name='attr_sheet_variant',
+ value='wildcard',
+ checked=true,
+ class='sheet-variant-radio sheet-variant-radio--wildcard')
+
+ input(type='radio',
+ name='attr_sheet_variant',
+ value='extra',
+ class='sheet-variant-radio sheet-variant-radio--extra')
+
+ .sheet-body
+ .sheet-wildcard
+ .sheet-section.sheet-section--header
+ .sheet-left
+ include _meta.pug
+ .sheet-right
+ include _buttons.pug
+ .sheet-section.sheet-section--center
+ .sheet-left
+ .sheet-section--traits
+ include _attributes.pug
+ include _secondary.pug
+ include _armor.pug
+ include _silhouette.pug
+ .sheet-section--features
+ include _features.pug
+ .sheet-section--resources
+ include _health.pug
+ include _power.pug
+ .sheet-right.sheet-sans
+ include _tabs.pug
+ include _skills.pug
+ include _notebook.pug
+ include _advancements.pug
+ include _settings.pug
+
+ .sheet-section.sheet-section--footer
+ .sheet-left
+ include _abilities.pug
+ include _weapons.pug
+ include _apparel.pug
+ include _integrity.pug
+ include _augmentations.pug
+ include _engrams.pug
+ include _powers.pug
+ include _vehicles.pug
+ include _walkers.pug
+ include _powerarmor.pug
+ include _allies.pug
+ .sheet-right
+ include _ammunition.pug
+ include _quick_notes.pug
+ include _encumbrance.pug
+ include _inventory.pug
+
+ .sheet-extra
+ include _extra_sheet.pug
+
+ include _roll_template.pug
diff --git a/Savage Worlds - Graph Paper/source/templates/_silhouette.pug b/Savage Worlds - Graph Paper/source/templates/_silhouette.pug
new file mode 100644
index 0000000000..faee09d552
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_silhouette.pug
@@ -0,0 +1,25 @@
+input(type='checkbox',
+ name='attr_toggle_silhouette_markers',
+ checked=true,
+ class='sheet-hidden sheet-toggle-silhouette-markers')
+
+.sheet-silhouette
+ input(type='checkbox',
+ name='attr_silhouette_selection',
+ class='sheet-silhouette__switch')
+
+ .sheet-silhouette__image
+
+ +color_circle('head', 'sheet-silhouette__head')
+ +color_circle('torso_upper', 'sheet-silhouette__torso-upper')
+ +color_circle('torso_lower', 'sheet-silhouette__torso-lower')
+ +color_circle('left_arm_upper', 'sheet-silhouette__left-arm-upper')
+ +color_circle('left_arm_lower', 'sheet-silhouette__left-arm-lower')
+ +color_circle('left_hand', 'sheet-silhouette__left-hand')
+ +color_circle('right_arm_upper', 'sheet-silhouette__right-arm-upper')
+ +color_circle('right_arm_lower', 'sheet-silhouette__right-arm-lower')
+ +color_circle('right_hand', 'sheet-silhouette__right-hand')
+ +color_circle('left_leg_upper', 'sheet-silhouette__left-leg-upper')
+ +color_circle('left_leg_lower', 'sheet-silhouette__left-leg-lower')
+ +color_circle('right_leg_upper', 'sheet-silhouette__right-leg-upper')
+ +color_circle('right_leg_lower', 'sheet-silhouette__right-leg-lower')
diff --git a/Savage Worlds - Graph Paper/source/templates/_skills.pug b/Savage Worlds - Graph Paper/source/templates/_skills.pug
new file mode 100644
index 0000000000..f82e8dfffa
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_skills.pug
@@ -0,0 +1,124 @@
+-
+ var skills = [['Academics', 'Sma'], ['Athletics', 'Agi'], ['Battle', 'Sma'],
+ ['Boating', 'Agi'], ['Common Knowledge', 'Sma'], ['Driving', 'Agi'],
+ ['Electronics', 'Sma'], ['Faith', 'Spi'], ['Fighting', 'Agi'],
+ ['Focus', 'Spi'], ['Gambling', 'Sma'], ['Hacking', 'Sma'],
+ ['Healing', 'Sma'], ['Intimidation', 'Spi'], ['Language', 'Sma'],
+ ['MAGIC', 'Sma'], ['Notice', 'Sma'], ['Occult', 'Sma'],
+ ['Performance', 'Spi'], ['Persuasion', 'Spi'], ['Piloting', 'Agi'],
+ ['Psionics', 'Sma'], ['Repair', 'Sma'], ['Research', 'Sma'],
+ ['Riding', 'Agi'], ['Science', 'Sma'], ['Shooting', 'Agi'],
+ ['Spellcasting', 'Sma'], ['Stealth', 'Agi'], ['Survival', 'Sma'],
+ ['Taunt', 'Sma'], ['Thievery', 'Agi'], ['Weird Science', 'Sma'],
+ ['Custom Skill 1', 'Custom'], ['Custom Skill 2', 'Custom']]
+
+ var disabledSkills = ['faith', 'focus', 'language', 'occult', 'psionics',
+ 'spellcasting', 'weird_science', 'custom_skill_1',
+ 'custom_skill_2']
+
+ var steps = [['d4-2', '4'], ['d4', '4'], ['d6', '6'],
+ ['d8', '8'], ['d10', '10'], ['d12', '12']].reverse()
+
+input(type='checkbox',
+ name='attr_toggle_skill_markers',
+ checked=true,
+ class='sheet-hidden sheet-toggle-skill-markers')
+
+.sheet-skills
+ input(type='checkbox', name='attr_skill_lock', class='sheet-skills__lock')
+
+ .sheet-skills__wrapper
+ .sheet-header
+ .sheet-header__labels
+ .sheet-skills__die
+ span(data-i18n='die-button-number-2') 2
+ .sheet-skills__die
+ span(data-i18n='die-button-number-4') 4
+ .sheet-skills__die
+ span(data-i18n='die-button-number-6') 6
+ .sheet-skills__die
+ span(data-i18n='die-button-number-8') 8
+ .sheet-skills__die
+ span(data-i18n='die-button-number-10') 10
+ .sheet-skills__die.sheet-a
+ span(data-i18n='die-button-number-12') 12
+ .sheet-skills__plus
+ .sheet-skills__mod
+ span(data-i18n='skill-track-mod-u') MOD
+ .sheet-skills__wd
+ span(data-i18n='skill-track-wd-u') WD
+
+ each skill in skills
+ - var trait = skill[0].toLowerCase().replace(/\./g, '').replace(/ /g, '_')
+
+ input(type='checkbox',
+ name=`attr_toggle_skill_${trait}`,
+ checked= !disabledSkills.includes(trait),
+ class='sheet-toggle sheet-toggle--block')
+
+ .sheet-skills__skill(class=`sheet-skills__skill--${trait}`)
+ .sheet-skills__color-marker
+ +color_circle(trait)
+
+ input(type='text',
+ name=`attr_${trait}_wd`,
+ placeholder='WD',
+ data-i18n-placeholder='skill-track-wd-placeholder-u',
+ class='sheet-skills__wd')
+
+ input(type='text',
+ name=`attr_${trait}_mod`,
+ placeholder='MOD',
+ data-i18n-placeholder='skill-track-mod-placeholder-u',
+ class='sheet-skills__mod')
+
+ .sheet-skills__plus +
+
+ .sheet-skills__track
+ each step in steps
+ input(type='radio',
+ name=`attr_${trait}`,
+ value=step[0],
+ label=step[0].replace('d', ''),
+ data-i18n-label=`skill-track-die-label-${step[0]}`,
+ class=`sheet-radio-track sheet-${step[0]}`,
+ checked= step[0] == 'd4-2')
+
+ - // Track roll
+ button(type='roll',
+ name=`roll_${trait}_${step[1]}`,
+ value!= `@{gm_roll} &{template:TraitRoll} {{rof=[[ 0 + ?{@{query_rate_of_fire}|1}} ]]}} {{header=@{name} ^{rolls} @{rename_${trait}}}} {{trait=@{rename_${trait}}}} {{traitdie=${step[0]}}} {{flat=@{${trait}_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{modifier=?{@{query_modifier}|0}}} ${maxRof.map(n => `{{traitroll${n}=[[ 1d${step[1]}!cs2 + (${ step[0] != 'd4-2' ? `@{${trait}_untrained_mod}` : `-2` })[Untrained] + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`).join(' ')} @{${trait}_global_wd_roll} @{${trait}_global_bonus_wd_roll} {{wd=@{${trait}_wd}}} {{wdroll=[[ @{${trait}_wd_roll}!cs2 + (@{${trait}_untrained_mod})[Untrained] + (@{${trait}_mod}+0)[Flat] - @{fatigue_mod}[FTG] - @{wound_mod}[WND] + (?{@{query_modifier}|0})[Query] ]]}} {{reroll=[r](~${trait}_${step[1]})}}`,
+ class='sheet-skills__step-button')
+ .sheet-tooltip.sheet-tooltip--top
+ span(data-i18n='roll-tooltip-prefix') Roll
+ span= `${step[0]} (`
+ span(data-i18n='roll-tooltip-suffix') RoF
+ span= `1-${maxRof.length})`
+
+ input(type='hidden',
+ name=`attr_rename_${trait}`,
+ value= skill[0] == 'Common Knowledge' ? 'Common Knowl.' : skill[0])
+
+ input(type='hidden', name=`attr_${trait}_untrained_mod`, value='-2')
+ input(type='hidden', name=`attr_${trait}_roll`, value='1d4')
+ input(type='hidden', name=`attr_${trait}_wd_roll`, value='1d6')
+ input(type='hidden', name=`attr_${trait}_extra_wd_roll`, value='-10000')
+
+ input(type='hidden', name=`attr_${trait}_global_wd_roll`, value=`{{global_wd=@{query_global_wd}}} {{global_wdroll=[[ @{query_global_wd}!cs2 + (@{${trait}_untrained_mod})[Untrained] + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+ input(type='hidden', name=`attr_${trait}_global_bonus_wd_roll`, value=`{{bonus_wd=@{query_global_bonus_wd}}} {{bonus_wdroll=[[ @{query_global_bonus_wd}!cs2 + (@{${trait}_untrained_mod})[Untrained] + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+ input(type='hidden',
+ name=`attr_${trait}_roll_body`,
+ value!=`@{gm_roll} &{template:TraitRoll} {{rof=[[ 0 + @{query_global_rof} ]]}} {{header=@{name} ^{rolls} @{rename_${trait}}}} {{trait=@{rename_${trait}}}} {{traitdie=@{${trait}}}} {{flat=@{${trait}_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{modifier=?{@{query_modifier}|0}}} ${maxRof.map(n => `{{traitroll${n}=[[ @{${trait}_roll}!cs2 + (@{${trait}_untrained_mod})[Untrained] + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`).join(' ')} @{${trait}_global_wd_roll} @{${trait}_global_bonus_wd_roll}`)
+
+ -// Label roll; the modifier needs the +0 to work if empty!
+ button(type='roll',
+ name=`roll_${trait}`,
+ value!=`@{${trait}_roll_body} {{wd=@{${trait}_wd}}} {{wdroll=[[ @{${trait}_wd_roll}!cs2 + (@{${trait}_untrained_mod})[Untrained] + (@{${trait}_mod}+0)[Flat] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}} {{reroll=[r](~${trait})}}`,
+ class='sheet-skills__button')
+ .sheet-tooltip.sheet-tooltip--left
+ span(name=`attr_rename_${skill[1].toLowerCase()}`,
+ data-i18n=`${skill[1].toLowerCase()}-u`)= skill[1]
+ span(name=`attr_rename_${trait}`)
+ = skill[0] == 'Common Knowledge' ? 'Common Knowl.' : skill[0]
diff --git a/Savage Worlds - Graph Paper/source/templates/_tabs.pug b/Savage Worlds - Graph Paper/source/templates/_tabs.pug
new file mode 100644
index 0000000000..6d546faa06
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_tabs.pug
@@ -0,0 +1,29 @@
+.sheet-san-tabs
+input(type='radio',
+ name='attr_sans_tabs',
+ value='skills',
+ label='Skills',
+ data-i18n-label='tab-skills',
+ checked=true,
+ class='sheet-tab sheet-tab--skills')
+
+input(type='radio',
+ name='attr_sans_tabs',
+ value='advancements',
+ label='Advancements',
+ data-i18n-label='tab-advancements',
+ class='sheet-tab sheet-tab--advancements')
+
+input(type='radio',
+ name='attr_sans_tabs',
+ value='notebook',
+ label='Notebook',
+ data-i18n-label='tab-notebook',
+ class='sheet-tab sheet-tab--notebook')
+
+input(type='radio',
+ name='attr_sans_tabs',
+ value='settings',
+ label='Settings',
+ data-i18n-label='tab-settings',
+ class='sheet-tab sheet-tab--settings')
diff --git a/Savage Worlds - Graph Paper/source/templates/_vehicles.pug b/Savage Worlds - Graph Paper/source/templates/_vehicles.pug
new file mode 100644
index 0000000000..220169cab4
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_vehicles.pug
@@ -0,0 +1,98 @@
+input(type='checkbox',
+ name='attr_toggle_vehicles_block',
+ checked=false,
+ class='sheet-toggle sheet-toggle--block')
+
+.sheet-block.sheet-vehicles
+ .sheet-header
+ span.sheet-header__title.sheet-vehicles__name(name='attr_rename_block_vehicles', data-i18n='vehicles') Vehicles
+ .sheet-header__labels
+ .sheet-vehicles__size(data-i18n='vehicles-size') Size
+ .sheet-vehicles__handling(data-i18n='vehicles-handling') Handling
+ .sheet-vehicles__speed(data-i18n='vehicles-speed') Speed
+ .sheet-vehicles__toughness(data-i18n='vehicles-toughness') Tough.
+ .sheet-vehicles__crew(data-i18n='vehicles-crew') Crew
+ .sheet-vehicles__weapons(data-i18n='vehicles-weapons') Weap.
+
+ input(type='checkbox',
+ name='attr_vehicles_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ fieldset.repeating_vehicles
+ .sheet-repitem
+ .sheet-repitem__primary
+ input(type='text',
+ name='attr_vehicle_name',
+ placeholder='Vehicle Type',
+ data-i18n-placeholder='vehicles-name-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-vehicles__name sheet-stretch')
+
+ input(type='text',
+ name='attr_vehicle_size',
+ placeholder='3',
+ spellcheck='false',
+ class='sheet-vehicles__size')
+
+ input(type='text',
+ name='attr_vehicle_handling',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-vehicles__handling')
+
+ input(type='text',
+ name='attr_vehicle_speed',
+ placeholder='80',
+ spellcheck='false',
+ class='sheet-vehicles__speed')
+
+ input(type='text',
+ name='attr_vehicle_toughness',
+ placeholder='4 (0)',
+ data-i18n-placeholder='vehicles-toughness-placeholder',
+ spellcheck='false',
+ class='sheet-vehicles__toughness')
+
+ input(type='text',
+ name='attr_vehicle_crew',
+ placeholder='1+3',
+ data-i18n-placeholder='vehicles-crew-placeholder',
+ spellcheck='false',
+ class='sheet-vehicles__crew')
+
+ input(type='text',
+ name='attr_vehicle_weapons_count',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-vehicles__weapons')
+
+ input(type='checkbox',
+ name='attr_vehicle_notes_toggle',
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__frame
+ input(type='hidden',
+ name='attr_vehicle_silhouette',
+ value='0',
+ class='sheet-hidden sheet-repitem__frame-silhouette-control')
+
+ .sheet-repitem__frame-silhouette
+ input(type='checkbox',
+ name='attr_vehicle_silhouette_cycle',
+ class='sheet-repitem__frame-silhouette-button')
+
+ .sheet-repitem__frame-build
+ textarea(name='attr_vehicle_build',
+ placeholder='Chassis | Modifications, Notes, etc.',
+ data-i18n-placeholder='vehicles-build-placeholder',
+ spellcheck='false')
+
+ input(type='hidden',
+ name='attr_vehicle_weapons_count',
+ value='0',
+ class='sheet-hidden sheet-repitem__weapons-control')
+
+ +vehicle_weapons_sub_list()
+
+ .sheet-footer
diff --git a/Savage Worlds - Graph Paper/source/templates/_walkers.pug b/Savage Worlds - Graph Paper/source/templates/_walkers.pug
new file mode 100644
index 0000000000..e7bd2a3fb9
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_walkers.pug
@@ -0,0 +1,97 @@
+input(type='checkbox',
+ name='attr_toggle_walkers_block',
+ checked=false,
+ class='sheet-toggle sheet-toggle--block')
+
+.sheet-block.sheet-walkers
+ .sheet-header
+ span.sheet-header__title.sheet-walkers__name(name='attr_rename_block_walkers', data-i18n='walkers') Walkers
+ .sheet-header__labels
+ .sheet-walkers__size(data-i18n='walkers-size') Size
+ .sheet-walkers__pace(data-i18n='walkers-pace') Pace
+ .sheet-walkers__strength(data-i18n='walkers-strength') Strength
+ .sheet-walkers__toughness(data-i18n='walkers-toughness') Tough.
+ .sheet-walkers__mods(data-i18n='walkers-mods') Mods
+ .sheet-walkers__crew(data-i18n='walkers-crew') Crew
+ .sheet-walkers__weapons(data-i18n='walkers-weapons') Weap.
+
+ input(type='checkbox',
+ name='attr_walkers_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ fieldset.repeating_walkers
+ .sheet-repitem
+ .sheet-repitem__primary
+ input(type='text',
+ name='attr_walker_name',
+ placeholder='Walker Type',
+ data-i18n-placeholder='walkers-name-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-walkers__name sheet-stretch')
+
+ input(type='text',
+ name='attr_walker_size',
+ placeholder='1',
+ spellcheck='false',
+ class='sheet-walkers__size')
+
+ input(type='text',
+ name='attr_walker_pace',
+ placeholder='6',
+ spellcheck='false',
+ class='sheet-walkers__pace')
+
+ input(type='text',
+ name='attr_walker_strength',
+ placeholder='d12+4',
+ spellcheck='false',
+ class='sheet-walkers__strength')
+
+ input(type='text',
+ name='attr_walker_toughness',
+ placeholder='20 (5)',
+ data-i18n-placeholder='walkers-toughness-placeholder',
+ spellcheck='false',
+ class='sheet-walkers__toughness')
+
+ input(type='text',
+ name='attr_walker_mods',
+ placeholder='0/20',
+ data-i18n-placeholder='walkers-mods-placeholder',
+ spellcheck='false',
+ class='sheet-walkers__mods')
+
+ input(type='text',
+ name='attr_walker_crew',
+ placeholder='1',
+ spellcheck='false',
+ class='sheet-walkers__crew')
+
+ input(type='text',
+ name='attr_walker_weapons_count',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-walkers__weapons')
+
+ input(type='checkbox',
+ name='attr_walker_notes_toggle',
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__frame
+ .sheet-repitem__frame-silhouette
+
+ .sheet-repitem__frame-build
+ textarea(name='attr_walker_build',
+ placeholder='Chassis | Modifications, Notes, etc.',
+ data-i18n-placeholder='walkers-build-placeholder',
+ spellcheck='false')
+
+ input(type='hidden',
+ name='attr_walker_weapons_count',
+ value='0',
+ class='sheet-hidden sheet-repitem__weapons-control')
+
+ +vehicle_weapons_sub_list()
+
+ .sheet-footer
diff --git a/Savage Worlds - Graph Paper/source/templates/_weapons.pug b/Savage Worlds - Graph Paper/source/templates/_weapons.pug
new file mode 100644
index 0000000000..5daaf84a52
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/_weapons.pug
@@ -0,0 +1,238 @@
+.sheet-block.sheet-weapons
+ .sheet-header
+ span.sheet-header__title.sheet-weapons__name(name='attr_rename_block_weapons', data-i18n='weapons') Weapons
+ .sheet-header__labels
+ .sheet-weapons__damage
+ label(title='Toggle Damage Rolls',
+ data-i18n-title='toggle-damage-rolls-title',
+ class='sheet-damage-roll-toggle-label')
+ input.sheet-hidden(type='checkbox', name='attr_weapons_damage_roll_toggle')
+ span.sheet-icon ;
+ span(data-i18n='weapons-damage') Damage
+ .sheet-weapons__range(data-i18n='weapons-range') Range
+ .sheet-weapons__ap(data-i18n='weapons-ap') AP
+ .sheet-weapons__rof(data-i18n='weapons-rof') ROF
+ .sheet-weapons__shots(data-i18n='weapons-shots') Shots
+ .sheet-weapons__weight(data-i18n='weapons-weight') WGT
+
+ input(type='checkbox',
+ name='attr_weapons_visibility_toggle',
+ checked=true,
+ class='sheet-toggle sheet-toggle--visibility')
+
+ input(type='checkbox',
+ name='attr_weapons_damage_roll_toggle',
+ class='sheet-damage-roll-toggle sheet-hidden')
+
+ input(type='checkbox',
+ name='attr_toggle_description_input_visibility',
+ checked=true,
+ class='sheet-toggle-description-input sheet-hidden')
+
+ input(type='checkbox',
+ name='attr_toggle_injection_input_visibility',
+ class='sheet-toggle-injection-input sheet-hidden')
+
+ fieldset.repeating_weapons
+ .sheet-repitem
+ .sheet-repitem__primary
+ input(type='checkbox',
+ name='attr_roll_button_toggle',
+ class='sheet-hidden sheet-toggle sheet-toggle--list-roll')
+
+ button(type='roll',
+ name='roll_skill',
+ value!=`@{skill_roll_body} {{wd=@{skill_wd}}} {{wdroll=[[ @{skill_wd_roll}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}} @{wd_override} {{reroll=[r](~repeating_weapons_skill)}} {{damageroll=[t](~repeating_weapons_weapon_damage)}} {{description=@{roll_description}}} @{roll_injection}`,
+ class='sheet-repitem__skill-roll sheet-repitem__skill-roll--wildcard') 9
+
+ button(type='roll',
+ name='roll_extra_skill',
+ value!=`@{skill_roll_body} {{wd=@{skill_wd}}} {{wdroll=[[ @{skill_extra_wd_roll}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}} @{wd_override} {{reroll=[r](~repeating_weapons_skill)}} {{damageroll=[t](~repeating_weapons_weapon_damage)}} {{description=@{roll_description}}} @{roll_injection}`,
+ class='sheet-repitem__skill-roll sheet-repitem__skill-roll--extra') 9
+
+ input(type='text',
+ name='attr_weapon_name',
+ placeholder='Weapon (Ammo)',
+ data-i18n-placeholder='weapons-name-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-weapons__name sheet-stretch')
+
+ .sheet-damage-button-overlay
+ input(type='hidden', name='attr_weapon_damage_roll', value='0')
+
+ button(type='roll',
+ name='roll_weapon_damage',
+ value!=`@{gm_roll} &{template:DamageRoll} {{header=@{name} ^{rolls} ^{damage}}} {{code=@{weapon_damage}}} {{source_label=^{weapon}}} {{source=@{weapon_name}}} {{rof=[[ 0 + @{rof_override} ]]}} {{modifier=?{@{query_damage_modifier}}}} {{range=@{weapon_range}}} {{ap=@{weapon_ap}}} {{trapping=@{weapon_trapping}}} ${maxRof.map(n => `{{roll${n}=[[ @{weapon_damage_roll} + (?{@{query_damage_modifier}}+0) ]]}}`).join(' ')} {{reroll=[r](~repeating_weapons_weapon_damage)}}`,
+ class='sheet-button sheet-weapons__damage-button')
+
+ input(type='text',
+ name='attr_weapon_damage',
+ placeholder='STR+d6',
+ data-i18n-placeholder='weapons-damage-placeholder',
+ spellcheck='false',
+ class='sheet-weapons__damage')
+
+ input(type='text',
+ name='attr_weapon_range',
+ placeholder='Range/Melee',
+ data-i18n-placeholder='weapons-range-placeholder',
+ spellcheck='false',
+ class='sheet-weapons__range')
+
+ input(type='text',
+ name='attr_weapon_ap',
+ placeholder='0',
+ spellcheck='false',
+ class='sheet-weapons__ap')
+
+ input(type='text',
+ name='attr_weapon_rof',
+ placeholder='1',
+ spellcheck='false',
+ class='sheet-weapons__rof')
+
+ input(type='text',
+ name='attr_weapon_shots',
+ placeholder='6',
+ spellcheck='false',
+ class='sheet-weapons__shots')
+
+ input(type='text',
+ name='attr_weapon_weight',
+ placeholder='4',
+ spellcheck='false',
+ class='sheet-weapons__weight')
+
+ input(type='checkbox',
+ name='attr_weapon_notes_toggle',
+ class='sheet-toggle sheet-toggle--arrow')
+
+ .sheet-repitem__secondary
+ input(type='checkbox',
+ name='attr_trapping_toggle',
+ checked=true,
+ class='sheet-hidden sheet-toggle')
+
+ .sheet-repitem__label(data-i18n='trapping') Trapping
+
+ input(type='text',
+ name='attr_weapon_trapping',
+ placeholder='Piercing/etc.',
+ data-i18n-placeholder='weapons-trapping-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-weapons__trapping')
+
+ .sheet-repitem__label(data-i18n='notes') Notes
+
+ input(type='text',
+ name='attr_weapon_notes',
+ placeholder='Notes, Tags, Requirements, etc.',
+ data-i18n-placeholder='weapons-notes-placeholder',
+ spellcheck='false',
+ class='sheet-align-left sheet-repitem__note sheet-stretch')
+
+ input(type='checkbox',
+ name='attr_weapon_settings_toggle',
+ class='sheet-toggle sheet-toggle--settings')
+
+ .sheet-repitem__settings
+ .sheet-repitem__settings-content
+ label.sheet-label-toggle.sheet-label-toggle--full-row.sheet-roll-description
+ input(type="hidden", name='attr_roll_description')
+ input(type='checkbox', name='attr_roll_description_toggle')
+ span(data-i18n='roll-description') Description
+ input(type='text',
+ name='attr_roll_description_input',
+ placeholder='Narrative or functional description below the header in the Roll Template. Leave empty to disable.',
+ data-i18n-placeholder='roll-description-placeholder',
+ value='',
+ spellcheck='false',
+ class='sheet-label-toggle__input')
+
+ label.sheet-label-toggle.sheet-label-toggle--full-row.sheet-roll-injection
+ input(type="hidden", name='attr_roll_injection')
+ input(type='checkbox', name='attr_roll_injection_toggle')
+ span(data-i18n='roll-injection') Roll Injection
+ input(type='text',
+ name='attr_roll_injection_input',
+ placeholder='{{source_label=}} {{source=}} {{custom3_label=}} {{custom3=}} {{rof=[[ 1 ]]}} {{traitroll8=}}',
+ data-i18n-placeholder='roll-injection-placeholder',
+ value='',
+ spellcheck='false',
+ class='sheet-label-toggle__input')
+
+ label.sheet-label-toggle
+ input(type='checkbox', name='attr_trapping_toggle', checked=true)
+ span(data-i18n='trapping') Trapping
+
+ label.sheet-label-toggle
+ input(type='hidden', name='attr_skill_wd', value='@{shooting_wd}')
+ input(type='hidden', name='attr_skill_mod', value='@{shooting_mod}')
+ input(type='hidden', name='attr_skill_untrained_mod', value='@{shooting_untrained_mod}')
+ input(type='hidden', name='attr_skill_roll', value='@{shooting_roll}')
+ input(type='hidden', name='attr_skill_wd_roll', value='@{shooting_wd_roll}')
+ input(type='hidden', name='attr_skill_extra_wd_roll', value='@{shooting_wd_roll}')
+
+ input(type='hidden', name=`attr_skill_global_wd_roll`, value=`{{global_wd=@{query_global_wd}}} {{global_wdroll=[[ @{query_global_wd}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+ input(type='hidden', name=`attr_skill_global_bonus_wd_roll`, value=`{{bonus_wd=@{query_global_bonus_wd}}} {{bonus_wdroll=[[ @{query_global_bonus_wd}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`)
+
+ input(type='hidden',
+ name=`attr_skill_roll_body`,
+ value!=`@{gm_roll} &{template:TraitRoll} {{rof=[[ 0 + @{rof_override} ]]}} {{header=@{name} ^{rolls} @{skill_name}}} {{trait=@{skill_name}}} {{source_label=^{weapon}}} {{source=@{weapon_name}}} {{traitdie=@{skill_roll}}} {{flat=@{skill_mod}}} {{wounds=[[ @{wound_mod} ]]}} {{fatigue=[[ @{fatigue_mod} ]]}} {{modifier=?{@{query_modifier}|0}}} {{bonus=@{skill_bonus}}} ${maxRof.map(n => `{{traitroll${n}=[[ @{skill_roll}!cs2 + (@{skill_untrained_mod})[Untrained] + (@{skill_mod}+0)[Flat] + (@{skill_bonus}+0)[Bonus] - (@{fatigue_mod})[Fatigue] - (@{wound_mod})[Wounds] + (?{@{query_modifier}|0})[Modifier] ]]}}`).join(' ')} @{skill_global_wd_roll} @{skill_global_bonus_wd_roll}`)
+
+ input(type='checkbox', name='attr_roll_button_toggle')
+ span(data-i18n='roll-button') Roll Button
+ input(type='text',
+ name='attr_skill_name',
+ placeholder='Shooting',
+ data-i18n-placeholder='weapons-skill-placeholder',
+ value='Shooting',
+ spellcheck='false',
+ class='sheet-label-toggle__input')
+ input(type='text',
+ name='attr_skill_bonus',
+ placeholder='+0',
+ class='sheet-label-toggle__input sheet-label-toggle__input--tiny')
+
+ label.sheet-label-toggle
+ input(type="hidden", name='attr_rof_override', value='?{@{query_rate_of_fire}|@{weapon_rof}}')
+ input(type='checkbox', name='attr_rof_override_toggle', checked=true)
+ span(data-i18n='query-rof') Query RoF
+
+ label.sheet-label-toggle
+ input(type="hidden", name='attr_wd_override', value='')
+ input(type='checkbox', name='attr_wd_override_toggle')
+ span(data-i18n='wild-die-override') WD Override
+ input(type='text',
+ name='attr_wd_override_die',
+ value='',
+ spellcheck='false',
+ class='sheet-label-toggle__input sheet-label-toggle__input--tiny')
+
+ label.sheet-label-toggle(title='Exploding Damage Dice On/Off', data-i18n-title='ace-damage-title')
+ input(type="hidden", name='attr_explode_damage', value='!')
+ input(type='checkbox', name='attr_explode_damage_toggle', checked=true)
+ span(data-i18n='ace-damage') Ace Damage
+
+ input(type='checkbox',
+ name='attr_weapon_weight_toggle',
+ checked=true,
+ title='Weight On/Off',
+ data-i18n-title='weapons-weight-toggle-title',
+ class='sheet-toggle sheet-toggle--special sheet-toggle--weight')
+
+ input(type='checkbox',
+ name='attr_weapon_note_box_toggle',
+ class='sheet-toggle sheet-toggle--note-box')
+
+ .sheet-repitem__note-box
+ textarea(name='attr_weapon_note_box',
+ placeholder='Notes',
+ data-i18n-placeholder='weapons-note-box-placeholder',
+ spellcheck='false')
+
+ .sheet-footer
+ span.sheet-label(data-i18n='weapons-total-weight') Total Weight:
+ span(name='attr_carry_weight_weapons',
+ class='sheet-label sheet-label--weight') 0.0
diff --git a/Savage Worlds - Graph Paper/source/templates/browser_preview.pug b/Savage Worlds - Graph Paper/source/templates/browser_preview.pug
new file mode 100644
index 0000000000..71afc608b4
--- /dev/null
+++ b/Savage Worlds - Graph Paper/source/templates/browser_preview.pug
@@ -0,0 +1,8 @@
+doctype html
+html
+ head
+ meta(charset='utf-8')
+ style
+ include ../../SavageWorldsGraphPaper.css
+ body
+ include _sheet.pug
diff --git a/Savage Worlds - Graph Paper/translation.json b/Savage Worlds - Graph Paper/translation.json
new file mode 100644
index 0000000000..6ec0e25d2d
--- /dev/null
+++ b/Savage Worlds - Graph Paper/translation.json
@@ -0,0 +1,631 @@
+{
+ "_height": "Height",
+ "abilities": "Abilities",
+ "abilities-placeholder": "Abilities",
+ "ability-placeholder": "Ability: Description",
+ "ace-damage": "Ace Damage",
+ "ace-damage-title": "Exploding Damage Dice On/Off",
+ "advancements-heroic-placeholder": "Heroic",
+ "advancements-legendary-placeholder": "Legendary",
+ "advancements-novice-placeholder": "Novice",
+ "advancements-rank-h": "H",
+ "advancements-rank-l": "L",
+ "advancements-rank-n": "N",
+ "advancements-rank-s": "S",
+ "advancements-rank-v": "V",
+ "advancements-seasoned-placeholder": "Seasoned",
+ "advancements-veteran-placeholder": "Veteran",
+ "age": "Age",
+ "agi-u": "AGI",
+ "agility-mod": "Bonus",
+ "agility-natural": "Natural",
+ "agility-wd": "WD",
+ "allies": "Allies",
+ "allies-name-placeholder": "Name",
+ "allies-note-box-placeholder": "Notes",
+ "allies-note-field-1-placeholder": "Note #1",
+ "allies-note-field-10-placeholder": "Note #10",
+ "allies-note-field-11-placeholder": "Note #11",
+ "allies-note-field-12-placeholder": "Note #12",
+ "allies-note-field-13-placeholder": "Note #13",
+ "allies-note-field-14-placeholder": "Note #14",
+ "allies-note-field-15-placeholder": "Note #15",
+ "allies-note-field-16-placeholder": "Note #16",
+ "allies-note-field-17-placeholder": "Note #17",
+ "allies-note-field-18-placeholder": "Note #18",
+ "allies-note-field-19-placeholder": "Note #19",
+ "allies-note-field-2-placeholder": "Note #2",
+ "allies-note-field-20-placeholder": "Note #20",
+ "allies-note-field-3-placeholder": "Note #3",
+ "allies-note-field-4-placeholder": "Note #4",
+ "allies-note-field-5-placeholder": "Note #5",
+ "allies-note-field-6-placeholder": "Note #6",
+ "allies-note-field-7-placeholder": "Note #7",
+ "allies-note-field-8-placeholder": "Note #8",
+ "allies-note-field-9-placeholder": "Note #9",
+ "ally": "Ally",
+ "ammunition": "Ammunition",
+ "ammunition-reset": "R",
+ "ammunition-set": "S",
+ "apparel": "Apparel",
+ "apparel-armor": "Armor",
+ "apparel-name-placeholder": "Apparel",
+ "apparel-note-box-placeholder": "Notes",
+ "apparel-notes-label": "Notes:",
+ "apparel-notes-placeholder": "Notes, Tags, Trappings, Requirements, etc.",
+ "apparel-properties": "Properties",
+ "apparel-properties-placeholder": "Protection/Resistance/Tags",
+ "apparel-total-weight": "Total Weight: ",
+ "apparel-weight": "WGT",
+ "apparel-weight-placeholder": "WGT",
+ "apparel-weight-toggle-title": "Weight On/Off",
+ "armor-and-statistics": "Armor & Statistics",
+ "armor-arms": "Arms",
+ "armor-head": "Head",
+ "armor-legs": "Legs",
+ "armor-notes-u": "NOTES",
+ "armor-torso": "Torso",
+ "attributes": "Attributes",
+ "augmentations": "Augmentations",
+ "augmentations-grade": "Grade",
+ "augmentations-grade-placeholder": "Iron",
+ "augmentations-loss": "Loss",
+ "augmentations-name-placeholder": "[Advanced/Superior] Augmentation [Level] (Upgrades)",
+ "augmentations-note-box-placeholder": "Notes",
+ "augmentations-notes-label": "Notes:",
+ "augmentations-notes-placeholder": "Effect/Description",
+ "augmentations-power": "Power",
+ "augmentations-slots": "Slots",
+ "augmentations-strain": "Strain",
+ "augmentations-toggle-title": "Loss/Strain On/Off",
+ "augmentations-total-loss": "Total Loss: ",
+ "augmentations-total-strain": "Total Strain: ",
+ "bennies": "Bennies",
+ "bits": "#Bits",
+ "bonus-wd": "Bonus WD",
+ "bonus-wild-die": "Bonus Wild Die",
+ "carried-weight-total": "Total Carried Weight",
+ "custom-u": "CUSTOM",
+ "damage": "Damage",
+ "damage-modifier": "Damage Modifier",
+ "defaults-block-show-abilities": "[Block] Show Abilities",
+ "defaults-block-show-abilities-description": "List special abilities or monstrous powers.",
+ "defaults-block-show-allies": "[Block] Show Allies",
+ "defaults-block-show-allies-description": "Keep track of allied characters with a barebone mini sheet.",
+ "defaults-block-show-ammunition": "[Block] Show Ammunition",
+ "defaults-block-show-ammunition-description": "Keep track of your \"magazines\" for three weapons.",
+ "defaults-block-show-augmentations": "[Block] Show Augmentations",
+ "defaults-block-show-augmentations-description": "Install augmentations/cyberware and keep track of the Loss/Strain.",
+ "defaults-block-show-engrams": "[Block] Show Engrams",
+ "defaults-block-show-engrams-description": "Special programs or hardware to execute Hacking actions.",
+ "defaults-block-show-integrity": "[Block] Show Integrity",
+ "defaults-block-show-integrity-description": "Quantifies mental health/sanity and keeps track of mental afflictions. Maschinenleben.",
+ "defaults-block-show-power": "[Block] Show Power/Energy",
+ "defaults-block-show-power-description": "The energy/mana/etc. reserves of a character.",
+ "defaults-block-show-powerarmors": "[Block] Show Power Armors",
+ "defaults-block-show-powerarmors-description": "Vehicles and their modifications/weapons.",
+ "defaults-block-show-powers": "[Block] Show Powers/Spells",
+ "defaults-block-show-powers-description": "The known powers/spells of a character.",
+ "defaults-block-show-vehicles": "[Block] Show Vehicles",
+ "defaults-block-show-vehicles-description": "Vehicles and their modifications/weapons.",
+ "defaults-block-show-walkers": "[Block] Show Walkers",
+ "defaults-block-show-walkers-description": "Walkers/Mechs and their modifications/weapons.Show/Hide Skills You can show or hide skills from the list in accordance with the played Game Setting. This can also be done manually for each individual sheet in its Settings tab. There are two custom skills that can be renamed and modified within the sheet as well, for example to make specialized skills (e.g. specific weapons with custom bonus or Wild Die).
",
+ "defaults-function-explode-run-die": "[Function] Explode Run Die",
+ "defaults-function-explode-run-die-description": "Makes the run die Ace.",
+ "defaults-function-running-applies-fatigue": "[Function] Running Applies Fatigue",
+ "defaults-function-running-applies-fatigue-description": "Fatigue penalties are subtracted from the run roll.Show/Hide Blocks You can show or hide content blocks in accordance with the played Game Setting. This can also be done manually for each individual sheet in its Settings tab. Some blocks that were designed for Maschinenleben, such as Augmentations and Engrams, can be adapted for other purposes as well.
",
+ "defaults-function-running-ignores-wounds": "[Function] Running Ignores Wounds",
+ "defaults-function-running-ignores-wounds-description": "Wound penalties are not subtracted from the run roll.",
+ "defaults-rename-attribute-agi": "[Rename] Attribute: AGI to ",
+ "defaults-rename-attribute-agi-description": "Renamed via the attribute rename_agi .",
+ "defaults-rename-attribute-agility": "[Rename] Attribute: Agility to ",
+ "defaults-rename-attribute-agility-description": "Renamed via the attribute rename_agility .",
+ "defaults-rename-attribute-sma": "[Rename] Attribute: SMA to ",
+ "defaults-rename-attribute-sma-description": "Renamed via the attribute rename_sma .",
+ "defaults-rename-attribute-smarts": "[Rename] Attribute: Smarts to ",
+ "defaults-rename-attribute-smarts-description": "Renamed via the attribute rename_smarts .",
+ "defaults-rename-attribute-spi": "[Rename] Attribute: SPI to ",
+ "defaults-rename-attribute-spi-description": "Renamed via the attribute rename_spi .",
+ "defaults-rename-attribute-spirit": "[Rename] Attribute: Spirit to ",
+ "defaults-rename-attribute-spirit-description": "Renamed via the attribute rename_spirit .",
+ "defaults-rename-attribute-str": "[Rename] Attribute: STR to ",
+ "defaults-rename-attribute-str-description": "Renamed via the attribute rename_str .",
+ "defaults-rename-attribute-strength": "[Rename] Attribute: Strength to ",
+ "defaults-rename-attribute-strength-description": "Renamed via the attribute rename_strength .",
+ "defaults-rename-attribute-vig": "[Rename] Attribute: VIG to ",
+ "defaults-rename-attribute-vig-description": "Renamed via the attribute rename_vig .Rename Skills You can rename the labels of each skill, best kept below 15 characters due to layout constrains. This can also be done manually with the @{rename_attribute} for each individual sheet. Note that changing the label does not affect the reference @{attribute} for rolls. They will always be in English.
",
+ "defaults-rename-attribute-vigor": "[Rename] Attribute: Vigor to ",
+ "defaults-rename-attribute-vigor-description": "Renamed via the attribute rename_vigor .",
+ "defaults-rename-block-allies": "[Rename] Block: Allies to ",
+ "defaults-rename-block-allies-description": "Renamed via the attribute rename_block_allies .",
+ "defaults-rename-block-ammunition": "[Rename] Block: Ammunition to ",
+ "defaults-rename-block-ammunition-description": "Renamed via the attribute rename_block_ammunition .",
+ "defaults-rename-block-apparel": "[Rename] Block: Apparel to ",
+ "defaults-rename-block-apparel-description": "Renamed via the attribute rename_block_apparel .",
+ "defaults-rename-block-augmentations": "[Rename] Block: Augmentations to ",
+ "defaults-rename-block-augmentations-description": "Renamed via the attribute rename_block_augmentations .",
+ "defaults-rename-block-engrams": "[Rename] Block: Engrams to ",
+ "defaults-rename-block-engrams-description": "Renamed via the attribute rename_block_engrams .",
+ "defaults-rename-block-integrity": "[Rename] Block: Integrity to ",
+ "defaults-rename-block-integrity-description": "Renamed via the attribute rename_block_integrity .",
+ "defaults-rename-block-inventory": "[Rename] Block: Inventory to ",
+ "defaults-rename-block-inventory-description": "Renamed via the attribute rename_block_inventory .",
+ "defaults-rename-block-power": "[Rename] Block: Power to ",
+ "defaults-rename-block-power-description": "Renamed via the attribute rename_block_power .",
+ "defaults-rename-block-powerarmors": "[Rename] Block: Power Armors to ",
+ "defaults-rename-block-powerarmors-description": "Renamed via the attribute rename_block_powerarmors .",
+ "defaults-rename-block-powers": "[Rename] Block: Powers to ",
+ "defaults-rename-block-powers-description": "Renamed via the attribute rename_block_powers .",
+ "defaults-rename-block-quick-notes": "[Rename] Block: Quick Notes to ",
+ "defaults-rename-block-quick-notes-description": "Renamed via the attribute rename_block_quick_notes .",
+ "defaults-rename-block-vehicles": "[Rename] Block: Vehicles to ",
+ "defaults-rename-block-vehicles-description": "Renamed via the attribute rename_block_vehicles .",
+ "defaults-rename-block-walkers": "[Rename] Block: Walkers to ",
+ "defaults-rename-block-walkers-description": "Renamed via the attribute rename_block_walkers .",
+ "defaults-rename-block-weapons": "[Rename] Block: Weapons to ",
+ "defaults-rename-block-weapons-description": "Renamed via the attribute rename_block_weapons .Rename Integrity Hindrances (Maschinenleben) You can rename the Hindrances caused by the loss of Integrity (Sanity, Purity, etc.). This can also be done manually with the @{rename_integrity-attribute} for each individual sheet. Note that they activate in intervals with each fraction of 10 below 70 — Discord triggers on 69.9 or lower, Dissonance on 59.9 or lower, and so forth.
",
+ "defaults-rename-integrity-alienation": "[Rename] Integrity: Alienation to ",
+ "defaults-rename-integrity-alienation-description": "Renamed via the attribute rename_alienation .",
+ "defaults-rename-integrity-depersonalization": "[Rename] Integrity: Depersonalization to ",
+ "defaults-rename-integrity-depersonalization-description": "Renamed via the attribute rename_depersonalization .",
+ "defaults-rename-integrity-derealization": "[Rename] Integrity: Derealization to ",
+ "defaults-rename-integrity-derealization-description": "Renamed via the attribute rename_derealization .",
+ "defaults-rename-integrity-discord": "[Rename] Integrity: Discord to ",
+ "defaults-rename-integrity-discord-description": "Renamed via the attribute rename_discord .",
+ "defaults-rename-integrity-dissonance": "[Rename] Integrity: Dissonance to ",
+ "defaults-rename-integrity-dissonance-description": "Renamed via the attribute rename_dissonance .",
+ "defaults-rename-integrity-ego-death": "[Rename] Integrity: Ego Death to ",
+ "defaults-rename-integrity-ego-death-description": "Renamed via the attribute rename_ego_death .",
+ "defaults-rename-integrity-psychosis": "[Rename] Integrity: Psychosis to ",
+ "defaults-rename-integrity-psychosis-description": "Renamed via the attribute rename_psychosis .",
+ "defaults-rename-integrity-seizures": "[Rename] Integrity: Seizures to ",
+ "defaults-rename-integrity-seizures-description": "Renamed via the attribute rename_seizures .",
+ "defaults-rename-label-age": "[Rename] Label: Age to ",
+ "defaults-rename-label-age-description": "Renamed via the attribute rename_label_age (e.g. Number or Incarnation).",
+ "defaults-rename-label-bits": "[Rename] Label: #Bits to ",
+ "defaults-rename-label-bits-description": "Renamed via the attribute rename_label_bits (e.g. Money or Gold).Rename Blocks You can rename the blocks to better fit the Game Setting, such as \"Powers\" to \"Talismans\" or \"Walkers\" to \"Frames\". This can also be done manually with the @{rename_block_attribute} for each individual sheet.
",
+ "defaults-rename-label-exp": "[Rename] Label: EXP to ",
+ "defaults-rename-label-exp-description": "Renamed via the attribute rename_label_exp (e.g. Karma or Gems).",
+ "defaults-rename-label-eyes": "[Rename] Label: Eyes to ",
+ "defaults-rename-label-eyes-description": "Renamed via the attribute rename_label_eyes (e.g. Sensors or Optics).",
+ "defaults-rename-label-gender": "[Rename] Label: Gender to ",
+ "defaults-rename-label-gender-description": "Renamed via the attribute rename_label_gender (e.g. Sex or Version).",
+ "defaults-rename-label-hair": "[Rename] Label: Hair to ",
+ "defaults-rename-label-hair-description": "Renamed via the attribute rename_label_hair (e.g. Horns or Mane).",
+ "defaults-rename-label-height": "[Rename] Label: Height to ",
+ "defaults-rename-label-height-description": "Renamed via the attribute rename_label_height (e.g. Scale or Length).",
+ "defaults-rename-label-level": "[Rename] Label: Level to ",
+ "defaults-rename-label-level-description": "Renamed via the attribute rename_label_level (e.g. Circle or Year).",
+ "defaults-rename-label-name": "[Rename] Label: Name to ",
+ "defaults-rename-label-name-description": "Renamed via the attribute rename_label_name (e.g. Alias or Codename).",
+ "defaults-rename-label-origin": "[Rename] Label: Origin to ",
+ "defaults-rename-label-origin-description": "Renamed via the attribute rename_label_origin (e.g. Race or Species).",
+ "defaults-rename-label-rank": "[Rename] Label: Rank to ",
+ "defaults-rename-label-rank-description": "Renamed via the attribute rename_label_rank (e.g. Grade or Titel).",
+ "defaults-rename-label-weight": "[Rename] Label: Weight to ",
+ "defaults-rename-label-weight-description": "Renamed via the attribute rename_label_weight (e.g. Mass or Your Mom).",
+ "defaults-rename-skill-academics": "[Rename] Skill: Academics to ",
+ "defaults-rename-skill-academics-description": "Renamed via the attribute rename_academics .",
+ "defaults-rename-skill-athletics": "[Rename] Skill: Athletics to ",
+ "defaults-rename-skill-athletics-description": "Renamed via the attribute rename_athletics .",
+ "defaults-rename-skill-boating": "[Rename] Skill: Boating to ",
+ "defaults-rename-skill-boating-description": "Renamed via the attribute rename_boating .",
+ "defaults-rename-skill-common-knowledge": "[Rename] Skill: Common Knowl. to ",
+ "defaults-rename-skill-common-knowledge-description": "Renamed via the attribute rename_common_knowledge .",
+ "defaults-rename-skill-custom-skill-1": "[Rename] Skill: Custom Skill #1 to ",
+ "defaults-rename-skill-custom-skill-1-description": "Can be renamed directly in the sheet's Settings tab.",
+ "defaults-rename-skill-custom-skill-2": "[Rename] Skill: Custom Skill #2 to ",
+ "defaults-rename-skill-custom-skill-2-description": "Can be renamed directly in the sheet's Settings tab.Rename Labels You can rename the labels at the top of the sheet, such as \"Name\" to \"Alias\" or \"Origin\" to \"Race\". This can also be done manually with the @{rename_label_attribute} for each individual sheet. Note that the labels are separated from the actual fields and do not affect the references (e.g. @{name} ). They will always be in English.
",
+ "defaults-rename-skill-driving": "[Rename] Skill: Driving to ",
+ "defaults-rename-skill-driving-description": "Renamed via the attribute rename_driving .",
+ "defaults-rename-skill-electronics": "[Rename] Skill: Electronics to ",
+ "defaults-rename-skill-electronics-description": "Renamed via the attribute rename_electronics .",
+ "defaults-rename-skill-faith": "[Rename] Skill: Faith to ",
+ "defaults-rename-skill-faith-description": "Renamed via the attribute rename_faith .",
+ "defaults-rename-skill-fighting": "[Rename] Skill: Fighting to ",
+ "defaults-rename-skill-fighting-description": "Renamed via the attribute rename_fighting .",
+ "defaults-rename-skill-focus": "[Rename] Skill: Focus to ",
+ "defaults-rename-skill-focus-description": "Renamed via the attribute rename_focus .",
+ "defaults-rename-skill-gambling": "[Rename] Skill: Gambling to ",
+ "defaults-rename-skill-gambling-description": "Renamed via the attribute rename_gambling .",
+ "defaults-rename-skill-hacking": "[Rename] Skill: Hacking to ",
+ "defaults-rename-skill-hacking-description": "Renamed via the attribute rename_hacking .",
+ "defaults-rename-skill-healing": "[Rename] Skill: Healing to ",
+ "defaults-rename-skill-healing-description": "Renamed via the attribute rename_healing .",
+ "defaults-rename-skill-intimidation": "[Rename] Skill: Intimidation to ",
+ "defaults-rename-skill-intimidation-description": "Renamed via the attribute rename_intimidation .",
+ "defaults-rename-skill-language": "[Rename] Skill: Language to ",
+ "defaults-rename-skill-language-description": "Renamed via the attribute rename_language .",
+ "defaults-rename-skill-magic": "[Rename] Skill: Magic to ",
+ "defaults-rename-skill-magic-description": "Renamed via the attribute rename_magic .",
+ "defaults-rename-skill-notice": "[Rename] Skill: Notice to ",
+ "defaults-rename-skill-notice-description": "Renamed via the attribute rename_notice .",
+ "defaults-rename-skill-occult": "[Rename] Skill: Occult to ",
+ "defaults-rename-skill-occult-description": "Renamed via the attribute rename_occult .",
+ "defaults-rename-skill-performance": "[Rename] Skill: Performance to ",
+ "defaults-rename-skill-performance-description": "Renamed via the attribute rename_performance .",
+ "defaults-rename-skill-persuasion": "[Rename] Skill: Persuasion to ",
+ "defaults-rename-skill-persuasion-description": "Renamed via the attribute rename_persuasion .",
+ "defaults-rename-skill-piloting": "[Rename] Skill: Piloting to ",
+ "defaults-rename-skill-piloting-description": "Renamed via the attribute rename_piloting .",
+ "defaults-rename-skill-psionics": "[Rename] Skill: Psionics to ",
+ "defaults-rename-skill-psionics-description": "Renamed via the attribute rename_psionics .",
+ "defaults-rename-skill-repair": "[Rename] Skill: Repair to ",
+ "defaults-rename-skill-repair-description": "Renamed via the attribute rename_repair .",
+ "defaults-rename-skill-research": "[Rename] Skill: Research to ",
+ "defaults-rename-skill-research-description": "Renamed via the attribute rename_research .",
+ "defaults-rename-skill-riding": "[Rename] Skill: Riding to ",
+ "defaults-rename-skill-riding-description": "Renamed via the attribute rename_riding .",
+ "defaults-rename-skill-science": "[Rename] Skill: Science to ",
+ "defaults-rename-skill-science-description": "Renamed via the attribute rename_science .",
+ "defaults-rename-skill-shooting": "[Rename] Skill: Shooting to ",
+ "defaults-rename-skill-shooting-description": "Renamed via the attribute rename_shooting .",
+ "defaults-rename-skill-spellcasting": "[Rename] Skill: Spellcasting to ",
+ "defaults-rename-skill-spellcasting-description": "Renamed via the attribute rename_spellcasting .",
+ "defaults-rename-skill-stealth": "[Rename] Skill: Stealth to ",
+ "defaults-rename-skill-stealth-description": "Renamed via the attribute rename_stealth .",
+ "defaults-rename-skill-survival": "[Rename] Skill: Survival to ",
+ "defaults-rename-skill-survival-description": "Renamed via the attribute rename_survival .",
+ "defaults-rename-skill-taunt": "[Rename] Skill: Taunt to ",
+ "defaults-rename-skill-taunt-description": "Renamed via the attribute rename_taunt .",
+ "defaults-rename-skill-thievery": "[Rename] Skill: Thievery to ",
+ "defaults-rename-skill-thievery-description": "Renamed via the attribute rename_thievery .",
+ "defaults-rename-skill-weird-science": "[Rename] Skill: Weird Science to ",
+ "defaults-rename-skill-weird-science-description": "Renamed via the attribute rename_weird_science .",
+ "defaults-rule-augmentation-strain": "[Rule] Augmentation Strain",
+ "defaults-rule-augmentation-strain-description": "Use the Strain rules from the Science Fiction Companion (SFC 29).",
+ "defaults-rule-no-power-points": "[Rule] No Power Points",
+ "defaults-rule-no-power-points-description": "Use the No Power Points Setting Rule (SWADE 140).",
+ "defaults-skill-show-boating": "[Skill] Show Boating Skill",
+ "defaults-skill-show-boating-description": "Show the Boating (Agility) skill.",
+ "defaults-skill-show-custom-skill-1": "[Skill] Show Custom Skill #1",
+ "defaults-skill-show-custom-skill-1-description": "Show the Custom Skill #1, which can be renamed further down.",
+ "defaults-skill-show-custom-skill-2": "[Skill] Show Custom Skill #2",
+ "defaults-skill-show-custom-skill-2-description": "Show the Custom Skill #2, which can be renamed further down.Rename Attributes You can rename the labels of each attribute and its abbreviation (max. 3 characters). This can also be done manually with the @{rename_attribute} for each individual sheet. Note that changing the label does not affect the reference @{attribute} for rolls. They will always be in English.
",
+ "defaults-skill-show-driving": "[Skill] Show Driving Skill",
+ "defaults-skill-show-driving-description": "Show the Driving (Agility) skill.",
+ "defaults-skill-show-electronics": "[Skill] Show Electronics Skill",
+ "defaults-skill-show-electronics-description": "Show the Electronics (Smarts) skill.",
+ "defaults-skill-show-faith": "[Skill] Show Faith Skill",
+ "defaults-skill-show-faith-description": "Show the Faith (Spirit) skill.",
+ "defaults-skill-show-focus": "[Skill] Show Focus Skill",
+ "defaults-skill-show-focus-description": "Show the Focus (Spirit) skill.",
+ "defaults-skill-show-language": "[Skill] Show Language Skill",
+ "defaults-skill-show-language-description": "Show the Language (Smarts) skill.",
+ "defaults-skill-show-magic": "[Skill] Show MAGIC Skill",
+ "defaults-skill-show-magic-description": "Show the MAGIC (Smarts) skill. Maschinenleben.",
+ "defaults-skill-show-occult": "[Skill] Show Occult Skill",
+ "defaults-skill-show-occult-description": "Show the Occult (Smarts) skill.",
+ "defaults-skill-show-piloting": "[Skill] Show Piloting Skill",
+ "defaults-skill-show-piloting-description": "Show the Piloting (Agility) skill.",
+ "defaults-skill-show-psionics": "[Skill] Show Psionics Skill",
+ "defaults-skill-show-psionics-description": "Show the Psionics (Smarts) skill.",
+ "defaults-skill-show-riding": "[Skill] Show Riding Skill",
+ "defaults-skill-show-riding-description": "Show the Riding (Agility) skill.",
+ "defaults-skill-show-spellcasting": "[Skill] Show Spellcasting Skill",
+ "defaults-skill-show-spellcasting-description": "Show the Spellcasting (Smarts) skill.",
+ "defaults-skill-show-weird-science": "[Skill] Show Weird Science Skill",
+ "defaults-skill-show-weird-science-description": "Show the Weird Science (Smarts) skill.",
+ "dice-roller-code-placeholder": "2d6!+2",
+ "dice-roller-damage": "Damage",
+ "dice-roller-hidden": "Hidden",
+ "dice-roller-roll": "Roll",
+ "dice-roller-run": "Run",
+ "dice-roller-run-ace": "Run!",
+ "die-button-number-10": "10",
+ "die-button-number-12": "12",
+ "die-button-number-2": "2",
+ "die-button-number-4": "4",
+ "die-button-number-6": "6",
+ "die-button-number-8": "8",
+ "edges-and-hindrances": "Edges & Hindrances",
+ "engrams": "Engrams",
+ "engrams-description": "Description",
+ "engrams-description-placeholder": "e.g. entangle (SWADE 161) power but resisted by Smarts",
+ "engrams-name-placeholder": "Engram",
+ "engrams-note-box-placeholder": "Notes",
+ "engrams-notes-placeholder": "Effect/Description",
+ "engrams-penalty": "Penalty",
+ "engrams-skill-placeholder": "Hacking",
+ "exclamation-mark": "!",
+ "exp": "EXP",
+ "extra-fatigue": "FTG",
+ "extra-trait-mod-placeholder": "+/−",
+ "extra-trait-wd-placeholder": "WD",
+ "extra-wounds": "WDS",
+ "eyes": "Eyes",
+ "fatigue": "Fatigue",
+ "feature-name-new": "New",
+ "flight": "Flight",
+ "gender": "Gender",
+ "gm-roll": "GM Roll",
+ "hair": "Hair",
+ "integrity": "Integrity",
+ "integrity-alienation": "Alienation",
+ "integrity-depersonalization": "Depersonalization",
+ "integrity-derealization": "Derealization",
+ "integrity-discord": "Discord",
+ "integrity-dissonance": "Dissonance",
+ "integrity-ego-death": "Ego Death",
+ "integrity-maximum": "Max",
+ "integrity-mod": "Mod",
+ "integrity-psychosis": "Psychosis",
+ "integrity-seizures": "Seizures",
+ "inventory": "Inventory",
+ "inventory-name-placeholder": "Item",
+ "inventory-note-box-placeholder": "Notes",
+ "inventory-notes-placeholder": "About this item...",
+ "inventory-total-weight": "Total Weight: ",
+ "inventory-weight-placeholder-u": "WGT",
+ "inventory-weight-toggle-title": "Weight On/Off",
+ "inventory-weight-u": "WGT",
+ "level": "Level",
+ "mod": "Mod",
+ "modifier": "Modifier",
+ "multiplier": "Multiplier",
+ "name": "Name",
+ "none": "None",
+ "notes": "Notes",
+ "origin": "Origin",
+ "pace": "Pace",
+ "parry": "Parry",
+ "penalty": "Penalty",
+ "power": "Power",
+ "power-consumed": "Consumed",
+ "power-energy": "Power",
+ "power-maximum": "Max",
+ "powerarmor": "Power Armor",
+ "powerarmors": "Power Armors",
+ "powerarmors-armor": "Armor",
+ "powerarmors-build-placeholder": "Chassis | Modifications, Notes, etc.",
+ "powerarmors-mods": "Mods",
+ "powerarmors-mods-placeholder": "0/5",
+ "powerarmors-name-placeholder": "Power Armor Type",
+ "powerarmors-pace": "Pace",
+ "powerarmors-size": "Size",
+ "powerarmors-weapons": "Weap.",
+ "powerarmors-weight": "Weight",
+ "powerarmors-weight-placeholder": "500",
+ "powers": "Powers",
+ "powers-ap": "AP",
+ "powers-damage": "Damage",
+ "powers-damage-placeholder": "2d6",
+ "powers-duration": "Duration",
+ "powers-duration-placeholder": "Duration",
+ "powers-name-placeholder": "Power",
+ "powers-note-box-placeholder": "Notes",
+ "powers-notes-placeholder": "Effect/Description",
+ "powers-penalty": "Penalty",
+ "powers-pp": "PP",
+ "powers-pp-placeholder": "2",
+ "powers-range": "Range",
+ "powers-range-placeholder": "Range/Melee",
+ "powers-skill-placeholder": "Spellcasting",
+ "powers-trapping-placeholder": "Fire, Light, etc.",
+ "query-rof": "Query RoF",
+ "query-wd": "Query WD",
+ "quick-notes": "Quick Notes",
+ "rads": "Rads",
+ "raise-calculator": "Raise Calculator",
+ "raises": "raises",
+ "rank": "Rank",
+ "rate-of-fire": "Rate of Fire",
+ "roll-button": "Roll Button",
+ "roll-description": "Description",
+ "roll-description-placeholder": "Narrative or functional description below the header in the Roll Template. Leave empty to disable.",
+ "roll-injection": "Roll Injection",
+ "roll-injection-placeholder": "{{source_label=}} {{source=}} {{custom3_label=}} {{custom3=}} {{rof=[[ 1 ]]}} {{traitroll8=}}",
+ "roll-of": "Roll of",
+ "roll-result": "Roll Result",
+ "roll-tooltip-prefix": "Roll ",
+ "roll-tooltip-suffix": "RoF ",
+ "rolls": "rolls",
+ "rolltemplate-armor-piercing": "Armor Piercing",
+ "rolltemplate-bonus-wild-die": "Bonus Wild Die",
+ "rolltemplate-commander": "Commander",
+ "rolltemplate-damage": "Damage",
+ "rolltemplate-damage-modifier": "Damage Modifier",
+ "rolltemplate-damage-title": "Roll Damage",
+ "rolltemplate-dice-rof": "Dice/RoF",
+ "rolltemplate-fatigue": "Fatigue",
+ "rolltemplate-hits-rof": "Hits/RoF",
+ "rolltemplate-modifier": "Modifier",
+ "rolltemplate-range": "Range",
+ "rolltemplate-reroll-title": "Reroll",
+ "rolltemplate-trapping": "Trapping",
+ "rolltemplate-wild-die": "Wild Die",
+ "rolltemplate-wound-penalty": "Wound Penalty",
+ "run": "Run",
+ "runs-ellipsis": "runs...",
+ "settings-abilities-label": "[Abilities]",
+ "settings-allies-label": "[Allies]",
+ "settings-ammunition-container-1-label": "[Ammo #1]",
+ "settings-ammunition-container-1-placeholder": "Ammo #1",
+ "settings-ammunition-container-2-label": "[Ammo #2]",
+ "settings-ammunition-container-2-placeholder": "Ammo #2",
+ "settings-ammunition-container-3-label": "[Ammo #3]",
+ "settings-ammunition-container-3-placeholder": "Ammo #3",
+ "settings-ammunition-label": "[Ammunition]",
+ "settings-augmentations-label": "[Augmentations]",
+ "settings-custom-button-1-label": "[Custom Button #1]",
+ "settings-custom-button-2-label": "[Custom Button #2]",
+ "settings-custom-button-3-label": "[Custom Button #3]",
+ "settings-custom-buttons-placeholder": "UnShake/Detox/etc.",
+ "settings-custom-skill-1-label": "[Custom Skill #1]",
+ "settings-custom-skill-1-placeholder": "Custom Skill 1",
+ "settings-custom-skill-2-label": "[Custom Skill #2]",
+ "settings-custom-skill-2-placeholder": "Custom Skill 2",
+ "settings-engrams-label": "[Engrams]",
+ "settings-function-augmentation-markers": "Augmentation Markers",
+ "settings-function-explode-run-die": "Explode Run Die",
+ "settings-function-roll-description-inputs": "List Roll Description Inputs",
+ "settings-function-roll-injection-inputs": "List Roll Injection Inputs",
+ "settings-function-running-applies-fatigue": "Running Applies Fatigue",
+ "settings-function-running-ignores-wounds": "Running Ignores Wounds",
+ "settings-function-silhouette-markers": "Silhouette Markers",
+ "settings-function-skill-markers": "Skill Markers",
+ "settings-help-ammunition": "Ammunition",
+ "settings-help-ammunition-description": "You can keep track of up to three named \"magazines\" in the Ammunition block. The buttons allow you to quickly add to or subtract from the values. You can save a value with [S] and restore it with [R].",
+ "settings-help-armor-and-notes": "Armor & Notes",
+ "settings-help-armor-and-notes-description": "Enter your Armor ratings for the corresponding limbs. They are not self-calculating since there are too many factors; this is more convenient. You can add notes for Resistances, circumstance modifiers, or relevant augmentations such as subdermal armor to keep things in one place.",
+ "settings-help-attribute-reference": "Attribute Reference",
+ "settings-help-attribute-reference-description": "The attributes of this sheet follow a simple naming pattern and can be easily derived from their labels. Just remove any dots or special characters, expand abbreviations, convert to lowercase, and replace whitespaces with underscores (_). Adjacent/Sibling attributes are appended like this as well. Agility becomes @{agility}, @{agility_mod}, @{agility_wd}, @{agility_extra_wd} (for Extras only), and @{agility_natural}. Tough. expands @{toughness} and Armor is referenced with @{armor_head|_torso|_arms|_legs}. English only!",
+ "settings-help-edges-and-hindrances": "Edges & Hindrances",
+ "settings-help-edges-and-hindrances-description": "Manage your Edges and Hindrances here. They follow a horizontal masonry layout to save space and remain visible for convenience. The width is automatically adjusted once you press enter and you can cycle through colored labels to indicate Rank, type, and more. Sorting is wonky though.",
+ "settings-help-extra-sheet": "Extra Sheet",
+ "settings-help-extra-sheet-description": "For non-player characters, you can change the layout to a more compact alternative with the switch right above the sheet. This version lacks many features but is primed for Extras without Wild Die. Of course, you can add Wild Dice if needed. Edit Traits by clicking on their die, opening a small menu, and roll with the label. Hovering reveals buttons for direct die rolls. Add skills by clicking the framed pencil icon in the header. Lists work as usual.",
+ "settings-help-helper-buttons": "Helper Buttons",
+ "settings-help-helper-buttons-description": "The buttons above the skill section provide selected actions and convenience functions. The dice roller input is parsed, so you can write codes like \"Sma+2d6\". You may also use references such as @{athletics} or macros, but beware that the parser is not smart. Hidden rolls are sent only to the GM. The toggles can enable/disable additional roll queries for the whole sheet.",
+ "settings-help-hexagon-fields": "Hexagon Fields",
+ "settings-help-hexagon-fields-description": "Your attributes and secondary statistics. They either accept dice codes (d4 to d12) or integers. Positive modifiers are automatically prefixed. Hovering reveals additional fields that are otherwise invisible until relevant. You can leave them empty to use defaults, such as a d6 as Wild Die. The Wild Die can be disabled with \"n/a\". The labels act as roll buttons.",
+ "settings-help-list-item-options": "List Item Options",
+ "settings-help-list-item-options-description": "Interactive list items, such as weapons and powers, come with options. When the item is folded out, you can access them via the gear icon. Typical options include toggles for buttons and fields, but some also allow to override the Wild Die and more. Mind that the inputs are not validated; do not enter nonsense!",
+ "settings-help-raise-damage": "Raise Damage",
+ "settings-help-raise-damage-description": "There is no general function or field to apply raise damage since this modifier is too flexible. But nothing stops you from entering \"1d6\" when prompted to add a damage modifier. You could also add \"2d4+2\" or whatever modifier may apply.",
+ "settings-help-rate-of-fire": "Rate of Fire (Multiple Dice)",
+ "settings-help-rate-of-fire-description": "To roll multiple skill dice, you have two options. If you lock the skills, you can click directly on the desired die bubble, always prompting you to enter the Rate of Fire. Alternatively, you can toggle the [Query RoF] helper button, enabling the feature for the whole sheet.",
+ "settings-help-roll-injections": "Roll Injections",
+ "settings-help-roll-injections-description": "When you enable the option under Setup, you can append and toggle custom code to list item rolls. Mind that the inputs are not validated; do not enter nonsense! Following is a collection of useful template hooks.
{{header}} Header content like \"X rolls Y\"{{description}} Italic text shown below the header{{reroll}} Link of the reroll button{{damageroll}} Link of the damage button{{source_label}} Label for the source, e.g. \"Weapon\"{{source}} Content of the source, e.g. \"Pistol\"{{trait}} Name of the Trait rolled{{traitdie}} Die of the Trait rolled{{flat}} Modifier of the Trait rolled{{wd}} Wild Die of the Trait rolled{{commander}} Commander of an ally{{modifier}} Queried modifier for the roll{{rof}} Rate of Fire as inline roll, e.g. [[ 1 ]]{{wounds}} Wound penalty applied to the roll{{fatigue}} Fatigue penalty applied to the roll{{custom#_label}} [1-3] Label for freeform content{{custom#}} [1-3] Freeform content{{wdroll}} Inline roll of the Wild Die (> -1001){{traitroll#}} [1-8] Inline roll(s) of the Trait(s) ",
+ "settings-help-silhouette": "Silhouette",
+ "settings-help-silhouette-description": "Choose your silhouette; it looks fancy! You can set color markers all over the silhouette for any purpose, indicating augmentations or injuries or whatever you like.",
+ "settings-help-skill-tracks": "Skill Tracks",
+ "settings-help-skill-tracks-description": "Enter your skill die by clicking on the corresponding bubble (d4-2 to d12). The skill name will darken once you become trained and acts as roll button. You can enter a modifier and custom Wild Die or leave these fields empty to use defaults; the Wild Die can be disabled with \"n/a\". Positive modifiers are automatically prefixed. On the far right, you can set a color marker for any purpose.",
+ "settings-help-track-rolls": "Track Rolls",
+ "settings-help-track-rolls-description": "When you lock the skill tracks with the icon in the top-right corner above the color marker column, you can click on the bubbles to roll the corresponding die independently. This is useful for effects that dynamically alter your skill die, such as boost/lower trait .",
+ "settings-help-vehicles-and-more": "Vehicles & More",
+ "settings-help-vehicles-and-more-description": "You can enable blocks for vehicles and other vessels in the Blocks tab under Settings. The silhouette of vehicles can be cycled through by clicking; the switch can take a moment. Both blocks can display weapons by adding a number to the corresponding attribute (0-10).",
+ "settings-help-weapon-damage-rolls": "Damage Rolls",
+ "settings-help-weapon-damage-rolls-description": "You can enable damage rolls for list items by clicking the damage label. This will disable editing. Note that the dice codes must be valid, but you can use \"Str\" or \"Agi\" (etc.) as shorthands to reference attributes. The parser is not smart, however, so please also refer to the Roll20 Dice Reference.",
+ "settings-integrity-label": "[Integrity]",
+ "settings-misc-extent-prefix": "Extend ",
+ "settings-power-energy-label": "[Power/Energy/Mana]",
+ "settings-powerarmors-label": "[Power Armors]",
+ "settings-powers-spells-label": "[Powers/Spells]",
+ "settings-quick-notes-label": "[Quick Notes]",
+ "settings-rule-augmentation-strain": "Augmentation Strain (SciFi Companion)",
+ "settings-rule-no-power-points": "No Power Points (SWADE 140)",
+ "settings-style-background-grid": "Background Grid",
+ "settings-style-dark-labels": "Dark Labels",
+ "settings-style-roboto-font": "Roboto Font (Off: Helvetica Neue)",
+ "settings-style-rounded-corners": "Rounded Corners",
+ "settings-style-skill-die-numbers": "Skill Die Numbers",
+ "settings-style-transition-delays": "Transition Delays",
+ "settings-style-transitions": "Transitions",
+ "settings-tab-blocks": "Blocks",
+ "settings-tab-help": "Help",
+ "settings-tab-setup": "Setup",
+ "settings-tab-skills": "Skills",
+ "settings-tab-styles": "Styles",
+ "settings-vehicles-label": "[Vehicles]",
+ "settings-walkers-label": "[Walkers]",
+ "size": "Size",
+ "skill-track-die-label-d10": "10",
+ "skill-track-die-label-d12": "12",
+ "skill-track-die-label-d4": "4",
+ "skill-track-die-label-d4-2": "2",
+ "skill-track-die-label-d6": "6",
+ "skill-track-die-label-d8": "8",
+ "skill-track-mod-placeholder-u": "MOD",
+ "skill-track-mod-u": "MOD",
+ "skill-track-wd-placeholder-u": "WD",
+ "skill-track-wd-u": "WD",
+ "skills": "Skills",
+ "sma-u": "SMA",
+ "smarts-mod": "Bonus",
+ "smarts-natural": "Natural",
+ "smarts-wd": "WD",
+ "soak": "Soak",
+ "soak-mod": "Bonus",
+ "soak-wd": "WD",
+ "source": "Source",
+ "spi-u": "SPI",
+ "spirit-mod": "Bonus",
+ "spirit-natural": "Natural",
+ "spirit-wd": "WD",
+ "str-u": "STR",
+ "strength-mod": "Bonus",
+ "strength-natural": "Natural",
+ "strength-wd": "WD",
+ "sublist-weapons-ap-damage": "AP Damage",
+ "sublist-weapons-ap-damage-placeholder": "3d10, AP 8",
+ "sublist-weapons-he-damage": "HE Damage",
+ "sublist-weapons-he-damage-placeholder": "3d8, AP 4, MBT",
+ "sublist-weapons-name": "Weapon",
+ "sublist-weapons-name-placeholder-1": "Weapon #1",
+ "sublist-weapons-name-placeholder-10": "Weapon #10",
+ "sublist-weapons-name-placeholder-2": "Weapon #2",
+ "sublist-weapons-name-placeholder-3": "Weapon #3",
+ "sublist-weapons-name-placeholder-4": "Weapon #4",
+ "sublist-weapons-name-placeholder-5": "Weapon #5",
+ "sublist-weapons-name-placeholder-6": "Weapon #6",
+ "sublist-weapons-name-placeholder-7": "Weapon #7",
+ "sublist-weapons-name-placeholder-8": "Weapon #8",
+ "sublist-weapons-name-placeholder-9": "Weapon #9",
+ "sublist-weapons-note-box-placeholder": "Notes",
+ "sublist-weapons-notes-label": "Notes:",
+ "sublist-weapons-notes-placeholder": "Notes, Tags, Trappings, etc.",
+ "sublist-weapons-range": "Range",
+ "sublist-weapons-range-placeholder": "50/100/200",
+ "sublist-weapons-rof": "ROF",
+ "tab-advancements": "Advancements",
+ "tab-notebook": "Notebook",
+ "tab-settings": "Settings",
+ "tab-skills": "Skills",
+ "target-number": "Target Number",
+ "toggle-damage-rolls-title": "Toggle Damage Rolls",
+ "toughness": "Tough.",
+ "trapping": "Trapping",
+ "unskilled": "Unskilled",
+ "vehicles": "Vehicles",
+ "vehicles-build-placeholder": "Chassis | Modifications, Notes, etc.",
+ "vehicles-crew": "Crew",
+ "vehicles-crew-placeholder": "1+3",
+ "vehicles-handling": "Handling",
+ "vehicles-name-placeholder": "Vehicle Type",
+ "vehicles-size": "Size",
+ "vehicles-speed": "Speed",
+ "vehicles-toughness": "Tough.",
+ "vehicles-toughness-placeholder": "4 (0)",
+ "vehicles-weapons": "Weap.",
+ "vig-u": "VIG",
+ "vigor-mod": "Bonus",
+ "vigor-natural": "Natural",
+ "vigor-wd": "WD",
+ "vs-tn": "vs. TN",
+ "walkers": "Walkers",
+ "walkers-build-placeholder": "Chassis | Modifications, Notes, etc.",
+ "walkers-crew": "Crew",
+ "walkers-mods": "Mods",
+ "walkers-mods-placeholder": "0/20",
+ "walkers-name-placeholder": "Walker Type",
+ "walkers-pace": "Pace",
+ "walkers-size": "Size",
+ "walkers-strength": "Strength",
+ "walkers-toughness": "Tough.",
+ "walkers-toughness-placeholder": "20 (5)",
+ "walkers-weapons": "Weap.",
+ "weapon": "Weapon",
+ "weapons": "Weapons",
+ "weapons-ap": "AP",
+ "weapons-damage": "Damage",
+ "weapons-damage-placeholder": "STR+d6",
+ "weapons-name-placeholder": "Weapon (Ammo)",
+ "weapons-note-box-placeholder": "Notes",
+ "weapons-notes-placeholder": "Notes, Tags, Requirements, etc.",
+ "weapons-range": "Range",
+ "weapons-range-placeholder": "Range/Melee",
+ "weapons-rof": "ROF",
+ "weapons-shots": "Shots",
+ "weapons-skill-placeholder": "Shooting",
+ "weapons-total-weight": "Total Weight: ",
+ "weapons-trapping-placeholder": "Piercing/etc.",
+ "weapons-weight": "WGT",
+ "weapons-weight-toggle-title": "Weight On/Off",
+ "weight": "Weight",
+ "wild-die": "Wild Die",
+ "wild-die-override": "WD Override",
+ "wound-mitigation": "Wound Mitigation",
+ "wounds": "Wounds",
+ "{": "{",
+ "}": "}"
+}