Skills and proficiencies done. Class & lvl bump broken.

This commit is contained in:
Mike Magarino 2020-12-09 21:39:51 -05:00
parent 9315047183
commit a291d0c909
5 changed files with 416 additions and 109 deletions

BIN
.DS_Store vendored

Binary file not shown.

BIN
examples/.DS_Store vendored

Binary file not shown.

View file

@ -0,0 +1,205 @@
export default class CharacterImporter {
// transform JSON from sw5e.com to Foundry friendly format
// and insert new actor
static transform(rawCharacter){
const sourceCharacter = JSON.parse(rawCharacter);
// v1 - just import the very basics: name, species, hp, ac and abilities
const name = sourceCharacter.name;
const species = sourceCharacter.attribs.find(o => o.name == "race").current;
const hp = sourceCharacter.attribs.find(o => o.name == "hp").current;
const hpTemp = sourceCharacter.attribs.find(o => o.name == "hp_temp").current;
const ac = sourceCharacter.attribs.find(o => o.name == "ac").current;
const strength = sourceCharacter.attribs.find(o => o.name == "strength").current;
const dexterity = sourceCharacter.attribs.find(o => o.name == "dexterity").current;
const constitution = sourceCharacter.attribs.find(o => o.name == "constitution").current;
const intelligence = sourceCharacter.attribs.find(o => o.name == "intelligence").current;
const wisdom = sourceCharacter.attribs.find(o => o.name == "wisdom").current;
const charisma = sourceCharacter.attribs.find(o => o.name == "charisma").current;
// v2 - import skills and proficiencies
const targetCharacter = {
name: sourceCharacter.name,
type: "character",
data: {
abilities: {
str: {
value: strength,
proficient: CharacterImporter.isProficient('strength_save', sourceCharacter)
},
dex: {
value: dexterity,
proficient: CharacterImporter.isProficient('dexterity_save', sourceCharacter)
},
con: {
value: constitution,
proficient: CharacterImporter.isProficient('constitution_save', sourceCharacter)
},
int: {
value: intelligence,
proficient: CharacterImporter.isProficient('intelligence_save', sourceCharacter)
},
wis: {
value: wisdom,
proficient: CharacterImporter.isProficient('wisdom_save', sourceCharacter)
},
cha: {
value: charisma,
proficient: CharacterImporter.isProficient('charisma_save', sourceCharacter)
},
},
attributes: {
ac: {
value: ac
},
hp: {
value: hp,
min: 0,
max: hp,
temp: hpTemp
}
}/*,
skills: {
"acr": {
value: CharacterImporter.fetchSkill('acrobatics', sourceCharacter),
"ability": "dex"
},
"ani": {
value: CharacterImporter.fetchSkill('animal_handling', sourceCharacter),
"ability": "wis"
},
"ath": {
value: CharacterImporter.fetchSkill('athletics', sourceCharacter),
"ability": "str"
},
"dec": {
value: CharacterImporter.fetchSkill('deception', sourceCharacter),
"ability": "cha"
},
"ins": {
value: CharacterImporter.fetchSkill('insight', sourceCharacter),
"ability": "wis"
},
"itm": {
value: CharacterImporter.fetchSkill('intimidation', sourceCharacter),
"ability": "cha"
},
"inv": {
value: CharacterImporter.fetchSkill('investigation', sourceCharacter),
"ability": "int"
},
"lor": {
value: CharacterImporter.fetchSkill('lore', sourceCharacter),
"ability": "int"
},
"med": {
value: CharacterImporter.fetchSkill('medicine', sourceCharacter),
"ability": "wis"
},
"nat": {
value: CharacterImporter.fetchSkill('nature', sourceCharacter),
"ability": "int"
},
"pil": {
value: CharacterImporter.fetchSkill('piloting', sourceCharacter),
"ability": "int"
},
"prc": {
value: CharacterImporter.fetchSkill('perception', sourceCharacter),
"ability": "wis"
},
"prf": {
value: CharacterImporter.fetchSkill('performance', sourceCharacter),
"ability": "cha"
},
"per": {
value: CharacterImporter.fetchSkill('persusasion', sourceCharacter),
"ability": "cha"
},
"slt": {
value: CharacterImporter.fetchSkill('sleight_of_hand', sourceCharacter),
"ability": "dex"
},
"ste": {
value: CharacterImporter.fetchSkill('stealth', sourceCharacter),
"ability": "dex"
},
"sur": {
value: CharacterImporter.fetchSkill('survival', sourceCharacter),
"ability": "wis"
},
"tec": {
value: CharacterImporter.fetchSkill('technology', sourceCharacter),
"ability": "int"
}
}*/
}
};
Actor.create(targetCharacter);
}
static addImportButton(html){
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("<button class='create-entity' id='cs-import-button'><i class='fas fa-upload'></i> Import Character</button>");
newSearch.appendTo(header);
let characterImportButton = $("#cs-import-button");
characterImportButton.click(ev => {
console.log("FISH: character import button pressed. 2")
let files = [];
let contentOld = '<h1>Saved Character JSON Import</h1> '
+ '<input class="file-picker" type="file" id="sw5e-character-json" accept=".json" multiple name="sw5e-character-json">'
+ '<hr>'
+ '<div class="sw5e-file-import"></div>';
let content = '<h1>Saved Character JSON Import</h1> '
+ '<label for="character-json">Paste character JSON here:</label> '
+ '</br>'
+ '<textarea id="character-json" name="character-json" rows="10" cols="50"></textarea>';
let importDialog = new Dialog({
title: "Import Character from SW5e.com",
content: content,
buttons: {
"Import": {
icon: '<i class="fas fa-file-import"></i>',
label: "Import Character",
callback: (e) => {
let characterData = $('#character-json').val();
console.log('Parsing Character JSON');
CharacterImporter.transform(characterData);
}
},
"Cancel": {
icon: '<i class="fas fa-times-circle"></i>',
label: "Cancel",
callback: () => {},
}
}
})
importDialog.render(true);
});
}
static isProficient(ability, sourceCharacter){
let abilitySaveProf = ability + "_save_prof";
let prof = sourceCharacter.attribs.find(o => o.name == abilitySaveProf).current;
if (prof == "(@{pb})") {
console.log("DEBUG Prof: true");
return 1
} else {
console.log("DEBUG Prof: false");
return 0
}
}
static fetchSkill(skill, source){
return source.attribs.find(o => o.name == skill+'_mod').current;
}
}

View file

@ -1,110 +1,220 @@
export default class CharacterImporter { export default class CharacterImporter {
// transform JSON from sw5e.com to Foundry friendly format
// and insert new actor
static transform(rawCharacter){
const sourceCharacter = JSON.parse(rawCharacter);
// v1 - just import the very basics: name, species, hp, ac and abilities
const name = sourceCharacter.name;
const species = sourceCharacter.attribs.find(o => o.name == "race").current;
const hp = sourceCharacter.attribs.find(o => o.name == "hp").current;
const hpTemp = sourceCharacter.attribs.find(o => o.name == "hp_temp").current;
const ac = sourceCharacter.attribs.find(o => o.name == "ac").current;
const strength = sourceCharacter.attribs.find(o => o.name == "strength").current;
const dexterity = sourceCharacter.attribs.find(o => o.name == "dexterity").current;
const constitution = sourceCharacter.attribs.find(o => o.name == "constitution").current;
const intelligence = sourceCharacter.attribs.find(o => o.name == "intelligence").current;
const wisdom = sourceCharacter.attribs.find(o => o.name == "wisdom").current;
const charisma = sourceCharacter.attribs.find(o => o.name == "charisma").current;
// transform JSON from sw5e.com to Foundry friendly format
// and insert new actor
static async transform(rawCharacter){
const sourceCharacter = JSON.parse(rawCharacter);
// v1 - just import the very basics: name, species, hp, ac and abilities
const name = sourceCharacter.name;
const species = sourceCharacter.attribs.find(o => o.name == "race").current;
const hp = sourceCharacter.attribs.find(o => o.name == "hp").current;
const hpTemp = sourceCharacter.attribs.find(o => o.name == "hp_temp").current;
const ac = sourceCharacter.attribs.find(o => o.name == "ac").current;
const strength = sourceCharacter.attribs.find(o => o.name == "strength").current;
const dexterity = sourceCharacter.attribs.find(o => o.name == "dexterity").current;
const constitution = sourceCharacter.attribs.find(o => o.name == "constitution").current;
const intelligence = sourceCharacter.attribs.find(o => o.name == "intelligence").current;
const wisdom = sourceCharacter.attribs.find(o => o.name == "wisdom").current;
const charisma = sourceCharacter.attribs.find(o => o.name == "charisma").current;
const targetCharacter = { // v2 - skills and proficiencies
name: sourceCharacter.name, const strengthSaveProf = sourceCharacter.attribs.find(o => o.name == 'strength_save_prof').current ? 1 : 0;
type: "character", const dexteritySaveProf = sourceCharacter.attribs.find(o => o.name == 'dexterity_save_prof').current ? 1 : 0;
data: { const constitutionSaveProf = sourceCharacter.attribs.find(o => o.name == 'constitution_save_prof').current ? 1 : 0;
abilities: { const intelligenceSaveProf = sourceCharacter.attribs.find(o => o.name == 'intelligence_save_prof').current ? 1 : 0;
str: { const wisdomSaveProf = sourceCharacter.attribs.find(o => o.name == 'wisdom_save_prof').current ? 1 : 0;
value: strength const charismaSaveProf = sourceCharacter.attribs.find(o => o.name == 'charisma_save_prof').current ? 1 : 0;
},
dex: { const acrobaticsSkill = sourceCharacter.attribs.find(o => o.name == 'acrobatics_bonus').current;
value: dexterity const animalHandlingSkill = sourceCharacter.attribs.find(o => o.name == 'animal_handling_bonus').current;
}, const athleticsSkill = sourceCharacter.attribs.find(o => o.name == 'athletics_bonus').current;
con: { const deceptionSkill = sourceCharacter.attribs.find(o => o.name == 'deception_bonus').current;
value: constitution const insightSkill = sourceCharacter.attribs.find(o => o.name == 'insight_bonus').current;
}, const intimidationSkill = sourceCharacter.attribs.find(o => o.name == 'intimidation_bonus').current;
int: { const investigationSkill = sourceCharacter.attribs.find(o => o.name == 'investigation_bonus').current;
value: intelligence const loreSkill = sourceCharacter.attribs.find(o => o.name == 'lore_bonus').current;
}, const medicineSkill = sourceCharacter.attribs.find(o => o.name == 'medicine_bonus').current;
wis: { const natureSkill = sourceCharacter.attribs.find(o => o.name == 'nature_bonus').current;
value: wisdom const pilotingSkill = sourceCharacter.attribs.find(o => o.name == 'piloting_bonus').current;
}, const perceptionSkill = sourceCharacter.attribs.find(o => o.name == 'perception_bonus').current;
cha: { const performanceSkill = sourceCharacter.attribs.find(o => o.name == 'performance_bonus').current;
value: charisma const persuasionSkill = sourceCharacter.attribs.find(o => o.name == 'persuasion_bonus').current;
}, const sleightOfHandSkill = sourceCharacter.attribs.find(o => o.name == 'sleight_of_hand_bonus').current;
const stealthSkill = sourceCharacter.attribs.find(o => o.name == 'stealth_bonus').current;
const survivalSkill = sourceCharacter.attribs.find(o => o.name == 'survival_bonus').current;
const technologySkill = sourceCharacter.attribs.find(o => o.name == 'technology_bonus').current;
const targetCharacter = {
name: sourceCharacter.name,
type: "character",
data: {
abilities: {
str: {
value: strength,
proficient: strengthSaveProf
}, },
attributes: { dex: {
ac: { value: dexterity,
value: ac proficient: dexteritySaveProf
},
con: {
value: constitution,
proficient: constitutionSaveProf
},
int: {
value: intelligence,
proficient: intelligenceSaveProf
},
wis: {
value: wisdom,
proficient: wisdomSaveProf
},
cha: {
value: charisma,
proficient: charismaSaveProf
},
},
attributes: {
ac: {
value: ac
},
hp: {
value: hp,
min: 0,
max: hp,
temp: hpTemp
}
},
skills: {
acr: {
value: acrobaticsSkill,
ability: "dex"
}, },
hp: { ani: {
value: hp, value: animalHandlingSkill,
min: 0, ability: "wis"
max: hp, },
temp: hpTemp ath: {
value: athleticsSkill,
ability: "str"
},
dec: {
value: deceptionSkill,
ability: "cha"
},
ins: {
value: insightSkill,
ability: "wis"
},
itm: {
value: intimidationSkill,
ability: "cha"
},
inv: {
value: investigationSkill,
ability: "int"
},
lor: {
value: loreSkill,
ability: "int"
},
med: {
value: medicineSkill,
ability: "wis"
},
nat: {
value: natureSkill,
ability: "int"
},
pil: {
value: pilotingSkill,
ability: "int"
},
prc: {
value: perceptionSkill,
ability: "wis"
},
prf: {
value: performanceSkill,
ability: "cha"
},
per: {
value: persuasionSkill,
ability: "cha"
},
slt: {
value: sleightOfHandSkill,
ability: "dex"
},
ste: {
value: stealthSkill,
ability: "dex"
},
sur: {
value: survivalSkill,
ability: "wis"
},
tec: {
value: technologySkill,
ability: "int"
} }
} }
} }
}; };
Actor.create(targetCharacter); let newActor = await Actor.create(targetCharacter);
} let actor = await game.actors.get(newActor.id);
let classes = await game.packs.get('sw5e.classes');
let content = await classes.getContent();
let scout = content.find(o => o.name == 'Scout');
console.log(actor);
console.log(classes);
console.log(content);
console.log(Object.entries(actor.apps))
console.log(Object.keys(actor.apps))
console.log(Object.values(actor.apps))
//actor.apps[46]._onDropItemCreate(scout);
}
/** */ static addImportButton(html){
static addImportButton(html){ const header = $("#actors").find("header.directory-header");
const header = $("#actors").find("header.directory-header"); const search = $("#actors").children().find("div.header-search");
const search = $("#actors").children().find("div.header-search"); const newImportButtonDiv = $("#actors").children().find("div.header-actions").clone();
const newImportButtonDiv = $("#actors").children().find("div.header-actions").clone(); const newSearch = search.clone();
const newSearch = search.clone(); search.remove();
search.remove(); newImportButtonDiv.attr('id', 'character-sheet-import');
newImportButtonDiv.attr('id', 'character-sheet-import'); header.append(newImportButtonDiv);
header.append(newImportButtonDiv); newImportButtonDiv.children("button").remove();
newImportButtonDiv.children("button").remove(); newImportButtonDiv.append("<button class='create-entity' id='cs-import-button'><i class='fas fa-upload'></i> Import Character</button>");
newImportButtonDiv.append("<button class='create-entity' id='cs-import-button'><i class='fas fa-upload'></i> Import Character</button>"); newSearch.appendTo(header);
newSearch.appendTo(header);
let characterImportButton = $("#cs-import-button"); let characterImportButton = $("#cs-import-button");
characterImportButton.click(ev => { characterImportButton.click(ev => {
console.log("FISH: character import button pressed. 2") let content = '<h1>Saved Character JSON Import</h1> '
let files = []; + '<label for="character-json">Paste character JSON here:</label> '
let contentOld = '<h1>Saved Character JSON Import</h1> ' + '</br>'
+ '<input class="file-picker" type="file" id="sw5e-character-json" accept=".json" multiple name="sw5e-character-json">' + '<textarea id="character-json" name="character-json" rows="10" cols="50"></textarea>';
+ '<hr>' let importDialog = new Dialog({
+ '<div class="sw5e-file-import"></div>'; title: "Import Character from SW5e.com",
let content = '<h1>Saved Character JSON Import</h1> ' content: content,
+ '<label for="character-json">Paste character JSON here:</label> ' buttons: {
+ '</br>' "Import": {
+ '<textarea id="character-json" name="character-json" rows="10" cols="50"></textarea>'; icon: '<i class="fas fa-file-import"></i>',
let importDialog = new Dialog({ label: "Import Character",
title: "Import Character from SW5e.com", callback: (e) => {
content: content, let characterData = $('#character-json').val();
buttons: { console.log('Parsing Character JSON');
"Import": { CharacterImporter.transform(characterData);
icon: '<i class="fas fa-file-import"></i>', }
label: "Import Character", },
callback: (e) => { "Cancel": {
let characterData = $('#character-json').val(); icon: '<i class="fas fa-times-circle"></i>',
console.log('Parsing Character JSON'); label: "Cancel",
CharacterImporter.transform(characterData); callback: () => {},
} }
}, }
"Cancel": { })
icon: '<i class="fas fa-times-circle"></i>', importDialog.render(true);
label: "Cancel", });
callback: () => {}, }
}
}
})
importDialog.render(true);
});
}
} }

File diff suppressed because one or more lines are too long