#==============================================================================
# ** 8_Hero_Party - by cockroach
#------------------------------------------------------------------------------
# This script is meant to permit 8 heroes in the party.
# The heroes will appear in every instance of the game and show up properly,
# but in many cases it may look crowded. (Specially in the default Battle System)
# This is why this goes best with another type of battle system.
# If anyone wants to use even more than 8 heroes, all necessary changes are in
# this script, and it is a very easy thing to alter.
#
# All you need to do is adding heroes to the party normally, no custom script
# call is necessary.
#
# (This very simple script is free for usage and edition, in any type of game.)
#==============================================================================
#==============================================================================
# Alterations in Game_Actor
#==============================================================================
class Game_Actor
def screen_x
return 0 if self.index.nil?
# Return after calculating x-coordinate by order of members in party
p_size = [$game_party.actors.size, 4].max
self.index * (640 / p_size) + (320 / p_size)
end
end
#==============================================================================
# Alterations in Game_Party
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
# * Add an Actor
# actor_id : actor ID
#--------------------------------------------------------------------------
def add_actor(actor_id)
# Get actor
actor = $game_actors[actor_id]
# If the party has less than 8 members and this actor is not in the party
if @actors.size < 8 && !@actors.include?(actor)
# Add actor
@actors.push(actor)
# Refresh player
$game_player.refresh
end
end
#--------------------------------------------------------------------------
# * Random Selection of Target Actor
# hp0 : limited to actors with 0 HP
#--------------------------------------------------------------------------
def random_target_actor(hp0 = false)
# Initialize roulette
roulette = []
# Loop
for actor in @actors
# If it fits the conditions
if (!hp0 && actor.exist?) || (hp0 && actor.hp0?)
# Get actor class [position]
position = $data_classes[actor.class_id].position / 2
# Front guard: n = 4; Mid guard: n = 3; Rear guard: n = 2
n = 4 - position
n = 1 if n == 0
# Add actor to roulette n times
n.times { roulette.push(actor) }
end
end
# If roulette size is 0
return nil if roulette.size == 0
# Spin the roulette, choose an actor
roulette[rand(roulette.size)]
end
end
#==============================================================================
# Alterations in Window_MenuStatus
#==============================================================================
class Window_MenuStatus < Window_Selectable
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@item_max = $game_party.actors.size
for i in 0...$game_party.actors.size
x = 64
if @item_max > 5
y = i * (455 / @item_max)
else
y = i * 76.5
end
actor = $game_party.actors[i]
draw_actor_graphic(actor, x - 40, y + 47)
draw_actor_name(actor, x, y - 9)
draw_actor_class(actor, x + 144, y - 9)
draw_actor_level(actor, x, y + 7)
draw_actor_state(actor, x + 90, y + 7)
draw_actor_exp(actor, x, y + 23)
draw_actor_hp(actor, x + 236, y + 7)
draw_actor_sp(actor, x + 236, y + 23)
end
end
#--------------------------------------------------------------------------
# * Cursor Rectangle Update
#--------------------------------------------------------------------------
def update_cursor_rect
if @index < 0
self.cursor_rect.empty
else
if @item_max > 5
y = @index * (455 / @item_max) - 3
else
y = @index * 76.5 - 3
end
self.cursor_rect.set(0, y, self.width - 32, 52)
end
end
end
#==============================================================================
# Alterations in Window_Target
#==============================================================================
class Window_Target < Window_Selectable
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
for i in 0...$game_party.actors.size
x = 4
y = i * 55
actor = $game_party.actors[i]
draw_actor_name(actor, x, y)
draw_actor_class(actor, x + 144, y)
draw_actor_level(actor, x + 8, y + 16)
draw_actor_state(actor, x + 8, y + 32)
draw_actor_hp(actor, x + 152, y + 16)
draw_actor_sp(actor, x + 152, y + 32)
end
end
#--------------------------------------------------------------------------
# * Cursor Rectangle Update
#--------------------------------------------------------------------------
def update_cursor_rect
# Cursor position -1 = all choices, -2 or lower = independent choice
# (meaning the user's own choice)
if @index <= -2
self.cursor_rect.set(0, (@index + 10) * 55 + 6, self.width - 32, 48)
elsif @index == -1
self.cursor_rect.set(0, 0, self.width - 32 + 6, @item_max * 58 - 20)
else
self.cursor_rect.set(0, @index * 55 + 6, self.width - 32, 52)
end
end
end
#==============================================================================
# Alterations in Window_SaveFile
#==============================================================================
class Window_SaveFile < Window_Base
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# Draw file number
self.contents.font.color = normal_color
name = "File#{@file_index + 1}"
self.contents.draw_text(4, 0, 600, 32, name)
@name_width = contents.text_size(name).width
# If save file exists
if @file_exist
# Draw character
for i in 0...@characters.size
bitmap = RPG::Cache.character(@characters[i][0], @characters[i][1])
cw = bitmap.rect.width / 4
ch = bitmap.rect.height / 4
src_rect = Rect.new(0, 0, cw, ch)
x = 275 - @characters.size * 24 + i * 48 - cw / 2
self.contents.blt(x, 68 - ch, bitmap, src_rect)
end
# Draw play time
hour = @total_sec / 60 / 60
min = @total_sec / 60 % 60
sec = @total_sec % 60
time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
self.contents.font.color = normal_color
self.contents.draw_text(4, 8, 600, 32, time_string, 2)
# Draw timestamp
self.contents.font.color = normal_color
time_string = @time_stamp.strftime("%Y/%m/%d %H:%M")
self.contents.draw_text(4, 40, 600, 32, time_string, 2)
end
end
end
#==============================================================================
# Alterations in Window_ShopStatus
#==============================================================================
class Window_ShopStatus < Window_Base
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
return if @item.nil?
number = case @item
when RPG::Item then $game_party.item_number(@item.id)
when RPG::Weapon then $game_party.weapon_number(@item.id)
when RPG::Armor then $game_party.armor_number(@item.id)
end
self.contents.font.color = system_color
self.contents.draw_text(4, 0, 200, 24, "number in possession")
self.contents.font.color = normal_color
self.contents.draw_text(204, 0, 32, 24, number.to_s, 2)
return if @item.is_a?(RPG::Item)
# Equipment adding information
for i in 0...$game_party.actors.size
# Get actor
actor = $game_party.actors[i]
p_size = $game_party.actors.size
# If equippable, then set to normal text color. If not, set to
# invalid text color.
if actor.equippable?(@item)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
# Draw actor's name
if p_size > 5
y1 = i * (288 / p_size)
else
y1 = i * 48
end
self.contents.draw_text(4, 24 + y1, 120, 24, actor.name)
# Get current equipment
if @item.is_a?(RPG::Weapon)
item1 = $data_weapons[actor.weapon_id]
elsif @item.kind == 0
item1 = $data_armors[actor.armor1_id]
elsif @item.kind == 1
item1 = $data_armors[actor.armor2_id]
elsif @item.kind == 2
item1 = $data_armors[actor.armor3_id]
else
item1 = $data_armors[actor.armor4_id]
end
# If equippable
if actor.equippable?(@item)
# If weapon
if @item.is_a?(RPG::Weapon)
atk1 = item1 != nil ? item1.atk : 0
atk2 = @item != nil ? @item.atk : 0
change = atk2 - atk1
end
# If armor
if @item.is_a?(RPG::Armor)
pdef1 = item1 != nil ? item1.pdef : 0
mdef1 = item1 != nil ? item1.mdef : 0
pdef2 = @item != nil ? @item.pdef : 0
mdef2 = @item != nil ? @item.mdef : 0
change = pdef2 - pdef1 + mdef2 - mdef1
end
# Draw parameter change values
self.contents.draw_text(124, 24 + y1, 112, 24, sprintf("%+d", change), 2)
end
# Draw item
if item1.nil?
x = 4
y = 8 + y1 + 32
bitmap = RPG::Cache.icon(item1.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.draw_text(x + 28, y, 212, 24, item1.name)
end
end
end
end
class Spriteset_Battle
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
# Make viewports
@viewport1 = Viewport.new(0, 0, 640, 320)
@viewport2 = Viewport.new(0, 0, 640, 480)
@viewport3 = Viewport.new(0, 0, 640, 480)
@viewport4 = Viewport.new(0, 0, 640, 480)
@viewport2.z = 101
@viewport3.z = 200
@viewport4.z = 5000
# Make battleback sprite
@battleback_sprite = Sprite.new(@viewport1)
# Make enemy sprites
@enemy_sprites = []
for enemy in $game_troop.enemies.reverse
@enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy))
end
# Make actor sprites
@actor_sprites = []
8.times { @actor_sprites.push(Sprite_Battler.new(@viewport2)) }
# Make weather
@weather = RPG::Weather.new(@viewport1)
# Make picture sprites
@picture_sprites = []
for i in 51..100
@picture_sprites.push(Sprite_Picture.new(@viewport3, $game_screen.pictures[i]))
end
# Make timer sprite
@timer_sprite = Sprite_Timer.new
# Frame update
update
end
def update
# Update actor sprite contents (corresponds with actor switching)
8.times do |i|
@actor_sprites[i].battler = $game_party.actors[i]
end
# If battleback file name is different from current one
if @battleback_name != $game_temp.battleback_name
@battleback_name = $game_temp.battleback_name
@battleback_sprite.bitmap.dispose unless @battleback_sprite.bitmap.nil?
@battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)
@battleback_sprite.src_rect.set(0, 0, 640, 320)
end
# Update battler sprites
for sprite in @enemy_sprites + @actor_sprites
sprite.update
end
# Update weather graphic
@weather.type = $game_screen.weather_type
@weather.max = $game_screen.weather_max
@weather.update
# Update picture sprites
for sprite in @picture_sprites
sprite.update
end
# Update timer sprite
@timer_sprite.update
# Set screen color tone and shake position
@viewport1.tone = $game_screen.tone
@viewport1.ox = $game_screen.shake
# Set screen flash color
@viewport4.color = $game_screen.flash_color
# Update viewports
@viewport1.update
@viewport2.update
@viewport4.update
end
end
#==============================================================================
# ** Window_BattleStatus
#------------------------------------------------------------------------------
# This window displays the status of all party members on the battle screen.
#==============================================================================
class Window_Base < Window
def shadow_color
Color.new(0, 0, 0)
end
#--------------------------------------------------------------------------
# * Draw Name
#actor : actor
#x: draw spot x-coordinate
#y: draw spot y-coordinate
#--------------------------------------------------------------------------
def draw_actor_name(actor, x, y, shadow = false)
self.contents.font.color = shadow ? shadow_color : normal_color
self.contents.draw_text(x, y, 120, 32, actor.name)
end
#--------------------------------------------------------------------------
# * Draw State
#actor : actor
#x: draw spot x-coordinate
#y: draw spot y-coordinate
#width : draw spot width
#--------------------------------------------------------------------------
def draw_actor_state(actor, x, y, width = 120, shadow = false)
text = make_battler_state_text(actor, width, true)
self.contents.font.color = shadow ? shadow_color : (actor.hp == 0 ? knockout_color : normal_color)
self.contents.draw_text(x, y, width, 32, text)
end
#--------------------------------------------------------------------------
# * Draw HP
#actor : actor
#x: draw spot x-coordinate
# y : draw spot y-coordinate
# width : draw spot width
#--------------------------------------------------------------------------
def draw_actor_hp(actor, x, y, width = 144, height = 32, shadow = false)
# Draw "HP" text string
self.contents.font.color = shadow ? shadow_color : system_color
self.contents.draw_text(x, y, 32, height, $data_system.words.hp)
# Calculate if there is draw space for MaxHP
if width - 32 >= 108
hp_x = x + width - 108
flag = true
elsif width - 32 >= 28
hp_x = x + width - 48
flag = false
end
# Draw HP
self.contents.font.color = shadow ? shadow_color : (actor.hp == 0 ? knockout_color : (actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color))
self.contents.draw_text(hp_x, y, 48, height, actor.hp.to_s, 2)
# Draw MaxHP
if flag
self.contents.font.color = shadow ? shadow_color : normal_color
self.contents.draw_text(hp_x + 48, y, 12, height, "/", 1)
self.contents.draw_text(hp_x + 60, y, 48, height, actor.maxhp.to_s)
end
end
#--------------------------------------------------------------------------
# * Draw SP
# actor : actor
# x : draw spot x-coordinate
# y : draw spot y-coordinate
# width : draw spot width
#--------------------------------------------------------------------------
def draw_actor_sp(actor, x, y, width = 144, height = 32, shadow = false)
# Draw "SP" text string
self.contents.font.color = shadow ? shadow_color : system_color
self.contents.draw_text(x, y, 32, height, $data_system.words.sp)
# Calculate if there is draw space for MaxHP
if width - 32 >= 108
sp_x = x + width - 108
flag = true
elsif width - 32 >= 28
sp_x = x + width - 48
flag = false
end
# Draw SP
self.contents.font.color = shadow ? shadow_color : (actor.sp == 0 ? knockout_color : (actor.sp <= actor.maxsp / 4 ? crisis_color : normal_color))
self.contents.draw_text(sp_x, y, 48, height, actor.sp.to_s, 2)
# Draw MaxSP
if flag
self.contents.font.color = shadow ? shadow_color : normal_color
self.contents.draw_text(sp_x + 48, y, 12, height, "/", 1)
self.contents.draw_text(sp_x + 60, y, 48, height, actor.maxsp.to_s)
end
end
end
class Window_BattleStatus < Window_Base
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@item_max = $game_party.actors.size
if @item_max > 7
self.contents.font.size = 16
self.contents.font.bold = true
elsif @item_max > 6
self.contents.font.size = 18
self.contents.font.bold = true
elsif @item_max > 4
self.contents.font.size = 20
self.contents.font.bold = true
else
self.contents.font.size = 22
end
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
if @item_max > 6
actor_x = i * 610 / @item_max + 0
text_x = 75
elsif @item_max > 4
actor_x = i * 612 / @item_max + 4
text_x = 95
else
actor_x = i * 160 + 4
text_x = 120
end
draw_actor_name(actor, actor_x, 0)
draw_actor_hp(actor, actor_x, 32, text_x)
draw_actor_sp(actor, actor_x, 64, text_x)
if @level_up_flags[i]
self.contents.font.color = normal_color
self.contents.draw_text(actor_x, 96, 120, 32, "LEVEL UP!")
else
draw_actor_state(actor, actor_x, 96)
end
end
end
end
class Scene_Battle
def phase3_setup_command_window
# Disable party command window
@party_command_window.active = false
@party_command_window.visible = false
# Enable actor command window
@actor_command_window.active = true
@actor_command_window.visible = true
p_size = $game_party.actors.size - 1
step_x = 480 / p_size
step = 160 if step_x > 160
window_x = @actor_index * step_x
if @actor_index == $game_party.actors.size - 1
window_x = 480
end
# Set actor command window position
@actor_command_window.x = window_x
# Set index to 0
@actor_command_window.index = 0
end
end