Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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/* с базой 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

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages