Skip to content

About

Социальная ферма, где всё растёт в реальном времени: Unity 6 (WebGL/URP/UI Toolkit) + сервер на Python stdlib и SQLite. Social farming game on real-world time — crops ripen over real hours, hand-harvested; friends, visits, gifts, player market. Art: CC0 by Kenney & Quaternius, Inter font (OFL).

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

36 Commits

Folders and files

Repository files navigation

Farm Online

Социальная ферма, где всё растёт в реальном времени. Культуры первой ступени созревают за пять минут, восьмой — за двенадцать часов. Урожай игрок собирает сам, кликом, а сохранение хранится на сервере. Пока вас нет, ферма продолжает расти — ради этого в игру и возвращаются.

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

Движок Unity 6000.5.6f1 (Unity 6.5), URP Forward+
Интерфейс UI Toolkit (UXML/USS), без uGUI
Управление Input System — мышь и тач
Сеть UnityWebRequest + Awaitable, только HTTP
Сервер Python (только стандартная библиотека) + SQLite
Клиент WebGL, около 18 МБ в gzip

Как запустить

1. Запустите сервер. Игра работает и без него, но тогда прогресс не сохраняется между запусками.

python Tools/server.py

Сервер один: он отдаёт и файлы веб-сборки, и API (/api/*, база — Tools/farm.db). Всё работает на порту 8000, так что проблем с CORS не возникает. Если папки Build/Web нет, сервер запустится только с API — этого достаточно, чтобы играть из редактора. Порт менять нельзя: сессии игроков хранятся в PlayerPrefs, а браузер привязывает их к домену и порту.

2. Откройте Assets/Scenes/MainMenu.unity — это стартовая сцена (индекс 0). Нажмите Play и создайте ферму: придумайте название и пароль. Главное меню загрузит сохранение с сервера и передаст его в сцену фермы.

3. Сама ферма — Assets/Scenes/FarmerDemo.unity. Её можно открыть и напрямую, но тогда сохранение не загрузится и игра начнётся с нуля.

Что делать в игре: собирать созревший урожай, объединять грядки перетаскиванием, поливать и удобрять их инструментами с нижней панели, покупать в «Магазине», выполнять заказы горожан, приглашать друзей и ходить к ним в гости.

Веб-сборка

В редакторе — меню Farm → Собрать веб-версию. Из командной строки:

Unity -quit -batchmode -projectPath . -executeMethod Farm.Game.EditorTools.WebBuild.BuildFromCommandLine

Все настройки плеера задаются в WebBuild.cs, а не вручную в окне Player Settings. Иначе рано или поздно настройки в инспекторе разойдутся с тем, как игра собирается на самом деле. Сборка занимает около четырёх минут и складывается в Build/Web. Используется сжатие gzip, а не brotli: brotli экономит 4,3 МБ, но браузеры принимают его только по HTTPS.

Устройство кода

Код разбит на восемь сборок: Farming (ядро), Characters (жители), Net (сеть), Interaction (мышь и тач), Juice (визуальные и звуковые эффекты), UI, Game (игровая сессия, сцены, окна) и инструменты редактора. Архитектура держится на трёх правилах.

  1. Никакого поиска по сцене. Все игровые объекты регистрируются в статических реестрах (GrowableRegistry, BuildingRegistry, MovableRegistry и т. д.) с операциями за O(1). Нужна ближайшая созревшая грядка — спрашиваем реестр, а не вызываем FindObjectsByType.

  2. Рост считается от времени посадки, а не таймером. Грядка хранит момент, когда её засадили, и в любой момент может вычислить свою стадию. Один GrowthScheduler на всю ферму будит грядки ровно тогда, когда у них меняется стадия. Время берётся с сервера в unix-секундах (ServerClock), поэтому ферма, которую не открывали всю ночь, догоняет реальное время за один вызов.

  3. Системы общаются через события. Ядро генерирует события, а звук, частицы, UI и сеть на них подписываются. Если убрать Juice или UI, игра продолжит работать — просто без звука и интерфейса.

Правила игры

  1. Собирать урожай и объединять грядки может только игрок. Нанятый житель собирает лишь простые культуры — не выше третьей ступени. Дорогие культуры, которые растут часами, автоматически не собираются никогда. Гость может помочь хозяину с пятью грядками, урожай при этом достаётся хозяину.

  2. Ночные ресурсы — только для игрока. Светлячков и росу можно собрать только вручную.

  3. Случайность — для атмосферы, а не для решений. Взгляды, мысли жителей и небольшой разброс в таймингах не влияют на то, чем житель займётся, каким путём пойдёт и как быстро будет работать. Случайность в работе выглядит как баг, а в безделье — как жизнь.

Объединение грядок («Слияние 2.0»). Объединять можно грядки одной культуры любого уровня: уровни складываются, максимум — 20. Две грядки двадцатого уровня превращаются в грядку уровня 10 с культурой следующей ступени той же линейки. Это необязательный способ получить дорогие культуры, и он намеренно позволяет обойти ограничение по уровню игрока.

Сервер

Tools/server.py — один процесс на стандартной библиотеке Python: раздача статики, REST API и SQLite. Что он умеет:

  • аккаунты по названию фермы и паролю. Клиент отправляет не сам пароль, а его sha256 с названием фермы в качестве соли; на сервере хранится PBKDF2-HMAC-SHA256 с 600 000 итераций;
  • отдельные сессии для каждого устройства;
  • друзья — заявку нужно явно принять;
  • асинхронные визиты на чужие фермы;
  • подарки;
  • рынок, где цены на лоты фиксированы по каталогу;
  • HTTPS (--cert и --key).

Насколько сервер доверяет клиенту. Игровую логику считает клиент, и сервер ему доверяет. Сервер отвечает за время, аккаунты и базовые проверки на явно некорректные данные (лимиты золота, числа грядок, уровней). Ещё он применяет мягкую эвристику по экономике на основе выгрузки каталога (Tools/catalog.json): подозрительная ферма помечается, но сохранение не отклоняется. Чтобы полностью пересчитывать экономику на сервере, пришлось бы продублировать там весь каталог контента и все бонусы. Делать это до того, как у игры появятся настоящие игроки, пока нет смысла.

Ассеты

Вся 3D-графика и звуки — бесплатные наборы Kenney и Quaternius под лицензией CC0. Шрифт — Inter под SIL OFL 1.1. Полный список наборов и лицензий — в CREDITS.md.

Иконки ресурсов и деревянное оформление интерфейса сгенерированы скриптами Tools/icons.py и Tools/skin.py.

Лицензия

Код распространяется под лицензией MIT. На сторонние ассеты действуют лицензии их авторов — см. CREDITS.md.


In English

A social farming game on real-world time: crops ripen over real minutes and hours (5 minutes at tier 1, 12 hours at tier 8), the player harvests by hand, and the save lives on the server — so the farm keeps growing while you're away. Friends, visits to other farms, gifts, a player market, and a colony of residents who do everything except the harvesting.

Unity 6.5 (URP, UI Toolkit) on the client; the server is a single Python file — standard library plus SQLite — serving both the WebGL build and the REST API on one port. Code is MIT licensed; art is CC0 from Kenney and Quaternius. Source, comments and in-game text are in Russian.

About

Социальная ферма, где всё растёт в реальном времени: Unity 6 (WebGL/URP/UI Toolkit) + сервер на Python stdlib и SQLite. Social farming game on real-world time — crops ripen over real hours, hand-harvested; friends, visits, gifts, player market. Art: CC0 by Kenney & Quaternius, Inter font (OFL).

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages