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

39 lines
2.9 KiB
JavaScript
Raw Permalink 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 { md5 } = require('../rng');
function generate(ctx) {
const { r, add, addPuzzle, motiveEvs, victim, killer, herring, atScene } = ctx;
const motiveId = 'Свідок злочину';
const pin = String(victim.birthYear);
const pinPuzzle = addPuzzle({
id: 'pz_pin', kind: 'pin', prompt: 'Телефон жертви заблоковано 4-значним PIN-кодом.',
hash: md5(pin), answer: pin, hint: 'Люди ставлять те, що не забудуть: спробуйте рік народження з досьє.'
});
add({
id: 'sf_phone_locked', side: 'field', at: atScene,
title: 'Телефон жертви (заблокований)', tag: 'мотив',
detail: 'Екран у павутинні тріщин, але апарат вмикається. PIN. Аналітик може спробувати підібрати.'
});
motiveEvs.push(add({
id: 'mot_photos', side: 'analyst', at: { type: 'lab' }, requires: ['sf_phone_locked'], needsIdentity: true, puzzle: pinPuzzle,
title: 'Фото в телефоні жертви', tag: 'мотив',
detail: `Нічні знімки: постать у ${killer.coat} заносить велосипеди в елінг на причалі. Обличчя не видно. Дата — за чотири дні до вбивства.`,
gives: { filter: { attr: 'coat', val: killer.coat } }
}));
motiveEvs.push(add({
id: 'mot_boathouse', side: 'field', at: { type: 'spot', building: 'pier', spot: 'елінг' }, requires: ['mot_photos'],
title: 'Обшук елінгу', tag: 'мотив',
detail: 'Шість велосипедів зі спиляними номерами рам, добрі замки зрізані болторізом. На стіні — оголошення «продам недорого» з номером.',
gives: { motive: true }
}));
motiveEvs.push(add({
id: 'mot_ads', side: 'analyst', at: { type: 'sys', sys: 'phone' }, q: { sys: 'phone', kind: 'owner', match: killer.phone }, requires: ['mot_boathouse'],
title: 'Номер з оголошення', tag: 'мотив',
detail: `Номер з оголошення в елінгу зареєстровано: ${killer.name}, прож. ${killer.home}. Жертва сфотографувала крадія — і крадій це помітив.`,
gives: { pointsTo: killer.id, motive: true }
}));
const recapWhy = `Жертва випадково сфотографувала нічні «рейси» з краденими велосипедами. Крадій — ${killer.name}. Свідка прибрали.`;
const herringLead = `«Кажуть, ${herring.name} вечорами вічно біля елінгу — разів п'ять там ${ctx.g(herring, 'крутився', 'крутилася')}. Чого — хтозна.»`;
return { motiveId, recapWhy, herringLead };
}
module.exports = { generate };