Partagez
Aller en bas
avatar
kurdtkobane
Membre

Nombre de messages : 43
Age : 32
Localisation : Dans mes rêves
Distinction : aucune
Date d'inscription : 30/04/2013

Problème de script: Boss HP Meter et Damage popup

le Mer 1 Juil 2015 - 7:31
Bonjour à vous!

Alors je viens vers vous parce que je suis en train de faire mon système de combat et dans celui-ci il y a deux choses que je souhaite absolument intégrer et qui bug chez moi. Je n'arrive pas à déterminer d'où vient le problème.

Le premier et le Boss HP Meter de MogHunter que voici!

Code:
#==============================================================================
# +++ MOG - Boss HP Meter (V1.5) +++
#==============================================================================
# By Moghunter
# https://atelierrgss.wordpress.com/
#==============================================================================
# Apresenta um medidor animado com o HP do inimigo.
#
#==============================================================================
# UTILIZAÇÃO
#==============================================================================
# Coloque o seguinte comentário na caixa de notas do inimigo.
#
# <Boss HP Meter>
#
# Caso desejar ocultar o valor numérico do HP use o código abaixo.
#
# <Boss HP Hide Number>
#
#==============================================================================
# Caso precisar mudar a posição do medidor no meio do jogo use o código abaixo
#
# boss_hp_position(X,Y)
#
#==============================================================================
# Serão necessários as imagens.
#
# Battle_Boss_Meter.png
# Battle_Boss_Meter_Layout.png
#==============================================================================
# FACES (Opcional)
#==============================================================================
# Nomeie o arquivo da face da seguinte maneira. (Graphics/Faces/)
#
# Enemy_Name + _F.png         (Slime_F.png)
#
# ou
#
# BF_ + ID.png          (BF_11.png)
#
#==============================================================================
# Definindo o LEVEL (Opcional)
#==============================================================================
# Coloque o seguinte comentário na caixa de notas do inimigo.
#
# <Level = X>
#
#==============================================================================

#==============================================================================
# Histórico
#==============================================================================
# v1.5 - Definição do nome da face pelo ID do battler
# v1.4 - Melhoria de compatibilidade de scripts.
#==============================================================================

$imported = {} if $imported.nil?
$imported[:mog_blitz_commands] = true

module MOG_BOSS_HP_METER
    #Posição geral do layout.
    LAYOUT_POSITION = [60,30]
    #Posição do medidor.
    METER_POSITION = [3,3]
    #Posição do nome do inimigo.
    NAME_POSITION = [16,8]
    #Posição da face.
    FACE_POSITION = [0,-30]
    #Posição do level do inimigo.
    LEVEL_POSITION = [150, -24]#[290, 0]
    #Posição do numero  de HP
    HP_NUMBER_POSITION = [230, 5]
    #Definição do espaço da palavra HP e o valor de numérico.
    HP_STRING_SPACE = 36
    #Ativar efeito wave
    HP_NUMBER_WAVE_EFFECT = true
    #Definição da palavra Level.
    LEVEL_WORD = "Level "
    #Velocidade de animação do medidor
    METER_ANIMATION_SPEED = 10    
    #Definição do tamanho da fonte.
    FONT_SIZE = 16
    #Ativar contorno na fonte.
    FONT_BOLD = true
    #Fonte em itálico.
    FONT_ITALIC = true
    #Definição da cor da fonte.
    FONT_COLOR = Color.new(255,255,255)
    #Definição da prioridade da HUD.
    PRIORITY_Z = 50
end

#==============================================================================
# ■ Game System
#==============================================================================
class Game_System
  
 attr_accessor :boss_hp_meter
  
 #--------------------------------------------------------------------------
 # ● Initialize
 #--------------------------------------------------------------------------  
 alias mog_boss_hp_meter_initialize initialize
 def initialize
     ix = MOG_BOSS_HP_METER::LAYOUT_POSITION[0]
     iy = MOG_BOSS_HP_METER::LAYOUT_POSITION[1]
     @boss_hp_meter = [ix,iy,false,"",0,1,0,nil,0,false]
     mog_boss_hp_meter_initialize
 end
  
end

#==============================================================================
# ■ Game Enemy
#==============================================================================
class Game_Enemy < Game_Battler
  
  attr_accessor :boss_hp_meter
  attr_accessor :boss_hp_number
  attr_accessor :level
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------
  alias mog_boss_hp_meter_initialize initialize
  def initialize(index, enemy_id)
      mog_boss_hp_meter_initialize(index, enemy_id)
      @boss_hp_meter = enemy.note =~ /<Boss HP Meter>/ ? true : false
      @boss_hp_number = enemy.note =~ /<Boss HP Hide Number>/ ? false : true
      @level = enemy.note =~ /<Level = (\d+)>/i ? $1 : nil
  end  

end

#==============================================================================
# ■ Game Temp
#==============================================================================
class Game_Temp
  
  attr_accessor :battle_end
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------  
  alias mog_boss_hp_meter_initialize initialize
  def initialize
      @battle_end = false
      mog_boss_hp_meter_initialize
  end  

end

#==============================================================================
# ■ Game Interpreter
#==============================================================================
class Game_Interpreter
  
 #--------------------------------------------------------------------------
 # ● Initialize
 #--------------------------------------------------------------------------    
 def boss_hp_position(x = 0,y = 0)
     $game_system.boss_hp_meter[0] = x
     $game_system.boss_hp_meter[1] = y
 end
  
end

#==============================================================================
# ■ Game Temp
#==============================================================================
class Game_Temp

  attr_accessor :cache_boss_hp
  
 #--------------------------------------------------------------------------
 # ● Initialize
 #--------------------------------------------------------------------------    
  alias mog_boss_hp_initialize initialize
  def initialize
      mog_boss_hp_initialize
      cache_bosshp
  end
  
 #--------------------------------------------------------------------------
 # ● Cache Bosshp
 #--------------------------------------------------------------------------  
  def cache_bosshp
      @cache_boss_hp = []
      @cache_boss_hp.push(Cache.system("Battle_Boss_Meter_Layout"))
      @cache_boss_hp.push(Cache.system("Battle_Boss_Meter"))
      @cache_boss_hp.push(Cache.system("Battle_Boss_Number"))
  end
  
end

