AccueilAccueil  PortailPortail  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  ConnexionConnexion  



Le deal à ne pas rater :
Bon plan achat en duo : 2ème robot cuiseur Moulinex Companion ...
600 €
Voir le deal

Partagez
 

 [VXAce] Typed Entities

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
S4suk3
Citadin Lv.7
Citadin Lv.7
S4suk3


Masculin Inscrit le : 07/09/2011
Messages : 186

[VXAce] Typed Entities Empty
MessageSujet: [VXAce] Typed Entities   [VXAce] Typed Entities Icon_minitimeSam 26 Jan 2013 - 16:16

Ce script ajoute un accès facile aux notes de la base de données.
Un micro-langage par balisage avec des conversion dans un type adéquat.
Il est pratique pour créer des systèmes qui font évoluer la base de données.

Accès à la version qui sera mise à jours :
https://github.com/Funkywork/Scripts-rm/blob/master/VXAce/Typed-Entity.rb

Il y a des explications dans l'entête du script.
Si vous avez des questions vous pouvez les poser ici ou m'envoyer un mail à l'adresse : darksasuke.uchiwa@gmail.com (plus probable que je réponde).

Code:
=begin
  =============== Typed Entities ===============
  Auteur : S4suk3
  Version : 1
  ==============================================
  Ce script ajoute un accès rapide aux notes dans
  la base de données et permet une conversion en
  commandes avec un système de typage (par contraintes)
  ==============================================
  Accèdes à une note : notes(container, id)
  container peut prendre les valeurs :
  - actors
  - skills
  - classes
  - items
  - armors
  - weapons
  - enemies
  - states
  - tilesets
  Et l'id correspond à l'id (se réferer à la base de données)
  de l'objet dont il faut récupérer la note.
  ==============================================
  Il est possible de convertir une chaine de texte en
  liste de commande. Les commandes ont deux formes.
  Simple => <nom>valeur</nom>
  Complexe => <nom attributA="valeur", attributB="valeur" />
  Dans la commande complexe, il est possible de spécifier autant
  d'attributs que vous le désirez.
  Pour convertir une chaine de texte en liste de commande, il suffit
  de faire votre_chaine.to_cmd_list
  qui retournera un Hash de commande.
  Et pour accéder à la valeur d'une commande il suffit d'utiliser
  la clé référante à son nom. Par exemple, si mon commentaire potion
  est formé comme ceci :
  <special_price>99.10</special_price>
  <other cout_mp="10" cout_hp="20" cout_autre="30"/>
  Il suffirait de faire ceci pour accéder à ces attributs:
  commande = notes(items, 1).to_cmd_list
  commande["special_price"].value donnera une chaine de texte 99.10
  commande["other"]["cout_hp"].value donnera une chaine de texte 20
  Il est donc possible d'ajouter des contraintes de types aux valeurs.
  Les types possibles sont :int (entier), :float (nombre a virgule)
  :bool (un booléan, true ou false), :string (une chaine de texte)
  :string_list (une liste de chaine, "aha, ohoho, hihih" donnera ["aha", "ohoho", "hihih"]
  soit elle utilise la virgule comme séparateur), :int_list (utilise aussi
  la virgule comme séparateur), :float_list (utilise aussi la virgule comme séparateur),
  bool_list (utilise aussi la virgule comme séprateur)
  ==============================================================
  donc par exemple, une commande comme ceci :
  <truc>1,2,3,4</truc>
  si je l'appelle (.value), j'aurais une chaine "1,2,3,4".
  Avec les contraintes de types. Reprennons notre exemple potion à qui nous ajoutons
  une commande:
  <special_price>99.10</special_price>
  <other cout_mp="10" cout_hp="20" cout_autre="30"/>
  <truc>1,2,3,4</truc>
  Si je fais :
  commande = notes(items, 1).to_cmd_list
  commande["special_price"].coercion(:float)
  commande["truc"].coercion(:int_list)
  commande["other"]["cout_hp"].coercion(:int)
  Les appels de ces valeurs seront typés (en float, liste d'entier et entier).
=end 

#==============================================================================
# ** Entity
#------------------------------------------------------------------------------
# Entity Name-space
#==============================================================================

module Entity
  #--------------------------------------------------------------------------
  # * Type System
  #--------------------------------------------------------------------------
  Types = [
    :int,
    :integer,
    :float,
    :bool,
    :boolean,
    :string,
    :text,
    :int_list,
    :float_list,
    :bool_list,
    :string_list
  ]
  #--------------------------------------------------------------------------
  # * Static context
  #--------------------------------------------------------------------------
  class << self
    #--------------------------------------------------------------------------
    # * Type Conversion
    #--------------------------------------------------------------------------
    def cast(value, type)
      type = :string unless Types.include?(type)
      return value.to_i if [:int, :integer].include?(type)
      return value.to_f if type == :float
      return value.to_bool if [:bool, :boolean].include?(type)
      return value.to_string_list if type == :string_list
      return value.to_int_list if type == :int_list
      return value.to_float_list if type == :float_list
      return value.to_bool_list if type == :bool_list
      value.to_s
    end
    #--------------------------------------------------------------------------
    # * Convert line
    #--------------------------------------------------------------------------
    def convert_line(line)
      if line =~ /^<(\w+)>(.*)<\/\w+>/
        return Simple.new($1, $2)
      else
        content_balise = line =~ /^<(.*)\/>$/ && $1
        return nil unless content_balise
        name, rest = content_balise =~ /^(\w*)/ && [$1, $']
        attributes = build_attributes(rest)
        return Complex.new(name, attributes)
      end
      return nil
    end
    #--------------------------------------------------------------------------
    # * Build Attributes
    #--------------------------------------------------------------------------
    def build_attributes(str, acc = {})
      return acc.select{|k, a|a&&a.keyword&&a.value} if !str || str.empty?
      name, value, rest = str =~ /^\s*(\w+)\s*=\s*\\*"([^\\"]+)\\*"/ && [$1,$2,$']
      acc[name] = Simple.new(name, value)
      build_attributes(rest, acc)
    end
  end
 
  #==============================================================================
  # ** Simple
  #------------------------------------------------------------------------------
  # Representation of a Simple entity
  # model = <keyword>Value</keyword>
  #==============================================================================
 
  class Simple
    #--------------------------------------------------------------------------
    # * Public instances variables
    #--------------------------------------------------------------------------
    attr_reader :keyword
    attr_reader :value
    #--------------------------------------------------------------------------
    # * Object construction
    #--------------------------------------------------------------------------
    def initialize(keyword, value)
      @keyword = keyword
      @value = value
      @raw = value
    end
    #--------------------------------------------------------------------------
    # * Type coercion
    #--------------------------------------------------------------------------
    def coercion(type)
      return self unless Entity::Types.include?(type)
      @value = Entity::cast(@raw, type)
      self
    end
  end
 
  #==============================================================================
  # ** Complex
  #------------------------------------------------------------------------------
  # Representation of a Complex entity
  # model = <keyword attributesA="valueA" attributesB="valueB"/>
  #==============================================================================
 
  class Complex
    #--------------------------------------------------------------------------
    # * Public instances variables
    #--------------------------------------------------------------------------
    attr_reader :keyword
    attr_reader :attributes
    #--------------------------------------------------------------------------
    # * Object construction
    #--------------------------------------------------------------------------
    def initialize(keyword, attributes)
      @keyword = keyword
      @attributes = attributes
    end
    #--------------------------------------------------------------------------
    # * Accessor
    #--------------------------------------------------------------------------
    def [](key)
      @attributes[key]
    end
  end
 
