Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

RTAB Add-On: Skills that Consume Items v 1.00a

Skills that Consume Items
Ver 1.00a*
Original version found at http://members.jcom.home.ne.jp/cogwheel/
NOT by DerVVulfman
v 1.00a due to my correction for 'inconsumable' items.



Introduction
Originally posted in japanese, this is a translation of a script addition that allows you (the creator) to design spells that use (or consume) items as well as SP.

Features
  • Can specify 1 or more different items needed per spell
  • Can set it so multple quantities (potion x6) needed
  • Skills show as disabled if not enough items available for use
  • FIXED: so items that are NOT consumable (talismans) not consumed


Screenshots
None. Just looks like a regular Skill selection screen.

Demo
CLICK HERE (V 1.16)

Based on...
Real Time Active Battle (RTAB)

... and with these add-on modules...
Officially Created Add-Ons: (from the creator of RTAB)
Connected Attacking v 1.03
Cooperative Skills Ver 1.02
Remodeled Damage Display v 1.02a
Skill Casting Time Counter v 1.00
Skill Learning v 1.00

Un-Official Add-Ons:
Animated Battlers - Enhanced
BattleStatus Modification (RTAB Version) v 1.1
Cogwheel RTAB Config System by minto
KGC OverDrive v 1.1
Skill Requirements v 1.0 (works with RTAB!)
Stealing, Mugging, and Scanning (RTAB version)
Mimi's Battle Music (I wrote it :D )

Script
In truth, the name was... paraphrased from the original Japanese version. Syntax differences and so on. So, I went with the closest definition.
Code:
# Skills That Consume Items Ver 1.00
# Distribution original support URL
# http://members.jcom.home.ne.jp/cogwheel/

#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
#  This class handles the actor. It's used within the Game_Actors class
#  ($game_actors) and refers to the Game_Party class ($game_party).
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # * Setting of medium
  #--------------------------------------------------------------------------
  def medium(skill_id)
    case $data_skills[skill_id].name
    when "Heal"
      return [["Potion"], ["High Perfume", 2]]
    end
    return false
  end
  #--------------------------------------------------------------------------
  # * Get Item Name
  #--------------------------------------------------------------------------
  def item_name(name)
    for item in $data_items
      if item != nil and name == item.name
        return item.id
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Determine if Skill can be Used
  #     skill_id : skill ID
  #--------------------------------------------------------------------------
  def skill_can_use?(skill_id)
    items = medium(skill_id)
    if items
      for item in items
        id = item_name(item[0])
        if $game_party.item_number(id) < (item[1] == nil ? 1 : item[1])
          return false
        end
      end
    end
    return super
  end
end

#==============================================================================
# ** Scene_Battle (part 4)
#------------------------------------------------------------------------------
#  This class performs battle screen processing.
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Make Skill Action Results
  #--------------------------------------------------------------------------
  def make_skill_action_result(battler)
    # Get skill
    @skill = $data_skills[battler.current_action.skill_id]
    # Verification whether or not it is cooperation skill
    speller = synthe?(battler)
    # If not a forcing action
    unless battler.current_action.forcing
      # When with SP and so on is cut off and it becomes not be able to use
      if speller == nil
        unless battler.skill_can_use?(@skill.id)
          # Shift to step 6
          battler.phase = 6
         return
        end
      end
    end
    # SP consumption
    temp = false
    if speller != nil
      for spell in speller
        if spell.current_action.spell_id == 0
          spell.sp -= @skill.sp_cost
        else
          spell.sp -= $data_skills[spell.current_action.spell_id].sp_cost
        end
      # Refreshing the status window
        status_refresh(spell)
      end
    else
      battler.sp -= @skill.sp_cost
      # Refreshing the status window
      status_refresh(battler)
    end
    # Setting animation ID
    battler.anime1 = @skill.animation1_id
    battler.anime2 = @skill.animation2_id
    # Setting common event ID
    battler.event = @skill.common_event_id
    # Setting the object side battler
    set_target_battlers(@skill.scope, battler)
    # Applying the effect of skill
    for target in battler.target
      if speller != nil
        damage = 0
        effective = false
        state_p = []
        state_m = []
        for spell in speller
          if spell.current_action.spell_id != 0
            @skill = $data_skills[spell.current_action.spell_id]
          end
          effective |= target.skill_effect(spell, @skill)
          if target.damage[spell].class != String
            damage += target.damage[spell]
          elsif effective == true
            effect = target.damage[spell]
          end
          state_p += target.state_p[spell]
          state_m += target.state_m[spell]
          target.damage.delete(spell)
          target.state_p.delete(spell)
          target.state_m.delete(spell)
        end
        if damage != 0
          target.damage[battler] = damage
        elsif effective = true
          target.damage[battler] = effect
        end
        target.state_p[battler] = state_p
        target.state_m[battler] = state_m
      else
        target.skill_effect(battler, @skill)
      end
    end
    # If item(s) are used
    if battler.is_a?(Game_Actor)
      items = battler.medium(@skill.id)
      if items
        for item in items
          id = battler.item_name(item[0])
          num = item[1] == nil ? 1 : item[1]
          # Check if consumable              
          if $data_items[id].consumable
            $game_party.gain_item(id, -num)
          end
        end
      end
    end
  end
