--$Name: Тест открывания$ --$Version: 1.0$ --$Author:Александр Яковлев$ require 'parser/mp-ru' mp.undo = 1 room { nam = 'main'; decor = [[ Добро пожаловать в тестовую комнату.^ Попробуйте открыть или отпереть замок. ]]; title = 'Тестовая комната'; } obj { -"код/мр|бумажка/жр"; nam = 'code'; description = 'Листок бумаги с кодом: 1234.'; found_in = 'main'; } obj { -"отмычка/жр"; nam = 'pin'; description = 'Отмычка для слишком умных замков. Ведёт себя как ключ.'; found_in = 'main'; } obj { -"карандаш/мр"; nam = 'pencil'; description = 'Карандаш, которым нельзя открывать замки.'; found_in = 'main'; } -- действие "писать карандашом на бумажке" не входит в тестируемые -- и требует нового глагола, но оно было бы в реальной игре obj { -"замок/мр"; nam = 'lock'; found_in = 'main'; description = 'Надёжный умный замок. Его можно открыть правильным цифровым кодом или ключом.'; -- замок можно открыть двумя вещами, поэтому with_key не уместен -- вместо этого надо перехватывать before_Unlock -- кроме того, его хочется сразу открывать, потому что зачем ещё мы его отпираем before_Lock = 'Замок полезнее открытым.'; before_Unlock = function(self, what) if (what == nil) then return false end if self:has('open') then return 'Но он уже открыт.'; end if (what ^ 'code') then pn 'Вы читаете бумажку и вводите код.' self:attr('~locked'); self:attr('open'); self:attr('~closed'); return false; end if (what ^ 'pin') then pn 'Вы взламываете замок отмычкой.'; self:attr('~locked'); self:attr('open'); self:attr('~closed'); return false; end return 'Нет, этим замок не отпереть.'; end; }:attr 'locked,openable,closed'