Utile pour Event Making > Variables locales

La création de jeux indépendants/amateurs (tuto, entraide, questions...) sous les moteurs de la série RPG Maker.
nuki
Koruldia Warrior
Messages : 238
Localisation : Bruxelles
Contact :

Utile pour Event Making > Variables locales

Message non lu par nuki » jeu. août 18, 2011 10:36 pm

Voila une mise à jours de mon script de gestion des variables locales.
Plus élégant et surtout, ne permet plus QUE la création de variables temporaires. Les variables au sein d'événements peuvent communiquer entre elle.
Mais aussi entre les map. Même si on se trouve sur la map 9, il est possible de modifier/accéder à la variables 3 de la map 7.
Les variables sont identifiées par des numéro et utilisables au moyen des commandes Appel de Script dans les évenements.


Lien original du script ICI

Code

Code : Tout sélectionner

#Ajout de la gestion des variables locales aux evenement
#Auteur: Nuki
#Liste des méthodes utilisables
#=============================================================

# get(map_id, evt_id, id) -> retourne la variable n°id de l'evenement n°evt_id de la map n°map_id
# => Alias : get_by_map(map_id, evt_id, id)

# get(evt_id, id) -> retourne la variable n°id de l'evenement n°evt_id de la map courante
# => Alias : get_by_event(evt_id, id)

# get(id) -> retourne la variable n°id de l'evenement courant
# => Alias : get_by_id(id)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# set(map_id, evt_id, id, valeur) -> attribue valeur à la variable n°id de l'evenement n°evt_id de la map n°map_id
# => Alias : set_by_map(map_id, evt_id, id, valeur)

# set(evt_id, id, valeur) -> attribue valeur à la variable n°id de l'evenement n°evt_id de la map courante
# => Alias : set_by_event(evt_id, id, valeur)

# set(id, valeur) -> attribue valeur à la variable n°id de l'evenement courant
# => Alias : set_by_id(id, valeur)

#=============================================================

class Self_Var
  attr_accessor :map_id
  attr_accessor :event_id
  attr_accessor :id
  attr_accessor :value
  def initialize(map_id, event_id, id, value)
    @map_id = map_id
    @event_id = event_id
    @id = id
    @value = value
  end
end

class Scene_Title
  alias var_main main
  def main
    var_main
    $game_self_var = Array.new
  end
end

class Game_Interpreter
  # Récupère une variable en fonction de toute ces données
  def get_by_map(map_id, event_id, id)
    local = $game_self_var.find{
      |variable|
        variable.map_id == map_id && variable.event_id == event_id && variable.id == id
    }
    return local.value if local.instance_of?(Self_Var)
    return 0 if local == nil
  end
  # Récupère une variable en fonction de son ID d'event et de son idée sur la map courante
  def get_by_event(event_id, id)
    return get_by_map(@map_id, event_id, id)
  end
  # Récupère la variable de l'evenement courant en fonction d'une ID
  def get_by_id(id)
    return get_by_map(@map_id, @event_id, id)
  end
  # Attribue une variable en fonction de toutes les données
  def set_by_map(map_id, event_id, id, value)
    index = $game_self_var.index(
      $game_self_var.find{
        |variable|
          variable.map_id == map_id && variable.event_id == event_id && variable.id == id
      })
      if index == nil
        $game_self_var << Self_Var.new(map_id, event_id, id, value)
      else
        $game_self_var[index].value = value
      end
  end
  # Attribue une variable en fonction de l'evenement ID et de l'ID de la variable
  def set_by_event(event_id, id, value)
    set_by_map(@map_id, event_id, id, value)
  end
   # Attribue une variable en fonction de l'ID de la variable dans l'evenement courant
  def set_by_id(id, value)
    set_by_map(@map_id, @event_id, id, value)
  end
  #Utilisation GET générique
  def get(*args)
    if args.length == 3
      return get_by_map(args[0], args[1], args[2])
    elsif args.length == 2
      return get_by_event(args[0], args[1])
    elsif args.length == 1
      return get_by_id(args[0])
    else
      return 0
    end
  end
  #Utilisation SET générique
  def set(*args)
    if args.length == 4
      set_by_map(args[0], args[1], args[2], args[3])
      return true
    elsif args.length == 3
      set_by_event(args[0], args[1], args[2])
      return true
    elsif args.length == 2
      set_by_id(args[0], args[1])
      return true
    else
      return false
    end
  end
