The RPG Maker Resource Kit

RMRK RPG Maker Creation => XP => XP Scripts Database => Topic started by: modern algebra on July 12, 2007, 06:29:39 AM

Title: Catalogue Script v 1.4
Post by: modern algebra on July 12, 2007, 06:29:39 AM
Catalogue Script
Version: 1.4
Author: modern algebra
Date: August 11, 2007

Version History



Description


This script allows you to set up groups of items, and then it will give you a log of all the items in that group that the party has encountered. You can have an infinite number of groups. It also allows you to order items from a catalogue at user-specified locations. As well, it gives detailed onfo on all items you have collected.

Features


Screenshots

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg380.imageshack.us%2Fimg380%2F8526%2Fcataloguevt7.png&hash=9212e44ffceb51a3c05f3b39a1701ac15e385146)
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg528.imageshack.us%2Fimg528%2F4701%2Fcataloguefc2.png&hash=84ac25d992446a68d85727f7ecadd4452bd2958e)]
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg186.imageshack.us%2Fimg186%2F1772%2Fcatalogueeh4.png&hash=26613a78990f56501e8346dbc69acf367d995351)
It Stretches!
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg528.imageshack.us%2Fimg528%2F6119%2Fcataloguewv9.png&hash=5700baa5be95197b46212c6a4e1f2893e37061e5)


Script


Code: [Select]
===============================================================================
# Catalogue Script
# Version: 1.4
# Author: modern algebra
# Date: July 10, 2007
#------------------------------------------------------------------------------
# Description: Allows you to have a log of all items collected and not yet
# collected.
#------------------------------------------------------------------------------
# Instructions: This script allows you to set up groups of items (items, weapons,
#               and/or armors. All types can be contained within a single group)
#               and allows you to view which of the items in that group have
#               been in your party's possession. By default, there are three
#               groups: items, weapons, armors. But you can change these and add
#               more very easily. To use, call this in a script:
#
#                    $scene = Scene_Catalogue.new (X)
#
#               where X is the group number. I'd suggest this script to be used
#               as items which call common events which have that $scene thing
#               in them. By default, it exits to the item menu. Instructions on
#               how to configure the group are at line 31
#------------------------------------------------------------------------------             
# You can also use this as a method of ordering, like from a real catalogue.
# Basically, it brings up your item log, and you can choose any of the items to
# buy. This can be useful for an Animal Crossing Game for example, but I think
# it can be useful for many types of games. In order to use this feature, use
# this call script:
#
#   $scene = Scene_Catalogue.new (X,Y)
#
# where X is the group number and Y is the ordering tax coefficient. I.e., Y is
# a number, and whatever you make that number it will multiply the price by it.
# For example, if Y = 1.15, then there will be 15% ordering tax. I.e. if an item
# costs 50 Gold in a store, then it would cost 58 Gold to order it from the
# catalogue.
#===============================================================================
#===============================================================================
# Game_Party: Aliases the gain XXX methods in order to turn the fact that you
# encountered the items on, as well as sets up the basic catalogue data
#===============================================================================
class Game_Party
 
  attr_reader   :encountered_items
  attr_reader   :catalogue
 
  alias add_encounter_items_array initialize
  def initialize
    add_encounter_items_array
    @catalogue = []
    #===========================================================================
    # CONFIGURABLE AREA
    #---------------------------------------------------------------------------
    # To make a group, make an array, and place each item you wish to have in
    # that group inside the array. Example:
    #
    # @catalogue.push (["Fish",[$data_items[1], $data_items[3], $data_items[32]]])
    # @catalogue.push (["Gold Items",[$data_armors[5], $data_weapons[3]]])
    #
    # That would make two groups. The first group would be called "Fish" and
    # have item 1, item 3, and item 32 in it, and the second group would be
    # called "Gold Items" and include armor 5 and weapon 3 in it.
    # By default, there are three categories, items, weapons and armors.
    #---------------------------------------------------------------------------
    # The basic set up:
    # @catalogue.push (["name", [<array of items included in the group>]])
    #
    # You can set up as many groups as you like.
    #
    # If you know how, you can also put them on the same line, like this:
    # @catalogue = [["Items",$data_items],["Weapons",$data_weapons],["Armors", $data_armors]]
    # but to keep it simple, follow the instructions. In default, items group is
    # 0, weapons group is 1, armors group is 2, and if you add another group
    # underneath, it would be 3, and so on. So, $scene = Scene_Catalogue.new (0)
    # would bring up the items log, etc...
    #===========================================================================
    @catalogue.push (["Item",$data_items.compact])
    @catalogue.push (["Weapon",$data_weapons.compact])
    @catalogue.push (["Armor", $data_armors.compact])
    @catalogue.push (["Key", $data_items[23,3]])
    #===========================================================================
    # END CONFIGURABLE AREA
    #===========================================================================
    @encountered_items = []
    for i in 0...3
      @encountered_items[i] = []
    end
    for i in $data_system.party_members
      actor = $data_actors[i]
      gain_weapon (actor.weapon_id,0)
      gain_armor (actor.armor1_id,0)
      gain_armor (actor.armor2_id,0)
      gain_armor (actor.armor3_id,0)
      gain_armor (actor.armor4_id,0)
    end
  end
 
  alias modify_encountered_items gain_item
  def gain_item (item_id, n)
    modify_encountered_items (item_id, n)
    if n >= 0
      for i in 0...@catalogue.size
        if @catalogue[i][1].include? ($data_items[item_id])
          @encountered_items[0][item_id] = true
        end
      end
    end
  end
 
  alias modify_encountered_weapons gain_weapon
  def gain_weapon (weapon_id, n)
    modify_encountered_weapons (weapon_id, n)
    if n >= 0
      for i in 0...@catalogue.size
        if @catalogue[i][1].include? ($data_weapons[weapon_id])
          @encountered_items[1][weapon_id] = true
        end
      end
    end
  end
 
  alias modify_encountered_armors gain_armor
  def gain_armor(armor_id, n)
    modify_encountered_armors (armor_id, n)
    if n >= 0
      for i in 0...@catalogue.size
        if @catalogue[i][1].include? ($data_armors[armor_id])
          @encountered_items[2][armor_id] = true
        end
      end
    end
  end
