Code:
#==============================================================================
# ** Leveled Enemy Lists
#------------------------------------------------------------------------------
# by DerVVulfman
# version 1.0
# 09-12-2019 (MM-DD-YYYY)
# RGSS / RMXP
#==============================================================================
#
# INTRODUCTION:
#
# Have you even thought... my random enemies don't seem to match my heroes
# when they engage them? Have you ever thought that maybe you could swap out
# the enemies in your Troops with other enemies if the average party member's
# level is high enough? Now you can.
#
#
#==============================================================================
#
# LEVELED ENEMIES:
#
# The feature examines each enemy from the troops database, and checks to
# see if it is the 'key' to one of the lists in the LeveledEnemies module.
# If it is to be replaced, it uses the enemy within the array (or arrays)
# that the entry supplies.
#
# IF... (hehehe)... the replacement enemy is actually a 'key' to another
# list in the LeveledEnemies module, it TOO can get replaced. Yes, dear
# reader... recusion abouds so you can make very detailed level lists!
#
# * * *
#
# Each Entry within the LIST hash array is as follows:
#
# LIST[ key ] = [ leveled enemies ]
#
# As stated above, the 'key' is the ID of an enemy that will be replaced
# within your troops database. In our default script, the first list
# replaces the GHOST (enemy #1) while the second list in the default
# script replaces the SAGAHIN (#3)
#
# * * *
#
# The leveled lists are a collection of arrays. There must be at least
# one array like this:
#
# LIST[key] = [ [list of enemies], [list of enemies],... [list of enemies] ]
#
# Types of 'list of enemies':
# 1) Array of enemy IDs: [ id, id, id, id, ... id ]
# 2) Array with a min level & list of enemy IDs: [ lvl, [ id, id, id....] ]
#
#
# Style #1) This is just a list of enemy IDs. It will randomly select from
# this list.
#
# Style #2) This is a level-based list. It has a level to test against the
# average level* of the party. And only IF the party's average is
# higher than this test value will it use the enemies in the list
# of enemies next to it.
#
# IF an enemy list has a required level and the party has not
# reached that minimum level, no substitution will occur.
#
#==============================================================================
#
# TERMS OF USE
#
# Free for use, even in commercial works. Only due credit is required.
#
#==============================================================================
module LeveledEnemies
LIST = {}
# ID # LIST OF MONSTERS
#============ ==================
LIST[1] = [[2,3,4], [5,[5,6,7,8]] ]
LIST[2] = [ [15, [22,23,24]]]
LIST[3] = [[10,11,18,19]]
# NOTES FROM A WEREWOLF:
#-------------------------------------------------------------------------
# LIST[1] ... Any ghost can be replaced by enemies 2,3 or 4 under normal
# circumstances But if the level of the party is level 5,
# then the ghost is replaced by enemies 5, 6, 7 or 8.
#
# IF the ghost is replaced by a Basilisk or Sagahin, look at
# the next two lists! THEY DO COUNT!
#
# LIST[2] ... If a Basilisk is encountered, it can only be replaced by
# enemies if the level of the party as a while is at least 15.
# Otherwise, the basilisk remains in the troop.
#
# LIST[3] ... If a Sagahin is encountered, it can be replaced with no
# problems with enemies 10, 11, 18 and 19.
#
#-------------------------------------------------------------------------
end
#==============================================================================
# ** Game_Enemy
#------------------------------------------------------------------------------
# This class handles enemies. It's used within the Game_Troop class
# ($game_troop).
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :member_index # Member index (position in troop)
#--------------------------------------------------------------------------
# * Alias Listings
#--------------------------------------------------------------------------
alias meebers initialize
#--------------------------------------------------------------------------
# * Object Initialization
# troop_id : troop ID
# member_index : troop member index
#--------------------------------------------------------------------------
def initialize(troop_id, member_index, enemy_id=nil)
# Perform a normal initialize
meebers(troop_id, member_index)
# Exit if no custom enemy ID sent
return if enemy_id.nil?
# Re-perform the initialize with the new enemy ID
@troop_id = troop_id
@member_index = member_index
troop = $data_troops[@troop_id]
@enemy_id = enemy_id
enemy = $data_enemies[@enemy_id]
@battler_name = enemy.battler_name
@battler_hue = enemy.battler_hue
@hp = maxhp
@sp = maxsp
@hidden = troop.members[@member_index].hidden
@immortal = troop.members[@member_index].immortal
end
end
#==============================================================================
# ** Game_Troop
#------------------------------------------------------------------------------
# This class deals with troops. Refer to "$game_troop" for the instance of
# this class.
#==============================================================================
class Game_Troop
#--------------------------------------------------------------------------
# * Alias Listings
#--------------------------------------------------------------------------
alias moobers setup
#--------------------------------------------------------------------------
# * Setup
# troop_id : troop ID
#--------------------------------------------------------------------------
def setup(troop_id)
# Perform the original call
moobers(troop_id)
# Obtain party level
@level = setup_level
# Replace
setup_replace(troop_id)
end
#--------------------------------------------------------------------------
# * Setup : Acquiring average level of all party members
#--------------------------------------------------------------------------
def setup_level
level = 0
for actor in $game_party.actors
level += actor.level
end
level /= $game_party.actors.size
return level.to_i
end
#--------------------------------------------------------------------------
# * Setup : Loop through and replace enemy as needed
# troop_id : troop ID
#--------------------------------------------------------------------------
def setup_replace(troop_id)
# Create a temp array
temp = []
# Cycle through each enemy
for enemy in @enemies
# Get new enemy ID based on old enemy
enemy_id = setup_individual(enemy)
# Push into temp array
temp.push(Game_Enemy.new(troop_id, enemy.member_index, enemy_id))
end
# Replace the enemy array with the temp array
@enemies = temp
end
#--------------------------------------------------------------------------
# * Setup : Loop through and replace enemy as needed
# troop_id : troop ID
#--------------------------------------------------------------------------
def setup_individual(enemy)
# Perform a loop
loop do
# Get the enemy's ID
e_id = enemy.id
# Perform only if enemy list has the enemy ID as a key
if LeveledEnemies::LIST.has_key?(e_id)
result = setup_listchoice(e_id)
enemy = result unless result.nil?
end
# Break if list doesn't supply proper content
break if result.nil?
# Oooh... only exit loop if no matching enemy ID as a key
break unless LeveledEnemies::LIST.has_key?(enemy.id)
end
# Return the new enemy ID
return enemy.id
end
#--------------------------------------------------------------------------
# * Setup : Loop individual sets to choose
# troop_id : troop ID
#--------------------------------------------------------------------------
def setup_listchoice(e_id)
array_list = LeveledEnemies::LIST[e_id]
enemy = nil
# Cycle through each set
for set in array_list
# Reset temp list
temp_list = []
# Determine if has set level or not
if set.size == 2
min_level = set[0]
temp_list = set[1]
else
min_level = nil
temp_list = set
end
# If there's no minimum
if min_level.nil?
rand_size = temp_list.size
choice = temp_list[rand(rand_size)]
enemy = $data_enemies[choice]
# or if player level is exceeding min required level for set
elsif @level >= min_level
rand_size = temp_list.size
choice = temp_list[rand(rand_size)]
enemy = $data_enemies[choice]
end
end
return enemy
end
end