end

class Scene_File
  alias var_write_save_data write_save_data
  alias var_read_save_data read_save_data
  def write_save_data(file)
    var_write_save_data(file)
    Marshal.dump($game_self_var,file)
  end
  def read_save_data(file)
    var_read_save_data(file)
    $game_self_var = Marshal.load(file)
  end
 
end
 
Image

King Xtincell
Koruldia Master
Messages : 1192
Localisation : Au centre d'un univers inconstant
Contact :

Message non lu par King Xtincell » jeu. août 18, 2011 11:57 pm

Y a pas a dire, question programmatioon, t'assure. Perso, je peux pas percevoir son utilité maintenant mais je m'y pencherai plus serieusement dans les mois a venir.
Image

nuki
Koruldia Warrior
Messages : 238
Localisation : Bruxelles
Contact :

Message non lu par nuki » ven. août 19, 2011 8:02 am

Merci, même si ce script était relativement facile à écrire.
Il est très utile pour ceux qui veulent créer leurs systèmes en évenements car il permet de localiser les variables aux évenements et donc les évenements sont duplicables à coup de copier/coller.
Image

Avatar de l’utilisateur
KaYsEr
KoruTeam
KoruTeam
Messages : 5151
Localisation : Londres
Contact :

Message non lu par KaYsEr » ven. août 19, 2011 2:38 pm

Hey mais ça claque ça... C'est vrai que VX avait pas conservé ce bon vieux truc.
Jte dirai si j'utilise car c'est largement probable, à la base quand on a pas ça je sais pas si les "common events" peuvent faire l'affaire en toutes situations.
Image

nuki
Koruldia Warrior
Messages : 238
Localisation : Bruxelles
Contact :

Message non lu par nuki » ven. août 19, 2011 3:22 pm

En plus il est possible de les faire communiquer entre elle, et entre évenement et même accéder aux variables des évenements d'une autre map que la map courante :D
Image

King Xtincell
Koruldia Master
Messages : 1192
Localisation : Au centre d'un univers inconstant
Contact :

Message non lu par King Xtincell » ven. août 19, 2011 5:06 pm

Plus j'y pense, plus je me dis que ca trouvera son utilité dans mon projet en cours de devellopement. (je commence bcp de chose en ce moment mais bon)
Image

nuki
Koruldia Warrior
Messages : 238
Localisation : Bruxelles
Contact :

Message non lu par nuki » lun. août 22, 2011 10:40 pm

Mise à jours finale qui ajoute des opérandes !

Listes des commandes

Il est aussi possible d'attribuer une opérande (valeur aléaoire, coordonnées, expériences etc).
Voici la liste des coordonnées

* commande(:rand, 9, 18) => Retourne un nombre aléatoire entre 9 et 18
* commande(:id_map) => Retourne ID de la map
* commande(:team_size) => Retourne la taille de la team
* commande(:gold) => Retourne l'argent
* commande(:steps) => Retourne le nombre de pas
* commande(:play_time) => Retourne la durée de jeu
* commande(:timer) => Retourne la valeur du chronometre
* commande(:save_count) => le nombre de sauvegarde
* commande(:event_x, id) => le X (coordonnées) de levent ID
* commande(:event_y, id) => le y (coordonnées) de levent ID
* commande(:event_screen_y, id) => le y (écran) de levent ID
* commande(:event_screen_x, id) => le x (écran) de levent ID
* commande(:event_direction, id) => la direction de levent ID
* commande(:heroes_x, id) => le X (coordonnées) du héros
* commande(:heroes_y, id) => le Y (coordonnées) du héros
* commande(:heroes_screen_y, id) => le Y (ecran) du héros
* commande(:heroes_screen_x, id) => le X (ecran) du héros
* commande(:heroes_direction, id) => la direction du héros
* commande(:level, id) => niveau du personnage en fonction de l ID
* commande(:exp, id) => expérience du personnage en fonction de l ID
* commande(:hp, id) => hp du personnage en fonction de l ID
* commande(:mp, id) => mp du personnage en fonction de l ID
* commande(:max_hp, id) => HP Max du personnage en fonction de l ID
* commande(:max_mp, id) => MP Max du personnage en fonction de l ID
* commande(:atk, id) => Puissance attaque du personnage en fonction de l ID
* commande(:def, id) => Défence du personnage en fonction de l ID
* commande(:spi, id) => Spiritualité du personnage en fonction de l ID
* commande(:agi, id) => Agilité du personnage en fonction de l ID
* commande(:nb_item, id) => nombre d'objet possédés en fonction de l ID
* commande(:var, id) => attribue une variable en fonction de son ID a une variable locale

