- Park black BMW, Lamborghini, Mazda and Nissan style cars in the factory yard; Mr Mohammadi now arrives in a Bugatti that becomes drivable once parked; the delivery truck is black. - Add six Apache style motorcycles with a rider, lean and their own handling (BIKE spec, 130 km/h). - Let the player take any traffic car; a garage module owns every drivable vehicle and resets them. - Replace the 3.4 m circle test between vehicles with oriented boxes sized from each model, so contact only happens when bodies touch and bikes can filter between cars; traffic only brakes for its own lane. - Add tests for box collisions, bike handling, traffic lane checks and taking traffic cars. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
74 lines
8.4 KiB
Markdown
74 lines
8.4 KiB
Markdown
# قوانین بازی، اقتصاد و قراردادهای رفتاری
|
||
|
||
## حالت، زمان و ورودی
|
||
|
||
- حالت جابهجایی `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 کارت میکشد.
|
||
- سرعت هدف پیاده ۳٫۴ و دویدن ۶٫۵ متر/ثانیه با نرمسازی است. برخورد دایرهای شخصیت شعاع ۱ متر دارد. مرز جهان با فاصلهٔ ۱۵ متر محدود میشود.
|
||
|
||
## ماشین و موتور
|
||
|
||
همهٔ وسیلههای حیاط کارخانه مشکیاند و سوارشدنی: بیاموی خانواده کنار نقطهٔ شروع، لامبورگینی، مزدا و نیسان در پارکینگ کارکنان، شش موتور آپاچی کنار دفتر، و بوگاتی آقای محمدی پس از اینکه پارک کرد. هر ماشین ترافیک شهر هم با F گرفته میشود و تا reset همانجا که رها شده میماند. کامیون بارگیری تزئینی است و سوار نمیشود. همه در `runtime/garage.js` نگهداری میشوند.
|
||
|
||
سوارشدن در فاصلهٔ حداکثر ۴٫۵ متر و خارج پرداخت/مشغولی؛ پیادهشدن در قدرمطلق سرعت حداکثر ۳ متر/ثانیه. UI پیشنهاد پیادهشدن را با شرط محدودتر سرعت زیر ۱ و دستگاه نزدیک نشان میدهد. سمت خروج راننده بررسی برخورد میشود.
|
||
|
||
ثابتهای `CAR`: سقف جلو ۵۵٫۶ متر/ثانیه (حدود ۲۰۰ km/h)، عقب ۶، شتاب ۹٫۵، ترمز ۱۴، drag برابر ۱٫۶، فرمان حداکثر ۰٫۵۵ رادیان، wheelBase برابر ۲٫۷. فرمان در سرعت بالا محدودتر میشود. برخورد دیوار دو دایرهٔ جلو/عقب و حرکت زیرگام دارد. ثابتهای `BIKE`: سقف ۳۶٫۱ (حدود ۱۳۰ km/h)، شتاب ۱۱، wheelBase برابر ۱٫۳۵؛ موتور در پیچ خم میشود. برخورد بین وسیلهها با جعبهٔ جهتدار به اندازهٔ واقعی مدل (SAT در `world/vehicleCollision.js`) است، پس فقط وقتی بدنهها واقعاً به هم برسند سرعت کم میشود و موتور میتواند لایی بکشد. کاهش سرعت به زاویهٔ برخورد بستگی دارد: شاخبهشاخ ۶۰٪، مالیدن کناری تقریباً هیچ. ترافیک فقط برای چیزی که واقعاً در عرض خطش باشد ترمز میکند و 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 نباید آن را بدون تست کامل فرض کند.
|