Godot 4 · GDScript
Monedas y compras
Gamdato incluye una economia: monedas virtuales que el jugador compra con dinero real (via Stripe) y articulos que adquiere gastando esas monedas. Todo se define en el panel y se consume desde el addon.
Configuracion en el Panel
Desde el panel defines tres cosas: las monedas del juego (ej. "gemas"), los packs de recarga (un SKU con precio en USD que entrega X monedas via Stripe) y los articulos comprables (un SKU con su costo en monedas y sus reglas de entrega).
Guarda los SKU de cada pack y articulo: son los identificadores que pasas a buy_pack() y purchase().
Consultar Saldos
Pide los saldos del jugador y el catalogo de monedas. El resultado llega por la senal balances_loaded.
Gamdato.balances_loaded.connect(_on_balances)
Gamdato.get_balances()
func _on_balances(saldos: Array, monedas: Array) -> void:
for s in saldos:
print("%s: %d" % [s.currency_id, s.balance])# balances: Array, each:
{
"currency_id": String,
"balance": int
}
# currencies: Array, the catalog you defined in the panel:
{
"id": String,
"code": String,
"display_name": String,
"icon_url": String,
"is_active": bool
}
# "code" is the currency code you pass to get_currency_leaderboard().Comprar Monedas (Stripe)
Inicia la compra de un pack de recarga. El addon abre el Checkout de Stripe en el navegador del sistema; al volver, los saldos se actualizan en el servidor. La senal topup_started confirma que se abrio la URL.
Gamdato.topup_started.connect(_on_topup)
Gamdato.buy_pack("premium_pack")
func _on_topup(ok: bool, url: String, error_code: String) -> void:
if ok: print("Checkout abierto: %s" % url)
else: print("Error: %s" % error_code)Comprar con Monedas
Gasta las monedas del jugador en un articulo. El servidor valida el saldo y aplica las reglas de entrega de forma atomica. El resultado llega por purchase_completed.
Gamdato.purchase_completed.connect(_on_purchase)
Gamdato.purchase("sword_skin")
func _on_purchase(ok: bool, sku: String, result: Dictionary, error_code: String) -> void:
if ok: print("Comprado %s. Saldos: %s" % [sku, result.balances])
else: print("Fallo: %s" % error_code)error_code puede ser insufficient_funds, already_owned o item_not_found. Pasa un idempotency_key para evitar cobros dobles si reintentas.
Inventario del Jugador
Lista los articulos que el jugador posee. Util para desbloquear contenido al iniciar la partida. Llega por inventory_loaded.
Gamdato.inventory_loaded.connect(_on_inventory)
Gamdato.get_inventory()
func _on_inventory(items: Array) -> void:
for it in items:
print("Posee: %s (%s)" % [it.item_id, it.source])# items: Array, each owned item:
{
"item_id": String,
"source": String,
"acquired_at": String,
"metadata": Dictionary
}
# Rows also include internal ids (id, player_id, game_id).Historial de Transacciones
Lista los movimientos de monedas mas recientes del jugador (otorgamientos, compras, recargas), del mas nuevo al mas antiguo. Llega por la senal ledger_loaded.
Gamdato.ledger_loaded.connect(_on_ledger)
Gamdato.get_ledger() # o get_ledger(50, 0)
func _on_ledger(entries: Array) -> void:
for e in entries:
print("%s %+d -> %d" % [e.op_type, e.delta, e.balance_after])# entries: Array, newest first:
{
"id": String,
"currency_id": String,
"delta": int,
"balance_after": int,
"op_type": String,
"created_at": String
}
# Rows also include internal ids/metadata (player_id, game_id, ref_kind, ref_value, idempotency_key, metadata).Ranking por Monedas
Un ranking de jugadores segun su saldo de monedas (debe estar habilitado para esa moneda en el panel). Pasa el codigo de la moneda. Llega por la senal currency_leaderboard_loaded.
Gamdato.currency_leaderboard_loaded.connect(_on_currency_lb)
Gamdato.get_currency_leaderboard("gems")
func _on_currency_lb(code: String, entries: Array) -> void:
for row in entries:
print("#%d %s %d" % [row.rank, row.player_name, row.balance])# entries: Array, ordered by balance, highest first:
{
"rank": int,
"player_id": String,
"player_name": String,
"balance": int
}Otorgar Monedas (Recompensas desde Codigo)
Entrega monedas al jugador a partir de un motivo que definiste en el panel (el pago de una mision, un bono por subir de nivel...). Pasa la clave del motivo. Llega por la senal grant_completed.
Gamdato.grant_completed.connect(_on_grant)
Gamdato.grant_currency("quest_reward")
func _on_grant(ok: bool, reason_key: String, result: Dictionary, error_code: String) -> void:
if ok: print("Otorgado! Saldos: %s" % result.get("balances"))
else: print("Fallo: %s" % error_code)Los otorgamientos se definen en el panel mediante una clave de motivo y pueden tener tiempos de espera o limites. Esto es para recompensas dentro del juego, no para compras con dinero real (para esas usa buy_pack).