#==============================================================================
# +++ MOG - Scene Character Select V1.0 +++
#==============================================================================
# By Moghunter
# [url]http://www.atelier-rgss.com/[/url]
#==============================================================================
# Tela de seleção de personagens.
#==============================================================================
# 1 - Deverão conter as seguintes imagens na pasta GRAPHICS/SYSTEM.
#
# Background
# Char_Layout01
# Char_Layout02
# Char_Status_Layout
# Number_Char
#
# 2 - Imagem de pose. (Opcional)
# Para ativar a imagem de pose dos personagens, basta ter os arquivos de pose
# gravados na pasta (GRAPHICS/PICTURES)
# Você deverá nomear as imagens da seguinte forma.
#
# Character + ID_DO_PERSONAGEM
#
# Exemplo:
#
# Character1.png
#
#==============================================================================
# Para chamar o script use o seguinte comando.
#
# SceneManager.call(Scene_Character_Select)
#
#==============================================================================
#==============================================================================
# ■ Window_Base
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● draw_picture_number(x,y,value,file_name,align, space, frame_max ,frame_index)
#--------------------------------------------------------------------------
# X - Posição na horizontal
# Y - Posição na vertical
# VALUE - Valor Numérico
# FILE_NAME - Nome do arquivo
# ALIGN - Centralizar 0 - Esquerda 1- Centro 2 - Direita
# SPACE - Espaço entre os números.
# FRAME_MAX - Quantidade de quadros(Linhas) que a imagem vai ter.
# FRAME_INDEX - Definição do quadro a ser utilizado.
#--------------------------------------------------------------------------
def draw_picture_number(x,y,value, file_name,align = 0, space = 0, frame_max = 1,frame_index = 0)
number_image = Cache.system(file_name)
frame_max = 1 if frame_max < 1
frame_index = frame_max -1 if frame_index > frame_max -1
align = 2 if align > 2
cw = number_image.width / 10
ch = number_image.height / frame_max
h = ch * frame_index
number = value.abs.to_s.split(//)
case align
when 0
plus_x = (-cw + space) * number.size
when 1
plus_x = (-cw + space) * number.size
plus_x /= 2
when 2
plus_x = 0
end
for r in 0..number.size - 1
number_abs = number[r].to_i
number_rect = Rect.new(cw * number_abs, h, cw, ch)
self.contents.blt(plus_x + x + ((cw - space) * r), y , number_image, number_rect)
end
number_image.dispose
end
#--------------------------------------------------------------------------
# ● draw_char_window_status
#--------------------------------------------------------------------------
def draw_char_window_status(x,y)
image = Cache.system("Char_Status_Layout")
cw = image.width
ch = image.height
src_rect = Rect.new(0, 0, cw, ch)
self.contents.blt(x , y , image, src_rect)
image.dispose
end
end
#===============================================================================
# ■ RPG_FileTest
#===============================================================================
module RPG_FileTest
#--------------------------------------------------------------------------
# ● RPG_FileTest.system_exist?
#--------------------------------------------------------------------------
def RPG_FileTest.system_exist?(filename)
return Cache.system(filename) rescue return false
end
#--------------------------------------------------------------------------
# ● RPG_FileTest.picture_exist?
#--------------------------------------------------------------------------
def RPG_FileTest.picture_exist?(filename)
return Cache.picture(filename) rescue return false
end
end
#==============================================================================
# ** Window_Character_Status
#==============================================================================
class Window_Character_Status < Window_Base
attr_accessor :index
#--------------------------------------------------------------------------
# ● initialize
#--------------------------------------------------------------------------
def initialize(actor)
super(0, 0, 400, 130)
self.opacity = 0
actor_id = []
@index = actor
for i in 1...$data_actors.size
actor_id.push($game_actors[i])
end
@actor = actor_id[actor -1]
refresh
end
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.bold = true
self.contents.font.italic = true
draw_char_window_status(0, 6)
draw_actor_face(@actor, 0, 0)
draw_actor_name(@actor, 140, -5)
draw_actor_class(@actor, 60, 70)
draw_picture_number(155,20,@actor.mhp, "Number_char",1)
draw_picture_number(145,48,@actor.mmp, "Number_char",1)
draw_picture_number(228,28,@actor.atk, "Number_char",1)
draw_picture_number(297,28,@actor.def, "Number_char",1)
draw_picture_number(207,68,@actor.mat, "Number_char",1)
draw_picture_number(277,68,@actor.agi, "Number_char",1)
end
end
#==============================================================================
# ■ Scene Character Select
#==============================================================================
class Scene_Character_Select
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
def initialize
setup
create_layout
create_window_status
create_char_image
reset_position(0)
end
#--------------------------------------------------------------------------
# ● Setup
#--------------------------------------------------------------------------
def setup
@char_index = 1
@char_max = $data_actors.size - 1
@pw_x = 300
@aw_x = 200
@nw_x = 100
end
#--------------------------------------------------------------------------
# ● Main
#--------------------------------------------------------------------------
def main
Graphics.transition
execute_loop
execute_dispose
end
#--------------------------------------------------------------------------
# ● Execute Loop
#--------------------------------------------------------------------------
def execute_loop
loop do
Graphics.update
Input.update
update
if SceneManager.scene != self
break
end
end
end
#--------------------------------------------------------------------------
# ● create_background
#--------------------------------------------------------------------------
def create_layout
@background = Plane.new
@background.bitmap = Cache.system("Background")
@background.z = 0
@layout_01 = Sprite.new
@layout_01.bitmap = Cache.system("Char_Layout01")
@layout_01.z = 10
@layout_02 = Sprite.new
@layout_02.bitmap = Cache.system("Char_Layout02")
@layout_02.blend_type = 1
@layout_02.z = 1
end
#--------------------------------------------------------------------------
# ● create_window_status
#--------------------------------------------------------------------------
def create_window_status
@window_status = []
for i in 1...$data_actors.size
@window_status[i] = Window_Character_Status.new(i)
@window_status[i].z = 7
end
check_active_window
end
#--------------------------------------------------------------------------
# ● create_window_status
#--------------------------------------------------------------------------
def create_char_image
@actor_picture = []
actor_id = []
for i in 1...$data_actors.size
actor_id.push($game_actors[i])
actor = actor_id[i - 1]
@actor_picture[i] = Sprite.new
file_name = "Character" + i.to_s
file_name = "" unless RPG_FileTest.picture_exist?(file_name)
@actor_picture[i].bitmap = Cache.picture(file_name)
end
check_active_picture
end
#--------------------------------------------------------------------------
# ● check_active_window
#--------------------------------------------------------------------------
def check_active_window
for i in 1...$data_actors.size
@pw = @char_index - 1
@pw = 1 if @pw > @char_max
@pw_y = 32
@pw = @char_max if @pw < 1
@aw = @char_index
@aw_y = 160
@nw = @char_index + 1
@nw = 1 if @nw > @char_max
@nw = @char_max if @nw < 1
@nw_y = 288
case @window_status[i].index
when @pw,@aw,@nw
@window_status[i].visible = true
else
@window_status[i].visible = false
end
end
end
#--------------------------------------------------------------------------
# ● check_active_picture
#--------------------------------------------------------------------------
def check_active_picture
for i in 1...$data_actors.size
case @window_status[i].index
when @pw,@aw,@nw
@actor_picture[i].visible = true
@actor_picture[@pw].z = 4
@actor_picture[@aw].z = 6
@actor_picture[@nw].z = 4
@actor_picture[@pw].opacity = 120
@actor_picture[@aw].opacity = 255
@actor_picture[@nw].opacity = 120
else
@actor_picture[i].visible = false
end
end
end
#--------------------------------------------------------------------------
# ● terminate
#--------------------------------------------------------------------------
def execute_dispose
RPG::BGM.fade(2500)
Graphics.fadeout(60)
Graphics.wait(40)
RPG::BGM.stop
for i in 1...$data_actors.size
@window_status[i].dispose
@actor_picture[i].bitmap.dispose
@actor_picture[i].dispose
end
@background.bitmap.dispose
@background.dispose
@layout_01.bitmap.dispose
@layout_01.dispose
@layout_02.bitmap.dispose
@layout_02.dispose
end
#--------------------------------------------------------------------------
# ● update
#--------------------------------------------------------------------------
def update
@background.ox += 1
update_select
update_slide_window
update_slide_image
end
#--------------------------------------------------------------------------
# ● update_slide_window
#--------------------------------------------------------------------------
def update_slide_window
@window_status[@aw].x += 1 if @window_status[@aw].x < 0
@window_status[@nw].x -= 2 if @window_status[@nw].x > -30
@window_status[@pw].x -= 2 if @window_status[@pw].x > -30
slide_window_y(@pw,@pw_y)
slide_window_y(@aw,@aw_y)
slide_window_y(@nw,@nw_y)
end
#--------------------------------------------------------------------------
# ● update_slide_image
#--------------------------------------------------------------------------
def update_slide_image
slide_picture_x(@pw,@pw_x,15)
slide_picture_x(@aw,@aw_x,5)
slide_picture_x(@nw,@nw_x,15)
end
#--------------------------------------------------------------------------
# ● slide_picture_x
#--------------------------------------------------------------------------
def slide_picture_x(i,x_pos,speed)
if @actor_picture[i].x < x_pos
@actor_picture[i].x += speed
@actor_picture[i].x = x_pos if @actor_picture[i].x > x_pos
end
if @actor_picture[i].x > x_pos
@actor_picture[i].x -= speed
@actor_picture[i].x = x_pos if @actor_picture[i].x < x_pos
end
end
#--------------------------------------------------------------------------
# ● slide_window_y
#--------------------------------------------------------------------------
def slide_window_y(i,y_pos)
if @window_status[i].y < y_pos
@window_status[i].y += 15
@window_status[i].y = y_pos if @window_status[i].y > y_pos
end
if @window_status[i].y > y_pos
@window_status[i].y -= 15
@window_status[i].y = y_pos if @window_status[i].y < y_pos
end
end
#--------------------------------------------------------------------------
# ● reset_position
#--------------------------------------------------------------------------
def reset_position(diretion)
check_active_window
check_active_picture
case diretion
when 0
@window_status[@pw].y = -64
@actor_picture[@pw].x = 100
when 1
@window_status[@nw].y = 440
@actor_picture[@nw].x = 400
end
end
#--------------------------------------------------------------------------
# ● update_select
#--------------------------------------------------------------------------
def update_select
if Input.trigger?(Input::DOWN) or Input.trigger?(Input::LEFT)
Sound.play_cursor
@char_index += 1
@char_index = 1 if @char_index > @char_max
if @char_max < 3
reset_position(0)
else
reset_position(1)
end
elsif Input.trigger?(Input::UP) or Input.trigger?(Input::RIGHT)
Sound.play_cursor
@char_index -= 1
@char_index = @char_max if @char_index < 1
reset_position(0)
elsif Input.trigger?(Input::C) or Input.trigger?(Input::B)
Sound.play_ok
$game_party.add_actor(@char_index)
SceneManager.return
end
end
end
$mog_rgss3_scene_character_select = true
#==============================================================================
# ■ Window Menu Command
#==============================================================================
class Window_MenuCommand < Window_Command
#------------------------------------------------------------------------------
# ● 加入菜单
#------------------------------------------------------------------------------
alias mog_Character_add_main_commands add_main_commands
def add_main_commands
mog_Character_add_main_commands
add_command("另一种人物", :mog_Character, main_commands_enabled)
end
end
#==============================================================================
# ■ Scene Menu
#==============================================================================
class Scene_Menu < Scene_MenuBase
#------------------------------------------------------------------------------
# ●加入指令窗口
#------------------------------------------------------------------------------
alias mog_Character_create_command_window create_command_window
def create_command_window
mog_Character_create_command_window
@command_window.set_handler(:mog_Character, method(:command_Character_Select))
end
#------------------------------------------------------------------------------
# ●生成窗口
#------------------------------------------------------------------------------
def command_Character_Select
SceneManager.call(Scene_Character_Select)
end
end