docs: document React architecture and enforce migration checks in CI
This commit is contained in:
@@ -1,11 +1,25 @@
|
||||
# عملیات مشهد — روبات مارکت
|
||||
|
||||
بازی سهبعدی مرورگری (Three.js) با حالوهوای بازیهای اکشن سومشخص، بدون سلاح و خشونت. یک پدر و فرزندش از کارخانهٔ سازندهٔ دستگاهها راه میافتند، در خیابانهای واقعی مشهد میگردند، دستگاههای وندینگ روبات مارکت را پیدا میکنند و با هر خرید امتیاز میگیرند. روبات راهنمای روبات مارکت داخل دستگاهها زندگی میکند: وقتی خانواده به یک دستگاه میرسند، از آن بیرون میآید، خوشآمد میگوید و راهنماییشان میکند.
|
||||
📚 [مستندات کامل بازی و راهنمای توسعه برای Agent](docs/README.md) — قوانین، سناریو، معماری، تاریخچه و بکلاگ بر اساس بررسی کد فعلی.
|
||||
|
||||
بازی سهبعدی مرورگری (React 18 + Three.js، JavaScript، Tailwind CSS) با حالوهوای بازیهای اکشن سومشخص، بدون سلاح و خشونت. یک پدر و فرزندش از کارخانهٔ سازندهٔ دستگاهها راه میافتند، در خیابانهای واقعی مشهد میگردند، دستگاههای وندینگ روبات مارکت را پیدا میکنند و با هر خرید امتیاز میگیرند. روبات راهنمای روبات مارکت داخل دستگاهها زندگی میکند: وقتی خانواده به یک دستگاه میرسند، از آن بیرون میآید، خوشآمد میگوید و راهنماییشان میکند.
|
||||
|
||||
بازی یک PWA است: روی گوشی نصب میشود و آفلاین هم اجرا میشود.
|
||||
|
||||
🎮 [اجرای آنلاین بازی](https://hamedabdollahzade.github.io/vending-machine-game/)
|
||||
|
||||
## نسخهٔ React و نمایشگاه کارخانه
|
||||
|
||||
رابط با React، وضعیت مشترک با Redux Toolkit و درخواستها با Axios پیاده شدهاند. موتور Three.js از رابط جداست. [معماری جدید و راهنمای Agent](docs/11-react-migration.md) مرجع ساختار فعلی است.
|
||||
|
||||
سه دستگاه نمونهٔ ۳۵، ۴۸ و ۶۰ کانال در حیاط کارخانه قرار دارند. با Q نزدیک نمونهها یا دکمهٔ «مدلهای کارخانه» داخل محوطه، قیمت و امکانات را از روبات بپرسید. قیمت دستگاهها بهترتیب ۴٬۶۸۰٬۰۰۰٬۰۰۰، ۵٬۴۸۰٬۰۰۰٬۰۰۰ و ۵٬۹۸۰٬۰۰۰٬۰۰۰ ریال است؛ این معرفی بودجهٔ هتومان را کم نمیکند. تصاویر/GIFهای کاتالوگ هنوز اضافه نشدهاند؛ نمونههای سهبعدی موجودند و رابط برای نبود فایل پیام جایگزین دارد.
|
||||
|
||||
```sh
|
||||
npm test
|
||||
npm run lint
|
||||
npm run format:check
|
||||
```
|
||||
|
||||
## داستان و هدف
|
||||
|
||||
- **شروع:** سالن تولید کارخانهٔ **شرکت روبات مارکت** (بزرگراه مشهد–چناران، خیابان کاله، کنار پارک علم و فناوری خراسان). کارخانه این بخشها را دارد:
|
||||
@@ -96,7 +110,7 @@
|
||||
npm install
|
||||
npm run dev
|
||||
npm run build
|
||||
node --test tests/*.test.js
|
||||
npm test
|
||||
```
|
||||
|
||||
- `?quality=low` یا دکمهٔ «گرافیک» سایهها را خاموش میکند (پیشفرض گوشیها).
|
||||
@@ -132,29 +146,14 @@ docker compose logs -f
|
||||
|
||||
## CI/CD روی Gitea
|
||||
|
||||
مخزن اصلی `ssh://git@git.my-rm.com:2222/Hamed/vending-machine-game.git` با نام `origin` است. GitHub با نام `github` باقی مانده. گردشکار [.gitea/workflows/ci-cd.yml](.gitea/workflows/ci-cd.yml) با هر push خودش اجرا میشود:
|
||||
گردشکار `.gitea/workflows/ci-cd.yml` تست و build را اجرا میکند. برای main تصویر Docker در Registry ساخته و منتشر میشود؛ سپس runner از Docker socket مشترک سرور و فایل `deploy/docker-compose.yml` برای pull و up استفاده میکند. انتشار فعلی SSH نیست.
|
||||
|
||||
- **هر push و pull request:** نصب، تستها و build
|
||||
- **push به `main`:** بعد از قبولی تستها، کد از راه SSH به سرور فرستاده میشود و `docker compose up -d --build` اجرا میشود.
|
||||
- Secrets لازم: `REGISTRY_USERNAME` و `REGISTRY_TOKEN` با دسترسی read/write به package.
|
||||
- Variables اختیاری: `NPM_REGISTRY` برای mirror و `HEALTH_URL` برای بررسی پاسخ سایت.
|
||||
- شبکهٔ خارجی `frontend_proxy` و Nginx Proxy Manager برای HTTPS در این روش لازماند؛ خود کانتینر روی پورت ۸۰ داخلی است.
|
||||
- Compose ریشه روش مستقل دیگری است که Caddy مستقیماً TLS میدهد؛ با Compose مخصوص deploy اشتباه نشود.
|
||||
|
||||
**راهاندازی یکباره:**
|
||||
1. در سرور، Docker و Docker Compose نصب باشد و کاربر SSH بتواند `docker` اجرا کند (عضو گروه `docker` یا root).
|
||||
2. یک کلید SSH مخصوص انتشار بسازید و کلید عمومی را به `~/.ssh/authorized_keys` سرور اضافه کنید:
|
||||
```sh
|
||||
ssh-keygen -t ed25519 -N '' -f deploy_key -C gitea-deploy
|
||||
ssh-copy-id -i deploy_key.pub user@server
|
||||
```
|
||||
3. در Gitea، بخش Settings → Actions → Secrets مخزن، اینها را تعریف کنید:
|
||||
- `DEPLOY_HOST`: آدرس سرور
|
||||
- `DEPLOY_SSH_KEY`: محتوای فایل `deploy_key`
|
||||
- در صورت نیاز: `DEPLOY_USER` (پیشفرض root)، `DEPLOY_PORT` (پیشفرض ۲۲) و `DEPLOY_KNOWN_HOSTS` (خروجی `ssh-keyscan server`)
|
||||
4. اختیاری، در بخش Variables:
|
||||
- `DEPLOY_PATH`: پوشهٔ روی سرور
|
||||
- `SITE_ADDRESS`: دامنهها
|
||||
- `HEALTH_URL`: مثلاً `https://robotmarkets.ir/`، تا بعد از انتشار بالا آمدن سایت چک شود
|
||||
- `NPM_REGISTRY`: اگر runner یا سرور به `registry.npmjs.org` دسترسی ندارد (معمول در سرورهای ایران)، آدرس یک mirror در دسترس npm را اینجا بگذارید. همین مقدار برای build روی سرور هم استفاده میشود.
|
||||
|
||||
تا وقتی `DEPLOY_HOST` تعریف نشده، مرحلهٔ انتشار رد میشود و فقط تست و build اجرا میشوند. هر مرحله محدودیت زمانی دارد (تست ۱۵ دقیقه، انتشار ۳۰ دقیقه) تا runner هیچوقت بیپایان معطل نماند.
|
||||
پیش از push نام remote و branch مقصد را بررسی کنید. [جزئیات انتشار و تفاوت روشها](docs/06-development-and-deployment.md).
|
||||
|
||||
## ساخت دوبارهٔ دادهٔ نقشه
|
||||
|
||||
@@ -206,29 +205,29 @@ node scripts/fetch-imagery.mjs
|
||||
|
||||
## ساختار
|
||||
|
||||
- `src/main.js`: صحنه، دوربین سومشخص، کنترلها، رابط کاربری (HUD)، نقشه، خرید و حلقهٔ بازی
|
||||
- `src/city.js`: ساخت شهر سهبعدی از دادهها (خیابان، پیادهرو، ساختمان، پارک، درخت، ورودی مترو، کوهها) در تکههای ۲ کیلومتری که دورها پنهان میشوند
|
||||
- `src/map-render.js`: نقشهٔ گوشه، نقشهٔ کامل شهر (کاشیهای کششده و نمای کلی) و نقشهٔ ایران
|
||||
- `src/routing.js`: گراف خیابانها، مسیریابی A* و پیدا کردن نام خیابان
|
||||
- `src/collision.js`: برخورد با ساختمانها برای شخصیتها، ماشین و دوربین
|
||||
- `src/locations.js`: دستگاهها، آدرسها، ساعت کاری و محصولات
|
||||
- `src/game-state.js`، `src/payment.js`، `src/scoring.js`: پول، خرید، پرداخت، امتیاز، درجه و مأموریتها
|
||||
- `src/characters.js`: پدر و فرزند، و روبات راهنما که از دستگاهها بیرون میآید
|
||||
- `src/factory.js`: محوطهٔ کارخانه، شامل سالن تولید، خط مونتاژ، دفتر، حیاط و تابلوها، بههمراه دفترها، کامیون و ورود مدیر
|
||||
- `src/staff.js`: آدمهای کارخانه، یعنی کارمندهای مفصل (هودی، کتوشلوار، مانتو و روسری) با برچسب اسم، و ۴۰ کارگر بهصورت instanced
|
||||
- `src/car-models.js`: ماشین خانواده (سدان اسپرت)، وانت مدیر و کامیون
|
||||
- `src/pwa.js` و `public/manifest.webmanifest`: نصب، کار آفلاین و پیام بهروزرسانی
|
||||
- `src/realworld.js`: GPS، قطبنما، نرمسازی و حالت پایدار موقعیت، و شعاع رسیدن
|
||||
- `src/imagery.js`: زمین ماهوارهای که کاشیهایش با نزدیک شدن بارگذاری و با دور شدن آزاد میشوند
|
||||
- `src/buildings-data.js`: خواندن فایل ساختمانهای Microsoft
|
||||
- `src/ar.js`: نمای دوربین (AR)، شامل تصویر دوربین پشت گوشی، جهت گوشی و زاویهٔ دید
|
||||
- `src/vending.js`، `src/vehicle.js`، `src/traffic.js`: مدل دستگاه، فیزیک ماشین و ترافیک شهری
|
||||
- `src/geo.js`: تبدیل طول و عرض جغرافیایی به مختصات بازی
|
||||
- `src/game/createGame.js و src/game/runtime/`: صحنه، دوربین سومشخص، کنترلها، رابط کاربری (HUD)، نقشه، خرید و حلقهٔ بازی
|
||||
- `src/game/world/city.js`: ساخت شهر سهبعدی از دادهها (خیابان، پیادهرو، ساختمان، پارک، درخت، ورودی مترو، کوهها) در تکههای ۲ کیلومتری که دورها پنهان میشوند
|
||||
- `src/game/world/mapRender.js`: نقشهٔ گوشه، نقشهٔ کامل شهر (کاشیهای کششده و نمای کلی) و نقشهٔ ایران
|
||||
- `src/game/world/routing.js`: گراف خیابانها، مسیریابی A* و پیدا کردن نام خیابان
|
||||
- `src/game/world/collision.js`: برخورد با ساختمانها برای شخصیتها، ماشین و دوربین
|
||||
- `src/constants/locations.js`: دستگاهها، آدرسها، ساعت کاری و محصولات
|
||||
- `src/game/economy/gameState.js`، `src/game/economy/payment.js`، `src/game/economy/scoring.js`: پول، خرید، پرداخت، امتیاز، درجه و مأموریتها
|
||||
- `src/game/models/characters.js`: پدر و فرزند، و روبات راهنما که از دستگاهها بیرون میآید
|
||||
- `src/game/models/factory.js`: محوطهٔ کارخانه، شامل سالن تولید، خط مونتاژ، دفتر، حیاط و تابلوها، بههمراه دفترها، کامیون و ورود مدیر
|
||||
- `src/game/models/staff.js`: آدمهای کارخانه، یعنی کارمندهای مفصل (هودی، کتوشلوار، مانتو و روسری) با برچسب اسم، و ۴۰ کارگر بهصورت instanced
|
||||
- `src/game/models/carModels.js`: ماشین خانواده (سدان اسپرت)، وانت مدیر و کامیون
|
||||
- `src/game/device/pwa.js` و `public/manifest.webmanifest`: نصب، کار آفلاین و پیام بهروزرسانی
|
||||
- `src/game/device/realworld.js`: GPS، قطبنما، نرمسازی و حالت پایدار موقعیت، و شعاع رسیدن
|
||||
- `src/game/world/imagery.js`: زمین ماهوارهای که کاشیهایش با نزدیک شدن بارگذاری و با دور شدن آزاد میشوند
|
||||
- `src/game/world/buildingsData.js`: خواندن فایل ساختمانهای Microsoft
|
||||
- `src/game/device/ar.js`: نمای دوربین (AR)، شامل تصویر دوربین پشت گوشی، جهت گوشی و زاویهٔ دید
|
||||
- `src/game/models/vending.js`، `src/game/systems/vehicle.js`، `src/game/systems/traffic.js`: مدل دستگاه، فیزیک ماشین و ترافیک شهری
|
||||
- `src/utils/geo.js`: تبدیل طول و عرض جغرافیایی به مختصات بازی
|
||||
|
||||
## محدودیتها و گامهای بعدی
|
||||
|
||||
- مدلها هندسی و سبکاند و کیفیت گرافیکی بازیهای AAA را ندارند.
|
||||
- خیابانها یکطرفه و چراغ راهنمایی ندارند، و ترافیک فقط روی بلوارهای اصلی است.
|
||||
- داده و ترافیک جهت یکطرفه دارند، اما مسیریابی هنوز دوطرفه است و چراغ راهنمایی شبیهسازی نمیشود؛ ترافیک روی خیابانهای اصلی است.
|
||||
- پیشنهادهای بعدی: امتیاز ایمنی (خط عابر و چراغ قرمز)، تاکسی و قطار شهری، چرخهٔ روز و شب، ذخیرهٔ پیشرفت، جدول امتیاز آنلاین، و محلهها و شهرهای دیگر.
|
||||
|
||||
نقشه: © مشارکتکنندگان OpenStreetMap (ODbL). ساختمانها: © Microsoft (ODbL). تصویر ماهوارهای: Esri, Maxar, Earthstar Geographics, and the GIS User Community. مرز استانها: Natural Earth.
|
||||
|
||||
Reference in New Issue
Block a user