Caputchin
تطوير لعبة المتجر

مرجع SDK اللعبة

@caputchin/game-sdk هو العقد الذي يكتب مؤلّف لعبة مقابله: مساعد register، وجسر Bridge دافع-فقط، وسياق GameContext لكل جولة، وأنواع TypeScript لكتل تهيئات البيان. يُنشَر منفصلًا عن الأداة المواجِهة للمستخدم كي لا تحزم الألعاب أبدًا زمن تشغيل الأداة بالتعدّي. ألعاب الطرف الأول تستخدم هذا الـ API العام نفسه؛ لا عقد خاصّ.

لبناء موجَّه، انظر ابنِ لعبة المتجر. للبيان الذي يعلن التهيئات التي يكشفها هذا الـ SDK، انظر بيان caputchin.json.

register(factory)

نقطة دخول التسجيل الوحيدة. مرّر مصنع لعبتك؛ لا تمرّر البيان (يقرأ الخادم caputchin.json وقت الفهرسة ويشحن التهيئات المحلولة كسياق المصنع). التسجيل مرّتين يسجّل تنبيهًا في الطرفية والكتابة الأخيرة تفوز؛ لا فرض من المنصّة.

register(factory: GameFactory): void

مصنع اللعبة

type GameFactory = (
  container: HTMLElement,
  bridge: Bridge,
  ctx?: GameContext,
) => (() => void) | void
المعاملالمعنى
containerعنصر داخل إطار iframe المعزول للّعبة. اعرض هنا. التنسيق محصور طبيعيًّا، فالإطار وثيقته الخاصة.
bridgeالقناة الدافعة-فقط إلى المضيف (انظر الجسر). تبثّ اللعبة إلى الأعلى؛ لا تشترك. نداء المصنع هو إشارة البدء.
ctxسياق كل جولة (البذرة إضافةً إلى التهيئات المحلولة). اختياري في النوع لأن الأداة قد تشغّل لعبة خارج جلسة متحقَّق منها.
returnدالة تنظيف اختيارية تناديها الأداة إن فكّكت لعبتك.

الجسر

الجسر دافع-فقط: تبلّغ اللعبة الأحداث للمضيف ولا تنصت أبدًا. أعضاؤه:

العضوالشكلالأثر
passpass(result: { trace: string }): voidيشير إلى أن الجولة نجحت، مسلّمًا المضيف trace المعتم. يعيد الخادم تشغيل run اللعبة تحت البذرة المُصدَرة لحساب الحُكم الموثوق، فاللعبة لا تبلّغ نتيجة هنا. أول نداء يطلق التحقّق المحبوس ويقفل الرمز؛ والنداءات اللاحقة تُتجاهَل.
errorerror(err: { code: string; message?: string }): voidاللعبة نفسها فشلت (تحميل أصل، استثناء داخلي). يُظهر حدث error للمستخدم. متمايز عن خسارة لاعب، التي يُشار إليها بنداء لا شيء.
setSizesetSize(width: number, height: number): voidغيّر حجم الإطار صراحةً ليلائم المحتوى. ناده بعد أول رسم؛ تقيس الأداة أيضًا أول ابن للّعبة تلقائيًّا، فمعظم الألعاب لا تحتاجه أبدًا.
layoutreadonly layout: 'inline' | 'modal' | 'fullscreen' | nullالعرض المحلول الذي تعمل اللعبة تحته، أو null حين يكون مجهولًا.

لا complete عمدًا، ولا مُنصِت start، ولا طريقة unmount (أعِد دالة تنظيف بدلًا)، ولا إشارة فشل أبعد من الصمت.

السياق

interface GameContext {
  seed:   Seed          | null
  locale: ResolvedLocale | null
  skin:   ResolvedSkin   | null
  config: ResolvedConfig | null
}
الحقلالمعنى
seedبذرة إعادة تشغيل كل جولة (Seed من عقد إعادة التشغيل). ابذر كل عشوائية اللعبة منها. null حين تعمل اللعبة خارج جلسة متحقَّق منها.
localeكائن اللغة المحلول: _lang (BCP-47)، و_direction، إضافةً إلى مفاتيح نصوصك المسطّحة. null إن لم يشحن بيانك كتلة locales.
skinالمظهر المحلول: _theme إضافةً إلى مفاتيح اللون/الأصل المسطّحة، وروابط الأصول مطلقة أصلًا. _theme دائمًا الوضع الملموس الذي حُلّ له المظهر، light أو dark (لا any أبدًا)، فتهيئة محايدة-السمة تبلّغ وضع الزائر الفعلي. null إن لا كتلة skins.
configالإعداد المحلول: قياسياتك المكتوبة الأنواع المسطّحة. null إن لا كتلة configurations.

كلٌّ null حين تغيب كتلة البيان المقابلة، فقدّم دائمًا ارتدادًا مدمجًا.

أنواع التهيئات

يصدّر الـ SDK أنواع TypeScript لتأليف caputchin.json (وملفّات .caputchin/ المقسّمة) بفحص الأنواع. تعكس هذه كتل البيان:

النوعيصف
GameManifestالـ caputchin.json كله. مصدر حقيقة المؤلّف + المفهرِس؛ لا يُقرَأ في المتصفّح أبدًا.
LocalePreset / ResolvedLocaleتهيئة لغة مُعلَنة / الكائن المحلول الذي تستقبله اللعبة.
SkinPreset / ResolvedSkin / SkinSchemaEntry / SkinValueTypeتهيئات المظهر، والمظهر المحلول، ومخطّط النوع لكل مفتاح.
ConfigPreset / ResolvedConfig / ConfigSchemaEntry / ConfigValueTypeتهيئات الإعداد، والإعداد المحلول، ومخطّط النوع لكل مفتاح.
LocalesFile / SkinsFile / ConfigurationsFileالكائن الأعلى لكل ملفّ مقسّم .caputchin/<axis>.json.
MarketplaceMetadata / PreferredPresentationكتلة marketplace وتلميح بصمة preferred.

ألّف ملفًّا مقسّمًا باستيراد satisfies كي يفحصه المصرّف:

import type { LocalesFile } from "@caputchin/game-sdk";
export default { schema: { /* ... */ }, presets: { /* ... */ } } satisfies LocalesFile;

ما الذي غائب عمدًا

  • لا sessionId ولا معرّفات منصّة تبلغ اللعبة.
  • لا خطّافات دورة حياة start / pause / resume؛ نداء المصنع هو البدء.
  • لا maxScore ولا مدى نتيجة منصّة؛ نتيجة الحُكم هي أيًّا تعيد run خاصتك.

العقد ضئيل عمدًا كي يبقى ثابتًا عبر سنوات نموّ الكتالوج.

انظر أيضًا

في هذه الصفحة