docs: document React architecture and enforce migration checks in CI
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
# قوانین بازی، اقتصاد و قراردادهای رفتاری
|
||||
|
||||
## حالت، زمان و ورودی
|
||||
|
||||
- حالت جابهجایی `walk` یا `drive` است. GPS حالت مستقل `real.on` است و حرکت را به موقعیت گوشی میسپارد.
|
||||
- شروع: ۵۰۰ هتومان، صفر خرید، XP صفر، مأموریت انجامشدهٔ خالی، ساعت ۰۸:۳۰.
|
||||
- هر ثانیهٔ واقعی فعال = ده ثانیهٔ بازی؛ `state.minutes += dt * 10 / 60`.
|
||||
- briefing، فروشگاه، نقشه، پنجرهٔ پایان و مخفیبودن document شبیهسازی را متوقف میکنند. زیرنویسها بهتنهایی حرکت را نمیبندند. پنل پرداخت شبیهسازی را متوقف نمیکند، اما `busy` حرکت پیاده را محدود میکند.
|
||||
- WASD و جهتها: حرکت نسبی به دوربین/کنترل ماشین؛ Shift: دویدن؛ Space: ترمز دستی؛ F: سوار/پیاده؛ E: فروشگاه؛ C: کشیدن کارت؛ Escape: انصراف پیش از تأیید؛ M: نقشه.
|
||||
- کنترل حروف با `KeyboardEvent.code` است تا کیبورد فارسی هم کار کند. چرخ ماوس فاصلهٔ دوربین را بین ۳ و ۱۲ تغییر میدهد. روی دسکتاپ Pointer Lock و در fallback/موبایل drag وجود دارد.
|
||||
- موبایل joystick و دکمههای F، E و toggle دویدن دارد. E موبایل در مرحلهٔ ready کارت میکشد.
|
||||
- سرعت هدف پیاده ۳٫۴ و دویدن ۶٫۵ متر/ثانیه با نرمسازی است. برخورد دایرهای شخصیت شعاع ۱ متر دارد. مرز جهان با فاصلهٔ ۱۵ متر محدود میشود.
|
||||
|
||||
## ماشین
|
||||
|
||||
سوارشدن در فاصلهٔ حداکثر ۴٫۵ متر و خارج پرداخت/مشغولی؛ پیادهشدن در قدرمطلق سرعت حداکثر ۳ متر/ثانیه. UI پیشنهاد پیادهشدن را با شرط محدودتر سرعت زیر ۱ و دستگاه نزدیک نشان میدهد. سمت خروج راننده بررسی برخورد میشود.
|
||||
|
||||
ثابتهای `CAR`: سقف جلو ۵۵٫۶ متر/ثانیه (حدود ۲۰۰ km/h)، عقب ۶، شتاب ۹٫۵، ترمز ۱۴، drag برابر ۱٫۶، فرمان حداکثر ۰٫۵۵ رادیان، wheelBase برابر ۲٫۷. فرمان در سرعت بالا محدودتر میشود. برخورد دیوار دو دایرهٔ جلو/عقب و حرکت زیرگام دارد. تصادف ترافیک سرعت را کم میکند و NPC پس از تماس طولانی حذف/بازپدید میشود. جریمهٔ نقدی، خسارت قابل تعمیر و سوخت وجود ندارد.
|
||||
|
||||
## پول و محصول
|
||||
|
||||
۱۰ هتومان = ۱۰۰٬۰۰۰ ریال؛ محاسبات با هتومان صحیح و نمایش با رقم فارسی است. قیمت هر دستگاه `Math.round(baseCost * priceFactor)` است؛ مثال آب کارخانه `round(15 × .5) = 8`.
|
||||
|
||||
| محصول | نوع | قیمت پایه هتومان |
|
||||
|---|---|---:|
|
||||
| آبمیوه | drink | ۳۵ |
|
||||
| آب معدنی | drink | ۱۵ |
|
||||
| شیر کاکائو | drink | ۴۰ |
|
||||
| چای سرد | drink | ۴۵ |
|
||||
| لیموناد | drink | ۴۰ |
|
||||
| بیسکویت | snack | ۲۵ |
|
||||
| شکلات | snack | ۳۰ |
|
||||
| آجیل | snack | ۶۵ |
|
||||
| کیک | snack | ۳۵ |
|
||||
|
||||
خرید نامحدود تا حد بودجه است؛ موجودی انبار، مصرف محصول، فروش دوباره و رزرو پول برای مأموریت نداریم. کانالهای عددی ۲۱ تا ۶۰ متعلق به نسخهٔ قدیمیاند؛ فروشگاه فعلی کارت محصول با productId دارد.
|
||||
|
||||
`purchaseBlocker` به ترتیب دستگاه/محصول ناشناخته، busy، بستهبودن و کمبود پول را کنترل میکند. بازبودن شامل ساعت شروع و فاقد ساعت پایان است: `start <= minutes % 1440 < end`. بازهٔ عبور از نیمهشب پشتیبانی نشده است.
|
||||
|
||||
## پرداخت و تحویل
|
||||
|
||||
`idle → approaching → ready → approved → delivery → idle`
|
||||
|
||||
- بازکردن فروشگاه: پیاده، دستگاه نزدیک (۳٫۴ متر در حالت مجازی)، عملیات تمامنشده و بدون busy/پرداخت فعال.
|
||||
- انتخاب محصول و `beginPayment`: بدون برداشت؛ busy روشن و دوربین نزدیک کارتخوان.
|
||||
- بعد از بیش از ۱ ثانیه آماده؛ تنها C/دکمهٔ کشیدن کارت خرید را ثبت و مبلغ را یک بار کسر میکند.
|
||||
- انصراف در approaching یا ready بدون تغییر پول/خرید؛ پس از approved مجاز نیست.
|
||||
- پس از بیش از ۱٫۲ ثانیهٔ approved، تحویل ۲٫۶ ثانیهای آغاز میشود. busy تا پایان تحویل باقی میماند.
|
||||
- رکورد خرید شامل machineId، category، productId، type، price و minutes است. XP و جایزهٔ مأموریت در پایان تحویل اعمال میشوند، نه لحظهٔ انتخاب.
|
||||
- همهچیز نمایشی و داخل مرورگر است؛ اتصال درگاه یا تراکنش واقعی وجود ندارد.
|
||||
|
||||
## امتیاز و درجه
|
||||
|
||||
هر خرید ۱۰۰ XP؛ اولین خرید از هر machineId، ۲۵۰؛ اولین ترکیب drink و snack در همان دستگاه، ۱۵۰؛ تکمیل پنج دستهٔ شهری park/university/school/metro/mall، ۵۰۰. factory و test در پاداش پنج دسته و explorer شمرده نمیشوند. خرید در real.on بعد از تحویل ۲۰۰ XP اضافه میدهد؛ کشف/ترکیب برای دستگاه آزمایشی هم ممکن است.
|
||||
|
||||
| درجه | حداقل XP |
|
||||
|---|---:|
|
||||
| تازهوارد | ۰ |
|
||||
| کاوشگر | ۶۰۰ |
|
||||
| راهبلد | ۱۴۰۰ |
|
||||
| شکارچی دستگاه | ۲۶۰۰ |
|
||||
| استاد نقشه | ۴۲۰۰ |
|
||||
| افسانهٔ مشهد | ۶۵۰۰ |
|
||||
|
||||
مأموریتها تنها یک بار با missionsDone جایزه میدهند؛ مشخصات کامل در [مرجع](10-game-reference.md). activeMission اولین مأموریت انجامنشده است، ولی completeMissions همهٔ شرطها را بررسی میکند.
|
||||
|
||||
## پایان و reset
|
||||
|
||||
`checkEnd` در پایان خرید و تقریباً هر نیمثانیه بررسی میشود: همهٔ مأموریتها کامل یا `canAffordAnything` منفی. تابع بودجه دستگاه ارزان قابل خرید فعلی/با پایان ساعت دیرتر در همان روز را میشمارد، نه امکان کسب پول در آینده؛ محدودیتهای این رفتار در بازبینی آمده است.
|
||||
|
||||
reset پول، خرید، XP، ساعت، payment، spawn، ماشین، مأموریت، مقصد و greeting روبات را تازه میکند. reset فعلی پاکسازی کامل همهٔ timerها، گفتوگوها، GPS و انیمیشن کامیون نیست؛ Agent نباید آن را بدون تست کامل فرض کند.
|
||||
Reference in New Issue
Block a user