2PlayerGame/detective-game/casegen/motives/ransom.js
2026-08-15 14:07:39 +03:00

38 lines
3.4 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.

function generate(ctx) {
const { r, add, addPuzzle, motiveEvs, victim, killer, herring } = ctx;
const motiveId = 'Викуп';
const relative = ctx.witnessFrom(ctx.citizens.filter(c => c.home !== victim.home));
motiveEvs.push(add({
id: 'mot_lair', side: 'field', at: { type: 'spot', building: 'pier', spot: 'елінг' },
title: 'Підготовлене лігво', tag: 'мотив',
detail: 'В елінгу за брезентом — матрац, ланцюг із замком, каністра води, відро. Усе нове, з цінниками. Хтось готувався тримати тут людину. Живою.',
gives: { motive: true }
}));
motiveEvs.push(add({
id: 'mot_supplies', side: 'field', at: { type: 'person', cid: ctx.witnessFrom(ctx.citizens.filter(c => c.workplace === 'shop')).id }, needsIdentity: true,
title: 'Свідчення з мінімаркету', tag: 'мотив',
detail: `«Дивна закупівля була днями: стяжки, скотч, брезент, ланцюг — усе разом. Хто? Не пригадаю обличчя, але платили карткою, це точно в терміналі лишилось.»`
}));
motiveEvs.push(add({
id: 'mot_card', side: 'analyst', at: { type: 'sys', sys: 'bank' }, q: { sys: 'bank', match: ['термінал', ctx.district.buildings.find(b => b.id === 'shop').name] }, requires: ['mot_supplies'],
title: 'Термінал мінімаркету', tag: 'мотив',
detail: `Транзакція по картці за ту закупівлю: ${killer.name}. Стяжки, скотч, брезент і ланцюг — за три дні до смерті жертви.`,
gives: { pointsTo: killer.id, motive: true }
}));
motiveEvs.push(add({
id: 'mot_ransom_note', side: 'field', at: { type: 'unit', unit: killer.home, slot: 'письмовий стіл' },
title: 'Чернетка вимоги викупу', tag: 'мотив',
detail: `Аркуш із друкованими літерами, тричі переписаний: «200 000 за життя. Поліція = труна.» Адресат — рідня жертви. Лист так і не знадобився: викрадення пішло не за планом.`,
gives: { motive: true }
}));
add({
id: 'mot_relative', side: 'field', at: { type: 'person', cid: relative.id }, needsIdentity: true,
title: `Розмова: ${relative.name}`, tag: 'мотив',
detail: `${ctx.g(relative, 'Далекий родич', 'Далека родичка')} жертви. «За день до того був дзвінок із прихованого номера. Мовчали. Дихали. Я ще пожартувала: „Може, викрасти хочуть?" Господи.»`
});
const recapWhy = `План був інший: викрасти живою людину, тримати в елінгу і взяти з рідні 200 000. Але жертва пручалася — і план скінчився в перші ж хвилини. Автор плану — ${killer.name}.`;
const herringLead = `«${herring.name} нещодавно в барі розпитува${ctx.g(herring, 'в', 'ла')}, хто в районі має гроші і хто живе сам. Тоді здалося балачкою.»`;
return { motiveId, recapWhy, herringLead };
}
module.exports = { generate };