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 0000000000..6f4b184632
Binary files /dev/null and b/Dragon Warriors/Hand.png differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.18.40 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.18.40 am.png
deleted file mode 100644
index e7f18500e8..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.18.40 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.18.54 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.18.54 am.png
deleted file mode 100644
index d7046ffebb..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.18.54 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.05 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.05 am.png
deleted file mode 100644
index 9b7b2d7b76..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.05 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.13 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.13 am.png
deleted file mode 100644
index 66c8a7673e..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.13 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.22 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.22 am.png
deleted file mode 100644
index 757143431e..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.22 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.28 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.28 am.png
deleted file mode 100644
index d82fdeb4ef..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.28 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.37 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.37 am.png
deleted file mode 100644
index bd3668cc8c..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.37 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.56 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.56 am.png
deleted file mode 100644
index e4712825f6..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.56 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.36 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.36 am.png
deleted file mode 100644
index 336380a4c7..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.36 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.43 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.43 am.png
deleted file mode 100644
index 9dbf48e92e..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.43 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.49 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.49 am.png
deleted file mode 100644
index a3f16eebb1..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.49 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.57 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.57 am.png
deleted file mode 100644
index 17a8ab18f2..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.57 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.05 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.05 am.png
deleted file mode 100644
index 382d642408..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.05 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.12 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.12 am.png
deleted file mode 100644
index cba4c946b8..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.12 am.png and /dev/null differ
diff --git a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.29 am.png b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.29 am.png
deleted file mode 100644
index 8ca8f7847e..0000000000
Binary files a/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.29 am.png and /dev/null differ