O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

cRmGSS - Seleção de Classes

Iniciado por Raizen, 16/12/2012 às 17:28



Seleção de Classe

Compativel com: RMVXAce
Compatibilidade :alta
Facilidade de uso: fácil
Lag gerado: baixo


[box class=titlebg]
Condições de Uso
[/box]

  Pode ser modificado, desde que os devidos créditos permaneçam.

[box class=titlebg]
Para que serve o script
[/box]

   Com este script, o seu jogo terá um menu de seleção
   de classes que o deixará mais parecido com os clássicos RPG's, além de dar um ar mais profissional.
   - O script é de fácil customização
   - As pictures podem ser trocadas facilmente,
   - O plano de fundo pode obter a opção de movimento ( Como um fog ), e também
     pode ser trocado com pouco trabalho.
   - Todos os personagens do Banco de Dados podem ter suas classes trocadas pelo script.


[box class=titlebg]
Instruções
[/box]

Todas as instruções encontram-se no script, a customização é fácil e prática, basta alterar as constantes no módulo de configuração.
Para chamar o script:
Evento > Adicionar Comando > 3ª Aba > Chamar Script
E então digite: select_class(actor)
Sendo actor o id do personagem do banco de dados que terá
sua classe alterada/mudada.
Exemplo: select_class(1)

Afim de tentar prevenir bugs por mal configuração. Um método foi adicionado para tentar avisa-lo de que a configuração atual possui algo de errado.
Caso o maker que vier a utilizar o script, e por acidente, nas configurações, informar o nome ou ID de uma classe que não existe no banco de dados, 2 avisos serão dados:
Spoiler
[close]
O primeiro, será um aviso na própria tela do jogo, que a classe informada não foi encontrada, podemos visualizar isto na imagem acima.
O segundo aviso, é um Pop-up:

Spoiler
[close]
A mensagem de erro lhe dará 3 opções.
Anular - O jogo será fechado
Repetir - O método de verificação de classe será processado novamente
Ignorar - O jogo continuará, e a classe selecionada para o personagem será a classe de ID 1.



[box class=titlebg]
Script.
[/box]
#=========================================================================
# Seleção de classe
# Versão: 1.1
# Compativel com RMVXAce
# Autor: JohnBolton
#-------------------------------------------------------------------------
# Acesse: www.centrorpgmaker.com
# É permitido postar em outros lugares contanto que não seja mudado
# as linhas dos créditos.
#-------------------------------------------------------------------------
# Introdução: Com este script, o seu jogo terá um menu de seleção
# de classes, que deixará o jogo mais bonito e com um ar mais profissional
#-------------------------------------------------------------------------
# Instruções: Modifique a seu gosto as constantes
# no módulo de configuração abaixo.
# Para chamar o script:
# Evento > Adicionar Comando > 3ª Aba > Chamar Script
# E então digite: select_class(actor)
# Sendo actor o id do personagem do banco de dados que terá
# sua classe alterada/mudada.
# Exemplo: select_class(1)
#=========================================================================
module JohnBolton
  module SelectClass
  #--------------------------------------------------------------------------
  # * Configurações
  #--------------------------------------------------------------------------
=begin
 In_Title - Permite que após a opção "Novo Jogo" na tela de título
 ser selecionada, haja um redirecionamente para o menu de seleção de classes. 
 Esta opção, se ativada, pode causa incompatibilidade com outros scripts
 que alterem a class Scene_Title. Então, para uma maior prevenção
 de incompatibilidade. É recomendável que este seja o último script entre
 os 'Scripts Adicionais' e o 'Main'. Caso mesmo assim, uma incompatibilidade
 gerada, desative esta opção imediatamente, ou contate o criador do script,
 ou alguém que entenda do mesmo, para dar-lhe suporte.
 Legenda: true  : ativado
          false : desativado
=end
 In_Title = true
=begin
 Cabeçalho - Mudar a frase do cabeçalho do menu de seleção
=end 
 Cabecalho = "Escolha uma classe"
=begin
 Classes - Definir as classes que poderão ser selecionadas no menu. As classes
 poderão ser apontadas tanto pelo seu ID, tanto quanto pelos seus Nomes. Caso
 o nome ou o ID não correspondam a nenhuma classe do Bando de Dados, uma
 janela Pop-up aparecerá para aviso do erro, e na mesma, haverá alternativas
 para erro. 
=end
 Classes = ['Guerreiro',6,9,'Cavaleiro']