end

#==============================================================================
# ** Scene_Skill
#------------------------------------------------------------------------------
#  This class performs skill screen processing.
#==============================================================================

class Scene_Skill
  #--------------------------------------------------------------------------
  # * Frame Update (when target window is active)
  #--------------------------------------------------------------------------
  def update_target
    # If B button was pressed
    
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Erase target window
      @skill_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # If unable to use because SP ran out
      unless @actor.skill_can_use?(@skill.id)
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # If target is all
      if @target_window.index == -1
        # Apply skill use effects to entire party
        used = false
        for i in $game_party.actors
          used |= i.skill_effect(@actor, @skill)
        end
      end
      # If target is user
      if @target_window.index <= -2
        # Apply skill use effects to target actor
        target = $game_party.actors[@target_window.index + 10]
        used = target.skill_effect(@actor, @skill)
      end
      # If single target
      if @target_window.index >= 0
        # Apply skill use effects to target actor
        target = $game_party.actors[@target_window.index]
        used = target.skill_effect(@actor, @skill)
      end
      # If skill was used
      if used
        # If item(s) are used
        if @actor.is_a?(Game_Actor)
          items = @actor.medium(@skill.id)
          if items
            for item in items
              id = @actor.item_name(item[0])
              num = item[1] == nil ? 1 : item[1]
              # Check if consumable              
              if $data_items[id].consumable
                $game_party.gain_item(id, -num)
              end
            end
          end
        end
        # Play skill use SE
        $game_system.se_play(@skill.menu_se)
        # Use up SP
        @actor.sp -= @skill.sp_cost
        # Remake each window content
        @status_window.refresh
        @skill_window.refresh
        @target_window.refresh
        # If entire party is dead
        if $game_party.all_dead?
          # Switch to game over screen
          $scene = Scene_Gameover.new
          return
        end
        # If command event ID is valid
        if @skill.common_event_id > 0
          # Command event call reservation
          $game_temp.common_event_id = @skill.common_event_id
          # Switch to map screen
          $scene = Scene_Map.new
          return
        end
      end
      # If skill wasn't used
      unless used
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end
Code:
# スキル使用時媒体消費 Ver 1.00
# 配布元・サポートURL
# http://members.jcom.home.ne.jp/cogwheel/

#==============================================================================
# â–  Game_Actor
#------------------------------------------------------------------------------
#  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
# の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 媒体の設定
  #--------------------------------------------------------------------------
  def medium(skill_id)
    case $data_skills[skill_id].name
    when "ヒール"
      return [["ポーション"], ["ハイポーション", 2]]
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● アイテム名からアイテムIDへの変換
  #--------------------------------------------------------------------------
  def item_name(name)
    for item in $data_items
      if item != nil and name == item.name
        return item.id
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● スキルの使用可能判定
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  def skill_can_use?(skill_id)
    items = medium(skill_id)
    if items
      for item in items
        id = item_name(item[0])
        if $game_party.item_number(id) < (item[1] == nil ? 1 : item[1])
          return false
        end
      end
    end
    return super
  end
end

#==============================================================================
# ■ Scene_Battle (分割定義 4)
#------------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● スキルアクション 結果作成
  #--------------------------------------------------------------------------
  def make_skill_action_result(battler)
    # スキルを取得
    @skill = $data_skills[battler.current_action.skill_id]
    # 連携スキルであるかどうか確認
    speller = synthe?(battler)
    # 強制アクションでなければ
    unless battler.current_action.forcing
      # SP 切れなどで使用できなくなった場合
      if speller == nil
        unless battler.skill_can_use?(@skill.id)
          # ステップ 6 に移行
          battler.phase = 6
         return
        end
      end
    end
    # SP 消費
    temp = false
    if speller != nil
      for spell in speller
        if spell.current_action.spell_id == 0
          spell.sp -= @skill.sp_cost
        else
          spell.sp -= $data_skills[spell.current_action.spell_id].sp_cost
        end
        # ステータスウィンドウをリフレッシュ
        status_refresh(spell)
      end
    else
      battler.sp -= @skill.sp_cost
      # ステータスウィンドウをリフレッシュ
      status_refresh(battler)
    end
    # アニメーション ID を設定
    battler.anime1 = @skill.animation1_id
    battler.anime2 = @skill.animation2_id
    # コモンイベント ID を設定
    battler.event = @skill.common_event_id
    # 対象側バトラーを設定
    set_target_battlers(@skill.scope, battler)
    # スキルの効果を適用
    for target in battler.target
      if speller != nil
        damage = 0
        effective = false
        state_p = []
        state_m = []
        for spell in speller
          if spell.current_action.spell_id != 0
            @skill = $data_skills[spell.current_action.spell_id]
          end
          effective |= target.skill_effect(spell, @skill)
          if target.damage[spell].class != String
            damage += target.damage[spell]
          elsif effective == true
            effect = target.damage[spell]
          end
          state_p += target.state_p[spell]
          state_m += target.state_m[spell]
          target.damage.delete(spell)
          target.state_p.delete(spell)
          target.state_m.delete(spell)
        end
        if damage != 0
          target.damage[battler] = damage
        elsif effective = true
          target.damage[battler] = effect
        end
        target.state_p[battler] = state_p
        target.state_m[battler] = state_m
      else
        target.skill_effect(battler, @skill)
      end
    end
    # 媒体使用
    if battler.is_a?(Game_Actor)
      items = battler.medium(@skill.id)
      if items
        for item in items
          id = battler.item_name(item[0])
          num = item[1] == nil ? 1 : item[1]
          $game_party.gain_item(id, -num)
        end
      end
    end
  end
end

#==============================================================================
# â–  Scene_Skill
#------------------------------------------------------------------------------
#  スキル画面の処理を行うクラスです。
#==============================================================================

class Scene_Skill
  #--------------------------------------------------------------------------
  # ● フレーム更新 (ターゲットウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_target
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # ターゲットウィンドウを消去
      @skill_window.active = true
      $scene.status_window.index = @actor.index
      $scene.status_window.z = 6100
      $scene.status_window.out_window.z = 6100
      $scene.status_window.active = false
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # SP 切れなどで使用できなくなった場合
      unless @actor.skill_can_use?(@skill.id)
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # ターゲットが全体の場合
      if $scene.status_window.index == -2
        # パーティ全体にスキルの使用効果を適用
        used = false
        for i in $game_party.actors
          used |= i.skill_effect(@actor, @skill)
        end
      end
      # ターゲットが使用者の場合
      if $scene.status_window.index < -2
        # ターゲットのアクターにスキルの使用効果を適用
        target = $game_party.actors[$scene.status_window.index + 10]
        used = target.skill_effect(@actor, @skill)
      end
      # ターゲットが単体の場合
      if $scene.status_window.index >= 0
        # ターゲットのアクターにスキルの使用効果を適用
        target = $game_party.actors[$scene.status_window.index]
        used = target.skill_effect(@actor, @skill)
      end
      # スキルを使った場合
      if used
        # 媒体使用
        if @actor.is_a?(Game_Actor)
          items = @actor.medium(@skill.id)
          if items
            for item in items
              id = @actor.item_name(item[0])
              num = item[1] == nil ? 1 : item[1]
              $game_party.gain_item(id, -num)
            end
          end
        end
        # スキルの使用時 SE を演奏
        $game_system.se_play(@skill.menu_se)
        # SP 消費
        @actor.sp -= @skill.sp_cost
        # 各ウィンドウの内容を再作成
        @status_window.refresh
        @skill_window.refresh
        $scene.status_window.refresh
        # 全滅の場合
        if $game_party.all_dead?
          # ゲームオーバー画面に切り替え
          $scene = Scene_Gameover.new
          return
        end
        # コモンイベント ID が有効の場合
        if @skill.common_event_id > 0
          # コモンイベント呼び出し予約
          $game_temp.common_event_id = @skill.common_event_id
          # マップ画面に切り替え
          dispose
          $scene = Scene_Map.new
          return
        end
      end
      # スキルを使わなかった場合
      unless used
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end
Instructions
Just copy/paste this code right under the HP/SP/EXP Gauge Script v1.00 (yep, I translated it) which is the last script in Minkoff's adaption of Cogwheel's RTAB system.

