diff --git a/Dragon Warriors/DWBow-removebg.png b/Dragon Warriors/DWBow-removebg.png new file mode 100644 index 0000000000..97af79297d Binary files /dev/null and b/Dragon Warriors/DWBow-removebg.png differ diff --git a/Dragon Warriors/DWSwordnobg.png b/Dragon Warriors/DWSwordnobg.png new file mode 100644 index 0000000000..3959f174b1 Binary files /dev/null and b/Dragon Warriors/DWSwordnobg.png differ diff --git a/Dragon Warriors/DW_Shieldnobg.png b/Dragon Warriors/DW_Shieldnobg.png new file mode 100644 index 0000000000..2472a865fd Binary files /dev/null and b/Dragon Warriors/DW_Shieldnobg.png differ diff --git a/Dragon Warriors/DW_skullnobg.png b/Dragon Warriors/DW_skullnobg.png new file mode 100644 index 0000000000..7912134bce Binary files /dev/null and b/Dragon Warriors/DW_skullnobg.png differ diff --git a/Dragon Warriors/DragWarsTest.js b/Dragon Warriors/DragWarsTest.js new file mode 100644 index 0000000000..1ab35ad35d --- /dev/null +++ b/Dragon Warriors/DragWarsTest.js @@ -0,0 +1,600 @@ +const buttonlist = ["character","inventory","combat","magic","skills","languages","biographical","documentation"]; +buttonlist.forEach(button => { + on(`clicked:${button}`, function() { + setAttrs({ + sheetTab: button + }); + }); +}); + +on('change:equippedammo change:equippedrangedwep change:equippedmeleewep change:shield change:attack change:defence change:magicammobonus change:magicrangedweaponbonus change:magicmeleeweaponbonus change:armourattackpenalty change:armourdefencepenalty change:magicshield change:miscattackmelee change:miscdefencemelee change:miscattackranged change:miscdefenceranged sheet:opened', function() { + getAttrs(['shield','attack','defence','magicammobonus','magicrangedweaponbonus','magicmeleeweaponbonus','armourattackpenalty','armourdefencepenalty','magicshield','miscattackmelee','miscdefencemelee','miscattackranged','miscdefenceranged'], function(v) { + let atk = parseInt(v.attack)||0; + let def = parseInt(v.defence)||0; + let ammo = parseInt(v.magicammobonus)||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) { + let shield = parseInt(v.magicshield)||0;} + else { + shield = 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 basemeleeatk = (atk + melee - armouratk + miscmeleea); + let basemeleedef = (def + melee - armourdef + shield + miscmeleed); + let baserangedatk = (atk + ranged + ammo - armouratk + miscrangeda); + let baserangeddef= (def - armourdef + shield + miscrangedd + shield); + setAttrs({ + baserangedattack: baserangedatk, + baserangeddefence: baserangeddef, + basemeleeattack: basemeleeatk, + basemeleedefence: basemeleedef + }); + }); +}); + +on('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(['berserktoranged','finalattack','finaldefence','basemeleedefence','basemeleeattack','baserangedattack','baserangeddefence','mdefencemodded','rattackmodded','rdefencemodded','mattackmodded','berserkneg','berserkpos','preciseneg','precisepos','stillnessneg','bloodrageselect','nonprofselect','deathvowselect'], function(v) { + let bloodrage = parseInt(v.bloodrageselect) || 0; + let berserkappliestoranged = parseInt(v.berserktoranged)||0; + + if (bloodrage === 1) { + bloodragemod = parseInt(v.basemeleedefence) || 0; + berserkattack = 0; + berserkdefence = 0; + mattackmod = parseInt(v.basemeleeattack)||0; + mdefencemod= parseInt(v.basemeleedefence)||0; + rattackmod = parseInt(v.baserangedattack)||0; + rdefencemod = parseInt(v.baserangeddefence)||0; + } + else { + bloodragemod = 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; + ;} + + let fmatk = (mattackmod + berserkattack - nonprofmod + deathvowmod + bloodragemod); + let fmdef = (mdefencemod - berserkdefence - precisedefence - stillnessdefence - bloodragemod); + + if (berserkappliestoranged === 1) { + fratk = (rattackmod + berserkattack - nonprofmod + deathvowmod + preciseattack)||0; + frdef = (rdefencemod - berserkdefence - precisedefence - stillnessdefence)||0; + } + else { + fratk = (rattackmod - nonprofmod + deathvowmod + preciseattack)||0; + frdef = (rdefencemod - berserkdefence - precisedefence - stillnessdefence)||0; + } + + setAttrs({ + finalmeleeattack: parseInt(fmatk)||0, + finalmeleedefence: parseInt(fmdef)||0, + finalrangedattack: parseInt(fratk)||0, + finalrangeddefence: parseInt(frdef)||0 + + }); + }); + }); + + on('change:repeating_meleeweapons:equippedmeleewep', 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:equippedrangedwep', 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:equippedammo', 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}_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 ammo = (values[`repeating_ammo_${id}_ammotype`]) || 0; + + if(id.toLowerCase() === playerclickedid) { + output.magicammobonus = checkbox ? magicbonus : 0; + output.ammotype = checkbox ? ammo : "None"; + + } else if(checkbox) { + output[`repeating_ammo_${id}_equippedammo`] = 0; + } + setAttrs(output); + }); + }); + }); + }); + + on('change:strength', function() { + getAttrs(['strength','meleedmgbonus','meleeabrbonus'], function(value) { + + let str = parseInt(value.strength)||0; + + if (str < 5) { + output.maxenc = 6; + output.meleeabrbonus = 0 || 0; + output.meleedmgbonus = 0 || 0; + } + else if (str < 8) { + output.maxenc = 8; + output.meleeabrbonus = 0 || 0; + output.meleedmgbonus = 0 || 0; + + } + else if (str < 12) { + output.maxenc = 10; + output.meleeabrbonus = 0 || 0; + output.meleedmgbonus = 0 || 0; + + } + else if (str < 15) { + output.maxenc = 12; + output.meleeabrbonus = 0 || 0; + output.meleedmgbonus = 0 || 0; + + } + else if (str < 18) { + output.maxenc = 14; + output.meleeabrbonus = 1 || 0; + output.meleedmgbonus = 1 || 0; + + } + else { + output.maxenc = 14; + output.meleeabrbonus = 1 || 0; + output.meleedmgbonus = 1 || 0; + + } + setAttrs(output); + }); + }); + + +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:strength 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(['weaponskillselect','strength','rangedabrbonus','rangeddmgbonus','meleedmgbonus','meleeabrbonus','shield','expertparryselect','shieldsuccessvalue','shielddievalue','guardcountered','basemeleeattack','basemeleedefence','baserangedattack','baserangeddefence','evasion','guardcurrent'], function(value) { + + const forms = { + Hawk: {mattackmodded: 1, mdefencemodded: -2, rattackmodded: 1, rdefencemodded: -2, evasionmodded: 0, meleeabrbonus: 0, meleedmgbonus: 0, rangedabrbonus: 0, rangeddmgbonus: 0, othermodifications: "If wielding a two-handed weapon: -1 Evasion and +1 Armour Penetration"}, + Snake: {mattackmodded: 1, mdefencemodded: -3, rattackmodded: 1, rdefencemodded: -3, evasionmodded: 0, meleeabrbonus: 0, meleedmgbonus: 0, rangedabrbonus: 0, rangeddmgbonus: 0, othermodifications: "Critical Hits do +1 HP damage"}, + Wolf: {mattackmodded: 2, mdefencemodded: -3, rattackmodded: 2, rdefencemodded: -3, evasionmodded: -1, meleeabrbonus: 0, meleedmgbonus: 0, rangedabrbonus: 0, rangeddmgbonus: 0, othermodifications: "None"}, + Bear: {mattackmodded: -2, mdefencemodded: 1, rattackmodded: -2, rdefencemodded: 1, evasionmodded: 0, meleeabrbonus: 0, meleedmgbonus: 0, rangedabrbonus: 0, rangeddmgbonus: 0, othermodifications: "+1 additional Defence for each opponent beyond the first (enter in the Miscelaneous Modifiers Section manually)"}, + Cat: {mattackmodded: -2, mdefencemodded: 1, rattackmodded: -2, rdefencemodded: 1, evasionmodded: 1, meleeabrbonus: 0, meleedmgbonus: 0, rangedabrbonus: 0, rangeddmgbonus: 0, othermodifications: "If using a shield: an additional -1 Attack and Shields block on a roll of 1 on 1d4"}, + Crab: {mattackmodded: -2, mdefencemodded: 2, rattackmodded: -2, rdefencemodded: 2, evasionmodded: 0, meleeabrbonus: 0, meleedmgbonus: 0, rangedabrbonus: 0, rangeddmgbonus: 0, othermodifications: "None"}, + Neutral: {mattackmodded: 0, mdefencemodded: 0, rattackmodded: 0, rdefencemodded: 0, evasionmodded: 0, meleeabrbonus: 0, meleedmgbonus: 0, rangedabrbonus: 0, rangeddmgbonus: 0, othermodifications: "None"}, + Defensive: {mattackmodded: -2, mdefencemodded: 1, rattackmodded: -2, rdefencemodded: 1, evasionmodded: 1, meleeabrbonus: -1, meleedmgbonus: -1, rangedabrbonus: -1, rangeddmgbonus: -1, othermodifications: "-1 Damage and -1 Armour Penetration"}, + Offensive: {mattackmodded: 1, mdefencemodded: -2, rattackmodded: 1, rdefencemodded: -2, evasionmodded: -1, meleeabrbonus: 0, meleedmgbonus: 0, rangedabrbonus: 0, rangeddmgbonus: 0, othermodifications: "None"} + + }; + + let guac = parseInt(value.guardcountered)||0; + let gua = value.guardcurrent || 'Neutral'; + const output = forms[gua] || forms.Neutral; + + 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 str = parseInt(value.strength)||0; + + if (gua === "Cat") { + shielddie = '1d4'; + shieldsuccess = 1; + } + else if (expertparry === 1) { + shielddie = '1d10'; + shieldsuccess = 2; + } + else { + shielddie = '1d6'; + shieldsuccess = 1; + } + + if (guac === 1 && gua !== "Neutral") { + if (gua === "Hawk" || gua === "Snake" || gua === "Wolf") { + output.mattackmodded += (parseInt(value.basemeleeattack)-2) || 0; + output.mdefencemodded += parseInt(value.basemeleedefence) || 0; + output.rattackmodded += (parseInt(value.baserangedattack)-2) || 0; + output.rdefencemodded += parseInt(value.baserangeddefence) || 0; + } + else if (gua === "cat" && shieldeq === 1) { + output.mattackmodded += (parseInt(value.basemeleeattack)-1) || 0; + output.mdefencemodded += (parseInt(value.basemeleedefence)-2) || 0; + output.rattackmodded += parseInt(value.baserangedattack)-1 || 0; + output.rdefencemodded += (parseInt(value.baserangeddefence)-2) || 0; + } + else { + output.mattackmodded += parseInt(value.basemeleeattack) || 0; + output.mdefencemodded += (parseInt(value.basemeleedefence)-2) || 0; + output.rattackmodded += parseInt(value.baserangedattack) || 0; + output.rdefencemodded += (parseInt(value.baserangeddefence)-2) || 0; + } + } + else if (gua === "Cat" && shieldeq === 1) { + output.mattackmodded += (parseInt(value.basemeleeattack)-1) || 0; + output.mdefencemodded += parseInt(value.basemeleedefence) || 0; + output.rattackmodded += (parseInt(value.baserangedattack)-1) || 0; + output.rdefencemodded += parseInt(value.baserangeddefence) || 0; + } + else { + output.mattackmodded += parseInt(value.basemeleeattack) || 0; + output.mdefencemodded += parseInt(value.basemeleedefence) || 0; + output.rattackmodded += parseInt(value.baserangedattack) || 0; + output.rdefencemodded += parseInt(value.baserangeddefence) || 0; + } + + output.evasionmodded += parseInt(value.evasion) || 0; + output.othermodifications = (value.othermodifications) || "None"; + output.shielddievalue = shielddie; + output.shieldsuccessvalue = shieldsuccess; + + setAttrs(output); + }); + }); + +on('change:mdefencemodded 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:rdefencemodded change:preciseneg change:stilnessneg', () => { + 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:guardstomeleeonly change:attack change:basemeleeattack change:basemeleedefence change:baserangedattack change:baserangeddefence change:defence change:mattackmodded change:mdefencemodded change:rattackmodded change:rdefencemodded change:berserkneg change:preciseneg change:stillnessneg change:bloodrageselect change:nonprofselect change:deathvowselect sheet:opened', function() { + getAttrs(['guardstomeleeonly','finalattack','finaldefence','basemeleedefence','basemeleeattack','baserangedattack','baserangeddefence','rdefencemodded','rattackmodded', 'mdefencemodded','mattackmodded','berserkneg','berserkpos','preciseneg','precisepos','stillnessneg','bloodrageselect','nonprofselect','deathvowselect'], function(v) { + let bloodrage = parseInt(v.bloodrageselect)||0; + let restrictedguards = parseInt(v.guardstomeleeonly)||0; + + if (restrictedguards === 1) { + rattackmod = parseInt(v.baserangedattack)||0; + rdefencemod = parseInt(v.baserangeddefence)||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; + } + else if (bloodrage === 1) { + bloodragemod = parseInt(v.basemeleedefence) || 0; + berserkattack = 0; + berserkdefence = 0; + mattackmod = parseInt(v.basemeleeattack)||0; + mdefencemod= parseInt(v.basemeleedefence)||0; + rattackmod = parseInt(v.baserangedattack)||0; + rdefencemod = parseInt(v.baserangeddefence)||0; + } + else { + mattackmod = parseInt(v.mattackmodded) || 0; + mdefencemod = parseInt(v.mdefencemodded) || 0; + rattackmod = parseInt(v.rattackmodded) || 0; + rdefencemod = parseInt(v.rdefencemodded) || 0; + bloodragemod = 0; + berserkattack = parseInt(v.berserkpos) || 0; + berserkdefence = parseInt(v.berserkneg) || 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; + } + + let fmatk = mattackmod + berserkattack - nonprofmod + deathvowmod + bloodragemod; + let fmdef = mdefencemod - berserkdefence - precisedefence - stillnessdefence - bloodragemod; + let fratk = rattackmod + berserkattack - nonprofmod + deathvowmod + preciseattack; + let frdef = rdefencemod - berserkdefence - precisedefence - stillnessdefence; + + setAttrs({ + finalmeleeattack: parseInt(fmatk)||0, + finalmeleedefence: parseInt(fmdef)||0, + finalrangedattack: parseInt(fratk)||0, + finalrangeddefence: parseInt(frdef)||0 + + }); + }); + }); + +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 + }); +}); + +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 remove:repeating_meleeweapons sheet:opened", function() { +repeatingSum("totalweapons", "weapons", "weaponweight"); +}); + +on("change:repeating_rangedweapons remove:repeating_rangedweapons sheet:opened", function() { + repeatingSum("totalweapons", "weapons", "weaponweight"); + }); + +on("change:repeating_ammo remove:repeating_ammo sheet:opened", function() { +repeatingSum("ammoweight", "ammo", "ammoqty"); +}); + +on("change:gc change:sf change:cp sheet:opened", function() { + getAttrs(["gc","sf", "cp"], function(value) { + let gc = parseFloat(value.GC)||0; + let sf = parseFloat(value.SF)||0; + let cp = parseFloat(value.CP)||0; + }); +}); + +on("change:repeating_inventoryitems remove:repeating_inventoryitems change:gc change:sf change:cp change:totalweapons change:ammoweight change:shield sheet:opened", function() { +repeatingSum("totalencumbrance", "inventoryitems", ["inventoryqty", "encumbrancevalue"], "gc:1/150", "sf:1/150", "cp:1/150", "ammoweight:1/12", "totalweapons", "shield", "round"); +}); diff --git a/Dragon Warriors/Dragon Warriors Revised.css b/Dragon Warriors/Dragon Warriors Revised.css index e85ef4d0a9..31057a33d8 100644 --- a/Dragon Warriors/Dragon Warriors Revised.css +++ b/Dragon Warriors/Dragon Warriors Revised.css @@ -2,139 +2,279 @@ * { box-sizing: border-box; + font-family: 'Almendra SC', serif; + font-size: medium; + padding: 1px; +} + +select { + width: auto; + background-color: #F5F5F5; +} + +textarea { + display: block; + width: 98%; + resize: vertical; + height: auto; + background-color: #F5F5F5; + margin-left: auto; + margin-right: auto; +} + +input.sheet-number { + background-color: #F5F5F5; +} + +input.sheet-text { + background-color: #F5F5F5; +} + +span { font-size: medium; } -img { width: 100%; } - -select -{ - width: 8em; - background-color: #F5F5F5; - font-family: 'Almendra SC', serif; +label { + font-size: medium; } -textarea -{ - width: 99%; - resize: none; - font-family: 'Almendra SC', serif; +label.sheet-subtext { + font-size: small; + align-self: flex-end; +} + +label.sheet-boxheading { + font-size: large; + font-weight: bold; + text-align: center; +} + +label.sheet-larger { + font-size: larger; + font-weight: bold; +} + +span.sheet-boxheading { + font-size: large; + font-weight: bold; + text-align: center; +} + +input.sheet-flexitextinput { + width: 98%; background-color: #F5F5F5; } -number -{ - font-family: 'Almendra SC', serif; - background-color: #F5F5F5; -} - -text -{ - width: 9em; - font-family: 'Almendra SC', serif; - background-color: #F5F5F5; -} - -input.sheet-fourshorttextinput -{ +input.sheet-fourshorttextinput { width: 4em; background-color: #F5F5F5; - font-family: 'Almendra SC', serif; } -input.sheet-eightmidtextinput -{ +input.sheet-eightmidtextinput { width: 8em; - font-family: 'Almendra SC', serif; background-color: #F5F5F5; } -input.sheet-sixteenlongtextinput -{ +input.sheet-twelvemidlongtextinput { width: 16em; - font-family: 'Almendra SC', serif; background-color: #F5F5F5; } -input.sheet-twelvemidlongtextinput -{ +input.sheet-sixteenlongtextinput { width: 16em; - font-family: 'Almendra SC', serif; background-color: #F5F5F5; } -.sheet-main { - font-family: 'Almendra SC', serif; - min-width: 850px; - border: 20px solid transparent; - padding: 1px; - border-image: url(https://i.imgur.com/XxBv5A2.png) 30 round; - border-image-outset: 1px; - background-color: #DCDCDC; +label.sheet-centerlabel { + text-align:center; } -/* Configure the button styling. This example makes it look like a radio. */ +label.sheet-justifylabel { + text-align:justify; +} + +button[type="roll"].sheet-d20:before{ + content: ' '; +} + +button[type="roll"].sheet-d20:hover{ + background-position: 0; +} +button[type="roll"].sheet-d20{ + background-image: url(https://i.imgur.com/JQC7jDf.jpg); + background-size: 26px 26px; + background-repeat: no-repeat; + width: 26px; + height: 26px; + border-style: none; + background-color: transparent; + margin-left: 5px; +} + +button.sheet-d20{ + background-image: url(https://i.imgur.com/JQC7jDf.jpg); + background-size: 30px 30px; + background-repeat: no-repeat; + width: 30px; + height: 30px; +} + +img.sheet-headerimage { + width: 100%; +} + +img.sheet-imgbackpack { + display: block; + margin-left: auto; + margin-right: auto; + width: 45%; +} + +img.sheet-imgchest { + display: block; + margin-left: auto; + margin-right: auto; + width: 50%; +} + +img.sheet-skullimg { + display: block; + margin-left: auto; + margin-right: auto; + width: 90%; +} + +img.sheet-elementimage { + display: block; + margin-left: auto; + margin-right: auto; + width: 50%; +} + +img.sheet-imgsword { + display: block; + margin-left: auto; + margin-right: auto; + width: 60%; +} + +img.sheet-imgbow { + display: block; + transform: rotate(120deg); + margin-left: auto; + margin-right: auto; + width: 30%; +} + +img.sheet-imgshield { + display: block; + margin-left: auto; + margin-right: auto; + width: 90%; +} + +img.sheet-riderimg { + display: block; + margin-left: auto; + margin-right: auto; + width: 50%; +} + +img.sheet-liftclaw { + display: block; + margin-left: auto; + margin-right: auto; + width: 45%; +} + +/* Configure the 'radio' button styling for health and magic point trackers. */ button.sheet-sdot { padding: 0; border: solid 1px #a8a8a8; margin-left: 6px; margin-bottom:3px; cursor: pointer; - width: 14px; - height: 14px; + width: 21px; + height: 21px; border-radius: 50%; display: flex; justify-content: center; align-items: center; } - button.sheet-sdot > span { - width: 6px; - height: 6px; + width: 20px; + height: 20px; border-radius: 50%; - background: buttontext; + background-image: url(https://i.imgur.com/ru2VnTB.png); + background-repeat: no-repeat; + background-size: 80%; + background-position: center center; +} +button.sheet-wtdot { + padding: 0; + border: solid 1px #a8a8a8; + margin-left: 6px; + margin-bottom:3px; + cursor: pointer; + width: 21px; + height: 21px; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; +} +button.sheet-wtdot > span { + width: 20px; + height: 20px; + border-radius: 50%; + background-image: url(https://i.imgur.com/ERkbC3Q.png); + background-repeat: no-repeat; + background-size: 80%; + background-position: center center; } - button.sheet-mdot { padding: 0; border: solid 1px #a8a8a8; margin-left: 6px; margin-bottom:3px; cursor: pointer; - width: 14px; - height: 14px; + width: 21px; + height: 21px; border-radius: 50%; display: flex; justify-content: center; align-items: center; } - button.sheet-mdot > span { - width: 6px; - height: 6px; + width: 20px; + height: 20px; border-radius: 50%; - background: buttontext; + background-image: url(https://i.imgur.com/yZp3cmw.png); + background-repeat: no-repeat; + background-size: 90%; + background-position: center; } - button.sheet-m2dot { padding: 0; border: solid 1px #a8a8a8; margin-left: 6px; margin-bottom:3px; cursor: pointer; - width: 14px; - height: 14px; + width: 21px; + height: 21px; border-radius: 50%; display: flex; justify-content: center; align-items: center; } - button.sheet-m2dot > span { - width: 6px; - height: 6px; + width: 20px; + height: 20px; border-radius: 50%; - background: buttontext; + background-image: url(https://i.imgur.com/yZp3cmw.png); + background-repeat: no-repeat; + background-size: 90%; + background-position: center; } button.sheet-m3dot { padding: 0; @@ -142,22 +282,23 @@ button.sheet-m3dot { margin-left: 6px; margin-bottom:3px; cursor: pointer; - width: 14px; - height: 14px; + width: 21px; + height: 21px; border-radius: 50%; display: flex; justify-content: center; align-items: center; } - button.sheet-m3dot > span { - width: 6px; - height: 6px; + width: 20px; + height: 20px; border-radius: 50%; - background: buttontext; + background-image: url(https://i.imgur.com/yZp3cmw.png); + background-repeat: no-repeat; + background-size: 90%; + background-position: center; } - -/* Hide the "checked" section of the radio if the hidden attribute value is greater than the button value */ +/* Configure the radio button arrays for health points and magic points */ input.sheet-sdot[value="0"] ~ button.sheet-gt-0 > span.sheet-checked { display: none; } @@ -250,8 +391,19 @@ button.sheet-m3dot > span { } input.sheet-sdot[value="30"] ~ button.sheet-gt-30 > span.sheet-checked { display: none; + } + input.sheet-wtdot[value="0"] ~ button.sheet-wt-0 > span.sheet-checked { + display: none; } - + input.sheet-wtdot[value="1"] ~ button.sheet-wt-1 > span.sheet-checked { + display: none; + } + input.sheet-wtdot[value="2"] ~ button.sheet-wt-2 > span.sheet-checked { + display: none; + } + input.sheet-wtdot[value="3"] ~ button.sheet-wt-3 > span.sheet-checked { + display: none; + } input.sheet-sbody[value="0"] ~ button.sheet-gt-0, input.sheet-sbody[value="1"] ~ button.sheet-gt-1, input.sheet-sbody[value="2"] ~ button.sheet-gt-2, @@ -285,7 +437,12 @@ button.sheet-m3dot > span { input.sheet-sbody[value="30"] ~ button.sheet-gt-30{ display: none; } - + input.sheet-wtbody[value="0"] ~ button.sheet-wt-0, + input.sheet-wtbody[value="1"] ~ button.sheet-wt-1, + input.sheet-wtbody[value="2"] ~ button.sheet-wt-2, + input.sheet-wtbody[value="3"] ~ button.sheet-wt-3{ + display: none; +} input.sheet-mdot[value="0"] ~ button.sheet-mt-0 > span.sheet-checked { display: none; } @@ -379,7 +536,6 @@ button.sheet-m3dot > span { input.sheet-mdot[value="30"] ~ button.sheet-mt-30 > span.sheet-checked { display: none; } - input.sheet-mbody[value="0"] ~ button.sheet-mt-0, input.sheet-mbody[value="1"] ~ button.sheet-mt-1, input.sheet-mbody[value="2"] ~ button.sheet-mt-2, @@ -413,7 +569,6 @@ button.sheet-m3dot > span { input.sheet-mbody[value="30"] ~ button.sheet-mt-30{ display: none; } - input.sheet-m2dot[value="0"] ~ button.sheet-mt2-0 > span.sheet-checked { display: none; } @@ -507,7 +662,6 @@ button.sheet-m3dot > span { input.sheet-m2dot[value="30"] ~ button.sheet-mt2-30 > span.sheet-checked { display: none; } - input.sheet-m2body[value="0"] ~ button.sheet-mt2-0, input.sheet-m2body[value="1"] ~ button.sheet-mt2-1, input.sheet-m2body[value="2"] ~ button.sheet-mt2-2, @@ -541,8 +695,6 @@ button.sheet-m3dot > span { input.sheet-m2body[value="30"] ~ button.sheet-mt2-30{ display: none; } - - input.sheet-m3dot[value="0"] ~ button.sheet-mt3-0 > span.sheet-checked { display: none; } @@ -636,7 +788,6 @@ button.sheet-m3dot > span { input.sheet-m3dot[value="30"] ~ button.sheet-mt3-30 > span.sheet-checked { display: none; } - input.sheet-m3body[value="0"] ~ button.sheet-mt3-0, input.sheet-m3body[value="1"] ~ button.sheet-mt3-1, input.sheet-m3body[value="2"] ~ button.sheet-mt3-2, @@ -669,322 +820,529 @@ button.sheet-m3dot > span { input.sheet-m3body[value="29"] ~ button.sheet-mt3-29, input.sheet-m3body[value="30"] ~ button.sheet-mt3-30{ display: none; - } - - - + } +.sheet-dots { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +/*configure the main frame of the sheet, including the header image*/ +.sheet-main { + min-width: 850px; + border: 20px solid transparent; + padding: 1px; + border-image: url(https://i.imgur.com/XxBv5A2.png) 30 round; + border-image-outset: 1px; + background-color: #DCDCDC; +} +/*Configure the tabbed sections of the sheet*/ /*Configure the tab buttons*/ .sheet-character, .sheet-skills, .sheet-inventory, +.sheet-combat, .sheet-magic, +.sheet-languages, .sheet-biographical, -.sheet-release, .sheet-documentation { display: none; } - - /* show the selected tab */ .sheet-tabstoggle[value="character"] ~ div.sheet-character, -.sheet-tabstoggle[value="skills"] ~ div.sheet-skills, .sheet-tabstoggle[value="inventory"] ~ div.sheet-inventory, +.sheet-tabstoggle[value="combat"] ~ div.sheet-combat, .sheet-tabstoggle[value="magic"] ~ div.sheet-magic, +.sheet-tabstoggle[value="skills"] ~ div.sheet-skills, +.sheet-tabstoggle[value="languages"] ~ div.sheet-languages, .sheet-tabstoggle[value="biographical"] ~ div.sheet-biographical, -.sheet-tabstoggle[value="release"] ~ div.sheet-release, .sheet-tabstoggle[value="documentation"] ~ div.sheet-documentation { display: grid; - font-family: 'Almendra SC', serif; grid-gap: 5px; } - .sheet-buttonbar { display: flex; flex-direction: row; flex-wrap: wrap; - justify-content: space-evenly; + justify-content: space-around; align-items: flex-start; width: auto; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; padding: 0.75%; margin-bottom: 5px; } - -/*define tab pages*/ +/*define main tab pages*/ .sheet-character { width: auto; height: auto; - font-family: 'Almendra SC', serif; - grid-template-columns: 28% 28% 40%; + grid-template-columns: 29% 34% 36%; grid-template-rows: auto; - grid-template-areas: "common common common common common" "attributes atkdefattributes weaponattributes weaponattributes weaponattributes" "attributes atkdefattributes weaponattributes weaponattributes weaponattributes" "attributes evaattribute weaponattributes weaponattributes weaponattributes" "attributes steperattributes weaponattributes weaponattributes weaponattributes" "attributes steperattributes weaponattributes weaponattributes weaponattributes" "hpattributes AFattributes weaponattributes weaponattributes weaponattributes" "hpattributes AFattributes weaponattributes weaponattributes weaponattributes" "hpattributes AFattributes weaponattributes weaponattributes weaponattributes" "hpattributes AFattributes possessionsattributes possessionsattributes possessionsattributes" "mpattributes mamdattributes possessionsattributes possessionsattributes possessionsattributes" "mpattributes moneyattributes possessionsattributes possessionsattributes possessionsattributes" "professionskillsattributes moneyattributes possessionsattributes possessionsattributes possessionsattributes" "professionskillsattributes moneyattributes possessionsattributes possessionsattributes possessionsattributes" "professionskillsattributes moneyattributes possessionsattributes possessionsattributes possessionsattributes" "professionskillsattributes moneyattributes possessionsattributes possessionsattributes possessionsattributes"; + grid-template-areas: "common common common" "attributes AFattributes finalcombatattributes" "atkdefattributes hpattributes finalcombatattributes" "evaattribute hpattributes finalcombatattributes" "mamdattributes mpattributes finalcombatattributes" "steperattributes mpattributes finalcombatattributes"; +} +.sheet-inventory { + width: auto; + height: auto; + grid-template-columns: auto; + grid-template-rows: auto; + grid-template-areas: "possessions possessions" "money armour" "encumbrance armour" "weapons weapons"; +} +.sheet-combat { + width: auto; + height: auto; + grid-template-columns: auto; + grid-template-rows: auto; + grid-template-areas: "finalcombatattributes finalcombatattributes" "combatguards classcombatabilities" "basemeleeattributes baserangedattributes"; +} +.sheet-magic { + width: auto; + height: auto; + grid-template-columns: 34% 64%; + grid-template-rows: auto; + grid-template-areas: "manabox spellbox"; } - .sheet-skills { width: auto; height: auto; - font-family: 'Almendra SC', serif; grid-template-columns: auto; grid-template-rows: auto; grid-template-areas: "professionskills" "secondaryskills"; } - -.sheet-inventory { - width: auto; +.sheet-languages { + width: auto; height: auto; - font-family: 'Almendra SC', serif; grid-template-columns: auto; grid-template-rows: auto; - grid-template-areas: "possessions possessions" "money armour" "weapons weapons" "encumbrance encumbrance"; + grid-template-areas: "modlang" "anclang"; } - -.sheet-magic { - width: auto; - height: auto; - font-family: 'Almendra SC', serif; - grid-template-columns: auto; - grid-template-rows: auto; - grid-template-areas: "manabox" "spellbox"; -} - .sheet-biographical { width: auto; height: auto; - font-family: 'Almendra SC', serif; grid-template-columns: auto; grid-template-rows: auto; - grid-template-areas: "basicbio" "modlang" "anclang"; + grid-template-areas: "basicbio"; } - -.sheet-release { - width: auto; - height: auto; - font-family: sans-serif; - text-align: left; - border-style: double; - border-width: 6px; -} - .sheet-documentation { width: auto; height: auto; - font-family: sans-serif; + font-family: 'arial', sans-serif !important; text-align: left; border-style: double; border-width: 6px; } -/*define pages*/ +/*define child elements*/ +/* columns */ +.sheet-col1 { + width: calc(66% - 12px); + display: inline-block; + margin-left: 15px; + vertical-align: top; +} +.sheet-col2 { + width: calc(33% - 12px); + display: inline-block; +} +.sheet-col3 { + width: calc(55% - 12px); + display: inline-block; + margin-left: auto; + margin-right: auto; +} +.sheet-col4 { + width: calc(45% - 12px); + display: inline-block; +} +.sheet-colequip { + width: calc(66% - 12px); + display: inline-block; +} +.sheet-colbackpack { + width: calc(33% - 12px); + display: inline-block; + vertical-align: top; +} +.sheet-shieldcol { + width: calc(40% - 12px); + display: inline-block; +} +.sheet-inputscol { + width: calc(25% - 12px); + display: inline-block; +} +.sheet-skullcol { + width: calc(35% - 12px); + display: inline-block; + vertical-align: top; +} +.sheet-encumbrancecol { + width: calc(65% - 12px); + display: inline-block; + margin-left: 15px; + vertical-align: top; +} +.sheet-liftclawcol { + width: calc(35% - 12px); + display: inline-block; +} + + +/* Child Elements on the Character Tab */ .sheet-common { grid-area: common; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } - .sheet-attributes { grid-area: attributes; - font-family: 'Almendra SC', serif; border-style: double; - border-width: 6px; + border-width: 6px; + justify-content: space-around; + display: grid; + grid-template-areas: "charhead charhead charhead" "char1 charscore1 button1" "char2 charscore2 button2" "char3 charscore3 button3" "char4 charscore4 button4" "char5 charscore5 button5"; +} +button.sheet-button1 { + grid-area: button1; +} +button.sheet-button2 { + grid-area: button2; +} +button.sheet-button3 { + grid-area: button3; +} +button.sheet-button4 { + grid-area: button4; +} +button.sheet-button5 { + grid-area: button5; +} +div.sheet-char1 { + grid-area: char1; +} +div.sheet-char2 { + grid-area: char2; +} +div.sheet-char3 { + grid-area: char3; +} +div.sheet-char4 { + grid-area: char4; +} +div.sheet-char5 { + grid-area: char5; +} +div.sheet-charscore1 { + grid-area: charscore1; +} +div.sheet-charscore2 { + grid-area: charscore2; +} +div.sheet-charscore3 { + grid-area: charscore3; +} +div.sheet-charscore4 { + grid-area: charscore4; +} +div.sheet-charscore5 { + grid-area: charscore5; +} +label.sheet-charheading { + grid-area: charhead; } .sheet-atkdefattributes { grid-area: atkdefattributes; - font-family: 'Almendra SC', serif; border-style: double; - border-width: 6px; + border-width: 6px; + justify-content: space-around; + display: grid; + grid-template-areas: "cfheading cfheading . " "cf1 cfa . " "cf2 cfd . "; +} +div.sheet-cf1 { + grid-area: cf1; +} +div.sheet-cf2 { + grid-area: cf2; +} +div.sheet-cfa { + grid-area: cfa; +} +div.sheet-cfd { + grid-area: cfd; +} +label.sheet-cfheading { + grid-area: cfheading; } .sheet-evaattribute { grid-area: evaattribute; - font-family: 'Almendra SC', serif; border-style: double; - border-width: 6px; + border-width: 6px; + justify-content: space-around; + display: grid; + grid-template-areas: "dodgehead dodgehead . " "dodge evade . "; } - -.sheet-steperattributes { - grid-area: steperattributes; - font-family: 'Almendra SC', serif; - border-style: double; - border-width: 6px; +div.sheet-dodge { + grid-area: dodge; +} +div.sheet-evade { + grid-area: evade; +} +label.sheet-dodgeheading { + grid-area: dodgehead; } .sheet-mamdattributes { grid-area: mamdattributes; - font-family: 'Almendra SC', serif; + border-style: double; + border-width: 6px; + text-align: justify; + text-justify: inter-word; + justify-content: space-around; + display: grid; + grid-template-areas: "mcfheading mcfheading . " "mcf1 mcfma button1" "mcf2 mcfmd . "; +} +label.sheet-mcfheading { + grid-area: mcfheading; +} +div.sheet-mcf1 { + grid-area: mcf1; +} +div.sheet-mcf2 { + grid-area: mcf2; +} +div.sheet-mcfma { + grid-area: mcfma; +} +div.sheet-mcfmd { + grid-area: mcfmd; +} + +.sheet-steperattributes { + grid-area: steperattributes; border-style: double; - border-width: 6px; + border-width: 6px; + justify-content: space-between; + display: grid; + grid-template-areas: "steperheading steperheading . " "steper1 stealth . " "steper2 percep button1"; +} +label.sheet-steperheading { + grid-area: steperheading; +} +div.sheet-steper1 { + grid-area: steper1; +} +div.sheet-steper2 { + grid-area: steper2; +} +div.sheet-stealth { + grid-area: stealth; +} +div.sheet-percep { + grid-area: percep; } .sheet-hpattributes { grid-area: hpattributes; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } .sheet-AFattributes { grid-area: AFattributes; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } .sheet-mpattributes { grid-area: mpattributes; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } - -.sheet-weaponattributes { - grid-area: weaponattributes; - font-family: 'Almendra SC', serif; - border-style: double; - border-width: 6px; +/*define which magic point elements should be shown, based on profession*/ +div.sheet-mp { + display: none; } -.sheet-professionskillsattributes { - grid-area: professionskillsattributes; - font-family: 'Almendra SC', serif; - border-style: double; - border-width: 6px; +input.sheet-profession-toggle[value="Knight"] ~ div.sheet-martialhidden, +input.sheet-profession-toggle[value="Barbarian"] ~ div.sheet-martialhidden, +input.sheet-profession-toggle[value="Assassin"] ~ div.sheet-nomagic, +input.sheet-profession-toggle[value="Hunter"] ~ div.sheet-martialhidden, +input.sheet-profession-toggle[value="Knave"] ~ div.sheet-nomagic, +input.sheet-profession-toggle[value="Priest"] ~ div.sheet-nomagic, +input.sheet-profession-toggle[value="Sorcerer"] ~ div.sheet-mpattributeshidden, +input.sheet-profession-toggle[value="Mystic"] ~ div.sheet-mpattributeshidden, +input.sheet-profession-toggle[value="Elementalist"] ~ div.sheet-mpattributeshidden, +input.sheet-profession-toggle[value="Warlock"] ~ div.sheet-mpattributeshidden, +input.sheet-profession-toggle[value="Demonologist"] ~ div.sheet-mpattributeshidden { + display: grid; } - -.sheet-possessionsattributes { - grid-area: possessionsattributes; - font-family: 'Almendra SC', serif; - border-style: double; - border-width: 6px; +div.sheet-frontmp { + display: none; } - -.sheet-moneyattributes { - grid-area: moneyattributes; - font-family: 'Almendra SC', serif; - border-style: double; - border-width: 6px; +input.sheet-profession-toggle[value="Elementalist"] ~ div.sheet-standardmp, +input.sheet-profession-toggle[value="Elementalist"] ~ div.sheet-elementalistmp, +input.sheet-profession-toggle[value="Sorcerer"] ~ div.sheet-standardmp, +input.sheet-profession-toggle[value="Mystic"] ~ div.sheet-mysticmp, +input.sheet-profession-toggle[value="Warlock"] ~ div.sheet-standardmp, +input.sheet-profession-toggle[value="Demonologist"] ~ div.sheet-standardmp { + display: grid; } .sheet-professionskills { grid-area: professionskills; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } .sheet-secondaryskillssec { grid-area: secondaryskills; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } +/*define equiment tab children*/ .sheet-possessions { grid-area: possessions; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } .sheet-money { grid-area: money; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } .sheet-armour { grid-area: armour; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } .sheet-weapons { grid-area: weapons; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } .sheet-encumbrance { grid-area: encumbrance; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } +/*define Biography tab children*/ .sheet-basicbio { grid-area: basicbio; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } - +/*define Languages tab children*/ .sheet-modlang { - grid-area: modlang; - font-family: 'Almendra SC', serif; + grid-area: modlang; border-style: double; border-width: 6px; } - .sheet-anclang { grid-area: anclang; - font-family: 'Almendra SC', serif; border-style: double; border-width: 6px; } - +/*define Magic tab children*/ +.sheet-manabox { + grid-area: manabox; + border-style: double; + border-width: 6px; +} +.sheet-spellbox { + grid-area: spellbox; + border-style: double; + border-width: 6px; +} +/*define which elements should be shown, based on profession*/ div.sheet-mana { - display: none; + display: none; } - -input.sheet-profession-toggle[value="3"] ~ div.sheet-sorcerermana, -input.sheet-profession-toggle[value="4"] ~ div.sheet-mysticmana, -input.sheet-profession-toggle[value="5"] ~ div.sheet-elementalistmana, -input.sheet-profession-toggle[value="6"] ~ div.sheet-warlockmana, -input.sheet-profession-toggle[value="11"] ~ div.sheet-demonologistmana { - display: block; - font-family: 'Almendra SC', serif; - border-style: double; - border-width: 6px; +input.sheet-profession-toggle[value="Sorcerer"] ~ div.sheet-standardmana, +input.sheet-profession-toggle[value="Mystic"] ~ div.sheet-mysticmana, +input.sheet-profession-toggle[value="Elementalist"] ~ div.sheet-elementalistattributes, +input.sheet-profession-toggle[value="Elementalist"] ~ div.sheet-standardmana, +input.sheet-profession-toggle[value="Elementalist"] ~ div.sheet-elementalistmana, +input.sheet-profession-toggle[value="Warlock"] ~ div.sheet-standardmana, +input.sheet-profession-toggle[value="Demonologist"] ~ div.sheet-standardmana { + display: grid; } - div.sheet-spells { - display: none; + display: none; } - -input.sheet-profession-toggle[value="3"] ~ div.sheet-list, -input.sheet-profession-toggle[value="4"] ~ div.sheet-list, -input.sheet-profession-toggle[value="5"] ~ div.sheet-list, -input.sheet-profession-toggle[value="6"] ~ div.sheet-list, -input.sheet-profession-toggle[value="11"] ~ div.sheet-list { - display: block; - font-family: 'Almendra SC', serif; +input.sheet-profession-toggle[value="Sorcerer"] ~ div.sheet-list, +input.sheet-profession-toggle[value="Mystic"] ~ div.sheet-list, +input.sheet-profession-toggle[value="Elementalist"] ~ div.sheet-list, +input.sheet-profession-toggle[value="Warlock"] ~ div.sheet-list, +input.sheet-profession-toggle[value="Demonologist"] ~ div.sheet-list { + display: grid; +} +/* define combat tab children*/ +div.sheet-combatguards { + grid-area: combatguards; border-style: double; border-width: 6px; } +div.sheet-basemeleeattributes { + grid-area: basemeleeattributes; + border-style: double; + border-width: 6px; +} +div.sheet-baserangedattributes { + grid-area: baserangedattributes; + border-style: double; + border-width: 6px; +} +div.sheet-classcombatabilities { + grid-area: classcombatabilities; + border-style: double; + border-width: 6px; +} +div.sheet-finalcombatattributes { + grid-area: finalcombatattributes; + border-style: double; + border-width: 6px; +} -div.sheet-frontmp { +/*define which martial elements be show, based on Profession*/ +div.sheet-melee { display: none; } - -input.sheet-profession-toggle[value="3"] ~ div.sheet-sorcmp, -input.sheet-profession-toggle[value="4"] ~ div.sheet-mysticmp, -input.sheet-profession-toggle[value="5"] ~ div.sheet-elementalistmp, -input.sheet-profession-toggle[value="6"] ~ div.sheet-warlockmp, -input.sheet-profession-toggle[value="11"] ~ div.sheet-demonologistmp { - display: block; - font-family: 'Almendra SC', serif; +input.sheet-profession-toggle[value="Knight"] ~ div.sheet-advancedguards, +input.sheet-profession-toggle[value="Knight"] ~ div.sheet-knightmelee, +input.sheet-profession-toggle[value="Barbarian"] ~ div.sheet-advancedguards, +input.sheet-profession-toggle[value="Barbarian"] ~ div.sheet-barbarianmelee, +input.sheet-profession-toggle[value="Assassin"] ~ div.sheet-basicguards, +input.sheet-profession-toggle[value="Assassin"] ~ div.sheet-assassinmelee, +input.sheet-profession-toggle[value="Hunter"] ~ div.sheet-advancedguards, +input.sheet-profession-toggle[value="Hunter"] ~ div.sheet-huntermelee, +input.sheet-profession-toggle[value="Knave"] ~ div.sheet-basicguards, +input.sheet-profession-toggle[value="Knave"] ~ div.sheet-nomelee, +input.sheet-profession-toggle[value="Priest"] ~ div.sheet-basicguards, +input.sheet-profession-toggle[value="Priest"] ~ div.sheet-nomelee, +input.sheet-profession-toggle[value="Sorcerer"] ~ div.sheet-basicguards, +input.sheet-profession-toggle[value="Sorcerer"] ~ div.sheet-nomelee, +input.sheet-profession-toggle[value="Mystic"] ~ div.sheet-basicguards, +input.sheet-profession-toggle[value="Mystic"] ~ div.sheet-nomelee, +input.sheet-profession-toggle[value="Elementalist"] ~ div.sheet-basicguards, +input.sheet-profession-toggle[value="Elementalist"] ~ div.sheet-nomelee, +input.sheet-profession-toggle[value="Warlock"] ~ div.sheet-basicguards, +input.sheet-profession-toggle[value="Warlock"] ~ div.sheet-warlockmelee, +input.sheet-profession-toggle[value="Demonologist"] ~ div.sheet-basicguards, +input.sheet-profession-toggle[value="Demonologist"] ~ div.sheet-nomelee { + display: grid; } -.sheet-dots { - display: flex; - flex-wrap: wrap; - justify-content: left; - font-family: 'Almendra SC', serif; +/*hide shield values if the shield is not equipped*/ +div.sheet-shieldhidden{ + display: none; +} +input.sheet-shield-toggle[value="1"] ~ div.sheet-shieldhidden { + display: grid; } \ No newline at end of file diff --git a/Dragon Warriors/Dragon Warriors Revised.html b/Dragon Warriors/Dragon Warriors Revised.html index 44fd080eb2..c0d938c16b 100644 --- a/Dragon Warriors/Dragon Warriors Revised.html +++ b/Dragon Warriors/Dragon Warriors Revised.html @@ -1,1479 +1,1151 @@
- + Dragon Warriors
- + + + -
+
- + Rank + Experience
- - - - - + +
Strength
+
Reflexes
+
Intelligence
+
Psychic Talent
+
Looks
- - + +
Attack
+
Defence
- -
-
- - + +
Base Evasion
- - + +
Magical Attack
+
Magical Defence
+
+
+ +
Stealth
+
Perception
- + +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +
- - - -
-
- -
- - ABR - Dmg -
-
-
- -
- -
- -
- -
-
-
- - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - -
- + + +
+
+ Shield +
+
+ + + + +
+
-
- -
- -
+
+ + + + Equipped Weapon:
+ ABR
+ Damage
+
+ Sword +
+ + + + Equipped Weapon: +
+ Ammunition Type: +
+ ABR +
+ Damage +
+
+
+
+ Range:
Short
Medium
Long

