diff --git a/Official Savage Worlds/SavageWorldsCharSheet.css b/Official Savage Worlds/SavageWorldsCharSheet.css index 12138b9d38..4e2f26b88d 100644 --- a/Official Savage Worlds/SavageWorldsCharSheet.css +++ b/Official Savage Worlds/SavageWorldsCharSheet.css @@ -1408,6 +1408,10 @@ select.sheet-paceDietype { } /*---- Conditions ----*/ +.sheet-conditionsnew { + width: 100%; +} + .sheet-conditions { text-align: center; display:none; @@ -2076,13 +2080,14 @@ input.sheet-selectedLinkedAtt[value="(SMA)"] ~ .sheet-LASMA, width: 90%; } /*---- Wealth ----*/ + +/* --------- Old/Current -------------- .sheet-usewealth, .sheet-wealthmod, .sheet-usewealthmod, .sheet-usewealth:checked ~ .sheet-nonwealth, .sheet-usewealth:checked ~ .sheet-lankhmar, .sheet-usewealth:checked + .sheet-useLankhmar:checked + .sheet-lankhmar, -/*.sheet-lankhmar,*/ .sheet-money, .sheet-Credits { display: none; @@ -2093,12 +2098,8 @@ input.sheet-selectedLinkedAtt[value="(SMA)"] ~ .sheet-LASMA, .sheet-usewealth:checked + .sheet-showwealthwilddie, .sheet-usewealth:checked ~ .sheet-usewealthmod, .sheet-useLankhmar:checked + .sheet-lankhmar, -/*input[value="3"].sheet-usePieces ~ .sheet-lankhmar,*/ input[value="3"].sheet-usePieces ~ .sheet-money, input[value="0"].sheet-usePieces ~ .sheet-money, -/*input[value="1"].sheet-usePieces ~ .sheet-PofE,*/ -/*input[value="2"].sheet-usePieces ~ .sheet-Clams,*/ -/*input[value="5"].sheet-usePieces ~ .sheet-Livre,*/ input[value="4"].sheet-usePieces ~ .sheet-Credits { display: flex; } @@ -2110,6 +2111,65 @@ input[value="4"].sheet-usePieces ~ .sheet-Credits { input:not([value="3"]).sheet-usePieces ~ .sheet-derivebase > .sheet-moneyfield { width: 165px; } +------------------ End Old/Current Stuff */ + +/* New Money Stuff */ +.sheet-basederived.sheet-usewealth { + display: none; +} + +.sheet-basederived.sheet-usewealth .sheet-derivelabel.sheet-wealth { + flex-grow: 2; +} + +.sheet-money { + flex-grow: 2; +} + +.sheet-moneyLabels { + font-weight: bold; + font-size: 0.75em; + /*margin-top: 5px;*/ + margin-bottom: -3px; +} + +.sheet-usewealth:checked~.sheet-multiMoney { + display: none; +} + +.sheet-usewealth:checked~.sheet-basederived.sheet-usewealth { + display: flex; + width: 100%; +} + +.sheet-usewealth:not(:checked)+.sheet-useMultiCurrency[value="1"]+.sheet-moneyLabels, +.sheet-usewealth:not(:checked)+.sheet-useMultiCurrency[value="1"]~.sheet-nonwealth>.sheet-additionalCurrency { + display: none; +} + +.sheet-usewealth:not(:checked)+.sheet-useMultiCurrency[value="1"]~.sheet-nonwealth>.sheet-derivebase { + width: auto; + flex-grow: 2; +} + +.sheet-useMultiCurrency[value="2"]~.sheet-multiMoney>.sheet-money3, +.sheet-useMultiCurrency[value="2"]~.sheet-multiMoney>.sheet-money4, +.sheet-useMultiCurrency[value="3"]~.sheet-multiMoney>.sheet-money4 { + display: none; +} + +.sheet-usewealth:not(:checked)+.sheet-useMultiCurrency[value="1"]~.sheet-nonwealth>.sheet-derivebase>.sheet-moneyfield { + width: 100%; +} + +.sheet-wealthmod { + display: none; +} + +.sheet-useWealthMod:checked+.sheet-wealthmod { + display: inline-block; +} +/* End New Money Stuff */ .sheet-mischr { border: .45px dashed silver; @@ -3380,7 +3440,7 @@ div.sheet-shieldHalf { .charsheet .sheet-shieldTotalWeight { margin: 0 0 3px 100px; - width: 98%; + /*width: 98%;*/ text-align: left; } @@ -4078,8 +4138,49 @@ div.sheet-vehicleCrewBox { } .sheet-srmconfig { - height: 90px; + height: 150px; } +/* New Stuff for Multi-money */ +.sheet-usewealth, +.sheet-showwealthwilddie, +label.sheet-showwealthwilddie, +.sheet-srmItem.sheet-usewealthmod { + display: none; +} + +.sheet-srmItem .sheet-moneycountlabel { + font-weight: normal; + cursor: pointer; + width: auto; + font-size: 1em; + display: inline-block; +} + +.sheet-srmItem.sheet-multiMoney.sheet-money1, +.sheet-srmItem.sheet-multiMoney.sheet-money2, +.sheet-srmItem.sheet-multiMoney.sheet-money3, +.sheet-srmItem.sheet-multiMoney.sheet-money4 { + display: none; +} + +.sheet-usewealth:not(:checked)~.sheet-moneycount[value="2"]~.sheet-money1, +.sheet-usewealth:not(:checked)~.sheet-moneycount[value="2"]~.sheet-money2, +.sheet-usewealth:not(:checked)~.sheet-moneycount[value="3"]~.sheet-money1, +.sheet-usewealth:not(:checked)~.sheet-moneycount[value="3"]~.sheet-money2, +.sheet-usewealth:not(:checked)~.sheet-moneycount[value="3"]~.sheet-money3, +.sheet-usewealth:not(:checked)~.sheet-moneycount[value="4"]~.sheet-money1, +.sheet-usewealth:not(:checked)~.sheet-moneycount[value="4"]~.sheet-money2, +.sheet-usewealth:not(:checked)~.sheet-moneycount[value="4"]~.sheet-money3, +.sheet-usewealth:not(:checked)~.sheet-moneycount[value="4"]~.sheet-money4 { + display: flex; +} + +.sheet-usewealth:checked~.sheet-showwealthwilddie, +.sheet-usewealth:checked~label.sheet-showwealthwilddie, +.sheet-usewealth:checked~.sheet-srmItem.sheet-usewealthmod { + display: flex; +} +/* End New stuff for Multi-Money */ .sheet-injury { width: 100px; diff --git a/Official Savage Worlds/SavageWorldsCharSheet.html b/Official Savage Worlds/SavageWorldsCharSheet.html index a7c262c2af..5642d91763 100644 --- a/Official Savage Worlds/SavageWorldsCharSheet.html +++ b/Official Savage Worlds/SavageWorldsCharSheet.html @@ -1,4 +1,4 @@ - + @@ -200,7 +200,7 @@ /* ---- Begin Sheet Version Validation & Update ---- */ const sheetVersionPrefix = "Official Savage Worlds v"; - const sheetVersion = "1.00.11"; + const sheetVersion = "1.00.12"; const upgradeSheet = function(version, versionone, versiontwo, versionthree,characterName) { //version format 1.00.01 (string) @@ -259,6 +259,9 @@ if(versionthree < 0.11) { setattrvals["newcontent"] = "unread"; } + if(versionthree < 0.12) { + setattrvals["newcontent"] = "unread"; + } else { log("Upgrade",`Sheet already updgraded (${characterName})`,"lime"); } @@ -344,6 +347,7 @@ setWildDie(); }); + //Ranks and Advances Stuff on("change:repeating_edges:edge change:repeating_edges:tookat remove:repeating_edges", function(v) { log("Change in Edges","Look for Advances","yellow"); getSectionIDs("edges", function(idArray) { @@ -2028,6 +2032,29 @@ }); }); + const moneylist = ["money","gold","silver","electrum","copper"]; + const moneylabels = ["money","moneyone","moneytwo","moneythree","moneyfour"]; + moneylabels.forEach(moneyLabel => { + on("sheet:opened", function() { + log("Money","Setting up money","darkgreen"); + getAttrs([`${moneyLabel}name`], function(v) { + if (v[`${moneyLabel}name`] === "") { + //label is empty, so fill it + const labelIndex = moneylabels.lastIndexOf(moneyLabel); + const moneyType = moneylist[labelIndex]; + const typeOfMoney = getTranslationByKey(`${moneyType}`); + log("Money Type",typeOfMoney,"darkgreen"); + const setmoney = {}; + setmoney[`${moneyLabel}name`] = typeOfMoney; + setAttrs(setmoney); + } + else { + log("Money","Already set","darkgreen"); + } + }); + }); + }); + function setSkillDropdown(section, field, value, rowid) { let repsection = `repeating_${section}`; let setskill = {}; @@ -2740,17 +2767,18 @@ else {log("Is not worn","Don't need to carried...","darkblue");} }); + //Start Compendium Drop const resetCompendiumFields = function() { let setObj = {} setObj["CompendiumName"] = ""; setObj["CompendiumCategory"] = ""; setObj["CompendiumContent"] = ""; setObj["CompendiumData"] = ""; + log("Compendium Reset",JSON.stringify(setObj),r20color); setAttrs(setObj,{silent:true}); //return setObj; } - //Start Compendium Drop const cleanCompendiumData = function(jsonData) { const leftRegEx = /(\"\[)/g; const rightRegEx = /(\]\")/g; @@ -2784,6 +2812,30 @@ } //Set attribute field names...these are all in repeating sections unless otherwise noted + const specialAbiltyUpdates = { + "Construct":{ + "unshakemodtype":"Construct", + "unshakemod":"2", + "reducereason":"Construct", + "reducewoundsby":"1" + }, + "Elemental":{ + "reducereason":"Elemental", + "reducewoundsby":"1" + }, + "Undead":{ + "toughnessModReason":"Undead", + "tufnessMod":"2", + "unshakemodtype":"Undead", + "unshakemod":"2", + "reducereason":"Undead", + "reducewoundsby":"1" + }, + "Dense Body": { + "toughnessModReason":"Dense Body", + "tufnessMod":"2" + } + } const hindrancefields = ["hindrance","hindrancedescription","hindranceType"]; const edgefields = ["edge","edgedescription"]; const gearfields = ["item","itemWeight","description"]; @@ -2806,7 +2858,8 @@ if(jsonObj) { //create Keys for Vehicle Weapons for(let i = 0; i < vehicleweaponfields.length; i++) { - jsonObj[fieldArray[i]] = jsonObj[badFields[i]]; + // jsonObj[fieldArray[i]] = jsonObj[badFields[i]]; + typeof jsonObj[badFields[i]] !== "undefined" ? jsonObj[fieldArray[i]] = jsonObj[badFields[i]] : log("Bad Field","Doesn't exist...nothing to convert",r20color); } log("Ship Weapon JSON",JSON.stringify(jsonObj),r20color); return(jsonObj); @@ -2905,6 +2958,7 @@ else { log("Non-Repeating Fields","Fields Found",r20color); fields.forEach(field => { + log("JSON So Far",JSON.stringify(targetObj),r20color); typeof jsonObj[`${field}`] !== "undefined" ? targetObj[`${field}`] = jsonObj[`${field}`] : log(`${field}`,"Not Found",r20color); }); } @@ -2948,14 +3002,15 @@ repSection= "shields"; break; case "Vehicles": - //clear all fields in preparation for updated + //clear all character sheet vehicle fields in preparation for updated + //This is to avoid getting mixed data if there was another vehicle on the sheet already when the drop occurred. let resetObj = {}; vehiclefields.forEach(field => { resetObj[`${field}`] = ""; }); setAttrs(resetObj,{silent:true}); //Check if Vehicle Type is cared for; if not, will need to set it here. - typeof jsonObj["vehicletype"] !== "undefined" ? log("Vehicle Type","Should already be cared for",r20color) : setattrvalues["vehicletype"] = jsonObj.name; + typeof jsonObj["vehicletype"] !== "undefined" ? log("Vehicle Type","Should already be cared for",r20color) : typeof jsonObj.name !== "undefined" ? setattrvalues["vehicletype"] = jsonObj.name : typeof jsonObj["display_name"] !== "undefined" ? setattrvalues["vehicletype"] = jsonObj["display_name"] : log("Vehicle Name","Nothing defined...leave blank",r20color); //if not already set, show vehicle tab setattrvalues["vehicle"] = "on"; setattrvalues["vehiclewounds"] = "0"; @@ -2969,16 +3024,19 @@ break; } setattrvalues = getDropInfo(jsonObj,setattrvalues,repSection); + jsonObj.Category === "Vehicles" ? log("Returned","Made it back to compendiumDrop",r20color) : console.log("Ignore me"); if(jsonObj.Category === "Vehicles" && typeof jsonObj["data-Weapons"] !== "undefined") { //if this is a vehicle with weapons, then need to add more stuff to the JSON - log("Weapons Array","Found",r20color); - log("Weapons",JSON.stringify(jsonObj["data-Weapons"]),r20color); + log("Vehicle Weapons Array","Found",r20color); + log("Vehicle Weapons",JSON.stringify(jsonObj["data-Weapons"]),r20color); for (let weapon of jsonObj["data-Weapons"]) { - log("Import Weapon",weapon.data.weapon,r20color); + log("Import Vehicle Weapon",weapon.data.weapon,r20color); setattrvalues = getDropInfo(weapon.data,setattrvalues,"shipweapons"); } } + log("setattrvalues",JSON.stringify(setattrvalues),r20color); setAttrs(setattrvalues); + log("Values","Set...character sheet is updated",r20color); }); } @@ -3030,12 +3088,13 @@ //set Wild Card Status if(typeof monsterObj.is_npc !== "undefined") { //if is_npc = TRUE, then set as Wild Card - monsterObj.is_npc === "TRUE" ? monsterStats["is_npc"] = "0" : monster["is_npc"] = "1"; + monsterObj.is_npc === "TRUE" ? monsterStats["is_npc"] = "0" : monsterStats["is_npc"] = "1"; monsterObj.is_npc === "TRUE" ? isWildCard = true : log("Extra","isWildCard false",r20color); monsterObj.is_npc === "TRUE" ? woundsMax = 3 : log("Extra","Leave Wounds at 0",r20color); } //set Size - let monsterSize, tokenSize; + let monsterSize = "0"; + let tokenSize; typeof monsterObj.size !== "undefined" ? monsterSize = monsterObj.size : log("Size","Not found",r20color); monsterStats["size"] = monsterSize; //adjust woundsMax based on Size @@ -3094,7 +3153,9 @@ }) //Set the sheet Attributes log("Character Sheet","Setting Values",r20color); + log("To be set",JSON.stringify(monsterStats),r20color); setAttrs(monsterStats, function(){ + log("Inside","Made it inside the setAttrs",r20color); //Begin Token Settings... //Token size: 4-7 = 2, 8-11 = 3, 12+ = 4 const square_size = 70; // Default Roll20 square size (in px) @@ -3123,23 +3184,26 @@ typeof monsterObj.biography !== "undefined" ? finalCharacterDetails["physdescription"] = monsterObj.biography : log("Biography","Not found",r20color); //set Edges log("Edges","Check for Edges",r20color); - if (typeof monsterObj["data-Edges"] !== "undefined" && monsterObj["data-Edges"].length > 0) { - for (let edge of monsterObj["data-Edges"]) { - log("Import Edge",edge.name,r20color); - log("Monster Edge",JSON.stringify(edge),r20color); - //finalCharacterDetails = getEdgeInfo(monsterObj["data-Edges"],finalCharacterDetails); - finalCharacterDetails = getDropInfo(edge.data,finalCharacterDetails,"npc_Edge"); - // let repSectionID = generateRowID(); - // typeof edge.name !== "undefined" ? finalCharacterDetails[`repeating_edges_${repSectionID}_edge`] = edge.name : log("Edge Name","Not Found",r20color); - // typeof edge.description !== "undefined" ? finalCharacterDetails[`repeating_edges_${repSectionID}_edgedescription`] = edge.description : log("Edge Description","Not Found",r20color); - // finalCharacterDetails[`repeating_edges_${repSectionID}_tookat`] = "GM"; - // finalCharacterDetails[`repeating_edges_${repSectionID}_showEdgeDesc`] = "0"; - // finalCharacterDetails[`repeating_edges_${repSectionID}_whisperEdgeDeets`] = "/w gm "; - } - } + if (typeof monsterObj["data-Edges"] !== "undefined" && typeof monsterObj["data-Edges"] !== "string") { + if (monsterObj["data-Edges"].length > 0) { + for (let edge of monsterObj["data-Edges"]) { + log("Import Edge",edge.name,r20color); + log("Monster Edge",JSON.stringify(edge),r20color); + //finalCharacterDetails = getEdgeInfo(monsterObj["data-Edges"],finalCharacterDetails); + finalCharacterDetails = getDropInfo(edge.data,finalCharacterDetails,"npc_Edge"); + // let repSectionID = generateRowID(); + // typeof edge.name !== "undefined" ? finalCharacterDetails[`repeating_edges_${repSectionID}_edge`] = edge.name : log("Edge Name","Not Found",r20color); + // typeof edge.description !== "undefined" ? finalCharacterDetails[`repeating_edges_${repSectionID}_edgedescription`] = edge.description : log("Edge Description","Not Found",r20color); + // finalCharacterDetails[`repeating_edges_${repSectionID}_tookat`] = "GM"; + // finalCharacterDetails[`repeating_edges_${repSectionID}_showEdgeDesc`] = "0"; + // finalCharacterDetails[`repeating_edges_${repSectionID}_whisperEdgeDeets`] = "/w gm "; + } + } + } + //set Hindrances - if (typeof monsterObj["data-Hinderances"] !== "undefined" && monsterObj["data-Hinderances"].length > 0) { - for (let hindrance of monsterObj["data-Hinderances"]) { + if (typeof monsterObj["data-Hindrances"] !== "undefined" && monsterObj["data-Hindrances"].length > 0) { + for (let hindrance of monsterObj["data-Hindrances"]) { log("Import Hindrances",hindrance.hindrance,r20color); log("Monster Hindrance",JSON.stringify(hindrance),r20color); //finalCharacterDetails = getHindranceInfo(monsterObj["data-Hindrances"],) @@ -3156,6 +3220,12 @@ log("Edges & Hindrances","Write Edges and Hindrances to the Character",r20color); setAttrs(finalCharacterDetails); finalCharacterDetails = {}; + //Set Power Points if any + if (typeof monsterObj.PowerPoints !== "undefined") { + finalCharacterDetails["PowerPoints"] = monsterObj.PowerPoints; + finalCharacterDetails["PowerPoints_max"] = monsterObj.PowerPoints; + } + //Set Weapons //const weaponfields = ["weapon","range","rof","damageatt","dmgnumdice","dmgdietype","dmgbonusnum","weaponap","weaponminstrength","weaponweight"]; log("Weapons","Check for Weapons",r20color); @@ -3179,6 +3249,16 @@ } } + log("Powers","Check for Powers",r20color); + typeof monsterObj["data-Powers"] !== "undefined" ? log("Monster Power",JSON.stringify(monsterObj["data-Powers"]),r20color) : log("Monster Powers","Not Found",r20color); + if (typeof monsterObj["data-Powers"] !== "undefined" && monsterObj["data-Powers"].length > 0) { + log("Power Array","Found",r20color); + for (let power of monsterObj["data-Powers"]) { + log("Import Power",power.data.power,r20color); + finalCharacterDetails = getDropInfo(power.data,finalCharacterDetails,"spells"); + } + } + log("Armor","Check for Armor",r20color); typeof monsterObj["data-Armors"] !== "undefined" ? log("Monster Armor",JSON.stringify(monsterObj["data-Armors"]),r20color) : log("Monster Armor","Not Found",r20color); if (typeof monsterObj["data-Armors"] !== "undefined" && monsterObj["data-Armors"].length > 0) { @@ -3189,22 +3269,34 @@ } } + log("Shields","Check for Shields",r20color); + typeof monsterObj["data-Shields"] !== "undefined" ? log("Monster Shield",JSON.stringify(monsterObj["data-Armors"]),r20color) : log("Monster Armor","Not Found",r20color); + if (typeof monsterObj["data-Shields"] !== "undefined" && monsterObj["data-Shields"].length > 0) { + log("Shield Array","Found",r20color); + for (let shield of monsterObj["data-Shields"]) { + log("Import Shield",shield.data.ShieldType,r20color); + finalCharacterDetails = getDropInfo(shield.data,finalCharacterDetails,"shields"); + } + } + log("Weapons and Armor","Write weapons to the character sheet",r20color); setAttrs(finalCharacterDetails); //Set Special Abilities log("Special Abilities","Begin processing...",r20color); - log("Special Abilities",monsterObj["data-SpecialAbilities"],r20color); - log("Number of Special Abilities",monsterObj["data-SpecialAbilities"].length,r20color); + log("Special Abilities",typeof monsterObj["data-SpecialAbilities"],r20color); + //log("Number of Special Abilities",monsterObj["data-SpecialAbilities"].length,r20color); //if (typeof monsterObj["data-SpecialAbilities"] !== "undefined" && monsterObj["data-SpecialAbilities"].length > 0) { - if (typeof monsterObj["descriptionList"] !== "undefined" && monsterObj["data-SpecialAbilities"].length > 0) { + if (typeof monsterObj["descriptionList"] !== "undefined" && typeof monsterObj["data-SpecialAbilities"] !== "undefined" && monsterObj["data-SpecialAbilities"].length > 0) { finalCharacterDetails["showSpecAbilities"] = "1"; for (let compendiumSpecialAbility of monsterObj["data-SpecialAbilities"]) { log("Special Ability",compendiumSpecialAbility.name,r20color); let repSectionID = generateRowID(); - typeof compendiumSpecialAbility.name !== "undefined" ? finalCharacterDetails[`repeating_specialabilities_${repSectionID}_specialability`] = compendiumSpecialAbility.name : log("Special Ability Name","Not Found",r20color); + typeof compendiumSpecialAbility.name !== "undefined" ? finalCharacterDetails[`repeating_specialabilities_${repSectionID}_specialability`] = compendiumSpecialAbility.name.trim() : log("Special Ability Name","Not Found",r20color); typeof compendiumSpecialAbility.description !== "undefined" ? finalCharacterDetails[`repeating_specialabilities_${repSectionID}_specialabilitydescription`] = compendiumSpecialAbility.description : log("Special Ability Description","Not Found",r20color); finalCharacterDetails[`repeating_specialabilities_${repSectionID}_showSpecAbilityDesc`] = "0"; finalCharacterDetails[`repeating_specialabilities_${repSectionID}_whisperSpecAbilityDeets`] = "/w gm "; + //compendiumSpecialAbility.name.trim() === "Undead" ? finalCharacterDetails = {...finalCharacterDetails, ...specialAbiltyUpdates["Undead"]} : compendiumSpecialAbility.name.trim() === "Construct" ? finalCharacterDetails = {...finalCharacterDetails, ...specialAbiltyUpdates["Construct"]} : compendiumSpecialAbility.name.trim() === "Elemental" ? finalCharacterDetails = {...finalCharacterDetails, ...specialAbiltyUpdates["Elemental"]} : log("Special Ability","Nothing additional needed",r20color); + typeof specialAbiltyUpdates[`${compendiumSpecialAbility.name.trim()}`] ? finalCharacterDetails = {...finalCharacterDetails, ...specialAbiltyUpdates[`${compendiumSpecialAbility.name.trim()}`]} : log("Special Ability","Nothing additional needed",r20color); } log("Special Abilities","Finished Processing",r20color); } @@ -3216,14 +3308,13 @@ }); } - - on("change:CompendiumCategory", function(eventInfo) { log("Compendium Drop",eventInfo.newValue,"#E948C9"); + log("Compendium Change Source",eventInfo.sourceType,r20color); if (eventInfo.newValue !== "") { - let compendiumCategory = eventInfo.newValue; + let cCategory = eventInfo.newValue; let resetFields; - switch (compendiumCategory) { + switch (cCategory) { case "Edges": case "Hindrances": case "Powers": @@ -3232,15 +3323,16 @@ case "Vehicles": case "Gear": case "Shields": - compendiumDrop(compendiumCategory); + compendiumDrop(cCategory); break; case "Bestiary": compendiumBestiary(); break; default: - log(`Category: ${compendiumCategory}`,`Not recognized`,r20color); - resetFields = resetCompendiumFields(); - setAttrs(resetFields,{silent:true}); + log(`Category: ${cCategory}`,`Not recognized`,r20color); + //resetFields = resetCompendiumFields(); + //setAttrs(resetFields,{silent:true}); + resetCompendiumFields(); break; } } @@ -6316,6 +6408,61 @@
+ This release focuses on Minor Enhancements and Bug Fixes +
+