RMRK is retiring.
Server is paid up for the rest of 2026, but the forum may go after that. See here for more information. Please archive or save anything you would like to keep before 2027.
Main Menu
  • Welcome to The RPG Maker Resource Kit.

Auto Pricetag Equipment

Started by SeMcDun, December 27, 2014, 05:41:21 AM

0 Members and 1 Guest are viewing this topic.

SeMcDun

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




#===============================================================================
# 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




  • SeMcDun

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.


strike

I was actually expecting a spambot because of the title. hahaha. Cool script though.

&&&&&&&&&&&&&

It's always nice to have another scripter around. :)
Thank you for sharing this with us.
&&&&&&&&&&&&&&&&

Zeriab

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:
  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 for help if needed)

*hugs*
- Zeriab

SeMcDun

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" ;)



strike

it doesn't sound like broken english, just the title seemed worded like a spambot would word it. Like "Used Sports Equipment" or something.

Zeriab

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.
  • <lock price>
  • <lock_price>
  • <lock-price>
  • <lockprice>
\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:

  • <added_price   123>
  • <added-price 42>
  • <addedprice19>
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.
      #msgbox_p(line)

I would also say your comments are a bit too verbose.
Take for example
  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:
  def add_armor_price
    @price += SEM::AUTOPRICE::ARMOR_PRICE
  end


Another example:
  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:
  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