Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #==============================================================================
- # ** Sprite_Character
- #------------------------------------------------------------------------------
- # Esta classe lida com a exibição do personagem.
- #------------------------------------------------------------------------------
- # Autor: Valentine
- #==============================================================================
- class Sprite_Character < Sprite_Base
- def init_sprites
- @damage_duration = 0
- @message_duration = 0
- @paperdoll_sprites = []
- @old_equips = []
- @name_sprite = nil
- @guild_sprite = nil
- @quest_sprite = nil
- @hp_sprite = nil
- @damage_sprite = nil
- @message_sprite = nil
- @old_guild = nil
- @old_hp = nil
- @old_mhp = nil
- end
- def dispose_sprites
- dispose_paperdolls
- dispose_name
- dispose_guild_name
- dispose_quest_icon
- dispose_hp_bar
- dispose_damage
- dispose_message
- end
- def dispose_paperdolls
- 9.times { |slot_id| dispose_paperdoll(slot_id) }
- end
- def dispose_paperdoll(slot_id)
- return unless @paperdoll_sprites[slot_id]
- @paperdoll_sprites[slot_id].bitmap.dispose
- @paperdoll_sprites[slot_id].dispose
- @paperdoll_sprites[slot_id] = nil
- @old_equips[slot_id] = nil
- end
- def dispose_name
- return unless @name_sprite
- @name_sprite.bitmap.dispose
- @name_sprite.dispose
- @name_sprite = nil
- end
- def dispose_guild_name
- return unless @guild_sprite
- @guild_sprite.bitmap.dispose
- @guild_sprite.dispose
- @guild_sprite = nil
- end
- def dispose_quest_icon
- return unless @quest_sprite
- @quest_sprite.bitmap.dispose
- @quest_sprite.dispose
- @quest_sprite = nil
- end
- def dispose_hp_bar
- return unless @hp_sprite
- @hp_sprite.bitmap.dispose
- @hp_sprite.dispose
- @hp_sprite = nil
- end
- def dispose_damage
- return unless @damage_sprite
- @damage_sprite.bitmap.dispose
- @damage_sprite.dispose
- @damage_sprite = nil
- end
- def dispose_message
- return unless @message_sprite
- @message_sprite.bitmap.dispose
- @message_sprite.dispose
- @message_sprite = nil
- end
- def visible=(visible)
- super
- end_sprites if visible == false
- @quest_sprite.visible = visible if @quest_sprite
- if @name_sprite && @name_sprite.visible != visible
- @name_sprite.visible = visible
- @guild_sprite.visible = visible if @guild_sprite
- @hp_sprite.visible = visible if @hp_sprite
- 9.times { |slot_id| @paperdoll_sprites[slot_id].visible = visible if @paperdoll_sprites[slot_id] } unless @paperdoll_sprites.empty?
- end
- end
- def end_sprites
- end_animation
- end_balloon
- dispose_damage
- dispose_message
- @balloon_duration = 0
- @damage_duration = 0
- @message_duration = 0
- end
- def update_position
- move_animation(@character.screen_x - x, @character.screen_y - y)
- self.x = @character.screen_x
- self.y = @character.screen_y
- self.z = @character.screen_z
- end
- def move_animation(dx, dy)
- return unless @animation && @animation.position != 3
- @ani_ox += dx
- @ani_oy += dy
- @ani_sprites.each do |sprite|
- sprite.x += dx
- sprite.y += dy
- end
- end
- def update_sprites
- return if @character.is_a?(Game_Vehicle) || @character.is_a?(Game_Follower)
- update_paperdolls unless @character.is_a?(Game_Event)
- if @character.actor? && @character.actor.result.hp_damage
- refresh_damage(@character.actor.result.hp_damage, @character.actor.result.mp_damage, @character.actor.result.critical)
- @character.actor.result.hp_damage = nil
- @character.actor.result.mp_damage = 0
- @character.actor.result.critical = false
- end
- # Se é um inimigo, jogador ou evento não apagado (erased)
- if @character.actor? || @character.event.name.start_with?('$') && !@character.character_name.empty?
- refresh_name if name_changed?
- @name_sprite.x = x
- # Atualiza de acordo com a altura do character
- #que pode ter sido alterada
- @name_sprite.y = y - height
- else
- dispose_name
- end
- if !@character.is_a?(Game_Event) && !@character.actor.guild.empty?
- refresh_guild_name if guild_changed?
- @guild_sprite.x = x
- @guild_sprite.y = y - height
- else
- dispose_guild_name
- end
- if @character.is_a?(Game_Event) && @character.quest_not_started?
- create_quest_icon unless @quest_sprite
- @quest_sprite.x = x
- @quest_sprite.y = y - height
- else
- dispose_quest_icon
- end
- if @character.boss?
- refresh_boss_hp_bar if hp_changed?
- # Possibilita que a barra possa ser arrastada
- @hp_sprite.update
- elsif @character.actor? && @character.actor.hp < @character.actor.mhp
- refresh_hp_bar if hp_changed?
- @hp_sprite.x = x
- @hp_sprite.y = y
- else
- dispose_hp_bar
- end
- unless @character.message.empty?
- create_message(@character.message)
- @character.message.clear
- end
- if @damage_duration > 0
- @damage_sprite.x = x
- @damage_sprite.y = y - height + @damage_duration
- @damage_duration -= 1
- else
- dispose_damage
- end
- if @message_duration > 0
- @message_sprite.x = x
- @message_sprite.y = y
- @message_duration -= 1
- else
- dispose_message
- end
- end
- def name_changed?
- return true unless @name_sprite
- return true if @character.actor? && @old_name != @character.actor.name
- return true unless @character.actor? || @old_name == @character.event.name
- return false
- end
- def guild_changed?
- return true unless @guild_sprite
- return true unless @old_guild == @character.actor.guild
- return false
- end
- def hp_changed?
- return true unless @hp_sprite
- return true unless @old_hp == @character.actor.hp
- return true unless @old_mhp == @character.actor.mhp
- return false
- end
- def refresh_damage(hp_damage, mp_damage, critical)
- @damage_sprite ? @damage_sprite.bitmap.clear : create_damage
- damage_text = hp_damage
- color = Font.default_color
- if hp_damage.is_a?(String)
- color = Color::Yellow
- elsif critical
- damage_text = Vocab::Critical
- elsif hp_damage == 0 && mp_damage == 0
- damage_text = Vocab::NoHit
- elsif hp_damage == 0 && mp_damage > 0
- damage_text = "+#{mp_damage}"
- color = Color::Blue
- elsif hp_damage > 0
- damage_text = "+#{hp_damage}"
- color = Color::Green
- else
- color = Color::Red
- end
- @damage_sprite.bitmap.font.color.set(color)
- @damage_sprite.bitmap.draw_text(@damage_sprite.bitmap.rect, damage_text, 1)
- @damage_duration = 30
- end
- def create_damage
- @damage_sprite = Sprite.new(viewport)
- @damage_sprite.bitmap = Bitmap.new(160, 20)
- @damage_sprite.bitmap.font.size = 18
- @damage_sprite.bitmap.font.bold = true
- @damage_sprite.ox = 80
- @damage_sprite.oy = 35
- # Deixa o dano em cima de todas as camadas do
- #tileset e do nome do jogador
- @damage_sprite.z = z + 150
- end
- def order_equips
- # 0 = Arma
- # 1 = Escudo
- # 2 = Capacete
- # 3 = Armadura
- # 4 = Acessório
- # 5 = Amuleto
- # 6 = Capa
- # 7 = Luva
- # 8 = Bota
- case @character.direction
- when 2 # Frente
- return [3, 5, 2, 7, 6, 8, 1, 0, 4]
- when 4 # Esquerda
- return [7, 0, 3, 5, 2, 6, 8, 1, 4]
- when 6 # Direita
- return [1, 3, 5, 2, 7, 6, 8, 0, 4]
- when 8 # Costas
- return [7, 1, 0, 3, 5, 2, 8, 6, 4]
- end
- end
- def update_paperdolls
- order_equips.each_with_index do |slot_id, index|
- if @character.actor.equips[slot_id] && @character.actor.equips[slot_id].paperdoll_name
- refresh_paperdoll(slot_id) unless @old_equips[slot_id] == @character.actor.equips[slot_id]
- pattern = @character.pattern < 3 ? @character.pattern : 1
- sx = (@character.actor.equips[slot_id].paperdoll_index % 4 * 3 + pattern) * @cw
- sy = (@character.actor.equips[slot_id].paperdoll_index / 4 * 4 + (@character.direction - 2) / 2) * @ch
- @paperdoll_sprites[slot_id].src_rect.set(sx, sy, @cw, @ch)
- @paperdoll_sprites[slot_id].x = x
- @paperdoll_sprites[slot_id].y = y
- @paperdoll_sprites[slot_id].z = z + index
- else
- dispose_paperdoll(slot_id)
- end
- end
- end
- def refresh_paperdoll(slot_id)
- @old_equips[slot_id] = @character.actor.equips[slot_id]
- bitmap = Cache.paperdoll(@character.actor.equips[slot_id].paperdoll_name)
- @paperdoll_sprites[slot_id] ? @paperdoll_sprites[slot_id].bitmap.clear : create_paperdoll(slot_id, bitmap)
- @paperdoll_sprites[slot_id].bitmap.blt(0, 0, bitmap, bitmap.rect)
- sign = @character.actor.equips[slot_id].paperdoll_name[/^[\!\$]./]
- if sign && sign.include?('$')
- cw = bitmap.width / 3
- ch = bitmap.height / 4
- else
- cw = bitmap.width / 12
- ch = bitmap.height / 8
- end
- @paperdoll_sprites[slot_id].ox = cw / 2
- @paperdoll_sprites[slot_id].oy = ch
- end
- def create_paperdoll(slot_id, bitmap)
- @paperdoll_sprites[slot_id] = Sprite.new(viewport)
- @paperdoll_sprites[slot_id].bitmap = Bitmap.new(bitmap.width, bitmap.height)
- end
- def refresh_name
- @old_name = @character.actor? ? @character.actor.name : @character.event.name
- @name_sprite ? @name_sprite.bitmap.clear : create_name
- @name_sprite.bitmap.font.color.set(@name_sprite.text_color(name_color))
- @name_sprite.bitmap.draw_text(@name_sprite.bitmap.rect, @old_name.delete('$'), 1)
- end
- def create_name
- @name_sprite = Sprite2.new(viewport)
- @name_sprite.bitmap = Bitmap.new(@name_sprite.text_width(@old_name.delete('$')) + 10, 18)
- @name_sprite.ox = @name_sprite.bitmap.width / 2
- @name_sprite.oy = 19
- @name_sprite.z = z + 100
- end
- def name_color
- return Configs::ADMIN_COLOR if @character.admin?
- return Configs::MONITOR_COLOR if @character.monitor?
- return Configs::BOSS_COLOR if @character.boss?
- return Configs::ENEMY_COLOR if @character.is_a?(Game_Event) && @character.actor
- return Configs::DEFAULT_COLOR
- end
- def refresh_guild_name
- @old_guild = @character.actor.guild
- @guild_sprite ? @guild_sprite.bitmap.clear : create_guild_name
- @guild_sprite.bitmap.draw_text(@guild_sprite.bitmap.rect, "<#{@old_guild}>", 1)
- end
- def create_guild_name
- @guild_sprite = Sprite2.new(viewport)
- @guild_sprite.bitmap = Bitmap.new(160, 18)
- @guild_sprite.bitmap.font.color.set(@guild_sprite.text_color(Configs::GUILD_COLOR))
- @guild_sprite.ox = 80
- @guild_sprite.oy = 37
- @guild_sprite.z = z + 100
- end
- def create_quest_icon
- @quest_sprite = Sprite.new(viewport)
- @quest_sprite.bitmap = Bitmap.new(24, 24)
- bitmap = Cache.system('Iconset')
- rect = Rect.new(Configs::QUEST_NOT_STARTED_ICON % 16 * 24, Configs::QUEST_NOT_STARTED_ICON / 16 * 24, 24, 24)
- @quest_sprite.bitmap.blt(0, 0, bitmap, rect)
- @quest_sprite.ox = 12
- @quest_sprite.oy = 40
- @quest_sprite.z = z + 100
- end
- def refresh_hp_bar
- @old_hp = @character.actor.hp
- @old_mhp = @character.actor.mhp
- @hp_sprite ? @hp_sprite.bitmap.clear : create_hp_bar
- bitmap = Cache.system('HPBar')
- y = @character.actor.mhp / 3 > @character.actor.hp ? 12 : @character.actor.mhp / 1.5 > @character.actor.hp ? 8 : 4
- @hp_sprite.bitmap.blt(0, 0, bitmap, @hp_sprite.bitmap.rect)
- @hp_sprite.bitmap.blt(0, 0, bitmap, Rect.new(0, y, @hp_sprite.bitmap.width * @character.actor.hp / @character.actor.mhp, @hp_sprite.bitmap.height))
- end
- def refresh_boss_hp_bar
- @old_hp = @character.actor.hp
- @old_mhp = @character.actor.mhp
- @hp_sprite ? @hp_sprite.bitmap.clear : create_boss_hp_bar
- bitmap = Cache.system('BossHPBar')
- y = @character.actor.mhp / 3 > @character.actor.hp ? 72 : @character.actor.mhp / 1.5 > @character.actor.hp ? 48 : 24
- @hp_sprite.bitmap.blt(0, 18, bitmap, @hp_sprite.bitmap.rect)
- @hp_sprite.bitmap.blt(0, 18, bitmap, Rect.new(0, y, @hp_sprite.bitmap.width * @character.actor.hp / @character.actor.mhp, @hp_sprite.bitmap.height))
- @hp_sprite.bitmap.font.size = 16
- @hp_sprite.bitmap.font.bold = false
- @hp_sprite.bitmap.font.color.set(@hp_sprite.text_color(Configs::BOSS_COLOR))
- @hp_sprite.bitmap.draw_text(0, 0, 200, 18, @character.actor.name)
- @hp_sprite.bitmap.font.size = 18
- @hp_sprite.bitmap.font.bold = true
- @hp_sprite.bitmap.font.color.set(Color::White)
- @hp_sprite.bitmap.draw_text(4, 20, 25, 20, Vocab::hp_a)
- @hp_sprite.bitmap.draw_text(0, 20, 349, 20, "#{@character.actor.hp}/#{@character.actor.mhp}", 2)
- end
- def create_hp_bar
- @hp_sprite = Sprite.new(viewport)
- @hp_sprite.bitmap = Bitmap.new(30, 4)
- @hp_sprite.ox = 15
- @hp_sprite.oy = -4
- @hp_sprite.z = z + 100
- end
- def create_boss_hp_bar
- @hp_sprite = Sprite2.new
- @hp_sprite.bitmap = Bitmap.new(351, 42)
- @hp_sprite.x = 336
- @hp_sprite.y = 118
- @hp_sprite.z = 50
- @hp_sprite.dragable = true
- end
- def create_message(message)
- dispose_message
- b = Bitmap.new(1, 1)
- # Define a largura a partir da matriz com maior
- #quantidade de caracteres
- width = b.text_size(message.max{ |a, b| a.size <=> b.size }).width
- b.dispose
- @message_sprite = Sprite.new(viewport)
- @message_sprite.bitmap = Bitmap.new(width + 18, message.size * 18)
- @message_sprite.bitmap.fill_rect(@message_sprite.bitmap.rect, Color.new(0, 0, 0, 160))
- @message_sprite.bitmap.font.bold = true
- message.each_with_index do |text, i|
- @message_sprite.bitmap.draw_text(0, 18 * i, @message_sprite.bitmap.width, 18, text, 1)
- end
- @message_sprite.ox = @message_sprite.width / 2
- @message_sprite.oy = message.size * 18 + height + 10
- @message_sprite.z = z + 100
- @message_duration = 150
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement