기타

[kcg] 슬립 데미지 상세화

by BoneheadedAlien posted Feb 22, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ 슬립 데미지 확장 - KGC_SlipDamageExtension ◆ VX ◆
#_/    ◇ Last update : 2008/03/29 ◇
#_/----------------------------------------------------------------------------
#_/  슬립 데미지의 설정을 상세화합니다.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#스테이트의 메모란에,<スリップ [HP|MP] n[%] [,n]> (을)를 추가합니다.
#[HP|MP]의 부분은,HP 또는 MP 의 어느 쪽을 대상으로 하는지를 기술합니다.
#생략 했을 경우는 HP로 됩니다.

#1번째의n에는, 턴 마다의 회복·데미지량을 기술합니다.
#지정한 값이 정의 경우는 회복, 부의 경우는 데미지로서 다루어집니다.
#% (을)를 붙였을 경우는 최대 HP or MP 에 대한 비율이 됩니다.

#2번째의n에는, 맵상에서 1보 걸었을 때의 회복·데미지량을 기술합니다.
#이쪽은 % (을)를 붙일 수 없습니다.

#==============================================================================
# ★ カスタマイズ項目 - Customize ★
#==============================================================================

module KGC
module SlipDamageExtension
  # ◆ 歩行ダメージ時のフラッシュ色
  DAMAGE_FLASH_COLOR    = Color.new(255, 0, 0, 64)
  # ◆ 歩行ダメージ時のフラッシュ時間 (フレーム)
  DAMAGE_FLASH_DURATION = 4
end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

$imported = {} if $imported == nil
$imported["SlipDamageExtension"] = true

module KGC::SlipDamageExtension
  # 正規表現
  module Regexp
    # ステート
    module State
      # スリップダメージ
      SLIP_DAMAGE = /<(?:SLIP|スリップ)s*([HM]P)?s*([-+]?d+)([%%])?
        (?:s*,s*([-+]?d+))?>/ix
    end
  end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::State
#==============================================================================