#==============================================================================
# ■ Boss HP Meter
#==============================================================================
class Boss_HP_Meter
  include MOG_BOSS_HP_METER
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------  
  def initialize(viewport = nil)
      clear_enemy_setup
      @hp_vieport = nil
      check_boss_avaliable
  end
  
  #--------------------------------------------------------------------------
  # ● Clear Enemy Setup
  #--------------------------------------------------------------------------    
  def clear_enemy_setup
      @name = ""    
      @hp = 0
      @hp2 = 0
      @hp3 = 0
      @maxhp = 0
      @hp_old = 0
      @level = nil
      $game_system.boss_hp_meter[2] = false
      $game_system.boss_hp_meter[3] = ""
      $game_system.boss_hp_meter[4] = 0
      $game_system.boss_hp_meter[5] = 1
      $game_system.boss_hp_meter[7] = nil
      $game_system.boss_hp_meter[8] = 0
      $game_system.boss_hp_meter[9] = true
  end

  #--------------------------------------------------------------------------
  # ● Check Boss Avaliable
  #--------------------------------------------------------------------------    
  def check_boss_avaliable
      return if $game_troop.all_dead?
      for i in $game_troop.members
          if i.boss_hp_meter and !i.hidden? and i.hp > 0
             create_boss_hp_meter(i)
             break
          end
      end
  end

  #--------------------------------------------------------------------------
  # ● Create Boss HP Meter
  #--------------------------------------------------------------------------      
  def create_boss_hp_meter(i)
      $game_system.boss_hp_meter[2] = true
      $game_system.boss_hp_meter[3] = i.name
      $game_system.boss_hp_meter[4] = i.hp
      $game_system.boss_hp_meter[5] = i.mhp
      $game_system.boss_hp_meter[6] = i.hp
      $game_system.boss_hp_meter[7] = i.level rescue nil
      $game_system.boss_hp_meter[8] = 0
      $game_system.boss_hp_meter[9] = i.boss_hp_number
      $game_system.boss_hp_meter[10] = i.enemy_id
      refresh_hp_meter
      create_layout
      create_meter
      create_name
      create_face
      create_level
      create_hp_number
  end
    
  #--------------------------------------------------------------------------
  # ● Create Layout
  #--------------------------------------------------------------------------        
  def create_layout
      return if @layout != nil
      @layout = Sprite.new
      @layout.bitmap = $game_temp.cache_boss_hp[0]
      @layout.x = $game_system.boss_hp_meter[0]
      @layout.y = $game_system.boss_hp_meter[1]
      @layout.viewport = @hp_vieport
      @layout.z = PRIORITY_Z
  end
  
  #--------------------------------------------------------------------------
  # ● Create Meter
  #--------------------------------------------------------------------------          
  def create_meter
      return if @meter_image != nil
      hp_setup
      @meter_image = $game_temp.cache_boss_hp[1]
      @meter_cw = @meter_image.width / 3
      @meter_ch = @meter_image.height / 2
      @meter = Sprite.new
      @meter.bitmap = Bitmap.new(@meter_cw,@meter_ch)
      @meter.z = @layout.z + 1
      @meter.x = @layout.x + METER_POSITION[0]
      @meter.y = @layout.y + METER_POSITION[1]
      @meter.viewport = @hp_vieport
      @hp_flow = 0
      @hp_flow_max = @meter_cw * 2
      update_hp_meter
  end

  #--------------------------------------------------------------------------
  # ● Create Name
  #--------------------------------------------------------------------------            
  def create_name
      @name_sprite = Sprite.new
      @name_sprite.bitmap = Bitmap.new(200,32)
      @name_sprite.z = @layout.z + 2
      @name_sprite.x = @layout.x + NAME_POSITION[0]
      @name_sprite.y = @layout.y + NAME_POSITION[1]
      @name_sprite.bitmap.font.size = FONT_SIZE
      @name_sprite.bitmap.font.bold = FONT_BOLD
      @name_sprite.bitmap.font.italic = FONT_ITALIC
      @name_sprite.bitmap.font.color = FONT_COLOR
      @name_sprite.viewport = @hp_vieport
      refresh_name
  end
  
  #--------------------------------------------------------------------------
  # ● Create Face
  #--------------------------------------------------------------------------
  def create_face
      @face_sprite = Sprite.new
      @face_sprite.x = @layout.x + FACE_POSITION[0]
      @face_sprite.y = @layout.y + FACE_POSITION[1]
      @face_sprite.z = @layout.z + 2
      @face_sprite.viewport = @hp_vieport
      refresh_face
  end

  #--------------------------------------------------------------------------
  # ● Create Level
  #--------------------------------------------------------------------------  
  def create_level
      @level_sprite = Sprite.new
      @level_sprite.bitmap = Bitmap.new(120,32)
      @level_sprite.z = @layout.z + 2
      @level_sprite.x = @layout.x + LEVEL_POSITION[0]
      @level_sprite.y = @layout.y + LEVEL_POSITION[1]
      @level_sprite.bitmap.font.size = FONT_SIZE
      @level_sprite.bitmap.font.bold = FONT_BOLD
      @level_sprite.bitmap.font.italic = FONT_ITALIC
      @level_sprite.bitmap.font.color = FONT_COLOR
      @level_sprite.viewport = @hp_vieport
      refresh_level
  end
  
  #--------------------------------------------------------------------------
  # ● Create HP Number
  #--------------------------------------------------------------------------    
  def create_hp_number
      @hp2 = $game_system.boss_hp_meter[4]
      @hp3 = @hp2
      @hp_old2 = @hp2
      @hp_ref = @hp_old2
      @hp_refresh = false    
      @hp_number_image = $game_temp.cache_boss_hp[2]
      @hp_cw = @hp_number_image.width / 10
      @hp_ch = @hp_number_image.height / 2
      @hp_ch2 = 0
      @hp_ch_range = HP_NUMBER_WAVE_EFFECT == true ? @hp_ch / 3 : 0
      @hp_number_sprite = Sprite.new
      @hp_number_sprite.bitmap = Bitmap.new(@hp_number_image.width, @hp_ch * 2)
      @hp_number_sprite.z = @layout.z + 2
      @hp_number_sprite.x = @layout.x + HP_NUMBER_POSITION[0]
      @hp_number_sprite.y = @layout.y + HP_NUMBER_POSITION[1]
      @hp_number_sprite.viewport = @hp_vieport
      @hp_number_sprite.visible = $game_system.boss_hp_meter[9]
      refresh_hp_number
  end
  
  #--------------------------------------------------------------------------
  # ● update_hp_number
  #--------------------------------------------------------------------------
  def update_hp_number
      return if @hp_number_sprite == nil
      @hp_number_sprite.visible = $game_system.boss_hp_meter[9]
      if @hp_old2 < $game_system.boss_hp_meter[4]
         number_refresh_speed
         @hp2 += @hp_ref    
         reset_hp_number  if @hp2 >= $game_system.boss_hp_meter[4]
      elsif @hp_old2 > $game_system.boss_hp_meter[4]          
         number_refresh_speed
         @hp2 -= @hp_ref                
         reset_hp_number if @hp2 <= $game_system.boss_hp_meter[4]
      end  
  end    
  
  #--------------------------------------------------------------------------
  # ● Number Refresh Speed
  #--------------------------------------------------------------------------
  def number_refresh_speed
      @hp_refresh = true  
      @hp_ref = (3 * (@hp_old2 - $game_system.boss_hp_meter[4]).abs / 100) rescue nil
      @hp_ref = 1 if @hp_ref == nil or @hp_ref < 1
  end
  
  #--------------------------------------------------------------------------
  # ● Refresh HP Number
  #--------------------------------------------------------------------------      
  def refresh_hp_number
      return if @hp_number_sprite == nil
      @hp_refresh = false
      @hp_number_sprite.bitmap.clear
      number = @hp2.abs.to_s.split(//)
      @hp_ch2 = 0
      for r in 0..number.size - 1
          number_abs = number[r].to_i
          nsrc_rect = Rect.new(@hp_cw * number_abs, 0, @hp_cw, @hp_ch)
          @hp_ch2 = @hp_ch2 == @hp_ch_range ? 0 : @hp_ch_range
          @hp_number_sprite.bitmap.blt(HP_STRING_SPACE + (@hp_cw *  r), @hp_ch2, @hp_number_image, nsrc_rect)        
      end      
      nsrc_rect = Rect.new(0, @hp_ch, @hp_number_image.width, @hp_ch)
      @hp_number_sprite.bitmap.blt(0, 0, @hp_number_image, nsrc_rect)    
  end
  
  #--------------------------------------------------------------------------
  # ● Reset HP Number
  #--------------------------------------------------------------------------        
  def reset_hp_number
      @hp_refresh = true
      @hp_old2 = $game_system.boss_hp_meter[4]
      @hp2 = $game_system.boss_hp_meter[4]
      @hp_ref = 0
      refresh_hp_number
  end
    
  #--------------------------------------------------------------------------
  # ● Refresh Level
  #--------------------------------------------------------------------------    
  def refresh_level
      return if @level_sprite == nil
      @level_sprite.bitmap.clear
      @level = $game_system.boss_hp_meter[7]
      return if @level == nil
      level_text = LEVEL_WORD + @level.to_s
      @level_sprite.bitmap.draw_text(0,0,120,32,level_text.to_s)
  end
  
  #--------------------------------------------------------------------------
  # ● Refresh Face
  #--------------------------------------------------------------------------  
  def refresh_face
      return if @face_sprite == nil
      dispose_bitmap_face
      @face_sprite.bitmap = Cache.face(@name + "_f") rescue nil
      @face_sprite.bitmap = Cache.face("BF_" + $game_system.boss_hp_meter[10].to_s) rescue nil if @face_sprite.bitmap == nil
      @face_sprite.bitmap = Cache.face("") if @face_sprite.bitmap == nil
  end
  
  #--------------------------------------------------------------------------
  # ● Refresh Name
  #--------------------------------------------------------------------------              
  def refresh_name
      return if @name_sprite == nil
      @name = $game_system.boss_hp_meter[3]    
      @name_sprite.bitmap.clear
      @name_sprite.bitmap.draw_text(0,0,190,32,@name.to_s)
      refresh_face
      refresh_level
      reset_hp_number
      @hp_old = @meter_cw * @hp / @maxhp
  end
  
  #--------------------------------------------------------------------------
  # ● HP Setup
  #--------------------------------------------------------------------------            
  def hp_setup
      @hp = $game_system.boss_hp_meter[4]
      @maxhp = $game_system.boss_hp_meter[5]
  end  
  
  #--------------------------------------------------------------------------
  # ● Dispose
  #--------------------------------------------------------------------------  
  def dispose
      dispose_layout
      dispose_meter
      dispose_name
      dispose_face
      dispose_level
      dispose_hp_number      
  end

  #--------------------------------------------------------------------------
  # ● Dispose Name
  #--------------------------------------------------------------------------              
  def dispose_name
      return if @name_sprite == nil
      @name_sprite.bitmap.dispose
      @name_sprite.dispose
      @name_sprite = nil
  end  
  
  #--------------------------------------------------------------------------
  # ● Dispose Layout
  #--------------------------------------------------------------------------    
  def dispose_layout
      return if @layout == nil
      @layout.dispose
      @layout = nil
  end
  
  #--------------------------------------------------------------------------
  # ● Dispose Meter
  #--------------------------------------------------------------------------      
  def dispose_meter
      return if @meter == nil
      @meter.bitmap.dispose
      @meter.dispose
      @meter = nil
  end
  
  #--------------------------------------------------------------------------
  # ● Dispose Face
  #--------------------------------------------------------------------------  
  def dispose_face
      return if @face_sprite == nil
      dispose_bitmap_face
      @face_sprite.dispose
      @face_sprite = nil
  end
  
  #--------------------------------------------------------------------------
  # ● Dispose Bitmap Face
  #--------------------------------------------------------------------------    
  def dispose_bitmap_face
      return if @face_sprite == nil
      return if @face_sprite.bitmap == nil
      @face_sprite.bitmap.dispose rescue nil
      @face_sprite.bitmap = nil
  end  
  
  #--------------------------------------------------------------------------
  # ● Dispose Level
  #--------------------------------------------------------------------------    
  def dispose_level
      return if @level_sprite == nil
      @level_sprite.bitmap.dispose
      @level_sprite.dispose
      @level_sprite = nil
  end  
  
  #--------------------------------------------------------------------------
  # ● Dispose HP Number
  #--------------------------------------------------------------------------      
  def dispose_hp_number
      return if @hp_number_sprite == nil
      @hp_number_sprite.bitmap.dispose
      @hp_number_sprite.dispose
  end    
  
  #--------------------------------------------------------------------------
  # ● Update
  #--------------------------------------------------------------------------  
  def update
      refresh_hp_meter
      refresh_hp_number if @hp_refresh
      update_hp_meter
      update_hp_number
      update_fade_end
      update_visible
  end
  
  #--------------------------------------------------------------------------
  # ● Update Visible
  #--------------------------------------------------------------------------  
  def update_visible
      return if @meter_image == nil
      vis = bhp_visible?
      @layout.visible = vis    
      @meter.visible = vis    
      @name_sprite.visible = vis    
      @face_sprite.visible = vis    
      @level_sprite.visible = vis    
      @hp_number_sprite.visible = vis    
  end
  
  #--------------------------------------------------------------------------
  # ● Bhp Visible?
  #--------------------------------------------------------------------------  
  def bhp_visible?
      return false if $game_message.visible
      return true
  end
  
  #--------------------------------------------------------------------------
  # ● Update Fade End
  #--------------------------------------------------------------------------    
  def update_fade_end
      return if !$game_temp.battle_end
      return if @meter_image == nil
      @layout.opacity -= 5
      @meter.opacity -= 5
      @name_sprite.opacity -= 5
      @face_sprite.opacity -= 5
      @level_sprite.opacity -= 5
      @hp_number_sprite.opacity -= 5
  end
  
  #--------------------------------------------------------------------------
  # ● Refresh HP Meter
  #--------------------------------------------------------------------------          
  def refresh_hp_meter
      return if !$game_system.boss_hp_meter[2]
      $game_system.boss_hp_meter[2] = false
      hp_setup
      refresh_name if @name != $game_system.boss_hp_meter[3]
  end
  
  #--------------------------------------------------------------------------
  # ● Update HP Meter
  #--------------------------------------------------------------------------            
  def update_hp_meter
      return if @meter_image == nil
      @meter.bitmap.clear
      hp_width = @meter_cw * @hp / @maxhp      
      execute_damage_flow(hp_width)      
      hp_src_rect = Rect.new(@hp_flow, 0,hp_width, @meter_ch)
      @meter.bitmap.blt(0,0, @meter_image, hp_src_rect)  
      @hp_flow += METER_ANIMATION_SPEED
      @hp_flow = 0 if @hp_flow >= @hp_flow_max
  end  
    
  #--------------------------------------------------------------------------
  # ● Execute Damage Flow
  #--------------------------------------------------------------------------
  def execute_damage_flow(hp_width)
      return if @hp_old == hp_width
      n = (@hp_old - hp_width).abs * 3 / 100
      damage_flow = [[n, 2].min,0.5].max
      @hp_old -= damage_flow      
      @hp_old = hp_width if @hp_old <= hp_width
      src_rect_old = Rect.new(0,@meter_ch, @hp_old, @meter_ch)
      @meter.bitmap.blt(0,0, @meter_image, src_rect_old)      
  end    
  
end

#==============================================================================
# ■ Spriteset Battle
#==============================================================================
class Spriteset_Battle
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------  
  alias mog_enemy_bhp_initialize initialize
  def initialize
      mog_enemy_bhp_initialize
      create_boss_hp_meter
  end
  
  #--------------------------------------------------------------------------
  # ● Create Boss HP Meter
  #--------------------------------------------------------------------------  
  def create_boss_hp_meter
      @boss_hp_meter = Boss_HP_Meter.new(@viewport1)
  end
  
  #--------------------------------------------------------------------------
  # ● Dispose
  #--------------------------------------------------------------------------      
  alias mog_enemy_bhp_dispose dispose
  def dispose
      dispose_boss_hp_meter    
      mog_enemy_bhp_dispose
  end  

  #--------------------------------------------------------------------------
  # ● Dispose Boss HP Meter
  #--------------------------------------------------------------------------          
  def dispose_boss_hp_meter
      return if @boss_hp_meter == nil
      @boss_hp_meter.dispose
      @boss_hp_meter = nil
  end
  
  #--------------------------------------------------------------------------
  # ● Update
  #--------------------------------------------------------------------------        
  alias mog_enemy_bhp_update update
  def update
      mog_enemy_bhp_update
      update_boss_hp_meter
  end
  
  #--------------------------------------------------------------------------
  # ● Update Boss HP Meter
  #--------------------------------------------------------------------------            
  def update_boss_hp_meter
      return if @boss_hp_meter == nil
      @boss_hp_meter.update
  end
    
end

#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
  
  #--------------------------------------------------------------------------
  # ● Item Apply
  #--------------------------------------------------------------------------        
  alias mog_boss_hp_item_apply item_apply
  def item_apply(user, item)
      check_boss_hp_before
      mog_boss_hp_item_apply(user, item)
      check_boss_hp_after
  end
  
  #--------------------------------------------------------------------------
  # ● Regenerate HP
  #--------------------------------------------------------------------------
  alias mog_boss_hp_regenerate_hp regenerate_hp
  def regenerate_hp
      check_boss_hp_before
      mog_boss_hp_regenerate_hp
      check_boss_hp_after
  end  
  
  #--------------------------------------------------------------------------
  # ● Check Boss HP Before
  #--------------------------------------------------------------------------          
  def check_boss_hp_before
      return if self.is_a?(Game_Actor)
      return if !self.boss_hp_meter
      $game_system.boss_hp_meter[6] = self.hp
  end
  
  #--------------------------------------------------------------------------
  # ● Check Boss HP After
  #--------------------------------------------------------------------------            
  def check_boss_hp_after
      return if self.is_a?(Game_Actor)
      return if !self.boss_hp_meter
      $game_system.boss_hp_meter[2] = true
      $game_system.boss_hp_meter[3] = self.name
      $game_system.boss_hp_meter[4] = self.hp
      $game_system.boss_hp_meter[5] = self.mhp
      $game_system.boss_hp_meter[7] = self.level rescue nil    
      $game_system.boss_hp_meter[9] = self.boss_hp_number
  end
  
end

#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter

  #--------------------------------------------------------------------------
  # ● Check Boss Meter
  #--------------------------------------------------------------------------    
  def check_boss_meter
      return if !SceneManager.scene_is?(Scene_Battle)
      iterate_enemy_index(@params[0]) do |enemy|
        if enemy.boss_hp_meter
           $game_system.boss_hp_meter[2] = true
           $game_system.boss_hp_meter[3] = enemy.name
           $game_system.boss_hp_meter[4] = enemy.hp
           $game_system.boss_hp_meter[5] = enemy.mhp
           $game_system.boss_hp_meter[6] = enemy.hp  
           $game_system.boss_hp_meter[7] = enemy.level rescue nil
           $game_system.boss_hp_meter[9] = enemy.boss_hp_number
        end
     end
  end

  #--------------------------------------------------------------------------
  # ● Command 331
  #--------------------------------------------------------------------------  
  alias mog_boss_meter_command_331 command_331
  def command_331
      mog_boss_meter_command_331
      check_boss_meter
  end
  
  #--------------------------------------------------------------------------
  # ● Command 334
  #--------------------------------------------------------------------------  
  alias mog_boss_meter_command_334 command_334
  def command_334
      mog_boss_meter_command_334
      check_boss_meter
  end  
  
end

#==============================================================================
# ■ BattleManager
#==============================================================================
class << BattleManager
  
  #--------------------------------------------------------------------------
  # ● Init Members
  #--------------------------------------------------------------------------          
  alias mog_boss_meter_init_members init_members
  def init_members
      $game_temp.battle_end = false
      mog_boss_meter_init_members
  end  
  
  #--------------------------------------------------------------------------
  # ● Process Victory
  #--------------------------------------------------------------------------            
  alias mog_boss_meter_process_victory process_victory
  def process_victory
      $game_temp.battle_end = true
      mog_boss_meter_process_victory
  end
  
  #--------------------------------------------------------------------------
  # ● Process Abort
  #--------------------------------------------------------------------------            
  alias mog_boss_meter_process_abort process_abort
  def process_abort
      $game_temp.battle_end = true
      mog_boss_meter_process_abort
  end

  #--------------------------------------------------------------------------
  # ● Process Defeat
  #--------------------------------------------------------------------------            
  alias mog_boss_meter_process_defeat process_defeat
  def process_defeat
      $game_temp.battle_end = true
      mog_boss_meter_process_defeat
  end
  
end

J'ai le message d'erreur suivant: Script 'Boss Hp Meter' line 222: NoMethodError occured.
                                               undefine method '[]=' for nil:NilClass

Ca correspond à cette ligne:  $game_system.boss_hp_meter[2] = false

Je vous ai mis en gras la ligne concerner!
J'ai bien mis les note tag sur le monstre que je défini comme un boss. Mais le problème persiste!


Dernière édition par kurdtkobane le Mer 1 Juil 2015 - 7:48, édité 1 fois
avatar
kurdtkobane
Membre

Nombre de messages : 43
Age : 32
Localisation : Dans mes rêves
Distinction : aucune
Date d'inscription : 30/04/2013

Re: Problème de script: Boss HP Meter et Damage popup

le Mer 1 Juil 2015 - 7:31
Le deuxième script est sur le script de MogHunter Damage popup

Code:
#==============================================================================
# +++ MOG - DAMAGEPOPUP  (v4.5) +++
#==============================================================================
# By Moghunter
# https://atelierrgss.wordpress.com/
#==============================================================================
# Apresenta danos dos alvos em imagens.
#==============================================================================
# Serão necessários as imagems
#
# Critical
# Evaded
# Exp
# Gold
# Level Up
# Missed
# MP
# Number
# TP
#
# As imagens devem ficar na pasta /GRAPHICS/DAMAGE/
#==============================================================================

#==============================================================================
# DAMAGE POPUP FOR CHARACTERS (Events)
#==============================================================================
# Caso desejar ativar manualmente os danos nos characters, basta usar os códigos
# abaixo.
#
# damage_popup(TARGET_ID,VALUE,"TYPE")
#
# TARGET_ID
#      1...999 - Define a ID  do evento no mapa
#      0 - Define a ID sendo do jogador.(Player)
#      -1...-3 - Define  a ID dos aliados (Followers).
#
# VALUE
#       Define o valor em dano (Pode ser valores negativos) ou um texto.
#       No caso das codições defina a ID da condição. (Valore negativos
#       é apresentado a condição sendo removida.)
#
# TYPE (Opcional)
#      So use está opção para ativar srtings especiais.
#
#      "Exp" - Valor da string se torna em EXP.
#      "Gold" - Valor da string se torna em GOLD.
#      "States" - É apresentado o ícone e o nome da condição da condição.
#
#==============================================================================
#
# damage_popup(1,999)
# damage_popup(4,"Save Point.")
# damage_popup(0,"I'm hungry!!!")            <- (Player)
# damage_popup(-1,"Booo!")                   <- (Follower ID1)
# damage_popup(0,2000,"Exp")                 <- Popup 2000 Exp
# damage_popup(0,5000,"Gold")                <- Popup 5000 Gold
#
#==============================================================================
# Use o código abaixo se desejar fazer o dano aparecer em todos os personagens.
#
# damage_popup_party(TARGET_ID,STRING,"TYPE")
#
#==============================================================================
# ATIVAR OU DESATIVAR OS DANOS NO MAPA.
#==============================================================================
# É possível usar o código abaixo para ativar ou desativar a dano no mapa
# no meio do jogo, útil se você não quiser que alguma string de item ou
# dano apareça no meio de algum evento ou cena.
#
# damage_popup_map(true)        -> or (false)
#  
#==============================================================================
# ● Histórico (Version History)
#==============================================================================
# v 4.5 - Correção de ativar o dano quando o alvo é morto e o dano é zero.
#==============================================================================

$imported = {} if $imported.nil?
$imported[:mog_damage_popup] = true

module MOG_DAMAGEPOPUP
  #Ativar as strings de dano no mapa. (Default / Inicial)
  DAMAGE_POPUP_MAP = false
  #Apresentar o item ao ganhar. (Apenas no mapa).
  ITEM_POPUP_MAP = true
  #Apresentar a exp e ouro do inimigo.
  EXP_GOLD_POPUP_BATTLE = true
  EXP_GOLD_POPUP_MAP = true
  #Ativar a string de Level UP
  LEVEL_POPUP_BATTLE = true
  LEVEL_POPUP_MAP = true
  #Ativar as strings nas condições.
  STATES_POPUP_BATTLE = true
  STATES_POPUP_MAP = true
  #Definição da fonte (Nome de itens/ condições / etc...).
  FONT_SIZE = 28
  FONT_BOLD = true
  FONT_ITALIC = false
  FONT_COLOR = Color.new(255,255,255)
  FONT_COLOR_ITEM = Color.new(255,255,255)
  FONT_COLOR_STATUS_PLUS = Color.new(155,155,255)
  FONT_COLOR_STATUS_MINUS = Color.new(255,150,150)
  #Definição do espaço entre os danos.
  Y_SPACE = 28
  #Definição da posição Z do srpite.
  DAMAGE_Z = 151
end

#==============================================================================
# ■ Game_System
#==============================================================================
class Game_System
  attr_accessor :damage_popup_map
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------        
  alias mog_damage_popup_initialize initialize
  def initialize
      @damage_popup_map = MOG_DAMAGEPOPUP::DAMAGE_POPUP_MAP
      mog_damage_popup_initialize
  end
  
  #--------------------------------------------------------------------------
  # ● Damage Popup Clear
  #--------------------------------------------------------------------------        
  def damage_popup_clear
      $game_party.character_members.each {|t|
      t.actor.damage.clear; t.actor.skip_dmg_popup = false ;
      t.damage.clear; t.skip_dmg_popup = false} rescue nil
      $game_map.events.values.each {|t| t.damage.clear ;
      t.skip_dmg_popup = false} rescue nil
  end
  
end  

#==============================================================================
# ■ Game Temp
#==============================================================================
class Game_Temp
  
  attr_accessor :battle_end

  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------    
  alias mog_damage_temp_opup_initialize initialize
  def initialize
      @battle_end = false
      mog_damage_temp_opup_initialize
  end
  
  #--------------------------------------------------------------------------
  # ● Sprite Visible
  #--------------------------------------------------------------------------    
  def sprite_visible
      return false if $game_message.visible
      return false if $game_temp.battle_end
      return true
  end
    
end
#==============================================================================
# ■ Game CharacterBase
#==============================================================================
class Game_CharacterBase
  
  attr_accessor :damage ,:battler ,:skip_dmg_popup
  
  #--------------------------------------------------------------------------
  # ● Ini Public Members
  #--------------------------------------------------------------------------        
  alias mog_damage_popup_init_public_members init_public_members
  def init_public_members
      @damage = [] ; @skip_dmg_popup = false
      mog_damage_popup_init_public_members
  end
  
  #--------------------------------------------------------------------------
  # ● Damage Popup
  #--------------------------------------------------------------------------        
  def damage_popup(value,type = "String")      
      @damage.push([value,type])
  end  
  
end

#==============================================================================
# ■ Scene Map
#==============================================================================
class Scene_Map < Scene_Base  
  #--------------------------------------------------------------------------
  # ● Start
  #--------------------------------------------------------------------------
  alias mog_damage_popup_start start
  def start
      $game_system.damage_popup_clear ; $game_temp.battle_end = false
      mog_damage_popup_start
  end  
end

#==============================================================================
# ■ Game Player
#==============================================================================
class Game_Player < Game_Character    
  #--------------------------------------------------------------------------
  # ● Battler
  #--------------------------------------------------------------------------
  def battler
      actor
  end    
end

#==============================================================================
# ■ Game Follower
#==============================================================================
class Game_Follower < Game_Character  
  #--------------------------------------------------------------------------
  # ● Battler
  #--------------------------------------------------------------------------
  def battler
      actor
  end    
end

#==============================================================================
# ■ Game_BattlerBase
#==============================================================================
class Game_BattlerBase  
  #--------------------------------------------------------------------------
  # ● Change HP
  #--------------------------------------------------------------------------        
  alias mog_damage_popup_change_hp change_hp
  def change_hp(value, enable_death)
      mog_damage_popup_change_hp(value, enable_death)
      self.damage.push([-value,"Hp"])
  end    
end

#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase  
  include MOG_DAMAGEPOPUP
  attr_accessor :damage , :skip_dmg_popup
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------        
  alias mog_damage_sprite_initialize initialize
  def initialize      
      @damage = [] ; @skip_dmg_popup = false
      mog_damage_sprite_initialize
  end  
    
  #--------------------------------------------------------------------------
  # ● Item Apply
  #--------------------------------------------------------------------------  
   alias mog_damage_pop_item_apply item_apply
   def item_apply(user, item)
       mog_damage_pop_item_apply(user, item)
       execute_damage_popup(user,item)
  end
  
  #--------------------------------------------------------------------------
  # ● Execute Damage Popup
  #--------------------------------------------------------------------------
  def execute_damage_popup(user,item)
      if !@result.missed and !@result.evaded and @result.hit?
        self.damage.push([@result.hp_damage,"HP",@result.critical]) if item.damage.to_hp? or @result.hp_damage != 0
        user.damage.push([-@result.hp_drain,"HP",@result.critical]) if item.damage.type == 5
        self.damage.push([@result.mp_damage,"MP",@result.critical]) if item.damage.to_mp? or @result.mp_damage != 0
        user.damage.push([-@result.mp_drain,"MP",@result.critical]) if item.damage.type == 6
        self.damage.push([@result.tp_damage,"TP",@result.critical]) if @result.tp_damage != 0
     elsif !self.dead?
        if @result.missed ; self.damage.push(["Missed","Missed"])
        elsif @result.evaded ; self.damage.push(["Evaded","Evaded"])
        end        
      end
  end
    
  #--------------------------------------------------------------------------
  # ● Regenerate HP
  #--------------------------------------------------------------------------
  alias mog_damage_pop_regenerate_hp regenerate_hp
  def regenerate_hp
      mog_damage_pop_regenerate_hp
      self.damage.push(["Regenerate",""]) if @result.hp_damage < 0  
      self.damage.push([@result.hp_damage,"HP"]) if @result.hp_damage != 0
  end

  #--------------------------------------------------------------------------
  # ● Regenerate MP
  #--------------------------------------------------------------------------
  alias mog_damage_pop_regenerate_mp regenerate_mp
  def regenerate_mp
      mog_damage_pop_regenerate_mp
      self.damage.push([@result.mp_damage,"MP"]) if @result.mp_damage != 0
  end
  
  #--------------------------------------------------------------------------
  # ● Regenerate TP
  #--------------------------------------------------------------------------
  alias mog_damage_pop_regenerate_tp regenerate_tp
  def regenerate_tp
      mog_damage_pop_regenerate_tp
      tp_damage = 100 * trg
      self.damage.push([tp_damage,"TP"]) if tp_damage != 0
  end

  #--------------------------------------------------------------------------
  # ● Added New State
  #--------------------------------------------------------------------------  
  alias mog_damage_pop_add_new_state add_new_state
  def add_new_state(state_id)
      mog_damage_pop_add_new_state(state_id)
      execute_popup_add_new_state(state_id)
  end
    
  #--------------------------------------------------------------------------
  # ● Execute Popup Add New State
  #--------------------------------------------------------------------------  
 def execute_popup_add_new_state(state_id)
      st = $data_states[state_id]
      if self.hp > 0
         unless (SceneManager.scene_is?(Scene_Battle) and !STATES_POPUP_BATTLE) or
                (SceneManager.scene_is?(Scene_Map) and !STATES_POPUP_MAP)
                self.damage.push([st.name.to_s,"States Plus",false,st.icon_index])
         end
      end
  end
  
  #--------------------------------------------------------------------------
  # ● Remove State
  #--------------------------------------------------------------------------  
  alias mog_damage_pop_remove_state remove_state
  def remove_state(state_id)
      execute_popup_remove_state(state_id)  
      mog_damage_pop_remove_state(state_id)
  end      
  
  #--------------------------------------------------------------------------
  # ● Execute Popup Remove State
  #--------------------------------------------------------------------------  
  def execute_popup_remove_state(state_id)  
      if state?(state_id) and self.hp > 0
         st = $data_states[state_id]
         unless (SceneManager.scene_is?(Scene_Battle) and !STATES_POPUP_BATTLE) or
                (SceneManager.scene_is?(Scene_Map) and !STATES_POPUP_MAP)
                self.damage.push([st.name.to_s,"States Minus",false,st.icon_index]) unless BattleManager.escape?
         end
      end
  end    

end

#==============================================================================
# ■ BattleManager
#==============================================================================
module BattleManager
  #--------------------------------------------------------------------------
  # ● Escape?
  #--------------------------------------------------------------------------
  def self.escape?
      @phase == nil
  end  
end

#==============================================================================
# ■ Game_Temp
#==============================================================================
class Game_Temp
  attr_accessor :dmg_battle_mode
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------        
  alias mog_damage_popup_initialize initialize
  def initialize
      @dmg_battle_mode = false
      mog_damage_popup_initialize
  end
  
end

#==============================================================================
# ■ Scene Battle
#==============================================================================
class Scene_Battle < Scene_Base

  #--------------------------------------------------------------------------
  # ● Start
  #--------------------------------------------------------------------------        
  alias mog_damage_popup_start start
  def start
      $game_temp.dmg_battle_mode = true
      mog_damage_popup_start
  end
    
  #--------------------------------------------------------------------------
  # ● Terminate
  #--------------------------------------------------------------------------        
  alias mog_damage_popup_terminate terminate
  def terminate
      mog_damage_popup_terminate
      $game_temp.dmg_battle_mode = false
  end
  
end

#==============================================================================
# ■ Game Party
#==============================================================================
class Game_Party < Game_Unit

  #--------------------------------------------------------------------------
  # ● Character Members
  #--------------------------------------------------------------------------        
  def character_members
      char_m = [] ; char_m.push($game_player)
      $game_player.followers.each do |f| char_m.push(f) end
      return char_m
  end
  
  #--------------------------------------------------------------------------
  # ● Gain Gold
  #--------------------------------------------------------------------------        
  alias mog_damage_popup_gain_gold gain_gold
  def gain_gold(amount)
      mog_damage_popup_gain_gold(amount)
      $game_party.members[0].damage.push([amount,"Gold"]) if can_damage_popup_gold?
  end  
  
  #--------------------------------------------------------------------------
  # ● Can Damage Popup Gold
  #--------------------------------------------------------------------------        
  def can_damage_popup_gold?
      return false if !SceneManager.scene_is?(Scene_Map)
      return false if $game_temp.dmg_battle_mode
      return false if !MOG_DAMAGEPOPUP::EXP_GOLD_POPUP_MAP
      return false if !$game_system.damage_popup_map
      return false if !$game_party.members[0]
      return true
  end
  
 #--------------------------------------------------------------------------
 # ● Gain Item
 #--------------------------------------------------------------------------
 alias mog_damage_popup_gain_item gain_item
 def gain_item(item, amount, include_equip = false)
     mog_damage_popup_gain_item(item, amount, include_equip)
     execute_item_popup(item) if can_damage_popup_item?(item)
 end
  
 #--------------------------------------------------------------------------
 # ● Can Damage Poupup Item
 #--------------------------------------------------------------------------
 def can_damage_popup_item?(item)
     return false if item == nil
     return false if !MOG_DAMAGEPOPUP::ITEM_POPUP_MAP
     return false if !$game_system.damage_popup_map
     return false if SceneManager.scene_is?(Scene_Battle)
     return false if !$game_party.members[0]
     return false if $game_temp.dmg_battle_mode
     return true    
 end
 
 #--------------------------------------------------------------------------
 # ● Execute Item Popup
 #--------------------------------------------------------------------------
 def execute_item_popup(item)
     it = $data_items[item.id] if item.is_a?(RPG::Item)
     it = $data_weapons[item.id] if item.is_a?(RPG::Weapon)
     it = $data_armors[item.id] if item.is_a?(RPG::Armor)  
     $game_party.members[0].damage.push([it.name.to_s,"Item",false,it.icon_index])
 end
 
end

#==============================================================================
# ■ Game Interpreter
#==============================================================================
class Game_Interpreter

 #--------------------------------------------------------------------------
 # ● Damage Popup Map
 #--------------------------------------------------------------------------
  def damage_popup_map(value)
      $game_system.damage_popup_map = value
  end    
  
  #--------------------------------------------------------------------------
  # ● Damage Popup
  #--------------------------------------------------------------------------
  def damage_popup(target_id, value,type = "")
      return if !$game_system.damage_popup_map
      target = set_target_dmg(target_id) rescue nil
      target.damage.push([value,type]) if target
  end
  
  #--------------------------------------------------------------------------
  # ● Set Target Dmg
  #--------------------------------------------------------------------------
  def set_target_dmg(target)
      return $game_player.battler if target == 0
      return $game_player.followers.battler[(target_id + 1).abs] if target < 0
      $game_map.events.values.each do |event|
      return event.battler if event.id == target_id and event.battler
      return event if event.id == target_id
      end
  end
  
  #--------------------------------------------------------------------------
  # * Change MP
  #--------------------------------------------------------------------------
  alias mog_damage_popup_command_312 command_312
  def command_312
      value = operate_value(@params[2], @params[3], @params[4])
      iterate_actor_var(@params[0], @params[1]) do |actor|
      actor.damage.push([-value,"MP"])
      end    
      mog_damage_popup_command_312
  end  
  
end

#==============================================================================
# ■ Game Actor
#==============================================================================
class Game_Actor < Game_Battler
  include MOG_DAMAGEPOPUP
  #--------------------------------------------------------------------------
  # ● Level UP
  #--------------------------------------------------------------------------        
   alias mog_damage_pop_level_up level_up
   def level_up
       mog_damage_pop_level_up      
       execute_level_popup
   end

  #--------------------------------------------------------------------------
  # ● Execute Level Popup
  #--------------------------------------------------------------------------        
   def execute_level_popup
       if (SceneManager.scene_is?(Scene_Battle) and LEVEL_POPUP_BATTLE) or
          (SceneManager.scene_is?(Scene_Map) and LEVEL_POPUP_MAP)
          @damage.push(["Level UP","Level_UP"]) unless @skip_dmg_popup
          @skip_dmg_popup = true
       end    
   end
    
  #--------------------------------------------------------------------------
  # ● Change Exp
  #--------------------------------------------------------------------------        
  alias mog_damage_popup_change_exp change_exp
  def change_exp(exp, show)
      n_exp = self.exp
      mog_damage_popup_change_exp(exp, show)
      c_exp = n_exp - self.exp
      @damage.push([c_exp.abs,"Exp"]) if can_popup_exp?(exp)
  end  
  
  #--------------------------------------------------------------------------
  # ● Can Popup EXP
  #--------------------------------------------------------------------------        
  def can_popup_exp?(exp)
      return false if !EXP_GOLD_POPUP_MAP
      return false if exp <= 0
      return false if self.skip_dmg_popup
      return false if self.max_level?
      return true
  end
  
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
  
  #--------------------------------------------------------------------------
  # ● Invoke Counter Attack
  #--------------------------------------------------------------------------        
  alias mog_damage_popup_invoke_counter_attack invoke_counter_attack
  def invoke_counter_attack(target, item)
      mog_damage_popup_invoke_counter_attack(target, item)
      target.damage.push(["Counter","Counter"])
  end  
  
  #--------------------------------------------------------------------------
  # ● Invoke Counter Attack
  #--------------------------------------------------------------------------        
  alias mog_damage_popup_invoke_magic_reflection invoke_magic_reflection
  def invoke_magic_reflection(target, item)
      mog_damage_popup_invoke_magic_reflection(target, item)
      target.damage.push(["Reflection","Reflection"])
  end  
  
end

#==============================================================================
# ■ Cache
#==============================================================================
module Cache

  #--------------------------------------------------------------------------
  # * Damage
  #--------------------------------------------------------------------------
  def self.damage(filename)
      load_bitmap("Graphics/Damage/", filename)
  end

end

#==============================================================================
# ■ Game Temp
#==============================================================================
class Game_Temp
  
  attr_accessor :pre_cache_damage
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------  
  alias mog_damage_pop_initialize initialize
  def initialize
      mog_damage_pop_initialize
      pre_cache_damage_temp
  end
  
  #--------------------------------------------------------------------------
  # ● Pre Cache Damage Temp
  #--------------------------------------------------------------------------  
  def pre_cache_damage_temp
      return if @pre_cache_damage != nil
      @pre_cache_damage = []
      @pre_cache_damage.push(Cache.damage("HP_Number"))
      @pre_cache_damage.push(Cache.damage("MP"))
      @pre_cache_damage.push(Cache.damage("TP"))
      @pre_cache_damage.push(Cache.damage("Missed"))
      @pre_cache_damage.push(Cache.damage("Evaded"))
      @pre_cache_damage.push(Cache.damage("Critical"))
      @pre_cache_damage.push(Cache.damage("Exp"))
      @pre_cache_damage.push(Cache.damage("Gold"))
      @pre_cache_damage.push(Cache.damage("Level UP"))
      @pre_cache_damage.push(Cache.damage("Counter"))
      @pre_cache_damage.push(Cache.damage("Reflection"))
      @pre_cache_damage.push(Cache.damage("MP_Number"))
      @pre_cache_damage.push(Cache.damage("TP_Number"))
      @pre_cache_damage.push(Cache.damage("EG_Number"))
      @pre_cache_damage.push(Cache.system("Iconset"))
  end
  
end

#==============================================================================
# ■ Sprite Base
#==============================================================================
class Sprite_Base < Sprite

  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------  
  alias mog_damage_popup_sprite_initialize initialize
  def initialize(viewport = nil)
      mog_damage_popup_sprite_initialize(viewport)
      damage_popup_setup
  end

  #--------------------------------------------------------------------------
  # ● Damage Popup Setup
  #--------------------------------------------------------------------------  
  def damage_popup_setup      
      $game_temp.pre_cache_damage_temp ; @damage_sprites = []
      $game_system.damage_popup_clear
  end

  #--------------------------------------------------------------------------
  # ● Dispose
  #--------------------------------------------------------------------------  
  alias mog_damage_popup_sprite_dispose dispose
  def dispose      
      mog_damage_popup_sprite_dispose
      dispose_damage_sprites
  end
  
  #--------------------------------------------------------------------------
  # ● Dispose Damage Sprites
  #--------------------------------------------------------------------------    
  def dispose_damage_sprites
      return if @damage_sprites == nil
      @damage_sprites.each {|sprite| sprite.dispose_damage }
  end  
  
  #--------------------------------------------------------------------------
  # ● Update
  #--------------------------------------------------------------------------  
  alias mog_damage_popup_sprite_update update
  def update
      mog_damage_popup_sprite_update
      update_damage_popup
  end  
  
  #--------------------------------------------------------------------------
  # ● Update Damage Popup
  #--------------------------------------------------------------------------  
  def update_damage_popup
      return if @damage_sprites == nil
      create_damage_sprite if can_create_damage?
      update_damage_sprite if !@damage_sprites.empty?
  end  
  
  #--------------------------------------------------------------------------
  # ● Can Create Damage?
  #--------------------------------------------------------------------------    
  def can_create_damage?      
      return false if $game_message.visible
      if @battler
         return false if @battler.damage == nil
         return false if @battler.damage.empty?
         if $game_temp.battle_end and @battler.is_a?(Game_Actor)
            return false if $game_message.visible
            return false if $imported[:mog_battler_result] and $game_temp.result
         end
      elsif @character
         return false if !$game_system.damage_popup_map
         if @character.battler
            return false if @character.battler.damage == nil
            return false if @character.battler.damage.empty?
         else
            return false if @character.damage == nil
            return false if @character.damage.empty?            
         end  
      end
      return false if @battler == nil and @character == nil      
      return true
  end
  
  #--------------------------------------------------------------------------
  # ● Create Damage Sprite
  #--------------------------------------------------------------------------    
  def create_damage_sprite
      target = @battler ? @battler : @character
      screen_x_available = target.screen_x rescue nil
      return if screen_x_available == nil
      sx = target.screen_x != nil ? target.screen_x : self.x
      sy = target.screen_y != nil ? target.screen_y : self.y
      @damage_sprites = [] if @damage_sprites == nil  
      target = @character.battler if @character and @character.battler
      target.damage.each_with_index do |i, index|
      @damage_sprites.push(Damage_Sprite.new(nil,sx,sy,i,index,@damage_sprites.size,self)) end
      if SceneManager.scene_is?(Scene_Battle)
      @damage_sprites.each_with_index do |i, index| i.set_duration(index) end
      end
      target.damage.clear ; target.skip_dmg_popup = false
  end  
  
  #--------------------------------------------------------------------------
  # ● Update Damage Sprite
  #--------------------------------------------------------------------------    
  def update_damage_sprite
      clear = true
      @damage_sprites.each_with_index do |sprite, i|
          sprite.update_damage(@damage_sprites.size,i,@battler)
          sprite.dispose_damage if sprite.duration <= 0
          clear = false if sprite.duration > 0
      end  
      @damage_sprites.clear if clear
  end  
  
end

#==============================================================================
# ■ Damage Sprite
#==============================================================================
class Damage_Sprite < Sprite
   include MOG_DAMAGEPOPUP
   attr_accessor :duration
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------      
  def initialize(viewport = nil , x,y, value ,index,index_max,target)
      super(viewport)
      dispose_damage ; setup_base(value,x,y,index,index_max,target) ; create_sprites
  end    
    
  #--------------------------------------------------------------------------
  # ● Setup Base
  #--------------------------------------------------------------------------      
  def setup_base(value,x,y,index,index_max,target)
      @target = target ; y2 = 0
      if @target.bitmap != nil ; y2 = SceneManager.scene_is?(Scene_Battle) ? @target.bitmap.height / 2 : 0 ; end
      @animation_type = 0 ; @index = index ; @index_max = index_max + 1
      @image = $game_temp.pre_cache_damage ; self.z = index + DAMAGE_Z
      @cw = @image[0].width / 10 ; @ch = @image[0].height / 2 ; @cw2 = 0
      @x = x ; @y = y - y2 ; @value = value[0] ; @type = value[1] ; @ch2 = 0
      @critical = (value[2] and @value.to_i >= 0) ? true : false; self.opacity = 0
      @state_index = value[3] ; @oxy = [0,0,0,0] ; @org_xy = [0,0] ; @spxy = [0,0]
      @duration = 92 ; @org_oxy = [0,0,0,0]
      self.visible = false ;set_initial_position(index,nil)
  end
  
  #--------------------------------------------------------------------------
  # ● Set Duration
  #--------------------------------------------------------------------------      
  def set_duration(index,pre_index = nil)
      return if @duration != 0
      @duration = 82 + (2 * index) if @animation_type == 0
  end
  
  #--------------------------------------------------------------------------
  # ● Set Initial Position
  #--------------------------------------------------------------------------      
  def set_initial_position(index,old_duration)
      @org_xy = [@x,@y]
      self.zoom_y = self.zoom_x
  end
  
  #--------------------------------------------------------------------------
  # ● Dispose Damage
  #--------------------------------------------------------------------------      
  def dispose_damage
      (self.bitmap.dispose ; self.bitmap = nil) if self.bitmap
      (@sup_sprite.bitmap.dispose ; @sup_sprite.dispose) if @sup_sprite  
      @duration = -1
  end
  
  #--------------------------------------------------------------------------
  # ● Create Sprites
  #--------------------------------------------------------------------------      
  def create_sprites
      if @value.is_a?(Numeric)
         create_number        
      elsif ["Missed","Evaded","Level UP","Counter","Reflection"].include?(@value.to_s)
         create_miss
      else
         create_string
      end      
      set_damage_position
  end
  
  #--------------------------------------------------------------------------
  # ● Set Damage Position
  #--------------------------------------------------------------------------      
  def set_damage_position
      return if self.bitmap == nil
      self.ox = (self.bitmap.width - @cw2) / 2
      self.oy = self.bitmap.height / 2 ; self.x = @x ; self.y = @y
      @org_oxy[0] = self.ox
      @org_oxy[1] = self.oy
      set_animation_type
      if @sup_sprite
         @sup_sprite.ox = self.bitmap.width / 2 ;
         @sup_sprite.oy = self.bitmap.height / 2
         @org_oxy[2] = @sup_sprite.ox
         @org_oxy[3] = @sup_sprite.oy
         if @critical
            @sup_sprite.x = @x - (@sup_sprite.bitmap.width / 2) + ((@cw / 2) * @number_value.size)
            @sup_sprite.y = self.y
         end  
         update_sup_position(@index_max - @index)
      end
  end    
  
  #--------------------------------------------------------------------------
  # ● Set Damage Position
  #--------------------------------------------------------------------------      
  def set_animation_type
      s = rand(2) ; s2 = (rand(10) * 0.1).round(2)
      @oxy[2] = s == 1 ? s2 : -s2
  end
  
  #--------------------------------------------------------------------------
  # ● Create Number
  #--------------------------------------------------------------------------      
  def create_number
      case @type
      when "MP"
      number_image = @image[11] ;h = @value >= 0 ? 0 : @ch ; create_sup_sprite
      when "TP"
      number_image = @image[12] ;h = @value >= 0 ? 0 : @ch ; create_sup_sprite
      when "Exp"
      number_image = @image[13] ;h = 0 ; create_sup_sprite
      when "Gold"
      number_image = @image[13] ;h = @ch ; create_sup_sprite            
      else
      number_image = @image[0] ; h = @value >= 0 ? 0 : @ch
      end
      @number_value = @value.abs.truncate.to_s.split(//)
      self.bitmap = Bitmap.new(@cw * @number_value.size, @ch)
      for r in 0...@number_value.size        
          number_value_abs = @number_value[r].to_i
          src_rect = Rect.new(@cw * number_value_abs, h, @cw, @ch)
          self.bitmap.blt(@cw *  r, 0, number_image, src_rect)
      end    
      create_sup_sprite if @critical
  end
  
  #--------------------------------------------------------------------------
  # ● Create Sup Sprite
  #--------------------------------------------------------------------------      
  def create_sup_sprite
      return if @sup_sprite != nil
      @sup_sprite = Sprite.new ; @sup_sprite.visible = false ; fy = 0 ; sp = [0,0]
      if @type == "MP" ; @sup_sprite.bitmap = @image[1].dup
      elsif @type == "TP" ; @sup_sprite.bitmap = @image[2].dup
      elsif @critical
         @sup_sprite.bitmap = @image[5].dup
         @cw2 = 0 ; @ch2 = @sup_sprite.bitmap.height  
         return
      elsif @type == "Exp"
         @sup_sprite.bitmap = @image[6].dup ; fy = @ch ; sp[1] = 1.0
      elsif @type == "Gold"
         @sup_sprite.bitmap = @image[7].dup ; fy = (@ch * 2) ; sp[1] = 0.5
     end  
     fy = 0 if !SceneManager.scene_is?(Scene_Battle)
     @y += fy ; @org_xy[1] += 0
     @cw2 = @sup_sprite.bitmap.width + @cw
     @spxy = [sp[0],sp[1]]
  end

  #--------------------------------------------------------------------------
  # ● Update Sup Position
  #--------------------------------------------------------------------------      
  def update_sup_position(dif_y)
      @sup_sprite.x = self.x - @cw unless @critical
      @sup_sprite.y = @critical ? self.y - @ch2 : self.y
      @sup_sprite.opacity = self.opacity ; @sup_sprite.angle = self.angle
      @sup_sprite.zoom_x = self.zoom_x ; @sup_sprite.zoom_y = self.zoom_y
      @sup_sprite.z = self.z ; @sup_sprite.viewport = self.viewport
      @sup_sprite.visible = self.visible
  end  
  
  #--------------------------------------------------------------------------
  # ● Create Miss
  #--------------------------------------------------------------------------      
  def create_miss
      self.bitmap = @image[3].dup if @value == "Missed"
      self.bitmap = @image[4].dup if @value == "Evaded"
      self.bitmap = @image[8].dup if @value == "Level UP"
      self.bitmap = @image[9].dup if @value == "Counter"
      self.bitmap = @image[10].dup if @value == "Reflection"
  end
  
  #--------------------------------------------------------------------------
  # ● Create Spring
  #--------------------------------------------------------------------------              
  def create_string
      string_size = @value.to_s.split(//) ; fsize = FONT_SIZE > 10 ? FONT_SIZE : 10
      @stg_size = string_size.size > 0 ? ((1 + string_size.size ) * ((fsize / 2) - 2)) : 32      
      self.bitmap = Bitmap.new(@stg_size,32)
      self.bitmap.font.color = FONT_COLOR
      self.bitmap.font.size = fsize ; self.bitmap.font.bold = FONT_BOLD
      self.bitmap.font.italic = FONT_ITALIC
      if @type == "Item"
         self.bitmap.font.color = FONT_COLOR_ITEM
      elsif @type == "States Plus"
         self.bitmap.font.color = FONT_COLOR_STATUS_PLUS
      elsif @type == "States Minus"
         self.bitmap.font.color = FONT_COLOR_STATUS_MINUS
      end      
      self.bitmap.draw_text(0, 0, self.bitmap.width, self.bitmap.height, @value.to_s,0)
      draw_states if @state_index != nil
  end
  
  #--------------------------------------------------------------------------
  # ● Draw States
  #--------------------------------------------------------------------------              
  def draw_states
      @sup_sprite = Sprite.new ; @sup_sprite.bitmap = Bitmap.new(24,24)
      rect = Rect.new(@state_index % 16 * 24, @state_index / 16 * 24, 24, 24)
      @image[14] = Cache.system("Iconset") if @image[14]== nil or @image[14].disposed?
      @sup_sprite.bitmap.blt(0, 0, @image[14].dup, rect)
      (@org_xy[1] += (@ch + 5) ; @y += (@ch + 5)) unless !SceneManager.is_a?(Scene_Battle)
      @cw2 = @sup_sprite.bitmap.width + @cw / 2 ; @sup_sprite.visible = false
  end  
  
  #--------------------------------------------------------------------------
  # ● Update Damage
  #--------------------------------------------------------------------------              
  def update_damage(index_max,index,battler)
      @index_max = index_max ; @index = index
      return if self.bitmap == nil or self.bitmap.disposed?
      @duration -= 1
      self.visible = @duration > 90 ? false : true
      return if !self.visible
      dif_y = (@index_max - @index)
      update_animation(dif_y)
      update_sprite_position(dif_y,battler)
      update_sup_position(dif_y) if @sup_sprite
      dispose_damage if @duration <= 0
  end
  
  #--------------------------------------------------------------------------
  # ● Update Sprite Position
  #--------------------------------------------------------------------------              
  def update_sprite_position(dif_y,battler)
      execute_move(0,self,@org_xy[0] + @oxy[0])
      execute_move(1,self,@org_xy[1] + @oxy[1] - (dif_y * Y_SPACE))
      self.zoom_y = self.zoom_x
      update_battle_camera if oxy_camera?(battler)
  end    
  
  #--------------------------------------------------------------------------
  # ● Update Battle Camera
  #--------------------------------------------------------------------------              
  def update_battle_camera
      self.ox = $game_temp.viewport_oxy[0] + @org_oxy[0]
      self.oy = $game_temp.viewport_oxy[1] + @org_oxy[1]
      @sup_sprite.ox = $game_temp.viewport_oxy[0] + @org_oxy[2] if @sup_sprite != nil
      @sup_sprite.oy = $game_temp.viewport_oxy[1] + @org_oxy[3] if @sup_sprite != nil
  end  
  
  #--------------------------------------------------------------------------
  # ● OXY_CAMERA
  #--------------------------------------------------------------------------              
  def oxy_camera?(battler)
      return false if $imported[:mog_battle_camera] == nil
      if battler.is_a?(Game_Actor)
         return false if $imported[:mog_battle_hud_ex] and SceneManager.face_battler?
      end
      return true
  end
  
  #--------------------------------------------------------------------------
  # ● Execute Move
  #--------------------------------------------------------------------------      
  def execute_move(type,sprite,np)
      cp = type == 0 ? sprite.x : sprite.y
      sp = 1 + ((cp - np).abs / 10)
      sp = 1 if @duration < 60
      if cp > np ;    cp -= sp ; cp = np if cp < np
      elsif cp < np ; cp += sp ; cp = np if cp > np
      end    
      sprite.x = cp if type == 0 ; sprite.y = cp if type == 1
  end  
  
  #--------------------------------------------------------------------------
  # ● Update Animation
  #--------------------------------------------------------------------------              
  def update_animation(dif_y)
     @oxy[1] -= 1
     case @duration
     when 60..90 ; self.opacity += 15
     when 30..60 ; self.opacity = 255
     when 0..30  ; self.opacity -= 9
     end
  end
 
end

#==============================================================================
# ■ Sprite Battler
#==============================================================================
class Sprite_Battler < Sprite_Base
  
  #--------------------------------------------------------------------------
  # ● Update Collapse
  #--------------------------------------------------------------------------  
  alias mog_damage_pop_update_collapse update_collapse
  def update_collapse
      mog_damage_pop_update_collapse
      execute_exp_pop
  end
  
  #--------------------------------------------------------------------------
  # ● Update Instant Collapse
  #--------------------------------------------------------------------------  
  alias mog_damage_pop_update_instant_collapse update_instant_collapse
  def update_instant_collapse
      mog_damage_pop_update_instant_collapse
      execute_exp_pop
  end    
  
  #--------------------------------------------------------------------------
  # ● Update Boss Collapse
  #--------------------------------------------------------------------------  
  alias mog_damage_pop_update_boss_collapse update_boss_collapse
  def update_boss_collapse
      mog_damage_pop_update_boss_collapse
      execute_exp_pop
  end
  
  #--------------------------------------------------------------------------
  # ● Execute Exp Pop
  #--------------------------------------------------------------------------  
  def execute_exp_pop
      return if !MOG_DAMAGEPOPUP::EXP_GOLD_POPUP_BATTLE or @dam_exp != nil
      return if @battler == nil or @battler.is_a?(Game_Actor)
      @dam_exp = true
      if $imported[:mog_active_bonus_gauge] != nil
         real_exp = $game_troop.bonus_exp? ? @battler.exp * 2 : @battler.exp
         real_gold = $game_troop.bonus_gold? ? @battler.gold * 2 : @battler.gold
      else
         real_exp = @battler.exp ;  real_gold = @battler.gold
      end
      @battler.damage.push([real_exp,"Exp"]) if @battler.exp > 0
      @battler.damage.push([real_gold,"Gold"]) if @battler.gold > 0
  end    
  
end

Sur ce script tout fonctionne sauf qu'après le deuxième coup j'ai un crash du jeu qui me met une erreur:
Script 'Damage popup' line 328: NoMethodError occured.
                                               undefine method 'push' for nil:NilClass

Ca corresponde à cette ligne :  self.damage.push([st.name.to_s,"States Plus",false,st.icon_index])

et aussi

Script 'Damage popup' line 270: NoMethodError occured.
                                               undefine method 'push' for nil:NilClass

Ca corresponde à cette ligne: self.damage.push([@result.hp_damage,"HP",@result.critical]) if item.damage.to_hp? or @result.hp_damage != 0

Edit: Sous certaines conditions je n'ai pas de crash du jeu avec ce script. Le combat se déroule normalement. Donc je pense que c'est un problème de traduction de certains termes.

J'ai intégré tout les trucs du projet de moghunter qui  présente ces deux script mais rien y fait je ne trouve pas la solution. Merci à vous de m'aider. Je vous ferai pleins de bisous si vous trouver une solution!
avatar
kurdtkobane
Membre

Nombre de messages : 43
Age : 32
Localisation : Dans mes rêves
Distinction : aucune
Date d'inscription : 30/04/2013

Re: Problème de script: Boss HP Meter et Damage popup

le Ven 3 Juil 2015 - 6:09
Bon un petit up pour la journée.....Merci!
avatar
vincent26
Membre

Nombre de messages : 766
Age : 22
Localisation : baume de transit le village paumé
Distinction : aucune
Date d'inscription : 17/08/2010

Re: Problème de script: Boss HP Meter et Damage popup

le Ven 3 Juil 2015 - 10:59
Regarde dans tes script si un des script utilise Game_System et réassigne la def initialize
de même pour Game_CharacterBase

il doit y avoir des conflit dans tes script

Sinon essaye de faire une démo avec juste une carte et pas de ressource graphique ny sonore (le plus leger possible quoi) et envoie la moi Wink

avatar
kurdtkobane
Membre

Nombre de messages : 43
Age : 32
Localisation : Dans mes rêves
Distinction : aucune
Date d'inscription : 30/04/2013

Re: Problème de script: Boss HP Meter et Damage popup

le Dim 5 Juil 2015 - 17:25
Alors mon petit Vincent désolé de pas avoir répondu plus tôt mais j'essaie de pas mourir de chaud....(lol)
J'ai pas bien compris ta solution? J'ai bien un script qui utilise le Game_CharactereBase (le Victor Basic Engine) et j'ai pas vérifié si d'autres les utiliser.
Je sais que le script des damage popup est lié à un conflit de terme non traduit...faut juste que je détermine pour quel état est lié les crash.
Merci de ton aide!
Contenu sponsorisé

Re: Problème de script: Boss HP Meter et Damage popup

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum