XP 스크립트

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ オーバードライブ - KGC_OverDrive ◆
#_/    ◇ Last update : 2007/09/08 ◇
#_/----------------------------------------------------------------------------
#_/  専用のゲージがMAXになったときのみ使用可能になるスキルを作成します。
#_/============================================================================
#_/  ≪SP消費改造[SPCostAlter]≫より下
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

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

module KGC
  # ◆OverDriveゲージ最大値
  #  (通常はこのままでOK。どうしてもバランスがおかしくなる場合のみ変更)
  OD_GAUGE_MAX = 1000
  # ◆OverDriveゲージ増加率
  #  増加率が高いほどゲージが溜まりやすい。
  #  順番(INDEX)および条件は以下の通り。
  # 【0..攻撃  1..被ダメージ  2..勝利  3..逃走  4..孤独  5..行動  6..瀕死】
  #  ↑これらのINDEXは、アクターのドライブタイプと対応。
  #  0,1 は、ダメージ量に応じて増加量が変動。
  OD_GAIN_RATE = [10, 30, 200, 100, 160, 40, 160]

  # ◆死亡(HP 0)時にOverDriveゲージを 0 にする
  OD_EMPTY_ON_DEAD = true

  # ◆OverDriveゲージを表示しないアクター
  #  ゲージを隠すアクターのIDを配列に格納。
  OD_GAUGE_HIDE_ACTOR = []

  # ◆OverDriveゲージを斜めにする
  OD_GAUGE_SLANT = true
  # ◆非戦闘時OverDriveゲージ位置 [x, y]
  #  大きいほど名前から離れた位置に描画。
  OD_GAUGE_OFF        = [0, 26]
  # ◆戦闘時OverDriveゲージ位置 [x, y]
  OD_GAUGE_OFF_BATTLE = [0, 26]
  # ◆非戦闘時はゲージを隠す
  OD_GAUGE_HIDE_NOT_IN_BATTLE = false
end

class Window_Base < Window
  # ◆OverDriveゲージ画像
  @@_od_gauge = RPG::Cache.picture("od_gauge.png")
end

#### OD_GAUGE_MAX
### Over-drive gauge maximum.

####OD_GAIN_RATE
### Over-drive gauge gain rate.
#  Order(index) and conditions are as follows:
#  << 0..Attack  1..Damage  2..Victory  3..Escape  4..Alone
#     5..Action  6..Fatal >>
#  The accumulation speed of '0' and '1' changes by amount of damage.
#  The higher rate is, the faster overdrive gauge accumulates.


#### OD_EMPTY_ON_DEAD
### Empties over-drive gauge when actor die.


#### OD_GAUGE_HIDE_ACTOR
### Actor who hide own over-drive gauge.
#  Puts actor's IDs whose gauge are hidden in the array.


#### OD_GAUGE_SLANT
### Draws over-drive gauge diagonally.

#### OD_GAUGE_OFF
### Over-drive gauge position. [x, y] (not in battle)

#### OD_GAUGE_OFF_BATTLE
### Over-drive gauge position in battle. [x, y]

#### OD_GAUGE_HIDE_NOT_IN_BATTLE
### Hides over-drive gauge. (not in battle)


#### @@_od_gauge
### Image of over-drive gauge.

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

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

if $game_special_elements == nil
  $game_special_elements = {}
  $data_system = load_data("Data/System.rxdata")
end
# OverDrive属性 - Element of OverDrive.
$game_special_elements["overdrive"] =
  $data_system.elements.index("オーバードライブ")
if $game_special_elements["overdrive"] == nil
  $game_special_elements["overdrive"] = $data_system.elements.index("OverDrive")
end

# OD条件
module ODType
  ATTACK  = 0
  DAMAGE  = 1
  VICTORY = 2
  ESCAPE  = 3
  ALONE   = 4
  ACTION  = 5
  FATAL   = 6
end

#==============================================================================
# ■ Game_Battler (分割定義 3)
#==============================================================================

