Variables Locales

  • 4 Réponses
  • 187 Vues
*

Hors ligne Leikt

Variables Locales
« le: 24 mai 2017, 10:05:22 »
25/05/2017 : Mise à jour du script mineure

Bonjour à toutes et à tous,

RMXP nous donnes la possibilité de gérer des Interrupteurs locaux, mais qu'en est-il des variables locales ? Résultat, pour faire un personnage qui vous donnes des informations aléatoire sur le monde, ou un personnage qui s'énerve quand on lui parle trop on se retrouve à utiliser des variables de jeu et ça devient rapidement chaotique.

D'où ce plugin. Il permet de gérer des variables locales discrètement et simplement via la commande insérer un script.

Installation
Pour PSDK : Télécharger la pièce jointe dans le dossier plugin de votre projet. Pré installé depuis PSDK 19.255

Pour PSP 0.9 :
Créer un script au-dessus de Main nommé : Game_SelfVariables, copiez/collez-y ce script
Spoiler
#==============================================================================
# ■ Game_SelfVariables
#------------------------------------------------------------------------------
# Hash gérant les variables locales. Des variables propres à l'évènement,
# Permet de ne pas devoir utiliser de variable de jeu pour gérer ce qui est propre
# à un évènement
# Dans les scrpit, la variable globale $game_self_variables contient les variables
# locales
#==============================================================================

class Game_SelfVariables
  #--------------------------------------------------------------------------
  # ● Création
  #--------------------------------------------------------------------------
  def initialize
    @data = {}
  end
  #--------------------------------------------------------------------------
  # ● Get
  #    key : Object, index de la variable à récupérer
  #--------------------------------------------------------------------------
  def [](key)
    return @data[key]
  end
  #--------------------------------------------------------------------------
  # ● Set
  #    key  : Object, index de la variable à modifier
  #    value : Object, information à stocker
  #--------------------------------------------------------------------------
  def []=(key, value)
    @data[key] = value
  end
end

class Interpreter
  def get_local_variable(id_var, id_event = @event_id, id_map = @map_id)
    key = [id_map, id_event, id_var]
    $game_self_variables[key] = 0 if $game_self_variables[key] == nil
    return $game_self_variables[key]
  end
  alias VL get_local_variable
  alias LV get_local_variable
 
  def set_local_variable(id_var, value, id_event = @event_id, id_map = @map_id)
    key = [id_map, id_event, id_var]
    $game_self_variables[key] = value
  end
  alias set_VL set_local_variable
  alias set_LV set_local_variable
end

Voici les modifications à effectuer dans les autres scripts pour assurer la sauvegarde des variables locales :
Spoiler
Script Scene_Title (celui de RMXP dans la première fournée de script)

Après la ligne 123 :
def command_new_game
   
# 決定 SE を演奏
    $game_system.se_play($data_system.decision_se)
    # BGM を停止
    Audio.bgm_stop
    # プレイ時間計測用のフレームカウントをリセット
    Graphics.frame_count = 0
    # 各種ゲームオブジェクトを作成
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables    = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new

Ajoutez :
    $game_self_variables = Game_SelfVariables.new


Script : Scene_Title (celui de PSP en dessous de Systeme General)

Après la ligne 477
def read_save_data(file)
    characters = Marshal.load(file)
    Graphics.frame_count = Marshal.load(file)
    $game_system        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables    = Marshal.load(file)
    $game_self_switches = Marshal.load(file)

Ajouter :
    $game_self_variables = Marshal.load(file)

Après la ligne 458
def read_preview(filename)
    file = File.open(filename, "r")
    time_stamp      = file.mtime
    characters      = Marshal.load(file)
    frame_count    = Marshal.load(file)
    game_system    = Marshal.load(file)
    game_switches  = Marshal.load(file)
    game_variables  = Marshal.load(file)
    total_sec = frame_count / Graphics.frame_rate
   
    # Non utilisé
    game_self_switches = Marshal.load(file)

Ajouter :
    game_self_variables = Marshal.load(file)

