This commit is contained in:
m.elgin
2026-06-30 17:03:36 +03:00
parent 27126886e5
commit d3b67b5271
11 changed files with 410 additions and 320 deletions

View File

@@ -11,7 +11,13 @@ const assets = {
economy: path.join(base, 'assets', 'generated', 'ai-05-blood-economy.png'),
artificial: path.join(base, 'assets', 'generated', 'ai-06-live-vs-artificial-blood.png'),
market: path.join(base, 'assets', 'generated', 'ai-07-hidden-donor-market.png'),
zones: path.join(base, 'assets', 'generated', 'ai-08-feeding-zones-map.png')
zones: path.join(base, 'assets', 'generated', 'ai-08-feeding-zones-map.png'),
signTeeth: path.join(base, 'assets', 'generated', 'ai-sign-01-teeth-canines.png'),
signEyeNeutral: path.join(base, 'assets', 'generated', 'ai-sign-02-eye-neutral.png'),
signEyeHunger: path.join(base, 'assets', 'generated', 'ai-sign-03-eye-hunger.png'),
signSkin: path.join(base, 'assets', 'generated', 'ai-sign-04-skin-aging.png'),
signHand: path.join(base, 'assets', 'generated', 'ai-sign-05-hand-motorics.png'),
signBehavior: path.join(base, 'assets', 'generated', 'ai-sign-06-behavioral-portrait.png')
};
const pptx = new pptxgen();
@@ -278,14 +284,34 @@ function fullImage(slide, imagePath) {
{
const s = pptx.addSlide();
textSlideBase(s, 'Как распознать вампира');
card(s, 4.45, 1.55, 4.45, 4.4, 'Гемозависимый фенотип', 'Не монстр, а носитель устойчивых физиологических и поведенческих сдвигов.', { fill: C.white, line: C.blue, bodySize: 16, bodyValign: 'mid' });
card(s, 0.86, 1.55, 3.1, 1.06, 'Внешний маркер 1', 'слегка увеличенные клыки', { fill: C.redSoft, line: C.red, bodySize: 14.5 });
card(s, 0.86, 2.82, 3.1, 1.06, 'Внешний маркер 2', 'медленное старение, ровная кожа', { fill: C.redSoft, line: C.red, bodySize: 14.2 });
card(s, 0.86, 4.09, 3.1, 1.06, 'Внешний маркер 3', 'тёмный зрачок при голоде', { fill: C.redSoft, line: C.red, bodySize: 14.2 });
card(s, 9.33, 1.55, 3.14, 1.06, 'Поведение 1', 'интерес к крови и травмам', { fill: C.blueSoft, line: C.blue, bodySize: 14.2 });
card(s, 9.33, 2.82, 3.14, 1.06, 'Поведение 2', 'тяга к закрытым кругам', { fill: C.blueSoft, line: C.blue, bodySize: 14.2 });
card(s, 9.33, 4.09, 3.14, 1.06, 'Поведение 3', 'жёсткий контроль питания', { fill: C.blueSoft, line: C.blue, bodySize: 14.2 });
pill(s, 1.62, 6.15, 10.0, 0.56, 'Оценивается не признак, а их комбинация.', { fill: C.dark, line: C.dark, color: C.white, fontSize: 16, bold: true });
const items = [
{ x: 0.72, y: 1.22, img: assets.signTeeth, title: 'Клыки', body: 'удлинение без деформации' },
{ x: 4.38, y: 1.22, img: assets.signEyeNeutral, title: 'Глаз: сытая фаза', body: 'зрачок почти нормален' },
{ x: 8.04, y: 1.22, img: assets.signEyeHunger, title: 'Глаз: голод', body: 'зрачок расширен и темнее' },
{ x: 0.72, y: 4.02, img: assets.signSkin, title: 'Кожа и возраст', body: 'ровная кожа, слабый возрастной шум' },
{ x: 4.38, y: 4.02, img: assets.signHand, title: 'Кисть и моторика', body: 'точность, вены, холодная пластика' },
{ x: 8.04, y: 4.02, img: assets.signBehavior, title: 'Поведение', body: 'кровь, документы, закрытые круги' }
];
items.forEach((item) => {
card(s, item.x, item.y, 3.05, 2.48, '', '', { fill: C.white, line: C.line, pt: 1.15 });
s.addImage({ path: item.img, x: item.x + 0.12, y: item.y + 0.12, w: 2.81, h: 1.72 });
put(s, item.title, item.x + 0.14, item.y + 1.88, 2.76, 0.18, {
fontSize: 11.8,
bold: true,
color: C.dark,
align: 'center',
margin: 0
});
put(s, item.body, item.x + 0.18, item.y + 2.08, 2.68, 0.22, {
fontSize: 9.6,
color: C.muted,
align: 'center',
margin: 0
});
});
pill(s, 1.58, 6.9, 10.15, 0.34, 'Смотреть нужно на комбинацию признаков.', { fill: C.dark, line: C.dark, color: C.white, fontSize: 12.4, bold: true });
footer(s, 9);
}