class Game_Battler
  attr_accessor :base_damage
  #--------------------------------------------------------------------------
  # ● 通常攻撃の効果適用
  #--------------------------------------------------------------------------
  alias attack_effect_KGC_OverDrive attack_effect
  def attack_effect(attacker)
    @base_damage = nil

    result = attack_effect_KGC_OverDrive(attacker)

    if @base_damage == nil
      # 基本ダメージ値を保存
      @base_damage = [attacker.atk - self.pdef / 2, 0].max *
        (20 + attacker.str) / 20
    end
    # ダメージを受けた場合
    if result && self.damage.is_a?(Numeric)
      overdrive_increase(attacker)
    end
    return result
  end
  #--------------------------------------------------------------------------
  # ● ODゲージ増加処理
  #--------------------------------------------------------------------------
  def overdrive_increase(attacker)
    # 攻撃時増加判定
    if attacker.is_a?(Game_Actor) && self.is_a?(Game_Enemy) &&
        attacker.overdrive_type.include?(ODType::ATTACK) &&
        self.base_damage > 0
      od_up = self.damage * KGC::OD_GAIN_RATE[ODType::ATTACK] * 10 / self.base_damage
      attacker.overdrive += [[od_up, 1].max, 160].min
    # 被ダメージ時増加判定
    elsif attacker.is_a?(Game_Enemy) && self.is_a?(Game_Actor) &&
        self.overdrive_type.include?(ODType::DAMAGE) &&
        self.base_damage > 0
      od_up = self.damage * KGC::OD_GAIN_RATE[ODType::DAMAGE] * 10 / self.maxhp
      self.overdrive += [od_up, 1].max
    end
    # 死亡判定
    if KGC::OD_EMPTY_ON_DEAD && self.is_a?(Game_Actor) && self.dead?
      self.overdrive = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #--------------------------------------------------------------------------
  alias skill_effect_KGC_OverDrive skill_effect
  def skill_effect(user, skill)
    @base_damage = nil

    result = skill_effect_KGC_OverDrive(user, skill)

    if @base_damage == nil
      # 威力を計算
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # 倍率を計算
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      # 基本ダメージを保存
      @base_damage = power * rate / 20
    end
    # ダメージを受けた場合
    if result && self.damage.is_a?(Numeric)
      overdrive_increase(user)
    end
    # オーバードライブスキルを使用した場合
    if user.is_a?(Game_Actor) &&
        skill.element_set.include?($game_special_elements["overdrive"])
      user.overdrive = 0
    end
    return result
  end
end

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

#==============================================================================
# ■ Game_Actor
#==============================================================================

KGC_Game_Actor_first = "OverDrive" unless defined?(KGC_Game_Actor)

module KGC_Game_Actor
  #--------------------------------------------------------------------------
  # ● スキルの使用可能判定
  #--------------------------------------------------------------------------
  if defined?(skill_can_use?) && !@_skill_can_use_overdrive
    alias skill_can_use_KGC_OverDrive skill_can_use?
  else
    @_skill_can_use_overdrive = true
  end
  def skill_can_use?(skill_id)
    result = true
    skill = $data_skills[skill_id]
    if skill != nil &&
        skill.element_set.include?($game_special_elements["overdrive"])
      result = self.overdrive == KGC::OD_GAUGE_MAX
    end
    if defined?(skill_can_use_KGC_OverDrive)
      return result & skill_can_use_KGC_OverDrive(skill_id)
    else
      return result & super
    end
  end
  module_function :skill_can_use?
  public :skill_can_use?
end

class Game_Actor < Game_Battler
  include KGC_Game_Actor

  attr_writer :overdrive_type
  #--------------------------------------------------------------------------
  # ● セットアップ
  #--------------------------------------------------------------------------
  alias setup_KGC_OverDrive setup
  def setup(actor_id)
    setup_KGC_OverDrive(actor_id)

    @overdrive = 0
    @overdrive_type = [0]
  end
  #--------------------------------------------------------------------------
  # ● OverDriveゲージの取得
  #--------------------------------------------------------------------------
  def overdrive
    @overdrive = 0 if @overdrive == nil
    return @overdrive
  end
  #--------------------------------------------------------------------------
  # ● OverDriveゲージの操作
  #--------------------------------------------------------------------------
  def overdrive=(value)
    @overdrive = [[value, 0].max, KGC::OD_GAUGE_MAX].min
  end
  #--------------------------------------------------------------------------
  # ● OverDriveタイプの取得
  #--------------------------------------------------------------------------
  def overdrive_type
    @overdrive_type = [0] if !@overdrive_type.is_a?(Array)
    return @overdrive_type
  end
end

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

#==============================================================================
# ■ Window_Base
#==============================================================================