end

#==============================================================================
# ** String
#------------------------------------------------------------------------------
#  String definition
#==============================================================================

class String
  #--------------------------------------------------------------------------
  # * Cast definition
  #--------------------------------------------------------------------------
  def to_string_list; self.scan(/[^,|^\s]+/) ;end
  def to_int_list; self.scan(/[^,|\s]+/).collect{|i|i.to_i} ;end
  def to_float_list; self.scan(/[^,|\s]+/).collect{|i|i.to_f} ;end
  def to_bool_list; self.scan(/[^,|^\s]+/).collect{|i|!!eval(i)} ;end
  #--------------------------------------------------------------------------
  # * Convert to command_liste
  #--------------------------------------------------------------------------
  def to_cmd_list
    command_list = {}
    self.split("\n").each do |line|
      parser = Entity.convert_line(line)
      command_list[parser.keyword] = parser if parser
    end
    command_list
  end
end

#==============================================================================
# ** Kernel
#------------------------------------------------------------------------------
#  Add Notes accessor
#==============================================================================

module Kernel
  #--------------------------------------------------------------------------
  # * Get Note form a static data
  #--------------------------------------------------------------------------
  def notes(data, id)
    datas = {
      :actors => $data_actors,
      :classes => $data_classes,
      :skills => $data_skills,
      :items => $data_items,
      :armors => $data_armors,
      :weapons => $data_weapons,
      :enemies => $data_enemies,
      :states => $data_states,
      :tilesets => $data_tilesets
    }
    return unless datas.has_key?(data)
    return datas[data][id].note
  end