=begin
 Pictures - Nesta constante, deverá ser apontado os nomes da imagens que
 aparecem respectivamente nesta ordem no menu de seleção de classes.
 Todas as imagens devem estar obrigatoriamente no diretório 'Graphics/Battlers'
=end
 Pictures = ['Grappler_m','Delf_m','Cleric_m','Fanatic']
=begin
 Background - Definir o nome da imagem que aparecerá como plano de fundo do
 menu de seleção de classes. Por obrigatoriedade esta imagem 
 deverá estar no diretório 'Graphics/Parallax'
 Caso deseje que o plano de fundo seja uma window, determine o valor como sendo 0
=end 
 Background = 'StarlitSky'
=begin
 Move_Background - Define se haverá um movimento como os do 'Fog', no 
 plano de fundo do menu citado.
 Legenda: true  - ativado
          false - desativado
=end
 Move_Background = true
=begin          
  Movimentacao_Horizontal - Define a velocidade do movimento do plano de fundo
  horizontal, levando em conta as condições do mundo real.
  Valores: 0 - Sem movimento
           1 - Movimento regular
           2 - Movimento rápido
           3 - Movimento exageradamente rápido ( Não recomendado )
=end           
 Movimentacao_Horizontal = 1
=begin 
  Movimentacao_Vertical - Define a velocidade do movimento do plano de fundo
  vertical, levando em conta as condições do mundo real.
  Valores: 0 - Sem movimento
           1 - Movimento regular
           2 - Movimento rápido
           3 - Movimento exageradamente rápido ( Não recomendado )
=end
 Movimentacao_Vertical = 0 
=begin
  BGM - Define respectivamente o nome do arquivo a ser tocado
  e o volume do mesmo. Por obrigatoriedade, o arquivo deve-se encontrar
  no diretório ' Audio/BGM '  
=end
 BGM = ["Battle5",80] 
  #--------------------------------------------------------------------------
  # * Fim das Configurações
  #--------------------------------------------------------------------------
  end
end
  #--------------------------------------------------------------------------
  # * MessageBox - Object
  #--------------------------------------------------------------------------
def p(message='',title='',type=2)
  p = Win32API.new('user32','MessageBox',['L','P','P','L'],'I')
  p.call(0,message,title,type)
end
#==============================================================================
# ** Window_NameClasses
#------------------------------------------------------------------------------
#  Esta janela contém os nomes das classes a serem mostradas na Seleção de Classes
#==============================================================================
class Window_NameClasses < Window_Base
  include JohnBolton::SelectClass
  #--------------------------------------------------------------------------
  # * Inicialização do objeto
  #--------------------------------------------------------------------------
  def initialize(x,y,width,height)
    super(x,y,width,height)
    #Chama o método de Renovação
    refresh
  end
  #--------------------------------------------------------------------------
  # * Renovação
  #--------------------------------------------------------------------------
  def refresh
    #Criação dos contextos
    names = []
    #Para todos os valores da constante Classes
    for i in 0..3
      case Classes[i]
      #Quando i, tiver valor String
      when String
        names << Classes[i]     
      #Quando i, tiver valor String
      when Integer
        #Verifica se o ID apontado existe no Bando de Dados
        unless Classes[i] > $data_classes.size - 1 || Classes[i] <= 0
          #Caso existe, recupera o nome da classe pelo id
          #e adiciona o valor na array 'names'
          names << ($data_classes[Classes[i]].name)
          #Caso não exista a classe apontada pelo id
        else
          #Adiciona mensagem de erro na array 'names'
          names << "Não encontrado"
        end
      #Quando não Integer e nem String
      else
        #Adiciona mensagem de erro na array 'names'
        names << "Não encontrado"
      end
    end
    #Criação dos contextos
    draw_text(- 15,285,136,32,names[0],1)
    draw_text(544/4 - 15,285,136,32,names[1],1)
    draw_text(544/2 - 15,285,136,32,names[2],1)
    draw_text(544/2 + 544/4 - 15,285,136,32,names[3],1)
  end
end

#==============================================================================
# ** Window_SelectClass
#------------------------------------------------------------------------------
#  Esta janela serve para a seleção de classe
#==============================================================================
class Window_SelectClass < Window_HorzCommand
  #--------------------------------------------------------------------------
  # * Inicialização do objeto
  #--------------------------------------------------------------------------
  def initialize(x,y,width,height)
    #Cria uma instancia para o argumento width
    @window_width = width
    #Cria uma instancia para o argumento height
    @window_height = height
    super(x, y)
  end
  #--------------------------------------------------------------------------
  # * Aquisição da largura da janela
  #--------------------------------------------------------------------------  
  def window_width
    @window_width
  end
  #--------------------------------------------------------------------------
  # * Aquisição da altura da janela
  #--------------------------------------------------------------------------
  def window_height
    @window_height
  end  
  #--------------------------------------------------------------------------
  # * Aquisição do número de colunas
  #--------------------------------------------------------------------------
  def col_max
    return 4
  end
  #--------------------------------------------------------------------------
  # * Cálculo da altura do conteúdo da janela
  #--------------------------------------------------------------------------
  def contents_height
    return 336
  end
  #--------------------------------------------------------------------------
  # * Criação da lista de comandos
  #--------------------------------------------------------------------------
  def make_command_list
    add_command('',       :first_class)
    add_command('',       :second_class)
    add_command('',       :third_class)
    add_command('',       :fourth_class)
  end  
  #--------------------------------------------------------------------------
  # * Aquisição do retangulo para desenhar o item
  #     index : índice do item
  #--------------------------------------------------------------------------
  def item_rect(index)
    rect = super
    rect.x = index * (item_width + spacing)
    rect.y = 0
    rect.height = 336
    rect
  end
end

#==============================================================================
# ** Scene_SelectClass
#------------------------------------------------------------------------------
#  Esta classe executa o processamento da Seleção de Classe
#==============================================================================
class Scene_SelectClass < Scene_Base
  include JohnBolton::SelectClass
  #--------------------------------------------------------------------------
  # * Inicialização do processo
  #--------------------------------------------------------------------------
  def initialize
    @actor = $game_system.actor_select_classes
  end   
  #--------------------------------------------------------------------------
  # * Inicialização do processo²
  #--------------------------------------------------------------------------
  def start
    #Variável necessária para correção do bug da MessageBox
    @bug_test = true
    #Chama o método para criação da window de seleção
    create_command_window
    #Chama o método para a criação do cabeçalho da Scene
    create_help_window
    #Chama o método para criação das pictures dos Battlers
    create_battlers
    #Criação do Plano de fundo da Scene
    create_background
  end
  #--------------------------------------------------------------------------
  # * Aquisição da velocidade de transição
  #--------------------------------------------------------------------------
  def transition_speed
    return 40
  end
  #--------------------------------------------------------------------------
  # * Criação do plano de fundo
  #--------------------------------------------------------------------------
  def create_background
    #Declaração da variável
    @sprite_background = Plane.new
    #Se a constante para seleção do plano de fundo não tiver o valor para
    #o fundo da window ser um plano de fundo
    unless Background == 0
      #Criação bitmap
      @sprite_background.bitmap = Cache.parallax(Background)      
    end
  end
  #--------------------------------------------------------------------------
  # * Atualização da Tela
  #--------------------------------------------------------------------------
  def update
    super
    #Caso a constante permita o movimento do plano de fundo e a imagem exista
    if Move_Background
      unless Background == 0
        #Ocorre o movimentohorizontal e vertical
        @sprite_background.ox += Movimentacao_Horizontal
        @sprite_background.oy += Movimentacao_Vertical
      end
    end
    if Input.trigger?(:B) && @actor != 1
      Sound.play_cancel
      terminate
    end
  end
  #--------------------------------------------------------------------------
  # * Criação dos Bitmaps
  #--------------------------------------------------------------------------
  def create_battlers
    #Declaração das instancias
    @first_class = Sprite.new
    @second_class = Sprite.new
    @third_class = Sprite.new
    @fourth_class = Sprite.new
    #Criação dos bitmaps
    @first_class.bitmap = Cache.battler(Pictures[0],0)
    @second_class.bitmap = Cache.battler(Pictures[1],0)
    @third_class.bitmap = Cache.battler(Pictures[2],0)
    @fourth_class.bitmap = Cache.battler(Pictures[3],0)
    #Aquisição da coordenada X das pictures
    @first_class.x = (136 - @first_class.width)/2 
    @second_class.x = ((136 - @second_class.width)/2) + (544/4)
    @third_class.x = ((136 - @third_class.width)/2) + (544/2)
    @fourth_class.x = ((136 - @third_class.width)/2) + (544/2 + 544/4)
    #Aquisição da coordenada Y das pictures
    @first_class.y = ((365 - @first_class.height)/2) + 51
    @second_class.y = ((365 - @second_class.height)/2) + 51
    @third_class.y = ((365 - @third_class.height)/2) + 51
    @fourth_class.y = ((365 - @third_class.height)/2) + 51
    #Aquisição da profundidade das pictures
    @first_class.z = 9999 
    @second_class.z = 9999
    @third_class.z = 9999
    @fourth_class.z = 9999
  end
  #--------------------------------------------------------------------------
  # * Criação da janela de comando
  #--------------------------------------------------------------------------
  def create_command_window
    #Declaração da instancia para com a Window que contém os nomes das classes
    @window = Window_NameClasses.new(0,51,544,365)
    #Aquisição da profundidade da window
    @window.z = 99999
    #Aquisição da opacidade do fundo da window
    @window.back_opacity = 0
    #Declaração da window de seleção de classe
    @command_window = Window_SelectClass.new(0,51,544,365)
    #Aquisição da profundidade da window
    @command_window.z = 9999
    #Aquisição da opacidade do fundo da window caso a constante do plano de fundo não seja 0
    @command_window.back_opacity = 0 unless Background == 0
    @command_window.set_handler(:first_class,  method(:command_first_class))
    @command_window.set_handler(:second_class, method(:command_second_class))
    @command_window.set_handler(:third_class,  method(:command_third_class))
    @command_window.set_handler(:fourth_class, method(:command_fourth_class))
  end
  #--------------------------------------------------------------------------
  # * Criação da janela de ajuda.
  #--------------------------------------------------------------------------
  def create_help_window
    @help_window = Window_Help.new(1)
    @help_window.height = 51
    @help_window.back_opacity = 0 unless Background == 0
    @help_window.set_text(Cabecalho.rjust(34))
  end
  #--------------------------------------------------------------------------
  # * Checa se a classe existe quando o valor é String
  #     index : índice
  #--------------------------------------------------------------------------
  def check_name_classes(index)
    for i in 1...$data_classes.size
      #Caso exista
      if Classes[index] == $data_classes[i].name
        #O Personagem principal adquire a classe selecionada
        $game_actors[@actor].change_class(i)
        #Recupera todos os status
        $game_actors[@actor].recover_all
        #Termina o processo
        terminate
        return
      end
    end
    #Método de erro é chamado
    error_no_one(index,1) if @bug_test
  end
  #--------------------------------------------------------------------------
  # * Checa se a classe existe quando o valor é Integer
  #     index : índice
  #-------------------------------------------------------------------------- 
  def check_id_classes(index)
    unless Classes[index] > $data_classes.size - 1 || Classes[index] <= 0
      $game_actors[@actor].change_class(Classes[index])
      #Recupera todos os status
      $game_actors[@actor].recover_all
      terminate
    else
      error_no_one(index,2) if @bug_test
    end
  end
  #--------------------------------------------------------------------------
  # * Processamento de alternativas para o erro
  #     index : índice
  #     type  : ID do erro
  #--------------------------------------------------------------------------  
  def error_no_one(index, type)
    case type
    when 0
      #Adquire a opção selecionada pelo maker/jogador
      clicked = p("'#{Classes[index]}' nao esta relacionado a nenhum ID ou Nome de classe","Scene_SelectClasses", 2)
    when 1
      #Adquire a opção selecionada pelo maker/jogador
      clicked = p("Classe '#{Classes[index]}' nao encontrada no Banco de Dados","Scene_SelectClasses", 2)
    when 2
      #Adquire a opção selecionada pelo maker/jogador
      clicked = p("Classe de ID '#{Classes[index]}' nao encontrada no Banco de Dados","Scene_SelectClasses", 2)      
    end
    #Caso a opção selecionada tenha sido:
    case clicked
      #Abortar
      when 3
        #O jogo é fechado
        exit
      #Tentar novamente
      when 4
        #Chama o método para checar se a classe apontada na constante existe
        case index
        when 0
          command_first_class
        when 1
          command_second_class
        when 2
          command_third_class
        when 3
          command_fourth_class
        end
      #Ignorar
      when 5
        #Mudança de valor para solucionar o bug da MessageBox
        @bug_test = false
        #Reproduz efeitos sonoros e BGM do mapa
        $game_map.autoplay
        #Muda para a Scene_Map
        SceneManager.goto(Scene_Map)
        #Congela os gráficos
        Graphics.freeze
        #Termina o processo
        terminate
        #Classe de ID 1 é selecionada
        $game_actors[@actor].change_class(1)
        return
      end
  end
  
  #--------------------------------------------------------------------------
  # * Primeira classe selecionada
  #--------------------------------------------------------------------------
  def command_first_class
    check_name_id_classes(0)
  end
  #--------------------------------------------------------------------------
  # * Segunda classe selecionada
  #--------------------------------------------------------------------------
  def command_second_class
    check_name_id_classes(1)
  end
  #--------------------------------------------------------------------------
  # * Terceira classe selecionada
  #--------------------------------------------------------------------------
  def command_third_class
    check_name_id_classes(2)
  end
  #--------------------------------------------------------------------------
  # * Quarta classe selecionada
  #--------------------------------------------------------------------------
  def command_fourth_class
    check_name_id_classes(3)
  end 
  #--------------------------------------------------------------------------
  # * Checa os valores dados na constante
  #     index : índice
  #--------------------------------------------------------------------------
  def check_name_id_classes(index)
    #Checa se a classe apontada na constante de configuração existe
    case Classes[index]
    #Quando é dado o nome da classe
    when String
      check_name_classes(index)
    #Quando é dado o ID da classe
    when Integer
      check_id_classes(index)
    #Quando o valor é diferente dos citados acima
    else
      #Método de erro é chamado
      error_no_one(index,0) if @bug_test
    end
  end
  #--------------------------------------------------------------------------
  # * Finalização do processo
  #--------------------------------------------------------------------------
  def terminate
    #Finaliza as windows declaradas na classe
    Graphics.fadeout(40)
    $game_system.actor_select_classes = 1
    @command_window.dispose
    @help_window.hide
    @window.dispose
    #Finaliza as imagens declaradas na classe
    @first_class.dispose
    @second_class.dispose
    @third_class.dispose
    @fourth_class.dispose
    #Reproduz efeitos sonoros e BGM do mapa
    $game_map.autoplay
    #Muda para Scene_Map
    SceneManager.goto(Scene_Map)
  end
