Source Thread: http://rmrk.net/index.php/topic,44618.0.html
적이 드롭하는 아이템의 갯수를 확장하는 스크립트입니다. 일단 사용법은 스크립트의 헤더를 보기 바랍니다(같은 사람이 만든 VX용과 비슷함).
- 이 스크립트로 추가한 드롭 아이템은 몬스터 도감류 스크립트 사용시 도감에 등록되지 않을 수 있습니다. 또한 일부 스크립트와 호환성에 문제가 있을 수도 있습니다.
#============================================================================== # Drop Options [VXA] # Version: 1.0 # Author: modern algebra (rmrk.net) # Date: December 19, 2011 #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Description: # # This script is very simple. All it does is allow you to make item drops a # little less static in some very simple ways: # # (a) you can make more than three drops for each enemy, so enemies can # drop a greater variety of loot; # (b) you can place a cap on the amount of these extra drops, so if you # want a boss to have a 100% chance of dropping one of three items, but # only one, then you can do that; # (c) you can use percentile rather than denominator based drops; and # (d) you can randomize the amount of gold dropped by setting a range # within which it can fall. # # If you are using any scripts that show loot drops of enemies (such as a # bestiary), the effects of this script will not be correctly reflected in # that without direct modifications. If you are using such a script, please # feel free to post a link to it in this script's thread in RMRK and I will # write a patch for it. #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Instructions: # # Place this script above Main and below any other scripts in the Script # Editor (F11). # # All configuration happens in the note boxes of enemies. If you wish to add # a new drop, place this code in a note box for the enemy: # # \drop[type id, probability] # type : the type, either I (for Item), W (for Weapon), or A (for # Armor). # id : This is the ID of the item, weapon, or armor. # probability : This is the probability the item, weapon, or armor will # drop. If you put a % sign after the number, then it will # drop that percentage of the time. If not, then the number # you put here will be the denominator, same as with # regular drops. The number has to be an integer. # EXAMPLES: # \drop[i1, 65%] # This will mean that the item with ID 1 (Potion by default) will drop # 65% of the time when you kill this enemy. # \drop[a5, 8] # This will mean that the armor with ID 5 (Mithril Shield by default) # will drop 1/8 times you kill this enemy. # # To set a maximum on the number of extra drops (note that this only applies # to extra drops set up in the note field - the two default drops are exempt # from this cap), you can use the code: # # \max_drop[x] # x : the maximum amount of extra drops that you want. # EXAMPLE: # If an enemy is set up like this: # \drop[w3, 100%] # \drop[w4, 100%] # \max_drop[1] # Then that means that the enemy will definitely drop either Weapon 3 # (Spear) or Weapon 4 (Short Sword), but will not drop both since # the \max_drop code prevents it from dropping more than one of the notebox # drops. # # To randomize the amount of gold an enemy drops, place the following code # in its note box: # # \gold[variance] # variance : this is an integer, and the amount of gold dropped is # calculated by randomly selecting a number between 0 and this value, # and then adding it to the regular gold drop you set in the database. # EXAMPLE: # If an enemy has 5 gold set as its drop in the database, then the # following note: # \gold[12] # will mean that the enemy will drop anywhere between 5 and 17 gold upon # its death. #============================================================================== $imported = {} unless $imported $imported[:MADropOptions] = true #============================================================================== # ** RPG::Enemy #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Summary of Changes: # aliased method - gold # new method - random_gold; extra_drops; max_drop #============================================================================== class RPG::Enemy #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # * Gold #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ alias ma_drpopt_gold_2go9 gold def gold(*args, &block) (rand(ma_random_gold + 1)) + ma_drpopt_gold_2go9(*args, &block) end #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # * Random Gold #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def ma_random_gold (@ma_rand_gold = self.note[/\\GOLD\[(\d+)\]/i] != nil ? $1.to_i : 0) if !@ma_rand_gold @ma_rand_gold end #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # * Extra Drops #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def ma_extra_drops if @ma_extra_drops.nil? @ma_extra_drops = [] self.note.scan(/\\DROP\[\s*([IWA])\s*(\d+),?\s*(\d+)(%?)\s*\]/i).each { |match| drop = RPG::Enemy::DropItem.new i = ['I', 'W', 'A'].index(match[0].upcase) drop.kind = i.nil? ? 0 : i + 1 drop.data_id = match[1].to_i drop.denominator = match[3].empty? ? match[2].to_i : match[2].to_f @ma_extra_drops.push(drop) } end @ma_extra_drops end #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # * Max Drops #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def ma_max_drops if !@ma_max_drops @ma_max_drops = self.note[/\\MAX[ _]DROPS?\[(\d+)\]/i].nil? ? 999 : $1.to_i end @ma_max_drops end end #============================================================================== # ** Game_Enemy #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Summary of Changes: # aliased method - make_drop_items # new method - ma_make_extra_drops #============================================================================== class Game_Enemy #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # * Make Drop Items #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ alias mlg_dropopt_makedrops_5rx9 make_drop_items def make_drop_items(*args, &block) # Run Original Method and add the new drops mlg_dropopt_makedrops_5rx9(*args, &block) + ma_make_extra_drops end #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # * Make Extra Drops #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def ma_make_extra_drops result = [] enemy.ma_extra_drops.each { |di| if di.kind > 0 bool = di.denominator.is_a?(Integer) ? (rand * di.denominator < drop_item_rate) : (rand(100) < (di.denominator * drop_item_rate)) result.push(item_object(di.kind, di.data_id)) if bool end } while result.size > enemy.ma_max_drops result.delete_at(rand(result.size)) end result end end