Мой предыдущий пост "Как сделать 3D шутер на JavaScript за пару дней" показал, что тема разработки браузерных игр весьма интересна и по этому я решил очередные выходные посвятить еще одной моей задумке.
На этот раз выходные выпали на новогодние праздники и времени свободного было несколько больше чем обычно, по этому и повествовать я буду не спеша и начну с небольшой истории.
2002 год. Лето
Десять лет назад я работал ночным сторожем, но сторож из меня был не совсем обычный. Так как я был с детства помешан на компьютерах (в семь лет первый раз познакомился с Агатом), то на работу я приходил со своим ноутбуком и модемом и действительно не спал до 10 утра следующего дня.
Всю ночь я проводил в сети. Мне было очень удобно так «работать», ведь по сути я получал деньги за то, что и так делал чаще всего по ночам, только в этом случае не надо с кем-то делить телефонную линию и по темной квартире за кружкой чая ходить очень тихо. И все было здорово и гладко, пока вдруг не начались достаточно частые перебои у провайдера, которого, по ряду причин, я не мог сменить. Так как к работе я всегда отношусь достаточно серьезно, а не спать без коннекта было тяжело, срочно нужна была замена в виде «оффлайн» развлечения.
Вот именно тогда я и скачал где-то довольно интересную «игрушку». Я к сожалению не могу сейчас точно вспомнить ее название, вероятнее всего «Fish Tycoon», написал ее русский программист (это точно). В игре предлагалось построить свою империю основанную на торговле рыбой (ну да, а почему бы и нет), постепенно расширяя торговую сеть необходимо было освоить весь рынок, что являлось результатом и могло в теории привести к победе в игре (так и не получилось). Сторожем я работал примерно пол года и за это время успел наиграться.
Шли года, я сменял места работы, занимался своим бизнесом, нанимался снова, переезжал в другой город, создавал различные проекты, но частенько с теплом вспоминал те пол года и «ту самую» игру. Скажу честно, идея написать аналог поселилась в голове наверное года два назад, но я всегда отодвигал эту затею по ряду обстоятельств. К тому же мне всегда казалось, что там будет уйма кода.
2013 год. Зима
И вот пришли очередные новогодние праздники. Как и положено я закончил все дела до конца года, закрыл все обязательства и с чистой совестью и весельем встретил дома новый год со своей семьей. Ожидая со дня на день очередное пополнение в семье, я не мог себе позволить выпить за столом более чем фужер шампанского, по этому уже первого января, когда все мирно посапывали в своих кроватках я лежал и продумывал архитектуру нового проекта.
Я почти сразу решил не акцентироваться на рыбе, хотя ностальгия и заставила сначала дать проекту кодовое название «fish», я затем решил абстрагироваться от названия товара, оставив собственно только слово «товар».
И вот в ночь с первого на второе я уселся за свой ноутбук и сделал первые наброски. Во первых я четко решил, что у меня будет удобный график, отражающий ситуацию на рынке в режиме реального времени и он точно будет на SVG. Вот такой:
Во вторых я поставил цель разработать за пару ночей простую модель, в которой будет и элемент риска и практичный расчет.
Итак, что же в итоге получилось
Не имя знаний в экономике и финансах, я строил модель по свои правилам. Самая главная цифра — стоимость товара в конкретный промежуток времени (закупочная стоимость), я рассчитываю ее с помощью времени суток и синуса, а так же некоторого количества вызовов Math.random().
Имея эту цифру, как отправную точку, довольно легко придумать вариант расчета цены для продажи, а уж получив пару этих значений и сдобрив их некоторым количеством «случайностей» можно выудить коэффициент активности покупателей.
Для того что бы продавать закупленный товар, нам необходимо иметь место сбыта и сотрудника, который будет этим заниматься.
Для этого я реализовал модель маленького магазинчика, которую легко можно трансформировать в склад, другие варианты магазинов или офис. Так же можно добавить несколько вариантов сотрудников — менеджеров для увеличения рентабельности торговых операций и бухгалтеров, которые помогут оптимизировать налогообложение.
Весь код очень прост, менять различные формулы и коэффициенты можно до бесконечности, признаюсь, я залип на этом деле как-то раз до 5 утра. Получилась игра в игре.
Вернемся к процессу. Игровой цикл рассчитывается по 24-часовому принципу, с 23:00 до 5:00 следующего дня, любые торговые операции прекращены, а в выходные не работает рынок, по этому закупить новую партию товара нельзя. В остальное время автоматически происходит процесс торговли, в цикле просчитывается вероятность продаж, ее объем с учетом количества продавцов в магазине.
Кстати продавцы знают сколько времени они уже работают, какое количество товара уже реализовали, это можно будет использовать в дальнейшем для моделирования процесса увеличения опыта в торговле или например что бы требовать повышения зарплаты угрожая владельцу увольнением.
Что бы не ждать долго пока пройдет ночь или выходные, можно использовать различные варианты ускорения процесса х5 и х10 для того, что бы сутки пробегали незаметно.
При запуске выдается небольшая справка по игровому процессу и список кнопок, которыми пользоваться удобнее, чем мышью.
Покупая и продавая товар, мы постепенно упираемся в потолок размера запасов товара, тогда нужно арендовать еще магазины и нанимать продавцов, ежесуточно выдается расчет, сколько продано, на какую сумму, подсчитываются расходы на аренду, оплату продавцов и подводится итог.
Кстати все события транслируются в лог и всегда можно нажать паузу и вникнуть в детали происходящего.
Можно достаточно долго рассказывать о том, какие еще моменты поджидают в процессе игры, но тогда будет не так интересно играть.
Чуть не забыл, в названии топика фигурирует «4200 байт» — это размер после упаковки и сжатия gzip всех .js файлов проекта.
Вспоминая пожелания читателей предыдущего топика, все исходники я выложил на github для детального изучения.
Данная версия не будет обновляться и никакие недочеты не будут исправляться, я хочу оставить этот проект для себя, но если вдруг кто-то загорится идеей — пожалуйста используйте на здоровье.
Прошлый раз много вопросов было написано лично, предлагаю в этот раз все писать в комментариях к посту.
Автор: tsmar