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



-17%
Le deal à ne pas rater :
SSD interne Crucial SSD P3 1To NVME à 49,99€
49.99 € 59.99 €
Voir le deal

Partagez
 

 [VXace] Extend Database

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
okinaterbo
Poulet carnivore Lv.2
Poulet carnivore Lv.2
okinaterbo


Inscrit le : 10/03/2013
Messages : 13

[VXace] Extend Database Empty
MessageSujet: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeLun 18 Mar 2013 - 20:58

Bon, personnellement, je trouve que la base de données de RPGMaker est un peu ennuyante car on ne peut pas l'étendre. Donc je suis obligé de rester dans le bien contraignant système de base, et pour avoir des choses plus cools (et plus spécifiques) je suis obligé d'abuser du champ commentaire/note de la base de données (et pourquoi pas compléter avec le script Typed Entities, qui n'est pas adapté à ce genre de choses... JE TROUVE !)
Donc j'ai plagié Avygeil qui avait déjà été plagié par Grim en recodant une base de données de RM.

Le code :

Code:
# Extend Database ~ Der Botaniker (Nuki)
# http://www.biloucorp.com

# Idea : Avygeil, Grim
# Thanks to Hiino, Zangther (sexual motivation)
# And special thanks to larabdubled


#==============================================================================
# ** Object
#------------------------------------------------------------------------------
#  Generic behaviour
#==============================================================================

class Object
  #--------------------------------------------------------------------------
  # * Bool casting
  #--------------------------------------------------------------------------
  if defined?(Command)
    remove_const(:Database)
    def to_bool; (self != nil || self != false) end
  end
  #--------------------------------------------------------------------------
  # * Polymorphic casting
  #--------------------------------------------------------------------------
  def nothing; self; end
end

#==============================================================================
# ** Database
#------------------------------------------------------------------------------
# Representation of an Abstract Database
#==============================================================================

module Database
 
  #==============================================================================
  # ** Types
  #------------------------------------------------------------------------------
  # Implements the Type System
  #==============================================================================
 
  module Type
    #--------------------------------------------------------------------------
    # * Type Enum
    #--------------------------------------------------------------------------
    Types = {
      string:      [:to_s, ""],
      integer:      [:to_i, 0],
      float:        [:to_f, 0.0],
      boolean:      [:to_bool, true],
      polymorphic:  [:nothing, ""]
    }
    #--------------------------------------------------------------------------
    # * String representation
    #--------------------------------------------------------------------------
    def string(field_name)
      handle_field(:string, field_name.to_sym)
    end
    alias :text :string
    #--------------------------------------------------------------------------
    # * Integer representation
    #--------------------------------------------------------------------------
    def integer(field_name)
      handle_field(:integer, field_name.to_sym)
    end
    alias :int :integer
    #--------------------------------------------------------------------------
    # * String representation
    #--------------------------------------------------------------------------
    def float(field_name)
      handle_field(:float, field_name.to_sym)
    end
    #--------------------------------------------------------------------------
    # * String representation
    #--------------------------------------------------------------------------
    def boolean(field_name)
      handle_field(:boolean, field_name.to_sym)
    end
    alias :bool :boolean
    #--------------------------------------------------------------------------
    # * String representation
    #--------------------------------------------------------------------------
    def polymorphic(field_name)
      handle_field(:polymorphic, field_name.to_sym)
    end
    alias :free :polymorphic
  end
 
  #==============================================================================
  # ** Table
  #------------------------------------------------------------------------------
  # Representation of an Abstract Table
  #============================================================================== 
 
  class Table
    #--------------------------------------------------------------------------
    # * Appends Type handler
    #--------------------------------------------------------------------------
    extend Type
    Types = Type::Types
    #--------------------------------------------------------------------------
    # * Singleton of Table
    #--------------------------------------------------------------------------
    class << self
      #--------------------------------------------------------------------------
      # * Public instance variables
      #--------------------------------------------------------------------------
      attr_accessor :fields
      #--------------------------------------------------------------------------
      # * Field handling
      #--------------------------------------------------------------------------
      def handle_field(type, name)
        @fields ||= Hash.new
        @fields[name] = type
        instance_variable_set("@#{name}".to_sym, Types[type][1])
        send(:attr_accessor, name)
      end
      #--------------------------------------------------------------------------
      # * Inline Insertion
      #--------------------------------------------------------------------------
      def insert(*args)
        keys = @fields.keys
        hash = Hash[keys.zip(args)]
        self.new(hash)
      end
    end
    #--------------------------------------------------------------------------
    # * Object initialization
    #--------------------------------------------------------------------------
    def initialize(hash)
      hash.each do |key, value|
        type = self.class.fields[key]
        insertion = Types[type][1]
        insertion = value.send(Types[type][0]) if value.respond_to?(Types[type][0])
        instance_variable_set("@#{key}".to_sym, insertion)
      end
      Database.tables[self.class.to_s.to_sym] ||= Array.new
      Database.tables[self.class.to_s.to_sym] << self
    end
  end
  #--------------------------------------------------------------------------
  # * Singleton of Database
  #--------------------------------------------------------------------------
  class << self
    #--------------------------------------------------------------------------
    # * Public instance variables
    #--------------------------------------------------------------------------
    attr_accessor :tables
    #--------------------------------------------------------------------------
    # * API for tables
    #--------------------------------------------------------------------------
    Database.tables = Hash.new
    #--------------------------------------------------------------------------
    # * Method Missing
    #--------------------------------------------------------------------------
    def method_missing(method, *args)
      tables[method] || (raise(NoMethodError))
    end
  end
end

#==============================================================================
# ** Junction with the Event Extender 4
#==============================================================================
if defined?(Command)
  #==============================================================================
  # ** T
  #------------------------------------------------------------------------------
  #  Database handling API
  #==============================================================================
 
  module T
    #--------------------------------------------------------------------------
    # * Get table
    #--------------------------------------------------------------------------
    def [](name); Database.tables[name.to_sym]; end
  end
end

Principe
L'idée repose sur le même concept que celui utilisé par Grim dans son "Expressive Database", sauf que c'est un peu mieux (et intelligemment) codé.
Donc on va d'abord, dans un script vierge au-dessus du main, créer des tables. Pour cela il suffit de faire :
Code:

class Epees < Database::Table
  # Ici on définira les champs de notre table
end
Pour mettre des champs, qui caractérisent notre table il faut indiquer son type et son nom.
Les types que le script admet sont :
  • :string - Correspond à une chaîne de caractères
  • :integer - Correspond à un entier
  • :float - Correspond à un nombre à virgule
  • :boolean - Correspond à true ou false (un interrupteur)
  • :polymorphic - Correspond à n'importe quel type de données RM


Voici un exemple avec des épées et des Pokémon :
Code:
class Epees < Database::Table
  integer :id
  string  :name
  string  :description
  float  :cost
  integer :power
end

class Pokemons < Database::Table
  integer :id
  string  :name
  string  :description
  string  :type
  integer :power
end

L'objectif est de décrire toutes les caractéristiques de nos tables. Bien sûr, ces exemples sont assez "naïfs" et non finis.

Remplir notre base de données
Il existe deux manières de "remplir" notre base de données.
La première est la plus économique, il s'agit, après nos définitions de champs, d'utiliser la commande "insert" et lui passer des arguments. Si les arguments ne sont pas du bon type le script essaiera de les convertir sinon il mettra une valeur par défaut en référence au type. Voici un exemple de remplissage :
Code:
class Epees < Database::Table
  # Design de la table
  integer :id
  string  :name
  string  :description
  float  :cost
  integer :power
  # Remplissage
  insert 0, "Excalibur", "Une épée rare", 150.50, 120
  insert 1, "Durendal", "Une épée très rare", 200.20, 200
  insert 2, "Dard", "Epée de Bilbon puis de Frodon", 30.0, 50
end

class Pokemons < Database::Table
  # Design de la table
  integer :id
  string  :name
  string  :description
  string  :type
  integer :power
  # Remplissage
  insert 0, "Pikachu", "Atroce souris verte", "Foudre", 10
  insert 1, "Pichu", "Le même qu'au-dessus", "Foudre", 5
  insert 2, "Doraemon", "truc", "Feu", 100
  insert 3, "Sangoku", "Pokémon légendaire", "Rare", 1000
end

Sinon il est possible d'instancier des objets de cette manière :
Code:
Pokemons.new(id: 4, name: "Mew", description: "Singe bleu", type: "Herbe", power: 999)
Pokemons.new(id: 5, name: "Magicalichigo", description: "Ressemble a un Evoli", type: "Psy", power: 1)

Personnellement, je préfère cette manière qui me permet de séparer mon "design" de mon remplissage. Mais il est possible de mélanger les manières.

Accéder à une table
Il suffit de faire : Database.table[:Nom_de_la_Table] ou Database.Nom_de_la_Table.
Par exemple : Database.Pokemons ou Database.tables[:Pokemons].
Ensuite Database.Pokemons[0] retournera le premier enregistrement (Pikachu), mais comme les champs sont rangés dans un tableau, il est possible d'utiliser toutes les méthodes relatives aux tableaux. Cependant cette partie s'adresse aux scripteurs, un peu comme tout ce script en fait Very Happy

Binding avec l'Event Extender
Si l'Event Extender est déjà installé, il faut placer ce script en-dessous, pour que cette base de données écrase celle de l'Event Extender.
Le Design/Remplissage fonctionne pareil qu'expliqué plus haut.
Pour les accès à la base de données, ça fonctionne comme au-dessus ou comme documenté dans l'Event Extender.

Crédits
rien

Lien permanent
Si je mets le script à jour, ce sera généralement sur cette page :
https://github.com/Funkywork/Scripts-rm/blob/master/VXAce/Extend-Database.rb

Mairssie à Hiino pour le faitte de lavoar relue le skript é la pache de tailécharjemant


Dernière édition par okinaterbo le Mar 19 Mar 2013 - 0:55, édité 1 fois
Revenir en haut Aller en bas
Olowynd
Voyageur Lv.10
Voyageur Lv.10
Olowynd


Masculin Age : 28
Inscrit le : 30/12/2012
Messages : 390

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeLun 18 Mar 2013 - 21:05

J'ai du mal a comprendre le but en fait... mais c'est peut-être du à ça :
Citation :
cette partie s'adresse aux scripteurs. Un peu comme tout ce script en fait
Bref, concrètement, qu'est-ce que permet ce scrpit ? Shocked

PS: Je suis une quiche royale en scripts, alors bon courage si tu veut tenter de m'expliquer x)
Revenir en haut Aller en bas
okinaterbo
Poulet carnivore Lv.2
Poulet carnivore Lv.2
okinaterbo


Inscrit le : 10/03/2013
Messages : 13

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeLun 18 Mar 2013 - 21:08

A créer ta propre base de données sans la limite de RM.
Revenir en haut Aller en bas
Aoxomoxoa
Va-nu-pieds Lv.4
Va-nu-pieds Lv.4
Aoxomoxoa


Inscrit le : 23/12/2012
Messages : 61

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeLun 18 Mar 2013 - 22:38

Beau travail. Pas de restriction, et par contre le design de la table est fait par IKEA?
Revenir en haut Aller en bas
okinaterbo
Poulet carnivore Lv.2
Poulet carnivore Lv.2
okinaterbo


Inscrit le : 10/03/2013
Messages : 13

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeMar 19 Mar 2013 - 0:27

E mé poin?
Revenir en haut Aller en bas
Zangther
Maître des Duels
Maître des Duels
Zangther


Masculin Age : 32
Inscrit le : 29/07/2009
Messages : 7841

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeMar 19 Mar 2013 - 0:30

Superbe travail bien que la version de Grim soit formellement meilleure. Very Happy

+ 10 points de script.

PS : N'oublie pas, l’horloge troune.
Revenir en haut Aller en bas
okinaterbo
Poulet carnivore Lv.2
Poulet carnivore Lv.2
okinaterbo


Inscrit le : 10/03/2013
Messages : 13

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeMar 19 Mar 2013 - 0:31

odeuzel comme deumwazel
Revenir en haut Aller en bas
Zangther
Maître des Duels
Maître des Duels
Zangther


Masculin Age : 32
Inscrit le : 29/07/2009
Messages : 7841

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeMar 19 Mar 2013 - 0:32

D'ailleurs, tu es noir ce qui réduit la valeur théorique de ce script.

- 5 points
Revenir en haut Aller en bas
okinaterbo
Poulet carnivore Lv.2
Poulet carnivore Lv.2
okinaterbo


Inscrit le : 10/03/2013
Messages : 13

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeMar 19 Mar 2013 - 0:33

Je ne c pas lire ce que tu as écris.
Revenir en haut Aller en bas
okinaterbo
Poulet carnivore Lv.2
Poulet carnivore Lv.2
okinaterbo


Inscrit le : 10/03/2013
Messages : 13

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeMer 20 Mar 2013 - 0:22

J'ai modifié le script
https://github.com/Funkywork/Scripts-rm/blob/master/VXAce/Extend-Database.rb

Pour plus d'explication :
http://www.biloucorp.com/index.php?page=article&id_article=4

Mais vous vous en foutez Very Happy
Revenir en haut Aller en bas
Hiino
Poulet carnivore Lv.2
Poulet carnivore Lv.2
Hiino


Masculin Age : 32
Inscrit le : 10/08/2011
Messages : 14

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeMer 20 Mar 2013 - 7:20

Sai bo
Revenir en haut Aller en bas
http://etaoinshrdlu.host-ed.me
okinaterbo
Poulet carnivore Lv.2
Poulet carnivore Lv.2
okinaterbo


Inscrit le : 10/03/2013
Messages : 13

[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitimeMer 20 Mar 2013 - 7:30

traduile Very Happy
Revenir en haut Aller en bas
Contenu sponsorisé




[VXace] Extend Database Empty
MessageSujet: Re: [VXace] Extend Database   [VXace] Extend Database Icon_minitime

Revenir en haut Aller en bas
 

[VXace] Extend Database

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

 Sujets similaires

-
» [VXAce] L'Extend Editor
» [VXAce] Conversion du script Credits Vx=>VxAce
» [VXAce] Method_Missing
» [VXace] SBS
» [VXAce]Pop up Item

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