Собствен продукт · Carrom

Истински карром, с физика, която написахме сами.

Carrom е настолна игра, проектирана първо за телефони, на дървена дъска с точна физика на дисковете. Има пет вида игра, сред които 29 Game и Tal Gach, които се играят в Бангладеш, Индия и Пакистан, с онлайн 1 срещу 1 и 2 срещу 2, ботове и игра на едно устройство. Една TypeScript кодова база работи в уеб, Android и iOS, а онлайн играта върви на наш собствен сървър за реално време.

На живо в мрежата, в App Store (iPhone и iPad) и в Google Play (Android).

  • Web (PWA)
  • Android
  • iOS
  • iPadOS
вида игра, всеки със собствен двигател за правилата
5
удара, идентични до бита във всички браузърни двигатели
4 320
автоматизирани теста: 396 модулни и 150 браузърни, всеки браузърен тест – на три размера на екрана
540+
първо зареждане при ограничена Fast 3G
≤ 3 s

Вътре в приложението

Истински екрани от работещото приложение, както се виждат в описанията в магазините.

Какво получават играчите

  • Пет вида игра

    Classic, 29 Game (първият до 29), Tal Gach (разбиване на кула от 19 фигури, първият до 170), Disc Pool и Freestyle, плюс ежедневно предизвикателство и обучение.

  • Онлайн 1 срещу 1 и 2 срещу 2

    Quick Match по рейтинг, с ботове на празните места, частни стаи, връзки за покана, които отварят приложението, лоби с отворени стаи, реванш, емотикони, часовник за ход от 20 секунди и рейтинг Elo за всеки вид игра.

  • Ботове и игра на едно устройство

    Ботове в 4 нива на трудност (от Easy до Expert) и 4 характера (балансиран, агресивен, защитен, майстор на трудни удари), всеки със собствено име и знаме, и игра за 2 или 4 играчи на едно устройство.

  • Напредък, който ви следва

    Монети, магазин с анимирани дъски, страйкъри и комплекти фигури, постижения, статистика и серии от дни. Влезте с Google или Apple, за да го пазите на всяко устройство.

  • Инструменти за оператора

    Административният ни панел показва игрите и играчите на живо, води модерацията, променя монетите на всеки играч със съобщение до него и сменя реклами, задължителни обновявания, подкани за оценка, превключватели на подбора на противници и дори оформление – без ново издание на приложението.

  • Навсякъде от една кодова база

    Уеб, Android, iPhone и iPad от една кодова база, с възможност за инсталиране като уеб приложение. Връзките към стаи отварят приложението, ако е инсталирано, или уеб играта, ако не е.

Изградено от нулата

Всеки слой е наш – от правилата на играта до сървъра, на който работи.

  1. Клиент на играта

    Строг TypeScript, Vite и Canvas 2D, без игрови двигател и без UI фреймуърк. Въртящите се дъски и прегледите на кулата Tal Gach са чист CSS 3D.

    • TypeScript
    • Vite
    • Canvas 2D
    • CSS 3D
  2. Собствена физика

    Физика на дисковете, управлявана от събития, с фиксирана стъпка 1/120 s, независима от честотата на кадрите: челюсти на джобовете, фигура, която пада само когато достатъчно от нея е над отвора, изскачане от джоба и разпадаща се кула. Замести обща библиотека за физика.

    • Deterministic
    • Seeded randomness
    • Headless tests
  3. Бекенд в реално време

    Наш собствен Node сървър върху MongoDB, който говори малък JSON-през-WebSocket протокол: get, set, compare-and-set, watch и presence. Оценява същия файл с правила за сигурност, който би оценявала Firebase Realtime Database.

    • Node.js
    • MongoDB
    • WebSocket
    • esbuild
  4. Приложения и вход

    Capacitor приложения за Android и iOS. Входът с Google и Apple минава през Firebase Auth, а нашият сървър сам проверява всеки токен. Рекламите идват от AdMob, без покупки с реални пари.

    • Capacitor
    • Firebase Auth
    • AdMob
    • App Links

Операции

Поддържаме сървърите сами

