From 76da31e0d08359fc16efc6cb7931129d184bf1ad Mon Sep 17 00:00:00 2001
From: MedievalSteve <63799112+MedievalSteve@users.noreply.github.com>
Date: Fri, 27 Nov 2020 22:00:58 +1000
Subject: [PATCH] Dragon Warriors Revised Ver 1.2.4
Ver 1.2.4
Token Integration and Radio Button Bug Fix
Implemented new attributes: currenthp, currentmp currentmpelementtwo and currentmpelementthree.
These attributes are to be used with token bars to accurately represent wounds and magic points which count down properly.
In developing these attributes, I was able to correct a bug which was requiring players to double click on wound / mp radio buttons to function properly.
Layout changes:
Removed redundant magic point trackers from the magic page. Not only were they redundant, but they interferred with the function of the currentmp set of attributes.
Ver 1.2.3
Workaround to address lag issue
Problem:
"Need to streamline Sheet Workers in the code to reduce overall attribute calls (looking for experienced JS coders for some help here!)."
The sheet will no longer seek to automatically update scores after any changes, as users had reported significant performance issues due to too many attribute checks/calls.
I have added a button to the top-bar "Click to Apply Changes", which the user will need to click to apply any changes made to the sheet.
While this is not the ideal solution I would choose, I do not have enough coding experience to rebuild the Sheet Workers myself.
Ver 1.2.2
Fixed error preventing Precise Shot modifiers from being applied to rolls.
Spinners removed from read-only boxes to avoid confusion.
Have moved base score inputs (all) to the renamed tab "Base Scores" (formerly Miscellaneous Modifiers).
Removed ABR / DMG bonus boxes from front sheet as unnecessary.
Moved AF misc bonus to the AF section of the Inventory page.
Opened up base Magic Stats on the Magic page for all classes.
Changed tab name from "Skills" to "Path and Skills" and added a paths box.
Added a classic DW picture to the front page to reduce strange spacing issues after taking out unnecessary input boxes.
Poison save roll button added under health points
---
.../{untitled folder => }/.DS_Store | Bin
...removebg-preview.png => Dice Warriors.png} | Bin
Dragon Warriors/DragWarsTest.js | 727 -------
.../Dragon Warriors Revised HomeBrew.html | 1765 -----------------
Dragon Warriors/Dragon Warriors Revised.css | 35 +-
Dragon Warriors/Dragon Warriors Revised.html | 677 ++-----
Dragon Warriors/Hand.png | Bin 0 -> 13492 bytes
.../Screen Shot 2020-09-30 at 10.18.40 am.png | Bin 143645 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.18.54 am.png | Bin 141962 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.19.05 am.png | Bin 124509 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.19.13 am.png | Bin 121209 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.19.22 am.png | Bin 80563 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.19.28 am.png | Bin 76030 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.19.37 am.png | Bin 83583 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.19.56 am.png | Bin 177804 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.20.36 am.png | Bin 131327 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.20.43 am.png | Bin 110673 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.20.49 am.png | Bin 69210 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.20.57 am.png | Bin 77039 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.21.05 am.png | Bin 77101 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.21.12 am.png | Bin 93002 -> 0 bytes
.../Screen Shot 2020-09-30 at 10.21.29 am.png | Bin 190405 -> 0 bytes
22 files changed, 164 insertions(+), 3040 deletions(-)
rename Dragon Warriors/{untitled folder => }/.DS_Store (100%)
rename Dragon Warriors/{Dice_Warriors-removebg-preview.png => Dice Warriors.png} (100%)
delete mode 100644 Dragon Warriors/DragWarsTest.js
delete mode 100644 Dragon Warriors/Dragon Warriors Revised HomeBrew.html
create mode 100644 Dragon Warriors/Hand.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.18.40 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.18.54 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.05 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.13 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.22 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.28 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.37 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.56 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.36 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.43 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.49 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.57 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.05 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.12 am.png
delete mode 100644 Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.29 am.png
diff --git a/Dragon Warriors/untitled folder/.DS_Store b/Dragon Warriors/.DS_Store
similarity index 100%
rename from Dragon Warriors/untitled folder/.DS_Store
rename to Dragon Warriors/.DS_Store
diff --git a/Dragon Warriors/Dice_Warriors-removebg-preview.png b/Dragon Warriors/Dice Warriors.png
similarity index 100%
rename from Dragon Warriors/Dice_Warriors-removebg-preview.png
rename to Dragon Warriors/Dice Warriors.png
diff --git a/Dragon Warriors/DragWarsTest.js b/Dragon Warriors/DragWarsTest.js
deleted file mode 100644
index 2344269549..0000000000
--- a/Dragon Warriors/DragWarsTest.js
+++ /dev/null
@@ -1,727 +0,0 @@
-const buttonlist = ["character","inventory","combat","magic","skills","languages","biographical","documentation"];
-buttonlist.forEach(button => {
- on(`clicked:${button}`, function() {
- setAttrs({
- sheetTab: button
- });
- });
-});
-
-const repeatingSum = (destinations, section, fields, ...extras) => {
- const isNumber = value => parseFloat(value).toString() === value.toString();
- const isOption = value => [...checks.valid, ...checks.roundtypes].includes(value);
- const isRounding = value => checks.roundtypes.includes(value);
- const isFraction = value => value.includes('/') && !(value.includes(',') || value.includes('|'));
- const getTrimmed = value => value.toLowerCase().replace(/\s/g, '');
- const getRounded = (type, value, pow) => (Math[type](value * Math.pow(10, pow)) / Math.pow(10, pow)).toFixed(Math.max(0, pow));
- const getFraction = (value) => /*{ console.log(`value: ${value}`); */
- parseInt(value.split('/')[0]) / parseInt(value.split('/')[1]);
- const getMultiplier = (value, rounding = 1) => 'undefined' === typeof value ? (rounding ? 0: 1) : (
- isNumber(value) ? parseFloat(value) : (isFraction(value) ? getFraction(value) : value));
- if (!Array.isArray(destinations)) destinations = [getTrimmed(destinations)];
- if (!Array.isArray(fields)) fields = [getTrimmed(fields)];
- const fields_trimmed = fields.map(field => getTrimmed(field).split(':')[0]);
- const subfields = fields_trimmed.slice(0,destinations.length);
- const checks = { valid: ['multiplier'], roundtypes: ['ceil', 'round', 'floor'] };
- let properties = {attributes: {}, options: {}};
- extras.forEach(extra => {
- const [prop, v] = getTrimmed(extra).split(':');
- const multiplier_maybe = getMultiplier(v, isRounding(prop));
- const obj = isNumber(multiplier_maybe) ? subfields.reduce((obj,field) => {
- obj[field] = multiplier_maybe;
- return obj;
- },{}) : multiplier_maybe.split(',').reduce((obj, item) => {
- const [stat, value] = item.split('|');
- const multiplier = getMultiplier(value, isRounding(prop));
- obj[stat] = multiplier;
- return obj;
- }, {});
- properties[isOption(prop) ? 'options' : 'attributes'][prop] = obj;
- });
- getSectionIDs(`repeating_${section}`, idArray => {
- const attrArray = idArray.reduce((m, id) => [...m, ...(fields_trimmed.map(field => `repeating_${section}_${id}_${field}`))], []);
- getAttrs([...attrArray, ...Object.keys(properties.attributes)], v => {
- const getValue = (section, id, field) => v[`repeating_${section}_${id}_${field}`] === 'on' ? 1 : parseFloat(v[`repeating_${section}_${id}_${field}`]) || 0;
- const commonMultipliers = (fields.length <= destinations.length) ? [] : fields.splice(destinations.length, fields.length - destinations.length);
- const output = destinations.reduce((obj, destination, index) => {
- let sumTotal = idArray.reduce((total, id) => total + getValue(section, id, fields_trimmed[index]) * commonMultipliers.reduce((subtotal, mult) => subtotal * ((!mult.includes(':') || mult.split(':')[1].split(',').includes(fields_trimmed[index])) ? getValue(section, id, mult.split(':')[0]) : 1), 1), 0);
- sumTotal *= (properties.options.hasOwnProperty('multiplier') && Object.keys(properties.options.multiplier).includes(fields_trimmed[index])) ? (parseFloat(properties.options.multiplier[fields_trimmed[index]]) || 0): 1;
- sumTotal += Object.entries(properties.attributes).reduce((total, [key, value]) =>
- total += (value.hasOwnProperty(fields_trimmed[index]) ? parseFloat(v[key] || 0) * (parseFloat(value[fields_trimmed[index]]) || 1): 0) , 0);
- checks.roundtypes.forEach(type => {
- if (properties.options.hasOwnProperty(type)) {
- if (Object.keys(properties.options[type]).includes(fields_trimmed[index])) {
- sumTotal = getRounded(type, sumTotal, (+properties.options[type][fields_trimmed[index]] || 0));
- } else if (properties.options[type] == '0' || !isNaN(+properties.options[type] || 'x') ) {
- sumTotal = getRounded(type, sumTotal, +properties.options[type]);
- }
- }
- });
- obj[destination] = sumTotal;
- return obj;
- }, {});
- setAttrs(output);
- });
- });
-};
-
-on('change:repeating_meleeweapons', function(event) {
- if (event.sourceType === 'sheetworker' ) return;
- const playerclickedid = (event.sourceAttribute.split('_')[2] || '').toLowerCase();
- getSectionIDs('repeating_meleeweapons', function (ids) {
- const fieldnames = [];
- ids.forEach(id => fieldnames.push(
- `repeating_meleeweapons_${id}_equippedmeleewep`,
- `repeating_meleeweapons_${id}_magicmeleeweaponbonus`,
- `repeating_meleeweapons_${id}_meleeweapon`,
- `repeating_meleeweapons_${id}_meleeabr`,
- `repeating_meleeweapons_${id}_meleedamage`
- ));
- getAttrs(fieldnames, values => {
- const output = {};
- ids.forEach(id => {
- const checkbox = parseInt(values[`repeating_meleeweapons_${id}_equippedmeleewep`]) || 0;
- const magicbonus = parseInt(values[`repeating_meleeweapons_${id}_magicmeleeweaponbonus`]) || 0;
- const meleeweaponname = (values[`repeating_meleeweapons_${id}_meleeweapon`]) || None;
- const meleeweaponabr = (values[`repeating_meleeweapons_${id}_meleeabr`]) || None;
- const meleeweapondam = (values[`repeating_meleeweapons_${id}_meleedamage`]) || None;
-
- if(id.toLowerCase() === playerclickedid) {
- output.magicmeleeweaponbonus = checkbox ? magicbonus : 0;
- output.meleeweapon = checkbox ? meleeweaponname : "None";
- output.meleeabr = checkbox ? meleeweaponabr : "0d0";
- output.meleedamage = checkbox ? meleeweapondam : "0d0";
- }
- else if(checkbox) {
- output[`repeating_meleeweapons_${id}_equippedmeleewep`] = 0;
- }
- setAttrs(output);
- });
- });
- });
-});
-
-on('change:repeating_rangedweapons', function(event) {
- if (event.sourceType === 'sheetworker' ) return;
- const playerclickedid = (event.sourceAttribute.split('_')[2] || '').toLowerCase();
- getSectionIDs('repeating_rangedweapons', function (ids) {
- const fieldnames = [];
- ids.forEach(id => fieldnames.push(
- `repeating_rangedweapons_${id}_equippedrangedwep`,
- `repeating_rangedweapons_${id}_magicrangedweaponbonus`,
- `repeating_rangedweapons_${id}_rangedweapon`,
- `repeating_rangedweapons_${id}_rangedabr`,
- `repeating_rangedweapons_${id}_rangeddamage`,
- `repeating_rangedweapons_${id}_weaponshortrange`,
- `repeating_rangedweapons_${id}_weaponmediumrange`,
- `repeating_rangedweapons_${id}_weaponlongrange`
-
- ));
- getAttrs(fieldnames, values => {
- const output = {};
- ids.forEach(id => {
- const checkbox = parseInt(values[`repeating_rangedweapons_${id}_equippedrangedwep`]) || 0;
- const magicbonus = parseInt(values[`repeating_rangedweapons_${id}_magicrangedweaponbonus`]) || 0;
- const rangedweaponname = (values[`repeating_rangedweapons_${id}_rangedweapon`]) || None;
- const rangedweaponabr = (values[`repeating_rangedweapons_${id}_rangedabr`]) || None;
- const rangedweapondam = (values[`repeating_rangedweapons_${id}_rangeddamage`]) || None;
- const shortrange = (values[`repeating_rangedweapons_${id}_weaponshortrange`]) || None;
- const mediumrange = (values[`repeating_rangedweapons_${id}_weaponmediumrange`]) || None;
- const longrange = (values[`repeating_rangedweapons_${id}_weaponlongrange`]) || None;
-
- if(id.toLowerCase() === playerclickedid) {
- output.magicrangedweaponbonus = checkbox ? magicbonus : 0;
- output.rangedweapon = checkbox ? rangedweaponname : "None";
- output.rangedabr = checkbox ? rangedweaponabr : "0d0";
- output.rangeddamage = checkbox ? rangedweapondam : "0d0";
- output.weaponshortrange = checkbox ? shortrange : 0;
- output.weaponmediumrange = checkbox ? mediumrange : 0;
- output.weaponlongrange = checkbox ? longrange : 0;
- }
- else if(checkbox) {
- output[`repeating_rangedweapons_${id}_equippedrangedwep`] = 0;
- }
- setAttrs(output);
- });
- });
- });
-});
-
-on('change:repeating_ammo', function(event) {
- if (event.sourceType === 'sheetworker' ) return;
- const playerclickedid = (event.sourceAttribute.split('_')[2] || '').toLowerCase();
- getSectionIDs('repeating_ammo', function (ids) {
- const fieldnames = [];
- ids.forEach(id => fieldnames.push(
- `repeating_ammo_${id}_equippedammo`,
- `repeating_ammo_${id}_magicammobonus`,
- `repeating_ammo_${id}_specialammomodifier`,
- `repeating_ammo_${id}_specialammoabrmodifier`,
- `repeating_ammo_${id}_specialammodmgmodifier`,
- `repeating_ammo_${id}_ammotype`
- ));
- getAttrs(fieldnames, values => {
- const output = {};
- ids.forEach(id => {
- const checkbox = parseInt(values[`repeating_ammo_${id}_equippedammo`]) || 0;
- const magicbonus = parseInt(values[`repeating_ammo_${id}_magicammobonus`]) || 0;
- const specialammomodifier = parseInt(values[`repeating_ammo_${id}_specialammomodifier`]) || 0;
- const specialammoabrmodifier = parseInt(values[`repeating_ammo_${id}_specialammoabrmodifier`]) || 0;
- const specialammodmgmodifier = parseInt(values[`repeating_ammo_${id}_specialammodmgmodifier`]) || 0;
- const ammo = (values[`repeating_ammo_${id}_ammotype`]) || 0;
-
- if(id.toLowerCase() === playerclickedid) {
- output.magicammobonus = checkbox ? magicbonus : 0;
- output.specialammomodifier = checkbox ? specialammomodifier : 0;
- output.specialammoabrmodifier = checkbox ? specialammoabrmodifier : 0;
- output.specialammodmgmodifier = checkbox ? specialammodmgmodifier : 0;
- output.ammotype = checkbox ? ammo : "None";
- }
- else if(checkbox) {
- output[`repeating_ammo_${id}_equippedammo`] = 0;
- }
- setAttrs(output);
- });
- });
- });
-});
-
-on('change:specialammomodifier change:equippedammo change:equippedrangedwep change:equippedmeleewep change:shield change:attack change:defence change:magicammobonus change:magicrangedweaponbonus change:magicmeleeweaponbonus change:armourattackpenalty change:armourdefencepenalty change:magicshield sheet:opened', function() {
- getAttrs(['specialammomodifier','shield','attack','defence','magicammobonus','magicrangedweaponbonus','magicmeleeweaponbonus','armourattackpenalty','armourdefencepenalty','magicshield'], function(v) {
- let atk = parseInt(v.attack)||0;
- let def = parseInt(v.defence)||0;
- let ammo = parseInt(v.magicammobonus)||0;
- let specialammo = parseInt(v.specialammomodifier)||0;
- let ranged = parseInt(v.magicrangedweaponbonus)||0;
- let melee = parseInt(v.magicmeleeweaponbonus)||0;
- let armouratk = parseInt(v.armourattackpenalty)||0;
- let armourdef = parseInt(v.armourdefencepenalty)||0;
- let shieldequipped = parseInt(v.shield)||0;
- if (shieldequipped === 1) {
- shield = parseInt(v.magicshield)||0;
- }
- else {
- shield = 0;
- }
- let basemeleeatk = (atk + melee - armouratk);
- let basemeleedef = (def + melee - armourdef + shield);
- let baserangedatk = (atk + ranged + ammo + specialammo - armouratk);
- let baserangeddef= (def - armourdef + shield);
-
- setAttrs({
- baserangedattack: baserangedatk,
- baserangeddefence: baserangeddef,
- basemeleeattack: basemeleeatk,
- basemeleedefence: basemeleedef
- });
- });
-});
-
-on('change:othermodifications change:armourpiercingselect change:masterbowmanselect change:penetratingshotmultiplier change:penetratingshotselect change:weaponskillselect change:shield change:expertparryselect change:guardcountered change:guardcurrent change:attack change:defence change:basemeleeattack change:basemeleedefence change:baserangedattack change:baserangeddefence change:evasion sheet:opened', function() {
- getAttrs(['mattackmoda','mdefencemoda','rattackmoda','rdefencemoda','evasionmod','othermodifications','armourpiercingselect','armourpiercingmodifier','masterbowmanselect','masterbowmanmodifier','penetratingshotmultiplier','penetratingshotselect','weaponskillselect','weaponskillabrmodifier','guardabrmodifier','guarddamagemodifier','shield','expertparryselect','shieldsuccessvalue','shielddievalue','guardcountered','basemeleeattack','basemeleedefence','baserangedattack','baserangeddefence','evasion','guardcurrent'], function(value) {
-
- const forms = {
- Hawk: {mattackmoda: 1, mattackmodded: 1, mdefencemoda: -2, mdefencemodded: -2, rattackmoda: 1, rattackmodded: 1, rdefencemoda: -2, rdefencemodded: -2, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "If wielding a two-handed weapon: -1 Evasion and +1 Armour Penetration (please adjust manually)"},
- Snake: {mattackmoda: 1, mattackmodded: 1, mdefencemoda: -3, mdefencemodded: -3, rattackmoda: 1, rattackmodded: 1, rdefencemoda: -3, rdefencemodded: -3, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "Critical Hits do +1 HP damage (please adjust manually)"},
- Wolf: {mattackmoda: 2, mattackmodded: 2, mdefencemoda: -3, mdefencemodded: -3, rattackmoda: 2, rattackmodded: 2, rdefencemoda: -3, rdefencemodded: -3, evasionmod: -1, evasionmodded: -1, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "None"},
- Bear: {mattackmoda: -2, mattackmodded: -2, mdefencemoda: 1, mdefencemodded: 1, rattackmoda: -2, rattackmodded: -2, rdefencemoda: 1, rdefencemodded: 1, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "+1 additional Defence for each opponent beyond the first (Please enter in the Miscelaneous Modifiers Section manually)"},
- Cat: {mattackmoda: -2, mattackmodded: -2, mdefencemoda: 1, mdefencemodded: 1, rattackmoda: -2, rattackmodded: -2, rdefencemoda: 1, rdefencemodded: 1, evasionmod: 1, evasionmodded: 1, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "If using a shield: an additional -1 Attack and Shields block on a roll of 1 on 1d4 (these adjustments have been made for you)"},
- Crab: {mattackmoda: -2, mattackmodded: -2, mdefencemoda: 2, mdefencemodded: 2, rattackmoda: -2, rattackmodded: -2, rdefencemoda: 2, rdefencemodded: 2, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "None"},
- Neutral: {mattackmoda: 0, mattackmodded: 0, mdefencemoda: 0, mdefencemodded: 0, rattackmoda: 0, rattackmodded: 0, rdefencemoda: 0, rdefencemodded: 0, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "None"},
- Defensive: {mattackmoda: -2, mattackmodded: -2, mdefencemoda: 1, mdefencemodded: 1, rattackmoda: -2, rattackmodded: -2, rdefencemoda: 1, rdefencemodded: 1, evasionmod: 1, evasionmodded: 1, guarddamagemodifier: -1, guardabrmodifier: -1, othermodifications: "-1 Damage and -1 Armour Penetration (these adjustments have been made for you)"},
- Offensive: {mattackmoda: 1, mattackmodded: 1, mdefencemoda: -2, mdefencemodded: -2, rattackmoda: 1, rattackmodded: 1, rdefencemoda: -2, rdefencemodded: -2, evasionmod: -1, evasionmodded: -1, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "None"}
- };
-
- let guac = parseInt(value.guardcountered)||0;
- let gua = value.guardcurrent || 'Neutral';
- const output = forms[gua] || forms.Neutral;
-
- output.evasionmodded += parseInt(value.evasion) || 0;
- output.evasionmod;
- output.othermodifications == (value.othermodifications) || "None";
-
- let shieldeq = parseInt(value.shield)||0;
- let shielddie = (value.shielddievalue)||'1d6';
- let shieldsuccess = parseInt(value.shieldsuccessvalue)||1;
-
- let expertparry = parseInt(value.expertparryselect)||0;
- let weaponskill = parseInt(value.weaponskillselect)||0;
- let penetratingshot = parseInt(value.penetratingshotselect)||0;
- let masterbowman = parseInt(value.masterbowmanselect)||0;
- let armourpiercing = parseInt(value.armourpiercingselect)||0;
-
- if (masterbowman === 1) {
- output.masterbowmanmodifier = 1 || 0;
- }
- else {
- output.masterbowmanmodifier = 0 || 0;
- }
-
- if (armourpiercing === 1) {
- output.armourpiercingmodifier = 1 || 0;
- }
- else {
- output.armourpiercingmodifier = 0;
- }
-
- if (weaponskill === 1) {
- output.weaponskillabrmodifier = 1 || 0;
- }
- else {
- output.weaponskillabrmodifier = 0;
- }
-
- if (penetratingshot === 1) {
- output.penetratingshotabrmodifier = parseInt(value.penetratingshotmultiplier) || 0;
- }
- else {
- output.penetratingshotabrmodifier = 0;
- }
-
- if (gua === "Cat") {
- shielddie = '1d4';
- shieldsuccess = 1;
- }
- else if (expertparry === 1) {
- shielddie = '1d10';
- shieldsuccess = 2;
- }
- else {
- shielddie = '1d6';
- shieldsuccess = 1;
- }
- output.shielddievalue = shielddie;
- output.shieldsuccessvalue = shieldsuccess;
-
- if (guac === 1 && gua !== "Neutral") {
- if (gua === "Hawk" || gua === "Snake" || gua === "Wolf") {
- output.mattackmodded += (parseInt(value.basemeleeattack)-2) || 0;
- output.mattackmoda-2;
- output.mdefencemodded += parseInt(value.basemeleedefence) || 0;
- output.mdefencemoda;
- output.rattackmodded += (parseInt(value.baserangedattack)-2) || 0;
- output.rattackmoda-2;
- output.rdefencemodded += parseInt(value.baserangeddefence) || 0;
- output.rdefencemoda;
- }
- else if (gua === "cat" && shieldeq === 1) {
- output.mattackmodded += (parseInt(value.basemeleeattack)-1) || 0;
- output.mattackmoda-1;
- output.mdefencemodded += (parseInt(value.basemeleedefence)-2) || 0;
- output.mdefencemoda-2;
- output.rattackmodded += parseInt(value.baserangedattack)-1 || 0;
- output.rattackmoda;
- output.rdefencemodded += (parseInt(value.baserangeddefence)-2) || 0;
- output.rdefencemoda-2;
- }
- else {
- output.mattackmodded += parseInt(value.basemeleeattack) || 0;
- output.mattackmoda;
- output.mdefencemodded += (parseInt(value.basemeleedefence)-2) || 0;
- output.mdefencemoda-2;
- output.rattackmodded += parseInt(value.baserangedattack) || 0;
- output.rattackmoda;
- output.rdefencemodded += (parseInt(value.baserangeddefence)-2) || 0;
- output.rdefencemoda-2;
-
- }
- }
- else if (gua === "Cat" && shieldeq === 1) {
- output.mattackmodded += (parseInt(value.basemeleeattack)-1) || 0;
- output.mattackmoda-1;
- output.mdefencemodded += parseInt(value.basemeleedefence) || 0;
- output.mdefencemoda;
- output.rattackmodded += (parseInt(value.baserangedattack)-1) || 0;
- output.rattackmoda-1;
- output.rdefencemodded += parseInt(value.baserangeddefence) || 0;
- output.rdefencemoda;
- }
- else {
- output.mattackmodded += parseInt(value.basemeleeattack) || 0;
- output.mattackmoda;
- output.mdefencemodded += parseInt(value.basemeleedefence) || 0;
- output.mdefencemoda;
- output.rattackmodded += parseInt(value.baserangedattack) || 0;
- output.rattackmoda;
- output.rdefencemodded += parseInt(value.baserangeddefence) || 0;
- output.rdefencemoda;
- }
-
- setAttrs(output);
-
- });
- });
-
- on('change:miscattackmelee change:miscdefencemelee change:miscattackranged change:miscdefenceranged change:mainguacheactive change:berserktoranged change:attack change:basemeleeattack change:basemeleedefence change:baserangedattack change:baserangeddefence change:defence change:rattackmodded change:rdefencemodded change:mattackmodded change:mdefencemodded change:berserkneg change:preciseneg change:stillnessneg change:bloodrageselect change:nonprofselect change:deathvowselect sheet:opened', function() {
- getAttrs(['mainguachedefence','mainguacheactive','berserktoranged','finalattack','finaldefence','basemeleedefence','basemeleeattack','baserangedattack','baserangeddefence','mdefencemodded','rattackmodded','rdefencemodded','mattackmodded','berserkneg','berserkpos','preciseneg','precisepos','stillnessneg','bloodrageselect','nonprofselect','deathvowselect','miscattackmelee','miscdefencemelee','miscattackranged','miscdefenceranged'], function(v) {
- let bloodrage = parseInt(v.bloodrageselect) || 0;
- let berserkappliestoranged = parseInt(v.berserktoranged)||0;
- let mainguache = parseInt(v.mainguacheactive)||0;
-
- if (bloodrage === 1) {
- bloodragemod = parseInt(v.basemeleedefence) || 0;
- bloodragedmgmod = 1;
- berserkattack = 0;
- berserkdefence = 0;
- mainguachedefence = 0;
- nonprofmod = 0;
- deathvowmod = 0;
- preciseattack = 0;
- precisedefence = 0;
- stillnessdefence = 0;
- mattackmod = parseInt(v.basemeleeattack)||0;
- mdefencemod= parseInt(v.basemeleedefence)||0;
- rattackmod = parseInt(v.baserangedattack)||0;
- rdefencemod = parseInt(v.baserangeddefence)||0;
- }
- else if (mainguache === 2) {
- mainguachedefence = parseInt(v.basemeleedefence) || 0;
- berserkattack = 0;
- berserkdefence = 0;
- mattackmod = parseInt(v.mattackmodded)||0;
- mdefencemod= parseInt(v.basemeleedefence)||0;
- rattackmod = parseInt(v.rattackmodded) || 0;
- rdefencemod = parseInt(v.rdefencemodded) || 0;
- nonprofmod = 0;
- deathvowmod = 0;
- preciseattack = 0;
- precisedefence = 0;
- stillnessdefence = 0;
- }
- else if (mainguache === 1) {
- berserkattack = 0;
- berserkdefence = 0;
- rattackmod = parseInt(v.rattackmodded) || 0;
- rdefencemod = parseInt(v.rdefencemodded) || 0;
- mattackmod = parseInt(v.mattackmodded)||0;
- mdefencemod = parseInt(v.mdefencemodded)||0;
- nonprofmod = 0;
- deathvowmod = 0;
- preciseattack = 0;
- precisedefence = 0;
- stillnessdefence = 0;
- mainguachedefence = -2;
- }
- else {
- bloodragemod = 0;
- bloodragedmgmod = 0;
- berserkattack = parseInt(v.berserkpos) || 0;
- berserkdefence = parseInt(v.berserkneg) || 0;
- rattackmod = parseInt(v.rattackmodded) || 0;
- rdefencemod = parseInt(v.rdefencemodded) || 0;
- mattackmod = parseInt(v.mattackmodded)||0;
- mdefencemod = parseInt(v.mdefencemodded)||0;
- nonprofmod = parseInt(v.nonprofselect) || 0;
- deathvowmod = parseInt(v.deathvowselect) || 0;
- preciseattack = parseInt(v.precisepos) || 0;
- precisedefence = parseInt(v.preciseneg) || 0;
- stillnessdefence = parseInt(v.stillnessneg) || 0;
- mainguachedefence = 0;
- }
-
- let miscmeleea = parseInt(v.miscattackmelee)||0;
- let miscmeleed = parseInt(v.miscdefencemelee)||0;
- let miscrangeda = parseInt(v.miscattackranged)||0;
- let miscrangedd = parseInt(v.miscdefenceranged)||0;
-
- let fmatk = (mattackmod + berserkattack - nonprofmod + deathvowmod + bloodragemod + miscmeleea);
- let fmdef = (mdefencemod - berserkdefence - precisedefence - stillnessdefence - bloodragemod - mainguachedefence + miscmeleed);
-
- if (berserkappliestoranged === 1) {
- fratk = (rattackmod + berserkattack - nonprofmod + deathvowmod + preciseattack + miscrangeda)||0;
- frdef = (rdefencemod - berserkdefence - precisedefence - stillnessdefence + miscrangedd)||0;
- }
- else {
- fratk = (rattackmod - nonprofmod + deathvowmod + preciseattack + miscrangeda)||0;
- frdef = (rdefencemod - berserkdefence - precisedefence - stillnessdefence + miscrangedd)||0;
- }
-
- setAttrs({
- bloodragedmgmod: bloodragedmgmod,
- finalmeleeattack: parseInt(fmatk)||0,
- finalmeleedefence: parseInt(fmdef)||0,
- finalrangedattack: parseInt(fratk)||0,
- finalrangeddefence: parseInt(frdef)||0
- });
- });
- });
-
- on('change: miscabrmelee change:miscdamagemelee change:miscabrranged change:miscdamageranged change:meleeabrbonus change:magicmeleeweaponbonus change:weaponskillabrmodifier change:armourpiercingmodifier change:weaponskillabrmodifier change:guardabrmodifier change:guarddamagemodifier change:meleedmgbonus change:magicammobonus change:magicrangedweaponbonus change:specialammoabrmodifier change:specialammodmgmodifier change:penetratingshotabrmodifier change:armourpiercingmodifier change:masterbowmanmodifier change:bloodragedmgmod', function() {
- getAttrs(['miscabrmelee','miscdamagemelee','miscabrranged','miscdamageranged','meleeabrbonus','magicmeleeweaponbonus','weaponskillabrmodifier','armourpiercingmodifier','weaponskillabrmodifier','guardabrmodifier','guarddamagemodifier','meleedmgbonus','magicammobonus','magicrangedweaponbonus','specialammoabrmodifier','specialammodmgmodifier','penetratingshotabrmodifier','armourpiercingmodifier','masterbowmanmodifier','bloodragedmgmod'], function(v) {
- let meleeabrbonus = parseInt(v.meleeabrbonus)||0;
- let magicmeleeweaponbonus = parseInt(v.magicmeleeweaponbonus)||0;
- let weaponskillabrmodifier = parseInt(v.weaponskillabrmodifier)||0;
- let armourpiercingmodifier = parseInt(v.armourpiercingmodifier)||0;
- let guardabrmodifier = parseInt(v.guardabrmodifier)||0;
- let meleedmgbonus = parseInt(v.meleedmgbonus)||0;
- let guarddamagemodifier = parseInt(v.guarddamagemodifier)||0;
- let magicammobonus = parseInt(v.magicammobonus)||0;
- let magicrangedweaponbonus = parseInt(v.magicrangedweaponbonus)||0;
- let specialammoabrmodifier = parseInt(v.specialammoabrmodifier)||0;
- let penetratingshotabrmodifier = parseInt(v.penetratingshotabrmodifier)||0;
- let masterbowmanmodifier = parseInt(v.masterbowmanmodifier)||0;
- let specialammodmgmodifier = parseInt(v.specialammodmgmodifier)||0;
- let bloodragedmgmod = parseInt(v.bloodragedmgmod)||0;
- let miscabrmelee = parseInt(v.miscabrmelee)||0;
- let miscdamagemelee = parseInt(v.miscdamagemelee)||0;
- let miscabrranged = parseInt(v.miscabrranged)||0;
- let miscdamageranged = parseInt(v.miscdamageranged)||0;
-
- let fmeleeabrbonus = (miscabrmelee + meleeabrbonus + magicmeleeweaponbonus + weaponskillabrmodifier + armourpiercingmodifier + guardabrmodifier);
- let fmeleedmgbonus = (miscdamagemelee + magicmeleeweaponbonus + meleedmgbonus + guarddamagemodifier + bloodragedmgmod);
- let frangedabrbonus = (miscabrranged + guardabrmodifier + magicammobonus + magicrangedweaponbonus + specialammoabrmodifier + penetratingshotabrmodifier + masterbowmanmodifier + armourpiercingmodifier);
- let frangeddmgbonus = (miscdamageranged + guarddamagemodifier + magicammobonus + magicrangedweaponbonus + specialammodmgmodifier + bloodragedmgmod);
-
- setAttrs({
- finalmeleeabrbonus: parseInt(fmeleeabrbonus)||0,
- finalmeleedmgbonus: parseInt(fmeleedmgbonus)||0,
- finalrangedabrbonus: parseInt(frangedabrbonus)||0,
- finalrangeddmgbonus: parseInt(frangeddmgbonus)||0
- });
- });
- });
-
- on('change:finalstrength', function() {
- getAttrs(['finalstrength','meleedmgbonus','meleeabrbonus'], function(value) {
-
- let str = parseInt(value.finalstrength)||0;
- let maxenc = parseInt(value.maxenc)||0;
- let meleeabrbonus = parseInt(value.meleeabrbonus)||0;
- let meleedmgbonus = parseInt(value.meleeadmgbonus)||0;
-
- if (str <= 5) {
- maxenc = 6;
- meleeabrbonus = 0;
- meleedmgbonus = 0;
- }
- else if (str <= 8) {
- maxenc = 8;
- meleeabrbonus = 0;
- meleedmgbonus = 0;
- }
- else if (str <= 12) {
- maxenc = 10;
- meleeabrbonus = 0;
- meleedmgbonus = 0;
- }
- else if (str <= 15) {
- maxenc = 12;
- meleeabrbonus = 0;
- meleedmgbonus = 0;
- }
- else if (str <= 18) {
- maxenc = 14;
- meleeabrbonus = 1;
- meleedmgbonus = 1;
- }
- else {
- maxenc = 14;
- meleeabrbonus = 2;
- meleedmgbonus = 2;
- }
-
- setAttrs({
- meleeabrbonus: meleeabrbonus,
- meleedmgbonus: meleedmgbonus,
- maxenc: maxenc
- });
- });
- });
-
-on('change:berserkneg ', () => {
- getAttrs(['berserkneg', 'mdefencemodded', 'rdefencemodded'], v=> {
- const stats = ['berserk'];
- const output = {};
- const mdef = parseInt(v.mdefencemodded) || 0;
- const rdef = parseInt(v.rdefencemodded) || 0;
- stats.forEach(stat => {
- let neg = parseInt(v[`${stat}neg`]) || 0;
- let score = (neg > mdef || neg > rdef) ? Math.max(mdef, rdef) : (neg < 0 ? 0 : neg);
- let factor = 3;
- let pos = Math.floor(score / factor);
- output[`${stat}neg`] = Math.floor(score/factor)*factor;
- output[`${stat}pos`] = pos;
- });
- setAttrs(output, {silent:true});
- });
-});
-
-on('change:preciseneg change:stillnessneg', () => {
- getAttrs(['preciseneg', 'stillnessneg','rdefencemodded'], v=> {
- const stats = ['precise', 'stillness'];
- const output = {};
- const mdef = parseInt(v.rdefencemodded) || 0;
- stats.forEach(stat => {
- let neg = parseInt(v[`${stat}neg`]) || 0;
- let score = (neg > rdef) ? rdef : (neg < 0 ? 0 : neg);
- let factor = (stat === 'stillness') ? 2 : 3;
- let pos = Math.floor(score / factor);
- output[`${stat}neg`] = Math.floor(score/factor)*factor;
- output[`${stat}pos`] = pos;
- });
- setAttrs(output, {silent:true});
- });
-});
-
-on('change:magicalattack change:magicaldefence change:miscmagicattack change:miscmagicdefence change:stillnesspos change:evasionmodded change:evasion change:miscevasion change:stealth change:perception change:miscstealth change:miscperception change:af change:magicafbonus change:miscaf change:strength change:reflexes change:intelligence change:psychictalent change:looks change:miscstrength change:miscreflexes change:miscintelligence change:miscpsychictalent change:misclooks sheet:opened', function(event) {
- getAttrs(['magicalattack','magicaldefence','miscmagicattack','miscmagicdefence','finalevasion','finalstealth','finalperception','stillnesspos','evasionmodded','evasion','miscevasion','stealth','perception','miscstealth','miscperception','finalstrength','finalreflexes','finalintelligence','finalpsychictalent','finallooks','totalaf','af','magicafbonus','miscaf','strength','reflexes','intelligence','psychictalent','looks','miscstrength','miscreflexes','miscintelligence','miscpsychictalent','misclooks'], function(v) {
- let af = parseInt(v.af);
- let magicaf = parseInt(v.magicafbonus);
- let miscaf = parseInt(v.miscaf);
- let str = parseInt(v.strength);
- let ref = parseInt(v.reflexes);
- let int = parseInt(v.intelligence);
- let psy = parseInt(v.psychictalent);
- let lks = parseInt(v.looks);
- let mstr = parseInt(v.miscstrength);
- let mref = parseInt(v.miscreflexes);
- let mint = parseInt(v.miscintelligence);
- let mpsy = parseInt(v.miscpsychictalent);
- let mlks = parseInt(v.misclooks);
- let bstl = parseInt(v.stealth);
- let bper = parseInt(v.perception);
- let mstl = parseInt(v.miscstealth);
- let pstl = parseInt(v.stillnesspos)||0;
- let mper = parseInt(v.miscperception);
- let beva = parseInt(v.evasionmodded);
- let meva = parseInt(v.miscevasion);
- let maa = parseInt(v.magicalattack);
- let mde = parseInt(v.magicaldefence);
- let mmaa = parseInt(v.miscmagicattack);
- let mmde = parseInt(v.miscmagicdefence);
-
- let fstr = str + mstr;
- let fref = ref + mref;
- let fint = int + mint;
- let fpsy = psy + mpsy;
- let flks = lks + mlks;
- let faf = (af + magicaf + miscaf);
- let fstl = (bstl + mstl + pstl);
- let fper = bper + mper;
- let feva = beva + meva;
- let fmaa = maa + mmaa;
- let fmde = mde + mmde;
-
- setAttrs({
- finalstrength: fstr,
- finalreflexes: fref,
- finalintelligence: fint,
- finalpsychictalent: fpsy,
- finallooks: flks,
- totalaf: faf,
- finalstealth: fstl,
- finalperception: fper,
- finalevasion: feva,
- finalmagicalattack: fmaa,
- finalmagicaldefence: fmde
- });
- });
-});
-
-const woundValues = ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30"];
- woundValues.forEach(function(value) {
- on(`clicked:wound_${value}`, function() {
- setAttrs({
- wtwound: 0,
- wound: value
- });
- });
-});
-
-const wtwoundValues = ["0","1","2","3"];
-wtwoundValues.forEach(function(value) {
- on(`clicked:wtwound_${value}`, function() {
- getAttrs(["maxhp","wound"], function(v) {
- let w1= parseInt(v.wound);
- let m1= parseInt(v.maxhp);
- if (w1 < m1)
- wou = m1,
- wtw = value;
- else
- wtw = value;
- setAttrs({
- wtwound: wtw,
- wound: wou
-});
-});
-});
-});
-
-const manausedValues = ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30"];
- manausedValues.forEach(function(value) {
- on(`clicked:manaused_${value}`, function() {
- setAttrs({
- manaused: value
- });
- });
-});
-
-const secmanausedValues = ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30"];
- secmanausedValues.forEach(function(value) {
- on(`clicked:secmanaused_${value}`, function() {
- setAttrs({
- secmanaused: value
- });
- });
-});
-
-const termanausedValues = ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30"];
- termanausedValues.forEach(function(value) {
- on(`clicked:termanaused_${value}`, function() {
- setAttrs({
- termanaused: value
- });
- });
-});
-
-on("clicked:wound_reset", function() {
- setAttrs({
- wound: 0,
- wtwound: 0
- });
-});
-
-on("clicked:mp_reset", function() {
- setAttrs({
- manaused: 0
- });
-});
-
-on("clicked:secmp_reset", function() {
- setAttrs({
- secmanaused: 0
- });
-});
-
-on("clicked:termp_reset", function() {
- setAttrs({
- termanaused: 0
- });
-});
-
-on('change:rank sheet:opened', function() {
- getAttrs(['pfc','rank','espchance','premonitionchance'], function(value) {
- let rank = parseInt(value.rank)||0;
- let psycfatcheck = rank + 13;
- let esp = 5 + rank * 3;
- let prem = 35 + rank * 2;
- setAttrs({
- pfc: psycfatcheck,
- espchance: esp,
- premonitionchance: prem
- });
- });
- });
-
- on("change:repeating_inventoryitems remove:repeating_inventoryitems change:gc change:sf change:cp change:repeating_meleeweapons remove:repeating_meleeweapons change:repeating_rangedweapons remove:repeating_rangedweapons change:repeating_ammo remove:repeating_ammo change:shield sheet:opened", function() {
- repeatingSum("totalmeleeweaponweight", "meleeweapons", "meleeweaponweight");
- repeatingSum("totalrangedweaponweight", "rangedweapons", "rangedweaponweight");
- repeatingSum("ammoweight", "ammo", "ammoqty");
- getAttrs(["gc","sf", "cp"], function(value) {
- let gc = parseFloat(value.GC)||0;
- let sf = parseFloat(value.SF)||0;
- let cp = parseFloat(value.CP)||0;
- });
-
- repeatingSum("totalencumbrance", "inventoryitems", ["inventoryqty", "encumbrancevalue"], "gc:1/150", "sf:1/150", "cp:1/150", "ammoweight:1/12", "totalmeleeweaponweight", "totalrangedweaponweight", "shield", "round");
- });
\ No newline at end of file
diff --git a/Dragon Warriors/Dragon Warriors Revised HomeBrew.html b/Dragon Warriors/Dragon Warriors Revised HomeBrew.html
deleted file mode 100644
index 23a705f846..0000000000
--- a/Dragon Warriors/Dragon Warriors Revised HomeBrew.html
+++ /dev/null
@@ -1,1765 +0,0 @@
-
-
-
- Character
- Inventory
- Combat
- Magic
- Skills
- Languages
- Biography
- Documentation
-
-
-
-
-
-
- Name
- Profession
- (Pick One)
- Knight
- Barbarian
- Sorcerer
- Mystic
- Elementalist
- Warlock
- Assassin
- Knave
- Hunter
- Priest
- Demonologist
-
- Rank
- Experience
-
-
-
Characteristics
-
Strength
-
Reflexes
-
Intelligence
-
Psychic Talent
-
Looks
-
-
-
Base Combat Factors
-
Attack
-
Defence
-
-
-
Dodging
-
Base Evasion
-
-
-
Base Magical Combat Factors
-
Magical Attack
-
Magical Defence
-
-
-
Base Stealth and Perception
-
Stealth
-
Perception
-
-
-
Health Points
-
Maximum Health Points
-
Wounds Taken:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Heal!
-
-
-
Armour
-
Type
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Advanced Guards
-
- Guard Taken
- Neutral (0)
- Hawk (1)
- Snake (2)
- Wolf (3)
- Bear (4)
- Cat (5)
- Crab (6)
-
- Melee Attack:
- Melee Defence:
- Ranged Attack:
- Ranged Defence:
-
- Evasion:
- Other Modifications:
-
-
-
Magic
-
- Direct Magical Attack
- Indirect Magical Attack
-
-
-
- Spell Expiry Check
-
-
- Spell Expiry Check
-
-
-
Magic Points:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Refresh!
-
-
- Psychic Fatigue Check: - spell level
- ESP %
- Premonition %
-
-
-
-
Magic Points:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Refresh!
-
Magic Points:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Refresh!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Elemental Specialisms
-
-
Primary Element
-
- (Pick One)
- Earth (moonset)
- Air (noon)
- Water (moonrise)
- Fire (sunrise)
- Darkness (sunset)
-
-
Secondary Element
-
- (Pick One)
- Earth (moonset)
- Air (noon)
- Water (moonrise)
- Fire (sunrise)
-
-
Secondary Element
-
- (Pick One)
- Earth (moonset)
- Air (noon)
- Water (moonrise)
- Fire (sunrise)
-
-
-
-
Magic Points
-
Magic Points
-
Magic Points Used:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Refresh!
-
-
-
-
Element Max
-
Magic Points Used:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Refresh!
-
-
Element Max
-
Magic Points Used:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Refresh!
-
-
-
-
-
- Mystic Magic
- Psychic Fatigue Check: - spell level
- ESP %
- Premonition %
-
-
-
-
-
-
-
-
-
-
-
-
-
- This character sheet includes material based on the Dragon Warriors setting, as created by and copyright (c) Dave Morris and Oliver Johnson, and used according to the terms of the Serpent King Games Fan Policy. We are not permitted to charge you to use or access this content. This character sheet is not published, endorsed, or officially approved by Serpent King Games. For more information about Dragon Warriors products and Serpent King Games, please visit www.serpentking.com
- Serpent King Games expects you to use the Dragon Warriors setting responsibly and legally. That means avoiding associating the setting with extreme graphic violence, explicit sexual content, hate speech against any particular real-world segment of society, or anything else that does not present Dragon Warriors in a positive light.
- If you have any questions about Dragon Warriors, or the conditions of use of this character sheet, please email info@serpentking.com
- Most of the images used on the character sheet come directly from the Dragon Warriors books.
- The image used to represent Magic Points named "effect" and was created by ATOM and sourced from the Noun Project.
- A huge shoutout to Roll20 forums member GiGs, without whom this sheet would not have been built.
- Release Notes
- Ver 1.2.1
- Bug fixes and Sheet Roll updates
- Fixed and Added:
- Encumberance was not calculating properly due to an old Sheet Worker, fixed.
- Sheet rolls were unprofessional looking, they have been updated to use roll templates. Thanks to @SouthernSkies on the Dragon Warriors Discord server for his assistance with this.
- PFC sheet roll was not working at all, fixed.
- ESP and Premonition checks were dependent on an API, this requirement has been removed for the published version. If you are a Pro Subscriber, I suggest that you install the "Blind Roll" API and create the following macros:
- ESP "!broll 1d100<@{espchance}"
- Premonition "!broll 1d100<@{premonitionchance}"
-
- Ver 1.2
- Total Overhaul Update
- Fixed and Added:
- Major changes to layout, and corrected font style for inputs
- Added artworks
- Corrected problems with Elementalist MP sections
- Fixed issues with Mystic's Psychic Fatigue field
- Added Combat page to track all changes to Attack and Defence scores through guards, profession abilities and equipment modifiers
- Changed the button image on wounds and mana points trackers
- Added wound counters to track Health Points down to -1, -2 and -3 (wounds tracker for Macros does not take these into account, but they are not relevant for KO/shock calculations anyway)
- Added a magic bonus section to weapons and shields for applying bonuses to combat attributes.
- Added 'equipped' value to weapons selection to ensure only a single weapon's magic bonuses applies at a time.
- Modified the Armour Factor area to be more specific.
- Added sheet rolls for attacks, attribute checks and other basic game roll functions
- Further code stream-lining.
-
- Ver 1.1
- Fixed and Added:
- Missing Languages added and literacy checkbox default value fixed
- Slight remodel of the front page to incorporate new elements
- Sheet Worker now rounds off encumberance, and calculates total (including equipment, coins, weapons and shield) and maximum encumbrance values
- Added a quantity field for inventory items
- Added an ammunition section underneath the Weapons
- Wounds checkboxes have been updated, the number of radioboxes available is set to equal a character's max HP. The sheet can calculate remaining HP based on the wounds counter.
- Show/hide magic sections (front page and magic page) dependant on profession selected from the dropdown list
- Major code tidy up
-
- Bugs to work out:
- None known, let me know if you see one so I can squash it!
-
- Features still to add:
-
-
-
-
\ No newline at end of file
diff --git a/Dragon Warriors/Dragon Warriors Revised.css b/Dragon Warriors/Dragon Warriors Revised.css
index 27af8e7b86..cf8b9002a4 100644
--- a/Dragon Warriors/Dragon Warriors Revised.css
+++ b/Dragon Warriors/Dragon Warriors Revised.css
@@ -102,13 +102,17 @@ button[type="roll"].sheet-d20{
background-color: transparent;
margin-left: 5px;
}
-button.sheet-d20{
+button.sheet-d20 {
background-image: url(https://i.imgur.com/JQC7jDf.jpg);
background-size: 30px 30px;
background-repeat: no-repeat;
width: 30px;
height: 30px;
}
+button.sheet-update {
+ padding: 2px;
+ margin-top: 3px;
+}
img.sheet-headerimage {
width: 100%;
}
@@ -124,6 +128,17 @@ img.sheet-imgchest {
margin-right: auto;
width: 50%;
}
+img.sheet-imghand {
+ display: inline-block;
+ width: 40px px;
+ height: 25px;
+}
+img.sheet-imghanda {
+ display: inline-block;
+ width: 40px px;
+ height: 25px;
+ transform: scaleX(-1);
+}
img.sheet-skullimg {
display: block;
margin-left: auto;
@@ -1969,9 +1984,11 @@ input.sheet-shield-toggle[value="1"] ~ div.sheet-shieldhidden1 {
border-width: 6px;
justify-content: space-between;
display: grid;
- grid-template-areas: "magattribheader magattribheader" "mcf2 mcfmd" "magmod2 magbox2" "magfmod2 magfbox2";
+ grid-template-areas: "mdheader mdheader" "mcf2 mcfmd" "magmod2 magbox2" "magfmod2 magfbox2";
+}
+.sheet-mdheader {
+ grid-area: mdheader;
}
-
.sheet-manabox {
grid-area: manabox;
border-style: double;
@@ -1986,9 +2003,12 @@ input.sheet-shield-toggle[value="1"] ~ div.sheet-shieldhidden1 {
border-style: double;
border-width: 6px;
justify-content: space-between;
- display: grid; grid-template-areas: "magattribheader magattribheader" "mcf1 mcfma" "magmod1 magbox1" "magfmod1 magfbox1";
+ display: grid;
+ grid-template-areas: "maheader maheader" "mcf1 mcfma" "magmod1 magbox1" "magfmod1 magfbox1";
+}
+.sheet-maheader {
+ grid-area: maheader;
}
-
/*define which elements should be shown, based on profession*/
.sheet-mana {
display: none;
@@ -2285,7 +2305,7 @@ input.sheet-profession-toggle[value="Demonologist"] ~ div.sheet-list {
display: grid;
border-style: double;
border-width: 6px;
- grid-template-areas: "finalsumheader finalsumheader finalsumheader finalsumheader" "finalsumcol1 finalsumboxes1 finalsumcol2 finalsumboxes2"
+ grid-template-areas: "finalsumheader finalsumheader finalsumheader finalsumheader" "finalsumcol1 finalsumboxes1 finalsumcol2 finalsumboxes2";
}
.sheet-finalsumboxes1 {
grid-area: finalsumboxes1;
@@ -2308,7 +2328,7 @@ input.sheet-profession-toggle[value="Demonologist"] ~ div.sheet-list {
border-style: double;
border-width: 6px;
grid-template-columns: 53% 47%;
- grid-template-areas: "combatsumheader combatsumheader" "meleeattack1 meleeattack1" "equippedweaponlabel1 equippedweaponbox1" "abrlabel1 abrbox1" "mabrlabel1 mabrbox1" "damagelabel1 damagebox1" "mdamlabel1 mdambox1" "imgsworddiv imgsworddiv" "rangedattack1 rangedattack1" "equippedweaponlabel2 equippedweaponbox2" "equippedammolabel1 equippedammobox1" "abrlabel2 abrbox2" "rabrlabel1 rabrbox1" "damagelabel2 damagebox2" "rdamlabel1 rdambox1" "rangecols rangecols";
+ grid-template-areas: "combatsumheader combatsumheader" "meleeattack1 meleeattack1" "equippedweaponlabel1 equippedweaponbox1" "abrlabel1 abrbox1" "mabrlabel1 mabrbox1" "damagelabel1 damagebox1" "mdamlabel1 mdambox1" "imgsworddiv imgsworddiv" "rangedattack1 rangedattack1" "equippedweaponlabel2 equippedweaponbox2" "equippedammolabel1 equippedammobox1" "abrlabel2 abrbox2" "rabrlabel1 rabrbox1" "damagelabel2 damagebox2" "rdamlabel1 rdambox1" "rangecols rangecols" "buttonfooter buttonfooter";
}
.sheet-meleeattack1 {
grid-area: meleeattack1 ;
@@ -2390,7 +2410,6 @@ input.sheet-profession-toggle[value="Demonologist"] ~ div.sheet-list {
}
.sheet-combatsumheader {
grid-area: combatsumheader;
- text-align: center;
}
.sheet-imgsworddiv {
grid-area: imgsworddiv;
diff --git a/Dragon Warriors/Dragon Warriors Revised.html b/Dragon Warriors/Dragon Warriors Revised.html
index 4336401b63..9e98ed97aa 100644
--- a/Dragon Warriors/Dragon Warriors Revised.html
+++ b/Dragon Warriors/Dragon Warriors Revised.html
@@ -9,6 +9,7 @@
Languages
Biography
Documentation
+ Click To Apply Changes
@@ -220,7 +221,6 @@
-
@@ -231,7 +231,7 @@
- Heal!
+ Heal!
Poison Save
@@ -319,7 +319,7 @@
Ranged Attack:
Ranged Defence:
Evasion:
- Other Effects:
+ Other Effects:
@@ -340,7 +340,7 @@
Ranged Attack:
Ranged Defence:
Evasion:
-
Other Effects:
+
Other Effects:
@@ -360,7 +360,7 @@
Ranged Attack:
Ranged Defence:
Evasion:
-
Other Effects:
+
Other Effects:
@@ -531,7 +531,7 @@
- Refresh!
+ Refresh!
Psychic Fatigue Check:
- spell level
@@ -539,10 +539,10 @@
Premonition
%
-
Magic Points:
+
Magic Points:
-
+
@@ -694,11 +694,11 @@
-
Refresh!
-
Magic Points:
+
Refresh!
+
Magic Points:
-
+
@@ -850,14 +850,14 @@
-
Refresh!
+
Refresh!
Other wealth
-
+
Final Melee Attack
Final Melee Defence
@@ -1005,13 +1009,17 @@
-
Element Max
-
Magic Points Used:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Refresh!
-
-
Element Max
-
Magic Points Used:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Refresh!
-
-
+
Magic Points
+
Magic Points
+
Mystic Magic
Psychic Fatigue Check: - spell level
@@ -1747,13 +1285,29 @@
Most of the images used on the character sheet come directly from the Dragon Warriors books.
The image used to represent Magic Points named "effect" and was created by ATOM and sourced from the Noun Project.
A huge shoutout to Roll20 forums member GiGs, without whom this sheet would not have been built.
+ Thank you to DragonWarriors Discord user SouthernSkies for playtesting and issue reporting.
+ And most certainly not least, the brave group of adventurers who have been my primary playtesters: Gille, Hariot, Cador, Randos and Ulfthak.
Release Notes
+ Ver 1.2.4
+ Token Integration and Radio Button Bug Fix
+ Implemented new attributes: currenthp, currentmp currentmpelementtwo and currentmpelementthree.
+ These attributes are to be used with token bars to accurately represent wounds and magic points which count down properly.
+ In developing these attributes, I was able to correct a bug which was requiring players to double click on wound / mp radio buttons to function properly.
+ Layout changes:
+ Removed redundant magic point trackers from the magic page. Not only were they redundant, but they interferred with the function of the currentmp set of attributes.
+ Ver 1.2.3
+ Workaround to address lag issue
+ Problem:
+ "Need to streamline Sheet Workers in the code to reduce overall attribute calls (looking for experienced JS coders for some help here!)."
+ The sheet will no longer seek to automatically update scores after any changes, as users had reported significant performance issues due to too many attribute checks/calls.
+ I have added a button to the top-bar "Click to Apply Changes", which the user will need to click to apply any changes made to the sheet.
+ While this is not the ideal solution I would choose, I do not have enough coding experience to rebuild the Sheet Workers myself.
Ver 1.2.2
Layout fixes, Bug fixes
Fixed and Added:
Fixed error preventing Precise Shot modifiers from being applied to rolls.
Spinners removed from read-only boxes to avoid confusion.
- Have moved base score inputs (all) to the renamed tab "Base Scores" (formerly Miscelaneous Modifiers).
+ Have moved base score inputs (all) to the renamed tab "Base Scores" (formerly Miscellaneous Modifiers).
Removed ABR / DMG bonus boxes from front sheet as unnecessary.
Moved AF misc bonus to the AF section of the Inventory page.
Opened up base Magic Stats on the Magic page for all classes.
@@ -1808,8 +1362,6 @@
Features still to add:
Change Attribute names so that making custom Macro Calls for end users is easier to work.
- Change the way wound counts are processed to allow better token integration.
- Need to streamline Sheet Workers in the code to reduce overall attribute calls (looking for experience JS coders for some help here!).
@@ -2002,7 +1554,7 @@
});
});
- on('change:specialammomodifier change:equippedammo change:equippedrangedwep change:equippedmeleewep change:shield change:attack change:defence change:magicammobonus change:magicrangedweaponbonus change:magicmeleeweaponbonus change:armourattackpenalty change:armourdefencepenalty change:magicshield sheet:opened', function() {
+ on('clicked:update', function() {
getAttrs(['specialammomodifier','shield','attack','defence','magicammobonus','magicrangedweaponbonus','magicmeleeweaponbonus','armourattackpenalty','armourdefencepenalty','magicshield'], function(v) {
let atk = parseInt(v.attack)||0;
let def = parseInt(v.defence)||0;
@@ -2033,14 +1585,14 @@
});
});
- on('change:othermodifications change:armourpiercingselect change:masterbowmanselect change:penetratingshotmultiplier change:penetratingshotselect change:weaponskillselect change:shield change:expertparryselect change:guardcountered change:guardcurrent change:attack change:defence change:basemeleeattack change:basemeleedefence change:baserangedattack change:baserangeddefence change:evasion sheet:opened', function() {
+ on('clicked:update', function() {
getAttrs(['mattackmoda','mdefencemoda','rattackmoda','rdefencemoda','evasionmod','othermodifications','armourpiercingselect','armourpiercingmodifier','masterbowmanselect','masterbowmanmodifier','penetratingshotmultiplier','penetratingshotselect','weaponskillselect','weaponskillabrmodifier','guardabrmodifier','guarddamagemodifier','shield','expertparryselect','shieldsuccessvalue','shielddievalue','guardcountered','basemeleeattack','basemeleedefence','baserangedattack','baserangeddefence','evasion','guardcurrent'], function(value) {
const forms = {
Hawk: {mattackmoda: 1, mattackmodded: 1, mdefencemoda: -2, mdefencemodded: -2, rattackmoda: 1, rattackmodded: 1, rdefencemoda: -2, rdefencemodded: -2, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "If wielding a two-handed weapon: -1 Evasion and +1 Armour Penetration (please adjust manually)"},
Snake: {mattackmoda: 1, mattackmodded: 1, mdefencemoda: -3, mdefencemodded: -3, rattackmoda: 1, rattackmodded: 1, rdefencemoda: -3, rdefencemodded: -3, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "Critical Hits do +1 HP damage (please adjust manually)"},
Wolf: {mattackmoda: 2, mattackmodded: 2, mdefencemoda: -3, mdefencemodded: -3, rattackmoda: 2, rattackmodded: 2, rdefencemoda: -3, rdefencemodded: -3, evasionmod: -1, evasionmodded: -1, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "None"},
- Bear: {mattackmoda: -2, mattackmodded: -2, mdefencemoda: 1, mdefencemodded: 1, rattackmoda: -2, rattackmodded: -2, rdefencemoda: 1, rdefencemodded: 1, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "+1 additional Defence for each opponent beyond the first (Please enter in the Miscelaneous Modifiers Section manually)"},
+ Bear: {mattackmoda: -2, mattackmodded: -2, mdefencemoda: 1, mdefencemodded: 1, rattackmoda: -2, rattackmodded: -2, rdefencemoda: 1, rdefencemodded: 1, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "+1 additional Defence for each opponent beyond the first (Please enter in the Miscellaneous Modifiers Section manually)"},
Cat: {mattackmoda: -2, mattackmodded: -2, mdefencemoda: 1, mdefencemodded: 1, rattackmoda: -2, rattackmodded: -2, rdefencemoda: 1, rdefencemodded: 1, evasionmod: 1, evasionmodded: 1, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "If using a shield: an additional -1 Attack and Shields block on a roll of 1 on 1d4 (these adjustments have been made for you)"},
Crab: {mattackmoda: -2, mattackmodded: -2, mdefencemoda: 2, mdefencemodded: 2, rattackmoda: -2, rattackmodded: -2, rdefencemoda: 2, rdefencemodded: 2, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "None"},
Neutral: {mattackmoda: 0, mattackmodded: 0, mdefencemoda: 0, mdefencemodded: 0, rattackmoda: 0, rattackmodded: 0, rdefencemoda: 0, rdefencemodded: 0, evasionmod: 0, evasionmodded: 0, guarddamagemodifier: 0, guardabrmodifier: 0, othermodifications: "None"},
@@ -2166,7 +1718,7 @@
});
});
- on('change:miscattackmelee change:miscdefencemelee change:miscattackranged change:miscdefenceranged change:mainguacheactive change:berserktoranged change:attack change:basemeleeattack change:basemeleedefence change:baserangedattack change:baserangeddefence change:defence change:rattackmodded change:rdefencemodded change:mattackmodded change:mdefencemodded change:berserkneg change:preciseneg change:stillnessneg change:bloodrageselect change:nonprofselect change:deathvowselect sheet:opened', function() {
+ on('clicked:update', function() {
getAttrs(['mainguachedefence','mainguacheactive','berserktoranged','finalattack','finaldefence','basemeleedefence','basemeleeattack','baserangedattack','baserangeddefence','mdefencemodded','rattackmodded','rdefencemodded','mattackmodded','berserkneg','berserkpos','preciseneg','precisepos','stillnessneg','bloodrageselect','nonprofselect','deathvowselect','miscattackmelee','miscdefencemelee','miscattackranged','miscdefenceranged'], function(v) {
let bloodrage = parseInt(v.bloodrageselect) || 0;
let berserkappliestoranged = parseInt(v.berserktoranged)||0;
@@ -2260,7 +1812,7 @@
});
});
- on('change:miscabrmelee change:miscdamagemelee change:miscabrranged change:miscdamageranged change:meleeabrbonus change:magicmeleeweaponbonus change:weaponskillabrmodifier change:armourpiercingmodifier change:weaponskillabrmodifier change:guardabrmodifier change:guarddamagemodifier change:meleedmgbonus change:magicammobonus change:magicrangedweaponbonus change:specialammoabrmodifier change:specialammodmgmodifier change:penetratingshotabrmodifier change:armourpiercingmodifier change:masterbowmanmodifier change:bloodragedmgmod', function() {
+ on('clicked:update', function() {
getAttrs(['miscabrmelee','miscdamagemelee','miscabrranged','miscdamageranged','meleeabrbonus','magicmeleeweaponbonus','weaponskillabrmodifier','armourpiercingmodifier','weaponskillabrmodifier','guardabrmodifier','guarddamagemodifier','meleedmgbonus','magicammobonus','magicrangedweaponbonus','specialammoabrmodifier','specialammodmgmodifier','penetratingshotabrmodifier','armourpiercingmodifier','masterbowmanmodifier','bloodragedmgmod'], function(v) {
let meleeabrbonus = parseInt(v.meleeabrbonus)||0;
let magicmeleeweaponbonus = parseInt(v.magicmeleeweaponbonus)||0;
@@ -2295,7 +1847,7 @@
});
});
- on('change:finalstrength', function() {
+ on('clicked:update', function() {
getAttrs(['finalstrength','meleedmgbonus','meleeabrbonus'], function(value) {
let str = parseInt(value.finalstrength)||0;
@@ -2378,7 +1930,7 @@
});
});
- on('change:magicalattack change:magicaldefence change:miscmagicattack change:miscmagicdefence change:stillnesspos change:evasionmodded change:evasion change:miscevasion change:stealth change:perception change:miscstealth change:miscperception change:af change:magicafbonus change:miscaf change:strength change:reflexes change:intelligence change:psychictalent change:looks change:miscstrength change:miscreflexes change:miscintelligence change:miscpsychictalent change:misclooks sheet:opened', function(event) {
+ on('clicked:update', function(event) {
getAttrs(['magicalattack','magicaldefence','miscmagicattack','miscmagicdefence','finalevasion','finalstealth','finalperception','stillnesspos','evasionmodded','evasion','miscevasion','stealth','perception','miscstealth','miscperception','finalstrength','finalreflexes','finalintelligence','finalpsychictalent','finallooks','totalaf','af','magicafbonus','miscaf','strength','reflexes','intelligence','psychictalent','looks','miscstrength','miscreflexes','miscintelligence','miscpsychictalent','misclooks'], function(v) {
let af = parseInt(v.af);
let magicaf = parseInt(v.magicafbonus);
@@ -2434,30 +1986,41 @@
});
const woundValues = ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50"];
- woundValues.forEach(function(value) {
- on(`clicked:wound_${value}`, function() {
- setAttrs({
- wtwound: 0,
- wound: value
+ woundValues.forEach(function(value) {
+ on(`clicked:wound_${value}`, function() {
+ getAttrs(["wtwound","wound","maxhp"], function(v) {
+ let wnd = parseInt(value);
+ let wtwnd = 0;
+ let chp = parseInt(v.maxhp) - wnd - wtwnd;
+ setAttrs({
+ wtwound: wtwnd,
+ wound: wnd,
+ currenthp: chp,
+ currenthp_max: parseInt(v.maxhp)
+ });
});
- });
- });
+ });
+ });
const wtwoundValues = ["0","1","2","3"];
wtwoundValues.forEach(function(value) {
on(`clicked:wtwound_${value}`, function() {
- getAttrs(["maxhp","wound"], function(v) {
- let w1= parseInt(v.wound);
- let m1= parseInt(v.maxhp);
- if (w1 < m1)
- wou = m1,
- wtw = value;
- else
- wtw = value;
+ getAttrs(["wtwound","maxhp","wound"], function(v) {
+ let w1= parseInt(v.wound);
+ let m1= parseInt(v.maxhp);
+ if (w1 < m1) {
+ wou = m1,
+ wtw = value; }
+ else {
+ wtw = value,
+ wou = w1; }
+ let chp = parseInt(v.maxhp) - wou - wtw;
setAttrs({
wtwound: wtw,
- wound: wou
- });
+ wound: wou,
+ currenthp: chp,
+ currenthp_max: parseInt(v.maxhp)
+ });
});
});
});
@@ -2465,53 +2028,87 @@
const manausedValues = ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50"];
manausedValues.forEach(function(value) {
on(`clicked:manaused_${value}`, function() {
+ getAttrs(['maxmp'], function(v) {
+ let muse = parseInt(value);
+ let mcmp = parseInt(v.maxmp);
+ let cmp = (mcmp - muse);
setAttrs({
- manaused: value
- });
+ currentmp: cmp,
+ currentmp_max: mcmp,
+ manaused: value
});
});
+ });
+ });
const secmanausedValues = ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50"];
secmanausedValues.forEach(function(value) {
on(`clicked:secmanaused_${value}`, function() {
+ getAttrs(['twomaxmp'], function(v) {
+ let secmu = parseInt(value);
+ let twomcmp = parseInt(v.twomaxmp);
+ let twocmp = (twomcmp - secmu);
setAttrs({
- secmanaused: value
- });
+ currentmpelementtwo: twocmp,
+ currentmpelementtwo_max: twomcmp,
+ secmanaused: value
});
});
+ });
+ });
const termanausedValues = ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50"];
termanausedValues.forEach(function(value) {
on(`clicked:termanaused_${value}`, function() {
+ getAttrs(['threemaxmp'], function(v) {
+ let termu = parseInt(value);
+ let threemcmp = parseInt(v.threemaxmp);
+ let threecmp = (threemcmp - termu);
+
setAttrs({
- termanaused: value
- });
+ currentmpelementthree: threecmp,
+ currentmpelementthree_max: threemcmp,
+ termanaused: value
});
});
+ });
+ });
on("clicked:wound_reset", function() {
+ getAttrs(["maxhp"], function(v) {
setAttrs({
wound: 0,
- wtwound: 0
+ wtwound: 0,
+ currenthp: parseInt(v.maxhp)
});
});
+ });
on("clicked:mp_reset", function() {
+ getAttrs(["maxmp"], function(v) {
setAttrs({
- manaused: 0
+ manaused: 0,
+ currentmp: parseInt(v.maxmp)
});
});
+ });
on("clicked:secmp_reset", function() {
- setAttrs({
- secmanaused: 0
- });
+ getAttrs(["twomaxmp"], function(v) {
+ setAttrs({
+ secmanaused: 0,
+ currentmpelementtwo: parseInt(v.twomaxmp)
+ });
+ });
});
on("clicked:termp_reset", function() {
- setAttrs({
- termanaused: 0
- });
+ getAttrs(["threemaxmp"], function(v) {
+ setAttrs({
+ termanaused: 0,
+ currentmpelementthree: parseInt(v.threemaxmp)
+ });
+ });
});
on('change:rank sheet:opened', function() {
@@ -2540,4 +2137,4 @@
repeatingSum("totalencumbrance", "inventoryitems", ["inventoryqty", "encumbrancevalue"], "gc:1/150", "sf:1/150", "cp:1/150", "ammoweight:1/12", "totalmeleeweaponweight", "totalrangedweaponweight", "shield", "round");
});
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/Dragon Warriors/Hand.png b/Dragon Warriors/Hand.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f4b1846325f84dcb329c47ccbd25856bcb78aee
GIT binary patch
literal 13492
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