The RPG Maker Resource Kit

RMRK RPG Maker Creation => VX Ace => VXA Scripts Database => Topic started by: SeMcDun on December 27, 2014, 05:41:21 AM

Title: Auto Pricetag Equipment
Post by: SeMcDun on December 27, 2014, 05:41:21 AM
Auto Pricetag Equipment
Version: v1.0
Author: SeMcDun
Date: 2014.12.27

Description


This script will automatically generate the price for equipment instead of setting each price individually using the database.
Depending on the values you enter, a different price is generated.

BASE_VALUE adds a value to all equipment
STAT adds a value to all equipment for each stat the equipment gives. (So if stat is set to 10 and a weapon has 4 attack, this would add 40 to the price of the equipment.)
FEATURE_PRICE adds a value to all equipment for each feature the weapon has.
WEAPON_PRICE adds a value to all weapons.
ARMOR_PRICE adds a value to all armors.

IGNORE_PHYSICAL can be set to true or false. This is whether or not you want the Element Attack - Physical feature to also add the FEATURE_PRICE value.

Notetags;
<lock_price>
Keep the same price you set in the database.

<added_price>
Adds a value after the price is generated.


Instructions

See the header of the script.

Script


Code: [Select]
#===============================================================================
# SeM's Auto Equipment Pricetag VXA
# - v1.0
# By SeMcDun
# Last Update: 29/12/2014
#===============================================================================
# Description;
# -- Automatically price weapons/armours
# -- Set the values in the head of the script and when the game is run, prices
#    will automatically be set
#===============================================================================
# Installation;
# -- Set the values in the head of the script.
# -- Add <lock_price> to stop a price being changed.
# -- Add <added_price x> to add x to the generated price.
#===============================================================================
$imported = {} if $imported.nil?
$imported["SEM-autoPrice"] = true
#===============================================================================
# * module SEM::AUTOPRICE
#-------------------------------------------------------------------------------
module SEM
  module AUTOPRICE
   
    # All Items
    # This value is added to all weapons/armour
    BASE_PRICE = 100
   
    # This value is added to all weapons
    WEAPON_PRICE = 800
   
    # This value is added to all armours
    ARMOR_PRICE = 300
   
    # Equipment
    # Each stat increases the cost by this amount
    STAT = 340
   
    # For each feature - add this value
    # (This ignores Element Attack - Physical by default)
    FEATURE_PRICE = 850
   
    # When set to true, Element Attack - Physical will be ignored
    # When set to false, Element Attack - Physical will also add the
    # FEATURE_PRICE value
    IGNORE_PHYSICAL = true
   
    # Set whether to use this feature for weapons/armour or both
    AUTOSET_WEAPON_PRICE = true
    AUTOSET_ARMOR_PRICE = true
   
   
  end
  module REGEXP
    LOCK_PRICE = /<lock[ _-]?price>/i
    ADDED_PRICE = /<added[ _-]?price\s*(\d+)>/i
  end
end

#==============================================================================
# ■ DataManager
#==============================================================================
module DataManager
 
  #--------------------------------------------------------------------------
  # alias method: load_database
  #--------------------------------------------------------------------------
  class <<self; alias load_database_auto_price load_database; end
  def self.load_database
    load_database_auto_price
    auto_price
  end
 
  #--------------------------------------------------------------------------
  # new method: auto_price
  #--------------------------------------------------------------------------
  def self.auto_price
    for weapon in $data_weapons
      next if weapon.nil?
      weapon.load_notetags_lock_price
      weapon.auto_set_price
    end
    for armor in $data_armors
      next if armor.nil?
      armor.load_notetags_lock_price
      armor.auto_set_price
    end
   
  end
 
 
end # DataManager

#==============================================================================
# ■ RPG::BaseItem
#==============================================================================

class RPG::BaseItem
 
  #--------------------------------------------------------------------------
  # common cache: load_notetags_lock_price
  #--------------------------------------------------------------------------
  def load_notetags_lock_price
    @lock_price = false
    @added_price = 0
    #---
    self.note.split(/[\r\n]+/).each { |line|
      case line
      #---
      when SEM::REGEXP::LOCK_PRICE
        @lock_price = true
      when SEM::REGEXP::ADDED_PRICE
        @added_price = $1.to_i
      #---
      end
    } # self.note.split
    #---
  end
 
  def lock_price?
    return @lock_price
  end
 
  def auto_set_price
    # If the item isn't a key item
    if lock_price? == false
      # Not a locked price - allow the price change
      process_auto_price
    end
  end
 
  def process_auto_price
    if self.is_a?(RPG::Weapon)
      if SEM::AUTOPRICE::AUTOSET_WEAPON_PRICE
        # Set price to 0 to begin
        self.price = 0
        self.price += SEM::AUTOPRICE::BASE_PRICE
        add_equipment_price
        add_feature_price
        add_weapon_price
        add_added_price
      end
    end
    if self.is_a?(RPG::Armor)
      if SEM::AUTOPRICE::AUTOSET_ARMOR_PRICE
        # Set price to 0 to begin
        self.price = 0
        self.price += SEM::AUTOPRICE::BASE_PRICE
        add_equipment_price
        add_feature_price
        add_armor_price
        add_added_price
      end
    end
  end
 
  def add_added_price
    @price += @added_price
  end
 
  def add_weapon_price
    @price += SEM::AUTOPRICE::WEAPON_PRICE
  end
 
  def add_armor_price
    @price += SEM::AUTOPRICE::ARMOR_PRICE
  end
 
  def add_equipment_price
    for i in 0..7
      # for each stat
      @price += SEM::AUTOPRICE::STAT * self.params[i]
    end
  end
 
  def add_feature_price
    self.features.each do |feature|
      if SEM::AUTOPRICE::IGNORE_PHYSICAL == true
        if !(feature.code == 31 && feature.data_id == 1)
          # Physical attack - Don't add the price
          @price += SEM::AUTOPRICE::FEATURE_PRICE
        end
      else
        # Not ignoring physical - Add the price no matter what feature is found
        @price += SEM::AUTOPRICE::FEATURE_PRICE
      end
    end
  end
 
 
end # RPG::BaseItem


Credit



Support


For any problems or questions just leave a post and I'll try and help when I can.

Known Compatibility Issues


Terms of Use

Free to use in commercial or non-commercial games. Credit would be nice, but not really necessary with a small utility script like this.

Title: Re: Auto Pricetag Equipment
Post by: strike on December 27, 2014, 06:10:42 AM
I was actually expecting a spambot because of the title. hahaha. Cool script though.
Title: Re: Auto Pricetag Equipment
Post by: &&&&&&&&&&&&& on December 27, 2014, 05:58:22 PM
It's always nice to have another scripter around. :)
Thank you for sharing this with us.
Title: Re: Auto Pricetag Equipment
Post by: Zeriab on December 27, 2014, 07:31:40 PM
Interesting idea you have. I like how it is optional and generally easy to adjust before and afterwards in the database.

I do suggest changing the regular expressions a bit:
Code: [Select]
  module REGEXP
    LOCK_PRICE = /<lock[ _-]?price>/i
    ADDED_PRICE = /<added[ _-]?price\s*(\d+)>/i
  end

The grouping without backreference in particular was not needed since you are using the case insensitive option.
I suggest you try to explain what my changes means. What different strings will match now. (See a reference (https://sites.google.com/site/zeriabsjunk/tutorials/regexp-in-rgss) for help if needed)

*hugs*
 - Zeriab
Title: Re: Auto Pricetag Equipment
Post by: SeMcDun on December 27, 2014, 09:57:35 PM
With the /i being at the end, it means case insensitive (so you can delete the ADDED_PRICE|added_price stuff).
The [ _-] means the user can put in a space, an underscore or a dash in between the two words.
The ? means use the previous regular expression. Does this mean there could be any number of spaces, underscores or dashes in between the "<lock" and the "price>" ?
The \s means if the tag begins on one line and ends on another, it will still work?

I'm not sure what
* 0 or more previous regular expression
means. Is that saying, there is possibly no regular expression? When you use $1, $2 and so on to assign the regexp to a variable?

And the (\d+) is grouping together \d (a digit from 0 to 9) and the + is saying there is at least 1 regular expression inside the ( )?
Any amount of digits between the () becomes 1 regular expression.

I've been meaning to go through your regexp tutorial for a while now, actually. I continued learning how to code from scratch, but I kept franken-coding the regexp stuff.

Ps. I can rename the subject if it sounds too much like broken English. aha :)
I'm gonna go with "It was late when I posted this" ;)


Title: Re: Auto Pricetag Equipment
Post by: strike on December 27, 2014, 11:40:58 PM
it doesn't sound like broken english, just the title seemed worded like a spambot would word it. Like "Used Sports Equipment" or something.
Title: Re: Auto Pricetag Equipment
Post by: Zeriab on December 28, 2014, 11:52:58 AM
Good try ^_^
No need to hurry about reading my tutorial, though do let me know if you have questions or suggestions should end up reading it.

? means either 0 or 1 occurrence. I.e. either a single space, _underscore or -dash. Or no character at all. So the following for strings are all ok.
\s is a whitespace character. Could be space, tabular, carriage return, new line. \s* means there can be any number of whitespace characters including 0. The following are all valid matches:
The last one is quite ugly, but still ok. If we use \s+ instead there must be at least one whitespace character so the last one, <addedprice19>, would not be valid then. That is why we have \d+ and not \d*. It makes no sense not to have a number in the added_price tag. The ( ) is used for the backreference. I.e. whatever is matching that in the parentheses are going in the $1, $2, etc. depending which grouping it is. (?: ) is used for when you do not want to include it in the $1, $2, etc.



When releasing a script it is usually a good idea to clean up old debugging code.
Code: [Select]
      #msgbox_p(line)

I would also say your comments are a bit too verbose.
Take for example
Code: [Select]
  def add_armor_price
    @price += SEM::AUTOPRICE::ARMOR_PRICE
  end # add_armor_price
The comment there give no new nor important information. Just keep it like this instead:
Code: [Select]
  def add_armor_price
    @price += SEM::AUTOPRICE::ARMOR_PRICE
  end

Another example:
Code: [Select]
  def add_equipment_price
    for i in 0..7
      # for each stat
      @price += SEM::AUTOPRICE::STAT * self.params[i]
    end # for each stat
  end # add_equipment_price
Here I would change the comments thus:
Code: [Select]
  def add_equipment_price
    # For each stat
    for i in 0..7
      @price += SEM::AUTOPRICE::STAT * self.params[i]
    end
  end

What do you think? Does it make sense?
*hugs*
 - Zeriab