Après la ligne 232
def read_preview(filename)
      file = File.open(filename, "r")
      time_stamp      = file.mtime
      characters      = Marshal.load(file)
      frame_count    = Marshal.load(file)
      game_system    = Marshal.load(file)
      game_switches  = Marshal.load(file)
      game_variables  = Marshal.load(file)
      total_sec = frame_count / Graphics.frame_rate
     
      # Non utilisé
      game_self_switches = Marshal.load(file)

Ajouter :
      game_self_variables = Marshal.load(file)



Script : Pokemon_Save (en dessous de Systeme General)

Après la ligne 276
def write_save_data(file)
      characters = []
      for i in 0...$game_party.actors.size
        actor = $game_party.actors[i]
        characters.push([actor.character_name, actor.character_hue])
      end
     
      Marshal.dump(characters, file)
     
      Marshal.dump(Graphics.frame_count, file)
     
      $game_system.save_count += 1
      $game_system.magic_number = $data_system.magic_number
     
      Marshal.dump($game_system, file)
      Marshal.dump($game_switches, file)
      Marshal.dump($game_variables, file)
      Marshal.dump($game_self_switches, file)

Ajouter :
      Marshal.dump($game_self_variables, file)

Utilisation
Tout se passe dans la commande insérer script

Modifier une variable local
set_VL(id, valeur)
id peut être n'importe quoi (un nombre, une lettre, une chaine de caractère) pour ma part j'aime utiliser des Symbol (voir les exemple ci après)
valeur peut aussi être n'importe quoi c'est ce que vous voulez stocker.

Récupérer le contenu d'une variable
VL(id)
id est le nom de votre variable
Utile pour tester la variable dans une condition. Par exemple :
VL(:compteur) == 4 # test si le compteur est égale à 4

Remarque : si vous essayez de récupérer une variable qui n'a pas été définie avant, elle vaudra 0 par défaut.

Exemples
set_VL(:compteur, 0) # Initialise un compteur
set_VL(:compteur, VL(:compteur) + 1) # Ajoute 1 au compteur
set-VL(:info_donnee, rand(6)) # Une variable aléatoire entre 0 et 5
#idéale pour les pnj faisant donnant des infos aléatoires

Voyez plutôt cette vidéo avec l'exemple de deux évènements : l'un s'énerve quand on lui parle à répétition, l'autre vous donne des informations aléatoirement.
https://youtu.be/UO-Pr9o1I2s

Crédits
Leikt
« Modifié: 30 juin 2017, 23:19:36 par Nuri Yuri »
"Je n'échoue jamais, soit je gagne, soit j'apprend"
- Nelson Mandela -
 
Utilisateurs ayant remercié ce post : Yumekua, Vulvoch, Bentoxx, romnair, Alizia

Variables Locales
« Réponse #1 le: 24 mai 2017, 20:52:10 »
Script assez intéressant, ça pourra en aider plus d'un à faire des PNJ plus développés :3
ln(yo) = <3
 
Utilisateurs ayant remercié ce post : Leikt

*

Hors ligne Bentoxx

Variables Locales
« Réponse #2 le: 24 mai 2017, 21:10:59 »
Sachant que les events ont un nombre d'interrupteur local limité ça peut être vachement intéressant, une discussion ou une action différente selon l'avancer du jeu, sans vraiment de limité !
 
Utilisateurs ayant remercié ce post : Leikt

*

Hors ligne Leikt

Variables Locales
« Réponse #3 le: 25 mai 2017, 00:37:48 »
Techniquement, les variables locales peuvent être utilisées comme de interrupteurs locaux (à la différence qu'elles ne sont pas testée par le système pour définir les pages)
« Modifié: 25 mai 2017, 09:20:11 par Leikt »
"Je n'échoue jamais, soit je gagne, soit j'apprend"
- Nelson Mandela -
 
Utilisateurs ayant remercié ce post : Bentoxx

Variables Locales
« Réponse #4 le: 07 juin 2017, 21:21:49 »
Merci pour ce script, je pense que je vais l'utiliser  :)