Без услуга за бекенд на играта по средата: наш собствен сървър, наши собствени внедрявания, наш собствен мониторинг.

  • Наш собствен Linux сървър: nginx обслужва играта с TLS от Let’s Encrypt зад Cloudflare
  • WebSocket, конфигурацията на приложението и проверките на състоянието се препращат към Node услугата под systemd
  • Административният панел работи като отделна услуга и вика API за оператора, който отговаря само на самата машина
  • Внедряване с една команда: изграждане, качване на издание с времеви печат, превключване, рестарт, проверка на състоянието; последните 5 издания се пазят за мигновено връщане назад
  • Около 210 ms медианно време за отговор от Бангладеш през Cloudflare (измерено при пускането)
  • Скриптирани сборки на приложенията за Google Play и App Store Connect
  • Android App Links и универсални връзки на iOS за покани в стаи

Трудни проблеми, които решихме

Частите, които играчите никога не виждат, с числата, които измерихме.

  1. Една и съща физика на всеки телефон

    Проблемът
    В онлайн игра всеки телефон сам симулира удара на противника. Ако две устройства някога изчислят дори едно число по различен начин, дъските им ще се разминат, затова физиката трябваше да е точна навсякъде.
    Какво направихме
    Симулацията ползва само операции, които са точни във всеки JavaScript двигател, със собствени hypot, log, acos, sin и cos на базата на корен квадратен. Всичко случайно е с начална стойност, а ядрото никога не чете часовника.

    Резултат 4320 удара, проверени в двигателите на Chromium и WebKit: всяка дъска е идентична до бита.

  2. Разсинхронизация, открита и ограничена

    Проблемът
    Играчи с различни версии на приложението, с леко различна физика, се подбираха заедно и дъските им не съвпадаха.
    Какво направихме
    Версията на протокола вече контролира подбора и стаите, а тест с отпечатък на физиката проваля сборката, ако физиката се промени без повишаване на версията.

    Резултат Само играчи с еднаква физика споделят една дъска.

  3. Кула, която се разбива справедливо

    Проблемът
    В Tal Gach първият удар попада в наредена кула от 19 фигури. Трябва да изглежда като истинското нещо и да е честен към двамата играчи.
    Какво направихме
    Удар със скорост 70% или повече избива една-две долни фигури и оставя кулата права; по-меките удари я събарят. Случайността е със зададена начална стойност, така че всяко устройство вижда същото разбиване.

    Резултат Силните удари изчистват долните фигури в 90% от случаите, еднакво на всеки екран.

  4. Звук на Mac

    Проблемът
    Приложението за iPad, пуснато на Mac с Apple silicon, не можеше да декодира нито AAC, нито Opus аудио.
    Какво направихме
    Приложението носи 16-битови WAV копия на звуците и музиката, а играта ги декодира сама.

    Резултат Един и същ звук на всяко устройство, включително Mac.

  5. Напускане на доставчик, без да докосваме играта

    Проблемът
    Онлайн играта започна във Firebase Realtime Database, а ние искахме данните на играта на наш сървър, без да я пишем наново.
    Какво направихме
    Всяка онлайн функция говори с един интерфейс към база данни. Нашият сървър налага същия файл с правила със същата семантика, а един набор проверки с цели мачове и повече от 180 разрешени или отказани записа се изпълнява срещу двата бекенда.

    Резултат Данните на играта вече живеят на наш собствен сървър, а смяната на бекенда е превключване на две настройки при сборката.

  6. Бързо до първия удар

    Проблемът
    Една лежерна игра има секунди да спечели играча, често при бавна мобилна връзка.
    Какво направихме
    Без двигател или фреймуърк за изтегляне, без звук преди първото докосване и тест на производителността, който пуска продукционната сборка при ограничена връзка.

    Резултат Първо зареждане за 3 s или по-малко при ограничена Fast 3G.

Тестван като продукт, не като демо

  • 396 модулни и 150 браузърни теста, всеки пуснат на размер за телефон, таблет и компютър с еталонни снимки на екрана (над 400 пускания)
  • Тестове на баланса бот срещу бот и тест с хаотични действия
  • Среда с емулатор, която играе цели онлайн мачове срещу правилата на базата данни
  • Удари, симулирани без екран в модулни тестове, благодарение на детерминираната физика

Технологии

  • TypeScript
  • Vite
  • Canvas 2D
  • Node.js
  • MongoDB
  • WebSocket
  • Capacitor
  • Firebase Auth
  • AdMob
  • Vitest
  • Playwright
  • nginx
  • Cloudflare
  • systemd

GPScom: пълен редизайн на gpscom.gr

Всички наши проекти

Искате игра или приложение в реално време, изградени по този начин?

Проектираме, изграждаме и поддържаме игри и платформи в реално време от край до край: приложения, сървъри, магазини и операции.