Battle Item Count VX + ACE - kyonides -  10-17-2024
 
 
Battle Item Count VX + ACE 
 
by Kyonides 
 
Introduction 
 
  Do you need to update the number of potions or elixirs currently available for the next couple of actors during battle? 
  Or were you in need of canceling your previous actor's action to change the item the actor is going to consume next? 
Then this scriptlet is for you!   
 
VX Script 
 
Code: # * Battle Item Count VX * # 
#   Plug & Play Script 
#   Scripter : Kyonides Arkanthes 
#   v1.0.4 - 2024-02-03 
 
# The scriptlet updates the number of available items every single time you pick 
# one or go back to the prior actor in battle. 
 
class Game_Actor 
  def clear_battle_item 
    @battle_item_id = nil 
  end 
  attr_accessor :battle_item_id 
end 
 
class Game_Party 
  def clear_battle_items 
    members.each {|m| m.clear_battle_item } 
  end 
 
  def members_battle_items 
    members.map {|m| m.battle_item_id } 
  end 
 
  def battle_item_number(item) 
    return item_number(item) unless $game_temp.in_battle 
    item_id = item.id 
    battle_items = members_battle_items.select {|bit_id| item_id == bit_id } 
    item_number(item) - battle_items.size 
  end 
end 
 
class Window_Item 
  alias :kyon_btl_itm_cnt_win_ref :refresh 
  def refresh 
    @battle_items = {} 
    @battle_items.default = 99 
    kyon_btl_itm_cnt_win_ref 
  end 
 
  def enable?(item) 
    $game_party.item_can_use?(item) and @battle_items[item.id] > 0 
  end 
 
  def draw_item(index) 
    rect = item_rect(index) 
    self.contents.clear_rect(rect) 
    item = @data[index] 
    return unless item 
    number = $game_party.battle_item_number(item) 
    @battle_items[item.id] = number 
    enabled = enable?(item) 
    rect.width -= 4 
    draw_item_name(item, rect.x, rect.y, enabled) 
    self.contents.draw_text(rect, sprintf(":%2d", number), 2) 
  end 
 
  def battle_item_none? 
    @battle_items[@data[@index].id] == 0 
  end 
end 
 
class Scene_Battle 
  alias :kyon_btl_itm_cnt_scn_btl_term :terminate 
  alias :kyon_btl_itm_cnt_scn_btl_st_pty_cmd_sel :start_party_command_selection 
  alias :kyon_btl_itm_cnt_scn_btl_prr_act :prior_actor 
  alias :kyon_btl_itm_cnt_scn_btl_end_trgt_act_sel :end_target_actor_selection 
  def terminate 
    kyon_btl_itm_cnt_scn_btl_term 
    $game_party.clear_battle_items 
  end 
 
  def start_party_command_selection 
    $game_party.clear_battle_items 
    kyon_btl_itm_cnt_scn_btl_st_pty_cmd_sel 
  end 
 
  def turn_decrease_item_count 
    @active_battler.clear_battle_item if @active_battler 
  end 
 
  def prior_actor 
    turn_decrease_item_count 
    kyon_btl_itm_cnt_scn_btl_prr_act 
    turn_decrease_item_count 
  end 
 
  def update_target_actor_selection 
    @target_actor_window.update 
    if Input.trigger?(Input::B) 
      Sound.play_cancel 
      end_target_actor_selection 
    elsif Input.trigger?(Input::C) 
      Sound.play_decision 
      @active_battler.action.target_index = @target_actor_window.index 
      @active_battler.battle_item_id = @item.id if @item 
      @item = nil 
      end_target_actor_selection 
      end_skill_selection 
      end_item_selection 
      next_actor 
    end 
  end 
 
  def update_item_selection 
    @item_window.active = true 
    @item_window.update 
    @help_window.update 
    if Input.trigger?(Input::B) 
      Sound.play_cancel 
      end_item_selection 
    elsif Input.trigger?(Input::C) 
      @item = @item_window.item 
      $game_party.last_item_id = @item.id if @item 
      return Sound.play_buzzer unless $game_party.item_can_use?(@item) 
      return Sound.play_buzzer if @item_window.battle_item_none? 
      Sound.play_decision 
      determine_item 
    end 
  end 
end
  
 
VX ACE Script 
 
Code: # * Battle Item Count ACE * # 
#   Plug & Play Script 
#   Scripter : Kyonides Arkanthes 
#   v1.0.4 - 2024-02-03 
 
# The scriptlet updates the number of available items every single time you pick 
# one or go back to the prior actor in battle. 
 
class Game_Actor 
  def clear_battle_item 
    @battle_item_id = nil 
  end 
  attr_accessor :battle_item_id 
end 
 
class Game_Party 
  def clear_battle_items 
    members.each {|m| m.clear_battle_item } 
  end 
 
  def members_battle_items 
    members.map {|m| m.battle_item_id } 
  end 
 
  def battle_item_number(item) 
    return item_number(item) unless @in_battle 
    item_id = item.id 
    battle_items = members_battle_items.select {|bit_id| item_id == bit_id } 
    item_number(item) - battle_items.size 
  end 
end 
 
class Window_ItemList 
  alias :kyon_btl_itm_cnt_mk_itm_lst :make_item_list 
  def enable?(item) 
    $game_party.usable?(item) and @battle_items[item.id] > 0 
  end 
 
  def make_item_list 
    @battle_items = {} 
    @battle_items.default = 99 
    kyon_btl_itm_cnt_mk_itm_lst 
  end 
 
  def draw_item_number(rect, item) 
    number = $game_party.battle_item_number(item) 
    @battle_items[item.id] = number 
    contents.font.color.alpha = number > 0 ? 255 : translucent_alpha 
    number = sprintf(":%2d", number) 
    draw_text(rect, number, 2) 
  end 
end 
 
class Scene_Battle 
  alias :kyon_btl_itm_cnt_scn_btl_term :terminate 
  alias :kyon_btl_itm_cnt_scn_btl_st_pty_cmd_sel :start_party_command_selection 
  alias :kyon_btl_itm_cnt_scn_btl_st_act_cmd_sel :start_actor_command_selection 
  alias :kyon_btl_itm_cnt_scn_btl_on_itm_ok :on_item_ok 
  alias :kyon_btl_itm_cnt_scn_btl_on_itm_cncl :on_item_cancel 
  def terminate 
    kyon_btl_itm_cnt_scn_btl_term 
    $game_party.clear_battle_items 
  end 
 
  def start_party_command_selection 
    kyon_btl_itm_cnt_scn_btl_st_pty_cmd_sel 
    $game_party.clear_battle_items 
  end 
 
  def start_actor_command_selection 
    kyon_btl_itm_cnt_scn_btl_st_act_cmd_sel 
    BattleManager.actor.clear_battle_item 
  end 
 
  def on_item_ok 
    BattleManager.actor.battle_item_id = @item_window.item.id 
    kyon_btl_itm_cnt_scn_btl_on_itm_ok 
  end 
 
  def on_item_cancel 
    BattleManager.actor.clear_battle_item 
    kyon_btl_itm_cnt_scn_btl_on_itm_cncl 
  end 
end
  
Terms & Conditions 
 
Free for use in ANY game.   
Due credit is mandatory.   
That's it!  
 
 
 
RE: Battle Item Count VX + ACE - kyonides -  10-17-2024
 
 
Here Are Some Goodies for VX Users! 
 
This script is incompatible with the Targetting Extended for Tankentai Non-ATB v1.1 by Crimsonseas. So you'd need to use this modified version of Crimsonseas' script and my custom patch to make it work as intended.   
 
Modified Version of Targetting Extended 
 
Code: =begin 
################################################################################ 
Targetting Extended for Tankentai Non-ATB v1.1 
by CrimsonSeas 
################################################################################ 
Use with the base script to enable the targetting extended. 
 
 
This script adds to the rewrites list of the base script 
 
 
Rewrites: 
+Scene_Battle 
-start_target_selection 
-select_member 
################################################################################ 
=end 
 