end 
#===============================================================================
# Draws the information screen
#===============================================================================
class Window_ItemInfo < Window_Base
 
  def initialize
    super (24, 24, 592,432)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.z = 500
    self.visible = false
  end

  def quick_write_text (x,y,text)
    tw = (self.contents.text_size(text)).width
    if tw > 95
      tw = 95
    end
    self.contents.draw_text (x-tw,y,tw+5,32,text)
  end
 
  def refresh (item)
    self.contents.clear
    case item
    when RPG::Item
      type = 0
      type_name = "Item"
    when RPG::Weapon
      type = 1
      type_name = "Weapon"
    when RPG::Armor
      type = 2
      type_name = "Armour"
    end
    self.contents.blt (93,64,RPG::Cache.icon(item.icon_name),Rect.new(0,0,24,24))
    self.contents.font.color = system_color
    self.contents.draw_text (4,96,80,32, "Type:")
    if type != 0
      self.contents.draw_text (4,128,87,32, "Equippable by:")
    end
    self.contents.draw_text (240,40,120,32,"Description:")
    quick_write_text (320,210,"Stats:")
    self.contents.draw_text (65,252,100,32,"Price:")
    if type == 1
      self.contents.draw_text (65,284,100,32,$data_system.words.atk+":")
    elsif type == 2
      self.contents.draw_text (65,284,100,32,"Evasion:")
    end
    if type != 0
      self.contents.draw_text (65,316,100,32,$data_system.words.pdef+":")
      self.contents.draw_text (65,348,100,32,$data_system.words.mdef+":")
      self.contents.draw_text (305,252,100,32,$data_system.words.str+":")
      self.contents.draw_text (305,284,100,32,$data_system.words.agi+":")
      self.contents.draw_text (305,316,100,32,$data_system.words.dex+":")
      self.contents.draw_text (305,348,100,32,$data_system.words.int+":")
    else
      self.contents.draw_text (65,284,100,32,"Occasion:")
      self.contents.draw_text (65,316,80,32,"Scope:")
      self.contents.draw_text (65,348,80,32,"Usage:")
      self.contents.draw_text (305,254,80,32,$data_system.words.hp+" Gain:")
      self.contents.draw_text (305,286,80,32,$data_system.words.sp+" Gain:")
      words = ["","Max "+$data_system.words.hp+":","Max "+$data_system.words.hp+":",
              $data_system.words.str+":", $data_system.words.agi+":",
              $data_system.words.dex+":", $data_system.words.int+":"]
      self.contents.draw_text (305,318,100,32,words[item.parameter_type])
    end
    self.contents.fill_rect (1,33,559,1,Color.new(-150,-150,-255,255))
    self.contents.fill_rect (0,34,559,1,Color.new(-255,-255,-255,255))
    self.contents.fill_rect (0,1,1,398,Color.new(-150,-150,-255,255))
    self.contents.fill_rect (1,1,1,398,Color.new(-255,-255,-255,255))
    self.contents.fill_rect (559,1,1,398,Color.new(-150,-150,-255,255))
    self.contents.fill_rect (558,1,1,398,Color.new(-255,-255,-255,255))
    self.contents.font.color = normal_color
    quick_write_text (320,0,item.name)
    quick_write_text (190,96,type_name)
    quick_write_text (285,252,item.price.to_s)
    if type == 1
      quick_write_text (285,284,item.atk.to_s)
    elsif type == 2
      quick_write_text (285,284,item.eva.to_s)
    end
    if type != 0
      quick_write_text (290,316,item.pdef.to_s)
      quick_write_text (290,348,item.mdef.to_s)
      sign = positive_num?(item.str_plus)
      quick_write_text (500,252,sign+item.str_plus.to_s)
      sign = positive_num?(item.agi_plus)
      quick_write_text (500,284,sign+item.agi_plus.to_s)
      sign = positive_num?(item.dex_plus)
      quick_write_text (500,316,sign+item.dex_plus.to_s)
      sign = positive_num?(item.int_plus)
      quick_write_text (500,348,sign+item.int_plus.to_s)
    else
      words = ["Always","In Battle","Out of Battle","Never"]
      quick_write_text (285,284,words[item.occasion])
      words = ["N/A", "One Enemy", "All Enemies", "One Ally", "All Allies",
               "One Felled Ally", "All Felled Allies", "The User"]
      quick_write_text (285,316,words[item.scope])
      if item.consumable; quick_write_text (285,348,"One Use")
      else; quick_write_text (285,348,"Unlimited Uses")
      end
      if item.recover_hp == 0 && item.recover_hp_rate == 0
        hp_recovery_string = "N/A"
      elsif item.recover_hp_rate != 0 && item.recover_hp_rate != 0
        hp_recovery_string = item.recover_hp_rate.to_s+"% + "+item.recover_hp.to_s
      elsif item.recover_hp != 0
        hp_recovery_string = item.recover_hp.to_s
      else
        hp_recovery_string = item.recover_hp_rate.to_s
      end
      quick_write_text (500,254,hp_recovery_string)
      if item.recover_sp == 0 && item.recover_sp_rate == 0
        sp_recovery_string = "N/A"
      elsif item.recover_sp_rate != 0 && item.recover_sp_rate != 0
        sp_recovery_string = item.recover_sp_rate.to_s+"% + "+item.recover_sp.to_s
      elsif item.recover_sp != 0
        sp_recovery_string = item.recover_sp.to_s
      else
        sp_recovery_string = item.recover_sp_rate.to_s
      end
      quick_write_text (500,286,sp_recovery_string)
      if item.parameter_type != 0
        quick_write_text (500,318,"+"+item.parameter_points.to_s)
      end
    end
    if type != 0
      equip_classes = []
      substring = ""
      for i in 1...$data_classes.size
        e_class = $data_classes[i]
        string = ""
        if type == 1
          test = e_class.weapon_set
        elsif type == 2
          test = e_class.armor_set
        end
        if test.include? (item.id)
          if e_class.name.size <= 4
            string = e_class.name.dup
          else
            string += e_class.name[0,1]
            for i in 1...e_class.name.size
              substring = e_class.name[i,1]
              if substring !="a"&&substring !="e"&&substring !="i"&&substring !="o"&&substring != "u"
                string +=substring
              end
            end
            if string.size > 4
              string = string[0,2]+string[string.size-2,2]
            end
          end
          equip_classes.push (string.upcase!)
        end
      end
      if equip_classes.nitems == 0
        quick_write_text (160,296,"N/A")
      else
        line_length = 0
        line_number = 0
        for i in 0...equip_classes.size
          if i != equip_classes.size - 1
            tw = (self.contents.text_size(equip_classes[i]+", ")).width
            self.contents.draw_text (90+line_length,128+line_number,tw,32,equip_classes[i]+", ")
          else
            tw = (self.contents.text_size(equip_classes[i])).width
            self.contents.draw_text (90+line_length,128+line_number,tw,32,equip_classes[i])
          end
          line_length += tw
          if line_length > 75
            line_number +=32
            line_length = -80
          end
        end
        self.contents.fill_rect (209,202,350,1,Color.new(-255,-255,-255,255))
        self.contents.fill_rect (210,201,350,1,Color.new(-150,-150,-255,255))
        if line_number > 64
          self.contents.fill_rect (209,34,1,220,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (210,33,1,220,Color.new(-150,-150,-255,255))
          self.contents.fill_rect (0,254,209,1,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (1,253,209,1,Color.new(-150,-150,-255,255))
        elsif line_number > 32
          self.contents.fill_rect (209,34,1,120+line_number,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (210,33,1,120+line_number,Color.new(-150,-150,-255,255))
          self.contents.fill_rect (209,120+line_number,1,82-line_number,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (210,120+line_number,1,82-line_number,Color.new(-150,-150,-255,255))
          self.contents.fill_rect (0,154+line_number,209,1,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (1,153+line_number,209,1,Color.new(-150,-150,-255,255))
        else
          self.contents.fill_rect (209,34,1,168,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (210,33,1,168,Color.new(-150,-150,-255,255))
          self.contents.fill_rect (0,202,209,1,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (1,201,209,1,Color.new(-150,-150,-255,255))
        end
      end
    end
    if item.is_a? (RPG::Item)
      self.contents.fill_rect (209,34,1,170,Color.new(-255,-255,-255,255))
      self.contents.fill_rect (210,33,1,170,Color.new(-150,-150,-255,255))
      self.contents.fill_rect (0,202,559,1,Color.new(-255,-255,-255,255))
      self.contents.fill_rect (1,201,559,1,Color.new(-150,-150,-255,255))
    end
    desc = item.description
    line = []
    ts = desc.size
    line_index = 0
    limit = 0
    loop do
      line[line_index] = desc[limit, 40]
      for i in 1...40
        if line[line_index][-i,1] == " " || limit + (40-i) >= desc.size
          limit += (41-i)
          ts -= 40-i
          line_index +=1
          break
        else
          line[line_index][-i,1] = " "
        end
      end
      if ts <= 0
        break
      end
    end 
    line.compact!
    for i in 0...line.size
      self.contents.draw_text (220, 28*i + 76, 350,32, line[i])
    end
  end
 
  def positive_num? (num)
    if num > 0
      return "+"
    else
      return ""
    end
  end
end
#===============================================================================
# This window displays the ratio of collected items to total items
#===============================================================================
class Window_TotalItemsRatio < Window_Base
 
  def initialize (group_number)
    super (400,0,240,64)
    self.contents = Bitmap.new (width-32, height-32)
    @total = $game_party.catalogue[group_number][1].size
    @current = 0
    for i in 0...@total
      item = $game_party.catalogue[group_number][1][i]
      case item
      when RPG::Item; type = 0
      when RPG::Weapon; type = 1
      when RPG::Armor; type = 2
      end
      if $game_party.encountered_items[type][item.id] == true
        @current += 1
      end
    end
    if @current == @total
      self.contents.font.color = system_color
    end
    tw = (self.contents.text_size(@current.to_s + " / " + @total.to_s)).width
    self.contents.draw_text (104 - (tw/2),0,tw,32,@current.to_s + " / " + @total.to_s)
  end
end
#===============================================================================
# This window displays all collected items
#===============================================================================
class Window_Catalogue < Window_Selectable
 
  def initialize (group, price_multiplier = nil)
    super (0,128,640,352)
    @column_max = 2
    @group = $game_party.catalogue[group][1]
    @group_number = group
    @price_multiplier = price_multiplier
    refresh
  end
 
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    # Check inventory for new additions
    for i in 0...@group.size
      case @group[i]
      when RPG::Item; type = 0
      when RPG::Weapon; type = 1
      when RPG::Armor; type = 2
      end
      if $game_party.encountered_items[type][@group[i].id] == true
        @data.push (@group[i])
      end
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(@data[i], i)
      end
    end
  end
 
  def draw_item (item, index)
    if @price_multiplier != nil
      if $game_party.gold >= (item.price * @price_multiplier)
        self.contents.font.color = normal_color
        self.contents.draw_text ((320*(index%2))+30,(index/2)*32,200,32,item.name)
      else
        self.contents.font.color = disabled_color
        self.contents.draw_text ((320*(index%2))+30,(index/2)*32,200,32,item.name)
      end
      if item.price != 0
        tw = self.contents.text_size ((item.price * @price_multiplier).to_i.to_s)
        self.contents.draw_text (270 + (326*(index%2))-tw.width ,(index/2)*32,tw.width,32,(item.price * @price_multiplier).to_i.to_s)
      else
        tw = self.contents.text_size ("N/A")
        self.contents.draw_text (270 + (326*(index%2))-tw.width ,(index/2)*32,tw.width+10,32,"N/A")
      end
    else
      self.contents.draw_text ((320*(index%2))+30,(index/2)*32,200,32,item.name)
      if item.price != 0
        tw = self.contents.text_size (item.price.to_s)
        self.contents.draw_text (270 + (326*(index%2))-tw.width ,(index/2)*32,tw.width,32,item.price.to_s)
      else
        tw = self.contents.text_size ("N/A")
        self.contents.draw_text (270 + (326*(index%2))-tw.width ,(index/2)*32,tw.width+10,32,"N/A")
      end
    end
    self.contents.blt((320*(index%2)),(index/2)*32+4,RPG::Cache.icon(item.icon_name),Rect.new(0,0,24,24))
  end
 
  def item
    return @data[self.index]
  end
end
#===============================================================================
# This window shows how many of that type of item you possess
#===============================================================================
class Window_CurrentlyPossessed < Window_Base
 
  def initialize
    super (0,416,300,64)
    self.contents = Bitmap.new(width-32,height-32)
  end
 
  def refresh (item)
    self.contents.clear
    case item
    when RPG::Item
      quantity = $game_party.item_number (item.id)
    when RPG::Weapon
      quantity = $game_party.weapon_number (item.id)
      for actor in $game_party.actors
        if item.id == actor.weapon_id
          quantity += 1
        end
      end
    when RPG::Armor
      quantity = $game_party.armor_number (item.id)
      for actor in $game_party.actors
        if item.id == actor.armor1_id || item.id == actor.armor2_id || item.id == actor.armor3_id || item.id == actor.armor4_id
          quantity += 1
        end
      end
    end
    self.contents.font.color = system_color
    self.contents.draw_text (0, 4,300,22,"Currently Possessed:")
    self.contents.font.color = normal_color
    ts = (self.contents.text_size(quantity.to_s)).width
    self.contents.draw_text (268 - ts, 4,ts,22,quantity.to_s)
  end
end
#===============================================================================
# This window shows the price of the item with ordering tax
#===============================================================================
class Window_TotalPrice < Window_Base
 
  def initialize (price_multiplier)
    super (300,416,180,64)
    @price_multiplier = price_multiplier
    self.contents = Bitmap.new(width-32,height-32)
  end
 
  def refresh (item)
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text (0,4,100,32,"Ordering Tax:")
    if item.price > 0
      ts = (self.contents.text_size (((100*@price_multiplier)-100).to_i.to_s+"%")).width
      ts2 = (self.contents.text_size (((100*@price_multiplier)-100).to_i.to_s)).width
      self.contents.draw_text (148-ts+ts2,4,ts-ts2,32,"%")
      self.contents.font.color = normal_color
      self.contents.draw_text (146-ts,4,ts,32,((100*@price_multiplier)-100).to_i.to_s)
    else
      ts = (self.contents.text_size ("N/A")).width
      self.contents.font.color = normal_color
      self.contents.draw_text (146-ts,4,ts+10,32,"N/A")
    end
  end
end
#===============================================================================
# This window displays the name of the group being viewed
#===============================================================================
class Window_CatalogueName < Window_Base
  def initialize (group)
    super (0,0,400,64)
    self.contents = Bitmap.new(width - 32, height - 32)
    @group = $game_party.catalogue[group][0]
    self.contents.font.color = system_color
    ts = self.contents.text_size (@group + " Log")
    self.contents.draw_text (184 - 0.5*ts.width,0,ts.width,32,@group + " Log")
  end
end
#===============================================================================
# The main processing of the script
#===============================================================================
class Scene_Catalogue
 
  def initialize (group_number, price_multiplier = nil)
    @group_number = group_number
    @price_multiplier = price_multiplier
  end
 
  def main
    @name_window = Window_CatalogueName.new (@group_number)
    @help_window = Window_Help.new
    @help_window.y = 64
    if @price_multiplier!=nil
      @catalogue_window = Window_Catalogue.new (@group_number,@price_multiplier)
      @catalogue_window.height = 288
      @possession_window = Window_CurrentlyPossessed.new
      @possession_window.refresh (@catalogue_window.item)
      @gold_window = Window_Gold.new
      @gold_window.y = 416
      @gold_window.x = 480
      @totalprice_window = Window_TotalPrice.new (@price_multiplier)
      @totalprice_window.refresh (@catalogue_window.item)
      # Make quantity input window
      @number_window = Window_ShopNumber.new
      @number_window.active = false
      @number_window.visible = false
      @number_window.z = 500
      @number_window.x = 136
    else
      @catalogue_window = Window_Catalogue.new (@group_number)
      @itemdata_window = Window_ItemInfo.new
    end
    @catalogue_window.active = true
    @catalogue_window.index = 0
    @ratio_window = Window_TotalItemsRatio.new (@group_number)
    @help_window.set_text (@catalogue_window.item == nil ? "" : @catalogue_window.item.description)
    @help_window.update
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
    # Dispose of windows
    if @price_multiplier != nil
      @number_window.dispose
      @possession_window.dispose
      @gold_window.dispose
      @totalprice_window.dispose
    else
      @itemdata_window.dispose
    end
    @ratio_window.dispose
    @catalogue_window.dispose
    @help_window.dispose
    @name_window.dispose
  end
 
  def update
    if @price_multiplier == nil && @itemdata_window.visible
      update_iteminfo
    elsif @catalogue_window.active
      catalogue_update
    elsif @number_window.active
      number_update
    end
  end
 
  def update_iteminfo
    if Input.trigger? (Input::B)
      $game_system.se_play($data_system.cancel_se)
      @itemdata_window.visible = false
      @catalogue_window.active = true
    end
  end
 
  def number_update
    @number_window.update
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Set quantity input window to inactive / invisible
      @number_window.active = false
      @number_window.visible = false
      @catalogue_window.active = true
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Play shop SE
      $game_system.se_play($data_system.shop_se)
      # Set quantity input window to inactive / invisible
      @number_window.active = false
      @number_window.visible = false
      $game_party.lose_gold((@number_window.number * @item.price * @price_multiplier).to_i)
      case @item
      when RPG::Item
        $game_party.gain_item(@item.id, @number_window.number)
      when RPG::Weapon
        $game_party.gain_weapon(@item.id, @number_window.number)
      when RPG::Armor
        $game_party.gain_armor(@item.id, @number_window.number)
      end
      # Refresh each window
      @gold_window.refresh
      @possession_window.refresh (@item)
      @catalogue_window.refresh
      @catalogue_window.active = true
    end
  end
 
  def catalogue_update
    previous_item = @catalogue_window.item
    @catalogue_window.update
    if @catalogue_window.item != previous_item
      @help_window.set_text (@catalogue_window.item == nil ? "" : @catalogue_window.item.description)
      @help_window.update
      if @price_multiplier != nil
        @possession_window.refresh (@catalogue_window.item)
        @totalprice_window.refresh (@catalogue_window.item)
      end
    end
    if Input.trigger?(Input::C)
      if @price_multiplier != nil
        @item = @catalogue_window.item
        # If item is invalid, or price is higher than money possessed, or price = 0
        if @item == nil || @item.price <= 0 || $game_party.gold < (@item.price*@price_multiplier).to_i
          # Play buzzer SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # Get items in possession count
        case @item
        when RPG::Item
          number = $game_party.item_number(@item.id)
        when RPG::Weapon
          number = $game_party.weapon_number(@item.id)
        when RPG::Armor
          number = $game_party.armor_number(@item.id)
        end
        # If 99 items are already in possession
        if number == 99
          # Play buzzer SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Calculate maximum amount possible to buy
        max = (@item.price * @price_multiplier).to_i == 0 ? 99 : $game_party.gold / (@item.price * @price_multiplier).to_i
        max = [max, 99 - number].min
        # Change windows to quantity input mode
        @catalogue_window.active = false
        @number_window.set(@item, max, (@item.price * @price_multiplier).to_i)
        @number_window.active = true
        @number_window.visible = true
      else
        @itemdata_window.refresh (@catalogue_window.item)
        @catalogue_window.active = false
        @itemdata_window.visible = true
      end
    end
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to menu screen
      if @price_multiplier == nil
        $scene = Scene_Item.new
      else
        $scene = Scene_Map.new
      end
      return
    end
  end
end   

Credit



Thanks


Support

I am willing to rectify any incompatibility issues and fix any bugs. Unless it is a very interesting request, I will not add major features to this upon one user's request, though if many people want it I will do it. I will provide support for this script here at rmrk and at rmrevolution.rmrk.net. If this script is posted elsewhere (other then rmrk, rmrevolution, chaosproject, and RPG RPG Revolution), I am not aware of it and as such, am not able to provide support.  On that note, please don’t steal my script.

Known Compatibility Issues

It will not work with any script which overwrites Window_Gold or Window_ShopNumber
It will not initialize for old savefiles.
This ought to be compatible with SDK. No guarantees once they release the version that separates Window_Gold into nine methods ^_^ (just kidding)

Demo


See Attached

Title: Re: Catalogue Script v 1.0
Post by: Irock on July 12, 2007, 06:35:15 AM
This sounds great. This would be useful for an Animal Crossing game.
Title: Re: Catalogue Script v 1.0
Post by: modern algebra on July 12, 2007, 05:47:40 PM
Thanks  ;D

Anyway, I am now posting v. 1.2. I decided to make it so that at user-specified areas you can order items from the catalogue. i.e. buy any item that you've previously owned in whichever group you specify. You can also set a tax for ordering it  :police:

EDIT:

Did it up under the guidelines of the new template. I think it looks good  :lol:

Title: Re: Catalogue Script v 1.2
Post by: Rune on July 20, 2007, 12:35:26 PM
This looks really sweet :D +rep to you matey :P
Title: Re: Catalogue Script v 1.2
Post by: modern algebra on July 22, 2007, 06:13:39 AM
*

Updated to Version 1.3. Now you can view detailed information on any item. As well, icons are shown now, and I fixed a major source of incompatibility between other item scripts. It should work with most any script now.
Title: Re: Catalogue Script v 1.3
Post by: zzzdude on August 05, 2007, 04:03:00 AM
wow, thanks!
Sorry for leaving, my laptop broke, had to send it in while I was visiting california, long stupid ordeal with compaq, internet got disconnected, loads of other crap.

I am ganna use this script, EXTREMELY useful.
Title: Re: Catalogue Script v 1.3
Post by: zzzdude on August 05, 2007, 05:10:44 AM
how do I give rep    :P
Title: Re: Catalogue Script v 1.3
Post by: Memor-X on August 06, 2007, 08:57:49 AM
i downloaded the demo but there's a problem with both the demo and when i fixed it up in my game, i can't equip any weapons or armours or accesories, and the ones that i have equipped, one i un-equip them, they disappear
Title: Re: Catalogue Script v 1.3
Post by: modern algebra on August 06, 2007, 05:03:38 PM
Odd, you're right, I think it must have happened when I modified soe of the script for v. 1.3

I'll fix it soon and post a new script/demo


Okay, the new script that is up should work. It is incompatible with other scripts which modify gain_item, gain_weapon, and gain_armor methods of Game_Party. I will fix that soon. I think the problem occured because I improperly aliased those methods. So, to fix it quick, I just overwrote them, but I will post a better version when I have time.
Title: Re: Catalogue Script v 1.3
Post by: zzzdude on August 07, 2007, 09:24:05 PM
Hmmm...
Say I want a group with items # 37-47, 1-5, etc.
Would I have to go and make [$data_items[37] [$data_items[38]... all the way through 47? or is there a shortcut...
Title: Re: Catalogue Script v 1.3
Post by: modern algebra on August 07, 2007, 09:27:18 PM
Shortcut:

$data_items[X,Y]

where X is the id of the first item in the database, and Y is the amount of items after that you want to include. Examples:

$data_items[37,11] returns items 37-47
$data_items[1,5] returns items 1-5

Also, make sure you have v. 1.3b

Title: Re: Catalogue Script v 1.3
Post by: zzzdude on August 07, 2007, 09:43:44 PM
yea, I do.
Know Y, does that count the first number as well?
So it is 37 AND  all the numbers after it?
Title: Re: Catalogue Script v 1.3
Post by: modern algebra on August 07, 2007, 10:12:46 PM
yes, it counts 37
Title: Re: Catalogue Script v 1.3
Post by: Memor-X on August 08, 2007, 08:57:20 AM
i want to make a log that included selected ID of weapons and also some Armor IDs (accessories), reason for this is that some of the accessories whihc you can equip are added parts for some weapons, how would i go out this, would i have to combine [$data_weapons[IDs]] and [$data_armors[IDs]] in the same pair ()
Title: Re: Catalogue Script v 1.3
Post by: modern algebra on August 08, 2007, 03:52:57 PM
Like this:

[$data_armors[ID], $data_weapons[ID], etc...]

Title: Re: Catalogue Script v 1.3
Post by: Memor-X on August 10, 2007, 07:40:05 AM
if you plan to make another version of this script, i got some suggestions

1. have the script make it so that it shows a complete list of weapons, items & armors but as black icons and can not be read and when you do get that item, weapon or armor, it shows up so you can see what weapons you have got and what ones your missing, good for gamers who like colecting every item in the game

2. a catalogue that lists monsters and their stats
        EDIT: the ones you encounter, thanks zzzdude, i forgot to add that

you don't have to do any of these, their just ideas
Title: Re: Catalogue Script v 1.3
Post by: zzzdude on August 10, 2007, 09:46:14 AM
How about monsters you encounter, because then a boss battle would be to predictable.
Title: Re: Catalogue Script v 1.4
Post by: modern algebra on August 11, 2007, 05:26:30 AM
Just modified the code to improve the compatibility. My quick fix for v. 1.3b was to overwrite some methods, so if you want to replace 1.3b with 1.4, you can. You don't need to though, as the only thing I changed was compatibility and I made a small edit to the way the Equippable Classes are drawn and I removed the name/price labels. However, if you are not experiencing a compatibility issue, then it isn't necessary to upgrade. If you do upgrade, remember to retain your groups and copy them into the new script.

And I'll make a special version for you which draws all items. but disables the ones you haven't encountered.

As for the bestiary, maybe, we'll see.

EDIT:

Here is your version, Memor-X

Code: [Select]
#===============================================================================
# Catalogue Script
# Version: 1.4 Memor-X Edition
# Author: modern algebra
# Date: July 10, 2007
#------------------------------------------------------------------------------
# Description: Allows you to have a log of all items collected and not yet
# collected.
#------------------------------------------------------------------------------
# Instructions: This script allows you to set up groups of items (items, weapons,
#               and/or armors. All types can be contained within a single group)
#               and allows you to view which of the items in that group have
#               been in your party's possession. By default, there are three
#               groups: items, weapons, armors. But you can change these and add
#               more very easily. To use, call this in a script:
#
#                    $scene = Scene_Catalogue.new (X)
#
#               where X is the group number. I'd suggest this script to be used
#               as items which call common events which have that $scene thing
#               in them. By default, it exits to the item menu. Instructions on
#               how to configure the group are at line 31
#------------------------------------------------------------------------------             
# You can also use this as a method of ordering, like from a real catalogue.
# Basically, it brings up your item log, and you can choose any of the items to
# buy. This can be useful for an Animal Crossing Game for example, but I think
# it can be useful for many types of games. In order to use this feature, use
# this call script:
#
#   $scene = Scene_Catalogue.new (X,Y)
#
# where X is the group number and Y is the ordering tax coefficient. I.e., Y is
# a number, and whatever you make that number it will multiply the price by it.
# For example, if Y = 1.15, then there will be 15% ordering tax. I.e. if an item
# costs 50 Gold in a store, then it would cost 58 Gold to order it from the
# catalogue.
#===============================================================================
class Scene_Title
 
  alias catalogue_groups command_new_game
  def command_new_game
    catalogue_groups
    $catalogue = []
    $encountered_items = []
    #===========================================================================
    # CONFIGURABLE AREA
    #---------------------------------------------------------------------------
    # To make a group, make an array, and place each item you wish to have in
    # that group inside the array. Example:
    #
    # $catalogue.push (["Fish",[$data_items[1], $data_items[3], $data_items[32]]])
    # $catalogue.push (["Gold Items",[$data_armors[5], $data_weapons[3]]])
    #
    # That would make two groups. The first group would be called "Fish" and
    # have item 1, item 3, and item 32 in it, and the second group would be
    # called "Gold Items" and include armor 5 and weapon 3 in it.
    # By default, there are three categories, items, weapons and armors.
    #---------------------------------------------------------------------------
    # The basic set up:
    # $catalogue.push (["name", [<array of items included in the group>]])
    #
    # You can set up as many groups as you like.
    #
    # If you know how, you can also put them on the same line, like this:
    # $catalogue = [["Items",$data_items],["Weapons",$data_weapons],["Armors", $data_armors]]
    # but to keep it simple, follow the instructions. In default, items group is
    # 0, weapons group is 1, armors group is 2, and if you add another group
    # underneath, it would be 3, and so on. So, $scene = Scene_Catalogue.new (0)
    # would bring up the items log, etc...
    #===========================================================================
    $catalogue.push (["Item",$data_items.compact])
    $catalogue.push (["Weapon",$data_weapons.compact])
    $catalogue.push (["Armor", $data_armors.compact])
    #===========================================================================
    # END CONFIGURABLE AREA
    #===========================================================================
    for i in 0...$catalogue.size
      $encountered_items[i] = []
      for j in 0...$catalogue[i][1].size
        $encountered_items[i][j] = false
      end
    end
    for i in $data_system.party_members
      actor = $data_actors[i]
      $game_party.gain_weapon (actor.weapon_id,0)
      $game_party.gain_armor (actor.armor1_id,0)
      $game_party.gain_armor (actor.armor2_id,0)
      $game_party.gain_armor (actor.armor3_id,0)
      $game_party.gain_armor (actor.armor4_id,0)
    end
  end
end
#===============================================================================
# Aliases the gain XXX methods in order to turn the fact that you encountered
# the items on
#===============================================================================
class Game_Party
 
  alias modify_encountered_items gain_item
  def gain_item (item_id, n)
    modify_encountered_items (item_id, n)
    if n >= 0
      for i in 0...$catalogue.size
        if $catalogue[i][1].include? ($data_items[item_id])
          $encountered_items[i][$catalogue[i][1].index($data_items[item_id])] = true
        end
      end
    end
  end
 
  alias modify_encountered_weapons gain_weapon
  def gain_weapon (weapon_id, n)
    modify_encountered_weapons (weapon_id, n)
    if n >= 0
      for i in 0...$catalogue.size
        if $catalogue[i][1].include? ($data_weapons[weapon_id])
          $encountered_items[i][$catalogue[i][1].index($data_weapons[weapon_id])] = true
        end
      end
    end
  end
 
  alias modify_encountered_armors gain_armor
  def gain_armor(armor_id, n)
    modify_encountered_armors (armor_id, n)
    if n >= 0
      for i in 0...$catalogue.size
        if $catalogue[i][1].include? ($data_armors[armor_id])
          $encountered_items[i][$catalogue[i][1].index($data_armors[armor_id])] = true
        end
      end
    end
  end
end 
#===============================================================================
# Draws the information screen
#===============================================================================
class Window_ItemInfo < Window_Base
 
  def initialize
    super (24, 24, 592,432)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.z = 500
    self.visible = false
  end

  def quick_write_text (x,y,text)
    tw = (self.contents.text_size(text)).width
    if tw > 95
      tw = 95
    end
    self.contents.draw_text (x-tw,y,tw+5,32,text)
  end
 
  def refresh (item)
    self.contents.clear
    case item
    when RPG::Item
      type = 0
      type_name = "Item"
    when RPG::Weapon
      type = 1
      type_name = "Weapon"
    when RPG::Armor
      type = 2
      type_name = "Armour"
    end
    self.contents.blt (93,64,RPG::Cache.icon(item.icon_name),Rect.new(0,0,24,24))
    self.contents.font.color = system_color
    self.contents.draw_text (4,96,80,32, "Type:")
    if type != 0
      self.contents.draw_text (4,128,87,32, "Equippable by:")
    end
    self.contents.draw_text (240,40,120,32,"Description:")
    quick_write_text (320,210,"Stats:")
    self.contents.draw_text (65,252,100,32,"Price:")
    if type == 1
      self.contents.draw_text (65,284,100,32,$data_system.words.atk+":")
    elsif type == 2
      self.contents.draw_text (65,284,100,32,"Evasion:")
    end
    if type != 0
      self.contents.draw_text (65,316,100,32,$data_system.words.pdef+":")
      self.contents.draw_text (65,348,100,32,$data_system.words.mdef+":")
      self.contents.draw_text (305,252,100,32,$data_system.words.str+":")
      self.contents.draw_text (305,284,100,32,$data_system.words.agi+":")
      self.contents.draw_text (305,316,100,32,$data_system.words.dex+":")
      self.contents.draw_text (305,348,100,32,$data_system.words.int+":")
    else
      self.contents.draw_text (65,284,100,32,"Occasion:")
      self.contents.draw_text (65,316,80,32,"Scope:")
      self.contents.draw_text (65,348,80,32,"Usage:")
      self.contents.draw_text (305,254,80,32,$data_system.words.hp+" Gain:")
      self.contents.draw_text (305,286,80,32,$data_system.words.sp+" Gain:")
      words = ["","Max "+$data_system.words.hp+":","Max "+$data_system.words.hp+":",
              $data_system.words.str+":", $data_system.words.agi+":",
              $data_system.words.dex+":", $data_system.words.int+":"]
      self.contents.draw_text (305,318,100,32,words[item.parameter_type])
    end
    self.contents.fill_rect (1,33,559,1,Color.new(-150,-150,-255,255))
    self.contents.fill_rect (0,34,559,1,Color.new(-255,-255,-255,255))
    self.contents.fill_rect (0,1,1,398,Color.new(-150,-150,-255,255))
    self.contents.fill_rect (1,1,1,398,Color.new(-255,-255,-255,255))
    self.contents.fill_rect (559,1,1,398,Color.new(-150,-150,-255,255))
    self.contents.fill_rect (558,1,1,398,Color.new(-255,-255,-255,255))
    self.contents.font.color = normal_color
    quick_write_text (320,0,item.name)
    quick_write_text (190,96,type_name)
    quick_write_text (285,252,item.price.to_s)
    if type == 1
      quick_write_text (285,284,item.atk.to_s)
    elsif type == 2
      quick_write_text (285,284,item.eva.to_s)
    end
    if type != 0
      quick_write_text (290,316,item.pdef.to_s)
      quick_write_text (290,348,item.mdef.to_s)
      sign = positive_num?(item.str_plus)
      quick_write_text (500,252,sign+item.str_plus.to_s)
      sign = positive_num?(item.agi_plus)
      quick_write_text (500,284,sign+item.agi_plus.to_s)
      sign = positive_num?(item.dex_plus)
      quick_write_text (500,316,sign+item.dex_plus.to_s)
      sign = positive_num?(item.int_plus)
      quick_write_text (500,348,sign+item.int_plus.to_s)
    else
      words = ["Always","In Battle","Out of Battle","Never"]
      quick_write_text (285,284,words[item.occasion])
      words = ["N/A", "One Enemy", "All Enemies", "One Ally", "All Allies",
               "One Felled Ally", "All Felled Allies", "The User"]
      quick_write_text (285,316,words[item.scope])
      if item.consumable; quick_write_text (285,348,"One Use")
      else; quick_write_text (285,348,"Unlimited Uses")
      end
      if item.recover_hp == 0 && item.recover_hp_rate == 0
        hp_recovery_string = "N/A"
      elsif item.recover_hp_rate != 0 && item.recover_hp_rate != 0
        hp_recovery_string = item.recover_hp_rate.to_s+"% + "+item.recover_hp.to_s
      elsif item.recover_hp != 0
        hp_recovery_string = item.recover_hp.to_s
      else
        hp_recovery_string = item.recover_hp_rate.to_s
      end
      quick_write_text (500,254,hp_recovery_string)
      if item.recover_sp == 0 && item.recover_sp_rate == 0
        sp_recovery_string = "N/A"
      elsif item.recover_sp_rate != 0 && item.recover_sp_rate != 0
        sp_recovery_string = item.recover_sp_rate.to_s+"% + "+item.recover_sp.to_s
      elsif item.recover_sp != 0
        sp_recovery_string = item.recover_sp.to_s
      else
        sp_recovery_string = item.recover_sp_rate.to_s
      end
      quick_write_text (500,286,sp_recovery_string)
      if item.parameter_type != 0
        quick_write_text (500,318,"+"+item.parameter_points.to_s)
      end
    end
    if type != 0
      equip_classes = []
      substring = ""
      for i in 1...$data_classes.size
        e_class = $data_classes[i]
        string = ""
        if type == 1
          test = e_class.weapon_set
        elsif type == 2
          test = e_class.armor_set
        end
        if test.include? (item.id)
          if e_class.name.size <= 4
            string = e_class.name.dup
          else
            string += e_class.name[0,1]
            for i in 1...e_class.name.size
              substring = e_class.name[i,1]
              if substring !="a"&&substring !="e"&&substring !="i"&&substring !="o"&&substring != "u"
                string +=substring
              end
            end
            if string.size > 4
              string = string[0,2]+string[string.size-2,2]
            end
          end
          equip_classes.push (string.upcase!)
        end
      end
      if equip_classes.nitems == 0
        quick_write_text (160,296,"N/A")
      else
        line_length = 0
        line_number = 0
        for i in 0...equip_classes.size
          if i != equip_classes.size - 1
            tw = (self.contents.text_size(equip_classes[i]+", ")).width
            self.contents.draw_text (90+line_length,128+line_number,tw,32,equip_classes[i]+", ")
          else
            tw = (self.contents.text_size(equip_classes[i])).width
            self.contents.draw_text (90+line_length,128+line_number,tw,32,equip_classes[i])
          end
          line_length += tw
          if line_length > 75
            line_number +=32
            line_length = -80
          end
        end
        self.contents.fill_rect (209,202,350,1,Color.new(-255,-255,-255,255))
        self.contents.fill_rect (210,201,350,1,Color.new(-150,-150,-255,255))
        if line_number > 64
          self.contents.fill_rect (209,34,1,220,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (210,33,1,220,Color.new(-150,-150,-255,255))
          self.contents.fill_rect (0,254,209,1,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (1,253,209,1,Color.new(-150,-150,-255,255))
        elsif line_number > 32
          self.contents.fill_rect (209,34,1,120+line_number,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (210,33,1,120+line_number,Color.new(-150,-150,-255,255))
          self.contents.fill_rect (209,120+line_number,1,82-line_number,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (210,120+line_number,1,82-line_number,Color.new(-150,-150,-255,255))
          self.contents.fill_rect (0,154+line_number,209,1,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (1,153+line_number,209,1,Color.new(-150,-150,-255,255))
        else
          self.contents.fill_rect (209,34,1,168,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (210,33,1,168,Color.new(-150,-150,-255,255))
          self.contents.fill_rect (0,202,209,1,Color.new(-255,-255,-255,255))
          self.contents.fill_rect (1,201,209,1,Color.new(-150,-150,-255,255))
        end
      end
    end
    if item.is_a? (RPG::Item)
      self.contents.fill_rect (209,34,1,170,Color.new(-255,-255,-255,255))
      self.contents.fill_rect (210,33,1,170,Color.new(-150,-150,-255,255))
      self.contents.fill_rect (0,202,559,1,Color.new(-255,-255,-255,255))
      self.contents.fill_rect (1,201,559,1,Color.new(-150,-150,-255,255))
    end
    desc = item.description
    line = []
    ts = desc.size
    line_index = 0
    limit = 0
    loop do
      line[line_index] = desc[limit, 40]
      for i in 1...40
        if line[line_index][-i,1] == " " || limit + (40-i) >= desc.size
          limit += (41-i)
          ts -= 40-i
          line_index +=1
          break
        else
          line[line_index][-i,1] = " "
        end
      end
      if ts <= 0
        break
      end
    end 
    line.compact!
    for i in 0...line.size
      self.contents.draw_text (220, 28*i + 76, 350,32, line[i])
    end
  end
 
  def positive_num? (num)
    if num > 0
      return "+"
    else
      return ""
    end
  end
end
#===============================================================================
# This window displays the ratio of collected items to total items
#===============================================================================
class Window_TotalItemsRatio < Window_Base
 
  def initialize (group_number)
    super (400,0,240,64)
    self.contents = Bitmap.new (width-32, height-32)
    @total = $catalogue[group_number][1].size
    @current = 0
    for i in 0...@total
      if $encountered_items[group_number][i] == true
        @current += 1
      end
    end
    if @current == @total
      self.contents.font.color = system_color
    end
    tw = (self.contents.text_size(@current.to_s + " / " + @total.to_s)).width
    self.contents.draw_text (104 - (tw/2),0,tw,32,@current.to_s + " / " + @total.to_s)
  end
end
#===============================================================================
# This window displays all collected items
#===============================================================================
class Window_Catalogue < Window_Selectable
 
  def initialize (group, price_multiplier = nil)
    super (0,128,640,352)
    @column_max = 2
    @group = $catalogue[group][1]
    @group_number = group
    @price_multiplier = price_multiplier
    refresh
  end
 
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    # Check inventory for new additions
    for i in 0...@group.size
      if @price_multiplier != nil
        if $encountered_items[@group_number][i] == true
          @data.push (@group[i])
        end
      else
        @data.push (@group[i])
      end
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(@data[i], i)
      end
    end
  end
 
  def draw_item (item, index)
    if @price_multiplier != nil
      if $game_party.gold >= (item.price * @price_multiplier)
        self.contents.font.color = normal_color
        self.contents.draw_text ((320*(index%2))+30,(index/2)*32,200,32,item.name)
      else
        self.contents.font.color = disabled_color
        self.contents.draw_text ((320*(index%2))+30,(index/2)*32,200,32,item.name)
      end
      if item.price != 0
        tw = self.contents.text_size ((item.price * @price_multiplier).to_i.to_s)
        self.contents.draw_text (270 + (326*(index%2))-tw.width ,(index/2)*32,tw.width,32,(item.price * @price_multiplier).to_i.to_s)
      else
        tw = self.contents.text_size ("N/A")
        self.contents.draw_text (270 + (326*(index%2))-tw.width ,(index/2)*32,tw.width+10,32,"N/A")
      end
    else
      if $encountered_items[@group_number][index] == true
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
      self.contents.draw_text ((320*(index%2))+30,(index/2)*32,200,32,item.name)
      if item.price != 0
        tw = self.contents.text_size (item.price.to_s)
        self.contents.draw_text (270 + (326*(index%2))-tw.width ,(index/2)*32,tw.width,32,item.price.to_s)
      else
        tw = self.contents.text_size ("N/A")
        self.contents.draw_text (270 + (326*(index%2))-tw.width ,(index/2)*32,tw.width+10,32,"N/A")
      end
    end
    self.contents.blt((320*(index%2)),(index/2)*32+4,RPG::Cache.icon(item.icon_name),Rect.new(0,0,24,24))
  end
 
  def item
    return @data[self.index]
  end
end
#===============================================================================
# This window shows how many of that type of item you possess
#===============================================================================
class Window_CurrentlyPossessed < Window_Base
 
  def initialize
    super (0,416,300,64)
    self.contents = Bitmap.new(width-32,height-32)
  end
 
  def refresh (item)
    self.contents.clear
    case item
    when RPG::Item
      quantity = $game_party.item_number (item.id)
    when RPG::Weapon
      quantity = $game_party.weapon_number (item.id)
      for actor in $game_party.actors
        if item.id == actor.weapon_id
          quantity += 1
        end
      end
    when RPG::Armor
      quantity = $game_party.armor_number (item.id)
      for actor in $game_party.actors
        if item.id == actor.armor1_id || item.id == actor.armor2_id || item.id == actor.armor3_id || item.id == actor.armor4_id
          quantity += 1
        end
      end
    end
    self.contents.font.color = system_color
    self.contents.draw_text (0, 4,300,22,"Currently Possessed:")
    self.contents.font.color = normal_color
    ts = (self.contents.text_size(quantity.to_s)).width
    self.contents.draw_text (268 - ts, 4,ts,22,quantity.to_s)
  end
end
#===============================================================================
# This window shows the price of the item with ordering tax
#===============================================================================
class Window_TotalPrice < Window_Base
 
  def initialize (price_multiplier)
    super (300,416,180,64)
    @price_multiplier = price_multiplier
    self.contents = Bitmap.new(width-32,height-32)
  end
 
  def refresh (item)
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text (0,4,100,32,"Ordering Tax:")
    if item.price > 0
      ts = (self.contents.text_size (((100*@price_multiplier)-100).to_i.to_s+"%")).width
      ts2 = (self.contents.text_size (((100*@price_multiplier)-100).to_i.to_s)).width
      self.contents.draw_text (148-ts+ts2,4,ts-ts2,32,"%")
      self.contents.font.color = normal_color
      self.contents.draw_text (146-ts,4,ts,32,((100*@price_multiplier)-100).to_i.to_s)
    else
      ts = (self.contents.text_size ("N/A")).width
      self.contents.font.color = normal_color
      self.contents.draw_text (146-ts,4,ts+10,32,"N/A")
    end
  end
end
#===============================================================================
# This window displays the name of the group being viewed
#===============================================================================
class Window_CatalogueName < Window_Base
  def initialize (group)
    super (0,0,400,64)
    self.contents = Bitmap.new(width - 32, height - 32)
    @group = $catalogue[group][0]
    self.contents.font.color = system_color
    ts = self.contents.text_size (@group + " Log")
    self.contents.draw_text (184 - 0.5*ts.width,0,ts.width,32,@group + " Log")
  end
end
#===============================================================================
# The main processing of the script
#===============================================================================
class Scene_Catalogue
 
  def initialize (group_number, price_multiplier = nil)
    @group_number = group_number
    @price_multiplier = price_multiplier
  end
 
  def main
    @name_window = Window_CatalogueName.new (@group_number)
    @help_window = Window_Help.new
    @help_window.y = 64
    if @price_multiplier!=nil
      @catalogue_window = Window_Catalogue.new (@group_number,@price_multiplier)
      @catalogue_window.height = 288
      @possession_window = Window_CurrentlyPossessed.new
      @possession_window.refresh (@catalogue_window.item)
      @gold_window = Window_Gold.new
      @gold_window.y = 416
      @gold_window.x = 480
      @totalprice_window = Window_TotalPrice.new (@price_multiplier)
      @totalprice_window.refresh (@catalogue_window.item)
      # Make quantity input window
      @number_window = Window_ShopNumber.new
      @number_window.active = false
      @number_window.visible = false
      @number_window.z = 500
      @number_window.x = 136
    else
      @catalogue_window = Window_Catalogue.new (@group_number)
      @itemdata_window = Window_ItemInfo.new
    end
    @catalogue_window.active = true
    @catalogue_window.index = 0
    @ratio_window = Window_TotalItemsRatio.new (@group_number)
    @help_window.set_text (@catalogue_window.item == nil ? "" : @catalogue_window.item.description)
    @help_window.update
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
    # Dispose of windows
    if @price_multiplier != nil
      @number_window.dispose
      @possession_window.dispose
      @gold_window.dispose
      @totalprice_window.dispose
    else
      @itemdata_window.dispose
    end
    @ratio_window.dispose
    @catalogue_window.dispose
    @help_window.dispose
    @name_window.dispose
  end
 
  def update
    if @price_multiplier == nil && @itemdata_window.visible
      update_iteminfo
    elsif @catalogue_window.active
      catalogue_update
    elsif @number_window.active
      number_update
    end
  end
 
  def update_iteminfo
    if Input.trigger? (Input::B)
      $game_system.se_play($data_system.cancel_se)
      @itemdata_window.visible = false
      @catalogue_window.active = true
    end
  end
 
  def number_update
    @number_window.update
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Set quantity input window to inactive / invisible
      @number_window.active = false
      @number_window.visible = false
      @catalogue_window.active = true
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Play shop SE
      $game_system.se_play($data_system.shop_se)
      # Set quantity input window to inactive / invisible
      @number_window.active = false
      @number_window.visible = false
      $game_party.lose_gold((@number_window.number * @item.price * @price_multiplier).to_i)
      case @item
      when RPG::Item
        $game_party.gain_item(@item.id, @number_window.number)
      when RPG::Weapon
        $game_party.gain_weapon(@item.id, @number_window.number)
      when RPG::Armor
        $game_party.gain_armor(@item.id, @number_window.number)
      end
      # Refresh each window
      @gold_window.refresh
      @possession_window.refresh (@item)
      @catalogue_window.active = true
    end
  end
 
  def catalogue_update
    previous_item = @catalogue_window.item
    @catalogue_window.update
    if @catalogue_window.item != previous_item
      @help_window.set_text (@catalogue_window.item == nil ? "" : @catalogue_window.item.description)
      @help_window.update
      if @price_multiplier != nil
        @possession_window.refresh (@catalogue_window.item)
        @totalprice_window.refresh (@catalogue_window.item)
      end
    end
    if Input.trigger?(Input::C)
      if @price_multiplier != nil
        @item = @catalogue_window.item
        # If item is invalid, or price is higher than money possessed, or price = 0
        if @item == nil || @item.price <= 0 || $game_party.gold < (@item.price*@price_multiplier).to_i
          # Play buzzer SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # Get items in possession count
        case @item
        when RPG::Item
          number = $game_party.item_number(@item.id)
        when RPG::Weapon
          number = $game_party.weapon_number(@item.id)
        when RPG::Armor
          number = $game_party.armor_number(@item.id)
        end
        # If 99 items are already in possession
        if number == 99
          # Play buzzer SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Calculate maximum amount possible to buy
        max = (@item.price * @price_multiplier).to_i == 0 ? 99 : $game_party.gold / (@item.price * @price_multiplier).to_i
        max = [max, 99 - number].min
        # Change windows to quantity input mode
        @catalogue_window.active = false
        @number_window.set(@item, max, (@item.price * @price_multiplier).to_i)
        @number_window.active = true
        @number_window.visible = true
      else
        @itemdata_window.refresh (@catalogue_window.item)
        @catalogue_window.active = false
        @itemdata_window.visible = true
      end
    end
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to menu screen
      if @price_multiplier == nil
        $scene = Scene_Item.new
      else
        $scene = Scene_Map.new
      end
      return
    end
  end
end   

I haven't really tested it, but it ought to work. And:
Quote
If you do upgrade, remember to retain your groups and copy them into the new script.

Title: Re: Catalogue Script v 1.4
Post by: Memor-X on August 11, 2007, 08:50:13 AM
thanks modern algebra, you'll be remembered for this
Title: Re: Catalogue Script v 1.4
Post by: modern algebra on October 11, 2007, 07:02:42 PM
Alright, I've been working on a version 2.0 for this, and the purpose of my update is to allow easy integration for any type of catalogue information you might desire. What this means is that you can make groups which hold monsters, or skills, or whatever other type of data you might want to make catalogues for and use the catalogue interface to get to that information (Naturally, to make your own groups you would need to be a scripter, but I am willing to make groups for you if you cannot). Considering this, I wanted to know what you guys felt of this design for the bestiary data:

This is of a large battler, as I wanted to test the size translation
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg209.imageshack.us%2Fimg209%2F6410%2Fbestiarypiclg9.png&hash=21562ff3d7ab399e8154a5e509d2a9c1130bfd73)


I will probably make some sort of analyze skill effect to go along with it, and only display information if the creature has been analyzed. However, what do you guys think of the info I show? Should I show all the specific stats? Should I show EXP and Gold somewhere? Should I shrink large battlers so that they do not take up so much space? Should I do something with the icons to make it more clear what elements the creature is strong or weak against? Should I get rid of the letters and just have the opacity show that?

I appreciate any comments. Also, it looks like the window is not centred, but it is, my windowblinds just cuts stuff.
Title: Re: Catalogue Script v 1.4
Post by: The Shadow on October 11, 2007, 07:30:32 PM
Instead of having the monsters battler in the backround, I would suggest making a new window, with a smaller version of the monsters battler inside. Having the battler in the backround, makes it harder for some people to read the white text if the text cross the battler.(Or black, wich depends on wich colour you have on the text :)), but that's just what I think.

Other from that, it sounds like a nice edition to the script.
Title: Re: Catalogue Script v 1.4
Post by: modern algebra on October 11, 2007, 09:35:54 PM
Well, most monsters wouldn't have so large a battler. I don't like the idea of a new window, assuming that by that you mean a window that you call if you want to see the battler (I am assuming that simply because having another window visible at the same time doesn't rectify the problem). However, I could shrink large battlers when they expand over the text. I'll post what that looks like in a bit. Alternately, I could make the battler semi-transparent, more so then it already is.

The shrunken battler looks like this:

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg69.imageshack.us%2Fimg69%2F7935%2Fsecondbestiarypicym7.png&hash=cb381c367658e73023b6ac8385e05149736f4ce2)

And the low opacity like this:

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg215.imageshack.us%2Fimg215%2F7381%2Fthirdbestiarydemoft6.png&hash=0e4a39abea576cc6aecce33ad5bdbac5289b7ed0)

Naturally, I wouldn't do either unless the battler is wide and expands over the text
Title: Re: Catalogue Script v 1.4
Post by: Leventhan on October 12, 2007, 03:38:42 AM
Very nice addition to the script, modern algebra!
But I think a better design is a split-screen.

One contains the monsters' stats, while the other the pic and description. :)
Title: Re: Catalogue Script v 1.4
Post by: modern algebra on October 12, 2007, 06:04:52 AM
A picture of what you mean? I don't really see how it would accomodate large battlers to split screen it. Maybe I just don't get what you mean  :-\
Show me a picture.
Title: Re: Catalogue Script v 1.4
Post by: modern algebra on October 14, 2007, 12:55:09 AM
Also, what do you guys think of this:

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg165.imageshack.us%2Fimg165%2F9503%2Fbestiaryscreen1ya2.png&hash=07719365696edac288a4e4bb99c2720911f649d7)

Should I just leave icons out of the bestiary? They can look pretty crappy resized like that. If you think I should, which looks better? THe one aabove or:

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg84.imageshack.us%2Fimg84%2F9775%2Fbestiaryscreen1yo8.png&hash=6d137bd4b70530432042718d111c05ef01351a60)