diff --git a/README.md b/README.md index f881586..e24c3d1 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,21 @@ # عملیات مشهد — روبات مارکت -بازی سهبعدی مرورگری (Three.js) با حالوهوای بازیهای اکشن سومشخص، بدون سلاح و خشونت. یک پدر و فرزندش، همراه روبات راهنمای روبات مارکت، در خیابانهای واقعی مشهد میگردند، دستگاههای وندینگ روبات مارکت را پیدا میکنند و با هر خرید امتیاز میگیرند. +بازی سهبعدی مرورگری (Three.js) با حالوهوای بازیهای اکشن سومشخص، بدون سلاح و خشونت. یک پدر و فرزندش از کارخانهٔ سازندهٔ دستگاهها راه میافتند، در خیابانهای واقعی مشهد میگردند، دستگاههای وندینگ روبات مارکت را پیدا میکنند و با هر خرید امتیاز میگیرند. روبات راهنمای روبات مارکت داخل دستگاهها زندگی میکند: وقتی خانواده به یک دستگاه میرسند، از آن بیرون میآید، خوشآمد میگوید و راهنماییشان میکند. + +بازی یک PWA است: روی گوشی نصب میشود و آفلاین هم اجرا میشود. 🎮 [اجرای آنلاین بازی](https://hamedabdollahzade.github.io/vending-machine-game/) ## داستان و هدف -- **شروع:** ورودی جنوبی بوستان ملت، بزرگراه وکیلآباد +- **شروع:** سالن تولید کارخانهٔ **شرکت نگین سازان پیشگام رادمهر آتوسا** (بزرگراه مشهد–چناران، خیابان کاله، کنار پارک علم و فناوری خراسان). کارخانه سالن تولید با خط مونتاژ، دفتر، حیاط، دروازه و تابلوی شرکت دارد. ماشین خانواده در حیاط پارک است. +- **مسیر:** از کارخانه تا بوستان ملت حدود ۲۰ کیلومتر رانندگی است، از بزرگراه مشهد–چناران، بزرگراه پیامبر اعظم، بزرگراه آزادی و وکیلآباد. - **نقشهٔ ایران:** صفحهٔ توجیه مأموریت نقشهٔ استانهای ایران را نشان میدهد. فعلاً فقط مشهد (خراسان رضوی) باز است و شهرهای دیگر قفلاند. -- **محدودهٔ قابل بازی:** حدود ۴٫۸ در ۳٫۳ کیلومتر از غرب مشهد، شامل بوستان ملت، دانشگاه فردوسی، دانشگاه علوم پزشکی، ایستگاههای مترو و مشهد مال. خیابانها، ساختمانها و پارکها از دادههای واقعی OpenStreetMap ساخته شدهاند. -- **دستگاهها:** بوستان ملت، مجموعه آموزشی راحیل (فقط ۷:۳۰ تا ۱۳:۳۰)، دانشگاه فردوسی و دانشکدهٔ ادبیات (۲۰٪ تخفیف دانشجویی)، دانشگاه علوم پزشکی، ایستگاه مترو آزادی، مشهد مال (از ساعت ۱۰). همهٔ دستگاهها و محصولاتشان فرضیاند. +- **محدودهٔ قابل بازی:** حدود ۱۵ در ۱۸ کیلومتر از شمالغرب تا غرب مشهد، همه از دادههای واقعی OpenStreetMap: + - جزئیات کامل اطراف کارخانه و محدودهٔ بوستان ملت و دانشگاه فردوسی + - همهٔ خیابانها و ساختمانها در فاصلهٔ ۲۵۰ متری مسیر رانندگی + - شبکهٔ خیابانهای اصلی در کل منطقه +- **دستگاهها:** دستگاه نمونهٔ کارخانه (نصف قیمت)، بوستان ملت، مجموعه آموزشی راحیل (فقط ۷:۳۰ تا ۱۳:۳۰)، دانشگاه فردوسی و دانشکدهٔ ادبیات (۲۰٪ تخفیف دانشجویی)، دانشگاه علوم پزشکی، ایستگاه مترو آزادی، مشهد مال (از ساعت ۱۰). همهٔ دستگاهها و محصولاتشان فرضیاند. ## کنترل @@ -38,9 +44,29 @@ | هر خرید | ۱۰۰ | | اولین خرید در هر مکان (کشف) | ۲۵۰ | | خرید نوشیدنی و خوراکی از یک دستگاه | ۱۵۰ | -| خرید از هر پنج نوع مکان | ۵۰۰ | +| خرید از هر پنج نوع مکان شهری | ۵۰۰ | +| خرید در حالت دنیای واقعی | ۲۰۰ | -شش مأموریت امتیاز و پاداش نقدی (هتومان) دارند. درجهها از «تازهوارد» تا «افسانهٔ مشهد» بالا میروند. بودجهٔ اولیه ۵۰۰ هتومان است (۱۰ هتومان = ۱۰۰٬۰۰۰ ریال). وقتی پول کافی برای هیچ خریدی نماند، یا همهٔ مأموریتها انجام شود، عملیات تمام میشود. هر ثانیهٔ واقعی ده ثانیه از ساعت بازی است. +هفت مأموریت امتیاز و پاداش نقدی (هتومان) دارند. درجهها از «تازهوارد» تا «افسانهٔ مشهد» بالا میروند. بودجهٔ اولیه ۵۰۰ هتومان است (۱۰ هتومان = ۱۰۰٬۰۰۰ ریال). وقتی پول کافی برای هیچ خریدی نماند، یا همهٔ مأموریتها انجام شود، عملیات تمام میشود. هر ثانیهٔ واقعی ده ثانیه از ساعت بازی است. + +## نصب روی گوشی (PWA) + +- **اندروید و Chrome کامپیوتر:** دکمهٔ «نصب بازی روی گوشی» در صفحهٔ شروع، یا گزینهٔ Install در منوی مرورگر +- **آیفون:** در Safari، دکمهٔ Share و بعد Add to Home Screen. دکمهٔ نصب در بازی همین راهنما را نشان میدهد. + +آیکون از آواتار روبات روبات مارکت ساخته شده (`public/icons`). بعد از اولین اجرا همهٔ فایلها، از جمله نقشه و فونت Vazirmatn (داخل پروژه، بدون Google Fonts)، کش میشوند و بازی آفلاین اجرا میشود. با انتشار نسخهٔ جدید، پیام «نسخهٔ جدید بازی آماده است» نمایش داده میشود. Service Worker را `vite.config.js` در زمان build میسازد. + +## حالت دنیای واقعی (GPS) + +دکمهٔ «📍 بازی در دنیای واقعی» در صفحهٔ شروع یا «📍 دنیای واقعی» در نوار پایین این حالت را روشن میکند. اول نکتههای ایمنی نمایش داده میشود و بعد اجازهٔ موقعیت و قطبنما گرفته میشود. + +- خانواده روی نقشهٔ بازی همانجایی است که گوشی هست و با راه رفتن واقعی جابهجا میشود. جهتشان از قطبنمای گوشی یا جهت حرکت گرفته میشود. +- موقعیتهای GPS بر اساس دقتشان نرم و ترکیب میشوند. «رسیدن» به دستگاه با شعاع ۲۰ تا ۴۰ متر (بسته به دقت GPS) سنجیده میشود. وقتی رسیدید، روبات از دستگاه بیرون میآید و خرید ۲۰۰ امتیاز اضافه دارد. +- در سرعت بیش از حدود ۲۲ کیلومتر بر ساعت خرید غیرفعال است. ماشین مجازی هم در این حالت استفاده نمیشود. +- بیرون از محدودهٔ بازی، فاصله تا نزدیکترین دستگاه نمایش داده میشود. +- موقعیت فقط روی خود گوشی پردازش میشود. دوربین و قطبنما به HTTPS نیاز دارند. + +فاز بعد، حالت دوربین (AR)، روی همین پایه ساخته میشود: تصویر زندهٔ دوربین بهعنوان پسزمینه، و دستگاه و روبات در جهت و فاصلهٔ واقعی روی آن. ## اجرا @@ -59,21 +85,24 @@ node --test tests/*.test.js `src/data/mellat.json` و `src/data/iran.json` از خروجی خام OpenStreetMap (Overpass API) و Natural Earth ساخته میشوند. کوئریها در ابتدای اسکریپت آمدهاند: ```sh -node scripts/build-map-data.mjs city-osm.json poi-osm.json ne_10m_admin_1_states_provinces.geojson +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 ``` -برای اضافه کردن محدودهٔ جدید، bbox اسکریپت و `ORIGIN` در `src/geo.js` را تغییر دهید. +چهار خروجی OSM (محدودهٔ شهر، محدودهٔ کارخانه، کریدور مسیر و خیابانهای اصلی) با هم ادغام میشوند و عنصرهای تکراری حذف میشوند. خیابانها هم در مرز منطقه بریده میشوند. برای افزودن محدودهٔ جدید، یک خروجی دیگر به `--osm` اضافه کنید و در صورت نیاز `REGION` را در اسکریپت بزرگتر کنید. ## ساختار - `src/main.js`: صحنه، دوربین سومشخص، کنترلها، رابط کاربری (HUD)، نقشه، خرید و حلقهٔ بازی -- `src/city.js`: ساخت شهر سهبعدی از دادهها (خیابان، پیادهرو، ساختمان، پارک، درخت، ورودی مترو، کوهها) -- `src/map-render.js`: نقشهٔ گوشه، نقشهٔ کامل شهر و نقشهٔ ایران +- `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/characters.js`: پدر و فرزند، و روبات راهنما که از دستگاهها بیرون میآید +- `src/factory.js`: محوطهٔ کارخانه، شامل سالن تولید، خط مونتاژ، دفتر، حیاط و تابلوها +- `src/pwa.js` و `public/manifest.webmanifest`: نصب، کار آفلاین و پیام بهروزرسانی +- `src/realworld.js`: GPS، قطبنما، نرمسازی موقعیت و شعاع رسیدن - `src/vending.js`، `src/vehicle.js`، `src/traffic.js`: مدل دستگاه، فیزیک ماشین و ترافیک شهری - `src/geo.js`: تبدیل طول و عرض جغرافیایی به مختصات بازی diff --git a/index.html b/index.html index 7c3f632..e518f6d 100644 --- a/index.html +++ b/index.html @@ -5,9 +5,14 @@
عملیات ۰۱ · خراسان رضوی
روبات مارکت · شکار دستگاههای وندینگ
+حرکت: W A S D · دویدن: Shift · دوربین: ماوس · سوار و پیاده شدن: F · خرید: E · نقشه: M