Godot 4 · GDScript
Monnaies et achats
Gamdato inclut une economie : des monnaies virtuelles que le joueur achete avec de l'argent reel (via Stripe), et des articles qu'il acquiert en depensant ces monnaies. Tout se definit dans le panneau et se consomme depuis l'addon.
Configuration du Panneau
Dans le panneau tu definis trois choses : les monnaies du jeu (ex. "gemmes"), les packs de recharge (un SKU avec un prix en USD qui accorde X monnaies via Stripe) et les articles achetables (un SKU avec son cout en monnaies et ses regles d'attribution).
Conserve le SKU de chaque pack et article : ce sont les identifiants que tu passes a buy_pack() et purchase().
Consulter les Soldes
Demande les soldes du joueur et le catalogue de monnaies. Le resultat arrive via le signal balances_loaded.
Gamdato.balances_loaded.connect(_on_balances)
Gamdato.get_balances()
func _on_balances(soldes : Array, monnaies : Array) -> void:
for s in soldes:
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().Acheter des Monnaies (Stripe)
Lance l'achat d'un pack de recharge. L'addon ouvre le Checkout Stripe dans le navigateur du systeme ; au retour, les soldes sont mis a jour cote serveur. Le signal topup_started confirme que l'URL a ete ouverte.
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 ouvert : %s" % url)
else : print("Erreur : %s" % error_code)Depenser des Monnaies
Depense les monnaies du joueur sur un article. Le serveur valide le solde et applique les regles d'attribution de maniere atomique. Le resultat arrive via 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("Achete %s. Soldes : %s" % [sku, result.balances])
else : print("Echec : %s" % error_code)error_code peut etre insufficient_funds, already_owned ou item_not_found. Passe un idempotency_key pour eviter les doubles debits en cas de nouvelle tentative.
Inventaire du Joueur
Liste les articles que le joueur possede. Utile pour debloquer du contenu au demarrage de la partie. Arrive via inventory_loaded.
Gamdato.inventory_loaded.connect(_on_inventory)
Gamdato.get_inventory()
func _on_inventory(items : Array) -> void:
for it in items:
print("Possede : %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).Historique des Transactions
Listez les mouvements de monnaie recents du joueur (attributions, achats, recharges), du plus recent au plus ancien. Arrive via ledger_loaded.
Gamdato.ledger_loaded.connect(_on_ledger)
Gamdato.get_ledger() # ou 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).Classement par Monnaie
Un classement des joueurs par solde de monnaie (doit etre active pour cette monnaie dans le panneau). Passez le code de la monnaie. Arrive via 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
}Accorder de la Monnaie (Recompenses dans le Code)
Donnez de la monnaie au joueur a partir d'une raison que vous avez definie dans le panneau (le paiement d'une quete, un bonus de montee de niveau...). Passez la cle de la raison. Arrive via 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("Accorde ! Soldes : %s" % result.get("balances"))
else: print("Echec : %s" % error_code)Les attributions sont definies dans le panneau par une cle de raison et peuvent avoir des temps de recharge ou des plafonds. C'est pour les recompenses en jeu, pas les achats en argent reel (utilisez buy_pack pour cela).