40 lines
3.7 KiB
JavaScript
40 lines
3.7 KiB
JavaScript
const { caesar, ri } = require('../rng');
|
||
|
||
function generate(ctx) {
|
||
const { r, add, addPuzzle, motiveEvs, victim, killer, herring, district } = ctx;
|
||
const motiveId = 'Кримінальний бізнес';
|
||
const shift2 = ri(r, 3, 9);
|
||
const plain2 = `Частка ${killer.last} ${killer.first[0]}. — сорок відсотків. Не сплачено двічі. Точка — склад маркету.`;
|
||
const czPuzzle2 = addPuzzle({
|
||
id: 'pz_caesar', kind: 'caesar', prompt: 'Зошит обліку, писаний нечитабельними літерами.',
|
||
payload: caesar(plain2, shift2), answer: plain2, shift: shift2, hint: 'Схоже на шифр зсуву (Цезар): переберіть усі зсуви абетки.'
|
||
});
|
||
motiveEvs.push(add({
|
||
id: 'mot_ledger', side: 'field', at: { type: 'unit', unit: victim.home, slot: 'кухня' }, needsIdentity: true, puzzle: czPuzzle2,
|
||
title: 'Зошит подвійної бухгалтерії', tag: 'мотив',
|
||
detail: 'У бляшанці з-під кави — зошит: колонки сум без підписів і шифровані нотатки. Легальних доходів на такі колонки жертва не мала. Розшифруйте — і стане видно, з ким ділили.',
|
||
gives: { pointsTo: killer.id, motive: true }
|
||
}));
|
||
motiveEvs.push(add({
|
||
id: 'mot_stash', side: 'field', at: { type: 'spot', building: 'shop', spot: 'склад' }, requires: ['mot_ledger'],
|
||
title: 'Тайник на складі', tag: 'мотив',
|
||
detail: 'За стелажем із мінералкою — коробки без маркування, лише код маркером. Той самий код — у зошиті жертви. Контрабандний товар ішов через район тихо і давно.',
|
||
gives: { motive: true }
|
||
}));
|
||
motiveEvs.push(add({
|
||
id: 'mot_bank_biz', side: 'analyst', at: { type: 'sys', sys: 'bank' }, q: { sys: 'bank', match: [victim.name, killer.name] }, needsIdentity: true,
|
||
title: 'Синхронні внески', tag: 'мотив',
|
||
detail: `Два рахунки, однакові готівкові внески в ті самі дати, місяць за місяцем: рахунок жертви — і рахунок ${killer.name}. Партнерство, якого офіційно не існувало. Останні два місяці вносила тільки жертва.`,
|
||
gives: { pointsTo: killer.id, motive: true }
|
||
}));
|
||
motiveEvs.push(add({
|
||
id: 'mot_bar_corner', side: 'field', at: { type: 'person', cid: ctx.witnessFrom(ctx.citizens.filter(c => c.workplace === 'bar')).id }, needsIdentity: true,
|
||
title: 'Свідчення з бару', tag: 'мотив',
|
||
detail: `«Ці двоє завжди сідали в кутку, рахували щось у зошиті. Останнім часом — на підвищених тонах. Слово «частка» я чув частіше, ніж «будьмо».»`
|
||
}));
|
||
const recapWhy = `Через район тихо йшов контрабандний товар; частки ділили за зошитом. Коли жертва двічі не заплатила партнерську частку, партнер — ${killer.name} — ${ctx.g(killer, 'закрив', 'закрила')} баланс назавжди.`;
|
||
const herringLead = `«Шукаєте, хто мутить? ${herring.name} на склад маркету заходить частіше, ніж туди завозять хліб. Просто кажу.»`;
|
||
return { motiveId, recapWhy, herringLead };
|
||
}
|
||
|
||
module.exports = { generate };
|