Exemple avec la commande rand => set(1, commande(:rand, 9, 19))

Code : Tout sélectionner

#Ajout de la gestion des variables locales aux evenement
#Auteur: Nuki
#Liste des méthodes utilisables
#=============================================================

# get(map_id, evt_id, id) -> retourne la variable n°id de l'evenement n°evt_id de la map n°map_id
# => Alias : get_by_map(map_id, evt_id, id)

# get(evt_id, id) -> retourne la variable n°id de l'evenement n°evt_id de la map courante
# => Alias : get_by_event(evt_id, id)

# get(id) -> retourne la variable n°id de l'evenement courant
# => Alias : get_by_id(id)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# set(map_id, evt_id, id, valeur) -> attribue valeur à la variable n°id de l'evenement n°evt_id de la map n°map_id
# => Alias : set_by_map(map_id, evt_id, id, valeur)

# set(evt_id, id, valeur) -> attribue valeur à la variable n°id de l'evenement n°evt_id de la map courante
# => Alias : set_by_event(evt_id, id, valeur)

# set(id, valeur) -> attribue valeur à la variable n°id de l'evenement courant
# => Alias : set_by_id(id, valeur)

#=============================================================
# commande("commande_name", args) => Retourne une opérande des variables
# OU commande(:commande, args)
#=============================================================

module SelfVar
  class << self
    def set(id_map, event_id, id, value)
      index = $game_self_var.index(
      $game_self_var.find{
        |variable|
          variable.map_id == map_id && variable.event_id == event_id && variable.id == id
      })
      if index == nil
        $game_self_var << Self_Var.new(map_id, event_id, id, value)
      else
        $game_self_var[index].value = value
      end
    end
    def get(map_id, event_id, id)
    local = $game_self_var.find{
      |variable|
        variable.map_id == map_id && variable.event_id == event_id && variable.id == id
    }
    return local.value if local.instance_of?(Self_Var)
    return 0 if local == nil
  end
  end
end

class Self_Var
  attr_accessor :map_id
  attr_accessor :event_id
  attr_accessor :id
  attr_accessor :value
  def initialize(map_id, event_id, id, value)
    @map_id = map_id
    @event_id = event_id
    @id = id
    @value = value
  end
end

class Scene_Title
  alias var_main main
  def main
    var_main
    $game_self_var = Array.new
  end
end

class Game_Interpreter
  # Récupère une variable en fonction de toute ces données
  def get_by_map(map_id, event_id, id)
    local = $game_self_var.find{
      |variable|
        variable.map_id == map_id && variable.event_id == event_id && variable.id == id
    }
    return local.value if local.instance_of?(Self_Var)
    return 0 if local == nil
  end
  # Récupère une variable en fonction de son ID d'event et de son idée sur la map courante
  def get_by_event(event_id, id)
    return get_by_map(@map_id, event_id, id)
  end
  # Récupère la variable de l'evenement courant en fonction d'une ID
  def get_by_id(id)
    return get_by_map(@map_id, @event_id, id)
  end
  # Attribue une variable en fonction de toutes les données
  def set_by_map(map_id, event_id, id, value)
    index = $game_self_var.index(
      $game_self_var.find{
        |variable|
          variable.map_id == map_id && variable.event_id == event_id && variable.id == id
      })
      if index == nil
        $game_self_var << Self_Var.new(map_id, event_id, id, value)
      else
        $game_self_var[index].value = value
      end
  end
  # Attribue une variable en fonction de l'evenement ID et de l'ID de la variable
  def set_by_event(event_id, id, value)
    set_by_map(@map_id, event_id, id, value)
  end
   # Attribue une variable en fonction de l'ID de la variable dans l'evenement courant
  def set_by_id(id, value)
    set_by_map(@map_id, @event_id, id, value)
  end
  #gestion des commandes
  def commande(commande, *args)
    case args.length
      when 0
        return Commandes::send(commande)
      when 1
        return Commandes::send(commande, args[0])
      when 2
        return Commandes::send(commande, args[0], args[1])
    end
  end
  #Utilisation GET générique
  def get(*args)
    if args.length == 3
      return get_by_map(args[0], args[1], args[2])
    elsif args.length == 2
      return get_by_event(args[0], args[1])
    elsif args.length == 1
      return get_by_id(args[0])
    else
      return 0
    end
  end
  #Utilisation SET générique
  def set(*args)
    if args.length == 4
      set_by_map(args[0], args[1], args[2], args[3])
      return true
    elsif args.length == 3
      set_by_event(args[0], args[1], args[2])
      return true
    elsif args.length == 2
      set_by_id(args[0], args[1])
      return true
    else
      return false
    end
  end
