#-------------------------------------------------------------------------------
# Muestra y anima un número de daño o curación sobre el Pokémon
# Creado por TOSKAN
#-------------------------------------------------------------------------------


class PokeBattle_Scene
  alias tkHPChanged pbHPChanged
  def pbHPChanged(pkmn, oldhp, anim=false)
    tkHPChanged(pkmn, oldhp, anim)
    hpchange = pkmn.hp - oldhp
    hpchange = -hpchange if hpchange < 0
    tkShowDamageNumber(pkmn, oldhp, @battle.doublebattle, hpchange)  # CORREGIDO: Ahora son 4 argumentos
  end

  def tkShowDamageNumber(pkmn, oldhp, doublebattle=false, totalDamage=0)
    return nil if totalDamage == 0
    showDamageNumberActivated = true 
    return nil unless showDamageNumberActivated
    
    # Calcula cantidad y signo
    amount  = pkmn.hp - oldhp
    gainsHp = (amount > 0)
    amount  = totalDamage if totalDamage != 0
    #amt     = amount.abs
    text    = sprintf("%s%d", (gainsHp ? "+" : "-"), amount)

    duration_frames = (1 * Graphics.frame_rate).to_i
    
    # Coordenadas de la base del battler
    if doublebattle
      cx, cy = case pkmn.index
        when 0 then [PokeBattle_SceneConstants::PLAYERBATTLERD1_X, PokeBattle_SceneConstants::PLAYERBATTLERD1_Y]
        when 1 then [PokeBattle_SceneConstants::FOEBATTLERD1_X,    PokeBattle_SceneConstants::FOEBATTLERD1_Y]
        when 2 then [PokeBattle_SceneConstants::PLAYERBATTLERD2_X, PokeBattle_SceneConstants::PLAYERBATTLERD2_Y]
        when 3 then [PokeBattle_SceneConstants::FOEBATTLERD2_X,    PokeBattle_SceneConstants::FOEBATTLERD2_Y]
      end
    else
      cx, cy = PokeBattle_SceneConstants::FOEBATTLER_X, PokeBattle_SceneConstants::FOEBATTLER_Y
      cx, cy = PokeBattle_SceneConstants::PLAYERBATTLER_X, PokeBattle_SceneConstants::PLAYERBATTLER_Y if pkmn.index == 0
    end
    
    # Ajuste vertical para ponerlo sobre la cabeza
    poke_s   = @sprites["pokemon#{pkmn.index}"]
    sprite_h = poke_s.bitmap.height
    x0       = cx
    y0       = cy - sprite_h/2 - sprite_h/10
    y0       = 40 if y0 < 40   # nunca por debajo de 40px
  
    vp     = Viewport.new(0,0,Graphics.width,Graphics.height)
    vp.z   = 99999
    margin = 6
    temp_bmp = Bitmap.new(1,1)
    pbSetSmallFont(temp_bmp)
    tw = temp_bmp.text_size(text).width
    th = temp_bmp.text_size(text).height
    temp_bmp.dispose
    
    bmpw   = tw + margin*2
    bmph   = th + margin*2
    
    sprite = BitmapSprite.new(bmpw,bmph,vp)
    sprite.z  = vp.z+1
    sprite.ox = bmpw/2
    sprite.oy = bmph/2
    sprite.x  = x0
    sprite.y  = y0
    
    sprite.zoom_x = 1.5
    sprite.zoom_y = 1.5
    
    base_color = Color.new(231, 76, 60)
    base_color = Color.new(0,204,35) if gainsHp # Curación
    crit_color = Color.new(255,200,195)
    border_color = Color.new(255,255,255)
    
    # Configurar fuente
    pbSetSmallFont(sprite.bitmap)
    pbDrawOutlineText(sprite.bitmap, margin, margin, tw, th, text, base_color, border_color, 1)
    
    # ¿Es crítico?
    is_critical   = pkmn.damagestate.critical rescue false
    flash_interval = 8  # cada 8 frames cambia de color
    shake_amount = 6    # amplitud en px
    shake_osc    = 8    # número de oscilaciones completas
    
    duration_frames.times do |i|
      t = i.to_f / duration_frames
      # EASING para la subida (ease-out-quad)
      ease = 1 - (1 - t)**2
      sprite.y       = (y0 - 16 * ease).to_i
      sprite.opacity = (255 * (1 - t)).to_i

      # SHAKE crítico suave
      if is_critical && !gainsHp
        # t va de 0->1, queremos shake_osc oscilaciones -> fase = t*2π*shake_osc
        offset = shake_amount * Math.sin(t * 1.2 * Math::PI * shake_osc)
        sprite.x = (x0 + offset).to_i
        # repinta color crítico si quieres:
        col = ((i / flash_interval).even?) ? crit_color : base_color
        sprite.bitmap.clear
        pbDrawOutlineText(sprite.bitmap, margin, margin, tw, th, text, col, border_color, 1)
      end
      
      pbGraphicsUpdate
      pbInputUpdate
      pbFrameUpdate
    end
  
    sprite.dispose
    vp.dispose
  end

end