Собствен продукт · Carrom
Истински карром, с физика, която написахме сами.
Carrom е настолна игра, проектирана първо за телефони, на дървена дъска с точна физика на дисковете. Има пет вида игра, сред които 29 Game и Tal Gach, които се играят в Бангладеш, Индия и Пакистан, с онлайн 1 срещу 1 и 2 срещу 2, ботове и игра на едно устройство. Една TypeScript кодова база работи в уеб, Android и iOS, а онлайн играта върви на наш собствен сървър за реално време.
Как се играе Ползвайте го с AI асистент
На живо в мрежата, в App Store (iPhone и iPad) и в Google Play (Android).

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

Разбиване на кулата Tal Gach 
Прицелване като с прашка 
Анимирани дъски 
2 срещу 2 онлайн 
Дъски, страйкъри и комплекти фигури 
Ежедневно предизвикателство 
Пет вида игра с едно докосване
Какво получават играчите
Пет вида игра
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 от една кодова база, с възможност за инсталиране като уеб приложение. Връзките към стаи отварят приложението, ако е инсталирано, или уеб играта, ако не е.
Изградено от нулата
Всеки слой е наш – от правилата на играта до сървъра, на който работи.
Клиент на играта
Строг TypeScript, Vite и Canvas 2D, без игрови двигател и без UI фреймуърк. Въртящите се дъски и прегледите на кулата Tal Gach са чист CSS 3D.
- TypeScript
- Vite
- Canvas 2D
- CSS 3D
Собствена физика
Физика на дисковете, управлявана от събития, с фиксирана стъпка 1/120 s, независима от честотата на кадрите: челюсти на джобовете, фигура, която пада само когато достатъчно от нея е над отвора, изскачане от джоба и разпадаща се кула. Замести обща библиотека за физика.
- Deterministic
- Seeded randomness
- Headless tests
Бекенд в реално време
Наш собствен Node сървър върху MongoDB, който говори малък JSON-през-WebSocket протокол: get, set, compare-and-set, watch и presence. Оценява същия файл с правила за сигурност, който би оценявала Firebase Realtime Database.
- Node.js
- MongoDB
- WebSocket
- esbuild
Приложения и вход
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 за покани в стаи
Трудни проблеми, които решихме
Частите, които играчите никога не виждат, с числата, които измерихме.
Една и съща физика на всеки телефон
- Проблемът
- В онлайн игра всеки телефон сам симулира удара на противника. Ако две устройства някога изчислят дори едно число по различен начин, дъските им ще се разминат, затова физиката трябваше да е точна навсякъде.
- Какво направихме
- Симулацията ползва само операции, които са точни във всеки JavaScript двигател, със собствени hypot, log, acos, sin и cos на базата на корен квадратен. Всичко случайно е с начална стойност, а ядрото никога не чете часовника.
Резултат 4320 удара, проверени в двигателите на Chromium и WebKit: всяка дъска е идентична до бита.
Разсинхронизация, открита и ограничена
- Проблемът
- Играчи с различни версии на приложението, с леко различна физика, се подбираха заедно и дъските им не съвпадаха.
- Какво направихме
- Версията на протокола вече контролира подбора и стаите, а тест с отпечатък на физиката проваля сборката, ако физиката се промени без повишаване на версията.
Резултат Само играчи с еднаква физика споделят една дъска.
Кула, която се разбива справедливо
- Проблемът
- В Tal Gach първият удар попада в наредена кула от 19 фигури. Трябва да изглежда като истинското нещо и да е честен към двамата играчи.
- Какво направихме
- Удар със скорост 70% или повече избива една-две долни фигури и оставя кулата права; по-меките удари я събарят. Случайността е със зададена начална стойност, така че всяко устройство вижда същото разбиване.
Резултат Силните удари изчистват долните фигури в 90% от случаите, еднакво на всеки екран.
Звук на Mac
- Проблемът
- Приложението за iPad, пуснато на Mac с Apple silicon, не можеше да декодира нито AAC, нито Opus аудио.
- Какво направихме
- Приложението носи 16-битови WAV копия на звуците и музиката, а играта ги декодира сама.
Резултат Един и същ звук на всяко устройство, включително Mac.
Напускане на доставчик, без да докосваме играта
- Проблемът
- Онлайн играта започна във Firebase Realtime Database, а ние искахме данните на играта на наш сървър, без да я пишем наново.
- Какво направихме
- Всяка онлайн функция говори с един интерфейс към база данни. Нашият сървър налага същия файл с правила със същата семантика, а един набор проверки с цели мачове и повече от 180 разрешени или отказани записа се изпълнява срещу двата бекенда.
Резултат Данните на играта вече живеят на наш собствен сървър, а смяната на бекенда е превключване на две настройки при сборката.
Бързо до първия удар
- Проблемът
- Една лежерна игра има секунди да спечели играча, често при бавна мобилна връзка.
- Какво направихме
- Без двигател или фреймуърк за изтегляне, без звук преди първото докосване и тест на производителността, който пуска продукционната сборка при ограничена връзка.
Резултат Първо зареждане за 3 s или по-малко при ограничена Fast 3G.
Тестван като продукт, не като демо
- 396 модулни и 150 браузърни теста, всеки пуснат на размер за телефон, таблет и компютър с еталонни снимки на екрана (над 400 пускания)
- Тестове на баланса бот срещу бот и тест с хаотични действия
- Среда с емулатор, която играе цели онлайн мачове срещу правилата на базата данни
- Удари, симулирани без екран в модулни тестове, благодарение на детерминираната физика
Технологии
- TypeScript
- Vite
- Canvas 2D
- Node.js
- MongoDB
- WebSocket
- Capacitor
- Firebase Auth
- AdMob
- Vitest
- Playwright
- nginx
- Cloudflare
- systemd
Искате игра или приложение в реално време, изградени по този начин?
Проектираме, изграждаме и поддържаме игри и платформи в реално време от край до край: приложения, сървъри, магазини и операции.