Phase 4 of turning the game into the company landing page. - Only the menu button, a compact objective chip and the touch controls stay on screen; speed shows only while driving. - The objective chip shows the next goal in one line, its distance and an arrow that turns towards it (replaces the compass strip); tapping it opens the mission list. - One floating menu holds map, missions, status, products, real-world, camera, stable mode, sound, graphics, minimap, fullscreen, help, restart and back to the start screen. It closes on a second tap, a tap outside, Escape, or after an action. - Missions, status and help open as sheets; street label, rank bar, status panel, toolbar and compass are gone. The minimap is optional and off by default. - Share the icon set and sheet dialog between start screen and HUD. - Layout checked for phone portrait, landscape and safe areas. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
254 lines
28 KiB
Markdown
254 lines
28 KiB
Markdown
# عملیات مشهد — روبات مارکت
|
||
|
||
📚 [مستندات کامل بازی و راهنمای توسعه برای 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
|
||
```
|
||
|
||
## صفحهٔ شروع
|
||
|
||
صفحهٔ شروع شبیه صفحهٔ اصلی سایت است: لوگو و شعار شرکت روی نمای سهبعدی کارخانه که آرام دور آن میچرخد. چهار راه ورود به بازی دارد:
|
||
|
||
- **بازی در دنیای واقعی:** بعد از تذکر ایمنی، موقعیت GPS گوشی بازیکن را جابهجا میکند. اگر اجازهٔ موقعیت داده نشود یا GPS در دسترس نباشد، پیامی ساده نشان داده میشود و پیشنهاد بازی آفلاین میآید. هدف اول: رفتن تا کارخانه و خرید.
|
||
- **بازی آفلاین:** شروع از بوستان ملت، با ماشین خانواده کنار بازیکن و مسیر طلایی تا کارخانه. هدف اول: رفتن تا کارخانه و خرید.
|
||
- **دربارهٔ ما:** شروع در حیاط کارخانه برای آشنایی با شرکت.
|
||
- **محصولات:** شروع کنار نمونهدستگاههای کارخانه با پنجرهٔ معرفی محصول باز.
|
||
|
||
زیر این دکمهها، بخشهای معمول سایت (معرفی شرکت، تماس، آدرس و نقشه، پرسشهای متداول، فرصتهای شغلی، گالری و شبکههای اجتماعی) در پنجرهای کوچک باز میشوند و محتوایشان از `src/config/company.js` میآید. «شروع دوباره» بازی را در همان حالت انتخابشده از نو شروع میکند.
|
||
|
||
## داستان و هدف
|
||
|
||
- **کارخانه:** حیاط کارخانهٔ **شرکت روبات مارکت** (بزرگراه مشهد–چناران، خیابان کاله، کنار پارک علم و فناوری خراسان). کارخانه این بخشها را دارد:
|
||
- **سالن تولید** با پنج بخش خمکاری، برش لیزر، رنگکاری، یخچالسازی و مونتاژ، و ۴۰ کارگر مشغول کار؛
|
||
- **کامیون ارسال**: دستگاههای بستهبندیشده از سکوی بارگیری روی کامیون میروند. کامیون پر که شد از دروازه بیرون میرود و بعد خالی برمیگردد؛
|
||
- **دفتر فنی مهندسی** با پنج برنامهنویس که اسمشان بالای سرشان دیده میشود: حامد (React، هودی مشکی)، رایان (Go، هودی آبی)، علیرضا (C++، هودی مشکی)، رضا (C++، کتوشلوار) و محمد. دستگاه وندینگ اول بازی هم همینجاست؛
|
||
- **واحد حسابداری** با چهار همکار خانم؛
|
||
- **اتاق مدیریت**: آقای محمدی، مدیر شرکت، اول بازی با بوگاتی مشکی وارد حیاط میشود و به اتاقش میرود.
|
||
|
||
با نزدیک شدن به هر کدام از این آدمها، با خانواده حرف میزنند. ماشین خانواده، یک سدان اسپرت به سبک BMW با سرعت تا ۲۰۰ کیلومتر بر ساعت، درست کنار نقطهٔ شروع پارک است.
|
||
- **مسیر:** از کارخانه تا بوستان ملت حدود ۲۰ کیلومتر رانندگی است، از بزرگراه مشهد–چناران، بزرگراه پیامبر اعظم، بزرگراه آزادی و وکیلآباد.
|
||
- **نقشهٔ ایران:** زبانهٔ ایران در نقشهٔ بازی استانها را نشان میدهد. فعلاً فقط مشهد (خراسان رضوی) باز است و شهرهای دیگر قفلاند.
|
||
- **محدودهٔ قابل بازی:** حدود ۱۵ در ۱۸ کیلومتر از شمالغرب تا غرب مشهد، همه از دادههای واقعی OpenStreetMap:
|
||
- جزئیات کامل اطراف کارخانه و محدودهٔ بوستان ملت و دانشگاه فردوسی
|
||
- همهٔ خیابانها و ساختمانها در فاصلهٔ ۲۵۰ متری مسیر رانندگی
|
||
- شبکهٔ خیابانهای اصلی در کل منطقه
|
||
- **دستگاهها:** دستگاه دفتر فنی مهندسی کارخانه (نصف قیمت)، بوستان ملت، مجموعه آموزشی راحیل (فقط ۷:۳۰ تا ۱۳:۳۰)، دانشگاه فردوسی و دانشکدهٔ ادبیات (۲۰٪ تخفیف دانشجویی)، دانشگاه علوم پزشکی، ایستگاه مترو آزادی، مشهد مال (از ساعت ۱۰). همهٔ دستگاهها و محصولاتشان فرضیاند.
|
||
|
||
## کنترل
|
||
|
||
| کار | صفحهکلید | موبایل |
|
||
|---|---|---|
|
||
| حرکت / رانندگی | W A S D یا جهتها | جویاستیک |
|
||
| دویدن | Shift | دکمهٔ «دویدن» |
|
||
| چرخاندن دوربین | ماوس (با کلیک قفل میشود) یا کشیدن | کشیدن روی صفحه |
|
||
| زوم دوربین | چرخ ماوس | — |
|
||
| سوار و پیاده شدن از ماشین | F | دکمهٔ F |
|
||
| خرید از دستگاه | E | دکمهٔ E |
|
||
| کشیدن کارت | C | دکمهٔ E |
|
||
| ترمز دستی | Space | — |
|
||
| نقشهٔ شهر | M یا «نقشه» در منو | «نقشه» در منو |
|
||
|
||
کنترلها با صفحهکلید فارسی هم کار میکنند. دوربین در بازی عادی سومشخص است و در حالت دنیای واقعی اولشخص.
|
||
|
||
روی گوشی، اعلانها (گفتوگوها، دکمهٔ خرید، پیام مأموریت، امتیاز و وضعیت GPS) وسط صفحه نمایش داده میشوند. خود دکمهٔ خرید هم قابل لمس است.
|
||
|
||
### رابط کاربری کممتن
|
||
|
||
روی صفحه فقط اینها همیشه دیده میشوند: دکمهٔ گرد منو (گوشهٔ بالا)، نشانگر هدف بعدی (بالای صفحه، با فلشی که به سمت هدف میچرخد و فاصله؛ لمسش فهرست مأموریتها را باز میکند) و کنترلهای لمسی. سرعت فقط هنگام رانندگی دیده میشود.
|
||
|
||
بقیه در منو هستند: نقشه، مأموریتها، وضعیت (بودجه، ساعت، درجه و امتیاز)، محصولات (فقط داخل کارخانه)، دنیای واقعی، دوربین و حالت پایدار (فقط در حالت دنیای واقعی)، صدا، گرافیک، نقشهٔ کوچک (بهطور پیشفرض خاموش)، تمامصفحه، راهنما، شروع دوباره و بازگشت به منوی اصلی. منو با لمس دوباره، لمس بیرون آن یا Escape بسته میشود.
|
||
|
||
## نقشه و مسیریابی
|
||
|
||
با کلیک روی نقشهٔ گرد گوشهٔ صفحه، نقشهٔ کامل شهر باز میشود. فهرست دستگاهها با آدرس، ساعت کاری، باز یا بسته بودن، محصولات و فاصله نمایش داده میشود. «مسیریابی تا اینجا» مسیر را روی شبکهٔ واقعی خیابانها پیدا میکند (پیاده روی همهٔ مسیرها، با ماشین فقط روی خیابانهای سوارهرو). مسیر به شکل خط طلایی روی زمین، روی نقشهٔ گوشه و روی قطبنمای بالای صفحه نمایش داده میشود. بدون انتخاب دستی، هدف مأموریت فعلی مقصد است.
|
||
|
||
## امتیاز
|
||
|
||
| رویداد | امتیاز |
|
||
|---|---|
|
||
| هر خرید | ۱۰۰ |
|
||
| اولین خرید در هر مکان (کشف) | ۲۵۰ |
|
||
| خرید نوشیدنی و خوراکی از یک دستگاه | ۱۵۰ |
|
||
| خرید از هر پنج نوع مکان شهری | ۵۰۰ |
|
||
| خرید در حالت دنیای واقعی | ۲۰۰ |
|
||
|
||
هفت مأموریت امتیاز و پاداش نقدی (هتومان) دارند. درجهها از «تازهوارد» تا «افسانهٔ مشهد» بالا میروند. بودجهٔ اولیه ۵۰۰ هتومان است (۱۰ هتومان = ۱۰۰٬۰۰۰ ریال). وقتی پول کافی برای هیچ خریدی نماند، یا همهٔ مأموریتها انجام شود، عملیات تمام میشود. هر ثانیهٔ واقعی ده ثانیه از ساعت بازی است.
|
||
|
||
## نصب روی گوشی (PWA)
|
||
|
||
- **اندروید و Chrome کامپیوتر:** دکمهٔ «نصب بازی روی گوشی» در صفحهٔ شروع، یا گزینهٔ Install در منوی مرورگر
|
||
- **آیفون:** در Safari، دکمهٔ Share و بعد Add to Home Screen. دکمهٔ نصب در بازی همین راهنما را نشان میدهد.
|
||
|
||
آیکون از آواتار روبات روبات مارکت ساخته شده (`public/icons`). بعد از اولین اجرا همهٔ فایلها، از جمله نقشه و فونت Vazirmatn (داخل پروژه، بدون Google Fonts)، کش میشوند و بازی آفلاین اجرا میشود. با انتشار نسخهٔ جدید، پیام «نسخهٔ جدید بازی آماده است» نمایش داده میشود. Service Worker را `vite.config.js` در زمان build میسازد.
|
||
|
||
## حالت دنیای واقعی (GPS)
|
||
|
||
دکمهٔ «📍 بازی در دنیای واقعی» در صفحهٔ شروع یا «📍 دنیای واقعی» در نوار پایین این حالت را روشن میکند. اول نکتههای ایمنی نمایش داده میشود و بعد اجازهٔ موقعیت و قطبنما گرفته میشود.
|
||
|
||
- **اولشخص:** نما از چشم خودتان است. دوربین بازی در جای گوشی (GPS) و ارتفاع چشم قرار میگیرد و فقط با راه رفتن واقعی جابهجا میشود. صفحهکلید و جویاستیک در این حالت کاری نمیکنند. جهت نگاه از حسگر جهت گوشی گرفته میشود. اگر گوشی حسگر جهت نداشته باشد، جهت از قطبنما و جهت راه رفتن گرفته میشود و با کشیدن انگشت هم میچرخید.
|
||
- موقعیتهای GPS بر اساس دقتشان نرم و ترکیب میشوند. «رسیدن» به دستگاه یعنی رسیدن به محدودهٔ اطرافش، با شعاع ۲٫۵ برابر خطای GPS (بین ۲۰ تا ۵۰ متر). این محدوده با یک دایره روی زمین نشان داده میشود. وقتی رسیدید، روبات از دستگاه بیرون میآید و خرید ۲۰۰ امتیاز اضافه دارد.
|
||
- **حالت پایدار** (دکمهٔ «🎯 پایدار»، پیشفرض روشن) جلوی پرشهای GPS را میگیرد:
|
||
- پرشهایی که با راه رفتن ممکن نیستند نادیده گرفته میشوند.
|
||
- تا وقتی جابهجایی کمتر از حدود نصف خطای GPS باشد، مکان شما ثابت میماند.
|
||
- قطبنما و چرخش دوربین آرامتر دنبال میشوند.
|
||
- **نمای دوربین (AR):** با روشن شدن حالت دنیای واقعی، دوربین پشت گوشی پسزمینهٔ بازی میشود. دوربین بازی در جای گوشی (GPS) و همجهت با گوشی (قطبنما و حسگر جهت) قرار میگیرد، پس دستگاهها، ستون نور، دایرهٔ محدوده، مسیر طلایی و روبات در جهت واقعی روی تصویر دوربین دیده میشوند. مدل شهر و ماشینها در این نما پنهاناند. دکمهٔ «📷 دوربین» بین نمای دوربین و شهر سهبعدیِ اولشخص جابهجا میکند. اگر گوشی حسگر جهت نداشته باشد، با کشیدن انگشت روی صفحه میچرخید.
|
||
- در سرعت بیش از حدود ۲۲ کیلومتر بر ساعت خرید غیرفعال است. ماشین مجازی هم در این حالت استفاده نمیشود.
|
||
- بیرون از محدودهٔ بازی، فاصله تا نزدیکترین دستگاه نمایش داده میشود.
|
||
- موقعیت فقط روی خود گوشی پردازش میشود. دوربین و قطبنما به HTTPS نیاز دارند.
|
||
- اول یک موقعیت سریع و تقریبی از Wi-Fi یا شبکهٔ موبایل گرفته میشود و بعد GPS دقیقش میکند. وضعیت زیر نام خیابان با کد خطا نمایش داده میشود:
|
||
- **کد ۱:** اجازهٔ Location داده نشده
|
||
- **کد ۲:** Location گوشی خاموش است
|
||
- **کد ۳:** هنوز سیگنال نرسیده (جستوجو ادامه دارد)
|
||
|
||
روی کامپیوتر معمولاً موقعیتی پیدا نمیشود، چون Chrome برای کامپیوتر از سرویس موقعیت گوگل استفاده میکند که از ایران در دسترس نیست. با گوشی تست کنید.
|
||
|
||
**نقطههای آزمایشی GPS:** سه دستگاه آزمایشی فقط در حالت دنیای واقعی کنار کارخانه ظاهر میشوند، در مختصات `36.450276, 59.423431`، `36.450172, 59.423209` و `36.449976, 59.422866`. مختصات، نقطهای است که باید آنجا بایستید. با گوشی تا هر نقطه راه بروید: روبات بیرون میآید و دکمهٔ خرید فعال میشود. شعاع رسیدن ۲٫۵ برابر خطای GPS است (بین ۲۰ تا ۵۰ متر) و همیشه نزدیکترین دستگاه انتخاب میشود.
|
||
|
||
دوربین، GPS و حسگرها فقط روی HTTPS (یا localhost) کار میکنند.
|
||
|
||
## اجرا
|
||
|
||
```sh
|
||
npm install
|
||
npm run dev
|
||
npm run build
|
||
npm test
|
||
```
|
||
|
||
- `?quality=low` یا دکمهٔ «گرافیک» سایهها را خاموش میکند (پیشفرض گوشیها).
|
||
- `?debug` وضعیت بازی را در `window.game` در دسترس میگذارد.
|
||
|
||
## انتشار روی سرور با Docker
|
||
|
||
تصویر Docker دو مرحله دارد: Node تستها را اجرا و بازی را build میکند، و بعد Caddy فایلها را سرو میکند. Caddy گواهی HTTPS را از Let's Encrypt خودکار میگیرد و تمدید میکند. HTTPS برای نصب روی گوشی و GPS ضروری است.
|
||
|
||
**پیشنیاز:**
|
||
- رکورد A دامنههای `robotmarkets.ir` و `www.robotmarkets.ir` به IP سرور اشاره کند.
|
||
- پورتهای ۸۰ و ۴۴۳ سرور باز و آزاد باشند.
|
||
|
||
```sh
|
||
git clone git@github.com:hamedAbdollahzade/vending-machine-game.git && cd vending-machine-game
|
||
docker compose up -d --build
|
||
docker compose logs -f
|
||
```
|
||
|
||
- **دامنهٔ دیگر:** `SITE_ADDRESS="example.ir, www.example.ir" docker compose up -d --build`
|
||
- **بهروزرسانی:** `git pull && docker compose up -d --build`. گواهیها در volume `caddy_data` میمانند. بازیهای نصبشده روی گوشی پیام نسخهٔ جدید را نشان میدهند.
|
||
- **اگر روی سرور از قبل Nginx یا پروکسی دیگری روی ۸۰ و ۴۴۳ هست:** در `docker-compose.yml` پورتها را به `"8080:80"` تغییر دهید و `SITE_ADDRESS=":80"` بگذارید. بعد دامنه را در همان پروکسی به `127.0.0.1:8080` بفرستید. در این حالت HTTPS با همان پروکسی است.
|
||
|
||
**سرور داخل ایران:** Docker Hub و گاهی npm به IPهای ایران سرویس نمیدهند. دو راه وجود دارد:
|
||
1. **mirror داخلی برای Docker Hub:** در `/etc/docker/daemon.json` یک mirror تعریف کنید، مثلاً `{"registry-mirrors": ["https://docker.arvancloud.ir"]}`، و بعد `sudo systemctl restart docker`.
|
||
2. **ساخت روی کامپیوتر خودتان و انتقال تصویر آماده:**
|
||
```sh
|
||
docker compose build
|
||
docker save robot-market-game:latest | gzip > robot-market-game.tar.gz
|
||
scp robot-market-game.tar.gz docker-compose.yml user@server:~/game/
|
||
ssh user@server 'cd ~/game && gunzip -c robot-market-game.tar.gz | docker load && docker compose up -d --no-build'
|
||
```
|
||
|
||
## CI/CD روی Gitea
|
||
|
||
گردشکار `.gitea/workflows/ci-cd.yml` تست و build را اجرا میکند. برای main تصویر Docker در Registry ساخته و منتشر میشود؛ سپس runner از Docker socket مشترک سرور و فایل `deploy/docker-compose.yml` برای pull و up استفاده میکند. انتشار فعلی SSH نیست.
|
||
|
||
- 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 اشتباه نشود.
|
||
|
||
پیش از push نام remote و branch مقصد را بررسی کنید. [جزئیات انتشار و تفاوت روشها](docs/06-development-and-deployment.md).
|
||
|
||
## ساخت دوبارهٔ دادهٔ نقشه
|
||
|
||
`src/data/mellat.json` و `src/data/iran.json` از خروجی خام OpenStreetMap (Overpass API) و Natural Earth ساخته میشوند. کوئریها در ابتدای اسکریپت آمدهاند:
|
||
|
||
```sh
|
||
node scripts/build-map-data.mjs --osm city.json zone-factory.json corridor.json major.json --poi poi.json --provinces ne_10m_admin_1_states_provinces.geojson
|
||
```
|
||
|
||
چهار خروجی OSM (محدودهٔ شهر، محدودهٔ کارخانه، کریدور مسیر و خیابانهای اصلی) با هم ادغام میشوند و عنصرهای تکراری حذف میشوند. خیابانها هم در مرز منطقه بریده میشوند. برای افزودن محدودهٔ جدید، یک خروجی دیگر به `--osm` اضافه کنید و در صورت نیاز `REGION` را در اسکریپت بزرگتر کنید.
|
||
|
||
### ساختمانها (Microsoft)
|
||
|
||
OSM فقط حدود ۴٬۰۰۰ ساختمان این منطقه را دارد. بقیه (حدود ۱۴۱٬۵۰۰ ساختمان) از مجموعهٔ ساختمانهای جهانی Microsoft (مجوز ODbL) میآیند و در `public/data/buildings.bin` ذخیره میشوند. این فایل ۳٫۵ مگابایت است و فشردهشده حدود ۲ مگابایت منتقل میشود.
|
||
|
||
```sh
|
||
node scripts/build-buildings.mjs <فایل quadkey ایران، مثلاً 123012100 .csv.gz>
|
||
```
|
||
|
||
فایل از [فهرست Microsoft](https://minedbuildings.z5.web.core.windows.net/global-buildings/dataset-links.csv) گرفته میشود (ردیف `Iran,123012100`). دادههای Microsoft برای ایران ارتفاع ندارند، پس ارتفاع تخمین زده میشود:
|
||
|
||
| موقعیت و مساحت | ارتفاع |
|
||
|---|---|
|
||
| پارک | یک طبقه |
|
||
| صنعتی، یا بیرون از کمربندی پیامبر اعظم، بالای ۲۵۰ متر مربع | سوله، ۶ تا ۹ متر |
|
||
| بیرون از کمربندی، کوچکتر | ۱ تا ۲ طبقه |
|
||
| داخل شهر، زیر ۴۰ متر مربع | ۱ طبقه |
|
||
| داخل شهر، زیر ۱۲۰ متر مربع | ۲ تا ۳ طبقه |
|
||
| داخل شهر، زیر ۳۰۰ متر مربع | ۳ تا ۴ طبقه |
|
||
| داخل شهر، زیر ۸۰۰ متر مربع | ۴ تا ۶ طبقه |
|
||
| داخل شهر، بزرگتر | ۵ تا ۸ طبقه |
|
||
|
||
ساختمانهایی که OSM هم دارد، و ساختمانهای داخل محوطهٔ کارخانه (که بازی خودش میسازد) حذف میشوند. ساختمانها در بلوکهای ۵۰۰ متری و فقط وقتی بازیکن نزدیک میشود ساخته میشوند.
|
||
|
||
### تصویر ماهوارهای (Esri World Imagery)
|
||
|
||
**فعلاً خاموش است.** زمین بازی از خیابانها، پارکها و کاربری زمین OpenStreetMap کشیده میشود. برای برگرداندن زمین ماهوارهای، `SATELLITE_GROUND` در `src/constants/world.js` را `true` کنید. در آن حالت جادهها، لاینها، پارکها و حیاطها از تصویر واقعی دیده میشوند و جادهها و زمینهای رسمشده ساخته نمیشوند.
|
||
|
||
```sh
|
||
node scripts/fetch-imagery.mjs
|
||
```
|
||
|
||
- **زوم ۱۷ (حدود ۱ متر در هر پیکسل):** محدودهٔ شهر، محدودهٔ کارخانه و ۳۰۰ متر دو طرف مسیر کارخانه تا بوستان ملت
|
||
- **زوم ۱۵:** کل منطقه، برای فاصلههای دور
|
||
|
||
کاشیها (حدود ۱۰۰۰ فایل، ۱۶ مگابایت) در `public/imagery` روی سرور خودمان هستند، پس در ایران و بهصورت آفلاین هم کار میکنند. Service Worker آنها را از قبل دانلود نمیکند و هر کاشی را وقتی بازیکن از کنارش رد شد نگه میدارد.
|
||
|
||
**مجوز:** استفادهٔ تجاری و میزبانی نسخهای از تصاویر Esri نیاز به مجوز مناسب از Esri دارد. شرایط را با Esri بررسی کنید. نام منبع در پایین صفحهٔ بازی نمایش داده میشود.
|
||
|
||
## ساختار
|
||
|
||
- `src/config/company.js`: همهٔ اطلاعات شرکت در یک جا: نام، شعار، رنگهای برند (رنگ اصلی `#00a693` و طیف آن)، آدرس، تلفن، ایمیل، شبکههای اجتماعی، دربارهما و فهرست محصولات. مقدارهای `TODO(company)` جایگزینشدنیاند.
|
||
- `src/config/assets.js`: مسیر همهٔ فایلها (لوگو، تصویر محصولات، چهرههای روبات، مدلهای سهبعدی و دادهٔ نقشه) با قالب و اندازهٔ مورد انتظار هر کدام. موارد `TODO(asset)` جای فایل واقعیاند.
|
||
- `src/i18n/fa.js`: همهٔ متنهای فارسی رابط کاربری، گفتوگوها، مأموریتها و نوشتههای روی صحنه. تست `tests/content.test.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.
|