class Scene_Battle 
  def start_target_selection(actor = false) 
    members = actor ? $game_party.members : $game_troop.members 
    action = @active_battler.action 
    if action.kind == 1 
      obj = action.skill 
    elsif action.kind == 2 
      obj = action.item 
    end 
    case obj 
    when nil 
      @target_any = TargetExt::ATTACK_ANY 
    when RPG::Skill 
      @target_any = !TargetExt::NO_TARGET_ANY_S.include?(action.skill.id) 
    when RPG::Item 
      @target_any = !TargetExt::NO_TARGET_ANY_I.include?(action.item.id) 
    end 
    if obj != nil && obj.extension.include?("TARGETALL") 
      members = $game_party.members + $game_troop.members 
    end 
    # �‚��ƒ��‚��ƒ��‚��ƒ—�ƒ��‚��ƒˆの�œ�ˆ� 
    @all = false 
    if obj != nil 
      scope_all = [2, 4, 5, 6, 8, 10].include?(obj.scope) 
      @all = (scope_all || obj.extension.include?("TARGETALL")) 
    end 
    @cursor = Sprite.new 
    @cursor.bitmap = Cache.character("cursor") 
    @cursor.src_rect.set(0, 0, 32, 32) 
    @cursor_flame = 0 
    @cursor.x = -200 
    @cursor.y = -200 
    @cursor.ox = @cursor.width 
    @cursor.oy = @cursor.height 
    @cursor.visible = !@all 
    # �‚��ƒ��‚��ƒƒ�ƒˆ名�‚’表示�™�‚‹�ƒ˜�ƒ��ƒ—�‚��‚��ƒ��ƒ‰�‚��‚’�œ�ˆ� 
    @help_window.visible = false if @help_window != nil 
    @help_window2 = Window_Help.new if @help_window2 == nil 
    # 不要な�‚��‚��ƒ��ƒ‰�‚��‚’�ˆ�™ 
    @actor_command_window.active = false 
    @skill_window.visible = false if @skill_window != nil 
    @item_window.visible = false if @item_window != nil 
    # �˜�œ��—て�„�‚‹�‚��ƒ��‚��ƒƒ�ƒˆで�œ€�‚‚�•�号の�Ž�„対象�‚’�œ€�ˆ�に�Œ‡�™�‚ˆ�†に 
    @index = 0 
    @max_index = members.size - 1 
    # �‚��‚��‚��ƒ�は�ˆ��—˜不�ƒ��€…で�‚‚�‚��ƒ��‚��ƒƒ�ƒˆでき�‚‹�‚ˆ�†に�‚��ƒ��ƒŸ�ƒ�と�Œ��ˆ� 
    unless actor 
      members.size.times do 
        break if members[@index].exist? 
        @index += 1 
      end 
    end  
    @help_window2.set_text(members[@index].name, 1) 
    if @all 
      string, strings = TargetExt::TARGET_ALL_VOC 
      string2 = actor ? strings[0] : strings[1] 
      string += " " + string2 unless obj.extension.include?("TARGETALL") 
      @help_window2.set_text(string, 1) 
      make_cursor_all(members) 
      cursor_all_visible(true) 
      @cursor.visible = false 
    else 
      # Call New Method: Reset Single Cursor 
      reset_single_cursor(actor) 
    end 
    select_member(members, actor) 
  end 
  #-------------------------------------------------------------------------- 
  # �—� �‚��ƒ��‚��ƒƒ�ƒˆ選�Šž 
  #-------------------------------------------------------------------------- 
  def select_member(targets, actor = true) 
    members = targets 
    action = @active_battler.action 
    if action.kind == 1 
      obj = action.skill 
    elsif action.kind == 2 
      obj = action.item 
    end 
    #rect = @cursor.src_rect 
    #rect.set(0, 0, 32, 32) 
    loop do 
      update_basic 
      @cursor_flame = 0 if @cursor_flame == 30 
      #rect.y = 0 if @cursor_flame == 29 
      #rect.y = 32 if @cursor_flame == 15 
      point_x, point_y = @spriteset.set_cursor(actor, @index) 
      @cursor.x = point_x 
      @cursor.y = point_y 
      @cursor_flame += 1 
      if Input.trigger?(Input::B) 
        select_member_cancel 
        break 
      elsif Input.trigger?(Input::C) 
        select_member_ok 
        break 
      end 
      if Input.repeat?(Input::LEFT) && !(@all || @active_battler.target_all) 
        if actor 
          $back_attack ? cursor_down(members, actor) : cursor_up(members, actor) 
        else 
          $back_attack ? cursor_up(members, actor) : cursor_down(members, actor) 
        end 
      end 
      if Input.repeat?(Input::RIGHT) && !(@all || @active_battler.target_all) 
        if actor 
          $back_attack ? cursor_up(members, actor) : cursor_down(members, actor) 
        else 
          $back_attack ? cursor_down(members, actor) : cursor_up(members, actor) 
        end 
      end 
      #if (Input.trigger?(Input::L) || Input.trigger?(Input::R)) && @target_any 
      if (Input.trigger?(Input::L) || Input.trigger?(Input::R)) #&& nil 
        if members == $game_party.members 
          members = $game_troop.members 
          actor = false 
        elsif members == $game_troop.members 
          members = $game_party.members 
          actor = true 
        end 
        if @active_battler.inverse_target 
          @active_battler.inverse_target = false 
        else 
          @active_battler.inverse_target = true 
        end 
        @index = 0 if @index >= members.size 
        @max_index = members.size - 1 
        # �‚��‚��‚��ƒ�は�ˆ��—˜不�ƒ��€…で�‚‚�‚��ƒ��‚��ƒƒ�ƒˆでき�‚‹�‚ˆ�†に�‚��ƒ��ƒŸ�ƒ�と�Œ��ˆ� 
        unless actor 
          members.size.times do 
            break if members[@index].exist? 
            @index += 1 
          end 
        end 
        if @cursor != nil 
          # Modified Process: Make Sure Any Kind of Cursor is Visible 
          many_targets = (@active_battler.target_all || @all) 
          if many_targets 
            dispose_cursor_all 
            make_cursor_all(members) 
            cursor_all_visible(false) 
            @cursor.visible = false 
          else 
            @cursor.visible = true 
          end 
        end 
        if @active_battler.target_all || @all 
          string1 = TargetExt::TARGET_ALL_VOC[0] 
          string2 = actor ? TargetExt::TARGET_ALL_VOC[1][0] : TargetExt::TARGET_ALL_VOC[1][1] 
          string1 += " " + string2 unless obj.extension.include?("TARGETALL") 
          if TargetExt::SHOW_MP_ALTER && @active_battler.target_all && obj.is_a?(RPG::Skill) 
            cost = @active_battler.calc_mp_cost(obj) 
            string1 += ": " + cost.to_s + Vocab::mp 
          end 
          @help_window2.set_text(string1, 1) 
        end 
        @help_window2.set_text(members[@index].name, 1) if !@active_battler.target_all && !@all 
        Sound.play_cursor 
      end 
      if Input.trigger?(Input::A) && !@all && obj != nil 
        if obj.all_available 
          Sound.play_cursor 
          if @active_battler.target_all 
            @active_battler.target_all = false 
            @cursor.visible = true 
            cursor_all_visible(false) if @cursor2 != nil 
            @help_window2.set_text(members[@index].name, 1) 
          else 
            @active_battler.target_all = true 
            @cursor.visible = false 
            make_cursor_all(members) if @cursor2 == nil 
            cursor_all_visible(true) 
            string1 = TargetExt::TARGET_ALL_VOC[0] 
            string2 = actor ? TargetExt::TARGET_ALL_VOC[1][0] : TargetExt::TARGET_ALL_VOC[1][1] 
            string1 += " " + string2 unless obj.extension.include?("TARGETALL") 
            if TargetExt::SHOW_MP_ALTER && @active_battler.target_all &&  obj.is_a?(RPG::Skill) 
              cost = @active_battler.calc_mp_cost(obj) 
              string1 += ": " + cost.to_s + Vocab::mp 
            end 
            @help_window2.set_text(string1 , 1) 
          end 
        end 
      end 
      many_targets = (@active_battler.target_all || @all) 
      cursor_up(members, actor) if Input.repeat?(Input::UP) && !many_targets 
      cursor_down(members, actor) if Input.repeat?(Input::DOWN) && !many_targets 
    end 
  end 
 
  def select_member_cancel 
    Sound.play_cancel 
    @active_battler.target_all = false 
    end_target_selection 
  end 
 
  def select_member_ok 
    Sound.play_decision 
    @active_battler.action.target_index = @index 
    end_target_selection 
    end_skill_selection 
    end_item_selection 
    next_actor 
  end 
 
  def make_cursor_all(members) 
    @cursor2 = [] 
    for i in 0...members.size 
      next if members == $game_troop.members && !members[i].exist? 
      @cursor2[i] = Sprite.new 
      @cursor2[i].bitmap = Cache.character("cursor") 
      @cursor2[i].src_rect.set(0, 0, 32, 32) 
      @cursor2[i].x = members[i].position_x - 48 
      @cursor2[i].y = members[i].position_y - 48 
    end 
    @cursor2.compact! 
  end 
end
  
The Patch 
 
Code: # * Battle Item Count VX - Takentai Patch * # 
#  Scripter : Kyonides Arkanthes 
#  2024-10-17 
 
class Scene_Battle 
  alias :kyon_btl_itm_cnt_scn_btl_sel_mem_ok :select_member_ok 
  def select_member_ok 
    action = @active_battler.action 
    item_id = action.kind == 2 ? action.item.id : nil 
    @active_battler.battle_item_id = item_id if item_id 
    kyon_btl_itm_cnt_scn_btl_sel_mem_ok 
  end 
 
  def reset_single_cursor(is_actor) 
    point_x, point_y = @spriteset.set_cursor(is_actor, @index) 
    @cursor.x = point_x 
    @cursor.y = point_y 
  end 
end
  
 
 
 
 |