Aller au contenu principal
Voir

Créer des boutiques d'objets et de Pokémon

Section archivée à la sortie de Pokémon Studio v3.0

Pokémon Studio v3.0 abandonnera RPG Maker. À ce moment-là, cette section sera archivée : les pages resteront accessibles comme référence mais ne seront plus mises à jour.

PSDK permet à un event d'ouvrir une boutique où le joueur achète des objets, ou même des Pokémon. Une boutique peut vendre depuis un stock infini ou depuis un stock limité qui s'épuise, et elle signale ce que le joueur a fait pour que le marchand puisse réagir. Ce guide couvre les deux familles de boutiques et comment les piloter depuis un event.

Toutes les commandes ci-dessous sont des méthodes de l'Interpreter : on les appelle depuis la commande Script d'un event, sans aucun préfixe.

Deux familles de boutiques

Avant de séparer objets et Pokémon, deux idées s'appliquent à toute boutique.

Illimitée ou limitée. Une boutique illimitée a un stock infini : le joueur peut acheter le même objet encore et encore. On décrit son contenu directement dans l'appel qui l'ouvre, et rien n'est mémorisé ensuite. Une boutique limitée a un stock fini qui diminue à chaque achat et persiste dans la sauvegarde. On construit son stock une fois avec une commande dédiée, on lui donne un Symbol pour l'identifier, puis on l'ouvre plus tard via ce symbole. La même boutique peut être rouverte, réapprovisionnée ou vidée au fil de la partie.

Un prix de 0 masque l'entrée. Quelle que soit la boutique, un objet ou un Pokémon dont le prix vaut 0 (ou est négatif) est retiré silencieusement de la liste. On s'en sert pour garder une entrée définie dans une boutique limitée sans la proposer encore à la vente. Un objet non limité que le joueur possède déjà est lui aussi masqué de la liste. Si toutes les entrées finissent filtrées, la boutique se ferme aussitôt au lieu d'afficher une fenêtre vide.

La boutique signale son issue. À la fermeture, PSDK écrit un code de résultat dans la variable système 26 pour que l'event sache si le joueur a acheté quelque chose. Voir Réagir à la fermeture de la boutique à la fin de ce guide.

Boutiques d'objets

Boutique illimitée

La méthode open_shop ouvre une boutique à partir d'une simple liste d'objets :

open_shop(symbol_or_list, prices = {}, show_background: true)
  • symbol_or_list — un tableau de db_symbols d'objets (ou d'ID numériques) à vendre.
  • prices — un Hash facultatif pour surcharger les prix le temps de cette ouverture. Les clés sont des db_symbols d'objets, les valeurs les nouveaux prix. Un objet absent garde son prix de la base de données.
  • show_background — un argument nommé facultatif. Le mettre à false ouvre la boutique par-dessus la map au lieu du fond animé.
open_shop(
[:poke_ball, :potion, :antidote, :paralyze_heal],
{ poke_ball: 150, potion: 250 },
show_background: true
)

Cet appel vend quatre objets ; la Poké Ball et la Potion utilisent les prix surchargés, l'Antidote et l'Anti-Para gardent leurs prix de la base de données. Les objets au prix 0 et les objets non limités déjà dans le sac ne sont pas affichés.

Boutique limitée

Une boutique limitée vend un stock fini qui survit d'une ouverture à l'autre. La construire demande quelques étapes.

1. Créer la boutique et son stock avec add_limited_shop :

add_limited_shop(symbol_of_shop, items_sym = [], items_quantity = [], shop_rewrite: false)
  • symbol_of_shop — le Symbol qui nomme cette boutique. On le réutilise pour réapprovisionner et pour ouvrir.
  • items_sym — les objets à mettre en stock.
  • items_quantity — combien de chacun. Un objet sans quantité associée vaut une unité par défaut.
  • shop_rewrite — le laisser à false (la valeur par défaut). Si la boutique existe déjà, l'appel la réapprovisionne sans toucher au reste. Ne le passer à true que pour effacer la boutique et la reconstruire de zéro volontairement.
