?

Log in

No account? Create an account

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

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.

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

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

Comments

Спасибо!

Не помню точно как я в нее играл, но в целом стратегия была такая. На ПОМИ забиваем, на алгебру - забиваем. Все силы бросаем на анализ. Сидим, зубрим, готовимся к анализу чтобы знать его очень-очень круто. Остальные зачеты сдаем при случае. Спать ложимся рано, тогда рано встаешь, самочувствие хорошее, утром готовишься и соседи по вечерам на пьянки не зовут.

А теперь главная фишка. На матане надо ходить и общаться с NiL. Решаешь ей задачи за деньги, а если круто знаешь матан, то она хорошо платит. В результате я заканчивал игру примерно с 1000 рублей, если удачное расписание было.

Разбавьте баобаб, что ли :)
Разбавил - больше 600 рублей заработал. Незачет только по геометрии.
Ага, уже вижу :)
О да, ностальгия... Для химика игра была сложная, у нас зачёты как-то халявнее получать:)
ВНЕЗАПНО.

Приятно бывает узнать, что "этот рыболовный кружок ещё существует".

На самом деле я порывался несколько раз к очередной "неделе мат-меха" её переписать, но всякий раз дело глохло.

Edited at 2012-09-21 17:28 (UTC)
Сколько часов благодаря Вам потрачено --- и сколько щас потрачу, благодаря автору записи :) Спасибо вам обоим :)
С дуба рухнуть, кто бы мог подумать.

Спасибо тебе.
Вітаємо! Ваш запис потрапив у Рейтинг топ-25 популярних записів України!
За бажанням детальніше про рейтинги ви можете прочитати у розділі довідки.

(Анонимно)

Похоже на FIDO, только попроще
http://oldgames.com.ua/download/fido.php
Судя по объему исходников, проще как раз FIDO, примерно 2.5 килослок игровой логики против 7к у mmheroes.

Прям хоть на баш

xxx: "Герои мехмата" или "Сдать сессию и остаться в живых". Остросюжетный пошаговый симулятор мехматянина портирован из глубины веков на Javascript и доступен прямо из браузера.
esci.ru/_/mmheroes/

yyy: предлагаю ввести монетизацию - оплати зачёт по смс

LJournalist #2001

Пользователь tehi4ka сослался на вашу запись в «LJournalist #2001» в контексте: [...] и уже не запускается под Windows 7, поэтому я реконструировал ее и выложил в веб. С комментариями [...]

LJournalist #2001

Пользователь tehi4ka сослался на вашу запись в «LJournalist #2001» в контексте: [...] | Без комментариев [...]

Ахаха. Какая богатая идея!

Пользователь whenawake сослался на вашу запись в «Ахаха. Какая богатая идея!» в контексте: [...] Оригинал взят у в Как правильно сдавать сессию [...]

(Анонимно)

Багрепорт

Ссылка bugreport ничего хорошего не даёт, поэтому пишу сюда.

Багрепорт:

Если в последний день тебя приглашают на праздник, то выскакивает окошко с вот таким текстом:

TypeError: timesheet[day_of_week] is undefined

is_professor_here_today(0)@http://bombermine.ru/-/mmheroes/:5824
sub_1ECBC()@http://bombermine.ru/-/mmheroes/:5864
sub_1F0EA(1)@http://bombermine.ru/-/mmheroes/:6100
sub_1F184()@http://bombermine.ru/-/mmheroes/:6127
hour_pass()@http://bombermine.ru/-/mmheroes/:5760
invite_from_neighbor()@http://bombermine.ru/-/mmheroes/:1838
scene_obschaga()@http://bombermine.ru/-/mmheroes/:1898
scene_router()@http://bombermine.ru/-/mmheroes/:873
PROGRAM()@http://bombermine.ru/-/mmheroes/:792
Main()@http://bombermine.ru/-/mmheroes/:662
_update_key(13)@http://bombermine.ru/-/mmheroes/:447
([object Object])@http://bombermine.ru/-/mmheroes/:6825
([object Object])@http://code.jquery.com/jquery.min.js:2
([object KeyboardEvent])@http://code.jquery.com/jquery.min.js:2

Re: Багрепорт

На esci оно давно исправлено. А что за браузер?
Сдача физ-ры стоит 20 здоровья в час. Нужно 8 знаний.
Сдача ин-яза стоит 10 здоровья в час. Нужно 8 / 10 / 14 знаний, чтобы за час сдать 1 / 2 / 3 задачи.
Сдача инф-ки стоит 6 здоровья в час. Нужно 8 / 26 знаний, чтобы за час сдать 1 / 2 задачи.
Сдача геометрии стоит 8 здоровья в час. Нужно 7 / 25 знаний, чтобы за час сдать 1 / 2 задачи. Не принимает, если наботать более 26+2*харизма единиц.
Сдача матана стоит 14 здоровья. Нужно 9 / 17 / 33 / 57 / 89 знаний, чтобы за час сдать 1 / 2 / 3 / 4 / 5 задач.
Сдача алгебры стоит 20 здоровья. Нужно 13 / 31 / 67 / 121 знаний, чтобы за час сдать 1 / 2 / 3 / 4 задачи. Если в электричке, то 14 / 38 / 86 / 158 знаний.

Интеллект даёт случайный бонус к знаниям при сдаче. Низкое здоровье (менее 5) даёт случайный штраф к знаниям при сдаче.

Здоровье: пора помирать 1-8, плохое 9-16, так себе 17-24, среднее 25-32, хорошее 33-40, отличное 41+ и более.

Отдых в общаге добавляет 7-14 здоровья. На отдых в кафе/мавзолее влияет харизма.

Здоровье при перемещении по локациям:

компы/факультет/мавзолей -> общага: бесплатно
факультет <-> компы, компы -> мавзолей: 2 здоровья.
факультет <-> мавзолей, общага > мавзолей: 3 здоровья
ПУНК <-> ПОМИ: 0-9 здоровья (рандом), контролеры 10 здоровья

Подготовка. На эффективность влияет здоровье и интеллект (для физ-ры вместо интеллекта мораль). Начиная с 19 часов эффективность снижается на треть. Конспект даёт ещё +10 к знаниям, а его отсутствие отнимает до 10 здоровья (влияет мораль). Ночью (с 22 до 4) ещё -12 здоровья. При знаниях более 45 ещё -10 здоровья.

Игнорирование RAI или NiL стоит 8 здоровья, Миши бесплатно. Если заговорить и отказать, RAI вдарит уже на 10 здоровья, NiL может подпортить характеристики, Миша может подпортить только харизму. Помощь RAI безвредна для здоровья и поднимает интеллект в случае успеха. Помощь NiL отнимает здоровья столько же, сколько препод, но при успехе приносит денег соразмерно знаниям. Клоподавка Миши улучшает харизму.

C 10 до 21 часов Коля тусуется в мавзолее всегда, Саша на факультете с вероятностью 25% в час, Кузьменко на компах с вероятностью 25% в час, Паша на факультете если в этот день нет математических зачётов.

Коля может предложить решить 2 алгебры либо сразу, либо после настойки овса. На вероятность влияет рандом и харизма. Покупка настойки или отказ на харизму не влияют (просто тормозная жидкость губит интеллект).

Edited at 2018-12-28 19:34 (UTC)