end

#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
#  Esta classe executa o processamento da tela de título.
#==============================================================================
if JohnBolton::SelectClass::In_Title
  class Scene_Title
    #--------------------------------------------------------------------------
    # * Recriação do método command_new_game
    #--------------------------------------------------------------------------
    def command_new_game
      DataManager.setup_new_game
      close_command_window
      fadeout_all
      #Se a constante relacionada a música não tiver valor 0:
      unless JohnBolton::SelectClass::BGM[0] == 0
        #A BGM apontada na constante é reproduzida.
        Audio.bgm_play('Audio/BGM/' + JohnBolton::SelectClass::BGM[0], JohnBolton::SelectClass::BGM[1])
      end
      $game_system.actor_select_classes = $game_party.members[0].id
      SceneManager.call(Scene_SelectClass)
    end
  end
end


#==============================================================================
# ** Game_Interpreter
#------------------------------------------------------------------------------
#  Um interpretador para executar os comandos de evento. Esta classe é usada
# internamente pelas classes Game_Map, Game_Troop e Game_Event.
#==============================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # * Chama o menu de seleção de classes pelo "Chamar Script"
  #     actor : ID do actor
  #--------------------------------------------------------------------------
  def select_class(actor)
    $game_system.actor_select_classes = actor
    SceneManager.call(Scene_SelectClass)
  end
end

#==============================================================================
# ** Game_System
#------------------------------------------------------------------------------
#  Esta classe gerencia os dados relacionados ao sistema. Também gerencia
# veículos, BGM, etc.
# A instância desta classe é referenciada por $game_system.
#==============================================================================
class Game_System
  #--------------------------------------------------------------------------
  # * Variáveis Públicas
  #--------------------------------------------------------------------------
  attr_accessor :actor_select_classes
  #--------------------------------------------------------------------------
  # * Modificação do método initialize
  #--------------------------------------------------------------------------
  alias johnbolton_selectclasses_initialize initialize
  def initialize
    johnbolton_selectclasses_initialize
    @actor_select_classes = 1
  end
end


Mais scripts do mesmo autor?
R -> Aqui

[box class=titlebg]
Imagens
[/box]

Spoiler

[close]



[box class=titlebg]
Download
[/box]

Não necessário

[box class=titlebg]
Créditos e Avisos
[/box]

JohnBolton

Ao estilo do jogo:

Sunset Riders
JS > ALLs