add_limited_shop(
:celadon_dept_store,
[:poke_ball, :potion, :antidote, :paralyze_heal],
[5, 3, 2, 1]
)

2. Réapprovisionner plus tard avec add_items_to_limited_shop. Les quantités s'ajoutent au stock courant ; un objet pas encore présent est créé :

add_items_to_limited_shop(symbol_of_shop, items_to_refill = [], quantities_to_refill = [])

add_items_to_limited_shop(:celadon_dept_store, [:poke_ball, :great_ball], [10, 3])

3. Retirer du stock avec remove_items_from_limited_shop. Les quantités sont soustraites ; une entrée qui atteint zéro est supprimée. Passer nil comme quantité retire tout l'objet d'un coup :

remove_items_from_limited_shop(symbol_of_shop, items_to_remove, quantities_to_remove)

remove_items_from_limited_shop(:celadon_dept_store, [:potion, :antidote], [2, nil])

Cet appel retire deux Potions et tous les Antidotes restants en stock.

4. Ouvrir la boutique en passant son symbole à open_shop au lieu d'un tableau :

open_shop(:celadon_dept_store, { poke_ball: 150 }, show_background: true)

Le Hash de prix facultatif fonctionne exactement comme pour une boutique illimitée. Le joueur ne peut acheter que dans la limite du stock restant, et chaque achat le diminue pour la fois suivante.

Boutiques de Pokémon

Une boutique de Pokémon repose sur le même découpage illimité/limité, mais chaque entrée doit aussi décrire le Pokémon vendu, pas seulement un ID et un prix.

Boutique illimitée

