SWADE: Fix drop of complex compendium items

This commit is contained in:
unknown
2026-02-09 14:42:35 -07:00
parent 69f4370a2f
commit 33bc2eec75
@@ -2602,7 +2602,7 @@ const vehiclefields = [
'image',
'description',
];
const powerRobotArmorFields = [...vehiclefields, 'pilotarmor', 'pilotskillmod'];
const powerRobotArmorFields = [...vehiclefields, 'pilotarmor', 'pilotskillmod','strength','strengthmod'];
const armorfields = [
'ArmorType',
'armorminstrength',
@@ -2848,9 +2848,9 @@ const dropShields = function({repSectionID,repSection,targetObj,jsonObj}){
const dropVehicle = function({jsonObj}){
log('Vehicle Info', 'Made it to getting Vehicle Fields', r20color);
const fields = [
...(jsonObj.subcategory ? powerRobotArmorFields : vehiclefields),
...((jsonObj.subcategory && / armor/i.test(jsonObj.subcategory)) ? powerRobotArmorFields : vehiclefields),
];
if (jsonObj.subcategory) {
if (jsonObj.subcategory && / armor/i.test(jsonObj.subcategory)) {
prefix = jsonObj.subcategory === 'Power Armor' ? 'pa_' : 'ra_';
}
return [false,fields];
@@ -2891,11 +2891,10 @@ const dropCharacterType = function({repSectionID,repSection,targetObj,jsonObj,at
};
const getDropInfo = function (jsonObj, targetObj, repSection, attributes) {
const getDropInfo = function (jsonObj, targetObj, repSection, attributes, prefix = '') {
debug('Entering getDropInfo');
let repSectionID;
let fields;
let prefix = '';
repSection ?
(repSectionID = generateRowID()) :
log('Repeating Section', 'Not Found', r20color);
@@ -2949,8 +2948,13 @@ const getDropInfo = function (jsonObj, targetObj, repSection, attributes) {
} else {
log('Non-Repeating Fields', 'Fields Found', r20color);
fields.forEach(field => {
// work around for inconsistent naming scheme.
// TODO: Update sheet with new attribute name to match rest of prefixed naming scheme
const usePrefix = /strength/.test(field) ?
prefix.replace(/_/,'') :
prefix;
jsonObj[`${field}`] !== undefined
? (targetObj[`${prefix}${field}`] = jsonObj[`${field}`])
? (targetObj[`${usePrefix}${field}`] = jsonObj[`${field}`])
: log(`${field}`, 'Not Found', r20color);
});
}
@@ -2984,11 +2988,11 @@ const prepVehicles = function({attributes,setObj,jsonObj}){
const subCat = jsonObj.subcategory;
let prefix = '';
let vFields
if(subCat){
if(subCat && / armor/i.test(subCat)){
prefix = `${subCat.replace(/(\w)\w+\s*/g,(match,letter)=>letter.toLowerCase())}_`;
vFields = powerRobotArmorFields.map((field)=>`${prefix}${field}`);
setObj[
jsonObj.subcategory.replace(/\s+/g, '_').toLowerCase()
subCat.replace(/\s+/g, '_').toLowerCase()
] = 1;
}else{
vFields = [...vehiclefields];
@@ -3004,28 +3008,31 @@ const prepVehicles = function({attributes,setObj,jsonObj}){
: (setObj[`${prefix}vehicletype`] = jsonObj.name ||
jsonObj['display_name'] ||
'');
if (jsonObj['data-Weapons']) {
//if this is a vehicle with weapons, then need to add more stuff to the JSON
log('Vehicle Weapons Array', 'Found', r20color);
jsonObj['data-Weapons'].forEach(weapon => {
let source = subCat || jsonObj.Category;
let dropType = getDropInfoCommand('Weapons', source);
log(
'Import Vehicle Weapon',
weapon.data && weapon.data.weapon,
r20color
);
log('dropType', dropType, r20color);
log('source', source, r20color);
setObj = getDropInfo(
weapon.data,
setObj,
dropType,
attributes
);
});
}
return 'vehicle_non-repeating'; //Vehicles don't have a Repeating Sections for the core vehicle
jsonObj.image = jsonObj.Token;
// weapons handling commented out as handled by generalized pheg handling. was causing duplicates. Left in in case missing functionality.
// if (jsonObj['data-Weapons']) {
// //if this is a vehicle with weapons, then need to add more stuff to the JSON
// log('Vehicle Weapons Array', 'Found', r20color);
// jsonObj['data-Weapons'].forEach(weapon => {
// let source = subCat || jsonObj.Category;
// let dropType = getDropInfoCommand('Weapons', source);
// log(
// 'Import Vehicle Weapon',
// weapon.data && weapon.data.weapon,
// r20color
// );
// log('dropType', dropType, r20color);
// log('source', source, r20color);
// setObj = getDropInfo(
// weapon.data,
// setObj,
// dropType,
// attributes,
// prefix
// );
// });
// }
return ['vehicle_non-repeating',prefix]; //Vehicles don't have a Repeating Sections for the core vehicle
};
const prepCharacterType = function({jsonObj}){
@@ -3090,14 +3097,20 @@ const compendiumDrop = function (category) {
let repSection = dropSwitch[jsonObj.Category] ?
dropSwitch[jsonObj.Category]({attributes:v,setObj:setattrvalues,jsonObj}) :
undefined;
let prefix = '';
if(Array.isArray(repSection)){
prefix = repSection[1];
repSection = repSection[0];
}
//If an invalid item was dropped, delete the compendium drop data and stop import.
if(repSection === undefined){
debug('Invalid drop category, no drop performed.');
setAttrs(setattrvalues,{silent:true});
return;
}
setattrvalues = getDropInfo(jsonObj, setattrvalues, repSection, v);
setattrvalues = getDropInfo(jsonObj, setattrvalues, repSection, v,prefix);
setattrvalues = processAdditionalPHEGs(jsonObj,setattrvalues,v);
sanitizeImage(setattrvalues);
log('setattrvalues', '', r20color);
setAttrs(setattrvalues);
log('Values', 'Set...character sheet is updated', r20color);
@@ -3107,6 +3120,14 @@ const compendiumDrop = function (category) {
);
};
const sanitizeImage = (setObj) => {
[`image`,`pa_image`,`ra_image`,`Image`,`pa_Image`,`ra_Image`].forEach(ref => {
if(setObj[ref]){
setObj[ref] = setObj[ref].replace(/s3\.amazonaws\.com\/files\.d20\.io/,'files.d20.io/')
}
})
}
//Bestiary Compendium Drop
const attributeNames = ['agility', 'smarts', 'spirit', 'strength', 'vigor'];
@@ -3316,6 +3337,7 @@ const compendiumBestiary = function () {
finalCharacterDetails.runningDie = `1d${lookupObj.runningDie}`;
}
finalCharacterDetails['miniDisplay'] = '1';
sanitizeImage(finalCharacterDetails);
log(
'Finish',
'Write PHEG data and all remaining attributes to character sheet',
@@ -3342,7 +3364,7 @@ const processAdditionalPHEGs = function(lookupObj,finalCharacterDetails,monster)
},
Vehicle: {
vehicle: obj =>
obj['data-Vehicle'].some(o => !o.data.subcategory) ? 'on' : 0,
obj['data-Vehicle'].some(o => o.data.subcategory !== 'Power Armor' && o.data.subcategory !== 'Robot Armor') ? 'on' : 0,
power_armor: obj =>
obj['data-Vehicle'].some(
o => o.data.subcategory === 'Power Armor'
@@ -3384,11 +3406,18 @@ const processAdditionalPHEGs = function(lookupObj,finalCharacterDetails,monster)
log(`Monster`, singular, r20color);
let source = phegObj.datasource;
let dropType = getDropInfoCommand(type, source);
let prefix = '';
if(phegObj.data.subcategory){
prefix = /armor/i.test(phegObj.data.subcategory) ?
`${phegObj.data.subcategory[0].toLowerCase()}a_` :
'';
}
finalCharacterDetails = getDropInfo(
phegObj.data,
finalCharacterDetails,
dropType,
monster
monster,
prefix
);
});
@@ -15987,8 +16016,8 @@ on(
<label class="csnLabel" data-i18n="weirdscience"> </label>=
<input class="csnInput" type="text" name="attr_weirdsciencename" value=""/>
</div>
<input class="hiddenInput" type="text" name="pastrengthname" value=""/>
<input class="hiddenInput" type="text" name="rastrengthname" value=""/>
<input class="hiddenInput" type="text" name="attr_pastrengthname" value="Strength"/>
<input class="hiddenInput" type="text" name="attr_rastrengthname" value="Strength"/>
</div>
</div>
<!-- JSON Importer-->