[RESOLVED] [RMXP] Chrono Cross Key Items script enhancement

Started by Esther, November 11, 2019, 07:49:06 pm

Previous topic - Next topic

Esther

November 11, 2019, 07:49:06 pm Last Edit: November 12, 2019, 05:54:02 pm by Esther Reason: Request was fulfilled. :)
Hello! :)
I need some help with this Chrono Cross Key Items script for XP by gameus. I am using version 1.2. It works perfectly, but I want to use it a little differently and couldn't figure it out on my own.

In short, this script opens an item select window when a button is pressed, after which you can make conditional events based on the item the player selected.


I want to be able to trigger and use the item select window in an event with a script call.

Details: I want to make cooking possible in my game. I would prefer to call the screen from an event, like show choices, with options like "Add an ingredient", "Mix ingredients", "Empty bowl and start over" without having to make the player move to a new event that would have a single function.

Right now I can only call the script by the press of a button (shift by default), when no event is running. I imagine using it like this:

@>Script: open_item_select_window
@>Conditional Branch: Script: used_item(item_id)


Extras:
  • Adding a boolean (or something else, I'm not a programmer, I don't know how it would be easiest) into the script to disable or enable the ability to trigger the window by keyboard input.
  • Being able to disable and enable the keyboard input in events with a script call. Or switch or variable, if that would be easier for the scripter. Previous point unnecessary if this was added.

These aren't essential, I just don't know if I'll want to use it in the original way in the future if the script call becomes possible. If not, I can probably figure out how to get rid of the input trigger option permanently on my own, even if somewhat inelegantly. xD

Something that would be extremely neat:
  • Being able to choose which item element I want the player to be able to select from when triggering the event with a script call. This would make it possible to have several separate crafting systems with different rules! How cool is that?  8)

Choosing an element is possible in the script right now, but you can only pick one overall. I would like to be able to pick which items to choose from with every event. Kind of like this:

@>Script: open_item_select_window(item_element_number)
@>Conditional Branch: Script: used_item(item_id)
This wouldn't work with keyboard input, so if that option was kept, when used, it would have to be either all items or whichever element you pick inside the script separately for keyboard input, as it is right now.


