Смогли бы вы управлять спортивным магазином, где покупателей генерируют алгоритмы? Для тех, кто думает, что справился бы, мы в N + 1 вместе со Sportmaster Lab сделали симулятор. Если сможете в игре заработать много денег и превратить небольшой магазин в огромный ТЦ, есть шанс получить работу и развивать сеть настоящих магазинов. Главное, не забывайте поглядывать в лог.
Как играть?
Если коротко
После выбора уровня сложности вам откроется восхитительный мир малого и среднего бизнеса.
Вам необходимо выполнить те условия, что указаны в описании уровней сложности - и победа ваша.
Важно: получить удовольствие от игры можно на любом уровне сложности, но приглашение на работу будет только при победе на уровне "ООО". Сразу предупреждаем - это непросто.
Мы постарались сделать игру максимально понятной, поэтому список действий довольно логичен:
- * придумайте название вашего магазина
- * купите или арендуйте отдел в торговом центре
- * можете придумать название для каждого отдела
- * во вкладке "Склад" закажите товары
- * дождитесь доставки товара
- * на этом этапе можно установить справедливую (на ваш взгляд) цену
- * выберите нужный отдел и разместите там товар
- * покупатели уже на пороге!
Важно: Сразу же после того, как вы купите или арендуете первый отдел, начнётся действие: покупатели отправятся штурмовать ваш магазин.
Тайминг
В игре встречаются периодические и отложенные события, например зарплаты, налоги и доставка.
Хотим сразу предупредить, что доставка занимает случайное, но небольшое время, а налоги происходят в три раза реже, чем зарплата.
Особенности
Игра происходит в реальном времени, однако её можно поставить на паузу, если вам нужно принять важное решение.
В игре присутствует возможность автосохранения: игра сохраняется в пределах вкладки и только при положительном балансе, так что случайное обновление страницы не убьёт ваш прогресс. Однако, если вы закроете вкладку с игрой, прогресс сотрётся. Всё как в настоящем бизнесе, мы проверяли!
Обязательно загляните в настройки: помимо разных твиков интерфейса можно установить автоматическую цену с помощью изменения формулы цены на продажу.
Не забывайте, что когда вы выставляете товары на полки в отделе, они исчезают со склада. Многие забывают.
Покупатели
Покупатели в игре - обычные люди. У них свой характер, свои особенности восприятия и любовь к брендам. Некоторые покупатели могут довольно громко заявить об удачной или неудачной покупке, похвалить вас или посетовать на высокие цены. Даже если покупателю что-то не понравится, он немного подождёт, может быть, подкопит денег, после чего даст магазину ещё один шанс. А уж если покупатель будет доволен покупкой, будьте уверены, он ещё вернётся! В поведении покупателей есть ряд интересных особенностей, но мы предлагаем вам раскрыть их самостоятельно; кроме того, так как все примеры поведения мы взяли из реальной жизни, вы можете попробовать различные маркетинговые трюки - кто знает, возможно, мы это предусмотрели.
API
-
Мы же N+1, как мы можем не дать возможность автоматизировать процесс? Это может быть увлекательнее самой игры!
Специально для самых хардкорных наших читателей мы сделали Javascript-API, которое можно использовать в Devtools. Важно: скрипты не сохраняются. Если вы обновили страницу, вам заново нужно применить код, благо в Devtools есть возможность сделать это. Поверьте, так лучше.
Доступные методы
- /** * Давайте определимся, что список товаров может представлять из себя такую структуру данных: * @typedef {string[]|string|{number}} ITEMS * * Она соответствует примерно таким вариантам: * * просто id товара: * items = 'ivan:volleyball-net'; * * массив из id товара: * items = ['ivan:volleyball-net', 'indigiir:volleyball-net']; * * объект, где ключом является id товара, а значением - количество или цена, * в общем, нужное в конкретной ситуации поле: * items = { * 'ivan:volleyball-net': 10, * 'indigiir:volleyball-net': 20 * }; * * В первом примере мы всё распишем подробно. */
- /**
* Произвести закупку
*
* Пример:
*
api.buyIn('rybak:baseball-cap', 10)
*api.buyIn(['rybak:baseball-cap', 'bananas:baseball-bat'], 10)
*api.buyIn({'rybak:baseball-cap': 10, 'bananas:baseball-bat': 10})
* * @param {ITEMS} items * @param {number} amount - если items - объект, то не указывать * @return {boolean} */api.buyIn(items, amount)
- /**
* Купить отдел на определённой клетке поля.
*
* Пример:
*
api.buyStack({cell: 8})
* * @param {number|null} cell - если не указано, то используется первая свободная клетка */api.buyStack({cell = null})
- /**
* Арендовать отдел на определённой клетке поля.
* @param {number|null} cell - если не указано, то используется первая свободная клетка
*/
api.rentStack({cell = null})
- /**
* Выкупить отдел
*
* Пример:
*
api.redeemStack(7)
* * @param {number} cell - обязательно */api.redeemStack(cell)
- /**
* Посчитать цену закупки товара с учетом доставки
*
* @param {ITEMS} items
* @param amount - если items - объект, то не указывать
*/
api.calculatePrice(items, amount)
- /**
* Установить формулу цены на продажу.
*
* @param {string} formula
*/
api.setPriceFormula(formula)
- /**
* Установить цену на товар/товары
*
* @param {ITEMS} items
* @param {number} price - если items - объект, то не указывать
*/
api.setPriceForItems(items, price)
- /**
* Индексы всех купленных отделов
*
* @return {number[]}
*/
api.stacks()
- /**
* Индекс стека на клетке
*
* @return {number}
*/
api.stackAtCell(cell)
- /**
* Свободное место в стеке
*
* @param {number} stack - индекс стека
* @return {number}
*/
api.stackFreeSpace(stack)
- /**
* Все вещи на вашем складе
* @return {ITEMS}
*/
api.itemsAtStock()
- /**
* Все вещи в определенном отделе
* @param {number|{cell:number}} stack - индекс отдела или клетка
* @return {ITEMS}
*/
api.itemsAtStack(stack)
- /**
* Переместить вещи со склада на полку отдела.
* Важно: если вы указали больше вещей, чем есть на складе,
* мы переместим максимум из того что сможем.
*
* @param {number|{cell:number}} stack - индекс отдела или клетка
* @param {ITEMS} items
* @param {number} amount - если items - объект, то не указывать
*/
api.itemsToStack(stack, items, amount)
- /**
* События. Их у нас только два, но каких!
*
* в отделе всё раскуплено:
*
api.on('stack.empty', stack => {...});
* * в отделе раскуплен какой-то конкретный товар: *api.on('sold', ({stack, item}) => {...});
* * @param {string} event * @param {(*)} callback */api.on(event, callback)