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 안의 요소. 여기 렌더링하세요. 스타일은 자연히 범위가 지정됩니다, iframe이 자기 자신의 문서입니다.
bridge호스트로의 푸시 전용 채널(브리지 참고). 게임은 위로 내보냅니다; 구독하지 않습니다. 팩토리가 호출되는 것이 시작 신호입니다.
ctx라운드별 컨텍스트(시드에 해소된 프리셋). 위젯이 검증된 세션 밖에서 게임을 돌릴 수 있으니 타입에서 선택적입니다.
return위젯이 당신의 게임을 언마운트하면 호출하는 선택적 정리 함수.

브리지

브리지는 푸시 전용입니다: 게임은 호스트에 이벤트를 보고하고 결코 듣지 않습니다. 그 멤버:

멤버모양효과
passpass(result: { trace: string }): void라운드가 통과됐음을 신호하며, 호스트에 불투명 trace를 건넵니다. 서버는 발급된 시드 아래에서 게임의 run을 다시 실행해 권위 있는 판정을 계산하니, 게임은 여기서 점수를 보고하지 않습니다. 첫 호출이 보류된 검증을 해제하고 토큰을 잠급니다; 나중 호출은 무시됩니다.
errorerror(err: { code: string; message?: string }): void게임 자체가 실패함(자산 로드, 내부 예외). 사용자에게 error 이벤트를 드러냅니다. 아무것도 호출하지 않음으로 신호되는 플레이어 패배와는 구별됩니다.
setSizesetSize(width: number, height: number): voidiframe을 콘텐츠에 맞게 명시적으로 크기 조정. 첫 페인트 뒤에 호출하세요; 위젯은 게임의 첫 자식도 자동 측정하니, 대부분의 게임은 이것이 결코 필요 없습니다.
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, 에 당신의 평탄화된 텍스트 키. 당신의 매니페스트가 locales 블록을 내지 않으면 null.
skin해소된 스킨: _theme에 당신의 평탄화된 색상/자산 키, 자산 URL은 이미 절대적. _theme은 늘 스킨이 해소된 구체적 모드, light 또는 dark(결코 any 아님)이니, 테마 불가지론 프리셋이 방문자의 실제 모드를 보고합니다. skins 블록이 없으면 null.
config해소된 구성: 당신의 평탄화된 타입 지정 스칼라. configurations 블록이 없으면 null.

대응하는 매니페스트 블록이 없을 때 각각 null이니, 늘 내장 대체를 제공하세요.

프리셋 타입

SDK는 타입 확인과 함께 caputchin.json(그리고 분할된 .caputchin/ 파일)을 작성하기 위한 TypeScript 타입을 export합니다. 이것들은 매니페스트 블록을 비춥니다:

타입설명하는 것
GameManifest전체 caputchin.json. 작성자 + 색인기 진실 소스; 브라우저에서 결코 읽히지 않음.
LocalePreset / ResolvedLocale선언된 로케일 프리셋 / 게임이 받는 해소된 객체.
SkinPreset / ResolvedSkin / SkinSchemaEntry / SkinValueType스킨 프리셋, 해소된 스킨, 그리고 키별 타입 스키마.
ConfigPreset / ResolvedConfig / ConfigSchemaEntry / ConfigValueType구성 프리셋, 해소된 구성, 그리고 키별 타입 스키마.
LocalesFile / SkinsFile / ConfigurationsFile.caputchin/<axis>.json 분할 파일의 최상위 객체.
MarketplaceMetadata / PreferredPresentationmarketplace 블록과 preferred 풋프린트 힌트.

컴파일러가 확인하도록 satisfies 임포트로 분할 파일을 작성하세요:

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

일부러 없는 것

  • 어떤 sessionId나 플랫폼 식별자도 게임에 닿지 않습니다.
  • start / pause / resume 수명 주기 후크 없음; 팩토리 호출이 시작입니다.
  • maxScore나 플랫폼 점수 범위 없음; 판정의 점수는 당신의 run이 반환하는 무엇이든입니다.

계약은 일부러 작아서 수년의 카탈로그 성장에 걸쳐 안정되게 유지됩니다.

함께 보기

이 페이지에서