- kurdtkobaneMembre
- Nombre de messages : 43
Age : 38
Localisation : Dans mes rêves
Distinction : aucune
Date d'inscription : 30/04/2013
Problème de script: Boss HP Meter et Damage popup
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!
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!
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!
- kurdtkobaneMembre
- Nombre de messages : 43
Age : 38
Localisation : Dans mes rêves
Distinction : aucune
Date d'inscription : 30/04/2013
Re: Problème de script: Boss HP Meter et Damage popup
Mer 1 Juil 2015 - 7:31
Le deuxième script est sur le script de MogHunter Damage popup
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!
- 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!
- kurdtkobaneMembre
- Nombre de messages : 43
Age : 38
Localisation : Dans mes rêves
Distinction : aucune
Date d'inscription : 30/04/2013
Re: Problème de script: Boss HP Meter et Damage popup
Ven 3 Juil 2015 - 6:09
Bon un petit up pour la journée.....Merci!
- vincent26Membre
- Nombre de messages : 766
Age : 28
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
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
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
- kurdtkobaneMembre
- Nombre de messages : 43
Age : 38
Localisation : Dans mes rêves
Distinction : aucune
Date d'inscription : 30/04/2013
Re: Problème de script: Boss HP Meter et Damage popup
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!
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!
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|