Files
foil-cap-theories/generate_presentation.js
m.elgin 3b5624e2ab update
2026-06-30 15:29:48 +03:00

405 lines
28 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const path = require('path');
const pptxgen = require('pptxgenjs');
const base = __dirname;
const outPath = path.join(base, 'prezentaciya-vampiricheskoe-tenevoe-pravitelstvo.pptx');
const assets = {
agent: path.join(base, 'assets', 'generated', 'ai-01-snv12-agent.png'),
medieval: path.join(base, 'assets', 'generated', 'ai-02-medieval-spread-map.png'),
classes: path.join(base, 'assets', 'generated', 'ai-03-vampire-classes.png'),
failed: path.join(base, 'assets', 'generated', 'ai-04-failed-infection.png'),
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')
};
const pptx = new pptxgen();
pptx.layout = 'LAYOUT_WIDE';
pptx.author = 'Hermes Agent';
pptx.company = 'Nous Research';
pptx.subject = 'Строгая псевдонаучная модель гемозависимой элиты';
pptx.title = 'Пищевая цепочка: от тебя до теневого правительства';
pptx.lang = 'ru-RU';
pptx.theme = {
headFontFace: 'Aptos Display',
bodyFontFace: 'Aptos',
lang: 'ru-RU'
};
const C = {
bg: 'F7F9FC',
white: 'FFFFFF',
ink: '1F2937',
muted: '667085',
line: 'CAD5E2',
blue: '245B8F',
blueSoft: 'EAF2FB',
red: 'B42318',
redSoft: 'FDECEC',
graySoft: 'EEF2F6',
dark: '102A43'
};
function footer(slide, n, dark = false) {
slide.addText(String(n).padStart(2, '0'), {
x: 12.48,
y: 7.02,
w: 0.36,
h: 0.18,
fontSize: 10,
color: dark ? 'D0DAE6' : C.muted,
align: 'right',
margin: 0
});
}
function put(slide, text, x, y, w, h, opts = {}) {
slide.addText(text, {
x, y, w, h,
fontFace: opts.fontFace ?? 'Aptos',
fontSize: opts.fontSize ?? 14,
color: opts.color ?? C.ink,
bold: opts.bold ?? false,
italic: opts.italic ?? false,
align: opts.align ?? 'left',
valign: opts.valign ?? 'mid',
margin: opts.margin ?? 0.02,
breakLine: opts.breakLine ?? true
});
}
function card(slide, x, y, w, h, title, body, opts = {}) {
slide.addShape(pptx.ShapeType.roundRect, {
x, y, w, h,
rectRadius: 0.05,
fill: { color: opts.fill ?? C.white },
line: { color: opts.line ?? C.line, pt: opts.pt ?? 1.1 }
});
if (title) {
put(slide, title, x + 0.18, y + 0.16, w - 0.36, 0.28, {
fontSize: opts.titleSize ?? 16,
bold: true,
color: opts.titleColor ?? C.ink
});
}
if (body) {
put(slide, body, x + 0.18, y + (title ? 0.52 : 0.18), w - 0.36, h - (title ? 0.68 : 0.28), {
fontSize: opts.bodySize ?? 13.5,
color: opts.bodyColor ?? C.ink,
valign: opts.bodyValign ?? 'top',
margin: 0.04
});
}
}
function pill(slide, x, y, w, h, text, opts = {}) {
slide.addShape(pptx.ShapeType.roundRect, {
x, y, w, h,
rectRadius: 0.08,
fill: { color: opts.fill ?? C.graySoft },
line: { color: opts.line ?? C.graySoft, pt: 1 }
});
put(slide, text, x + 0.08, y + 0.05, w - 0.16, h - 0.1, {
fontSize: opts.fontSize ?? 12.5,
color: opts.color ?? C.ink,
bold: opts.bold ?? false,
align: opts.align ?? 'center'
});
}
function titleSlideBase(slide, title, subtitle) {
slide.background = { color: C.bg };
put(slide, title, 0.9, 0.78, 6.1, 1.25, { fontSize: 28, bold: true, color: C.dark, margin: 0 });
put(slide, subtitle, 0.92, 2.18, 6.3, 0.55, { fontSize: 16, color: C.muted, margin: 0 });
}
function textSlideBase(slide, title, kicker = 'Псевдонаучная реконструкция') {
slide.background = { color: C.bg };
put(slide, title, 0.7, 0.52, 8.4, 0.42, { fontSize: 26, bold: true, color: C.dark, margin: 0 });
put(slide, kicker, 10.05, 0.58, 2.55, 0.2, { fontSize: 10.5, color: C.blue, italic: true, align: 'right', margin: 0 });
}
function fullImage(slide, imagePath) {
slide.background = { color: C.white };
slide.addImage({ path: imagePath, x: 0, y: 0, w: 13.333, h: 7.5 });
}
// 1. title
{
const s = pptx.addSlide();
titleSlideBase(s,
'Пищевая цепочка:\nот тебя до теневого правительства',
'Псевдонаучная модель гемозависимой элиты и скрытой инфраструктуры питания'
);
card(s, 0.92, 3.0, 5.25, 2.25, 'Исходная гипотеза',
'Теневое правительство — это не только политическая сеть. В этой модели оно выступает как долгоживущая гемозависимая каста, которая превратила институты контроля в устойчивую систему отбора, хранения и распределения качественной человеческой крови.',
{ fill: C.white, line: C.line, bodySize: 15, bodyValign: 'mid' }
);
card(s, 7.1, 1.2, 5.2, 4.95, 'Минимальная схема', '', { fill: C.white, line: C.line });
pill(s, 7.6, 2.0, 1.1, 0.5, 'человек', { fill: C.blueSoft, line: C.blue, color: C.blue, bold: true });
put(s, '→', 8.85, 2.08, 0.3, 0.2, { fontSize: 24, color: C.muted, align: 'center' });
pill(s, 9.25, 2.0, 1.2, 0.5, 'отбор', { fill: C.graySoft, line: C.line, color: C.ink, bold: true });
put(s, '→', 10.55, 2.08, 0.3, 0.2, { fontSize: 24, color: C.muted, align: 'center' });
pill(s, 10.95, 2.0, 1.1, 0.5, 'кровь', { fill: C.redSoft, line: C.red, color: C.red, bold: true });
put(s, '→', 8.85, 3.48, 0.3, 0.2, { fontSize: 24, color: C.muted, align: 'center' });
pill(s, 9.25, 3.4, 2.05, 0.56, 'верхушка элиты', { fill: C.dark, line: C.dark, color: C.white, bold: true });
put(s, 'долгожительство\nселекция\nскрытая логистика', 7.58, 4.28, 4.1, 0.95, {
fontSize: 16,
color: C.muted,
align: 'center'
});
put(s, 'Жанр: строгая псевдонаучная подача для клуба шапочек из фольги', 0.95, 6.55, 6.8, 0.22, {
fontSize: 12.5,
color: C.muted,
italic: true,
margin: 0
});
footer(s, 1);
}
// 2. hypothesis
{
const s = pptx.addSlide();
textSlideBase(s, 'Исходная гипотеза');
card(s, 0.88, 1.45, 12.0, 1.2,
'Тезис',
'Элита не просто управляет обществом — она питается им, а долгожительство превращает биологическую зависимость в устойчивое политическое преимущество.',
{ fill: C.white, line: C.blue, titleColor: C.blue, bodySize: 17, bodyValign: 'mid' }
);
card(s, 0.88, 3.0, 2.75, 2.05, '1. Биология', 'Вампиризм интерпретируется как вирусная адаптация, а не мистическое проклятие.', { fill: C.redSoft, line: C.red });
card(s, 3.85, 3.0, 2.75, 2.05, '2. Долголетие', 'Большой горизонт планирования даёт накопление власти, знаний и скрытых сетей.', { fill: C.blueSoft, line: C.blue });
card(s, 6.82, 3.0, 2.75, 2.05, '3. Кровь как ресурс', 'Кровь одновременно еда, валюта, индикатор качества и объект селекции.', { fill: C.white, line: C.line });
card(s, 9.79, 3.0, 3.09, 2.05, '4. Институты', 'Государства, клиники и элитные клубы работают как фасад для кормовой инфраструктуры.', { fill: C.white, line: C.line });
pill(s, 1.7, 5.72, 9.9, 0.62, 'Ключевая формула: власть = контроль кормовой инфраструктуры', { fill: C.dark, line: C.dark, color: C.white, fontSize: 20, bold: true });
footer(s, 2);
}
// 3. biological agent
{
const s = pptx.addSlide();
fullImage(s, assets.agent);
put(s, 'Биологический агент: вирус, молекула и механизм действия', 0.62, 0.23, 11.98, 0.42, {
fontSize: 24, bold: true, color: C.dark, align: 'center'
});
put(s, '1. Вирион SNV-12', 1.28, 1.3, 2.45, 0.26, { fontSize: 14, bold: true, color: C.red, align: 'center' });
put(s, '2. Гемофильный регуляторный комплекс', 5.0, 1.3, 2.75, 0.26, { fontSize: 13.6, bold: true, color: C.red, align: 'center' });
put(s, 'комплекс HEP + MitoX + Reg\nкоординирует метаболическую перестройку', 7.7, 2.46, 1.68, 0.78, { fontSize: 11, color: C.ink, align: 'center' });
put(s, 'Связывание → эндоцитоз → выход РНК → внутриклеточный транспорт', 4.58, 5.9, 3.24, 0.34, { fontSize: 11.2, color: C.blue, align: 'center', bold: true });
put(s, '3. Клеточные мишени и системные эффекты', 9.08, 1.3, 3.9, 0.26, { fontSize: 13.2, bold: true, color: C.red, align: 'center' });
put(s, 'ROS↑,\nпотенциал↓', 8.42, 3.18, 1.35, 0.38, { fontSize: 10.5, color: C.red, align: 'center' });
put(s, 'сдвиг\nметаболизма гема', 9.88, 3.18, 1.62, 0.38, { fontSize: 10.5, color: C.red, align: 'center' });
put(s, 'ускорение\nрепарации тканей', 11.52, 3.18, 1.2, 0.38, { fontSize: 10.1, color: C.red, align: 'center' });
put(s, 'сумеречное зрение\nи фоточувствительность', 8.42, 5.15, 1.34, 0.42, { fontSize: 9.8, color: C.blue, align: 'center' });
put(s, 'лактатный сдвиг\nи экономия энергии', 11.52, 5.15, 1.16, 0.42, { fontSize: 9.8, color: C.blue, align: 'center' });
put(s, 'Зависимость от донорской крови: сигналы донора → цитокины и факторы → гем и железо → гормоны и липиды → адаптация хозяина', 8.18, 6.05, 4.1, 0.28, {
fontSize: 10.2, color: C.blue, align: 'center', bold: true
});
put(s, 'Рабочая гипотеза: вампиризм — результат вирусной перенастройки обмена, регенерации и светочувствительности.', 10.63, 6.75, 2.2, 0.48, {
fontSize: 10.2, color: C.muted, align: 'center'
});
footer(s, 3);
}
// 4. medieval spread map
{
const s = pptx.addSlide();
fullImage(s, assets.medieval);
put(s, 'Средневековье создаёт идеальную среду', 0.22, 0.28, 4.12, 0.34, { fontSize: 21, bold: true, color: C.dark, align: 'center' });
put(s, 'XIIXIV века: торговля, миграции, войны и эпидемии', 0.22, 0.62, 4.12, 0.22, { fontSize: 11.2, color: C.muted, align: 'center' });
put(s, 'Карта показывает не романтизированное Средневековье, а эпидемиологическую логику: плотные торговые сети и конфликтные зоны создают коридоры для скрытого распространения SNV-12.', 11.28, 5.55, 1.82, 1.34, {
fontSize: 10.4, color: C.ink, align: 'center', valign: 'mid'
});
footer(s, 4);
}
// 5. physiological changes
{
const s = pptx.addSlide();
textSlideBase(s, 'Как вирус меняет организм');
card(s, 0.88, 1.4, 3.88, 1.4, 'Кровяная среда', 'Норма: обычный транспорт кислорода.\nЗаражение: рост потребности в гем-сигналах.\nАдаптация: кровь становится носителем регуляторных факторов.', { fill: C.white, line: C.red });
card(s, 4.95, 1.4, 3.88, 1.4, 'Обмен веществ', 'Норма: стандартный энергетический цикл.\nЗаражение: гиперметаболический стресс.\nАдаптация: экономичный режим и сдвиг к лактатной утилизации.', { fill: C.white, line: C.blue });
card(s, 9.02, 1.4, 3.43, 1.4, 'Нервная система', 'Норма: стабильный базовый тонус.\nЗаражение: сенсорная перегрузка.\nАдаптация: фокус на сигналы риска и добычи.', { fill: C.white, line: C.line });
card(s, 0.88, 3.15, 3.88, 1.4, 'Зрение и свет', 'Норма: дневная фототрансдукция.\nЗаражение: фоточувствительность и стресс.\nАдаптация: усиление сумеречного зрения ценой непереносимости яркого света.', { fill: C.white, line: C.blue });
card(s, 4.95, 3.15, 3.88, 1.4, 'Регенерация', 'Норма: обычное заживление.\nЗаражение: воспалительный всплеск.\nАдаптация: ускоренная репарация тканей и выживание после травм.', { fill: C.white, line: C.red });
card(s, 9.02, 3.15, 3.43, 1.4, 'Старение', 'Норма: обычный клеточный цикл.\nЗаражение: сильная нагрузка на ткани.\nАдаптация: замедленное старение и накопление опыта.', { fill: C.white, line: C.line });
card(s, 0.88, 5.08, 11.98, 1.08, 'Переход к симптомам', 'Именно эта системная перестройка далее объясняет четыре наблюдаемых свойства: питание кровью, чувствительность к солнечному свету, быстрое восстановление и долговременное биологическое долголетие.', { fill: C.dark, line: C.dark, titleColor: C.white, bodyColor: 'EAF2FB', bodySize: 15, bodyValign: 'mid' });
footer(s, 5);
}
// 6. dependency on blood
{
const s = pptx.addSlide();
textSlideBase(s, 'Почему возникает зависимость от крови');
pill(s, 0.92, 2.1, 2.25, 0.9, '1. Вирус требует\nживые сигнальные молекулы', { fill: C.redSoft, line: C.red, color: C.red, bold: true, fontSize: 15 });
put(s, '→', 3.3, 2.34, 0.4, 0.2, { fontSize: 28, color: C.muted, align: 'center' });
pill(s, 3.82, 2.1, 2.25, 0.9, '2. Донорская кровь несёт\nцитокины, гормоны и стресс-маркеры', { fill: C.blueSoft, line: C.blue, color: C.blue, bold: true, fontSize: 14.2 });
put(s, '→', 6.22, 2.34, 0.4, 0.2, { fontSize: 28, color: C.muted, align: 'center' });
pill(s, 6.72, 2.1, 2.25, 0.9, '3. Искусственный суррогат\nсохраняет транспорт, но не сигналы', { fill: C.graySoft, line: C.line, color: C.ink, bold: true, fontSize: 14.2 });
put(s, '→', 9.12, 2.34, 0.4, 0.2, { fontSize: 28, color: C.muted, align: 'center' });
pill(s, 9.62, 2.1, 2.75, 0.9, '4. Голод = дефицит регуляторных\nкомпонентов, а не просто калорий', { fill: C.dark, line: C.dark, color: C.white, bold: true, fontSize: 14.2 });
card(s, 1.15, 4.0, 3.45, 1.25, 'Живая кровь', 'Биохимический пакет с вариативностью, метаболической активностью и поведенческим следом донора.', { fill: C.white, line: C.red });
card(s, 5.0, 4.0, 3.45, 1.25, 'Искусственная кровь', 'Полезна как транспортная среда, но слишком стерильна и бедна на активные сигналы.', { fill: C.white, line: C.blue });
card(s, 8.85, 4.0, 3.45, 1.25, 'Следствие', 'Отсюда возникает селекция по качеству, ритуалы допуска и рынок дефицитных доноров.', { fill: C.white, line: C.line });
footer(s, 6);
}
// 7. classes
{
const s = pptx.addSlide();
fullImage(s, assets.classes);
put(s, 'Классы вампирической адаптации', 0.88, 0.3, 11.6, 0.36, { fontSize: 22, bold: true, color: C.dark, align: 'center' });
put(s, 'Чем выше класс, тем больше контроль голода, доступ к качественной крови и политическое влияние.', 0.3, 6.9, 12.7, 0.24, { fontSize: 11.5, color: C.muted, align: 'center' });
footer(s, 7);
}
// 8. failed infection
{
const s = pptx.addSlide();
fullImage(s, assets.failed);
put(s, 'Неудачное заражение: каскад несовместимости', 1.1, 0.28, 11.1, 0.36, { fontSize: 22, bold: true, color: C.dark, align: 'center' });
put(s, 'нейровегетативный\nсбой', 3.6, 1.78, 1.44, 0.44, { fontSize: 11.2, color: C.blue, align: 'center' });
put(s, 'кардиореспираторный\nстресс', 3.57, 2.92, 1.5, 0.44, { fontSize: 11.2, color: C.blue, align: 'center' });
put(s, 'абдоминальный\nсосудистый криз', 3.58, 4.12, 1.48, 0.44, { fontSize: 11.0, color: C.blue, align: 'center' });
put(s, 'периферический\nспазм', 3.58, 5.33, 1.48, 0.4, { fontSize: 11.0, color: C.blue, align: 'center' });
put(s, 'терминальное\nистощение', 3.58, 6.42, 1.48, 0.4, { fontSize: 11.0, color: C.blue, align: 'center' });
put(s, 'генетическая и иммунная\nнесовместимость', 7.62, 1.7, 4.66, 0.42, { fontSize: 12.2, color: C.red, align: 'center', bold: true });
put(s, 'сосудистый перегрев\nи гиперметаболизм', 7.62, 3.0, 4.66, 0.42, { fontSize: 12.2, color: C.red, align: 'center', bold: true });
put(s, 'массовый гемолиз\nи высвобождение гема', 7.62, 4.25, 4.66, 0.42, { fontSize: 12.2, color: C.red, align: 'center', bold: true });
put(s, 'воспалительный каскад\nи токсическая перегрузка', 7.62, 5.46, 4.66, 0.42, { fontSize: 12.2, color: C.red, align: 'center', bold: true });
put(s, 'системный коллапс\nбез устойчивой адаптации', 7.62, 6.65, 4.66, 0.42, { fontSize: 12.2, color: C.red, align: 'center', bold: true });
footer(s, 8);
}
// 9. recognition slide built in ppt
{
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 });
footer(s, 9);
}
// 10. blood economy
{
const s = pptx.addSlide();
fullImage(s, assets.economy);
put(s, 'Экономика качественной крови', 0.42, 0.32, 12.48, 0.34, { fontSize: 22, bold: true, color: C.dark, align: 'center' });
put(s, 'Массовая кровь поддерживает периферию; пиковая и династическая питают верхушку и ритуалы.', 0.45, 6.3, 4.3, 0.8, { fontSize: 11.3, color: C.muted, align: 'center' });
put(s, 'Чем древнее адаптант, тем выше требования к сигнальному профилю донора и тем уже доступ.', 5.05, 6.3, 4.3, 0.8, { fontSize: 11.3, color: C.muted, align: 'center' });
footer(s, 10);
}
// 11. live vs artificial blood
{
const s = pptx.addSlide();
fullImage(s, assets.artificial);
put(s, 'Почему искусственная кровь не подходит', 1.78, 0.2, 9.8, 0.34, { fontSize: 22, bold: true, color: C.dark, align: 'center' });
put(s, 'вариативность\nсигналов', 0.24, 3.15, 2.05, 0.38, { fontSize: 10.8, color: C.red, align: 'center' });
put(s, 'активная\nнейрохимия', 0.24, 4.16, 2.05, 0.38, { fontSize: 10.8, color: C.red, align: 'center' });
put(s, 'иммунный\nотклик', 0.24, 5.18, 2.05, 0.38, { fontSize: 10.8, color: C.red, align: 'center' });
put(s, 'эффект\nнасыщения', 0.24, 6.2, 2.05, 0.38, { fontSize: 10.8, color: C.red, align: 'center' });
put(s, 'сигналы\nсглажены', 11.0, 3.15, 2.05, 0.38, { fontSize: 10.8, color: C.blue, align: 'center' });
put(s, 'подпись\nстёрта', 11.0, 4.16, 2.05, 0.38, { fontSize: 10.8, color: C.blue, align: 'center' });
put(s, 'ответ\nнизкий', 11.0, 5.18, 2.05, 0.38, { fontSize: 10.8, color: C.blue, align: 'center' });
put(s, 'сытости\nнет', 11.0, 6.2, 2.05, 0.38, { fontSize: 10.8, color: C.blue, align: 'center' });
put(s, 'Живая кровь даёт вариативный биохимический пакет: гормоны, стресс-маркеры, активный метаболизм и индивидуальный нейрохимический след.', 0.2, 6.7, 5.7, 0.48, {
fontSize: 11.4, color: C.red, align: 'center', bold: true
});
put(s, 'Искусственный суррогат сохраняет транспортную функцию, но слишком стерилен и не вызывает полноценного насыщения.', 7.48, 6.7, 5.7, 0.48, {
fontSize: 11.4, color: C.blue, align: 'center', bold: true
});
footer(s, 11);
}
// 12. hidden donor market
{
const s = pptx.addSlide();
fullImage(s, assets.market);
put(s, 'Тайный рынок доноров', 0.28, 0.18, 12.75, 0.36, { fontSize: 22, bold: true, color: C.dark, align: 'center' });
put(s, 'Критический поток идёт от источников и донорских домов к сортировке, биобанкам и узлам доставки. Бутылочные горлышки — пропускная способность, холодовая цепь и безопасность маршрутов. Система работает как дисциплинированная логистическая сеть, а не как хаотичный чёрный рынок.', 9.52, 5.85, 3.1, 1.0, {
fontSize: 10.8, color: C.ink, align: 'left', valign: 'top'
});
footer(s, 12);
}
// 13. feeding zones map
{
const s = pptx.addSlide();
fullImage(s, assets.zones);
put(s, 'Геополитика кормовых зон', 1.02, 0.18, 10.6, 0.34, { fontSize: 22, bold: true, color: C.dark, align: 'center' });
put(s, 'Карта показывает не государства, а контуры биологического снабжения: резервуары населения, коридоры доставки, безопасные зоны элиты и территории управляемых экспериментов.', 11.18, 5.2, 1.74, 1.2, {
fontSize: 10.2, color: C.ink, align: 'center'
});
footer(s, 13);
}
// 14. consequences matrix
{
const s = pptx.addSlide();
textSlideBase(s, 'Следствия: почему вампиры именно такие');
card(s, 0.92, 1.5, 5.8, 0.62, 'Биомеханизм', '', { fill: C.dark, line: C.dark, titleColor: C.white });
card(s, 6.82, 1.5, 5.58, 0.62, 'Наблюдаемое следствие', '', { fill: C.red, line: C.red, titleColor: C.white });
const left = [
'дефицит сигнальных молекул',
'изменённые фоторецепторные пути',
'усиленная регенеративная сигнализация',
'перестройка клеточного цикла',
'хронический голодный стресс',
'высокая цена качественной крови'
];
const right = [
'питание кровью и отказ от стерильных суррогатов',
'чувствительность к яркому солнечному свету',
'быстрое восстановление после травм',
'замедленное старение и накопление опыта',
'ритуалы отбора, дисциплина и иерархия доступа',
'скрытая политика, элитные сети и рынок доноров'
];
for (let i = 0; i < left.length; i += 1) {
const y = 2.35 + i * 0.7;
card(s, 0.92, y, 5.8, 0.56, '', left[i], { fill: C.white, line: C.line, bodySize: 13.3, bodyValign: 'mid' });
card(s, 6.82, y, 5.58, 0.56, '', right[i], { fill: C.white, line: C.line, bodySize: 13.3, bodyValign: 'mid' });
}
footer(s, 14);
}
// 15. conclusion
{
const s = pptx.addSlide();
s.background = { color: C.dark };
put(s, 'Вывод', 0.95, 0.92, 2.5, 0.42, { fontSize: 28, bold: true, color: C.white, margin: 0 });
put(s,
'Если теория верна, то вершина мировой политики — это не кабинет и не трон, а хорошо организованная биологическая инфраструктура, где власть определяется устойчивым доступом к качественной крови.',
0.95, 2.0, 7.35, 1.55,
{ fontSize: 23, color: 'EAF2FB', margin: 0.02, valign: 'mid' }
);
card(s, 9.0, 1.7, 3.15, 3.4, 'Ключевые формулы', '• вампиризм = биологическая зависимость + социальная инфраструктура\n\n• власть = устойчивый доступ к качественной крови\n\n• миф о монстре скрывает проблему системы снабжения', {
fill: '16324F',
line: '7FA6C9',
titleColor: C.white,
bodyColor: 'EAF2FB',
bodySize: 15,
bodyValign: 'mid'
});
put(s, 'Жанр: строго стилизованная псевдонаука для клуба шапочек из фольги', 0.98, 6.48, 6.9, 0.2, { fontSize: 12.5, color: 'B8C7D9', italic: true, margin: 0 });
footer(s, 15, true);
}
async function main() {
await pptx.writeFile({ fileName: outPath });
}
main().catch((err) => {
console.error(err.stack || err.message || String(err));
process.exit(1);
});