sharpc (sharpc) wrote,
sharpc
sharpc

Category:
  • Music:

Как правильно сдавать сессию

xxx: Начало семестра, все расслаблены, лекции пропускают, лабы не делают.
xxx: И только Саша с каменным лицом вещает: "Зима близко"


Я недолюбливаю текстовые квесты, но для этого делаю исключение. «Герои мата и меха» (vk) — великолепная игра, в которой предлагается сдать сессию на матмехе СПбГУ, весьма хардкорная и насыщенная. Она написана на Borland Pascal и уже не запускается под Windows 7, поэтому я реконструировал ее и выложил в веб.



http://esci.ru/_/mmheroes/
Зеркало: http://bombermine.ru/-/mmheroes/

Зеркало 2018: https://sharpden.github.io/mmheroes/


Как это сделано
Исходно это 16-битный DOS EXE-файл размером 96 КБ. Дизассемблер дал листинг на 1.4 МБ, из которого путем полуручной-полуавтоматической декомпиляции (4 дня на декомпиляцию, 3 дня на огламуривание кода, 5 дней на багфикс и день на серверную часть) я получил 194 КБ кода (внутри квеста персонажи сообщают, что на Pascal игра занимала 120 КБ (и что автор хотел переписать ее на JavaScript :))) или 6000 строк на JavaScript + дописал 800 строк обвязки.

После завершения первой недели декомпиляции я вдруг сообразил, что у меня в руках почти 200 килобайт синхронного кода, в котором вызываются ReadKey, что не очень совместимо с асинхронной событийной моделью JavaScript. triampurum предложил переписать это с использованием Continuation-Passing Style, но 124 точки асинхронности и 150 функций меня от этого отговорили. Как и обычно, более практичным оказался квадратно-гнездовой подход: просто сохранять все асинхронности и индетерминированности (нажатые клавиши, выбранные пункты диалогов и значения ГСЧ), и перезапускать игру с начала, подсовывая сохраненные значения, пока они не кончатся. Производительность современных компьютеров и движков JavaScript оказалась вполне достаточной, чтобы в ходе средней игры исполнять заново всю программу порядка 1000 раз (при каждом нажатии клавиши).

Для оптимизации, вывод происходит только после крайнего ClrScr. Баги в основном были связаны с нецелочисленным делением в JavaScript, несколькими забытыми непереведенными структурами, побочными эффектами вывода при реплее, а самый эпичный был связан с изредка возникающими странностями вроде отрицательных знаний или скачущего времени. Оказалось, что first_run, отвечающий за то, выводить ли сплэш-скрин, был локальным, и при реплее выводил его, съедая одно нажатие клавиш. Это приводило к перегенерации около 80 значений ГСЧ, которые потом возвращались в совсем других вызовах. Два дня дебага :) Увы, jslint оказался почти бесполезным, а use strict мало полезным.

Программа использует Ajax для серверного топа и local storage для хранения введенного при выигрыше ника.

Как в это играть
Программа содержит встроенную справку в пункте меню ЧТО ДЕЛАТЬ ???. Немного поиграв, вы обнаружите, что нельзя так просто не то что сдать сессию, а даже дожить до ее конца, поэтому приведу здесь выжимку из советов внутриигровых персонажей. Осторожно, спойлер!

Игроку надо сдать все зачеты, кроме, возможно, двух, при этом обязательно следует следить за здоровьем, которое отнимается при любых действиях, кроме отдыха в общаге. Обычно можно забить на геометрию, потому что она в ПОМИ, а туда надо ехать, что сильно подрывает здоровье, деньги, зачеты обычно короткие и сложно успеть все сдать. Чтобы сдать предмет, надо его выучить хотя бы до белой надписи (не цифры). Алгебру самому делать это безумие, но, к счастью, в мавзолее сидит Коля, который все прорешает за день, если высокая харизма, однако он поит тормозной жидкостью, поэтому следует взять стипендию у Паши и покупать ему настойку овса. После того, как Коля все прорешает, надо заглянуть на алгебру, в тот же час и поставят. У Саши надо каждый день просить конспект по матану, пока не даст: конспект позволяет ботать сильно быстрее, плюс ботва отнимает меньше здоровья. Основной предмет, выходит, матан. В Терком лучше не ходить, в игрушку Диамонда лучше не играть :)), RAI и NiL очень любят мешать — из-за них обычно нельзя так просто взять и высидеть трехчасовой зачет, даже если был с отличным здоровьем. Мораль поднимает Паша, но забирает за это знания. Никогда не следует отказываться от приглашений соседа, иначе падает харизма, а на нее завязано вообще все.

А еще в этой игре Inception появился на 11 лет раньше, чем в фильме :)

Когда работа по реконструкции и внесению багов была почти завершена, triampurum флегматично сообщил мне, что автор оригинала у меня во взаимных френдах :)



Как всегда, искренне ваш, старший некромант Кел'Тузед фон Шарпиц.

UPD: Я собрал немного статистики, чтобы было, что анализировать и знать, как ее собирать в следующий раз.

На текущий момент (полночь на 26 сентября) в БД 24477 записей (сервер дергается каждый прожитый в игре день) от 1805 игроков (уникальных IP), всего начато игр 13111, при этом только 269 из них (2.05%) для 120 (6.65%) игроков завершились с ненулевым результатом. Из этих игроков чуть больше трети (640) дотерпели до второго дня и всего 170 дожили до конца недели.


число записей за час

О стратегии чемпионов по очкам: топовый сейчас игрок (kharchev) не сдал алгебру и геометрию, его финальный счет всего 38, зато он раскачал с конспектом знание матана до 433 и заработал 2022 рубля. Больше 1000 очков набрали пятеро: kharchev — 2060, dk — 1256, Yaro — 1251, burunduk3 — 1222, SOK — 1220, из которых только dkirienko москвич :)

В код было вставлено довольно много ассертов, но ни одного багрепорта не поступило, оба замеченных после анонса бага (иногда jquery не успевал загрузиться и кафе в ПОМИ не работало) были замечены мной. Как указывалось выше, jslint и use strict оказались бесполезны, а вот google closure compiler в режиме advanced выдал 243 варнинга, некоторые из которых оказались полезными (и, в частности, указали бы на баг с кафе).

На игру и этот пост ППБ находит 24 ссылки (20 из них в твиттере), вконтакте 18. Самые активные обсуждения:
на стене у Олега Давыдова 18 комментов, 103 лайка;
здесь 15 комментов;
на стене у Дмитрия Антипова 10 комментов, 17 лайков;
на Codeforces 9 комментов, рейтинг записи +111.
Если я не ошибаюсь, это моя первая запись, которая активнее всего обсуждалась не здесь :) И 332 поста в теорминосраче на rsdn, и 17 комментов в обсуждении советского Яндекса на vott.ru не превысили соответственно 625 и 24.

Какой-нибудь интересной корреляции между временем репоста и посещаемостью замечено не было.

Слава героям!

Tags: головоломки, игры
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 18 comments