Visible Equipment
Auteur : Wawower
Dépendance : Database ManagementMise en place : Installer le Database Management puis le script plus en dessous, le tout au-dessus de main et de préférence en dessous des scripts de base.
Lancer une première fois le test de votre projet. Des dossiers "Visible_Weapons Data","Visible_Armors Data", "Exceptions Visible Data" et "Equipments" (ce dernier dans Graphics) sont ainsi crées
Note : Refonte en cours
Explications : Pour assigner un chara d'equipement à une arme/un équipement, copier coller le template se trouvant respectivement dans "Visible_Weapons Data"/"Visible_Armors Data" puis remplissez les champs
- Code: Tout sélectionner
Database::Visible_Armors
id: 5
chara_name: "chapeau"
pos_z: 0
exceptions_id: [1,2,3]
- id : l'id de l'arme/de l'équipment dans la base de donnée,
- chara_name : le nom du chara placé dans "Equipements" qui correspond à cet arme.
- pos_z : la priorité de superposition sur le chara, sachant que l'équipement dont la priorité assignée est la plus grande est placé au dessus des autres. (Des priorités par défaut peuvent-être defini au lignes 10 et 11 du script, évitant ainsi de rentrer toujours les mêmes valeurs.)
- exceptions_id : l'ensemble des id des exceptions renvoyant aux fichiers du dossier.
"Exceptions Visible Data".
Pour gerer une exception, il vous faut remplir copier/coller le template dans "Exceptions Visible Data" :
- Code: Tout sélectionner
Database::Visible_Exceptions
id: 1
character: "002-Fighter02"
equipment: "chapeau2"
id : l'id renseigné dans 'exceptions_id' plus haut
character : le nom du character pour lequel il faut cette exception.
equipment : le nom du chara d'equipment se trouvant dans "Equipment" qui va être utilisé dans ce cas.
Script :
- Code: Tout sélectionner
#===============================================================================
# *** Visible Equipment
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Auteur : Wawower
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Ce script permet d'afficher les equipements d'un personnage sur son character.
#===============================================================================
# Coordonnées z par defauts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
weapons_default_z = 1
armors_default_z = 0
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Création des tables de la database.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Database.create_table('Visible_Weapons') { |t|
t.column(:id, :integer)
t.column(:chara_name, :string)
t.column(:pos_z, :integer, weapons_default_z)
t.column(:exceptions_id, :array)
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Database.create_table('Visible_Armors') { |t|
t.column(:id, :integer)
t.column(:chara_name, :string)
t.column(:pos_z, :integer, armors_default_z)
t.column(:exceptions_id, :array)
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Database.create_table('Visible_Exceptions') { |t|
t.column(:id, :integer)
t.column(:character, :string)
t.column(:equipment, :string)
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#==============================================================================
# ** Game Actor
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Modifications de la classe Game_Actor qui gére maintenant les characters des
# equipements à ajouter au character du perso.
#==============================================================================
class Game_Actor
# Accesseurs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
attr_accessor :sprite_need_update, :equip_chara_names
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Aliases des méthodes essentiels dans la gestion des equipements
# et du character avec ajout de l'appel de la methode refresh_visible_equip.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias visible_equip_initialize initialize
def initialize(*args)
visible_equip_initialize(*args)
refresh_visible_equip
end
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias visible_equip_equip equip
def equip(*args)
visible_equip_equip(*args)
refresh_visible_equip
end
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias visible_equip_set_graphic set_graphic
def set_graphic(*args)
visible_equip_set_graphic(*args)
refresh_visible_equip
end
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Game_Actor#refresh_visible_equip
# ------------------------------
# Méthode qui répertorie selon les id des equipements les images qui doivent
# être ajouter au chara du personnage dans l'array : @equip_chara_names.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def refresh_visible_equip
@equip_chara_names = []
data = Database::Visible_Weapons.find {|a| a.id==@weapon_id }
unless data.nil?
exceptions = Database::Visible_Exceptions.find_all { |exception|
data.exceptions_id.include?(exception.id) }
str = data.chara_name
except = exceptions.find { |exception|
exception.character==@character_name }
str = except.equipment if !except.nil?
@equip_chara_names[data.pos_z] = [] if @equip_chara_names[data.pos_z].nil?
@equip_chara_names[data.pos_z].push(str)
end
[@armor1_id,@armor2_id,@armor3_id,@armor4_id].each { |armor_id|
data = Database::Visible_Armors.find {|a| a.id==armor_id }
next if data.nil? or data.id==0
exceptions = Database::Visible_Exceptions.find_all { |exception|
data.exceptions_id.include?(exception.id) }
str = data.chara_name
except = exceptions.find { |exception|
exception.character==@character_name }
str = except.equipment if !except.nil?
@equip_chara_names[data.pos_z] = [] if @equip_chara_names[data.pos_z].nil?
@equip_chara_names[data.pos_z].push(str)
}
@equip_chara_names.compact!
@sprite_need_update = true
end
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end
#==============================================================================
# ** Game Actors
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Ajout à la classe Game_Actors d'une méthode qui permet d'dentifier si un
# character est utilisé par un personnage.
#==============================================================================
class Game_Actors
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def chara_owned_by_actor(chara_name)
@data.each {|actor|
next if actor.nil?
return actor if actor.character_name==chara_name
}
return nil
end
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end
#==============================================================================
# ** Sprite_Character
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Modifications de la classe Sprite_Character qui gére maintenant le
# rafraichissement en cas de changement d'équipement
#==============================================================================
class Sprite_Character < RPG::Sprite
# Alias de l'initialize ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias visible_equipment_initialize initialize
def initialize(*args)
@chara_actor_id = nil
visible_equipment_initialize(*args)
end
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Sprite_Character#update
# ------------------------------
# Redéfinition de la méthode update qui rafraichit maintenant le
# character du sprite si c'est un character de perso et si au
# moins un des équipement de celui-ci a changé
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def update
super
bool = false
bool = $game_actors[@chara_actor_id].sprite_need_update if !@chara_actor_id.nil?
if bool or @tile_id != @character.tile_id or # ajout de la condition sur bool
@character_name != @character.character_name or
@character_hue != @character.character_hue
@tile_id = @character.tile_id
@character_name = @character.character_name
@character_hue = @character.character_hue
if @tile_id >= 384
self.bitmap = RPG::Cache.tile($game_map.tileset_name,
@tile_id, @character.character_hue)
self.src_rect.set(0, 0, 32, 32)
self.ox = 16
self.oy = 32
@chara_actor_id = nil
else
self.bitmap = RPG::Cache.character(@character.character_name,
@character.character_hue)
@cw = bitmap.width / 4
@ch = bitmap.height / 4
self.ox = @cw / 2
self.oy = @ch
actor = $game_actors.chara_owned_by_actor(@character_name)
@chara_actor_id = actor.nil? ? nil : actor.id
actor.sprite_need_update = false if !actor.nil?
end
end
self.visible = (not @character.transparent)
if @tile_id == 0
sx = @character.pattern * @cw
sy = (@character.direction - 2) / 2 * @ch
self.src_rect.set(sx, sy, @cw, @ch)
end
self.x = @character.screen_x
self.y = @character.screen_y
self.z = @character.screen_z(@ch)
self.opacity = @character.opacity
self.blend_type = @character.blend_type
self.bush_depth = @character.bush_depth
if @character.animation_id != 0
animation = $data_animations[@character.animation_id]
animation(animation, true)
@character.animation_id = 0
end
end
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end
#==============================================================================
# ** RPG::Cache
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Modification des méthodes du Cache afin d'afficher les équipements.
#==============================================================================
module RPG; module Cache
# Création du dossier Equipments dans Graphics ~~~~~~~~~~~~~~~~
Dir.mkdir("Graphics/Equipments") rescue nil
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * RPG::Cache.character
# ------------------------------
# Reprise de la methode de mise en cache 'load_bitmap' avec ajout de la
# gestion des équipements blittés.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def self.character(filename, hue)
path = "Graphics/Characters/" + filename
if not @cache.include?(path) or @cache[path].disposed?
if filename != ""
@cache[path] = Bitmap.new(path)
else
@cache[path] = Bitmap.new(32, 32)
end
end
if hue == 0
bmp = @cache[path]
else
key = [path, hue]
if not @cache.include?(key) or @cache[key].disposed?
@cache[key] = @cache[path].clone
@cache[key].hue_change(hue)
end
bmp = @cache[key]
end
actor = $game_actors.chara_owned_by_actor(filename)
return bmp if actor.nil?
rect = Rect.new(0,0,bmp.width,bmp.height)
equip_key = [path, hue, actor.equip_chara_names]
if not @cache.include?(equip_key) or @cache[equip_key].disposed?
@cache[equip_key] = bmp.clone
actor.equip_chara_names.each { |charas| charas.each { |chara|
@cache[equip_key].blt(0,0,RPG::Cache.equipment(chara,hue),rect)
} }
end
return @cache[equip_key]
end
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * RPG::Cache.equipment
# ------------------------------
# Mode de récuperation des characters des équipements dans leur dossier.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def self.equipment(filename, hue)
self.load_bitmap("Graphics/Equipments/", filename, hue)
end
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end; end