+
+
+ Bow +
+
+ + Final Melee Attack +
+ Final Melee Defence +
+

+ + Final Ranged Attack +
+ Final Ranged Defence +
-
- - - - - -
-
- -
-
- -
- Skill - Description

-
-
-
- -
- Skill - Level

- Description

-
+ +
+ +
+ No Magic Attributes +
+
+ + + Guard Taken + + + + + + + +
+
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+
- +
- +
- Item - Location - Quantity - Encumbrance + Item + Location + Quantity + Encumbrance Value
- - +
+ +
+ + + +
+
+ Coin Chest +
+
- - - - - - + + Type +
+ Armour Factor           Magic Bonus +

+ + Attack Penalty +
+ Defence Penalty +
+ Stealth Penalty +


+
+
+ Helmed Skull +
+
+ Shield Equipped? +
+ Magic Bonus +
+ Shield Die +
+
+ +
+ +
+ +
+
+
- -
- - Armour Bypass Roll - Damage - Short - Medium - Long - + +
+ + Magic Bonus + Armour Bypass Roll + Damage + Equipped +
- - + +
+ + Magic Bonus + Armour Bypass Roll + Damage + Equipped +
+ Short + Medium + Long + +
+
- Ammunition Type - Quantity + Ammunition Type + Quantity + Magic Bonus + Special Attack Modifier + Special ABR Modifier + Special Damage Modifier + Equipped +
- - +
+ +
+ + +
+
+ Encumbrance +
+
+
+
+ +
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+ +
+ + + + + + +
+
+ + + +
+ + + +
+ + +
+ +
+ +
+
+
+ +
+ + Berserk Defence Penalty: Attack Bonus +
+ + +
+ +
+
+ + Activated abilities apply without regard to rules restrictions, for example Weaponskill applies a bonus to all Armour Bypass rolls while active. Manual control is required. + Activate Expert Parry
+ Activate Weaponskill
+
Activate Main Guache: Inactive Defensive Offensive