Thank you for reading! (:

KK20

November 12, 2019, 04:21:03 am #1 Last Edit: November 12, 2019, 04:32:40 am by KK20
I think I did just about everything you requested. I noticed if you have a parallel process running, it may be possible that the used item gets cleared out before used_item is called. Added fix for that.
#===============================================================================
# Chrono Cross Key Items
# Version 1.3
# Author gameus, KK20
#-------------------------------------------------------------------------------
# Intro:
# Ever play Chrono Cross? You can bring up a window that displays a list of
# your Key Items and you can use them on NPCs and events to have a
# certain action take place.
#
# Features:
# -Display All Items or Marked Items
# -Won't conflict while events are running
# -Use items on NPCs and have something happen
#
# Instructions:
# This script is pretty much plug-n-play. But you have to decide if you want
# to display All Items or just Key Items. If you just want Key Items, scroll
# down and set "CCKEY_SHOW_ALL_ITEMS" to false. Then be sure to create a
# unique element which will be used as your Key Item Element. Mark any item
# with this element that you want made as a key item. Then set
# "CCKEY_ITEM_ELEMENT" to that element's id.
#
# Using this with Events:
# All it requires is a simple Conditional Branch Script Call.
#  used_item(item_id)
#  -item_id = The id of the item you'd like the event to react to.
# It's a bit hard to explain, but that's why there's a demo.
#
# You can also bring up the window by the script call:
#  select_item
# To list specific items with various elements (and not be restricted to just
# those defined under CCKEY_ITEM_ELEMENT):
#  select_item(1,2,3) # add more or less as you'd like
# You can use an array format if you'd like; it does the same thing:
#  select_item([1,2,3])
#
# Compatibility:
# -Not tested with SDK
# -Shouldn't conflict with anything
#
# Version History:
# 1.0
# -Initial Release
#
# 1.1
# -Allowed multiple item calls in one event page
#
# 1.2
# -Screw Ruby 1.8, that is all, small bug fixed
# -Fixed an input bug as well
#
# 1.3
# -Open the window via script call, and select many elements to list instead of
#  just the one
# -Prevent opening the window freely via a game switch
# -Clean up
#
# Credits:
# gameus ~ For creating the script
# SquareSoft ~ For inspiring the script
# KK20 - For v1.3
#===============================================================================
#------------------------------------------
# Button to bring up Key Item Window
#------------------------------------------
CCKEY_INPUT_BUTTON  = Input::A
#------------------------------------------
# Switch ID to toggle CCKEY_INPUT_BUTTON;
# Set this switch to OFF to disable button
# input from opening the window.
# Set to  0    to permanently disable.
# Set to  true  to always allow input.
#------------------------------------------
CCKEY_SWITCH_TOGGLE  = true
#------------------------------------------
# Whether or not to show entire inventory
# Excludes Weapons and Armors
#------------------------------------------
CCKEY_SHOW_ALL_ITEMS = true
#------------------------------------------
# If above is set to false, this element
# must be applied to any item you'd like
# to show up in the window.
# Note that this is the default, if you
# do not provide elements to select_item
# script call.
#------------------------------------------
CCKEY_ITEM_ELEMENT  = 17

#==============================================================================
# Window_CCKeyItem
#------------------------------------------------------------------------------
#  On map window to display "key items" that can be used with events
#==============================================================================
class Window_CCKeyItems < Window_Selectable
  #----------------------------------------------------------------------------
  # Creates Window
  #----------------------------------------------------------------------------
  def initialize
    super(48, 304, 544, 160)
    self.back_opacity = 160
    self.active = false
    self.visible = false
    @column_max = 2
    @item_types = []
    @fade_in = false
    refresh
  end
  #----------------------------------------------------------------------------
  # Updates Window
  #----------------------------------------------------------------------------
  def update
    super
   
    if @fade_in
      update_fade
      return
    end

    if Input.trigger?(Input::C) && self.active
      $game_system.se_play($data_system.decision_se)
      self.active = false
      self.visible = false
      if selected_item.nil?
        $game_temp.key_item = 0
      else
        $game_temp.key_item = selected_item.id
      end
      $game_temp.message_window_showing = false
      $game_temp.message_proc.call if $game_temp.message_proc
     
    elsif (CCKEY_SWITCH_TOGGLE == true || $game_switches[CCKEY_SWITCH_TOGGLE]) &&
        Input.trigger?(CCKEY_INPUT_BUTTON) &&
        !$game_temp.message_window_showing &&
        !$game_system.map_interpreter.running?
      $game_system.se_play($data_system.decision_se)
      show_window
     
    elsif Input.trigger?(Input::B) && self.active
      $game_system.se_play($data_system.cancel_se)
      self.active = false
      self.visible = false
      $game_temp.key_item = 0
      Input.update
      $game_temp.message_window_showing = false
      $game_temp.message_proc.call if $game_temp.message_proc
    end
  end
 
  #----------------------------------------------------------------------------
  # Fades the window in, only if called from events
  #----------------------------------------------------------------------------
  def update_fade
    self.opacity += 24
    self.contents_opacity += 24
    if self.opacity == 255
      @fade_in = false
      self.active = true
    end
  end
 
  #----------------------------------------------------------------------------
  # Pops up the window
  #----------------------------------------------------------------------------
  def show_window(*args)
    @item_types.clear
    args.each do |param|
      if param == :fade_in
        @fade_in = true
      elsif param.is_a?(Array) || param.is_a?(Integer)
        @item_types << param
      end
    end
    @item_types.flatten!
    if !CCKEY_SHOW_ALL_ITEMS && @item_types.empty?
      @item_types << CCKEY_ITEM_ELEMENT
    end
    refresh
    self.index = 0
    self.active = true unless @fade_in
    self.visible = true
    if @fade_in
      self.opacity = 0
      self.contents_opacity = 0
    end
    $game_temp.message_window_showing = true
  end
 
  #----------------------------------------------------------------------------
  # Refreshes Window
  #----------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @items = []
    for i in 1...$data_items.size
      item = $data_items[i]
      next if !($game_party.item_number(i) > 0)
      if (CCKEY_SHOW_ALL_ITEMS && @item_types.empty?) ||
        !(item.element_set & @item_types).empty?
        @items << item
      end
    end
    @item_max = @items.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #----------------------------------------------------------------------------
  # Draws Item
  #----------------------------------------------------------------------------
  def draw_item(index)
    item = @items[index]
    x = 4 + index % 2 * (244 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  end
  #----------------------------------------------------------------------------
  # Returns Selected Item
  #----------------------------------------------------------------------------
  def selected_item
    return @items[self.index]
  end
end

#==============================================================================
# Interpreter (Edit)
#------------------------------------------------------------------------------
#  Added the method "used_item(id)"
#==============================================================================
class Interpreter
  def used_item(id)
    flag = id == $game_temp.key_item
    return flag
  end
 
  alias gg_cckeys_command_end_lat command_end
  def command_end
    $game_temp.key_item = 0 if @main && @event_id > 0
    gg_cckeys_command_end_lat
  end
 
  #--------------------------------------------------------------------------
  # * Select an Item from choice window
  #  item_type
  #    :all - displays every single item in the player's inventory
  #   
  #--------------------------------------------------------------------------
  def select_item(item_elements = 0)
    return unless $scene.is_a?(Scene_Map)
    # Set message end waiting flag and callback
    @message_waiting = true
    $game_temp.message_proc = Proc.new { @message_waiting = false }
    $scene.show_key_item_window(item_elements)
  end
end

#==============================================================================
# Scene_Map (Edit)
#------------------------------------------------------------------------------
#  Modified to add Window_CCKeyItem
#==============================================================================
class Scene_Map
  #----------------------------------------------------------------------------
  # Initializes Map
  #----------------------------------------------------------------------------
  alias gg_main_cckeys_map_lat main
  def main
    @key_window = Window_CCKeyItems.new
    gg_main_cckeys_map_lat
    @key_window.dispose
  end
  #----------------------------------------------------------------------------
  # Updates Map
  #----------------------------------------------------------------------------
  alias gg_update_cckeys_map_lat update
  def update
    @key_window.update
    gg_update_cckeys_map_lat
  end
 
  def show_key_item_window(item_elements = 0)
    @key_window.show_window(:fade_in, item_elements)
  end
 
end

#==============================================================================
# Game_Temp
#------------------------------------------------------------------------------
#  Added @key_item to keep track of the used item.
#==============================================================================
class Game_Temp
  attr_accessor :key_item
end

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Esther

Thank you so much, both for the quick response and the script! I tested it out today and it works perfectly. :D I made a lot of progress today thanks to you. :)