This system allows you to use skills that rely on consuming items. If for example, you use a skill that relies on potions and perfumes, the specified items (and quantities) are used and reduced in your inventory.
As this system allows certain skills to RELY on items, these skills will be disabled if you do not have enough of the required items it needs.

In the below example, we have it coded so in order to use the "Heal" skill,
you will need to use a single "Potion" and 2 "High Perfume" items.

Code:
    when "Heal"
      return [["Potion"], ["High Perfume", 2]]
But, in the next example, you'll see the code to use a "Fire" skill merely using
a single "Molotov Cocktail" item (no... it's NOT part of the default items in RMXP).
Code:
    when "Fire"
      return [["Molotov cocktail"]]

Compatibility
This script IS pretty basic and has been in use quite a while... and still works with the newest versions of RTAB... even v 1.14.

Credits and Thanks
Thanks to Cogwheel for making such a wonderful system, that has many adaptable features.

Author's Notes
I'm NOT the author. Oh, well...
 
I'm not sure I understand where exactly this is supposed to go. You said it goes under the last script in Minkoff's adaptation of RTAB. Does that mean that I have to be using some sort of edited version of RTAB? The one I'm using is simply the plain old RTAB 1.14 plus a small addon by Legacy to let me use the bars from his CMS in battle.

Sorry to have to ask this, but I'm terrible with scripts. :(
 
The basic... Paste this under the... statement means to copy/paste it under the RTAB scripts that you already have. Frankly, Apart from Minto's RTAB Configuration I don't think it makes any difference what order you put the Add-Ons for RTAB just as long as they're pasted under RTAB (best top put Minto's below 'em all).

Besides. Try the demo. You've got all the Add-On scripts that I've translated in it, along WITH version 1.14 (for now...)
 
Ah, I see. It works, thanks. :)

I was wondering if there's a way to make it so that a skill requires one item or another item, rather than just one or more items. For example: If I want a skill that requires a longsword or a broadsword or a bastard sword to use, but not all of them. Is this option built into the script, or not? Basically, I want to use this to simulate weapon requirements. You have to have a sword to use a sword skill, a spear to use a spear skill, etc.
 
Well, this system was designed with ITEM consumption in general. I will admit, I tweaked it a little so items that SHOULDN'T be consumed (due to the switch in the database) won't be.

I'm sure that it is possible to enhance it more to work with weapons and/or armor, but either Trickster or Sephiroth Spawn created their own script that adds a skill when a particular piece of armor/weapon is equipped (and erasing it when unequipped). For now, I plan to leave it as it is... after all, it IS their script.
 
There is a problem with the connected attacking script.
Is you use both, then the items aren't consumed (You can check in the demo, that the perfume and potions are not consumed).
If you delete Connected Attacking Script, then it works.
I tried moving the script under Connected attacking, but didn't work. can you please check that?
Thanks!
 
Know what? You're right. But.... HEHEHE

I wrote this in like 10 minutes * including testing *.

Just paste this below Connected Attacking so the alias adds the little extra bit INTO Connect-Attack. The order still makes a difference, so Connected Attacking must still be listed after all the others... but now this goes last.

Code:
# Consume Items Patch for Connected Attacking v 1.0                 (08-18-2006)
# by DerVVulfman

#==============================================================================
# ** Scene_Battle (part 4)
#------------------------------------------------------------------------------
#  This class performs battle screen processing.
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Make Skill Action Results
  #--------------------------------------------------------------------------
  alias make_skill_action_result_consume make_skill_action_result
  def make_skill_action_result(battler, plus_id)
    make_skill_action_result_consume(battler,plus_id)
  # If item(s) are used
    if battler.is_a?(Game_Actor)
      items = battler.medium(@skill.id)
      if items
        for item in items
          id = battler.item_name(item[0])
          num = item[1] == nil ? 1 : item[1]
          # Check if consumable              
          if $data_items[id].consumable
            $game_party.gain_item(id, -num)
          end
        end
      end
    end
  end
end
 
Is there a version of this script that works without using the RTAB system? I looked at the one that says that it is "Non-RTAB" but when I try to use any skill I get an error message. Any help would be awesome.
Thanks!
 
Thanks I didn't realize why trickster's addons macl was smaller i should of known thanks again this is like the 15th time you've helped me heh...
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top