+ Activate Master Bowman +
+
+ + Activated abilities apply without regard to rules restrictions, the Non-Proficiency penalty applies all rolls while active. Manual control is required. + Activate Non-Proficient Weapon +
+
+ + Activated abilities apply without regard to rules restrictions. Armour Piercing applies a bonus to all Armour Bypass rolls while active. Manual control is required. + Activate Armour Peircing + Activate Deathvow +
+
+ + Activated abilities apply without regard to rules restrictions, for example Penetrating Shot applies a bonus to all Ranged Armour Bypass rolls while active. Manual control is required. + Precise Shot Defence Penalty Attack Bonus +
+ Stillness Defence Penalty Stealth Bonus
+
Penetrating Shot Skill Level: None Once Twice

+ Activate Penetrating Shot +
+
+ No Magic Attributes +
+ +
+
+ + + Final Melee Attack + Final Melee Defence + +
+ + Final Ranged Attack + Final Ranged Defence + +

+ Equipped Melee Weapon: + ABR + Damage + +
+ + Shield Equipped?       + Shield Die + + + +

+ + Equipped Ranged Weapon: + ABR + Damage + +
+ + Equipped Ammunition Type: +
+ Special Ammunition Modifiers: Attack + Armour Bypass + Damage +
+
+ + Ranges: Short + Medium + Long + +
+
-
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
-
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- -
- -
- Name - Range - Duration