class RPG::State
  #--------------------------------------------------------------------------
  # ○ 「スリップダメージ拡張」のキャッシュ生成
  #--------------------------------------------------------------------------
  def create_slip_damage_extension_cache
    @__slip_damage = false
    @__slip_damage_hp_rate  = 0
    @__slip_damage_hp_value = 0
    @__slip_damage_hp_map   = 0
    @__slip_damage_mp_rate  = 0
    @__slip_damage_mp_value = 0
    @__slip_damage_mp_map   = 0

    self.note.split(/[rn]+/).each { |line|
      case line
      when KGC::SlipDamageExtension::Regexp::State::SLIP_DAMAGE
        # スリップダメージ
        @__slip_damage = true
        analyse_slip_damage($~)
      end
    }

    # デフォルトのスリップダメージ量を設定
    unless @__slip_damage
      @__slip_damage_hp_rate = 10
      @__slip_damage_hp_map = 1
    end
  end
  #--------------------------------------------------------------------------
  # ○ スリップダメージの解析
  #--------------------------------------------------------------------------
  def analyse_slip_damage(match)
    # タイプ判定
    if match[1] == nil
      type = :hp
    else
      if match[1] =~ /MP/i
        type = :mp
      else
        type = :hp
      end
    end
    # ダメージ量取得
    n = match[2].to_i
    # 即値 or 割合判定
    is_rate = (match[3] != nil)
    # マップダメージ取得
    map_n = (match[4] != nil ? match[4].to_i : 0)

    # スリップダメージ値加算
    case type
    when :hp
      if is_rate
        @__slip_damage_hp_rate -= n
      else
        @__slip_damage_hp_value -= n
      end
      @__slip_damage_hp_map -= map_n
    when :mp
      if is_rate
        @__slip_damage_mp_rate -= n
      else
        @__slip_damage_mp_value -= n
      end
      @__slip_damage_mp_map -= map_n
    end
  end
  #--------------------------------------------------------------------------
  # ● スリップダメージ
  #--------------------------------------------------------------------------
  unless $@
    alias slip_damage_KGC_SlipDamageExtension slip_damage
  end
  def slip_damage
    create_slip_damage_extension_cache if @__slip_damage == nil
    return (@__slip_damage || slip_damage_KGC_SlipDamageExtension)
  end
  #--------------------------------------------------------------------------
  # ○ HP スリップダメージ (割合)
  #--------------------------------------------------------------------------
  def slip_damage_hp_rate
    create_slip_damage_extension_cache if @__slip_damage_hp_rate == nil
    return @__slip_damage_hp_rate
  end
  #--------------------------------------------------------------------------
  # ○ HP スリップダメージ (即値)
  #--------------------------------------------------------------------------
  def slip_damage_hp_value
    create_slip_damage_extension_cache if @__slip_damage_hp_value == nil
    return @__slip_damage_hp_value
  end
  #--------------------------------------------------------------------------
  # ○ HP スリップダメージ (マップ)
  #--------------------------------------------------------------------------
  def slip_damage_hp_map
    create_slip_damage_extension_cache if @__slip_damage_hp_map == nil
    return @__slip_damage_hp_map
  end
  #--------------------------------------------------------------------------
  # ○ MP スリップダメージ (割合)
  #--------------------------------------------------------------------------
  def slip_damage_mp_rate
    create_slip_damage_extension_cache if @__slip_damage_mp_rate == nil
    return @__slip_damage_mp_rate
  end
  #--------------------------------------------------------------------------
  # ○ MP スリップダメージ (即値)
  #--------------------------------------------------------------------------
  def slip_damage_mp_value
    create_slip_damage_extension_cache if @__slip_damage_mp_value == nil
    return @__slip_damage_mp_value
  end
  #--------------------------------------------------------------------------
  # ○ MP スリップダメージ (マップ)
  #--------------------------------------------------------------------------
  def slip_damage_mp_map
    create_slip_damage_extension_cache if @__slip_damage_mp_map == nil
    return @__slip_damage_mp_map
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ● スリップダメージの効果適用
  #--------------------------------------------------------------------------
  def slip_damage_effect
    return unless slip_damage?

    slip_damage_effect_hp
    slip_damage_effect_mp
  end
  #--------------------------------------------------------------------------
  # ○ HP スリップダメージの効果適用
  #--------------------------------------------------------------------------
  def slip_damage_effect_hp
    return if dead?

    n = 0
    self.states.each { |state|
      next unless state.slip_damage
      n += self.maxhp * state.slip_damage_hp_rate / 100
      n += state.slip_damage_hp_value
    }
    return if n == 0

    @hp_damage = [n, self.hp - 1].min
    self.hp -= @hp_damage
  end
  #--------------------------------------------------------------------------
  # ○ MP スリップダメージの効果適用
  #--------------------------------------------------------------------------
  def slip_damage_effect_mp
    return if dead?

    n = 0
    self.states.each { |state|
      next unless state.slip_damage
      n += self.maxmp * state.slip_damage_mp_rate / 100
      n += state.slip_damage_mp_value
    }
    return if n == 0

    @mp_damage = [n, self.mp - 1].min
    self.mp -= @mp_damage
  end
  #--------------------------------------------------------------------------
  # ○ 歩行時のスリップダメージの効果適用
  #--------------------------------------------------------------------------
  def slip_damage_effect_on_walk
    last_hp = self.hp
    last_mp = self.mp
    self.states.each { |state|
      next unless state.slip_damage
      self.hp -= state.slip_damage_hp_map
      self.mp -= state.slip_damage_mp_map
    }
    # ダメージを受けた場合はフラッシュ
    if self.hp < last_hp || self.mp < last_mp
      $game_map.screen.start_flash(
        KGC::SlipDamageExtension::DAMAGE_FLASH_COLOR,
        KGC::SlipDamageExtension::DAMAGE_FLASH_DURATION)
    end
  end
  #--------------------------------------------------------------------------
  # ○ 歩行時の自動回復の実行
  #--------------------------------------------------------------------------
  def do_auto_recovery_on_walk
    return if dead?

    if auto_hp_recover
      self.hp += 1
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Party
#==============================================================================

class Game_Party < Game_Unit
  #--------------------------------------------------------------------------
  # ● プレイヤーが 1 歩動いたときの処理
  #--------------------------------------------------------------------------
  def on_player_walk
    for actor in members
      if actor.slip_damage?
        actor.slip_damage_effect_on_walk
      end
      actor.do_auto_recovery_on_walk
    end
  end
end