feature: generate pdf from actor

This commit is contained in:
Matthieu CAILLEAUX
2021-10-18 00:35:13 +02:00
parent f96372b236
commit 145207a1c5
14 changed files with 391 additions and 138 deletions

View File

@@ -9,6 +9,8 @@ import { ItemData } from '@league-of-foundry-developers/foundry-vtt-types/src/fo
import { LabelledValues } from './elements/labelled-values';
import { Text } from './elements/text';
import { Texts } from './elements/texts';
import { Column } from './elements/column';
import { Separator } from './elements/separator';
Hooks.on(
'renderActorSheetWfrp4eCharacter',
@@ -37,18 +39,10 @@ Hooks.on(
const labelledRowHeight =
Util.getHeightFromPx(docBuilder.doc, TEXT_SIZE + LABEL_SIZE) + 1;
const textRowHeight = Util.getHeightFromPx(docBuilder.doc, TEXT_SIZE);
const row2Y = labelledRowHeight + MARGINS.top + 2;
const row3Y = row2Y + labelledRowHeight + 2;
const row4Y = row3Y + labelledRowHeight + 2;
const row5Y = row4Y + labelledRowHeight + 2;
const row6Y = row5Y + labelledRowHeight + 2;
const row7Y = row6Y + labelledRowHeight + 2;
const row8Y = row7Y + textRowHeight + 2;
const skills = new LabelledValues(
0,
row8Y,
0,
actor.itemCategories.skill
.map((item) => {
return {
@@ -59,12 +53,9 @@ Hooks.on(
.sort((a, b) => a.label.localeCompare(b.label))
);
const row9Y = row8Y + skills.getHeight(docBuilder.doc) + 2;
const row10Y = row9Y + textRowHeight + 2;
const talents = new LabelledValues(
0,
row10Y,
0,
actor.itemCategories.talent
.map((item) => {
return {
@@ -79,12 +70,9 @@ Hooks.on(
1
);
const row11Y = row10Y + talents.getHeight(docBuilder.doc) + 2;
const row12Y = row11Y + textRowHeight + 2;
const traits = new Texts(
0,
row12Y,
0,
actor.itemCategories.trait
.map((item) => {
return item.name;
@@ -93,114 +81,201 @@ Hooks.on(
4
);
const weaponsMelee = new Texts(
0,
0,
actor.itemCategories.weapon
.filter((w) => w.isMelee)
.map((item) => {
return `${item.name} : ${item.data.data.damage.meleeValue} (${
item.mountDamage
}), ${item.OriginalQualities.concat(item.OriginalFlaws).join(
', '
)}`;
})
.sort((a, b) => a.localeCompare(b)),
1
);
const weaponsRanged = new Texts(
0,
0,
actor.itemCategories.weapon
.filter((w) => w.isRanged)
.map((item) => {
return `${item.name} : ${item.data.data.damage.rangedValue}, ${
item.data.data.range.value
}, ${item.OriginalQualities.concat(item.OriginalFlaws).join(', ')}`;
})
.sort((a, b) => a.localeCompare(b)),
1
);
const ammunitions = new Texts(
0,
0,
actor.itemCategories.ammunition
.map((item) => {
return `${item.data.data.quantity.value} ${item.name} : ${
item.data.data.damage.value.length > 0
? item.data.data.damage.value
: '+0'
}, (${item.data.data.range.value}), ${item.OriginalQualities.concat(
item.OriginalFlaws
).join(', ')}`;
})
.sort((a, b) => a.localeCompare(b)),
2
);
const imageWidth = 25;
const imageY = labelledRowHeight + MARGINS.top + 2;
const actorImageElement =
actorImageData != null
? new Image(0, row2Y, imageWidth, imageWidth, actorImageData)
: new Box(0, row2Y, imageWidth, imageWidth);
? new Image(0, imageY, imageWidth, imageWidth, actorImageData)
: new Box(0, imageY, imageWidth, imageWidth);
docBuilder.build([
new Row(0, 0, [
new LabelledText(0, 0, 'Name', `${actor.name}`),
new LabelledText(0, 0, 'Species', `${actorDetails?.species?.value}`),
new LabelledText(0, 0, 'Gender', `${actorDetails?.gender?.value}`),
]),
actorImageElement,
new Row(imageWidth + MARGINS.left + 1, row2Y, [
new LabelledText(0, 0, 'Class', `${careerDetail?.class?.value}`),
new LabelledText(
0,
0,
'Career Group',
`${careerDetail?.careergroup?.value}`
),
new LabelledText(0, 0, 'Career', `${currentCareer?.name}`),
new Column(0, 0, [
new Row(0, 0, [
new LabelledText(0, 0, 'Name', `${actor.name}`),
new LabelledText(
0,
0,
'Species',
`${actorDetails?.species?.value}`
),
new LabelledText(0, 0, 'Gender', `${actorDetails?.gender?.value}`),
]),
new Row(imageWidth + MARGINS.left + 1, 0, [
new LabelledText(0, 0, 'Class', `${careerDetail?.class?.value}`),
new LabelledText(
0,
0,
'Career Group',
`${careerDetail?.careergroup?.value}`
),
new LabelledText(0, 0, 'Career', `${currentCareer?.name}`),
]),
new Row(imageWidth + MARGINS.left + 1, 0, [
new LabelledText(0, 0, 'Status', `${actorDetails?.status?.value}`),
new LabelledText(0, 0, 'Age', `${actorDetails?.age?.value}`),
new LabelledText(0, 0, 'Height', `${actorDetails?.height?.value}`),
new LabelledText(0, 0, 'Weight', `${actorDetails?.weight?.value}`),
new LabelledText(
0,
0,
'Hair Colour',
`${actorDetails?.haircolour?.value}`
),
]),
new Row(imageWidth + MARGINS.left + 1, 0, [
new LabelledText(
0,
0,
'Eye Colour',
`${actorDetails?.eyecolour?.value}`
),
new LabelledText(
0,
0,
'Distinguishing Mark',
`${actorDetails?.distinguishingmark?.value}`
),
new LabelledText(
0,
0,
'Star Sign',
`${actorDetails?.starsign?.value}`
),
]),
new Row(0, 0, [
new LabelledText(
0,
0,
'CHARAbbrev.WS',
`${actorCharacs?.ws?.value}`
),
new LabelledText(
0,
0,
'CHARAbbrev.BS',
`${actorCharacs?.bs?.value}`
),
new LabelledText(0, 0, 'CHARAbbrev.S', `${actorCharacs?.s?.value}`),
new LabelledText(0, 0, 'CHARAbbrev.T', `${actorCharacs?.t?.value}`),
new LabelledText(0, 0, 'CHARAbbrev.I', `${actorCharacs?.i?.value}`),
new LabelledText(
0,
0,
'CHARAbbrev.Ag',
`${actorCharacs?.ag?.value}`
),
new LabelledText(
0,
0,
'CHARAbbrev.Dex',
`${actorCharacs?.dex?.value}`
),
new LabelledText(
0,
0,
'CHARAbbrev.Int',
`${actorCharacs?.int?.value}`
),
new LabelledText(
0,
0,
'CHARAbbrev.WP',
`${actorCharacs?.wp?.value}`
),
new LabelledText(
0,
0,
'CHARAbbrev.Fel',
`${actorCharacs?.fel?.value}`
),
]),
new Row(0, 0, [
new LabelledText(0, 0, 'Move', `${actorDetails?.move?.value}`),
new LabelledText(0, 0, 'Walk', `${actorDetails?.move?.walk}`),
new LabelledText(0, 0, 'Run', `${actorDetails?.move?.run}`),
new LabelledText(0, 0, 'Fortune', `${actorStatus?.fortune?.value}`),
new LabelledText(0, 0, 'Fate', `${actorStatus?.fate?.value}`),
new LabelledText(0, 0, 'Resolve', `${actorStatus?.resolve?.value}`),
new LabelledText(
0,
0,
'Resilience',
`${actorStatus?.resilience?.value}`
),
new LabelledText(
0,
0,
'Wounds',
`${actorStatus?.wounds?.value}/${actorStatus?.wounds?.max}`
),
]),
new Separator(0, 0),
new Text(0, 0, 'Skills'),
skills,
new Separator(0, 0),
new Text(0, 0, 'Talents'),
talents,
new Separator(0, 0),
new Text(0, 0, 'Traits'),
traits,
new Separator(0, 0),
new Text(0, 0, 'SHEET.MeleeWeaponHeader'),
weaponsMelee,
new Separator(0, 0),
new Text(0, 0, 'SHEET.RangedWeaponHeader'),
weaponsRanged,
new Separator(0, 0),
new Text(0, 0, 'Ammunition'),
ammunitions,
]),
new Row(imageWidth + MARGINS.left + 1, row3Y, [
new LabelledText(0, 0, 'Status', `${actorDetails?.status?.value}`),
new LabelledText(0, 0, 'Age', `${actorDetails?.age?.value}`),
new LabelledText(0, 0, 'Height', `${actorDetails?.height?.value}`),
new LabelledText(0, 0, 'Weight', `${actorDetails?.weight?.value}`),
new LabelledText(
0,
0,
'Hair Colour',
`${actorDetails?.haircolour?.value}`
),
]),
new Row(imageWidth + MARGINS.left + 1, row4Y, [
new LabelledText(
0,
0,
'Eye Colour',
`${actorDetails?.eyecolour?.value}`
),
new LabelledText(
0,
0,
'Distinguishing Mark',
`${actorDetails?.distinguishingmark?.value}`
),
new LabelledText(
0,
0,
'Star Sign',
`${actorDetails?.starsign?.value}`
),
]),
new Row(0, row5Y, [
new LabelledText(0, 0, 'CHARAbbrev.WS', `${actorCharacs?.ws?.value}`),
new LabelledText(0, 0, 'CHARAbbrev.BS', `${actorCharacs?.bs?.value}`),
new LabelledText(0, 0, 'CHARAbbrev.S', `${actorCharacs?.s?.value}`),
new LabelledText(0, 0, 'CHARAbbrev.T', `${actorCharacs?.t?.value}`),
new LabelledText(0, 0, 'CHARAbbrev.I', `${actorCharacs?.i?.value}`),
new LabelledText(0, 0, 'CHARAbbrev.Ag', `${actorCharacs?.ag?.value}`),
new LabelledText(
0,
0,
'CHARAbbrev.Dex',
`${actorCharacs?.dex?.value}`
),
new LabelledText(
0,
0,
'CHARAbbrev.Int',
`${actorCharacs?.int?.value}`
),
new LabelledText(0, 0, 'CHARAbbrev.WP', `${actorCharacs?.wp?.value}`),
new LabelledText(
0,
0,
'CHARAbbrev.Fel',
`${actorCharacs?.fel?.value}`
),
]),
new Row(0, row6Y, [
new LabelledText(0, 0, 'Move', `${actorDetails?.move?.value}`),
new LabelledText(0, 0, 'Walk', `${actorDetails?.move?.walk}`),
new LabelledText(0, 0, 'Run', `${actorDetails?.move?.run}`),
new LabelledText(0, 0, 'Fortune', `${actorStatus?.fortune?.value}`),
new LabelledText(0, 0, 'Fate', `${actorStatus?.fate?.value}`),
new LabelledText(0, 0, 'Resolve', `${actorStatus?.resolve?.value}`),
new LabelledText(
0,
0,
'Resilience',
`${actorStatus?.resilience?.value}`
),
new LabelledText(
0,
0,
'Wounds',
`${actorStatus?.wounds?.value}/${actorStatus?.wounds?.max}`
),
]),
new Text(0, row7Y, 'Skills'),
skills,
new Text(0, row9Y, 'Talents'),
talents,
new Text(0, row11Y, 'Traits'),
traits,
]);
docBuilder.doc.save(`${app.actor.name}.pdf`);
});