pokemon_shop_open(symbol_or_list, prices = [], param = [], show_background: true)
  • symbol_or_list — un tableau de db_symbols de Pokémon (ou d'ID) à vendre.
  • prices — un tableau de prix, un par Pokémon, dans le même ordre. Un Pokémon au prix 0 est masqué.
  • param — un tableau décrivant chaque Pokémon (voir Décrire un Pokémon plus bas), dans le même ordre.
  • show_background — le même argument nommé facultatif que pour les boutiques d'objets.
pokemon_shop_open(
[:bulbasaur, :charmander, :squirtle],
[2000, 2000, 2000],
[5, 5, { level: 10, shiny: true }],
show_background: true
)

Cet appel propose les trois starters à 2000 chacun : Bulbizarre et Salamèche au niveau 5, et un Carapuce chromatique au niveau 10.

Décrire un Pokémon

L'entrée param d'un Pokémon prend deux formes :

  • Un entier, lu comme le niveau. Tout le reste (forme, genre, nature...) utilise les valeurs par défaut de l'espèce. 5 est un raccourci pour un Pokémon de niveau 5.
  • Un Hash, quand on veut plus de contrôle. Les clés les plus courantes sont :level, :form, :shiny, :given_name, :nature, :gender, :item, :ability et :moves. Toute clé omise revient à la valeur par défaut.
{ level: 25, form: 1, shiny: true, given_name: "Sparky" }

La clé :form ne fait pas que changer l'apparence : une boutique de Pokémon limitée distingue deux entrées d'une même espèce par leur forme (voir plus bas). Dans le doute, on renseigne :form explicitement ; omise, elle vaut la forme 0.

Boutique limitée

Le cycle de vie reflète celui de la boutique d'objets, avec la description du Pokémon en plus sur chaque commande.

1. Créer la boutique avec add_new_pokemon_shop :

add_new_pokemon_shop(sym_new_shop, list_id, list_price, list_param, list_quantity = [], shop_rewrite: false)
  • sym_new_shop — le Symbol qui nomme la boutique.
  • list_id — les Pokémon à vendre.
  • list_price — leurs prix, un par Pokémon.
  • list_param — leurs descriptions (niveau entier ou Hash), une par Pokémon.
  • list_quantity — combien de chacun ; vaut une unité par défaut.
  • shop_rewrite — même sens que pour les boutiques d'objets : false réapprovisionne une boutique existante, true la reconstruit.
add_new_pokemon_shop(
:game_corner_prizes,
[:eevee, :dratini, :magikarp],
[3000, 4600, 500],
[25, 18, { level: 5, shiny: true }],
[1, 1, 2]
)

2. Ajouter des Pokémon plus tard avec add_pokemon_to_shop. Un Pokémon déjà en stock est reconnu par espèce et forme : avec pkm_rewrite: false (la valeur par défaut) la quantité s'ajoute ; avec pkm_rewrite: true l'entrée existante est remplacée par la nouvelle description :

add_pokemon_to_shop(symbol_of_shop, list_id, list_price, list_param, list_quantity = [], pkm_rewrite: false)

add_pokemon_to_shop(:game_corner_prizes, [:magikarp], [500], [5], [3])

3. Retirer des Pokémon avec remove_pokemon_from_shop. Comme une espèce peut exister sous plusieurs formes, on précise la forme à viser ; passer nil comme quantité retire l'entrée entièrement :

remove_pokemon_from_shop(symbol_of_shop, remove_list_mon, param_form, quantities_to_remove = [])

remove_pokemon_from_shop(:game_corner_prizes, [:eevee, :dratini], [{ form: 0 }, { form: 0 }], [1, nil])

Cet appel retire un Évoli (forme 0) et tous les Minidraco (forme 0) en stock.

4. Ouvrir la boutique en passant le symbole à pokemon_shop_open. Sous cette forme, le deuxième argument est un Hash de surcharge de prix (indexé par ID de Pokémon), pas un tableau, et il n'y a pas d'argument param puisque le stock contient déjà la description de chaque Pokémon :

pokemon_shop_open(:game_corner_prizes, { eevee: 2500 }, show_background: true)

Réagir à la fermeture de la boutique

Quelle que soit la boutique ouverte, PSDK écrit un code de résultat dans la variable système 26 (Yuki::Var::TMP1 dans le moteur) quand la fenêtre se ferme. La lire ensuite permet au marchand de dire quelque chose d'adapté au lieu d'une ligne générique. Les codes sont :

CodeSignification
-1La boutique n'a même pas pu s'ouvrir : toutes les entrées étaient filtrées (prix 0, ou objets déjà possédés).
0Le joueur a fermé la boutique sans rien acheter.
1Le joueur a acheté un seul type d'objet, ou une seule espèce de Pokémon.
2Le joueur a acheté plusieurs types d'objets, ou plusieurs espèces de Pokémon.
3Le joueur a acheté la dernière unité en stock, donc une boutique limitée s'est vidée et fermée d'elle-même.

Pour une boutique de Pokémon, la distinction 1 contre 2 compte les espèces, pas les unités : acheter trois Magicarpe reste 1, alors qu'acheter un Magicarpe et un Évoli donne 2.

On lit la variable juste après la commande de boutique, dans une Condition sur son onglet Script. Le raccourci gv permet de rester concis :

# Le joueur a-t-il acheté au moins une chose ?
gv[26] >= 1

De là, on aiguille vers le bon dialogue : un remerciement quand gv[26] vaut 1 ou 2, une ligne neutre quand il vaut 0, ou un message « nous sommes en rupture » quand il vaut -1 ou 3.

Conclusion

  • On ouvre une boutique illimitée avec open_shop (objets) ou pokemon_shop_open (Pokémon), en décrivant le contenu directement dans l'appel.
  • On construit une boutique limitée une fois avec add_limited_shop / add_new_pokemon_shop, on la tient à jour avec les commandes add_* et remove_*, puis on l'ouvre via son Symbol.
  • Un prix de 0 masque une entrée ; un objet non limité déjà possédé est masqué aussi ; une boutique entièrement filtrée se ferme au lieu de ne rien montrer.
  • On décrit un Pokémon vendu avec un niveau entier ou un Hash (:level, :form, :shiny...) ; une boutique de Pokémon limitée distingue les entrées par espèce et forme.
  • Après chaque boutique, la variable système 26 signale l'issue (-1 à 3) pour que l'event puisse réagir.