Poulet carnivore Lv.2
Inscrit le : 10/03/2013 Messages : 13
| Sujet: [VXace] Extend Database Lun 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 PrincipeL'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éesIl 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 tableIl 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 Binding avec l'Event ExtenderSi 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éditsrien Lien permanentSi 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 |
|
Voyageur Lv.10
Age : 28 Inscrit le : 30/12/2012 Messages : 390
| Sujet: Re: [VXace] Extend Database Lun 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 ? PS: Je suis une quiche royale en scripts, alors bon courage si tu veut tenter de m'expliquer x) |
|
Poulet carnivore Lv.2
Inscrit le : 10/03/2013 Messages : 13
| Sujet: Re: [VXace] Extend Database Lun 18 Mar 2013 - 21:08 | |
| A créer ta propre base de données sans la limite de RM. |
|
Va-nu-pieds Lv.4
Inscrit le : 23/12/2012 Messages : 61
| Sujet: Re: [VXace] Extend Database Lun 18 Mar 2013 - 22:38 | |
| Beau travail. Pas de restriction, et par contre le design de la table est fait par IKEA? |
|
Poulet carnivore Lv.2
Inscrit le : 10/03/2013 Messages : 13
| Sujet: Re: [VXace] Extend Database Mar 19 Mar 2013 - 0:27 | |
| |
|
Maître des Duels
Age : 32 Inscrit le : 29/07/2009 Messages : 7841
| Sujet: Re: [VXace] Extend Database Mar 19 Mar 2013 - 0:30 | |
| Superbe travail bien que la version de Grim soit formellement meilleure. + 10 points de script. PS : N'oublie pas, l’horloge troune. |
|
Poulet carnivore Lv.2
Inscrit le : 10/03/2013 Messages : 13
| Sujet: Re: [VXace] Extend Database Mar 19 Mar 2013 - 0:31 | |
| |
|
Maître des Duels
Age : 32 Inscrit le : 29/07/2009 Messages : 7841
| Sujet: Re: [VXace] Extend Database Mar 19 Mar 2013 - 0:32 | |
| D'ailleurs, tu es noir ce qui réduit la valeur théorique de ce script.
- 5 points |
|
Poulet carnivore Lv.2
Inscrit le : 10/03/2013 Messages : 13
| Sujet: Re: [VXace] Extend Database Mar 19 Mar 2013 - 0:33 | |
| Je ne c pas lire ce que tu as écris. |
|
Poulet carnivore Lv.2
Inscrit le : 10/03/2013 Messages : 13
| Sujet: Re: [VXace] Extend Database Mer 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 |
|
Poulet carnivore Lv.2
Age : 32 Inscrit le : 10/08/2011 Messages : 14
| Sujet: Re: [VXace] Extend Database Mer 20 Mar 2013 - 7:20 | |
| |
|
Poulet carnivore Lv.2
Inscrit le : 10/03/2013 Messages : 13
| Sujet: Re: [VXace] Extend Database Mer 20 Mar 2013 - 7:30 | |
| traduile |
|
| Sujet: Re: [VXace] Extend Database | |
| |
|