Add debt and potion

This commit is contained in:
Dylan Pizzo
2025-01-06 21:06:13 -08:00
parent a5979647fc
commit 7f4268f960
3 changed files with 135 additions and 22 deletions

View File

@@ -5,7 +5,9 @@ export type Piece =
| { type: "text"; text: string; isBold?: boolean; isItalic?: boolean }
| { type: "space" }
| { type: "break" }
| { type: "coin"; text: string };
| { type: "coin"; text: string }
| { type: "debt"; text: string }
| { type: "potion"; text: string };
type PromiseOr<T> = T | Promise<T>;
@@ -163,7 +165,96 @@ const coinPiece = pieceDef({
},
});
const pieceDefs = [textPiece, spacePiece, breakPiece, coinPiece];
const debtPiece = pieceDef({
type: "debt",
measure(context, _piece) {
context.save();
const metrics = context.measureText(" ");
const height =
metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;
const coinImage = getImage("debt");
context.restore();
return {
type: "content",
width: coinImage.width * (height / coinImage.height),
ascent: metrics.fontBoundingBoxAscent,
descent: metrics.fontBoundingBoxDescent,
};
},
render(context, piece, x, y, measure) {
context.save();
// context.fillStyle = "yellow";
const height = measure.ascent + measure.descent;
// context.fillRect(x, y - measure.ascent, measure.width, height);
context.drawImage(
getImage("debt"),
x,
y - measure.ascent,
measure.width,
height
);
const fontInfo = parseFont(context.font);
fontInfo.family = ["DominionSpecial"];
fontInfo.weight = "bold";
fontInfo.size = parseInt(fontInfo.size.toString()) * 1.2;
const font = stringifyFont(fontInfo);
context.font = font;
context.fillStyle = "white";
context.textAlign = "center";
context.fillText(piece.text, x + measure.width / 2, y);
context.restore();
},
});
const potionPiece = pieceDef({
type: "potion",
measure(context, _piece) {
context.save();
const metrics = context.measureText(" ");
const height =
metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;
const coinImage = getImage("potion");
context.restore();
return {
type: "content",
width: coinImage.width * (height / coinImage.height),
ascent: metrics.fontBoundingBoxAscent,
descent: metrics.fontBoundingBoxDescent,
};
},
render(context, piece, x, y, measure) {
context.save();
// context.fillStyle = "yellow";
const height = measure.ascent + measure.descent;
// context.fillRect(x, y - measure.ascent, measure.width, height);
context.drawImage(
getImage("potion"),
x,
y - measure.ascent,
measure.width,
height
);
const fontInfo = parseFont(context.font);
fontInfo.family = ["DominionSpecial"];
fontInfo.weight = "bold";
fontInfo.size = parseInt(fontInfo.size.toString()) * 1.2;
const font = stringifyFont(fontInfo);
context.font = font;
context.fillStyle = "white";
context.textAlign = "center";
context.fillText(piece.text, x + measure.width / 2, y);
context.restore();
},
});
const pieceDefs = [
textPiece,
spacePiece,
breakPiece,
coinPiece,
debtPiece,
potionPiece,
];
const tools: PieceTools = {} as any;
@@ -267,7 +358,7 @@ export const renderDominionText = async (
pieces: Piece[],
x: number,
y: number,
maxWidth: number
maxWidth = Infinity
) => {
const { lines, height } = await measureDominionText(
context,
@@ -325,6 +416,14 @@ export const parse = (text: string): Piece[] => {
const end = text.slice(i).match(/\$\d*/)![0].length;
pieces.push({ type: "coin", text: text.slice(i + 1, i + end) });
i += end - 1;
} else if (char === "@") {
const end = text.slice(i).match(/@\d*/)![0].length;
pieces.push({ type: "debt", text: text.slice(i + 1, i + end) });
i += end - 1;
} else if (char === "^") {
const end = text.slice(i).match(/\^\d*/)![0].length;
pieces.push({ type: "potion", text: text.slice(i + 1, i + end) });
i += end - 1;
} else if (char === "+") {
const match = text.slice(i).match(/\+\d* \S+/);
if (match) {