- Description

+ Name + Range + Duration
+ Description
- Name - Range - Duration

- Description

+ Name + Range + Duration
+ Description
- Name - Range - Duration

- Description

+ Name + Range + Duration
+ Description
- Name - Range - Duration

- Description

+ Name + Range + Duration
+ Description
- Name - Range - Duration

- Description

+ Name + Range + Duration
+ Description
- Name - Range - Duration

- Description

+ Name + Range + Duration
+ Description
- Name - Range - Duration

- Description

+ Name + Range + Duration
+ Description
- Name - Range - Duration

- Description

+ Name + Range + Duration
+ Description
- Name - Range - Duration

- Description

+ Name + Range + Duration
+ Description
- Name - Range - Duration

- Description

+ Name + Range + Duration
+ Description
-
-
- - - - - - - - - Description

- Biography

+
+
+ +
+ Skill + Description
+
-
- +
+ +
+ Skill + Level
+ Description
+
+
+
+ +
+
+
Language Fluency Level - Literate? + Literate? Script - + @@ -1526,14 +1198,14 @@ Fluency Level - Literate? + Literate? Script
-
- -
- - - -

Missing Languages added

-

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

-

- -

None known, let me know if you see one so I can squash it!

- Features still to add: -

Change input fields font to Almendra

-

