Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기لعبه جوال
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
ألعاب جماعية عربية على جهاز واحد، وغرف للعبتَي مين فينا؟ وفبركة من عدة هواتف. إصدار 1.4.0 يضيف الكتابة المتزامنة والتصويت السري والكشف المشترك لفبركة، بالرمز والرابط وQR عبر Cloudflare Workers وSQLite Durable Objects. ألعاب الجهاز الواحد تعمل دون إنترنت بعد تنزيل المحتوى. الغرف تحتاج الإنترنت وترسل بيانات الجلسة لخادم الغرف. إعداد الخادم المجاني وتشغيل التجربة في docs/ONLINE.md. عنوان الخادم غير معيّن في هذه الحزمة؛ إعداده شرط لتفعيل الغرف في النشر المنفصل. عند نشر الموقع كاملًا على Cloudflare، يُضبط عنوان الغرف تلقائيًا إلى عنوان الموقع نفسه.README 전문 보기 ↗
ألعاب جماعية عربية على جهاز واحد، وغرف للعبتَي مين فينا؟ وفبركة من عدة هواتف. إصدار 1.4.0 يضيف الكتابة المتزامنة والتصويت السري والكشف المشترك لفبركة، بالرمز والرابط وQR عبر Cloudflare Workers وSQLite Durable Objects.
ألعاب الجهاز الواحد تعمل دون إنترنت بعد تنزيل المحتوى. الغرف تحتاج الإنترنت
وترسل بيانات الجلسة لخادم الغرف. إعداد الخادم المجاني وتشغيل التجربة في
docs/ONLINE.md. عنوان الخادم غير معيّن في هذه الحزمة؛
إعداده شرط لتفعيل الغرف في النشر المنفصل. عند نشر الموقع كاملًا على
Cloudflare، يُضبط عنوان الغرف تلقائيًا إلى عنوان الموقع نفسه.
تظهر شاشة تحميل عند فتح ميدان، وتجهّز صور الأسئلة وأغلفة الفئات وصور فبركة
مع نسبة وعدّاد للصور المكتملة. انتظار صور الأسئلة لا يتجاوز ثلاث ثوانٍ بعد ظهور
الشاشة، ثم تفتح اللعبة وتستكمل الصور بالخلفية بأولوية منخفضة. إذا اكتملت أسرع
تفتح فورًا، ويمكن أيضًا الدخول يدويًا. الصور الحالية 510 بحجم يقارب 64 ميغابايت؛
تُحفظ في مخزن الوسائط إذا سمحت مساحة المتصفح، وتُستعمل مباشرة في الفتحات اللاحقة.
عند تحديث الصور تُنزّل ملفات مجلد الوسائط المحدّث فقط وفق بصمته؛ لا يُعاد تنزيل
البنك كله بسبب تحديث الواجهة. عند تعذّر التحميل يمكن إعادة المحاولة أو الدخول بالصور المتاحة.
الأصوات والمقاطع تُجلب عند الحاجة. صيغة الحزم وأنواع الأسئلة في
docs/PACK_FORMAT.md.
تحديث 25 سبتمبر 2026 منشور: بنك بديهة من 78 فئة و3,120 سؤالًا، مع الصور والأصوات المعتمدة. تجربة بديهة · سجل الدمج والنشر والتحقق.
| اللعبة | الفكرة | اللاعبون | المدة |
|---|---|---|---|
| بَديهة | لوحة أسئلة من ست فئات، شرائح 200–1000، وسائل مساعدة وسرقات | 2–4 فرق | 20–40 د |
| قبل ما يطق! | اذكر ثلاثة قبل الصفارة، أو مرّر القنبلة قبل أن تنفجر بيدك | 2–10 | 10–15 د |
| ممنوع! | صف الكلمة دون نطق خمس كلمات ممنوعة، والخصم يراقب | 2–4 فرق | 10–20 د |
| على جبينك | الجوال على جبينك، والآخرون يصفون وأنت تخمّن | 2–10 | 10–15 د |
| فَبْرَكة | حقائق وصور وأصحاب، كتابة سرية ونقاش وكشف مشوّق | 3–8 | 10–30 د |
| مين فينا؟ | عبارة، عدّ تنازلي، والكل يشير في اللحظة نفسها | 3–12 | 10–20 د |
فبركة 3 تستبدل البنك السابق بالكامل: 100 سؤال حقائق، و32 صورة توضيحية، و48 سؤال أصحاب، كلها جديدة.
للحقائق والأدوات روابط مصادر وتواريخ تحقق؛ الصور مولدة بالذكاء الاصطناعي لأدوات حقيقية، مع إفصاح ظاهر ووصف محايد وتكبير.
تُحفظ صور فبركة كلها للعمل دون اتصال بعد اكتمال تثبيت PWA، وتُضمّن في موارد غلاف iOS؛ يلزم نشر dist كاملًا مع media.
الجلسات المحلية القديمة تبدأ من جديد بسبب استبدال المحتوى، مع الاحتفاظ بالنتائج المكتملة والحسابات.
بقيت النقاط والمؤقّت الاختياري والمساعدة وجائزة الضحك كما هي. تدعم الغرف الأنماط الأربعة لـ3–8 لاعبين؛
لا تكشف رسائل الخادم هوية الإجابة الصحيحة أو روابط المصادر قبل مرحلة الكشف، والمؤقّت يستمر عند إخفاء الصفحة.
القواعد والمصادر واختبارات القبول. هذا وصف محتوى المستودع، وليس إعلان نشر النسخة الحية.
لنشر اللعبة والغرف معًا على رابط واحد اتبع docs/CLOUDFLARE.md.
يمكن الربط والنشر من متصفح الهاتف عبر Workers Builds، باستخدام فرع main.
ملف wrangler.jsonc الافتراضي ينشر اللعبة والغرف معًا.
الأمر npm run cloudflare:deploy يبني الموقع ويرفعه مع الخادم؛
أما npm run rooms:deploy فيرفع خادم الغرف وحده.
تحتاج Node.js 22 أو أحدث. استخدم npm ci لتثبيت إصدارات الحزمة المحفوظة.
npm install
npm run dev # يبني dist/ عند كل تغيير ويخدمه على http://localhost:3000
npm test # اختبارات المنصة والألعاب والمحتوى
npm run build # dist/index.html مع media والأصول اللازمة؛ انشر dist كاملًا
npm run bank:report # حالة الفئات الثماني والسبعين × الشرائح
npm run bank:validate -- <id> # فحص فئة (أو البنك كله بلا معامل)
npm run bank:placeholders # قائمة الأسئلة الحشو المُولَّدة آليًا
npm run bank:status -- <id> # حالة فئة وأعدادها (وبـ done|pending يحدّثها)
npm run bank:sort -- <id> # ترتيب الملف وإعادة توليد index.js
npm run media:fetch -- <id> "<بحث>" image --qid <qid> # وسيط مفتوح الرخصة
npm run release # release/maydan-platform-<version>.html + أرشيف المصدر
المعاينة عبر scripts/dev.mjs تخدم ملفات اللعبة فقط؛ لا تشغّل خادم الحسابات.
إذا عرضت بها بناء Cloudflare فإن مسارات /api/ تُرجع PREVIEW_ONLY، وتعرض
شاشة الدخول رابط الموقع المنشور بدل الانتقال إلى صفحة مفقودة. للدخول الحقيقي
استخدم إعدادات الموقع المنشور.
اختبار الحسابات محليًا يحتاج خادم الاختبار الموثق في دليل الحسابات؛
تغيير عنوان API إلى الإنتاج وحده لا يسمح بالعودة إلى localhost، ولا ينبغي تجاوز
قائمة أصول المصادقة المسموحة أو تعطيل التحقق منها.
src/
main.jsx نقطة الدخول: تركّب <PlatformApp/>
index.template.html هيكل الصفحة؛ البناء يحقن فيه الأنماط والحزمة
platform/ الغلاف: الموجّه، السجل، الشاشات، إطار اللعبة
shared/
theme/tokens.css نظام التصميم (ألوان، خطوط، مسافات، وصولية)
ui/ الأزرار والبطاقات والنوافذ والمؤقت ولوحة النتائج
setup/ دفتر اللاعبين، إعداد الفرق، شاشة «سلّم الجوال»
fx/ الصوت (WebAudio)، الاهتزاز، القصاصات (canvas)
lib/ التخزين، العشوائية، الخلط، منع التكرار، تطبيع العربية
games/<id>/ لعبة واحدة لكل مجلد
data/
categories/ بنك أسئلة بَديهة — ملف لكل فئة
games/<id>/ محتوى كل لعبة جديدة
tests/ اختبارات المنطق والمحتوى والسجل
اللعبة وحدة مستقلة: مجلد تحت src/games/ يصدّر manifest، وسطر واحد في السجل.
1) المنطق أولًا في logic.js — آلة حالة نقية بلا React، لتُختبر وحدها:
export function initialState(players, options) { /* … */ }
export function reduce(state, action) { /* … */ }
export function standings(state) { /* … */ }
2) الواجهة في Game.jsx تستقبل { api, players, teams, onExit }، وapi هو
كل ما تحتاجه من المنصة:
| الحقل | الوظيفة |
|---|---|
api.sound.play(name) | مؤثر من بنك ميدان (correct, buzzer, explosion, drumroll…)؛ الموسيقى تختارها المنصة من meta.music |
api.haptics.vibrate(kind) | اهتزاز (success, error, light…) حيث يتوفر |
api.confetti.fire() / .burst() | قصاصات على canvas، تحترم «تقليل الحركة» |
api.toast(msg) | تنبيه ينزلق من الأسفل |
api.storage | تخزين بنطاق maydan:<gameId>: لا يتداخل مع غيره |
api.roster | دفتر اللاعبين المشترك |
api.setInGame(bool) | يفعّل تأكيد الخروج أثناء اللعب |
api.restart() / api.backToSetup() | إعادة الجولة أو العودة للإعداد |
api.resumeGame(snapshot) | استئناف لقطة فحصتها اللعبة، مع لاعبيها وإعداداتها؛ تصل في savedSession |
api.setGameOptions(options) | تمرير إعدادات الإطلاق في gameOptions حتى عند تعذر حفظ التفضيلات |
api.setSetupValid(bool) | تمكين بدء اللعب بحسب صلاحية خيارات المحتوى |
api.setBeforeExit(handler) / api.setExitMessage(text) | إخفاء الدور أو إيقاف المؤقّت قبل تأكيد الخروج، ووصف حالة الحفظ بدقة |
3) المحتوى في src/data/games/<id>/*.json، ويُسحب عبر
createNoRepeat من shared/lib كي لا يتكرر عنصر داخل اللعبة الواحدة.
4) الـmanifest في index.js، وبياناته النصية في meta.js (خالٍ من React
حتى تختبره في Node):
export default {
id: 'mygame',
name: 'اسم اللعبة',
tagline: 'سطر واحد يصف الفكرة',
description: 'فقرة تظهر في شاشة التفاصيل',
howToPlay: ['خطوة', 'خطوة', 'خطوة'],
accent: '#F5B82E', // أضف --g-mygame في tokens.css
players: { min: 2, max: 8, mode: 'individual' }, // 'teams' | 'individual' | 'both'
duration: '10–15 دقيقة',
tags: ['سرعة'],
isNew: true,
version: '1.0.0',
music: 'calm', // موسيقى الخلفية أثناء المباراة: 'calm' | 'home' | 'tense' (شاشة الإعداد على 'home')
icon: MyIcon, // SVG مضمّن
Component: Game,
SetupOptions, // اختياري: إعدادات تظهر في شاشة الإعداد
activeKeys: ['session-v1'], // مفاتيح المباراة الجارية: يمسحها زر «مسح» في شاشة التعطّل أولًا، وتبقى النتائج
};
حفظ الجلسة: كل لعبة على جهاز واحد تحفظ مباراتها كي لا يضيّعها تحديث الصفحة أو إخلاء
iOS للتبويب. النمط الموحَّد: restoreSession(raw) في logic.js يفحص كل حقل تقرأه الواجهة
ويعيد اللقطة أو null؛ useSessionSave من shared/ui يحفظ حالة الـreducer (فورًا عند تغيّر
المرحلة، وإلا بعد ربع ثانية، ودائمًا عند الإخفاء والخروج) ويحذفها عند انتهاء المباراة؛ ومصدر
البطاقات يُحفظ ببذرته وموضعه (createNoRepeat().cursor ثم seek) فيُعاد بناؤه مطابقًا.
شاشة الإعداد تعرض بطاقة resume-card تستدعي api.resumeGame(snapshot).
5) التسجيل: سطر استيراد في src/platform/registry.js، ولون
--g-<id> في tokens.css. الاختبارات تفرض الحقول والألوان.
6) الاختبارات: tests/<id>-logic.test.js لتقلبات الحالة والحالات الحدية،
وفحص المحتوى يُضاف إلى tests/games-content.test.js.
audio/ تُخزَّن مسبقًا مع العامل الخدمي،
والموسيقى من audio/music/ تُجلب عند أول طلب؛ ووسائط حزم بَديهة تُخدَم من media/
وتُحفظ في مخزن العامل الخدمي. مصادر الصوت ورخصه في
docs/game-audio.md.beforeafter
قيد العمل؛ 48 سؤالًا في كل شريحة من 200 إلى 1000). childhood أُسقطت لتعذّر
ترخيص صور الطفولة (docs/bank/review-childhood-removed-2026-09-09.md)،
وfourpics سُحبت لأن صورها من مجمّع مشترك لا يخصّ إجاباتها
(docs/bank/review-fourpics-removed-2026-09-15.md).
القواعد في docs/bank/RUBRIC.md، والبنية في
docs/bank/SCHEMA.md، والحالة في src/data/bank-status.json.
npm run bank:validate يرسب على أي مخالفة: تكرار بعد التطبيع العربي، تجاوز حدود
الكلمات، ملف غير مرتّب، وسيط بلا ترخيص مقبول أو فوق الميزانية، وحشو مُولَّد آليًا
(npm run bank:placeholders يطبع القائمة كاملة).buildDeck وcreateNoRepeat يقدّمان ما لم يُعرض بعد.src/shared/brand/assets/{avatars,game-icons,trophy}.webp) شفافة الحواف وتُولَّد من الأصول المسطّحة في assets/flat/ بأمر npm run art:alpha؛ npm run art:check (ويشغّله npm test) يرسب إن فقدت قناة الألفا. لا تُحرَّر المخرجات يدويًا ولا يعاد استعمال mix-blend-mode/القص الدائري لإخفاء الخلفية.أهداف لمس ≥ 48px، تباين مضبوط، aria-label لكل زر أيقوني، حصر التركيز في
النوافذ، احترام prefers-reduced-motion (وخيار يدوي في الإعدادات)، ودعم
env(safe-area-inset-*) و100dvh. المؤقت يتوقف عند فقدان التركيز أو قفل
الشاشة ويستأنف بعد عدّ 3-2-1، والشاشة تبقى مضاءة أثناء اللعب عبر Wake Lock.
الأصل الرسمي الوحيد هو عامل Cloudflare maydan-game على workers.dev، ويُنشر من فرع
main عبر Workers Builds كما في docs/CLOUDFLARE.md. كل دفعة إلى
main تشغّل validate.yml (lint، بناء، اختبارات،
تحقق البنك، تجهيز iOS، وفحص Playwright حقيقي) ثم يبني Cloudflare من الفرع نفسه. نشر
GitHub Pages (pages.yml) صار يدويًا فقط ومعاينة
ثابتة بلا غرف ولا حسابات؛ كان ينشر تلقائيًا نسخة ثانية تنحرف عن الأصل. الموقع هو dist/:
الملف الواحد مع ملفات التطبيق القابل للتثبيت (PWA) من public/.
اسم مخزن العامل الخدمي لا يُحرَّر يدويًا. القيمة في public/sw.js هي
maydan-platform-__BUILD_ID__، ويستبدلها البناء (buildId وcopyPublic في
scripts/lib.mjs) بالإصدار مع بصمة sha256 لمستند index.html المبني. أي تغيير
في المستند يُنتج اسم مخزن جديدًا تلقائيًا: العامل الجديد يحذف المخزن القديم من
activate ثم يرسل maydan-update-ready إلى الصفحات المفتوحة. العامل لا يعيد
تحميل صفحة مفتوحة (لأن ذلك يُضيّع جولة جارية)؛ المنصة تعرض تنبيه «تحديث ميدان
جاهز» خارج شاشات اللعب، ويعمل الإصدار الجديد عند الفتح التالي. وضع رقم ثابت مكان
__BUILD_ID__ يُعطِّل هذا الوسم التلقائي.
ملف public/_headers يرافق dist/ ويحمل ترويسات الأمان (CSP، nosniff،
X-Frame-Options، Referrer-Policy) نفسها التي يضعها server/full-worker.mjs،
لأن assets.run_worker_first في wrangler.jsonc يقصر تشغيل العامل على
/api و/health فلا يمرّ الملف الثابت به.