end

module Commandes
  class << self
    # Random
    def rand(*args)
      return args[0] + Kernel.rand(args[1] - args[0])
    end
    # id Map
    def id_map(*args)
      return $game_map.map_id
    end
    #Taille de l'équipe
    def team_size(*args)
      return $game_party.members.size
    end
    # Argent de l'équipe
    def gold(*args)
      return $game_party.gold
    end
    # Nombre de pas
    def steps(*args)
      return $game_party.steps
    end
    # temps de jeu
    def play_time(*args)
      return Graphics.frame_count / Graphics.frame_rate
    end
    # Chronometre
    def timer(*args)
      return $game_system.timer / Graphics.frame_rate
    end
    # nombre de sauvegarde
    def save_count(*args)
      return $game_system.save_count
    end
    # coord_x evenement
    def event_x(*args)
      return $game_map.events[args[0]].x if args[0] != -1
      return $game_player.x
    end
    # coord_y evenement
    def event_y(*args)
      return $game_map.events[args[0]].y if args[0] != -1
      return $game_player.y
    end
    # coord screen y
    def event_screen_y(*args)
      return $game_map.events[args[0]].screen_y if args[0] != -1
      return $game_player.screen_y
    end
    # coord screen x
    def event_screen_x(*args)
      return $game_map.events[args[0]].screen_x if args[0] != -1
      return $game_player.screen_x
    end
     # coord screen x
    def event_direction(*args)
      return $game_map.events[args[0]].direction if args[0] != -1
      return $game_player.direction
    end
    # coord heros
    def heroes_x(*args)
      return Commandes::event_x(-1)
    end
    def heroes_y(*args)
      return Commandes::event_y(-1)
    end
    def heroes_screen_x(*args)
      return Commandes::event_screen_x(-1)
    end
    def heroes_screen_y(*args)
      return Commandes::event_screen_y(-1)
    end
    def heroes_direction(*args)
      return Commandes::event_direction(-1)
    end
    # Level of an actor
    def level(*args)
      return $game_actors[args[0]].level
    end
    # exp of an actor
    def exp(*args)
      return $game_actors[args[0]].exp
    end
    #hp of an actor
    def hp(*args)
      return $game_actors[args[0]].hp
    end
    # mp of an actor
    def mp(*args)
      return $game_actors[args[0]].mp
    end
    #max hp of an actor
    def max_hp(*args)
      return $game_actors[args[0]].maxhp
    end
    # max mp of an actor
    def max_mp(*args)
      return $game_actors[args[0]].maxmp
    end
    # attaque of an actor
    def atk(*args)
      return $game_actors[args[0]].atk
    end
    # defense of an actor
    def def(*args)
      return $game_actors[args[0]].def
    end
    # attaque of an actor
    def spi(*args)
      return $game_actors[args[0]].spi
    end
    # attaque of an actor
    def agi(*args)
      return $game_actors[args[0]].agi
    end
    # item
    def nb_item(*args)
      return $game_party.item_number($data_items[args[0]])
    end
    # Get a true var value
    def var(*args)
      return  $game_variables[args[0]]  
    end
  end
end

class Scene_File
  alias var_write_save_data write_save_data
  alias var_read_save_data read_save_data
  def write_save_data(file)
    var_write_save_data(file)
    Marshal.dump($game_self_var,file)
  end
  def read_save_data(file)
    var_read_save_data(file)
    $game_self_var = Marshal.load(file)
  end
 
end
 
Image

Avatar de l’utilisateur
KaYsEr
KoruTeam
KoruTeam
Messages : 5151
Localisation : Londres
Contact :

Message non lu par KaYsEr » lun. août 22, 2011 11:17 pm

'tain, un truc me dit que ça peut rendre le coding par event d'autant plus zultime. :dent:
(choper un nombre aléatoire directement comme ça, il me semble que c'était pas possible, moi du moins j'utilisais un subterfuge alakon)
Image