Sheet roll templates for attribute checks and other basic functions

+
+
+
+ + + + + + + + + + + +
-

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

+ 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.

+ + + Total Overhaul Update

+ + 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.
+
+ + + 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
+
+ + None known, let me know if you see one so I can squash it!
+
+
\ No newline at end of file + }); + \ No newline at end of file diff --git a/Dragon Warriors/ElementsNew.png b/Dragon Warriors/ElementsNew.png new file mode 100644 index 0000000000..dececedba0 Binary files /dev/null and b/Dragon Warriors/ElementsNew.png differ diff --git a/Dragon Warriors/Example - clean.png b/Dragon Warriors/Example - clean.png index ae9667ee16..d842684742 100644 Binary files a/Dragon Warriors/Example - clean.png and b/Dragon Warriors/Example - clean.png differ diff --git a/Dragon Warriors/Example - filled.png b/Dragon Warriors/Example - filled.png deleted file mode 100644 index a36af8d3b2..0000000000 Binary files a/Dragon Warriors/Example - filled.png and /dev/null differ diff --git a/Dragon Warriors/HorseRiderSilhouetteNoBG.png b/Dragon Warriors/HorseRiderSilhouetteNoBG.png new file mode 100644 index 0000000000..93984a4743 Binary files /dev/null and b/Dragon Warriors/HorseRiderSilhouetteNoBG.png differ diff --git a/Dragon Warriors/bloodyslash-removebg.png b/Dragon Warriors/bloodyslash-removebg.png new file mode 100644 index 0000000000..587c132544 Binary files /dev/null and b/Dragon Warriors/bloodyslash-removebg.png differ diff --git a/Dragon Warriors/bloodyslash.jpg b/Dragon Warriors/bloodyslash.jpg new file mode 100644 index 0000000000..019eb6dad7 Binary files /dev/null and b/Dragon Warriors/bloodyslash.jpg differ diff --git a/Dragon Warriors/d20.jpg b/Dragon Warriors/d20.jpg new file mode 100644 index 0000000000..23b13dfd6a Binary files /dev/null and b/Dragon Warriors/d20.jpg differ diff --git a/Dragon Warriors/dw_encumbrancenobg.png b/Dragon Warriors/dw_encumbrancenobg.png new file mode 100644 index 0000000000..ea6d2cd92f Binary files /dev/null and b/Dragon Warriors/dw_encumbrancenobg.png differ diff --git a/Dragon Warriors/magic_effect_1693680.png b/Dragon Warriors/magic_effect_1693680.png new file mode 100644 index 0000000000..09778e390a Binary files /dev/null and b/Dragon Warriors/magic_effect_1693680.png differ diff --git a/Dragon Warriors/playersguide chest.jpg b/Dragon Warriors/playersguide chest.jpg new file mode 100644 index 0000000000..53c628afab Binary files /dev/null and b/Dragon Warriors/playersguide chest.jpg 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 new file mode 100644 index 0000000000..e7f18500e8 Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.18.40 am.png 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 new file mode 100644 index 0000000000..d7046ffebb Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.18.54 am.png 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 new file mode 100644 index 0000000000..9b7b2d7b76 Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.05 am.png 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 new file mode 100644 index 0000000000..66c8a7673e Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.13 am.png 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 new file mode 100644 index 0000000000..757143431e Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.22 am.png 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 new file mode 100644 index 0000000000..d82fdeb4ef Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.28 am.png 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 new file mode 100644 index 0000000000..bd3668cc8c Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.37 am.png 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 new file mode 100644 index 0000000000..e4712825f6 Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.19.56 am.png 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 new file mode 100644 index 0000000000..336380a4c7 Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.36 am.png 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 new file mode 100644 index 0000000000..9dbf48e92e Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.43 am.png 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 new file mode 100644 index 0000000000..a3f16eebb1 Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.49 am.png 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 new file mode 100644 index 0000000000..17a8ab18f2 Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.20.57 am.png 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 new file mode 100644 index 0000000000..382d642408 Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.05 am.png 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 new file mode 100644 index 0000000000..cba4c946b8 Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.12 am.png 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 new file mode 100644 index 0000000000..8ca8f7847e Binary files /dev/null and b/Dragon Warriors/untitled folder/Screen Shot 2020-09-30 at 10.21.29 am.png differ