xyvera/content/schema/banner.yaml
caoimhinr fb00954954 Initial scaffold: Nakama backend, Godot client, content schema
Sets up the Step 1 (Project Foundation) and Step 2 (Content Schemas) scaffold
from the implementation sequence. Includes Docker Compose stack, Nakama
TypeScript module stubs, PostgreSQL migration, Godot 4 project shell with
scene stubs and NakamaClient singleton, YAML content schemas for all entity
types, and example data for 3 characters, 2 jobs, and all 7 core resources.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 23:33:06 +02:00

121 lines
3.3 KiB
YAML

# banner.yaml — schema definition for gacha banner definitions
#
# All rate tables are content-driven. No hardcoded pull rates in server code.
# Banner end dates and pity rules must be visible to players per design spec.
$schema: "xyvera/content-schema/banner/v1"
type: object
required:
- id
- name
- type
- pull_cost
- pool
- pity
properties:
id:
type: string
pattern: "^[a-z][a-z0-9_]*$"
name:
type: string
type:
type: string
enum: [standard, featured, event]
description: >
standard = permanent evergreen with wishlist;
featured = region or character banner with up/down rate;
event = limited mega-event with spark currency.
pull_cost:
type: object
required: [currency, single, multi]
properties:
currency:
type: string
description: "Resource ID used to pull. Usually 'diamond' or a banner-specific ticket."
single:
type: integer
minimum: 1
multi:
type: integer
minimum: 1
description: "Cost for a 10-pull. Typically single * 10 minus one free pull."
pool:
type: array
description: "All characters eligible from this banner."
items:
type: object
required: [character_id, rarity, base_weight]
properties:
character_id:
type: string
rarity:
type: string
enum: [R, SR, SSR, UR]
base_weight:
type: number
minimum: 0.0
description: "Relative weight before pity modifiers. Higher = more common."
is_featured:
type: boolean
default: false
pity:
type: object
required: [soft_pity_start, hard_pity, guaranteed_rarity]
properties:
soft_pity_start:
type: integer
minimum: 1
description: "Pull count at which SSR/UR rate starts increasing toward hard pity."
hard_pity:
type: integer
minimum: 1
description: "Pull count that guarantees at least guaranteed_rarity."
guaranteed_rarity:
type: string
enum: [SR, SSR, UR]
featured_guarantee:
type: object
description: "50/50 featured character guarantee rules."
properties:
rate:
type: number
minimum: 0.0
maximum: 1.0
description: "Chance featured character is selected when SSR hits."
guaranteed_after_loss:
type: boolean
default: true
description: "If false on the 50/50, next SSR is guaranteed featured."
spark_currency:
type: object
description: "Only applies to event-type banners."
properties:
currency_id:
type: string
spark_cost:
type: integer
description: "Amount of spark currency required to select a featured character."
active_from:
type: string
format: date-time
description: "ISO 8601 UTC datetime. Null means active from server start."
active_until:
type: string
format: date-time
description: "ISO 8601 UTC datetime. Null means permanent."
rerun_policy:
type: string
enum: [permanent, will_rerun, no_rerun_planned, collaboration_locked]
default: permanent
description: "Displayed to players per the fair-visibility design pillar."