class Window_Base < Window
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_KGC_OverDrive_Base initialize
  def initialize(x, y, width, height)
    @od_gauge = @@_od_gauge
    @od_g_width = @od_gauge.width / 3
    @od_g_height = (@od_gauge.height - 2) / 3

    initialize_KGC_OverDrive_Base(x, y, width, height)
  end
  #--------------------------------------------------------------------------
  # ● ゲージ画像(マスター)を取得
  #--------------------------------------------------------------------------
  def _od_gauge
    return @@_od_gauge
  end
  #--------------------------------------------------------------------------
  # ● ゲージ画像(マスター)を設定
  #--------------------------------------------------------------------------
  def _od_gauge=(new_bitmap)
    @@_od_gauge.dispose
    @@_od_gauge = new_bitmap
  end
  #--------------------------------------------------------------------------
  # ● ゲージ画像を取得
  #--------------------------------------------------------------------------
  def od_gauge
    return @od_gauge
  end
  #--------------------------------------------------------------------------
  # ● ゲージ画像を設定
  #--------------------------------------------------------------------------
  def od_gauge=(new_bitmap)
    @od_gauge = new_bitmap
  end
  #--------------------------------------------------------------------------
  # ● 名前の描画
  #--------------------------------------------------------------------------
  alias draw_actor_name_KGC_OverDrive draw_actor_name
  def draw_actor_name(actor, x, y)
    if !$game_temp.in_battle && !KGC::OD_GAUGE_HIDE_NOT_IN_BATTLE
      draw_actor_od_gauge(actor, x, y, 120)
    end

    draw_actor_name_KGC_OverDrive(actor, x, y)
  end
  #--------------------------------------------------------------------------
  # ● OverDrive ゲージの描画
  #--------------------------------------------------------------------------
  def draw_actor_od_gauge(actor, x, y, width)
    return if KGC::OD_GAUGE_HIDE_ACTOR.include?(actor.id)
    # ゲージ幅計算
    dx = dy = gw = 0
    maximum = false
    if $game_temp.in_battle && self.is_a?(Window_BattleStatus)
      @gs_od[actor.index] = actor.overdrive if @gs_od[actor.index] == nil
      begin
        dx = actor.battle_status_x - @od_g_width + 52
      rescue
        dx = actor.index * 160 + 4
      end
      #dx += -@od_g_width + 52
      dy = y
      dx -= 16 if $imported["HPSPAlter"] && !KGC::HPSP_DRAW_NAME_LUMP
      gw = @gs_od[actor.index] * @od_g_width / KGC::OD_GAUGE_MAX
      maximum = (@gs_od[actor.index] == KGC::OD_GAUGE_MAX)
    else
      @gauge_x = 0
      dx = x + width - @od_g_width - 13
      dy = y
      gw = actor.overdrive * @od_g_width / KGC::OD_GAUGE_MAX
      maximum = (actor.overdrive == KGC::OD_GAUGE_MAX)
    end
    dx += ($game_temp.in_battle ? KGC::OD_GAUGE_OFF_BATTLE[0] :
      KGC::OD_GAUGE_OFF[0])
    dy += ($game_temp.in_battle ? KGC::OD_GAUGE_OFF_BATTLE[1] :
      KGC::OD_GAUGE_OFF[1])
    # 斜め描画
    if KGC::OD_GAUGE_SLANT
      self.contents.fill_rect(dx, dy, @od_g_width + 7, 6, Color.new(0, 0, 0, 0))
      # 枠描画
      gy = @od_g_height + 1
      (@od_g_height + 2).times { |i|
        self.contents.blt(dx + i, dy + gy - i, @od_gauge,
          Rect.new(0, gy - i, @od_g_width + 2, 1))
      }
      # 本体描画
      gy -= 1
      gy2 = @od_g_height * (maximum ? 3 : 2) + 1
      @od_g_height.times { |i|
        self.contents.blt(dx + i + 2, dy + gy - i, @od_gauge,
          Rect.new(@gauge_x, gy2 - i, gw, 1))
      }
    # 通常描画
    else
      self.contents.fill_rect(dx, dy, @od_g_width + 2, @od_g_height + 2,
        Color.new(0, 0, 0, 0))
      self.contents.blt(dx, dy, @od_gauge, Rect.new(0, 0, @od_g_width + 2,
        @od_g_height + 2))
      gy2 = @od_g_height * (maximum ? 2 : 1) + 2
      self.contents.blt(dx + 1, dy + 1, @od_gauge,
        Rect.new(@gauge_x, gy2, gw, @od_g_height))
    end
  end
end

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

#==============================================================================
# ■ Window_BattleStatus
#==============================================================================

class Window_BattleStatus < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_KGC_OverDrive initialize
  def initialize
    @gauge_x = 0
    @gs_od = []
    @od_g_width = @@_od_gauge.width / 3
    @od_g_height = (@@_od_gauge.height - 2) / 3

    initialize_KGC_OverDrive
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  alias refresh_KGC_OverDrive refresh
  def refresh
    refresh_KGC_OverDrive

    $game_party.actors.each_with_index { |actor, i|
      @gs_od[i] = actor.overdrive
      draw_actor_od_gauge(actor, 0, 0, 120)
    }
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_KGC_OverDrive update
  def update
    update_KGC_OverDrive

    # ゲージ画像を流す
    unless $imported["HPSPAlter"]
      @gauge_x -= [@od_g_width / 20, 1].max
      @gauge_x = @od_g_width * 2 if @gauge_x < 0
    end
    $game_party.actors.each { |actor|
      draw_actor_od_gauge(actor, 0, 0, 120)
    }
  end
