diff --git a/Shadowrun5th/Shadowrun5th.css b/Shadowrun5th/Shadowrun5th.css
index e94a08fe51..3165da4971 100644
--- a/Shadowrun5th/Shadowrun5th.css
+++ b/Shadowrun5th/Shadowrun5th.css
@@ -606,6 +606,7 @@ div.spiritstable .technomancycheckbox:not(:checked) ~ div.technobound
display:block;
}
+.statinputwrapper .statinput,
.statinput{
width:2em;
background-color:#444444;
diff --git a/Shadowrun5th/Shadowrun5th.html b/Shadowrun5th/Shadowrun5th.html
index 3eb897af16..f75ed1d31b 100644
--- a/Shadowrun5th/Shadowrun5th.html
+++ b/Shadowrun5th/Shadowrun5th.html
@@ -13386,670 +13386,6 @@ Click again to switch to Manual and Remote">
diff --git a/Shadowrun5th/js/import.js b/Shadowrun5th/js/import.js
deleted file mode 100644
index 8bdeb96b90..0000000000
--- a/Shadowrun5th/js/import.js
+++ /dev/null
@@ -1,1028 +0,0 @@
-function clearSheet(attributes, experimental) {
- console.log("Removing old data");
- getSectionIDs("repeating_contacts", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_contacts_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_posqualities", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_posqualities_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_negqualities", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_negqualities_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_powers", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_powers_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_ware", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_ware_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_martial", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_martial_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_spells", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_spells_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_rituals", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_rituals_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_alchemy", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_alchemy_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_critterpowers", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_critterpowers_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_initiation", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_initiation_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_programs", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_programs_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_equipment", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_equipment_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_knowledge", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_knowledge_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_vehicles", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_vehicles_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_drones", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_drones_"+idarray[i]);
- }
- });
- getSectionIDs("repeating_armors", function(idarray) {
- for(var i=0; i < idarray.length; i++) {
- removeRepeatingRow("repeating_armors_"+idarray[i]);
- }
- });
-
- //removing repeating weapons
- getSectionIDs("repeating_weapons", function(idarray) {
- for(var j=0; j < idarray.length; j++) {
- removeRepeatingRow("repeating_weapons_"+idarray[j]);
- }
- });
-
- //removing ammo
- getSectionIDs("repeating_ammotype1", function(idarray) {
- for(var j=0; j < idarray.length; j++) {
- removeRepeatingRow("repeating_ammotype1_"+idarray[j]);
- }
- });
- getSectionIDs("repeating_ammotype2", function(idarray) {
- for(var j=0; j < idarray.length; j++) {
- removeRepeatingRow("repeating_ammotype2_"+idarray[j]);
- }
- });
- getSectionIDs("repeating_ammotype3", function(idarray) {
- for(var j=0; j < idarray.length; j++) {
- removeRepeatingRow("repeating_ammotype3_"+idarray[j]);
- }
- });
- getSectionIDs("repeating_ammotype4", function(idarray) {
- for(var j=0; j < idarray.length; j++) {
- removeRepeatingRow("repeating_ammotype4_"+idarray[j]);
- }
- });
- getSectionIDs("repeating_ammotype5", function(idarray) {
- for(var j=0; j < idarray.length; j++) {
- removeRepeatingRow("repeating_ammotype5_"+idarray[j]);
- }
- });
- getSectionIDs("repeating_ammotype6", function(idarray) {
- for(var j=0; j < idarray.length; j++) {
- removeRepeatingRow("repeating_ammotype6_"+idarray[j]);
- }
- });
- getSectionIDs("repeating_ammotype7", function(idarray) {
- for(var j=0; j < idarray.length; j++) {
- removeRepeatingRow("repeating_ammotype7_"+idarray[j]);
- }
- });
- getSectionIDs("repeating_ammotype8", function(idarray) {
- for(var j=0; j < idarray.length; j++) {
- removeRepeatingRow("repeating_ammotype8_"+idarray[j]);
- }
- });
-}
-
-
-on("change:chummercheckbox", async function(){
- let text = await asw.getAttrs(["chummertext","chummercheckbox", "experimental", "nightly"]);
- if(text.chummercheckbox=="on"){
- var goodcode = true;
- var error="";
- var attributes={};
- try{
- var chummerfile=JSON.parse(text.chummertext);
- }catch(err){
- goodcode = false;
- error = err;
- }
- if(goodcode){
-
- try{
- console.log("Character meta info");
- if(chummerfile.characters.character.alias != null)
- attributes.character_name = chummerfile.characters.character.alias;
-
- if(chummerfile.characters.character.metatype != null)
- attributes.metatype=chummerfile.characters.character.metatype;
-
- if(chummerfile.characters.character.sex != null)
- attributes.sex=chummerfile.characters.character.sex;
-
- if(chummerfile.characters.character.age != null)
- attributes.age=chummerfile.characters.character.age;
-
- if(chummerfile.characters.character.height != null)
- attributes.height=chummerfile.characters.character.height;
-
- if(chummerfile.characters.character.weight != null)
- attributes.weight=chummerfile.characters.character.weight;
- if(chummerfile.characters.character.playername != null)
- attributes.player=chummerfile.characters.character.playername;
- if(chummerfile.characters.character.description != null)
- attributes.description=chummerfile.characters.character.description;
- if(chummerfile.characters.character.background != null)
- attributes.background=chummerfile.characters.character.background;
- if(chummerfile.characters.character.notes != null)
- attributes.notes=chummerfile.characters.character.notes;
- if(chummerfile.characters.character.gamenotes != null)
- attributes.generalnotes=chummerfile.characters.character.gamenotes;
- if(chummerfile.characters.character.karma != null)
- attributes.karma=chummerfile.characters.character.karma;
- if(chummerfile.characters.character.totalkarma != null)
- attributes.karmacareer=chummerfile.characters.character.totalkarma;
- if(chummerfile.characters.character.initbonus != null){
- attributes.initiativebonus=chummerfile.characters.character.initbonus;
- attributes.astralinitiativebonus=chummerfile.characters.character.initbonus;
- attributes.matrixinitiativebonus=chummerfile.characters.character.initbonus;
- }
- if(chummerfile.characters.character.initdice != null)
- attributes.initiativedice=chummerfile.characters.character.initdice;
- if(chummerfile.characters.character.astralinitdice != null)
- attributes.astralinitiativedice=chummerfile.characters.character.astralinitdice;
- if(chummerfile.characters.character.cmthresholdoffset != null)
- attributes.woundadditive=chummerfile.characters.character.cmthresholdoffset;
- if(chummerfile.characters.character.cmthreshold != null)
- attributes.woundmultiplikative=chummerfile.characters.character.cmthreshold;
- if(chummerfile.characters.character.cmoverflow != null)
- attributes.overflowmod=chummerfile.characters.character.cmoverflow-chummerfile.characters.character.attributes[1].attribute[0].total- 1;
- if(chummerfile.characters.character.physicalcm != null)
- attributes.physicaltrackmod=chummerfile.characters.character.physicalcm-Math.ceil(chummerfile.characters.character.attributes[1].attribute[0].total/2)- 8;
- if(chummerfile.characters.character.stuncm != null)
- attributes.stuntrackmod=chummerfile.characters.character.stuncm-Math.ceil(chummerfile.characters.character.attributes[1].attribute[7].total/2)- 8;
- if(chummerfile.characters.character.totalstreetcred != null)
- attributes.streetcred=chummerfile.characters.character.totalstreetcred;
- if(chummerfile.characters.character.totalnotoriety != null)
- attributes.notoriety=chummerfile.characters.character.totalnotoriety;
- if(chummerfile.characters.character.totalpublicawareness != null)
- attributes.pawareness=chummerfile.characters.character.totalpublicawareness;
- if(chummerfile.characters.character.nuyen != null)
- attributes.nuyen_total=chummerfile.characters.character.nuyen;
- if(chummerfile.characters.character.magician == "True"){
- // HeroLab 'chummer' export uses drainattribute property and a list, this is a workaround for that
- try{
- attributes.drainattribute="@{"+chummerfile.characters.character.tradition.drainattributes.match(/[A-Z]+/g)[1].toLowerCase()+"_total}";
- } catch(err)
- {
- attributes.drainattribute="@{"+chummerfile.characters.character.tradition.drainattribute.attr[1]+"_total}";
- }
- }
- }catch(err){
- goodcode=false;
- error="Error with Character Info " +err
- }
- try{
- console.log("Importing Attributes");
- var attributesChummer = chummerfile.characters.character.attributes[1].attribute;
- attributes.bod_base=attributesChummer.find(a => a.name_english === "BOD").base;
- attributes.agi_base=attributesChummer.find(a => a.name_english === "AGI").base;
- attributes.rea_base=attributesChummer.find(a => a.name_english === "REA").base;
- attributes.str_base=attributesChummer.find(a => a.name_english === "STR").base;
- attributes.cha_base=attributesChummer.find(a => a.name_english === "CHA").base;
- attributes.int_base=attributesChummer.find(a => a.name_english === "INT").base;
- attributes.log_base=attributesChummer.find(a => a.name_english === "LOG").base;
- attributes.wil_base=attributesChummer.find(a => a.name_english === "WIL").base;
- attributes.edg_total=attributesChummer.find(a => a.name_english === "EDG").base;
- if(chummerfile.characters.character.technomancer==="True"){
- attributes.mag_base=attributesChummer.find(a => a.name_english === "RES").total;
- attributes.istechnomancer = 1;
- }
- else if(chummerfile.characters.character.magician==="True" || chummerfile.characters.character.adept==="True"){
- attributes.mag_base=attributesChummer.find(a => a.name_english === "MAG").total;
- attributes.istechnomancer = 0;
- }
- else {
- attributes.mag_base = 0;
- attributes.istechnomancer = 0;
- }
- attributes.bod_aug=attributesChummer.find(a => a.name_english === "BOD").total-attributesChummer.find(a => a.name_english === "BOD").base;
- attributes.agi_aug=attributesChummer.find(a => a.name_english === "AGI").total-attributesChummer.find(a => a.name_english === "AGI").base;
- attributes.rea_aug=attributesChummer.find(a => a.name_english === "REA").total-attributesChummer.find(a => a.name_english === "REA").base;
- attributes.str_aug=attributesChummer.find(a => a.name_english === "STR").total-attributesChummer.find(a => a.name_english === "STR").base;
- attributes.cha_aug=attributesChummer.find(a => a.name_english === "CHA").total-attributesChummer.find(a => a.name_english === "CHA").base;
- attributes.int_aug=attributesChummer.find(a => a.name_english === "INT").total-attributesChummer.find(a => a.name_english === "INT").base;
- attributes.log_aug=attributesChummer.find(a => a.name_english === "LOG").total-attributesChummer.find(a => a.name_english === "LOG").base;
- attributes.wil_aug=attributesChummer.find(a => a.name_english === "WIL").total-attributesChummer.find(a => a.name_english === "WIL").base;
- }catch(err){
- goodcode=false;
- error= error + "\n" + "Error with Attributes " +err
- }
- try{
- if(chummerfile.characters.character.powers!=null){
- console.log("Importing Adept Powers");
- if(chummerfile.characters.character.powers.power.length>1){
- for(var i=0;i1){
- for(var i=0;i1){
- for(var i=0;i1){
- for(var j=0;j1){
- for(var j=0;j1){
- for(var i=0;i1){
- for(var i=0;i1){
- for(var i=0;i 1){
- for(var i=1; i1){
- for(var i=0;i1){
- for(var i=0;i 0){
- name += " " + chummerfile.characters.character.gears.gear[i].rating;
- }
- attributes["repeating_equipment_"+newrowid+"_equipmentname"]=name;
- attributes["repeating_equipment_"+newrowid+"_equipmentnumber"]=chummerfile.characters.character.gears.gear[i].qty ? chummerfile.characters.character.gears.gear[i].qty : 1;
- if(chummerfile.characters.character.gears.gear[i].extra != null) {
- attributes["repeating_equipment_"+newrowid+"_equipmentdescription"]=chummerfile.characters.character.gears.gear[i].extra;
- }
- attributes["repeating_equipment_"+newrowid+"_equipmentnotes"]="";
- if(chummerfile.characters.character.gears.gear[i].children!=null){
- if(chummerfile.characters.character.gears.gear[i].children.gear.length>1){
- for(var j=0; j 0){
- note += " " + chummerfile.characters.character.gears.gear[i].children.gear[j].rating;
- }
- if(chummerfile.characters.character.gears.gear[i].children.gear[j].extra != null) {
- note += " " + chummerfile.characters.character.gears.gear[i].children.gear[j].extra;
- }
- attributes["repeating_equipment_"+newrowid+"_equipmentnotes"]+= note +"\n";
- }
- }
- }else{
- if(chummerfile.characters.character.gears.gear[i].children.gear.category_english=="Common Programs"||chummerfile.characters.character.gears.gear[i].children.gear.category_english=="Hacking Programs"){
- var newrowidb=generateRowID();
- attributes["repeating_programs_"+newrowidb+"_programname"]=chummerfile.characters.character.gears.gear[i].children.gear.name;
- }else{
- note = chummerfile.characters.character.gears.gear[i].children.gear.name;
- if(chummerfile.characters.character.gears.gear[i].children.gear.rating > 0){
- note += " " + chummerfile.characters.character.gears.gear[i].children.gear.rating;
- }
- if(chummerfile.characters.character.gears.gear[i].children.gear.extra != null) {
- note += " " + chummerfile.characters.character.gears.gear[i].children.gear.extra;
- }
- attributes["repeating_equipment_"+newrowid+"_equipmentnotes"]+= note +"\n";
- }
- }
- }
- }
- }
- }
- }
- }catch(err){
- goodcode=false;
- error= error + "\n" + "Error with Gear " +err
- }
-
- try {
- //import ai programs
- if(chummerfile.characters.character.aiprograms != null){
- console.log("Importing ai programs");
- if(chummerfile.characters.character.aiprograms.aiprogram.length > 1){
- for(var i=0; i < chummerfile.characters.character.aiprograms.aiprogram.length; i++){
- var newrowid=generateRowID();
- attributes["repeating_programs_"+newrowid+"_programname"]=chummerfile.characters.character.aiprograms.aiprogram[i].name;
- }
- }
- else {
- var newrowid=generateRowID();
- attributes["repeating_programs_"+newrowid+"_programname"]=chummerfile.characters.character.aiprograms.aiprogram.name;
- }
- }
- }catch(err){
- goodcode=false;
- error= error + "\n" + "Error with AI programs " +err
- }
-
- try{
- if(chummerfile.characters.character.vehicles != null){
- console.log("Importing vehicles");
- if(chummerfile.characters.character.vehicles.vehicle.length > 1){
- let vehicles = chummerfile.characters.character.vehicles.vehicle.filter( vehicle => vehicle.seats > 0);
- for(var i=0; i < vehicles.length; i++){
- importSingleVehicle(vehicles[i], attributes);
- }
- } else {
- if(chummerfile.characters.character.vehicles.vehicle.seats > 0) {
- importSingleVehicle(chummerfile.characters.character.vehicles.vehicle, attributes);
- }
- }
- }
- }catch(err){
- goodcode=false;
- error= error + "\n" + "Error with Vehicles: " + err;
- }
- try{
- if(chummerfile.characters.character.vehicles != null){
- console.log("Importing drones");
- if(chummerfile.characters.character.vehicles.vehicle.length > 1){
- let drones = chummerfile.characters.character.vehicles.vehicle.filter( vehicle => vehicle.seats == 0);
- for(var i=0; i < drones.length; i++){
- importSingleDrone(drones[i], attributes);
- }
- } else {
- if(chummerfile.characters.character.vehicles.vehicle.seats == 0) {
- importSingleDrone(chummerfile.characters.character.vehicles.vehicle, attributes);
- }
- }
- }
- }catch(err){
- goodcode=false;
- error= error + "\n" + "Error with Vehicles: " + err;
- }
- var index=[];
- for(var i=1;i<73;i++)
- {
- var name='skillname'+i;
- index[i-1]=name;
- }
- getAttrs(index, function(names){
- var exotics=73;
- var alchemy=0;
- var spellcasting=0;
- var ritual=0;
- try{
- console.log("Importing Skills");
- if(chummerfile.characters.character.skills.skill[0].name_english !== undefined) {
- for(var i=0;i0){
- attributes["repeating_knowledge_"+newrowid+"_knowledgerating"]=chummerfile.characters.character.skills.skill[i].rating;
- attributes["repeating_knowledge_"+newrowid+"_knowledgebonus"]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod;
- }else{
- attributes["repeating_knowledge_"+newrowid+"_knowledgerating"]="-1";
- attributes["repeating_knowledge_"+newrowid+"_knowledgebonus"]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod+1;
- }
- if(chummerfile.characters.character.skills.skill[i].skillspecializations!=null) {
- attributes["repeating_knowledge_"+newrowid+"_knowledgespec"]=chummerfile.characters.character.skills.skill[i].skillspecializations.skillspecialization.name;
- }
- else
- attributes["repeating_knowledge_"+newrowid+"_knowledgespec"]="none";
- }
-
- if(chummerfile.characters.character.skills.skill[i].exotic=="True"){
- attributes["skillname"+exotics]=chummerfile.characters.character.skills.skill[i].name_english;
- if(chummerfile.characters.character.skills.skill[i].rating>0){
- attributes["skillbonus"+exotics]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod;
- attributes["skillrating"+exotics]=chummerfile.characters.character.skills.skill[i].rating;
- }else{
- attributes["skillrating"+exotics]="-1";
- attributes["skillbonus"+exotics]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod+1;
- }
- attributes["skillattr"+exotics]="@{"+chummerfile.characters.character.skills.skill[i].attribute.toLowerCase();
- if(chummerfile.characters.character.skills.skill[i].skillspecializations!=null)
- attributes["skillspec"+exotics]=chummerfile.characters.character.skills.skill[i].skillspecializations.skillspecialization.name;
- else
- attributes["skillspec"+exotics]="none";
- exotics++;
- }
-
- for(var j=1;j<73;j++){
- var compname='skillname'+j;
- if((names[compname]==chummerfile.characters.character.skills.skill[i].name_english)||(chummerfile.characters.character.skills.skill[i].name_english=="Locksmith"&&j==29)||(chummerfile.characters.character.skills.skill[i].name_english=="Pilot Ground Craft"&&j==55)){
- attributes["skillattr"+j]="@{"+chummerfile.characters.character.skills.skill[i].attribute.toLowerCase();
- if(chummerfile.characters.character.skills.skill[i].rating>0){
- attributes["skillrating"+j]=chummerfile.characters.character.skills.skill[i].rating;
- attributes["skillbonus"+j]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod;
- }else{
- attributes["skillrating"+j]="-1";
- attributes["skillbonus"+j]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod+1;
- }
- if(chummerfile.characters.character.skills.skill[i].skillspecializations != null && chummerfile.characters.character.skills.skill[i].skillspecializations.skillspecialization.name != null)
- attributes["skillspec"+j]=chummerfile.characters.character.skills.skill[i].skillspecializations.skillspecialization.name;
- else
- attributes["skillspec"+j]="none";
- if(chummerfile.characters.character.weapons!=null){
- if(chummerfile.characters.character.weapons.weapon.length>1){
- for(var h=1;h0){
- attributes["repeating_knowledge_"+newrowid+"_knowledgerating"]=chummerfile.characters.character.skills.skill[i].rating;
- attributes["repeating_knowledge_"+newrowid+"_knowledgebonus"]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod;
- }else{
- attributes["repeating_knowledge_"+newrowid+"_knowledgerating"]="-1";
- attributes["repeating_knowledge_"+newrowid+"_knowledgebonus"]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod+1;
- }
- if(chummerfile.characters.character.skills.skill[i].skillspecializations!=null)
- attributes["repeating_knowledge_"+newrowid+"_knowledgespec"]=chummerfile.characters.character.skills.skill[i].skillspecializations.skillspecialization.name;
- else
- attributes["repeating_knowledge_"+newrowid+"_knowledgespec"]="none";
- }
- if(chummerfile.characters.character.skills.skill[i].exotic=="True"){
- attributes["skillname"+exotics]=chummerfile.characters.character.skills.skill[i].name;
- if(chummerfile.characters.character.skills.skill[i].rating>0){
- attributes["skillbonus"+exotics]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod;
- attributes["skillrating"+exotics]=chummerfile.characters.character.skills.skill[i].rating;
- }else{
- attributes["skillrating"+exotics]="-1";
- attributes["skillbonus"+exotics]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod+1;
- }
- attributes["skillattr"+exotics]="@{"+chummerfile.characters.character.skills.skill[i].attribute.toLowerCase();
- if(chummerfile.characters.character.skills.skill[i].skillspecializations!=null)
- attributes["skillspec"+exotics]=chummerfile.characters.character.skills.skill[i].skillspecializations.skillspecialization.name;
- else
- attributes["skillspec"+exotics]="none";
- exotics++;
- }
- for(var j=1;j<73;j++){
- var compname='skillname'+j;
- if((names[compname]==chummerfile.characters.character.skills.skill[i].name)||(chummerfile.characters.character.skills.skill[i].name=="Locksmith"&&j==29)||(chummerfile.characters.character.skills.skill[i].name=="Pilot Ground Craft"&&j==55)){
- attributes["skillattr"+j]="@{"+chummerfile.characters.character.skills.skill[i].attribute.toLowerCase();
- if(chummerfile.characters.character.skills.skill[i].rating>0){
- attributes["skillrating"+j]=chummerfile.characters.character.skills.skill[i].rating;
- attributes["skillbonus"+j]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod;
- }else{
- attributes["skillrating"+j]="-1";
- attributes["skillbonus"+j]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod+1;
- }
- if(chummerfile.characters.character.skills.skill[i].skillspecializations != null && chummerfile.characters.character.skills.skill[i].skillspecializations.skillspecialization.name != null)
- attributes["skillspec"+j]=chummerfile.characters.character.skills.skill[i].skillspecializations.skillspecialization.name;
- else
- attributes["skillspec"+j]="none";
- if(chummerfile.characters.character.weapons!=null){
- if(chummerfile.characters.character.weapons.weapon.length>1){
- for(var h=1;h 1){
- for(var i=0; i < chummerfile.characters.character.spells.spell.length; i++){
- importSingleSpell(chummerfile.characters.character.spells.spell[i], attributes, spellcastingSkill, ritualSkill, alchemySkill);
- }
- }else{
- importSingleSpell(chummerfile.characters.character.spells.spell, attributes, spellcastingSkill, ritualSkill, alchemySkill);
- }
- }
- }catch(err){
- goodcode=false;
- error= error + "\n" + "Error with Spells: " + err;
- }
- try{
- if(chummerfile.characters.character.critterpowers != null){
- console.log("Importing critter powers");
- if(chummerfile.characters.character.critterpowers.critterpower.length > 1){
- for(var i=0; i < chummerfile.characters.character.critterpowers.critterpower.length; i++){
- var newrowid=generateRowID();
- attributes["repeating_critterpowers_"+newrowid+"_spellname"]=chummerfile.characters.character.critterpowers.critterpower[i].fullname;
- attributes["repeating_critterpowers_"+newrowid+"_spelltype"]=chummerfile.characters.character.critterpowers.critterpower[i].type;
- if(chummerfile.characters.character.critterpowers.critterpower[i].notes != null){
- attributes["repeating_critterpowers_"+newrowid+"_spelldescription"] = chummerfile.characters.character.critterpowers.critterpower[i].notes;
- }
- attributes["repeating_critterpowers_"+newrowid+"_spelldrain"]="-0";
-
- attributes["repeating_critterpowers_"+newrowid+"_spellcategory"] = chummerfile.characters.character.critterpowers.critterpower[i].category;
- attributes["repeating_critterpowers_"+newrowid+"_spellbonus"]=0;
-
- if(chummerfile.characters.character.critterpowers.critterpower[i].range != null){
- attributes["repeating_critterpowers_"+newrowid+"_spellrange"]=chummerfile.characters.character.critterpowers.critterpower[i].range;
- } else {
- attributes["repeating_critterpowers_"+newrowid+"_spellrange"]="N/A";
- }
-
- if(chummerfile.characters.character.critterpowers.critterpower[i].duration != null) {
- attributes["repeating_critterpowers_"+newrowid+"_spellduration"] = chummerfile.characters.character.critterpowers.critterpower[i].duration;
- } else {
- attributes["repeating_critterpowers_"+newrowid+"_spellduration"] = "N/A";
- }
-
- }
- }else{
- var newrowid=generateRowID();
- attributes["repeating_critterpowers_"+newrowid+"_spellname"]=chummerfile.characters.character.critterpowers.critterpower.fullname;
- attributes["repeating_critterpowers_"+newrowid+"_spelltype"]=chummerfile.characters.character.critterpowers.critterpower.type;
- if(chummerfile.characters.character.critterpowers.critterpower.notes!=null){
- attributes["repeating_critterpowers_"+newrowid+"_spelldescription"]=chummerfile.characters.character.critterpowers.critterpower.notes;
- }
- attributes["repeating_critterpowers_"+newrowid+"_spelldrain"]="-0";
- attributes["repeating_critterpowers_"+newrowid+"_spellcategory"]=chummerfile.characters.character.critterpowers.critterpower.category;
- attributes["repeating_critterpowers_"+newrowid+"_spellbonus"]=0;
-
- if(chummerfile.characters.character.critterpowers.critterpower.range != null){
- attributes["repeating_critterpowers_"+newrowid+"_spellrange"]=chummerfile.characters.character.critterpowers.critterpower.range;
- } else {
- attributes["repeating_critterpowers_"+newrowid+"_spellrange"]="N/A";
- }
-
- if(chummerfile.characters.character.critterpowers.critterpower.duration != null) {
- attributes["repeating_critterpowers_"+newrowid+"_spellduration"]=chummerfile.characters.character.critterpowers.critterpower.duration;
- } else {
- attributes["repeating_critterpowers_"+newrowid+"_spellduration"]="N/A";
- }
- }
- }
- }catch(err){
- goodcode=false;
- error= error + "\n" + "Error with Critterpowers: " + err;
- }
- try{
- if(chummerfile.characters.character.contacts!=null){
- console.log("Importing Contacts");
- if(chummerfile.characters.character.contacts.contact.length>1){
- for(var i=0; i gear.category_english == "Cyberdecks" || gear.category_english == "Rigger Command Consoles").sort((g1,g2) => g1.devicerating < g2.devicerating);
- if(decks.length > 0) {
- cyberdeck = decks[0];
- attributes.attack_base = cyberdeck.attack;
- attributes.sleaze_base = cyberdeck.sleaze;
- attributes.datap_base = cyberdeck.dataprocessing;
- attributes.firewall_base = cyberdeck.firewall;
- attributes.devicertg_base = cyberdeck.devicerating;
- }
- else {
- let commlinks = chummerfile.characters.character.gears.gear.filter(gear => gear.category_english == "Commlinks").sort((g1,g2) => g1.devicerating < g2.devicerating);
- if(commlinks.length > 0) {
- link = commlinks[0];
- attributes.attack_base = link.attack;
- attributes.sleaze_base = link.sleaze;
- attributes.datap_base = link.dataprocessing;
- attributes.firewall_base = link.firewall;
- attributes.devicertg_base = link.devicerating;
- }
- }
- }
- }catch(err){
- goodcode=false;
- error= error + "\n" + "Error with Cyberdeck: " + err;
- }
-
- attributes.warningcheckbox="0";
- attributes.chummercheckbox="0";
- attributes.chummertext="Import successful\nREMEMBER THIS IS ONLY A HELP AND YOU NEED TO DOUBLE CHECK EVERYTHING.\nSpecifically check the following values manually:\n-Character Name\n-Limitmodifiers global or applying to single skills\n-Cyberdeck and Matrix Actions\n-Vehicle and Drone Autosofts\n-SINs + Lifestyles\nWeapon AP, Acc, RC"
- if(goodcode){
- try{
- clearSheet(attributes, text.experimental);
- console.log("Writing new data");
- setAttrs(attributes);
- }catch(err){
- setAttrs({
- chummertext:"Error setting Attributes: " + err,
- chummercheckbox:"0",
- warningcheckbox:"0"
- });
- }
- }else{
- setAttrs({
- chummertext:error,
- chummercheckbox:"0",
- warningcheckbox:"0"
- });
- }
- });
- }else{
- setAttrs({
- chummertext:"Error invalid Structure: " + error,
- chummercheckbox:"0",
- warningcheckbox:"0"
- });
- }
- }
-});
\ No newline at end of file
diff --git a/Shadowrun5th/js/importArmor.js b/Shadowrun5th/js/importArmor.js
deleted file mode 100644
index cb80a73956..0000000000
--- a/Shadowrun5th/js/importArmor.js
+++ /dev/null
@@ -1,70 +0,0 @@
-function importSingleArmor(armor, attributes) {
-
- if(armor.armor.includes("/")) {
- var armorValueArray = armor.armor.toString().split("/");
-
- var splitArmor = armor;
- splitArmor.armor = armorValueArray[0];
- importSingleArmor(splitArmor, attributes);
-
- armor.armor = armorValueArray[1];
- }
-
- var newrowid = generateRowID()
- attributes["repeating_armors_"+newrowid+"_armorname"] = armor.name;
- if(armor.equipped == "True") {
- attributes["repeating_armors_"+newrowid+"_armorworn"] = "on";
- }
- attributes["repeating_armors_"+newrowid+"_armorrating"] = armor.armor;
- attributes["repeating_armors_"+newrowid+"_armornotes"] = "";
- if(armor.armormods!=null){
- if(armor.armormods.armormod.length > 1){
- for(var j=0; j < armor.armormods.armormod.length; j++){
- if(Number(armor.armormods.armormod[j].rating) > 0){
- attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.armormods.armormod[j].name + " " + armor.armormods.armormod[j].rating + "\n";
- }else{
- attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.armormods.armormod[j].name + "\n";
- }
- }
- }else{
- if(Number(armor.armormods.armormod.rating)>0){
- attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.armormods.armormod.name + " " + armor.armormods.armormod.rating + "\n";
- }else{
- attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.armormods.armormod.name + "\n";
- }
- }
- }
- if(armor.gears!=null){
- if(armor.gears.gear.length > 1){
- for(var j=0; j < armor.gears.gear.length; j++){
- attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.gears.gear[j].name + "\n";
- }
- }else{
- attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.gears.gear.name + "\n";
- }
- }
-}
-
-function importCyberwareArmor(nightly, cyberware, attributes) {
- if(nightly != "on") {
- return;
- }
-
- var cyberwareEnhancements = [];
- if(cyberware.children != null && cyberware.children.cyberware.length > 1) {
- cyberwareEnhancements = cyberware.children.cyberware;
- }
-
- cyberwareEnhancements.forEach(enhancement => importSingleCyberwareArmor(cyberware.name, enhancement, attributes));
-}
-
-function importSingleCyberwareArmor(parentname, cyberware, attributes) {
-
- if(cyberware.name_english === "Armor") {
- var newrowid = generateRowID()
- attributes["repeating_armors_"+newrowid+"_armorname"] = parentname;
- attributes["repeating_armors_"+newrowid+"_armorworn"] = "on";
- attributes["repeating_armors_"+newrowid+"_armorrating"] = cyberware.rating;
- attributes["repeating_armors_"+newrowid+"_armornotes"] = "";
- }
-}
diff --git a/Shadowrun5th/js/importChummer/importChummer.js b/Shadowrun5th/js/importChummer/importChummer.js
new file mode 100644
index 0000000000..7e3b336fcb
--- /dev/null
+++ b/Shadowrun5th/js/importChummer/importChummer.js
@@ -0,0 +1,1576 @@
+async function importChummerChar(attributes, chummerfile, text) {
+ var maintab = importMainTabChummer(chummerfile);
+ var skilltab = importSkillsTabChummer(text.experimental, chummerfile);
+ var magictab = importMagicTabChummer(text.experimental, chummerfile);
+ var enhancementtab = importEnhancementTabChummer(text, chummerfile);
+ var matrixtab = importMatrixTabChummer(text.experimental, chummerfile);
+ var vehiclestab = importVehiclesTabChummer(text.experimental, chummerfile);
+ var equipmentstab = importEquipmentTabChummer(text.experimental, chummerfile);
+ var socialtab = importSocialTabChummer(chummerfile);
+
+ let results = await Promise.all([maintab, skilltab, enhancementtab, socialtab]);
+ let dependingResults = await Promise.all([magictab, matrixtab, vehiclestab, equipmentstab]);
+
+ attributes.warningcheckbox="0";
+ attributes.chummercheckbox="0";
+ attributes.chummertext= results.join("") + dependingResults.join("") + "\nREMEMBER THIS IS ONLY A HELP AND YOU NEED TO DOUBLE CHECK EVERYTHING."
+
+ return attributes;
+}
+
+async function importMainTabChummer(chummerfile) {
+
+ var goodcode = true;
+ var error = "";
+ var attributes = {};
+
+
+ try{
+ console.log("Character meta info");
+ if(chummerfile.characters.character.alias != null)
+ attributes.character_name = chummerfile.characters.character.alias;
+
+ if(chummerfile.characters.character.metatype != null)
+ attributes.metatype=chummerfile.characters.character.metatype;
+
+ if(chummerfile.characters.character.sex != null)
+ attributes.sex=chummerfile.characters.character.sex;
+
+ if(chummerfile.characters.character.age != null)
+ attributes.age=chummerfile.characters.character.age;
+
+ if(chummerfile.characters.character.height != null)
+ attributes.height=chummerfile.characters.character.height;
+
+
+ if(chummerfile.characters.character.weight != null)
+ attributes.weight=chummerfile.characters.character.weight;
+ if(chummerfile.characters.character.playername != null)
+ attributes.player=chummerfile.characters.character.playername;
+ if(chummerfile.characters.character.description != null)
+ attributes.description=chummerfile.characters.character.description;
+ if(chummerfile.characters.character.background != null)
+ attributes.background=chummerfile.characters.character.background;
+ if(chummerfile.characters.character.notes != null)
+ attributes.notes=chummerfile.characters.character.notes;
+ if(chummerfile.characters.character.gamenotes != null)
+ attributes.generalnotes=chummerfile.characters.character.gamenotes;
+ if(chummerfile.characters.character.karma != null)
+ attributes.karma=chummerfile.characters.character.karma;
+ if(chummerfile.characters.character.totalkarma != null)
+ attributes.karmacareer=chummerfile.characters.character.totalkarma;
+ if(chummerfile.characters.character.initbonus != null){
+ attributes.initiativebonus=chummerfile.characters.character.initbonus;
+ attributes.astralinitiativebonus=chummerfile.characters.character.initbonus;
+ attributes.matrixinitiativebonus=chummerfile.characters.character.initbonus;
+ }
+ if(chummerfile.characters.character.initdice != null)
+ attributes.initiativedice=chummerfile.characters.character.initdice;
+ if(chummerfile.characters.character.astralinitdice != null)
+ attributes.astralinitiativedice=chummerfile.characters.character.astralinitdice;
+ if(chummerfile.characters.character.cmthresholdoffset != null)
+ attributes.woundadditive=chummerfile.characters.character.cmthresholdoffset;
+ if(chummerfile.characters.character.cmthreshold != null)
+ attributes.woundmultiplikative=chummerfile.characters.character.cmthreshold;
+ if(chummerfile.characters.character.cmoverflow != null)
+ attributes.overflowmod=chummerfile.characters.character.cmoverflow-chummerfile.characters.character.attributes[1].attribute[0].total- 1;
+ if(chummerfile.characters.character.physicalcm != null)
+ attributes.physicaltrackmod=chummerfile.characters.character.physicalcm-Math.ceil(chummerfile.characters.character.attributes[1].attribute[0].total/2)- 8;
+ if(chummerfile.characters.character.stuncm != null)
+ attributes.stuntrackmod=chummerfile.characters.character.stuncm-Math.ceil(chummerfile.characters.character.attributes[1].attribute[7].total/2)- 8;
+ if(chummerfile.characters.character.totalstreetcred != null)
+ attributes.streetcred=chummerfile.characters.character.totalstreetcred;
+ if(chummerfile.characters.character.totalnotoriety != null)
+ attributes.notoriety=chummerfile.characters.character.totalnotoriety;
+ if(chummerfile.characters.character.totalpublicawareness != null)
+ attributes.pawareness=chummerfile.characters.character.totalpublicawareness;
+ if(chummerfile.characters.character.nuyen != null)
+ attributes.nuyen_total=chummerfile.characters.character.nuyen;
+ if(chummerfile.characters.character.magician == "True"){
+ // HeroLab 'chummer' export uses drainattribute property and a list, this is a workaround for that
+ try{
+ attributes.drainattribute="@{"+chummerfile.characters.character.tradition.drainattributes.match(/[A-Z]+/g)[1].toLowerCase()+"_total}";
+ } catch(err)
+ {
+ attributes.drainattribute="@{"+chummerfile.characters.character.tradition.drainattribute.attr[1]+"_total}";
+ }
+ }
+ }catch(err){
+ goodcode = false;
+ error = "Error with Character Info " + err;
+ }
+
+ try{
+ console.log("Importing Attributes");
+ var attributesChummer = chummerfile.characters.character.attributes[1].attribute;
+ attributes.bod_base = attributesChummer.find(a => a.name_english === "BOD").base;
+ attributes.agi_base = attributesChummer.find(a => a.name_english === "AGI").base;
+ attributes.rea_base = attributesChummer.find(a => a.name_english === "REA").base;
+ attributes.str_base = attributesChummer.find(a => a.name_english === "STR").base;
+ attributes.cha_base = attributesChummer.find(a => a.name_english === "CHA").base;
+ attributes.int_base = attributesChummer.find(a => a.name_english === "INT").base;
+ attributes.log_base = attributesChummer.find(a => a.name_english === "LOG").base;
+ attributes.wil_base = attributesChummer.find(a => a.name_english === "WIL").base;
+ attributes.edg_total = attributesChummer.find(a => a.name_english === "EDG").base;
+ if(chummerfile.characters.character.technomancer==="True"){
+ attributes.mag_base=attributesChummer.find(a => a.name_english === "RES").total;
+ attributes.istechnomancer = 1;
+ }
+ else if(chummerfile.characters.character.magician==="True" || chummerfile.characters.character.adept==="True"){
+ attributes.mag_base=attributesChummer.find(a => a.name_english === "MAG").total;
+ attributes.istechnomancer = 0;
+ }
+ else {
+ attributes.mag_base = 0;
+ attributes.istechnomancer = 0;
+ }
+ attributes.bod_aug = attributesChummer.find(a => a.name_english === "BOD").total-attributesChummer.find(a => a.name_english === "BOD").base;
+ attributes.agi_aug = attributesChummer.find(a => a.name_english === "AGI").total-attributesChummer.find(a => a.name_english === "AGI").base;
+ attributes.rea_aug = attributesChummer.find(a => a.name_english === "REA").total-attributesChummer.find(a => a.name_english === "REA").base;
+ attributes.str_aug = attributesChummer.find(a => a.name_english === "STR").total-attributesChummer.find(a => a.name_english === "STR").base;
+ attributes.cha_aug = attributesChummer.find(a => a.name_english === "CHA").total-attributesChummer.find(a => a.name_english === "CHA").base;
+ attributes.int_aug = attributesChummer.find(a => a.name_english === "INT").total-attributesChummer.find(a => a.name_english === "INT").base;
+ attributes.log_aug = attributesChummer.find(a => a.name_english === "LOG").total-attributesChummer.find(a => a.name_english === "LOG").base;
+ attributes.wil_aug = attributesChummer.find(a => a.name_english === "WIL").total-attributesChummer.find(a => a.name_english === "WIL").base;
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Attributes " +err
+ }
+
+ if(goodcode){
+ try{
+ setAttrs(attributes);
+ return "Main Tab import successfull\n";
+ } catch(err){
+ return "Error setting Attributes: " + err;
+ }
+ } else{
+ return error;
+ }
+}
+
+async function importSkillsTabChummer(experimental, chummerfile) {
+
+ var goodcode = true;
+ var error = "";
+ var attributes = {};
+
+ var index=[];
+ for(var i=1;i<73;i++)
+ {
+ var name='skillname'+i;
+ index[i-1]=name;
+ }
+
+ var names = await asw.getAttrs(index);
+ var exotics=73;
+ try{
+ console.log("Importing Skills");
+ for(var i=0;i 0){
+ attributes["repeating_knowledge_"+newrowid+"_knowledgerating"] = chummerfile.characters.character.skills.skill[i].rating;
+ attributes["repeating_knowledge_"+newrowid+"_knowledgebonus"] = chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod;
+ }else{
+ attributes["repeating_knowledge_"+newrowid+"_knowledgerating"] = "-1";
+ attributes["repeating_knowledge_"+newrowid+"_knowledgebonus"] = chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod+1;
+ }
+ if(chummerfile.characters.character.skills.skill[i].spec != null) {
+ attributes["repeating_knowledge_"+newrowid+"_knowledgespec"] = chummerfile.characters.character.skills.skill[i].spec;
+ }
+ else
+ attributes["repeating_knowledge_"+newrowid+"_knowledgespec"] = "none";
+ }
+
+ if(chummerfile.characters.character.skills.skill[i].exotic=="True"){
+ attributes["skillname"+exotics]=chummerfile.characters.character.skills.skill[i].name_english;
+ if(chummerfile.characters.character.skills.skill[i].rating>0){
+ attributes["skillbonus"+exotics]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod;
+ attributes["skillrating"+exotics]=chummerfile.characters.character.skills.skill[i].rating;
+ }else{
+ attributes["skillrating"+exotics]="-1";
+ attributes["skillbonus"+exotics]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod+1;
+ }
+ attributes["skillattr"+exotics]="@{"+chummerfile.characters.character.skills.skill[i].attribute.toLowerCase();
+
+ if(chummerfile.characters.character.skills.skill[i].spec != null)
+ attributes["skillspec"+exotics] = chummerfile.characters.character.skills.skill[i].spec;
+ else
+ attributes["skillspec"+exotics]="none";
+ exotics++;
+ }
+
+ for(var j=1;j<73;j++){
+ var compname='skillname'+j;
+ if((names[compname]==chummerfile.characters.character.skills.skill[i].name_english)||(chummerfile.characters.character.skills.skill[i].name_english=="Locksmith"&&j==29)||(chummerfile.characters.character.skills.skill[i].name_english=="Pilot Ground Craft"&&j==55)){
+ attributes["skillattr"+j]="@{"+chummerfile.characters.character.skills.skill[i].attribute.toLowerCase();
+ if(chummerfile.characters.character.skills.skill[i].rating>0){
+ attributes["skillrating"+j]=chummerfile.characters.character.skills.skill[i].rating;
+ attributes["skillbonus"+j]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod;
+ }else{
+ attributes["skillrating"+j]="-1";
+ attributes["skillbonus"+j]=chummerfile.characters.character.skills.skill[i].total-chummerfile.characters.character.skills.skill[i].rating-chummerfile.characters.character.skills.skill[i].attributemod+1;
+ }
+
+ if(chummerfile.characters.character.skills.skill[i].spec != null) {
+ attributes["skillspec"+j] = chummerfile.characters.character.skills.skill[i].spec;
+ }
+ else {
+ attributes["skillspec"+j]="none";
+ }
+ }
+ }
+ }
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Skills: "+ err;
+ }
+
+ if(goodcode){
+ try{
+ clearSkills(experimental);
+ setAttrs(attributes);
+ return "Skill Tab import successfull\n";
+ } catch(err){
+ return "Error setting Attributes: " + err;
+ }
+ } else{
+ return error;
+ }
+}
+
+async function importMagicTabChummer(experimental, chummerfile) {
+
+ var goodcode = true;
+ var error = "";
+ var attributes = {};
+
+ try{
+
+ var alchemy = 0;
+ var spellcasting = 0;
+ var ritual = 0;
+
+ for(var i=0;i 1){
+ for(var i=0; i < chummerfile.characters.character.spells.spell.length; i++){
+ importSingleSpell(chummerfile.characters.character.spells.spell[i], attributes, spellcastingSkill, ritualSkill, alchemySkill);
+ }
+ }else{
+ importSingleSpell(chummerfile.characters.character.spells.spell, attributes, spellcastingSkill, ritualSkill, alchemySkill);
+ }
+ }
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Spells: " + err;
+ }
+
+ try{
+ if(chummerfile.characters.character.complexforms != null){
+ console.log("Importing complexforms");
+ if(chummerfile.characters.character.complexforms.complexform.length>1){
+ for(var i=0; i 1){
+ for(var i=0; i < chummerfile.characters.character.critterpowers.critterpower.length; i++){
+ var newrowid=generateRowID();
+ attributes["repeating_critterpowers_"+newrowid+"_spellname"]=chummerfile.characters.character.critterpowers.critterpower[i].fullname;
+ attributes["repeating_critterpowers_"+newrowid+"_spelltype"]=chummerfile.characters.character.critterpowers.critterpower[i].type;
+ if(chummerfile.characters.character.critterpowers.critterpower[i].notes != null){
+ attributes["repeating_critterpowers_"+newrowid+"_spelldescription"] = chummerfile.characters.character.critterpowers.critterpower[i].notes;
+ }
+ attributes["repeating_critterpowers_"+newrowid+"_spelldrain"]="-0";
+
+ attributes["repeating_critterpowers_"+newrowid+"_spellcategory"] = chummerfile.characters.character.critterpowers.critterpower[i].category;
+ attributes["repeating_critterpowers_"+newrowid+"_spellbonus"]=0;
+
+ if(chummerfile.characters.character.critterpowers.critterpower[i].range != null){
+ attributes["repeating_critterpowers_"+newrowid+"_spellrange"]=chummerfile.characters.character.critterpowers.critterpower[i].range;
+ } else {
+ attributes["repeating_critterpowers_"+newrowid+"_spellrange"]="N/A";
+ }
+
+ if(chummerfile.characters.character.critterpowers.critterpower[i].duration != null) {
+ attributes["repeating_critterpowers_"+newrowid+"_spellduration"] = chummerfile.characters.character.critterpowers.critterpower[i].duration;
+ } else {
+ attributes["repeating_critterpowers_"+newrowid+"_spellduration"] = "N/A";
+ }
+
+ }
+ }else{
+ var newrowid=generateRowID();
+ attributes["repeating_critterpowers_"+newrowid+"_spellname"]=chummerfile.characters.character.critterpowers.critterpower.fullname;
+ attributes["repeating_critterpowers_"+newrowid+"_spelltype"]=chummerfile.characters.character.critterpowers.critterpower.type;
+ if(chummerfile.characters.character.critterpowers.critterpower.notes!=null){
+ attributes["repeating_critterpowers_"+newrowid+"_spelldescription"]=chummerfile.characters.character.critterpowers.critterpower.notes;
+ }
+ attributes["repeating_critterpowers_"+newrowid+"_spelldrain"]="-0";
+ attributes["repeating_critterpowers_"+newrowid+"_spellcategory"]=chummerfile.characters.character.critterpowers.critterpower.category;
+ attributes["repeating_critterpowers_"+newrowid+"_spellbonus"]=0;
+
+ if(chummerfile.characters.character.critterpowers.critterpower.range != null){
+ attributes["repeating_critterpowers_"+newrowid+"_spellrange"]=chummerfile.characters.character.critterpowers.critterpower.range;
+ } else {
+ attributes["repeating_critterpowers_"+newrowid+"_spellrange"]="N/A";
+ }
+
+ if(chummerfile.characters.character.critterpowers.critterpower.duration != null) {
+ attributes["repeating_critterpowers_"+newrowid+"_spellduration"]=chummerfile.characters.character.critterpowers.critterpower.duration;
+ } else {
+ attributes["repeating_critterpowers_"+newrowid+"_spellduration"]="N/A";
+ }
+ }
+ }
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Critterpowers: " + err;
+ }
+
+ try{
+ if(chummerfile.characters.character.initiategrade != null && chummerfile.characters.character.initiategrade != 0) {
+ console.log("Importing initiategrade and metamagic");
+ attributes.initiationgrade = chummerfile.characters.character.initiategrade;
+ if(chummerfile.characters.character.metamagics != null){
+ if(chummerfile.characters.character.metamagics.metamagic.length>1){
+ for(var i=0;i1){
+ for(var i=0;i1){
+ for(var i=0;i 1){
+ for(var i=0; i< chummerfile.characters.character.cyberwares.cyberware.length; i++){
+ var newrowid=generateRowID();
+ attributes["repeating_ware_"+newrowid+"_warename"]=chummerfile.characters.character.cyberwares.cyberware[i].name;
+ attributes["repeating_ware_"+newrowid+"_waredescription"]=chummerfile.characters.character.cyberwares.cyberware[i].rating;
+ attributes["repeating_ware_"+newrowid+"_waregrade"]=chummerfile.characters.character.cyberwares.cyberware[i].grade;
+ attributes["repeating_ware_"+newrowid+"_warekarma"]=chummerfile.characters.character.cyberwares.cyberware[i].ess;
+ essence += Number(chummerfile.characters.character.cyberwares.cyberware[i].ess.replace(",","."));
+ }
+ }else{
+ var newrowid=generateRowID();
+ attributes["repeating_ware_"+newrowid+"_warename"]=chummerfile.characters.character.cyberwares.cyberware.name;
+ attributes["repeating_ware_"+newrowid+"_waredescription"]=chummerfile.characters.character.cyberwares.cyberware.rating;
+ attributes["repeating_ware_"+newrowid+"_waregrade"]=chummerfile.characters.character.cyberwares.cyberware.grade;
+ attributes["repeating_ware_"+newrowid+"_warekarma"]=chummerfile.characters.character.cyberwares.cyberware.ess;
+ essence+=Number(chummerfile.characters.character.cyberwares.cyberware.ess.replace(",","."));
+ }
+ }
+ attributes.ess_total=6-essence;
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Ware " +err
+ }
+
+ try{
+ if(chummerfile.characters.character.martialarts != null){
+ console.log("Importing martialarts");
+ if(chummerfile.characters.character.martialarts.martialart.length>1){
+ for(var i=0;i 1){
+ for(var j=0; j < chummerfile.characters.character.martialarts.martialart[i].martialarttechniques.length; j++){
+ var newrowid=generateRowID();
+ attributes["repeating_martial_"+newrowid+"_martialname"] = chummerfile.characters.character.martialarts.martialart[i].martialarttechniques.martialarttechnique[j].name;
+ attributes["repeating_martial_"+newrowid+"_martialdescription"] = chummerfile.characters.character.martialarts.martialart[i].name;
+ if(chummerfile.characters.character.martialarts.martialart[i].martialarttechniques.martialarttechnique[j].notes != undefined) {
+ attributes["repeating_martial_"+newrowid+"_martialnotes"] = chummerfile.characters.character.martialarts.martialart[i].martialarttechniques.martialarttechnique[j].notes;
+ }
+ }
+ }else{
+ console.log(chummerfile.characters.character.martialarts.martialart[i]);
+ var newrowid=generateRowID();
+ attributes["repeating_martial_"+newrowid+"_martialname"]=chummerfile.characters.character.martialarts.martialart[i].martialarttechniques.martialarttechnique.name;
+ attributes["repeating_martial_"+newrowid+"_martialdescription"]=chummerfile.characters.character.martialarts.martialart[i].name;
+ if(chummerfile.characters.character.martialarts.martialart[i].martialarttechniques.martialarttechnique.notes != undefined) {
+ attributes["repeating_martial_"+newrowid+"_martialnotes"] = chummerfile.characters.character.martialarts.martialart[i].martialarttechniques.martialarttechnique.notes;
+ }
+ }
+ }
+ }
+ }else{
+ if(chummerfile.characters.character.martialarts.martialart.martialarttechniques != null){
+ if(chummerfile.characters.character.martialarts.martialart.martialarttechniques.martialarttechnique.length>1){
+ for(var j=0;j gear.category_english == "Cyberdecks" || gear.category_english == "Rigger Command Consoles").sort((g1,g2) => g1.devicerating < g2.devicerating);
+ if(decks.length > 0) {
+ cyberdeck = decks[0];
+ attributes.attack_base = cyberdeck.attack;
+ attributes.sleaze_base = cyberdeck.sleaze;
+ attributes.datap_base = cyberdeck.dataprocessing;
+ attributes.firewall_base = cyberdeck.firewall;
+ attributes.devicertg_base = cyberdeck.devicerating;
+ }
+ else {
+ let commlinks = chummerfile.characters.character.gears.gear.filter(gear => gear.category_english == "Commlinks").sort((g1,g2) => g1.devicerating < g2.devicerating);
+ if(commlinks.length > 0) {
+ link = commlinks[0];
+ attributes.attack_base = link.attack;
+ attributes.sleaze_base = link.sleaze;
+ attributes.datap_base = link.dataprocessing;
+ attributes.firewall_base = link.firewall;
+ attributes.devicertg_base = link.devicerating;
+ }
+ }
+ }
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Cyberdeck: " + err;
+ }
+
+ try {
+ if(chummerfile.characters.character.aiprograms != null){
+ console.log("Importing ai programs");
+ if(chummerfile.characters.character.aiprograms.aiprogram.length > 1){
+ for(var i=0; i < chummerfile.characters.character.aiprograms.aiprogram.length; i++){
+ var newrowid=generateRowID();
+ attributes["repeating_programs_"+newrowid+"_programname"]=chummerfile.characters.character.aiprograms.aiprogram[i].name;
+ }
+ }
+ else {
+ var newrowid=generateRowID();
+ attributes["repeating_programs_"+newrowid+"_programname"] = chummerfile.characters.character.aiprograms.aiprogram.name;
+ }
+ }
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with AI programs " +err
+ }
+
+ try{
+ if(chummerfile.characters.character.gears != null){
+ console.log("Importing programs");
+ if(chummerfile.characters.character.gears.gear.length>1){
+ for(var i=0;i 1){
+ for(var j=0; j 1){
+ let vehicles = chummerfile.characters.character.vehicles.vehicle.filter( vehicle => vehicle.seats > 0);
+ for(var i=0; i < vehicles.length; i++){
+ importSingleVehicle(vehicles[i], attributes);
+ }
+ } else {
+ if(chummerfile.characters.character.vehicles.vehicle.seats > 0) {
+ importSingleVehicle(chummerfile.characters.character.vehicles.vehicle, attributes);
+ }
+ }
+ }
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Vehicles: " + err;
+ }
+
+ try{
+ if(chummerfile.characters.character.vehicles != null){
+ console.log("Importing drones");
+ if(chummerfile.characters.character.vehicles.vehicle.length > 1){
+ let drones = chummerfile.characters.character.vehicles.vehicle.filter( vehicle => vehicle.seats == 0);
+ for(var i=0; i < drones.length; i++){
+ importSingleDrone(drones[i], attributes);
+ }
+ } else {
+ if(chummerfile.characters.character.vehicles.vehicle.seats == 0) {
+ importSingleDrone(chummerfile.characters.character.vehicles.vehicle, attributes);
+ }
+ }
+ }
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Vehicles: " + err;
+ }
+
+ if(goodcode){
+ try{
+ clearVehicles(experimental);
+ setAttrs(attributes);
+ return "Vehicles Tab import successfull\n";
+ } catch(err){
+ return "Error setting Attributes: " + err;
+ }
+ } else{
+ return error;
+ }
+}
+
+async function importEquipmentTabChummer(experimental, chummerfile) {
+
+ var goodcode = true;
+ var error = "";
+ var attributes = {};
+
+ if(chummerfile.characters.character.armors != null){
+ console.log("Importing armors");
+ if(chummerfile.characters.character.armors.armor.length > 1){
+ chummerfile.characters.character.armors.armor.forEach(async(armor) => {
+ try{
+ importSingleArmor(armor, attributes);
+ }catch(err){
+ goodcode = false;
+ error= error + "\n" + "Error with Armor " + armor.name + ": " + err
+ }
+ })
+ }else{
+ try{
+ importSingleArmor(chummerfile.characters.character.armors.armor, attributes);
+ }catch(err){
+ goodcode = false;
+ error= error + "\n" + "Error with Armor " + chummerfile.characters.character.armors.armor.name + ": " + err
+ }
+ }
+ }
+
+ if(chummerfile.characters.character.cyberwares != null){
+ console.log("Importing Cyberware Armor");
+ if(chummerfile.characters.character.cyberwares.cyberware.length > 1){
+ chummerfile.characters.character.cyberwares.cyberware.forEach(cyberware => importCyberwareArmor(cyberware, attributes));
+ }else{
+ importCyberwareArmor(chummerfile.characters.character.cyberwares.cyberware, attributes);
+ }
+ }
+
+ if(chummerfile.characters.character.otherarmors != null){
+ console.log("Importing Other Armors");
+ if(chummerfile.characters.character.otherarmors.otherarmor.length > 1){
+ chummerfile.characters.character.otherarmors.otherarmor.forEach(armor => importOtherArmor(armor, attributes));
+ }else{
+ importOtherArmor(chummerfile.characters.character.otherarmors.otherarmor, attributes);
+ }
+ }
+
+ if(chummerfile.characters.character.weapons != null){
+ console.log("Importing weapons");
+ for(var i=1; i<9; i++){
+ attributes["weaponismelee"+i] = "on";
+ attributes["weaponname"+i] = "";
+ attributes["weaponcategory"+i] = "@{skilldicepool49}";
+ attributes["weaponspec"+i] = "0";
+ attributes["weaponbonus"+i] = "0";
+ attributes["weaponaccuracy"+i] = "0";
+ attributes["weapondv"+i] = "0";
+ attributes["weapondmgtype"+i] = "P";
+ attributes["weaponap"+i] = "0";
+ attributes["weaponrc"+i] = "0";
+ attributes["weaponmode"+i] = "11";
+ attributes["weaponnotes"+i] = "";
+ }
+ ammunition = [];
+ if(chummerfile.characters.character.gears != null) {
+ for( var j = 0; j < chummerfile.characters.character.gears.gear.length; j++) {
+ if(chummerfile.characters.character.gears.gear[j].category_english.includes("Ammunition") ||
+ chummerfile.characters.character.gears.gear[j].name_english == "Micro Flares"
+ ){
+ ammunition.push(chummerfile.characters.character.gears.gear[j]);
+ }
+ }
+ }
+
+ //load agi + str for dice calculation
+ let charAttributes = await asw.getAttrs(["agi_base", "agi_aug", "str_base", "str_aug"]);
+ attributes = Object.assign(attributes, charAttributes);
+
+ if(chummerfile.characters.character.weapons.weapon.length > 1){
+ for(var i=1; i1){
+ for(var i=0;i 0){
+ name += " " + chummerfile.characters.character.gears.gear[i].rating;
+ }
+ attributes["repeating_equipment_"+newrowid+"_equipmentname"]=name;
+ attributes["repeating_equipment_"+newrowid+"_equipmentnumber"]=chummerfile.characters.character.gears.gear[i].qty ? chummerfile.characters.character.gears.gear[i].qty : 1;
+ if(chummerfile.characters.character.gears.gear[i].extra != null) {
+ attributes["repeating_equipment_"+newrowid+"_equipmentdescription"]=chummerfile.characters.character.gears.gear[i].extra;
+ }
+ attributes["repeating_equipment_"+newrowid+"_equipmentnotes"]="";
+ if(chummerfile.characters.character.gears.gear[i].children!=null){
+ if(chummerfile.characters.character.gears.gear[i].children.gear.length>1){
+ for(var j=0; j 0){
+ note += " " + chummerfile.characters.character.gears.gear[i].children.gear[j].rating;
+ }
+ if(chummerfile.characters.character.gears.gear[i].children.gear[j].extra != null) {
+ note += " " + chummerfile.characters.character.gears.gear[i].children.gear[j].extra;
+ }
+ attributes["repeating_equipment_"+newrowid+"_equipmentnotes"]+= note +"\n";
+ }
+ }
+ }else{
+ if(chummerfile.characters.character.gears.gear[i].children.gear.category_english !="Common Programs" && chummerfile.characters.character.gears.gear[i].children.gear.category_english !="Hacking Programs"){
+ note = chummerfile.characters.character.gears.gear[i].children.gear.name;
+ if(chummerfile.characters.character.gears.gear[i].children.gear.rating > 0){
+ note += " " + chummerfile.characters.character.gears.gear[i].children.gear.rating;
+ }
+ if(chummerfile.characters.character.gears.gear[i].children.gear.extra != null) {
+ note += " " + chummerfile.characters.character.gears.gear[i].children.gear.extra;
+ }
+ attributes["repeating_equipment_"+newrowid+"_equipmentnotes"]+= note +"\n";
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Gear " +err
+ }
+
+ if(goodcode){
+ try{
+ clearEquipment(experimental);
+ setAttrs(attributes);
+ return "Equipment Tab import successfull\n";
+ } catch(err){
+ return "Error setting Attributes: " + err;
+ }
+ } else{
+ console.log(error);
+ return error;
+ }
+}
+
+async function importSocialTabChummer(chummerfile) {
+
+ var goodcode = true;
+ var error = "";
+ var attributes = {};
+
+ try{
+ if(chummerfile.characters.character.contacts != null){
+ console.log("Importing Contacts");
+ if(chummerfile.characters.character.contacts.contact.length>1){
+ for(var i=0; i parseInt(a) + parseInt(b));
+ }
+ }
+
+ if(typeof weapon.accessories != "undefined"){
+ if(weapon.accessories.accessory.length>1){
+ for(var j=0; j1){
+ //make clips unique
+ var clips = [...new Map(weapon.clips.clip.slice().reverse().map(v => [v.name, v])).values()].reverse()
+
+ for(var j=0; j < clips.length; j++){
+
+ var newrowid=generateRowID();
+ //find ammo to get stats
+ ammo = ammunition.find(clip => clip.guid === clips[j].id);
+ if(ammo != null) {
+ importRepeatingAmmo(ammo, number, attributes);
+ }
+ }
+ }else{
+ var newrowid = generateRowID();
+ //find ammo to get stats
+ ammo = ammunition.find(clip => clip.guid === weapon.clips.clip.id);
+
+ if(ammo != null) {
+ importRepeatingAmmo(ammo, number, attributes);
+ }
+ }
+ }
+}
+
+function importRepeatingAmmo(ammunition, number, attributes) {
+
+ var newrowid = generateRowID();
+
+ attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoname"] = ammo.name;
+
+ attributes["repeating_ammotype"+number+"_"+newrowid+"_ammodv"] = ammo.weaponbonusdamage_english != null ? ammo.weaponbonusdamage_english.substring(0,2) : 0;
+ if(ammo.weaponbonusdamage_english != null) {
+ attributes["repeating_ammotype"+number+"_"+newrowid+"_ammodmgtype"] = ammo.weaponbonusdamage_english.substring(2);
+ }
+
+ if(ammo.name_english === "Ammo: Stick-n-Shock") {
+ attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoap"] = -5 - attributes["weaponap"+number]
+ }
+ else {
+ attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoap"] = ammo.weaponbonusap != null? ammo.weaponbonusap : 0;
+ }
+
+ if(ammo.name_english === "Arrow: Stick-n-Shock w/Static Shaft" || ammo.name_english === "Arrow: Stick-n-Shock") {
+ attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoap"] = -5 - attributes["weaponap"+number];
+ attributes["repeating_ammotype"+number+"_"+newrowid+"_ammodv"] = ammo.weaponbonusdamage_english.substring(0,2) - attributes["weapondv"+number];
+ }
+
+ attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoacc"] = ammo.weaponbonusacc != null ? ammo.weaponbonusacc : 0;
+}
+
+function provideRepeatingWeaponRowName(weapon) {
+
+ var weaponrow = "weapons";
+
+ switch(weapon.skill) {
+ case "Pistols":
+ weaponrow = weapon.skill.replaceAll(' ', '').toLowerCase();
+ break;
+ case "Automatics":
+ weaponrow = weapon.skill.replaceAll(' ', '').toLowerCase();
+ break;
+ case "Longarms":
+ weaponrow = weapon.skill.replaceAll(' ', '').toLowerCase();
+ break;
+ case "Heavy Weapons":
+ weaponrow = weapon.skill.replaceAll(' ', '').toLowerCase();
+ break;
+ case "Unarmed Combat":
+ weaponrow = "closecombat"
+ break;
+ case "Blades":
+ weaponrow = "closecombat"
+ break;
+ case "Clubs":
+ weaponrow = "closecombat"
+ break;
+ }
+
+ var row = "repeating_" + weaponrow + "_" + generateRowID() + "_";
+
+ return row;
+}
+
+async function importSingleRepeatingWeapon(weapon, ammunition, attributes) {
+ var row = provideRepeatingWeaponRowName(weapon);
+ if(weapon.type == "Ranged"){
+ attributes[row + "weaponismelee"] = 0;
+ attributes[row + "weaponrc"] = weapon.rc.match(/\d+/g).pop()-Math.ceil((parseInt(attributes.str_base) + parseInt(attributes.str_aug))/3)- 1;
+ if(!weapon.rawdamage.includes("STR") && weapon.rawdamage.match(/\d+/) !== null) {
+ attributes[row + "weapondv"] = weapon.rawdamage.match(/\d+/)[0];
+ }
+ else {
+ attributes[row + "weapondv"] = weapon.damage.match(/\d+/) != null ? weapon.damage.match(/\d+/)[0] : 0;
+ }
+
+ attributes[row + "weapondmgtype"] = weapon.rawdamage.match(/S\(e\)|S\b|P|Special\b/) != null ? weapon.rawdamage.match(/S\(e\)|S\b|P|Special\b/)[0] : 0;
+ }else{
+ attributes[row + "weaponismelee"] = "on";
+ attributes[row + "weaponreach"] = weapon.reach;
+ attributes[row + "weapondv"] = weapon.damage_english.match(/\d+/) != null ? weapon.damage_english.match(/\d+/)[0] : 0;
+ attributes[row + "weapondmgtype"] = weapon.damage_english.match(/S\(e\)|S\b|P|Special\b/) != null ? weapon.damage_english.match(/S\(e\)|S\b|P|Special\b/)[0] : 0;
+ }
+
+ let skills = [];
+ for(var i=43;i<52;i++)
+ {
+ var name = 'skillname'+i;
+ skills.push(name);
+ var rating = 'skillrating'+i;
+ skills.push(rating);
+ var bonus = 'skillbonus'+i;
+ skills.push(bonus);
+ var attr = 'skillattr_value'+i;
+ skills.push(attr);
+ }
+ skills = await asw.getAttrs(skills);
+ for(var i=43; i<52; i++)
+ {
+ var compname = 'skillname'+i;
+ var rating = 'skillrating'+i;
+ var bonus = 'skillbonus'+i;
+ var skillattr = 'skillattr_value'+i;
+
+ if(skills[compname] == weapon.skill){
+ attributes[row + "weaponcategory"] = "@{skilldicepool"+i+"}";
+ let attribute = await asw.getAttrs([skillattr]);
+ let attrTotal = attribute[skillattr].replace(/[^a-zA-Z0-9_]/g, "");
+ let attributeSum = await asw.getAttrs([attrTotal]);
+ let targetAttributes = attributeSum[attrTotal].replace(/[+]/g, ",").replace(/[^a-zA-Z0-9_,]/g, "").split(",");
+ let attributesValues = [attributes[targetAttributes[0]], attributes[targetAttributes[1]]]
+ attributes[row + "weaponbonus"] = weapon.dicepool - skills[rating] - skills[bonus] - attributesValues.reduce((a,b) => parseInt(a) + parseInt(b));
+ }
+ }
+
+ attributes[row + "weaponname"] = weapon.name;
+ attributes[row + "weaponaccuracy"] = weapon.accuracy.match(/\d+/g).pop();
+ if(weapon.ap == null || isNaN(weapon.ap)){
+ attributes[row + "weaponap"] = 0;
+ }else{
+ attributes[row + "weaponap"] = weapon.ap;
+ if(weapon.rawap != null) {
+ attributes[row + "weaponap"] = weapon.rawap;
+ }
+ }
+ attributes[row + "weaponnotes"] = "";
+
+ if(typeof weapon.accessories != "undefined"){
+ if(weapon.accessories.accessory.length>1){
+ for(var j=0; j 1){
+ let amountImported = 0;
+ //make clips unique
+ var clips = [...new Map(weapon.clips.clip.slice().reverse().map(v => [v.name, v])).values()].reverse()
+
+ for(var j=0; j < clips.length && amountImported < 4; j++){
+
+ var newrowid=generateRowID();
+ //find ammo to get stats
+ ammo = ammunition.find(clip => clip.guid === clips[j].id);
+
+ if(ammo != null && !ammo.name_english.includes("Regular")) {
+ importRepeatingWeaponAmmo(row, ammo, amountImported, attributes);
+ amountImported++;
+ }
+ }
+ }else{
+ var newrowid = generateRowID();
+ //find ammo to get stats
+ ammo = ammunition.find(clip => clip.guid === weapon.clips.clip.id);
+
+ if(ammo != null) {
+ importRepeatingWeaponAmmo(row, ammo, 0, attributes);
+ }
+ }
+ }
+}
+
+function importRepeatingWeaponAmmo(row, ammunition, number, attributes) {
+
+ attributes[row + "ammoname"+number] = ammo.name;
+
+ attributes[row + "ammodv" + number] = ammo.weaponbonusdamage_english != null ? ammo.weaponbonusdamage_english.substring(0,2) : 0;
+ if(ammo.weaponbonusdamage_english != null) {
+ attributes[row + "ammodmgtype" + number] = ammo.weaponbonusdamage_english.substring(2);
+ }
+
+ if(ammo.name_english === "Ammo: Stick-n-Shock") {
+ attributes[row + "ammoap" + number] = -5 - attributes[row + "weaponap"]
+ }
+ else {
+ attributes[row + "ammoap" + number] = ammo.weaponbonusap != null? ammo.weaponbonusap : 0;
+ }
+
+ if(ammo.name_english === "Arrow: Stick-n-Shock w/Static Shaft" || ammo.name_english === "Arrow: Stick-n-Shock") {
+ attributes[row + "ammoap" + number] = -5 - attributes[row + "weaponap"]
+ attributes[row + "ammodv" + number] = ammo.weaponbonusdamage_english.substring(0,2) - attributes[row + "weapondv"]
+ }
+
+ attributes[row + "ammoacc" + number] = ammo.weaponbonusacc != null ? ammo.weaponbonusacc : 0;
+}
+
+async function importSingleArmor(armor, attributes) {
+
+ if(armor.armor.includes("/")) {
+ var armorValueArray = armor.armor.toString().split("/");
+
+ var splitArmor = armor;
+ splitArmor.armor = armorValueArray[0];
+ importSingleArmor(splitArmor, attributes);
+
+ armor.armor = armorValueArray[1];
+ }
+
+ var newrowid = generateRowID()
+ attributes["repeating_armors_"+newrowid+"_armorname"] = armor.name;
+ if(armor.equipped == "True") {
+ attributes["repeating_armors_"+newrowid+"_armorworn"] = "on";
+ }
+ attributes["repeating_armors_"+newrowid+"_armorrating"] = armor.armor;
+ attributes["repeating_armors_"+newrowid+"_armornotes"] = "";
+ if(armor.armormods!=null){
+ if(armor.armormods.armormod.length > 1){
+ for(var j=0; j < armor.armormods.armormod.length; j++){
+ if(Number(armor.armormods.armormod[j].rating) > 0){
+ attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.armormods.armormod[j].name + " " + armor.armormods.armormod[j].rating + "\n";
+ }else{
+ attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.armormods.armormod[j].name + "\n";
+ }
+ }
+ }else{
+ if(Number(armor.armormods.armormod.rating)>0){
+ attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.armormods.armormod.name + " " + armor.armormods.armormod.rating + "\n";
+ }else{
+ attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.armormods.armormod.name + "\n";
+ }
+ }
+ }
+ if(armor.gears!=null){
+ if(armor.gears.gear.length > 1){
+ for(var j=0; j < armor.gears.gear.length; j++){
+ attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.gears.gear[j].name + "\n";
+ }
+ }else{
+ attributes["repeating_armors_"+newrowid+"_armornotes"] += armor.gears.gear.name + "\n";
+ }
+ }
+}
+
+async function importCyberwareArmor(cyberware, attributes) {
+
+ var cyberwareEnhancements = [];
+ if(cyberware.children != null && cyberware.children.cyberware.length > 1) {
+ cyberwareEnhancements = cyberware.children.cyberware;
+ }
+
+ cyberwareEnhancements.forEach(enhancement => importSingleCyberwareArmor(cyberware.name, enhancement, attributes));
+}
+
+function importSingleCyberwareArmor(parentname, cyberware, attributes) {
+
+ if(cyberware.name_english === "Armor") {
+ var newrowid = generateRowID()
+ attributes["repeating_armors_"+newrowid+"_armorname"] = parentname;
+ attributes["repeating_armors_"+newrowid+"_armorworn"] = "on";
+ attributes["repeating_armors_"+newrowid+"_armorrating"] = cyberware.rating;
+ attributes["repeating_armors_"+newrowid+"_armornotes"] = "";
+ }
+}
+
+function importOtherArmor(armor, attributes) {
+ var newrowid = generateRowID()
+ attributes["repeating_armors_"+newrowid+"_armorname"] = armor.objectname;
+ attributes["repeating_armors_"+newrowid+"_armorworn"] = "on";
+ attributes["repeating_armors_"+newrowid+"_armorrating"] = armor.armor;
+ attributes["repeating_armors_"+newrowid+"_armornotes"] = armor.improvesource;
+}
+
+async function importSingleSpell(spell, attributes, spellcasting, ritual, alchemy) {
+ var category = "spells";
+ if(spell.category_english == "Rituals") {
+ category = "rituals"
+ }
+ else if(spell.alchemy == "True"){
+ category = "alchemy"
+ }
+
+ var row = "repeating_" + category + "_" + generateRowID();
+
+ attributes[row + "_spellname"] = spell.name;
+ attributes[row + "_spelltype"] = spell.type;
+ attributes[row + "_spellcategory"] = spell.category;
+
+ attributes[row + "_spellrange"] = spell.range;
+ attributes[row + "_spellduration"] = spell.duration;
+
+ if(spell.notes != null){
+ attributes[row + "_spelldescription"] = spell.notes;
+ }
+
+ if(spell.dv.match(/(\-|\+)\d/) != null) {
+ attributes[row + "_spelldrain"] = spell.dv.match(/(\-|\+)\d/)[0];
+ }
+ else {
+ attributes[row + "_spelldrain"] = "-0";
+ }
+
+ if(spell.category_english == "Rituals"){
+ attributes[row + "_spellschool"] = "@{skilldicepool67}";
+ attributes[row + "_spelldrain"] = "*2";
+ attributes[row + "_spellbonus"] = spell.dicepool - ritual;
+ } else {
+ attributes[row + "_spellbonus"] = spell.dicepool - spellcasting;
+ if(spell.alchemy == "True"){
+ attributes[row + "_spellschool"] = "@{skilldicepool58}";
+ attributes[row + "_spellbonus"] = spell.dicepool - alchemy;
+ }
+ }
+}
+
+async function importSingleVehicle(vehicle, attributes) {
+
+ var newrowid = generateRowID();
+ attributes["repeating_vehicles_"+newrowid+"_vehiclename"]= vehicle.name;
+ attributes["repeating_vehicles_"+newrowid+"_vehiclehand"]= vehicle.handling.match(/\d+/).pop();
+ attributes["repeating_vehicles_"+newrowid+"_vehiclespeed"]= vehicle.speed.match(/\d+/).pop();
+ attributes["repeating_vehicles_"+newrowid+"_vehicleaccl"]= vehicle.accel.match(/\d+/).pop();
+ attributes["repeating_vehicles_"+newrowid+"_vehiclepilot"]= vehicle.pilot;
+ attributes["repeating_vehicles_"+newrowid+"_vehiclesens"]= vehicle.sensor;
+ attributes["repeating_vehicles_"+newrowid+"_vehicleseats"]= vehicle.seats;
+ attributes["repeating_vehicles_"+newrowid+"_vehicleprice"]= vehicle.cost;
+ attributes["repeating_vehicles_"+newrowid+"_vehiclebody"]= vehicle.body;
+ attributes["repeating_vehicles_"+newrowid+"_vehiclearmor"]= vehicle.armor;
+ attributes["repeating_vehicles_"+newrowid+"_vehiclenotes"]="";
+
+ if(vehicle.mods != null){
+ if(vehicle.mods.mod.length > 1){
+ var weaponnumber = 1;
+ for(var j = 0; j < vehicle.mods.mod.length; j++){
+ weaponnumber = importSingleVehicleMod(vehicle.mods.mod[j], newrowid, attributes, weaponnumber);
+ }
+ }else{
+ attributes["repeating_vehicles_"+newrowid+"_vehiclenotes"] += vehicle.mods.mod.name + "\n";
+ importSingleVehicleMod(vehicle.mods.mod, newrowid, attributes, weaponnumber);
+ }
+ }
+}
+
+const importSingleVehicleMod = (mod, newrowid, attributes, weaponnumber) => {
+ attributes["repeating_vehicles_" + newrowid + "_vehiclenotes"] += mod.name + "\n";
+ if(mod.weapons != null && mod.weapons.weapon != null){
+ if(mod.weapons.length > 1){
+ return importSingleVehicleWeapon(mod.weapons.weapon[0], newrowid, attributes, weaponnumber);
+ }
+ else {
+ return importSingleVehicleWeapon(mod.weapons.weapon, newrowid, attributes, weaponnumber);
+ }
+ }
+ return weaponnumber;
+}
+
+const importSingleVehicleWeapon = (weapon, newrowid, attributes, weaponnumber) => {
+ attributes["repeating_vehicles_"+newrowid+"_vehicleweaponname" + weaponnumber] = weapon.name;
+ attributes["repeating_vehicles_"+newrowid+"_vehicleweaponaccuracy"+ weaponnumber] = weapon.accuracy.match(/\d+/g).pop();
+ if(weapon.type == "Ranged")
+ attributes["repeating_vehicles_"+newrowid+"_vehicleweaponrc"+ weaponnumber] = weapon.rc.match(/\d+/g).pop();
+ if(Number(weapon.ap) != "NaN"){
+ attributes["repeating_vehicles_"+newrowid+"_vehicleweaponap"+ weaponnumber] = weapon.ap;
+ }else{
+ attributes["repeating_vehicles_"+newrowid+"_vehicleweaponap"+ weaponnumber] = 0;
+ }
+ attributes["repeating_vehicles_"+newrowid+"_vehicleweapondv"+ weaponnumber] = weapon.damage_english.match(/\d*/).pop();
+ attributes["repeating_vehicles_"+newrowid+"_vehicleweapondmgtype"+ weaponnumber] = weapon.damage_english.match(/^\d*/).pop();
+ attributes["repeating_vehicles_"+newrowid+"_vehicleweaponnotes"+ weaponnumber] = "";
+ if(typeof weapon.accessories != "undefined"){
+ if(weapon.accessories.accessory.length > 1){
+ for(var h = 0; h < weapon.accessories.accessory.length; h++){
+ attributes["repeating_vehicles_"+newrowid+"_vehicleweaponnotes"+ weaponnumber] += weapon.accessories.accessory[h].name+"\n";
+ }
+ }else{
+ attributes["repeating_vehicles_"+newrowid+"_vehicleweaponnotes"+ weaponnumber] += weapon.accessories.accessory.name+"\n";
+ }
+ }
+ return weaponnumber +1;
+}
+
+async function importSingleDrone(drone, attributes) {
+
+ var newrowid = generateRowID();
+ attributes["repeating_drones_"+newrowid+"_dronename"]= drone.name;
+ attributes["repeating_drones_"+newrowid+"_dronehand"]= drone.handling.match(/\d+/).pop();
+ attributes["repeating_drones_"+newrowid+"_dronespeed"]= drone.speed.match(/\d+/).pop();
+ attributes["repeating_drones_"+newrowid+"_droneaccl"]= drone.accel.match(/\d+/).pop();
+ attributes["repeating_drones_"+newrowid+"_dronepilot"]= drone.pilot;
+ attributes["repeating_drones_"+newrowid+"_dronesens"]= drone.sensor;
+ attributes["repeating_drones_"+newrowid+"_droneprice"]= drone.cost;
+ attributes["repeating_drones_"+newrowid+"_dronebody"]= drone.body;
+ attributes["repeating_drones_"+newrowid+"_dronearmor"]= drone.armor;
+ attributes["repeating_drones_"+newrowid+"_dronenotes"]="";
+
+ if(drone.gears != null) {
+ importAutosofts(drone, newrowid, attributes);
+ }
+
+ if(drone.mods != null){
+ if(drone.mods.mod.length > 1){
+ var weaponnumber = 1;
+ for(var j = 0; j < drone.mods.mod.length; j++){
+ weaponnumber = importSingleDroneMod(drone.mods.mod[j], newrowid, attributes, weaponnumber);
+ }
+ }else{
+ attributes["repeating_drones_"+newrowid+"_dronenotes"] += drone.mods.mod.name + "\n";
+ importSingleDroneMod(drone.mods.mod, newrowid, attributes, weaponnumber);
+ }
+ }
+}
+
+const importSingleDroneMod = (mod, newrowid, attributes, weaponnumber) => {
+ attributes["repeating_drones_" + newrowid + "_dronenotes"] += mod.name + "\n";
+
+ if(mod.weapons != null && mod.weapons.weapon != null){
+ if(mod.weapons.length > 1){
+ return importSingleDroneWeapon(mod.weapons.weapon[0], newrowid, attributes, weaponnumber);
+ }
+ else {
+ return importSingleDroneWeapon(mod.weapons.weapon, newrowid, attributes, weaponnumber);
+ }
+ }
+ return weaponnumber;
+}
+
+const importSingleDroneWeapon = (weapon, newrowid, attributes, weaponnumber) => {
+ attributes["repeating_drones_"+newrowid+"_droneweaponname" + weaponnumber] = weapon.name;
+ attributes["repeating_drones_"+newrowid+"_droneweaponaccuracy"+ weaponnumber] = weapon.accuracy.match(/\d+/g).pop();
+ if(weapon.type == "Ranged")
+ attributes["repeating_drones_"+newrowid+"_droneweaponrc"+ weaponnumber] = weapon.rc.match(/\d+/g).pop();
+ if(Number(weapon.ap) != "NaN"){
+ attributes["repeating_drones_"+newrowid+"_droneweaponap"+ weaponnumber] = weapon.ap;
+ }else{
+ attributes["repeating_drones_"+newrowid+"_droneweaponap"+ weaponnumber] = 0;
+ }
+ attributes["repeating_drones_"+newrowid+"_droneweapondv"+ weaponnumber] = weapon.damage_english.match(/\d*/).pop();
+ attributes["repeating_drones_"+newrowid+"_droneweapondmgtype"+ weaponnumber] = weapon.damage_english.match(/^\d*/).pop();
+ attributes["repeating_drones_"+newrowid+"_droneweaponnotes"+ weaponnumber] = "";
+ if(typeof weapon.accessories != "undefined"){
+ if(weapon.accessories.accessory.length > 1){
+ for(var h = 0; h < weapon.accessories.accessory.length; h++){
+ attributes["repeating_drones_"+newrowid+"_droneweaponnotes"+ weaponnumber] += weapon.accessories.accessory[h].name+"\n";
+ }
+ }else{
+ attributes["repeating_drones_"+newrowid+"_droneweaponnotes"+ weaponnumber] += weapon.accessories.accessory.name+"\n";
+ }
+ }
+ return weaponnumber +1;
+}
+
+const importAutosofts = (drone, newrowid, attributes) => {
+
+ let autosofts;
+ if(drone.gears.gear.length > 1) {
+ autosofts = drone.gears.gear.filter(gear => gear.category_english.includes("Autosofts"));
+ }
+ else {
+ if(drone.gears.gear.category_english == "Autosofts") {
+ autosofts = [drone.gears.gear];
+ }
+ }
+
+ if(autosofts != null) {
+ //search for clearsight
+ let clearsight = autosofts.find(soft => soft.name_english.includes("Clearsight Autosoft"));
+ if(clearsight != null) {
+ attributes["repeating_drones_"+newrowid+"_droneperceptionsoft"] = clearsight.rating;
+ }
+
+ //Maneuvering
+ let maneuvering = autosofts.find(soft => soft.name_english.includes("Maneuvering Autosoft"));
+ if(maneuvering != null) {
+ attributes["repeating_drones_"+newrowid+"_dronemaneuversoft"] = maneuvering.rating;
+ }
+
+ //stealth
+ let stealth = autosofts.find(soft => soft.name_english.includes("Stealth Autosoft"));
+ if(stealth != null) {
+ attributes["repeating_drones_"+newrowid+"_dronesneaksoft"] = stealth.rating;
+ }
+
+ //evasion
+ let evasion = autosofts.find(soft => soft.name_english.includes("Evasion Autosoft"));
+ if(evasion != null) {
+ attributes["repeating_drones_"+newrowid+"_dronedodgesoft"] = evasion.rating;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/Shadowrun5th/js/importHeroLab/importHeroLab.js b/Shadowrun5th/js/importHeroLab/importHeroLab.js
new file mode 100644
index 0000000000..52e4295c86
--- /dev/null
+++ b/Shadowrun5th/js/importHeroLab/importHeroLab.js
@@ -0,0 +1,411 @@
+async function importHeroLabChar(attributes, herolabfile, text) {
+
+ const character = herolabfile.public.character;
+
+ var maintab = importMainTabHeroLab(character);
+ var skilltab = importSkillsTabHeroLab(text.experimental, character);
+
+ var enhancementtab = importEnhancementTabHeroLab(text, character);
+
+
+
+
+
+ let results = await Promise.all([maintab, skilltab, enhancementtab]);
+ let dependingResults = await Promise.all([]);
+
+
+
+ attributes.warningcheckbox="0";
+ attributes.chummercheckbox="0";
+ attributes.chummertext= results.join("") + dependingResults.join("") + "\nREMEMBER THIS IS ONLY A HELP AND YOU NEED TO DOUBLE CHECK EVERYTHING."
+
+ return attributes;
+}
+
+async function importMainTabHeroLab(character) {
+
+ var goodcode = true;
+ var error = "";
+ var attributes = {};
+
+ try{
+ console.log("Character meta info");
+ attributes.character_name = character.name;
+ attributes.metatype = character.race.name;
+ attributes.sex = character.personal.gender;
+ attributes.age = character.personal.age;
+ attributes.height = character.personal.charheight.text;
+ attributes.weight = character.personal.charweight.text;
+
+ attributes.player = character.playername;
+
+ attributes.description = character.personal.description;
+ attributes.background = character.personal.description;
+ attributes.karma = character.karma.left;
+ attributes.karmacareer = character.karma.total;
+
+ attributes.initiativebonus = character.attributes[11].modified - character.attributes[11].base;
+ attributes.astralinitiativebonus = character.attributes[11].modified - character.attributes[11].base;
+ attributes.matrixinitiativebonus = character.attributes[11].modified - character.attributes[11].base;
+ attributes.initiativedice = character.attributes[11].text.split('+')[1].charAt(0);
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attributes.streetcred = character.reputations[0].value;
+ attributes.notoriety = character.reputations[2].value;
+ attributes.pawareness = character.reputations[4].value;
+ attributes.nuyen_total = character.cash.total;
+
+
+
+
+
+
+
+
+
+
+ }catch(err){
+ goodcode = false;
+ error = "Error with Character Info " + err;
+ }
+
+ try{
+ console.log("Importing Attributes");
+ var attributesCharacter = character.attributes;
+ attributes.bod_base = attributesCharacter[0].base;
+ attributes.agi_base = attributesCharacter[1].base;
+ attributes.rea_base = attributesCharacter[2].base;
+ attributes.str_base = attributesCharacter[3].base;
+ attributes.wil_base = attributesCharacter[4].base;
+ attributes.log_base = attributesCharacter[5].base;
+ attributes.int_base = attributesCharacter[6].base;
+ attributes.cha_base = attributesCharacter[7].base;
+ //essence attributesCharacter[8]
+ attributes.edg_total = attributesCharacter[9].base;
+ if(character.heritage.name === "Technomancer"){
+ attributes.mag_base = character.attributes[10].base;
+ attributes.istechnomancer = 1;
+ }
+
+
+
+
+ else {
+ attributes.mag_base = 0;
+ attributes.istechnomancer = 0;
+ }
+ attributes.bod_aug = attributesCharacter[0].modified - attributesCharacter[0].base;
+ attributes.agi_aug = attributesCharacter[1].modified - attributesCharacter[1].base;
+ attributes.rea_aug = attributesCharacter[2].modified - attributesCharacter[2].base;
+ attributes.str_aug = attributesCharacter[3].modified - attributesCharacter[3].base;
+ attributes.wil_aug = attributesCharacter[4].modified - attributesCharacter[4].base;
+ attributes.log_aug = attributesCharacter[5].modified - attributesCharacter[5].base;
+ attributes.int_aug = attributesCharacter[6].modified - attributesCharacter[6].base;
+ attributes.cha_aug = attributesCharacter[7].modified - attributesCharacter[7].base;
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Attributes " +err
+ }
+
+ if(goodcode){
+ try{
+ setAttrs(attributes);
+ return "Main Tab import successfull\n";
+ } catch(err){
+ return "Error setting Attributes: " + err;
+ }
+ } else{
+ return error;
+ }
+}
+
+async function importSkillsTabHeroLab(experimental, character) {
+
+ var goodcode = true;
+ var error = "";
+ var attributes = {};
+
+ var index=[];
+ for(var i=1;i<73;i++)
+ {
+ var name='skillname'+i;
+ index[i-1]=name;
+ }
+
+ var names = await asw.getAttrs(index);
+ var exotics=73;
+ try{
+ console.log("Importing Skills");
+
+ character.skills.active.forEach(skill => {
+ for(var j=1; j<73; j++){
+ var compname='skillname'+j;
+ if((names[compname] == skill.name)||(skill.name == "Locksmith" && j==29) || (skill.name == "Pilot Ground Craft" && j==55)){
+ attributes["skillrating"+j] = skill.modified;
+ attributes["skillbonus"+j] = skill.modified - skill.base;
+
+ if(skill.specialization != null) {
+ attributes["skillspec"+j] = skill.specialization.bonustext;
+ }
+ else {
+ attributes["skillspec"+j]="none";
+ }
+ }
+ }
+ })
+
+ //knowledge skills
+ character.skills.knowledge.forEach(skill => {
+ var newrowid = generateRowID();
+ attributes["repeating_knowledge_"+newrowid+"_knowledgename"] = skill.name;
+ if(skill.skillcategory_english != null){
+ attributes["repeating_knowledge_"+newrowid+"_knowledgeattr"] = "@{"+skill.skillcategory_english.toLowerCase();
+ }
+
+ attributes["repeating_knowledge_"+newrowid+"_knowledgerating"] = skill.base;
+ attributes["repeating_knowledge_"+newrowid+"_knowledgebonus"] = skill.modified - skill.base;
+
+ if(skill.specialization != null) {
+ attributes["repeating_knowledge_"+newrowid+"_knowledgespec"] = skill.specialization.bonustext;
+ }
+ else {
+ attributes["repeating_knowledge_"+newrowid+"_knowledgespec"] = "none";
+ }
+ });
+
+ //language skills
+ character.skills.language.forEach(skill => {
+ var newrowid = generateRowID();
+ attributes["repeating_knowledge_"+newrowid+"_knowledgename"] = skill.name;
+ if(skill.skillcategory_english != null){
+ attributes["repeating_knowledge_"+newrowid+"_knowledgeattr"] = "@{"+skill.skillcategory_english.toLowerCase();
+ }
+
+ attributes["repeating_knowledge_"+newrowid+"_knowledgerating"] = skill.base;
+ attributes["repeating_knowledge_"+newrowid+"_knowledgebonus"] = skill.modified - skill.base;
+
+ if(skill.text === "N") {
+ attributes["repeating_knowledge_"+newrowid+"_knowledgerating"] = 100;
+ attributes["repeating_knowledge_"+newrowid+"_knowledgenotes"] = "Natural";
+
+ }
+
+ if(skill.specialization != null) {
+ attributes["repeating_knowledge_"+newrowid+"_knowledgespec"] = skill.specialization.bonustext;
+ }
+ else {
+ attributes["repeating_knowledge_"+newrowid+"_knowledgespec"] = "none";
+ }
+ attributes["repeating_knowledge_"+newrowid+"_knowledgeattr"]="@{language";
+ });
+
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Skills: "+ err;
+ }
+
+ if(goodcode){
+ try{
+ clearSkills(experimental);
+ setAttrs(attributes);
+ return "Skill Tab import successfull\n";
+ } catch(err){
+ return "Error setting Attributes: " + err;
+ }
+ } else{
+ return error;
+ }
+}
+
+async function importEnhancementTabHeroLab(text, character) {
+
+ var goodcode = true;
+ var error = "";
+ var attributes = {};
+
+ try{
+ if(character.qualities != null){
+ console.log("Importing qualities");
+ if(character.qualities.positive != undefined){
+ for(var i=0; i< character.qualities.positive.length; i++){
+ var newrowid=generateRowID();
+ attributes["repeating_posqualities_"+newrowid+"_posqualityname"] = character.qualities.positive[i].name;
+ attributes["repeating_posqualities_"+newrowid+"_posqualitykarma"] = character.qualities.positive[i].traitcost.bp;
+ attributes["repeating_posqualities_"+newrowid+"_posqualnotes"] = character.qualities.positive[i].description;
+ if( character.qualities.positive[i].rank != null) {
+ attributes["repeating_posqualities_"+newrowid+"_posqualitydescription"] = character.qualities.positive[i].rank;
+ }
+ }
+ }
+ if(character.qualities.positive != undefined){
+ for(var i=0; i< character.qualities.negative.length; i++){
+ var newrowid=generateRowID();
+ attributes["repeating_negqualities_"+newrowid+"_negqualityname"] = character.qualities.negative[i].name;
+ attributes["repeating_negqualities_"+newrowid+"_negqualitykarma"] = character.qualities.negative[i].traitcost.bp;
+ attributes["repeating_negqualities_"+newrowid+"_negqualnotes"] = character.qualities.negative[i].description;
+ if(character.qualities.negative[i].rank != null) {
+ attributes["repeating_negqualities_"+newrowid+"_negqualitydescription"] = character.qualities.negative[i].rank
+ }
+ }
+ }
+ }
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Qualities " +err
+ }
+
+ try{
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }catch(err){
+ goodcode=false;
+ error="Error with Powers " +err
+ }
+
+ try{
+ var essence=0.0;
+ console.log("Importing Cyberware");
+ for(var i=0; i< character.gear.augmentations.cyberware.length; i++){
+ let cyberware = character.gear.augmentations.cyberware[i];
+ var newrowid=generateRowID();
+
+ attributes["repeating_ware_"+newrowid+"_warename"] = cyberware.name;
+
+ if(cyberware.rating !=null) {
+ attributes["repeating_ware_"+newrowid+"_waredescription"] = cyberware.rating;
+ }
+
+ if(cyberware.description != null) {
+ attributes["repeating_ware_"+newrowid+"_warenotes"] = cyberware.description;
+ }
+
+ if(cyberware.essencecost != null) {
+ attributes["repeating_ware_"+newrowid+"_warekarma"] = cyberware.essencecost;
+ essence += Number(cyberware.essencecost.replace(",","."));
+ }
+ }
+
+ console.log("Importing Bioware");
+ for(var i=0; i< character.gear.augmentations.bioware.length; i++){
+ let bioware = character.gear.augmentations.bioware[i];
+ var newrowid=generateRowID();
+
+ attributes["repeating_ware_"+newrowid+"_warename"] = bioware.name;
+
+ if(bioware.rating !=null) {
+ attributes["repeating_ware_"+newrowid+"_waredescription"] = bioware.rating;
+ }
+
+ if(bioware.description != null) {
+ attributes["repeating_ware_"+newrowid+"_warenotes"] = bioware.description;
+ }
+
+ if(bioware.essencecost != null) {
+ attributes["repeating_ware_"+newrowid+"_warekarma"] = bioware.essencecost;
+ essence += Number(bioware.essencecost.replace(",","."));
+ }
+ }
+ attributes.ess_total = 6-essence;
+ }catch(err){
+ goodcode=false;
+ error= error + "\n" + "Error with Ware " +err
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if(goodcode){
+ try{
+ clearEnhancements(text.experimental);
+ setAttrs(attributes);
+ return "Enhancement Tab import successfull\n";
+ } catch(err){
+ return "Error setting Attributes: " + err;
+ }
+ } else{
+ return error;
+ }
+}
\ No newline at end of file
diff --git a/Shadowrun5th/js/importSingleDrone.js b/Shadowrun5th/js/importSingleDrone.js
deleted file mode 100644
index 790fbb8ad4..0000000000
--- a/Shadowrun5th/js/importSingleDrone.js
+++ /dev/null
@@ -1,103 +0,0 @@
-function importSingleDrone(drone, attributes) {
-
- var newrowid = generateRowID();
- attributes["repeating_drones_"+newrowid+"_dronename"]= drone.name;
- attributes["repeating_drones_"+newrowid+"_dronehand"]= drone.handling.match(/\d+/);
- attributes["repeating_drones_"+newrowid+"_dronespeed"]= drone.speed.match(/\d+/);
- attributes["repeating_drones_"+newrowid+"_droneaccl"]= drone.accel.match(/\d+/);
- attributes["repeating_drones_"+newrowid+"_dronepilot"]= drone.pilot;
- attributes["repeating_drones_"+newrowid+"_dronesens"]= drone.sensor;
- attributes["repeating_drones_"+newrowid+"_droneprice"]= drone.cost;
- attributes["repeating_drones_"+newrowid+"_dronebody"]= drone.body;
- attributes["repeating_drones_"+newrowid+"_dronearmor"]= drone.armor;
- attributes["repeating_drones_"+newrowid+"_dronenotes"]="";
-
- if(drone.mods != null){
- if(drone.mods.mod.length > 1){
- var weaponnumber = 1;
- for(var j = 0; j < drone.mods.mod.length; j++){
- weaponnumber = importSingleDroneMod(drone.mods.mod[j], newrowid, attributes, weaponnumber);
- }
- }else{
- attributes["repeating_drones_"+newrowid+"_dronenotes"] += drone.mods.mod.name + "\n";
- importSingleDroneMod(drone.mods.mod, newrowid, attributes, weaponnumber);
- }
- }
-}
-
-const importSingleDroneMod = (mod, newrowid, attributes, weaponnumber) => {
- attributes["repeating_drones_" + newrowid + "_dronenotes"] += mod.name + "\n";
- if(mod.weapons != null && mod.weapons.weapon != null){
- if(mod.weapons.length > 1){
- return importSingleDroneWeapon(mod.weapons.weapon[0], newrowid, attributes, weaponnumber);
- }
- else {
- return importSingleDroneWeapon(mod.weapons.weapon, newrowid, attributes, weaponnumber);
- }
- }
- return weaponnumber;
-}
-
-const importSingleDroneWeapon = (weapon, newrowid, attributes, weaponnumber) => {
- attributes["repeating_drones_"+newrowid+"_droneweaponname" + weaponnumber] = weapon.name;
- attributes["repeating_drones_"+newrowid+"_droneweaponaccuracy"+ weaponnumber] = weapon.accuracy.match(/\d+/g).pop();
- if(weapon.type == "Ranged")
- attributes["repeating_drones_"+newrowid+"_droneweaponrc"+ weaponnumber] = weapon.rc.match(/\d+/g).pop();
- if(Number(weapon.ap) != "NaN"){
- attributes["repeating_drones_"+newrowid+"_droneweaponap"+ weaponnumber] = weapon.ap;
- }else{
- attributes["repeating_drones_"+newrowid+"_droneweaponap"+ weaponnumber] = 0;
- }
- attributes["repeating_drones_"+newrowid+"_droneweapondv"+ weaponnumber] = weapon.damage_english.match(/\d*/);
- attributes["repeating_drones_"+newrowid+"_droneweapondmgtype"+ weaponnumber] = weapon.damage_english.match(/^\d*/);
- attributes["repeating_drones_"+newrowid+"_droneweaponnotes"+ weaponnumber] = "";
- if(typeof weapon.accessories != "undefined"){
- if(weapon.accessories.accessory.length > 1){
- for(var h = 0; h < weapon.accessories.accessory.length; h++){
- attributes["repeating_drones_"+newrowid+"_droneweaponnotes"+ weaponnumber] += weapon.accessories.accessory[h].name+"\n";
- }
- }else{
- attributes["repeating_drones_"+newrowid+"_droneweaponnotes"+ weaponnumber] += weapon.accessories.accessory.name+"\n";
- }
- }
- return weaponnumber +1;
-}
-const importAutosofts = (drone, newrowid, attributes) => {
-
- let autosofts;
- if(drone.gears.gear.length > 1) {
- autosofts = drone.gears.gear.filter(gear => gear.category_english.includes("Autosofts"));
- }
- else {
- if(drone.gears.gear.category_english == "Autosofts") {
- autosofts = [drone.gears.gear];
- }
- }
-
- if(autosofts != null) {
- //search for clearsight
- let clearsight = autosofts.find(soft => soft.name_english.includes("Clearsight Autosoft"));
- if(clearsight != null) {
- attributes["repeating_drones_"+newrowid+"_droneperceptionsoft"] = clearsight.rating;
- }
-
- //Maneuvering
- let maneuvering = autosofts.find(soft => soft.name_english.includes("Maneuvering Autosoft"));
- if(maneuvering != null) {
- attributes["repeating_drones_"+newrowid+"_dronemaneuversoft"] = maneuvering.rating;
- }
-
- //stealth
- let stealth = autosofts.find(soft => soft.name_english.includes("Stealth Autosoft"));
- if(stealth != null) {
- attributes["repeating_drones_"+newrowid+"_dronesneaksoft"] = stealth.rating;
- }
-
- //evasion
- let evasion = autosofts.find(soft => soft.name_english.includes("Evasion Autosoft"));
- if(evasion != null) {
- attributes["repeating_drones_"+newrowid+"_dronedodgesoft"] = evasion.rating;
- }
- }
-
-}
\ No newline at end of file
diff --git a/Shadowrun5th/js/importSingleRepeatingWeapon.js b/Shadowrun5th/js/importSingleRepeatingWeapon.js
deleted file mode 100644
index bd0fd0a731..0000000000
--- a/Shadowrun5th/js/importSingleRepeatingWeapon.js
+++ /dev/null
@@ -1,155 +0,0 @@
-function provideRepeatingWeaponRowName(weapon) {
-
- var weaponrow = "weapons";
-
- switch(weapon.skill) {
- case "Pistols":
- weaponrow = weapon.skill.replaceAll(' ', '').toLowerCase();
- break;
- case "Automatics":
- weaponrow = weapon.skill.replaceAll(' ', '').toLowerCase();
- break;
- case "Longarms":
- weaponrow = weapon.skill.replaceAll(' ', '').toLowerCase();
- break;
- case "Heavy Weapons":
- weaponrow = weapon.skill.replaceAll(' ', '').toLowerCase();
- break;
- case "Unarmed Combat":
- weaponrow = "closecombat"
- break;
- case "Blades":
- weaponrow = "closecombat"
- break;
- case "Clubs":
- weaponrow = "closecombat"
- break;
- }
-
- var row = "repeating_" + weaponrow + "_" + generateRowID() + "_";
-
- return row;
-}
-
-async function importSingleRepeatingWeapon(text, weapon, ammunition, attributes) {
- var row = provideRepeatingWeaponRowName(weapon);
- console.log(row);
- if(weapon.type == "Ranged"){
- attributes[row + "weaponismelee"] = 0;
- attributes[row + "weaponrc"] = weapon.rc.match(/\d+/g).pop()-Math.ceil((parseInt(attributes.str_base) + parseInt(attributes.str_aug))/3)- 1;
- if(!weapon.rawdamage.includes("STR") && weapon.rawdamage.match(/\d+/) !== null) {
- attributes[row + "weapondv"] = weapon.rawdamage.match(/\d+/)[0];
- }
- else {
- attributes[row + "weapondv"] = weapon.damage.match(/\d+/) != null ? weapon.damage.match(/\d+/)[0] : 0;
- }
-
- attributes[row + "weapondmgtype"] = weapon.rawdamage.match(/S\(e\)|S\b|P|Special\b/) != null ? weapon.rawdamage.match(/S\(e\)|S\b|P|Special\b/)[0] : 0;
- }else{
- attributes[row + "weaponismelee"] = "on";
- attributes[row + "weaponreach"] = weapon.reach;
- attributes[row + "weapondv"] = weapon.damage_english.match(/\d+/) != null ? weapon.damage_english.match(/\d+/)[0] : 0;
- attributes[row + "weapondmgtype"] = weapon.damage_english.match(/S\(e\)|S\b|P|Special\b/) != null ? weapon.damage_english.match(/S\(e\)|S\b|P|Special\b/)[0] : 0;
- }
-
- let skills = [];
- for(var i=43;i<52;i++)
- {
- var name = 'skillname'+i;
- skills.push(name);
- var rating = 'skillrating'+i;
- skills.push(rating);
- var bonus = 'skillbonus'+i;
- skills.push(bonus);
- var attr = 'skillattr_value'+i;
- skills.push(attr);
- }
- skills = await asw.getAttrs(skills);
- for(var i=43; i<52; i++)
- {
- var compname = 'skillname'+i;
- var rating = 'skillrating'+i;
- var bonus = 'skillbonus'+i;
- var skillattr = 'skillattr_value'+i;
-
- if(skills[compname] == weapon.skill){
- attributes[row + "weaponcategory"] = "@{skilldicepool"+i+"}";
- let attribute = await asw.getAttrs([skillattr]);
- let attrTotal = attribute[skillattr].replace(/[^a-zA-Z0-9_]/g, "");
- let attributeSum = await asw.getAttrs([attrTotal]);
- let targetAttributes = attributeSum[attrTotal].replace(/[+]/g, ",").replace(/[^a-zA-Z0-9_,]/g, "").split(",");
- let attributesValues = [attributes[targetAttributes[0]], attributes[targetAttributes[1]]]
- attributes[row + "weaponbonus"] = weapon.dicepool - skills[rating] - skills[bonus] - attributesValues.reduce((a,b) => parseInt(a) + parseInt(b));
- }
- }
-
- attributes[row + "weaponname"] = weapon.name;
- attributes[row + "weaponaccuracy"] = weapon.accuracy.match(/\d+/g).pop();
- if(weapon.ap == null || isNaN(weapon.ap)){
- attributes[row + "weaponap"] = 0;
- }else{
- attributes[row + "weaponap"] = weapon.ap;
- if(weapon.rawap != null) {
- attributes[row + "weaponap"] = weapon.rawap;
- }
- }
- attributes[row + "weaponnotes"] = "";
-
- if(typeof weapon.accessories != "undefined"){
- if(weapon.accessories.accessory.length>1){
- for(var j=0; j 1){
- let amountImported = 0;
- for(var j=0; j < weapon.clips.clip.length && amountImported < 4; j++){
-
- if(weapon.clips.clip[j].location === "loaded") {
- //skip loaded, they will be found later anyway
- continue;
- }
-
- var newrowid=generateRowID();
- //find ammo to get stats
- ammo = ammunition.find(clip => clip.guid === weapon.clips.clip[j].id);
-
- if(ammo != null && !ammo.name_english.includes("Regular")) {
- importRepeatingWeaponAmmo(row, ammo, amountImported, attributes);
- amountImported++;
- }
- }
- }else{
- var newrowid = generateRowID();
- //find ammo to get stats
- ammo = ammunition.find(clip => clip.guid === weapon.clips.clip.id);
-
- if(ammo != null) {
- importRepeatingWeaponAmmo(row, ammo, 0, attributes);
- }
- }
- }
-}
-
-async function importRepeatingWeaponAmmo(row, ammunition, number, attributes) {
-
- attributes[row + "ammoname"+number] = ammo.name;
-
- attributes[row + "ammodv" + number] = ammo.weaponbonusdamage_english != null ? ammo.weaponbonusdamage_english.substring(0,2) : 0;
- if(ammo.weaponbonusdamage_english != null) {
- attributes[row + "ammodmgtype" + number] = ammo.weaponbonusdamage_english.substring(2);
- }
-
- if(ammo.name_english === "Ammo: Stick-n-Shock") {
- attributes[row + "_ammoap" + number] = -5 - attributes[row + "weaponap"]
- }
- else {
- attributes[row + "ammoap" + number] = ammo.weaponbonusap != null? ammo.weaponbonusap : 0;
- }
- attributes[row + "ammoacc" + number] = ammo.weaponbonusacc != null ? ammo.weaponbonusacc : 0;
-}
\ No newline at end of file
diff --git a/Shadowrun5th/js/importSingleSpell.js b/Shadowrun5th/js/importSingleSpell.js
deleted file mode 100644
index e221a2d234..0000000000
--- a/Shadowrun5th/js/importSingleSpell.js
+++ /dev/null
@@ -1,40 +0,0 @@
-function importSingleSpell(spell, attributes, spellcasting, ritual, alchemy) {
- var category = "spells";
- if(spell.category_english == "Rituals") {
- category = "rituals"
- }
- if(spell.alchemy == "True"){
- category = "alchemy"
- }
-
- var row = "repeating_" + category + "_" + generateRowID();
-
- attributes[row + "_spellname"] = spell.name;
- attributes[row + "_spelltype"] = spell.type;
- attributes[row + "_spellcategory"] = spell.category;
- if(spell.notes != null){
- attributes[row + "_spelldescription"] = spell.notes;
- }
- if(spell.dv.match(/(\-|\+)\d/) != null) {
- attributes[row + "_spelldrain"] = spell.dv.match(/(\-|\+)\d/)[0];
- }
- else {
- attributes[row + "_spelldrain"] = "-0";
- }
-
-
- if(spell.category_english == "Rituals"){
- attributes[row + "_spellschool"] = "@{skilldicepool67}";
- attributes[row + "_spelldrain"] = "*2";
- attributes[row + "_spellbonus"] = spell.dicepool - ritual;
- } else {
- attributes[row + "_spellbonus"] = spell.dicepool - spellcasting;
- if(spell.alchemy == "True"){
- attributes[row + "_spellschool"] = "@{skilldicepool58}";
- attributes[row + "_spellbonus"] = spell.dicepool - alchemy;
- }
- }
-
- attributes[row + "_spellrange"] = spell.range;
- attributes[row + "_spellduration"] = spell.duration;
-}
\ No newline at end of file
diff --git a/Shadowrun5th/js/importSingleVehicle.js b/Shadowrun5th/js/importSingleVehicle.js
deleted file mode 100644
index e799f829d2..0000000000
--- a/Shadowrun5th/js/importSingleVehicle.js
+++ /dev/null
@@ -1,65 +0,0 @@
-function importSingleVehicle(vehicle, attributes) {
-
- var newrowid = generateRowID();
- attributes["repeating_vehicles_"+newrowid+"_vehiclename"]= vehicle.name;
- attributes["repeating_vehicles_"+newrowid+"_vehiclehand"]= vehicle.handling.match(/\d+/);
- attributes["repeating_vehicles_"+newrowid+"_vehiclespeed"]= vehicle.speed.match(/\d+/);
- attributes["repeating_vehicles_"+newrowid+"_vehicleaccl"]= vehicle.accel.match(/\d+/);
- attributes["repeating_vehicles_"+newrowid+"_vehiclepilot"]= vehicle.pilot;
- attributes["repeating_vehicles_"+newrowid+"_vehiclesens"]= vehicle.sensor;
- attributes["repeating_vehicles_"+newrowid+"_vehicleseats"]= vehicle.seats;
- attributes["repeating_vehicles_"+newrowid+"_vehicleprice"]= vehicle.cost;
- attributes["repeating_vehicles_"+newrowid+"_vehiclebody"]= vehicle.body;
- attributes["repeating_vehicles_"+newrowid+"_vehiclearmor"]= vehicle.armor;
- attributes["repeating_vehicles_"+newrowid+"_vehiclenotes"]="";
-
- if(vehicle.mods != null){
- if(vehicle.mods.mod.length > 1){
- var weaponnumber = 1;
- for(var j = 0; j < vehicle.mods.mod.length; j++){
- weaponnumber = importSingleVehicleMod(vehicle.mods.mod[j], newrowid, attributes, weaponnumber);
- }
- }else{
- attributes["repeating_vehicles_"+newrowid+"_vehiclenotes"] += vehicle.mods.mod.name + "\n";
- importSingleVehicleMod(vehicle.mods.mod, newrowid, attributes, weaponnumber);
- }
- }
-}
-
-const importSingleVehicleMod = (mod, newrowid, attributes, weaponnumber) => {
- attributes["repeating_vehicles_" + newrowid + "_vehiclenotes"] += mod.name + "\n";
- if(mod.weapons != null && mod.weapons.weapon != null){
- if(mod.weapons.length > 1){
- return importSingleVehicleWeapon(mod.weapons.weapon[0], newrowid, attributes, weaponnumber);
- }
- else {
- return importSingleVehicleWeapon(mod.weapons.weapon, newrowid, attributes, weaponnumber);
- }
- }
- return weaponnumber;
-}
-
-const importSingleVehicleWeapon = (weapon, newrowid, attributes, weaponnumber) => {
- attributes["repeating_vehicles_"+newrowid+"_vehicleweaponname" + weaponnumber] = weapon.name;
- attributes["repeating_vehicles_"+newrowid+"_vehicleweaponaccuracy"+ weaponnumber] = weapon.accuracy.match(/\d+/g).pop();
- if(weapon.type == "Ranged")
- attributes["repeating_vehicles_"+newrowid+"_vehicleweaponrc"+ weaponnumber] = weapon.rc.match(/\d+/g).pop();
- if(Number(weapon.ap) != "NaN"){
- attributes["repeating_vehicles_"+newrowid+"_vehicleweaponap"+ weaponnumber] = weapon.ap;
- }else{
- attributes["repeating_vehicles_"+newrowid+"_vehicleweaponap"+ weaponnumber] = 0;
- }
- attributes["repeating_vehicles_"+newrowid+"_vehicleweapondv"+ weaponnumber] = weapon.damage_english.match(/\d*/);
- attributes["repeating_vehicles_"+newrowid+"_vehicleweapondmgtype"+ weaponnumber] = weapon.damage_english.match(/^\d*/);
- attributes["repeating_vehicles_"+newrowid+"_vehicleweaponnotes"+ weaponnumber] = "";
- if(typeof weapon.accessories != "undefined"){
- if(weapon.accessories.accessory.length > 1){
- for(var h = 0; h < weapon.accessories.accessory.length; h++){
- attributes["repeating_vehicles_"+newrowid+"_vehicleweaponnotes"+ weaponnumber] += weapon.accessories.accessory[h].name+"\n";
- }
- }else{
- attributes["repeating_vehicles_"+newrowid+"_vehicleweaponnotes"+ weaponnumber] += weapon.accessories.accessory.name+"\n";
- }
- }
- return weaponnumber +1;
-}
\ No newline at end of file
diff --git a/Shadowrun5th/js/importSingleWeapon.js b/Shadowrun5th/js/importSingleWeapon.js
deleted file mode 100644
index 6ae3fa166c..0000000000
--- a/Shadowrun5th/js/importSingleWeapon.js
+++ /dev/null
@@ -1,102 +0,0 @@
-function importSingleWeapon(text, weapon, number, ammunition, attributes) {
- if(weapon.type == "Ranged"){
- attributes["weaponismelee"+number] = 0;
- attributes["weaponrc"+number] = weapon.rc.match(/\d+/g).pop()-Math.ceil((parseInt(attributes.str_base) + parseInt(attributes.str_aug))/3)- 1;
-
- if(weapon.rawdamage.match(/\d+/) !== null && !weapon.rawdamage.includes("STR")) {
- attributes["weapondv"+number] = weapon.rawdamage.match(/\d+/)[0];
- }
- else if(weapon.rawdamage.includes("STR")) {
- attributes["weapondv"+number] = weapon.damage.match(/\d+/)[0];
- }
- else {
- attributes["weapondv"+number] = weapon.damage.match(/\d+/) != null ? weapon.damage.match(/\d+/)[0] : 0;
- }
-
- attributes["weapondmgtype"+number] = weapon.rawdamage.match(/S\(e\)|S\b|P|Special\b/) != null ? weapon.rawdamage.match(/S\(e\)|S\b|P|Special\b/)[0] : 0;
- }else{
- attributes["weaponismelee"+number] = "on";
- attributes["weaponreach"+number] = weapon.reach;
- attributes["weapondv"+number] = weapon.damage_english.match(/\d+/)[0];
- attributes["weapondmgtype"+number] = weapon.damage_english.match(/S\(e\)|S\b|P|Special\b/) != null ? weapon.damage_english.match(/S\(e\)|S\b|P|Special\b/)[0] : 0;
- }
-
- attributes["weaponname"+number] = weapon.name;
- attributes["weaponaccuracy"+number] = weapon.accuracy.match(/\d+/g).pop();
- if(isNaN(weapon.ap)){
- attributes["weaponap"+number] = 0;
- }else{
- attributes["weaponap"+number] = weapon.ap;
- if(weapon.rawap != null) {
- attributes["weaponap"+number] = weapon.rawap;
- }
- }
- attributes["weaponnotes"+number] = "";
-
- if(typeof weapon.accessories != "undefined"){
- if(weapon.accessories.accessory.length>1){
- for(var j=0; j1){
- for(var j=0; j clip.guid === weapon.clips.clip[j].id);
- if(ammo != null) {
- importRepeatingAmmo(ammo, number, attributes);
- }
- }
- }else{
- var newrowid = generateRowID();
- //find ammo to get stats
- ammo = ammunition.find(clip => clip.guid === weapon.clips.clip.id);
-
- if(ammo != null) {
- importRepeatingAmmo(ammo, number, attributes);
- }
- }
- }
-}
-
-function importRepeatingAmmo(ammunition, number, attributes) {
-
- var newrowid = generateRowID();
-
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoname"] = ammo.name;
-
- if(ammo.weaponbonusdamage_english != null && ammo.weaponbonusap != null && ammo.weaponbonusacc != null) {
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammodv"] = ammo.weaponbonusdamage_english.substring(0,2);
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammodmgtype"] = ammo.weaponbonusdamage_english.substring(2);
- if(ammo.name_english === "Ammo: Stick-n-Shock") {
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoap"] = -5 - attributes["weaponap" + number]
- }
- else {
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoap"] = ammo.weaponbonusap;
- }
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoacc"] = ammo.weaponbonusacc;
- }
- else {
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammodv"] = 0;
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammodmgtype"] = 0;
- if(ammo.name_english === "Ammo: Stick-n-Shock") {
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoap"] = -5 - attributes["weaponap" + number]
- }
- else {
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoap"] = 0;
- }
- attributes["repeating_ammotype"+number+"_"+newrowid+"_ammoacc"] = 0;
- }
-}
\ No newline at end of file
diff --git a/Shadowrun5th/js/initAndMigrateSheet.js b/Shadowrun5th/js/initAndMigrateSheet.js
deleted file mode 100644
index 98a2307be5..0000000000
--- a/Shadowrun5th/js/initAndMigrateSheet.js
+++ /dev/null
@@ -1,106 +0,0 @@
-on("sheet:opened", function() {
- var names=[];
- for(var i=1; i<77; i++)
- {
- var name='skillspec'+i;
- names[i-1]=name;
- }
- getAttrs(names, function(values) {
- for(var prop in values)
- {
- if(values[prop]=="0")
- {
- values[prop]="none";
- }
- }
- values.warningcheckbox=0;
- values.chummercheckbox=0;
- values.chummertext="In Chummer make sure to mark your character as created\nwith a created character go to File->Export->Export JSON\ncopy the file and paste it into this textfield overriding this text\nclick import and accept\nWhen using Chummer 5.213.95 or later the import is language independent\nIf you find bugs, please report them at https://github.com/Roll20/roll20-character-sheets/issues";
- values.experimental=0;
- values.nightly=0;
- setAttrs(values);
- });
-
- var armors=[];
- for(var i=1; i <9; i++) {
- armors.push('armorname'+i);
- armors.push('armorcapacity'+i);
- armors.push('armornotes'+i);
- armors.push('armorrating'+i);
- }
- armors.push('armormigration042021');
- getAttrs(armors, function(values) {
- var attributes={};
- keys = Object.keys(values);
-
- if(values.armormigration042021){
- return;
- }
-
- if(keys.includes('armorname1') && values.armorname1 !== null) {
- var newrowid=generateRowID()
- attributes["repeating_armors_"+newrowid+"_armorname"]=values.armorname1;
- attributes["repeating_armors_"+newrowid+"_armorrating"]=!!values.armorrating1 ? values.armorrating1 : "0";
- attributes["repeating_armors_"+newrowid+"_armornotes"]=!!values.armornotes1 ? values.armornotes1 : "";
- attributes["repeating_armors_"+newrowid+"_armorcapacity"]=!!values.armorcapacity1 ? values.armorcapacity1 : "0";
- }
-
- if(keys.includes('armorname2') && values.armorname2 !== null) {
- var newrowid=generateRowID()
- attributes["repeating_armors_"+newrowid+"_armorname"]=values.armorname2;
- attributes["repeating_armors_"+newrowid+"_armorrating"]=!!values.armorrating2 ? values.armorrating2 : "0";
- attributes["repeating_armors_"+newrowid+"_armornotes"]=!!values.armornotes2 ? values.armornotes2 : "";
- attributes["repeating_armors_"+newrowid+"_armorcapacity"]=!!values.armorcapacity2 ? values.armorcapacity2 : "0";
- }
-
- if(keys.includes('armorname3') && values.armorname3 !== null) {
- var newrowid=generateRowID()
- attributes["repeating_armors_"+newrowid+"_armorname"]=values.armorname3;
- attributes["repeating_armors_"+newrowid+"_armorrating"]=!!values.armorrating3 ? values.armorrating3 : "0";
- attributes["repeating_armors_"+newrowid+"_armornotes"]=!!values.armornotes3 ? values.armornotes3 : "";
- attributes["repeating_armors_"+newrowid+"_armorcapacity"]=!!values.armorcapacity3 ? values.armorcapacity3 : "0";
- }
-
- if(keys.includes('armorname4') && values.armorname4 !== null) {
- var newrowid=generateRowID()
- attributes["repeating_armors_"+newrowid+"_armorname"]=values.armorname4;
- attributes["repeating_armors_"+newrowid+"_armorrating"]=!!values.armorrating4 ? values.armorrating4 : "0";
- attributes["repeating_armors_"+newrowid+"_armornotes"]=!!values.armornotes4 ? values.armornotes4 : "";
- attributes["repeating_armors_"+newrowid+"_armorcapacity"]=!!values.armorcapacity4 ? values.armorcapacity4 : "0";
- }
-
- if(keys.includes('armorname5') && values.armorname5 !== null) {
- var newrowid=generateRowID()
- attributes["repeating_armors_"+newrowid+"_armorname"]=values.armorname5;
- attributes["repeating_armors_"+newrowid+"_armorrating"]=!!values.armorrating5 ? values.armorrating5 : "0";
- attributes["repeating_armors_"+newrowid+"_armornotes"]=!!values.armornotes5 ? values.armornotes5 : "";
- attributes["repeating_armors_"+newrowid+"_armorcapacity"]=!!values.armorcapacity5 ? values.armorcapacity5 : "0";
- }
-
- if(keys.includes('armorname6') && values.armorname6 !== null) {
- var newrowid=generateRowID()
- attributes["repeating_armors_"+newrowid+"_armorname"]=values.armorname6;
- attributes["repeating_armors_"+newrowid+"_armorrating"]=!!values.armorrating6 ? values.armorrating6 : "0";
- attributes["repeating_armors_"+newrowid+"_armornotes"]=!!values.armornotes6 ? values.armornotes6 : "";
- attributes["repeating_armors_"+newrowid+"_armorcapacity"]=!!values.armorcapacity6 ? values.armorcapacity6 : "0";
- }
-
- if(keys.includes('armorname7') && values.armorname7 !== null) {
- var newrowid=generateRowID()
- attributes["repeating_armors_"+newrowid+"_armorname"]=values.armorname7;
- attributes["repeating_armors_"+newrowid+"_armorrating"]=!!values.armorrating7 ? values.armorrating7 : "0";
- attributes["repeating_armors_"+newrowid+"_armornotes"]=!!values.armornotes7 ? values.armornotes7 : "";
- attributes["repeating_armors_"+newrowid+"_armorcapacity"]=!!values.armorcapacity7 ? values.armorcapacity7 : "0";
- }
-
- if(keys.includes('armorname8') && values.armorname8 !== null) {
- var newrowid=generateRowID()
- attributes["repeating_armors_"+newrowid+"_armorname"]=values.armorname8;
- attributes["repeating_armors_"+newrowid+"_armorrating"]=!!values.armorrating8 ? values.armorrating8 : "0";
- attributes["repeating_armors_"+newrowid+"_armornotes"]=!!values.armornotes8 ? values.armornotes8 : "";
- attributes["repeating_armors_"+newrowid+"_armorcapacity"]=!!values.armorcapacity8 ? values.armorcapacity8 : "0";
- }
- attributes["armormigration042021"] = true;
- setAttrs(attributes);
- });
-});
\ No newline at end of file