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
661 이동 및 탈것 Super Simple Vehicle System Enhanced 8.0 by DerVVulfman 1 Alkaid 2010.12.12 1956
660 변수/스위치 Switchless Common Events by PK8(XP/VX/VXA) Alkaid 2012.09.15 1199
659 메뉴 Tales Of Symphonia Menu 8 file 백호 2009.02.21 1744
658 기타 Tax Script 1.2 by The Darklord@rmxp.org 2 file 백호 2009.02.22 1130
657 메시지 Taylor's Simple Message System 2000 Alkaid 2020.07.05 241
656 기타 Terrain Encounter Areas by SephirothSpawn 백호 2009.02.22 778
655 기타 Tetris Attack by trickster 1 file 백호 2009.02.22 986
654 기타 Text Scroll by Dubealex (Release 3) 2 file 백호 2009.02.22 939
653 기타 Text to RGSS by DerVVulfman Alkaid 2011.04.18 1319
652 영상 The AVI Player 1.3 by DerVVulfman 3 Alkaid 2010.10.08 1706
651 기타 The General Monster Generator 1.1 by DerVVulfman 1 file Alkaid 2011.03.02 1496
650 전투 The Lycan ABS by DerVVulfman Alkaid 2013.07.22 1895
649 변수/스위치 The Self Data Suite by PK8 (XP/VX/VXA) Alkaid 2012.09.14 1232
648 기타 Trailing Characters ver.1 by SephirothSpawn 6 file 백호 2009.02.22 1551
647 그래픽 Transition Pack 1.11 by Fantasist Alkaid 2011.01.22 2043
646 스킬 Trickster's Bag of Skill Effects file 백호 2009.02.22 1077
645 스킬 Trickster's Bag of Skill Effects (SDK 필요) Alkaid 2012.09.17 1289
644 이동 및 탈것 Trickster's Caterpillar System 0.99 3 Alkaid 2010.12.23 1590
643 메뉴 Trickster's Plug 'n' Play Gradient Bar 2.0 1 file 백호 2009.02.22 2051
642 전투 Trickster씨의 전투 시스템 (SDK 필수?) Alkaid 2012.09.18 3256
Board Pagination Prev 1 ... 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ... 52 Next
/ 52