end

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

#==============================================================================
# ■ Scene_Battle (分割定義 1)
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● バトル終了
  #     result : 結果 (0:勝利 1:逃走 2:敗北)
  #--------------------------------------------------------------------------
  alias battle_end_KGC_OverDrive battle_end
  def battle_end(result)
    case result
    when 0  # 勝利
      $game_party.actors.each { |actor|
        # ドライブタイプが「勝利」の場合は加算
        if actor.exist? && actor.overdrive_type.include?(ODType::VICTORY)
          actor.overdrive += KGC::OD_GAIN_RATE[ODType::VICTORY]
        end
      }
    when 1  # 逃走
      $game_party.actors.each { |actor|
        # ドライブタイプが「逃走」の場合は加算
        if actor.exist? && actor.overdrive_type.include?(ODType::ESCAPE)
          actor.overdrive += KGC::OD_GAIN_RATE[ODType::ESCAPE]
        end
      }
    end

    battle_end_KGC_OverDrive(result)
  end
end

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

#==============================================================================
# ■ Scene_Battle (分割定義 4)
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  #--------------------------------------------------------------------------
  alias update_phase4_step2_KGC_OverDrive update_phase4_step2
  def update_phase4_step2
    if @active_battler.is_a?(Game_Actor)
      overdrive_increase(@active_battler, $game_party.actors)
    end

    update_phase4_step2_KGC_OverDrive
  end
  #--------------------------------------------------------------------------
  # ● ODゲージ増加処理
  #--------------------------------------------------------------------------
  def overdrive_increase(battler, battler_list)
    od_gain = 0
    # ゲージ増加判定
    type = battler.overdrive_type
    if type.include?(ODType::ALONE)  # 孤独戦闘
      alone = true
      battler_list.each { |b|
        # 生存者がいる場合は孤独ではない
        if !b.equal?(battler) && b.exist?
          alone = false
          break
        end
      }
      if alone
        od_gain += KGC::OD_GAIN_RATE[ODType::ALONE]
      end
    end
    if type.include?(ODType::ACTION)  # 行動時
      od_gain += KGC::OD_GAIN_RATE[ODType::ACTION]
    end
    if type.include?(ODType::FATAL)  # 瀕死
      if battler.hp <= battler.maxhp / 4
        od_gain += KGC::OD_GAIN_RATE[ODType::FATAL]
      end
    end
    battler.overdrive += od_gain
  end
end
--------

OD_GAUGE_MAX = 1000 오버드라이브 양조절
첨부파일 od_gauge.png를 Graphics->Pictures에 넣으세요
데이터베이스 시스템 속성에 속성한개만들고 이름을 OverDrive

jpg보세용

Comment '8'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6153
174 전투 사이드뷰 배틀 (2003 형식으 전투)| 12 file 아방스 2007.11.09 4744
173 전투 SBABS 버전3.2 - 액알 스크립트 시스템 설명 13 아방스 2007.11.09 5685
172 전투 Blizz-ABS 1.95 27 아방스 2008.03.05 4028
171 전투 ATB전투 형식 스크랩트 [ 어디서 퍼왔는..] 7 WMN 2008.03.17 2545
170 전투 전투불능 케릭터 강제삭제 7 독도2005 2008.10.05 1918
169 전투 xas히어로에디션 3.4 14 ps인간 2009.01.04 4044
168 전투 캐릭터고르기스크립트? ps인간 2009.01.23 3263
» 전투 오버드라이브 8 file 키라링 2009.01.23 2193
166 전투 GTBS 1.4 스크립트 9 아방스 2009.02.05 3028
165 전투 Minkoff's Animated Battler Enhanced 11.2 by DerVVulfman 1 쉴더 2009.02.21 1483
164 전투 적 한계 HP수치 돌파 스크립트 ■ RPGモジュール 3 쉴더 2009.02.21 1783
163 전투 데미지 표시 개조 8 file 백호 2009.02.21 2532
162 전투 버틀러 색조 변경 5 file 백호 2009.02.21 1552
161 전투 전투 카메라 스크립트 5 file 백호 2009.02.21 2454
160 전투 전투 결과 화면 개조 스크립트 10 file 백호 2009.02.21 2496
159 전투 전투 난이도 설정 스크립트 file 백호 2009.02.21 1441
158 전투 캐릭터가 착용한 무기에 따라 배틀러 무기도 바꿔주는 스크립트 6 file 백호 2009.02.21 2518
157 전투 숙력도 시스템 스크립트 2 백호 2009.02.21 1408
156 전투 추적 공격 스크립트 백호 2009.02.21 1459
155 전투 엑터, 에너미 개별적인 효과음 스크립트 1 백호 2009.02.21 1292
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9