end
Revenir en haut Aller en bas
http://fa.gri.im/~mspawn/
Viper-Rko
Modérateur
Modérateur
Viper-Rko


Masculin Age : 28
Inscrit le : 20/09/2010
Messages : 4421

[VXAce] Typed Entities Empty
MessageSujet: Re: [VXAce] Typed Entities   [VXAce] Typed Entities Icon_minitimeSam 26 Jan 2013 - 16:31

Merci du partage S4suk3. Smile

Je déplace et je te met 5 points en Scripts. x)
Revenir en haut Aller en bas
Zangther
Maître des Duels
Maître des Duels
Zangther


Masculin Age : 31
Inscrit le : 29/07/2009
Messages : 7840

[VXAce] Typed Entities Empty
MessageSujet: Re: [VXAce] Typed Entities   [VXAce] Typed Entities Icon_minitimeLun 28 Jan 2013 - 13:41

Une feature plutôt cool.
Merci à toi Very Happy
Revenir en haut Aller en bas
S4suk3
Citadin Lv.7
Citadin Lv.7
S4suk3


Masculin Inscrit le : 07/09/2011
Messages : 186

[VXAce] Typed Entities Empty
MessageSujet: Re: [VXAce] Typed Entities   [VXAce] Typed Entities Icon_minitimeLun 28 Jan 2013 - 23:38

Citation :
Une feature plutôt cool.
Je sais.
Revenir en haut Aller en bas
http://fa.gri.im/~mspawn/
Zangther
Maître des Duels
Maître des Duels
Zangther


Masculin Age : 31
Inscrit le : 29/07/2009
Messages : 7840

[VXAce] Typed Entities Empty
MessageSujet: Re: [VXAce] Typed Entities   [VXAce] Typed Entities Icon_minitimeMar 29 Jan 2013 - 11:12

Comment tu as fait pour savoir ? T'es bon quand même Very Happy
Revenir en haut Aller en bas
Contenu sponsorisé




[VXAce] Typed Entities Empty
MessageSujet: Re: [VXAce] Typed Entities   [VXAce] Typed Entities Icon_minitime

Revenir en haut Aller en bas
 

[VXAce] Typed Entities

Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

 Sujets similaires

-
» [VXAce] Conversion du script Credits Vx=>VxAce
» [VXace] SBS
» [VXace] Consolidator
» [VXACE] Perspective
» [VXace] Hud simple

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RPG Maker VX :: Entraide :: Scripts :: Scripts VX.Ace - RGSS3 :: Divers-
Créer un forum | ©phpBB | Forum gratuit d'entraide | Signaler un abus | Forum gratuit