Наш производ · Carrom

Права карома, са физиком коју смо сами написали.

Carrom је друштвена игра прилагођена телефону, на дрвеној табли са тачном физиком дискова. Има пет врста игре, међу њима 29 Game и Tal Gach који се играју широм Бангладеша, Индије и Пакистана, са онлајн 1 на 1 и 2 на 2, ботовима и pass-and-play режимом. Један TypeScript код ради на вебу, Android-у и iOS-у, а онлајн игра ради на нашем серверу у реалном времену.

Доступно на вебу, на App Store-у (iPhone и iPad) и на Google Play-у (Android).

  • Web (PWA)
  • Android
  • iOS
  • iPadOS
врста игре, свака са сопственим механизмом правила
5
ударача, идентичних до последњег бита у свим прегледачким engine-има
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 рејтинг за сваку врсту игре.

  • Ботови и pass-and-play

    Ботови на 4 нивоа тежине (од Easy до Expert) и са 4 карактера (уравнотежен, агресиван, одбрамбени, мајстор ефектних удараца), сваки са својим именом и заставом, и pass-and-play за 2 или 4 играча на једном уређају.

  • Напредак који Вас прати

    Новчићи, продавница анимираних табли, ударача и сетова фигура, достигнућа, статистика и дневни низови. Пријавите се преко Google-а или Apple-а да га задржите на сваком уређају.

  • Алати за оператере

    Наш административни панел приказује игре и играче уживо, води модерацију, прилагођава новчиће било ког играча уз поруку њему и мења огласе, обавезна ажурирања, позиве на оцењивање, прекидаче упаривања, па чак и изглед, без објаве нове верзије апликације.

  • Свуда из једног кода

    Веб, Android, iPhone и iPad из једног кода, са могућношћу инсталације као веб апликације. Везе до соба отварају апликацију ако је инсталирана, а ако није, веб игру.

Направљено од нуле

Сваки слој је наш, од правила игре до сервера на коме ради.

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

    Строги TypeScript, Vite и Canvas 2D, без game engine-а и без UI framework-а. Табле које се окрећу и прегледи торња у Tal Gach-у су чисти CSS 3D.

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

    Физика дискова вођена догађајима на фиксном кораку од 1/120 s, независна од брзине кадрова: ивице џепова, фигура која пада само када је довољан део изнад рупе, одскакање из џепа и торањ који се распада. Заменила је физичку библиотеку опште намене.

    • Deterministic
    • Seeded randomness
    • Headless tests
  3. Back end у реалном времену

    Наш сопствени 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, а наш сервер сам проверава сваки token. Огласи долазе са AdMob-а, без куповина правим новцем.

    • Capacitor
    • Firebase Auth
    • AdMob
    • App Links

Операције

Сервере водимо сами

Без посредничког сервиса за back end игре: наш сервер, наше објаве, наш надзор.

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

Тешки проблеми које смо решили

Делови које играчи никада не виде, са бројевима које смо измерили.

  1. Иста физика на сваком телефону

    Проблем
    У онлајн партији сваки телефон сам симулира противников ударац. Када би два уређаја икада израчунала један број различито, њихове табле би се разишле, па је физика морала да буде тачна свуда.
    Шта смо урадили
    Симулација користи само операције које су тачне у сваком JavaScript engine-у, уз сопствене hypot, log, acos, sin и cos засноване на квадратном корену. Сва насумичност је задата семеном, а језгро никад не чита сат.

    Резултат 4.320 ударача проверено у engine-има Chromium-а и WebKit-а: свака табла идентична до последњег бита.

  2. Десинхронизација, пронађена и ограђена

    Проблем
    Играчи са различитим верзијама апликације и благо различитом физиком упаривани су заједно, па се њихове табле нису слагале.
    Шта смо урадили
    Верзија протокола сада контролише упаривање и собе, а тест отиска физике обара build ако се физика промени, а верзија не порасте.

    Резултат Исту таблу деле само играчи са идентичном физиком.

  3. Торањ који се поштено руши

    Проблем
    У Tal Gach-у први ударац погађа сложен торањ од 19 фигура. Мора да делује као права ствар и да буде поштен према оба играча.
    Шта смо урадили
    Ударац брзином од 70% или већом избацује једну или две доње фигуре и оставља торањ да стоји; блажи ударци га руше. Насумичност је задата семеном, па сви уређаји виде исто разбијање.

    Резултат Јаки ударци у 90% случајева чисте доње фигуре, исто на сваком екрану.

  4. Звук на Mac-овима

    Проблем
    iPad апликација која ради на Mac-овима са Apple силицијумом није могла да декодира ни AAC ни Opus звук.
    Шта смо урадили
    Апликација носи 16-битне WAV копије звукова и музике, а игра их сама декодира.

    Резултат Исти звук на сваком уређају, укључујући Mac-ове.

  5. Одлазак од добављача без дирања игре

    Проблем
    Онлајн игра је почела на Firebase Realtime Database-у, а желели смо податке игре на сопственом серверу без преписивања игре.
    Шта смо урадили
    Свака онлајн функција говори са једним интерфејсом базе. Наш сервер примењује исту датотеку правила са истом семантиком, а један скуп провера целих мечева и више од 180 дозвољених или одбијених уписа покреће се на обе позадине.

    Резултат Подаци игре сада живе на нашем серверу, а промена позадине је build прекидач од два подешавања.

  6. Брзо до првог ударца

    Проблем
    Опуштена игра има неколико секунди да освоји играча, често на спорој мобилној вези.
    Шта смо урадили
    Без engine-а или framework-а за преузимање, без звука пре првог додира и са тестом перформанси који покреће продукцијски build на успореној вези.

    Резултат Прво учитавање за 3 s или мање на успореном Fast 3G.

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

  • 396 јединичних тестова и 150 тестова у прегледачу, сваки покренут на величини телефона, таблета и десктопа са референтним снимцима екрана (преко 400 покретања)
  • Покретања баланса бот против бота и monkey тест
  • Скуп емулатора који игра целе онлајн мечеве у односу на правила базе
  • Ударци симулирани без интерфејса у јединичним тестовима, захваљујући детерминистичкој физици

Технологија

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

GPScom: потпуни редизајн сајта gpscom.gr

Погледајте све радове

Желите ли игру или апликацију у реалном времену направљену овако?

Дизајнирамо, градимо и водимо игре и платформе у реалном времену од почетка до краја: апликације, сервере, продавнице и операције.