Skip to content

Instantly share code, notes, and snippets.

@AdamKyle
Last active December 20, 2015 22:48
Show Gist options
  • Save AdamKyle/6207383 to your computer and use it in GitHub Desktop.
Save AdamKyle/6207383 to your computer and use it in GitHub Desktop.
Allows you to create Drops for troops - requires some scripts - or drops in general. Also uses custom currencie
#==============================================================================
# Drops
# ----------------------------------------------------------------------------
# Version: 1.0.1
# Author: Kalacious (AKA: VindictivePersonality)
# License: GPL 3.0
#
# Changes 1.0.1
# ----------------------------------------------------------------------------
# ---> Can now enter whole numbers as percentages for item and
# currency drops.
#
# Compatibillity Issues
# ----------------------------------------------------------------------------
#
# There should be NO compatibillity issues what so ever. How ever if there are,
# Please let me know.
#
# Requirements?
# ----------------------------------------------------------------------------
#
# ---> Any things with REQUIRED is well, required and, if missing, may cause
# things to look weird or not work at all.
#
# -- Kalacious Currency Script - to use currencies, any thing but gold.
# (see below)
# -- REQUIRED -> http://himeworks.wordpress.com/2013/05/12/post-battle-events/
# --> The above script belongs to Hime Works and is required to have this
# work AFTER battles, which is what it's intended to do.
# -- REQUIRED -> http://rmrk.net/index.php/topic,44964.0.html
# --> The above script belongs to Modern Algebra and is used to format
# paragraphs, this stops me from having to do it.
#
# ---> Note: Want to create random drops that have nothing to do with
# enemies? see Tutorial 3 below! - You wont need the FIRST
# REQUIRED script to do it!
#
# TOS
# ----------------------------------------------------------------------------
# If you know the GPL version 3, you know the answer, but this still applies:
#
# Script for RGSS 3 ONLY adds abillity to generate troop drops.
# Copyright (C) 2013 Kalacious (AKA VindictivePersonality)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
#
#
#==============================================================================
#
# How to Use?
# -----------
#
# You have one main way to customize and thats the hash, the Drops Hash.
# this is where you ceate your drops either in a regular hash or a nested
# hash. These Drops are then used
#
# DROPS::DROP_HASH
# ----------------
#
# This is the most important part of the script. This is where you set up
# what are called "static" drops, drops that never change and can easily
# be given to any troop. (for drops created on the fly please see below).
#
# The goal here is to create any kind of drop, at any time, and distribute
# it to the player after they have finished a battle.
#
# The following hash example is a single drop with a single ite, lets look
# at it:
#
# DROP_HASH = {
# "Drop One" => { ---> Drop Object Name - Must be unique.
# :item_type => 0, ---> 0 - item, 1 - weapons, 2 - armors
# :item_id => 1, ---> id of item to award
# :item_drop_per => 4, ---> This item has a 4% chance to drop.
# :amount => 6, ---> How many of this item?
# :currency_type => "GC", ---> Curency to award. "gold" is acceptable.
# :currency_gain => 25, ---> how much of this currency do you gain?
# :currency_gain_per => 10 --> 10% chance to gain this currency.
# },
# }
#
# Note: If you are not using my currency script - yet want to give MORE gold,
# then you MUST enter "gold".
#
# Note: All items and currencies that drop can have a percentage of
# chance to drop.
#
# Note: NODROPMESSAGE is for when their are no currenies and no items
# that drop, if left as '', no message will be shown.
#
# The above hash, will create one drop object for the player to recieve on
# victory of the battle with that troop. The beauty here is that you can set
# up multiple "drops" for multiple troops, each troop can have their own drop.
#
# "Kalacious!" You exclaim - "I want MORE drops for this troop!" ok,
# lets create that hash together!
#
# "Drop Two" => [
# {
# :item_type => 0,
# :item_id => 20,
# :item_drop_per => 1,
# :amount => 6,
# :currency_type => "RT",
# :currency_gain => 20,
# :currency_gain_per => 20
# },
# {
# :item_type => 1,
# :item_id => 1,
# :item_drop_per => 100,
# :amount => 6,
# :currency_type => "GC",
# :currency_gain => 20,
# :currency_gain_per => 75
# },
# {
# :item_type => 2,
# :item_id => 1,
# :item_drop_per => 10,
# :amount => 6,
# :currency_type => "",
# :currency_gain => 0
# :currency_gain_per => 45
# },
# ]
#
# OMG!!! - What is that?!!! - Its a drop with three items. Notices that
# You can have NO currencies in the third entry. (Also note the commas).
#
# This is where my currency script comes in handy, as you can see, the type
# is set to that of a currency already created - YOU CANNOT - give currencies
# that do not exist, and NO we wont create them for you. They must exist.
#
# Also note, using Gold instead of my custom curencies? WE ONLY ACCEPT: "gold"
# as the currency type.
#
# With that aside we have created one drop object with three different drops
# in it.one item, one weapon and one armor. YOU CANNOT have the same item and
# item type for two drops. that is you cannot have, item_type => 1 with
# a item_id => 1 for more then one drop in a drop object. You can have multiple
# items of the same type provided they are all different. If you want to
# have multiple items of the same type and id, enter in how many should be
# awarded via the :amount key.
#
# Now that we have that all sored out, we can create one drop object with
# one drop or one drop object with MULTIPLE drops in it.
#
# Ok, but what methods do we have to use to access this data?
#
# Lets get into that!
#
# $kc_drop Call - Calls: Troop_Drop Class
# ---------------------------------------
#
# $kc_drop.drop_object ---> Gives back an array of drops.
#
# $kc_drop.create_new_drop(item_type, item_id, item_drop_per, amount,
# currency_type, currency_gain, currency_gain_per)
# ---> Ceates ONE drop (see below).
# where the item and the
# currency have a drop
# percentage.
#
# $kc_drop.create_new_static_drop(name) ---> Creates a drop object based
# on the hashes key string name.
#
#
# $kc_drop.give_items(gain_currencies = false)
# ---> Give out items, displaying a
# message. Do we also give out
# currencies?
#
#
# Ok, Kalacious - walk me through how to take the hash above, Drop Two and
# at the end of a battle - give out the items and currencies.
#
# TUTORIAL 1 - Hash Drops
# ------------------------
#
# So lets say you have this hash:
#
# "Drop Two" => [
# {
# :item_type => 0,
# :item_id => 20,
# :item_drop_per => 56,
# :amount => 6,
# :currency_type => "RT",
# :currency_gain => 20,
# :currency_gain_per => 56
# },
# {
# :item_type => 1,
# :item_id => 1,
# :item_drop_per => 56,
# :amount => 6,
# :currency_type => "GC",
# :currency_gain => 20,
# :currency_gain_per => 56
# },
# {
# :item_type => 2,
# :item_id => 1,
# :item_drop_per => 56,
# :amount => 6,
# :currency_type => "",
# :currency_gain => 0,
# :currency_gain_per => 56
# },
# ]
#
# And you want to distribute these beauties at the end of the battle. No
# problem. Using "Post-Battle Events" (posted above) we need to go into the
# troop event page and create the following event:
#
# Comment: <post battle victory>
# Script: $kc_drop.create_new_static_drop("Drop Two")
# $kc_drop.give_items(true)
#
# Then go run the battle, after words you get the regular rewards, then you
# get the troop rewards.
#
# TUTORIAL 2 - On the Fly Drops
# ------------------------------
#
# Ok...Ok....I see - crete me one on the fly!
#
# Ok, lets say you one to give one drop. You can do this two different way,
# you can create an event on the map that creates the item or you can do
# it post battle, either way the script calls are the same.
#
# Lets assume your doing it after the battle is done and over with. you
# would do this:
#
# Comment: <post battle victory>
# Script: $kc_drop.create_new_drop(0, 1, 20, 76, "gold", 40, 78)
# $kc_drop.give_items(true)
#
# The above will give you 20 items with the id of 1 and 40 gold.
#
# TUTORIAL 3 - With out Battles!
# -------------------------------
#
# KALCIOUS!!!!! - I want to do this WITH OUT BATTLES. ok, so create your
# drops like normal and then just call $kc_drop.give_items(true/false) in
# an event....Simple.
#
#
#==============================================================================
# ** DROPS
#------------------------------------------------------------------------------
# Lets you set up a drop objects with either ONE drop or multiple. The first
# one is a drop object with ONE drop, while the second object has THREE drops
# in it.
# ----------------------------------------------------------------------------
#==============================================================================
module DROPS
DROP_HASH = {
"Drop One" => {
:item_type => 0,
:item_id => 1,
:amount => 6,
:item_drop_per => 100,
:currency_type => "GC",
:currency_gain => 25,
:currency_gain_per => 3
},
"Drop Two" => [
{
:item_type => 0,
:item_id => 20,
:amount => 6,
:currency_type => "RT",
:currency_gain => 20
},
{
:item_type => 1,
:item_id => 1,
:amount => 6,
:currency_type => "GC",
:currency_gain => 20
},
{
:item_type => 2,
:item_id => 1,
:amount => 6,
:currency_type => "",
:currency_gain => 0
},
]
}
NODROPMESSAGE = ''
end
#==============================================================================
# ** DataManager
#------------------------------------------------------------------------------
# This module manages the database and game objects. Almost all of the
# global variables used by the game are initialized by this module.
#==============================================================================
class << DataManager
alias kalacious_troop_drop_object create_game_objects
def create_game_objects
kalacious_troop_drop_object
$kc_drop = Troop_Drop.new
end
end
#==============================================================================
# ** Troop_Drop
#------------------------------------------------------------------------------
# Responsible for creating drops and distibuting the drops.
#==============================================================================
class Troop_Drop
#--------------------------------------------------------------------------
# * Create an empty @troop_drop_object array to hold the drops for a single
# drop object.
#--------------------------------------------------------------------------
def initialize
@troop_drop_object = []
end
#--------------------------------------------------------------------------
# * Returns the drop object for inspection
#--------------------------------------------------------------------------
def drop_object
@troop_drop_object
end
#--------------------------------------------------------------------------
# * Allows you to create a drop on the fly.
#--------------------------------------------------------------------------
def create_new_drop(item_type, item_id, item_drop_per, amount,
currency_type, currency_gain, currency_gain_per)
if @troop_drop_object.any?
@troop_drop_object.each do |drop|
if drop.item_type == item_type and drop.item_id == item_id
return false
end
end
end
drop_object = Troop_Drop_Object.new(item_type, item_id, item_drop_per,
amount, currency_type, currency_gain, currency_gain_per)
@troop_drop_object.push(drop_object)
end
#--------------------------------------------------------------------------
# * Creates a new drop object based off the hash and the name of the
# coresponding drop object.
#--------------------------------------------------------------------------
def create_new_static_drop(name)
drops = DROPS::DROP_HASH[name] || []
drops = [drops] if !drops.is_a? Array
drops.each do |drop|
create_new_drop(drop[:item_type], drop[:item_id], drop[:item_drop_per],
drop[:amount], drop[:currency_type], drop[:currency_gain],
drop[:currency_gain_per])
end
end
#--------------------------------------------------------------------------
# * Gives all items and currencies (only gives currencies if set to true)
# Displays a message stating that we gave you bla.
#--------------------------------------------------------------------------
def give_items(gain_currencies = false)
random_number = rand(100)
if @troop_drop_object.any?
@troop_drop_object.each do |troop|
if random_number <= troop.item_drop_per
case troop.item_type
when 0; $game_party.gain_item($data_items[troop.item_id],
troop.amount, true)
when 1; $game_party.gain_item($data_weapons[troop.item_id],
troop.amount, true)
when 2; $game_party.gain_item($data_armors[troop.item_id],
troop.amount, true)
end
end
if gain_currencies
gain_currency(troop)
end
end
display_gain_message(gain_currencies, random_number)
end
end
private
#--------------------------------------------------------------------------
# * PRIVATE - Displays a message for the items and currencies gained.
#--------------------------------------------------------------------------
def display_gain_message(gain_currencies = false, random_number)
if create_item_array(random_number).empty? and
create_currency_array(random_number).empty?
if DROPS::NODROPMESSAGE != ''
$game_message.texts.push(DROPS::NODROPMESSAGE)
else
return
end
end
if create_item_array(random_number).any?
$game_message.texts.push("Gained Items: ")
$game_message.texts.push(create_item_array(random_number).each_slice(2).map { |top| "#{top.first} (x#{top.last})" }.join(', ') + '.')
end
if create_currency_array(random_number).any?
if gain_currencies
$game_message.texts.push("\\n\\nGained Currencies: ")
$game_message.texts.push(create_currency_array(random_number).each_slice(2).map { |top| "#{top.first}: #{top.last}" }.join(', ') + '.')
end
end
end
#--------------------------------------------------------------------------
# * PRIVATE - Gains currencies, uses Currency script if we don't
# enter "gold"
#--------------------------------------------------------------------------
def gain_currency(single_troop_object)
puts rand(100)
puts single_troop_object.currency_gain_per
if rand(100) <= single_troop_object.currency_gain_per
if single_troop_object.currency_type != "gold"
if $kc_currency.exists?(single_troop_object.currency_type)
$kc_currency.increase(single_troop_object.currency_type,
single_troop_object.currency_gain)
end
else
$game_party.gain_gold(single_troop_object.currency_gain)
end
end
end
#--------------------------------------------------------------------------
# * PRIVATE - Creates an item array of all items and their amount.
#--------------------------------------------------------------------------
def create_item_array(random_number)
items = []
@troop_drop_object.each do |troop|
if random_number <= troop.item_drop_per
items.push(troop.item.name)
items.push(troop.amount)
end
end
items
end
#--------------------------------------------------------------------------
# * PRIVATE - Creates an array of all currencies and the amount gained.
#--------------------------------------------------------------------------
def create_currency_array(random_number)
currency = []
@troop_drop_object.each do |troop|
if troop.currency_gain != 0 and troop.currency_type != ""
if random_number <= troop.currency_gain_per
currency.push(troop.currency_type)
currency.push(troop.currency_gain)
end
end
end
currency
end
end
#==============================================================================
# ** Troop_Drop_Object
#------------------------------------------------------------------------------
# responsible for creating drop objects for troops.
#==============================================================================
class Troop_Drop_Object
attr_reader :item_type
attr_reader :item_id
attr_reader :item_drop_per
attr_reader :amount
attr_reader :currency_type
attr_reader :currency_gain
attr_reader :currency_gain_per
#--------------------------------------------------------------------------
# * Create te actual object based on whats passed in.
#--------------------------------------------------------------------------
def initialize(item_type, item_id, item_drop_per, amount, currency_type,
currency_gain, currency_gain_per)
@item_type = item_type
@item_id = item_id
@item_drop_per = item_drop_per
@amount = amount
@currency_type = currency_type
@currency_gain = currency_gain
@currency_gain_per = currency_gain_per
end
#--------------------------------------------------------------------------
# * Store the actual item, access it with drop_object.item.RPG::OBJ_NAME
# Example: drop_object.item.name #=> name of item/weapon or armor
#--------------------------------------------------------------------------
def item
case item_type
when 0
item = $data_items[item_id]
when 1
item = $data_weapons[item_id]
when 2
item = $data_armors[item_id]
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment