export default class CharacterImporter { // transform JSON from sw5e.com to Foundry friendly format // and insert new actor static async transform(rawCharacter) { const sourceCharacter = JSON.parse(rawCharacter); //source character const details = { species: sourceCharacter.attribs.find((e) => e.name == "race").current, background: sourceCharacter.attribs.find((e) => e.name == "background").current, alignment: sourceCharacter.attribs.find((e) => e.name == "alignment").current }; const hp = { value: sourceCharacter.attribs.find((e) => e.name == "hp").current, min: 0, max: sourceCharacter.attribs.find((e) => e.name == "hp").current, temp: sourceCharacter.attribs.find((e) => e.name == "hp_temp").current }; const ac = { value: sourceCharacter.attribs.find((e) => e.name == "ac").current }; const abilities = { str: { value: sourceCharacter.attribs.find((e) => e.name == "strength").current, proficient: sourceCharacter.attribs.find((e) => e.name == "strength_save_prof").current ? 1 : 0 }, dex: { value: sourceCharacter.attribs.find((e) => e.name == "dexterity").current, proficient: sourceCharacter.attribs.find((e) => e.name == "dexterity_save_prof").current ? 1 : 0 }, con: { value: sourceCharacter.attribs.find((e) => e.name == "constitution").current, proficient: sourceCharacter.attribs.find((e) => e.name == "constitution_save_prof").current ? 1 : 0 }, int: { value: sourceCharacter.attribs.find((e) => e.name == "intelligence").current, proficient: sourceCharacter.attribs.find((e) => e.name == "intelligence_save_prof").current ? 1 : 0 }, wis: { value: sourceCharacter.attribs.find((e) => e.name == "wisdom").current, proficient: sourceCharacter.attribs.find((e) => e.name == "wisdom_save_prof").current ? 1 : 0 }, cha: { value: sourceCharacter.attribs.find((e) => e.name == "charisma").current, proficient: sourceCharacter.attribs.find((e) => e.name == "charisma_save_prof").current ? 1 : 0 } }; const targetCharacter = { name: sourceCharacter.name, type: "character", data: { abilities: abilities, details: details, attributes: { ac: ac, hp: hp } } }; let actor = await Actor.create(targetCharacter); const profession = sourceCharacter.attribs.find((e) => e.name == "class").current; let professionLevel = sourceCharacter.attribs.find((e) => e.name == "class_display").current; professionLevel = parseInt(professionLevel.replace(/[^0-9]/g, "")); //remove a-z, leaving only integers this.addClasses(profession, professionLevel, actor); this.addSpecies(sourceCharacter.attribs.find((e) => e.name == "race").current, actor); } static async addClasses(profession, level, actor) { let classes = await game.packs.get("sw5e.classes").getContent(); let assignedClass = classes.find((c) => c.name === profession); assignedClass.data.data.levels = level; await actor.createEmbeddedEntity("OwnedItem", assignedClass.data, { displaySheet: false }); } static async addSpecies(race, actor) { const species = await game.packs.get("sw5e.species").getContent(); const assignedSpecies = species.find((c) => c.name === race); const activeEffects = assignedSpecies.data.effects[0].changes; const actorData = { data: { ...actor.data.abilities } }; activeEffects.map((effect) => { switch (effect.key) { case "data.abilities.str.value": actorData.data.abilities.str.value -= effect.value; break; case "data.abilities.dex.value": actorData.data.abilities.dex.value -= effect.value; break; case "data.abilities.con.value": actorData.data.abilities.con.value -= effect.value; break; case "data.abilities.int.value": actorData.data.abilities.int.value -= effect.value; break; case "data.abilities.wis.value": actorData.data.abilities.wis.value -= effect.value; break; case "data.abilities.cha.value": actorData.data.abilities.cha.value -= effect.value; break; default: break; } }); actor.update(actorData); await actor.createEmbeddedEntity("OwnedItem", assignedSpecies.data, { displaySheet: false }); } static addImportButton() { const header = $("#actors").find("header.directory-header"); const search = $("#actors").children().find("div.header-search"); const newImportButtonDiv = $("#actors").children().find("div.header-actions").clone(); const newSearch = search.clone(); search.remove(); newImportButtonDiv.attr("id", "character-sheet-import"); header.append(newImportButtonDiv); newImportButtonDiv.children("button").remove(); newImportButtonDiv.append( "" ); newSearch.appendTo(header); let characterImportButton = $("#cs-import-button"); characterImportButton.click(() => { let content = "