Forums » RGSS

Lição 8.3 - Scenes. Janelas Especias e a reconfiguração da Scene

    • 683 posts
    2 de junho de 2015 18h13min15s ART

    Olá amigos !! Desculpem a demora, mas tenho trabalhado muito e não tenho tido tempo pra nada. resolvi dar um jeito de terminar logo com este menu para que possamos aprender mais, acho que este assunto está muito massante sem uma necessidade real. Devido à quantidade de PMs que eu tenho recebido sobre coisas que, se as pessoas parassem para ler com atenção as aulas, saberiam resolver, e devido a certos Makers que acham que estão me fazendo um favor atrapalhando o desenrolar das aulas, terminarei o menu, e depois disso passaremos para uma nova fase. Vamos ao menu então:

    Lição passada eu pedi que fizessem a janela de Atributos do herói e a janela de Equipamento. Vários de vocês, como o morzan, tiveram facilidade, e a maioria não conseguiu nada. então, aqui está o código das janelas:

    Código:
    class Window_Equipamento < Window_Base
      def initialize(actor)
        super(0, 0, 240, 192)
        self.contents = Bitmap.new(width - 32, height - 32)
        self.contents.font.name = $fontface
        self.contents.font.size = $fontsize
        @actor = actor
        refresh
      end
      def refresh
        self.contents.clear
        draw_item_name($data_weapons[@actor.weapon_id], 0, 0)
        draw_item_name($data_armors[@actor.armor1_id], 0, 32)
        draw_item_name($data_armors[@actor.armor2_id], 0, 64)
        draw_item_name($data_armors[@actor.armor3_id], 0, 96)
        draw_item_name($data_armors[@actor.armor4_id], 0, 128)
      end
    end
    #==============================================================================
    class Window_Status2 < Window_Base
      def initialize(actor)
        super(0, 0, 240, 192)
        self.contents = Bitmap.new(width - 32, height - 32)
        self.contents.font.name = $fontface
        self.contents.font.size = $fontsize
        @actor = actor
        refresh
      end
      def refresh
        self.contents.clear
        draw_actor_parameter(@actor, 0, 0, 0)
        draw_actor_parameter(@actor, 0, 21, 1)
        draw_actor_parameter(@actor, 0, 42, 2)
        draw_actor_parameter(@actor, 0, 63, 3)
        draw_actor_parameter(@actor, 0, 84, 4)
        draw_actor_parameter(@actor, 0, 105, 5)
        draw_actor_parameter(@actor, 0, 126, 6)
      end
    end


    Peço a todos que fizeram as janelas que renomeiem para os nomes das do exemplo, para evitarmos erros.

    Todos conseguiram configurar a posição das janelas? Não? Bem, aqui vai então o código completo do procedimento main da Scene, para que vocês tenham uma idéia:

    Código:
      def main
        s1 = $data_system.words.item
        s2 = $data_system.words.skill
        s3 = $data_system.words.equip
        s4 = "Salvar"
        s5 = "Fim de Jogo"
        @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5])
        @command_window.index = @menu_index
        @command_window.x = 640 - 160
        @command_window.y = 192 
        if $game_party.actors.size == 0
          @command_window.disable_item(0)
          @command_window.disable_item(1)
          @command_window.disable_item(2)
          @command_window.disable_item(3)
        end
        if $game_system.save_disabled
          @command_window.disable_item(4)
        end
        @playtime_window = Window_PlayTime.new
        @playtime_window.x = 640 - @playtime_window.width
        @steps_window = Window_Steps.new
        @steps_window.x = 640 - @steps_window.width
        @steps_window.y = 64
        @gold_window = Window_Gold.new
        @gold_window.x = 640 - @gold_window.width
        @gold_window.y = 128
        
        #@mapname_window = Window_Mapname.new
        #@mapname_window.y = 480 - 96
        @status_window = Window_Hero_Status.new($game_party.actors[0])
        @status_window.y = 0
        @equip_window = Window_Equipamento.new($game_party.actors[0])
        @equip_window.y = 192
        @stats_window = Window_Status2.new($game_party.actors[0])
        @stats_window.x = 240
        @stats_window.y = 192
        #@dummy_window = Window_Dummy.new($game_party.actors[0])
        #@dummy_window.x = 320
        Graphics.transition
        loop do
          Graphics.update
          Input.update
          update
          if $scene != self
            break
          end
        end
        Graphics.freeze

        @command_window.dispose
        @playtime_window.dispose
        @steps_window.dispose
        @gold_window.dispose
        
        @status_window.dispose
        #@mapname_window.dispose
        @equip_window.dispose
        @stats_window.dispose
        #@dummy_window.dispose
      end


    Observe que já há a declaração das janelas com o nome do mapa e com a janela de ataque do SBAS. elas estão comentadas, para evitar erros. Seu menu deve estar assim agora:



    Criar uma janela que mostre o nome do mapa

    O RMXP tem muita coisa literalmente escondida. Seria de uma simplicidade enorme haver uma função/procedimento que mostrasse o nome do mapa atual. Mas por padrão não há. Para isso, declaramos numa var global, a $map_infos, os nomes dos mapas, lendo-os no arquivo MapInfos.rxdata. Não fui eu quem inventou este código. e em alguns Menus, como o do FF7 que vem no Help do XP, há esta função, mas ela é dispersa. Aqui, construiremos uma concisa. No topo do seu menu, ou em outra sessão que seja acima da sessão do menu, vamos declarar a função name na classe Game_Map, assim:

    Código:
    class Game_Map
      def name
        $map_infos[@map_id]
      end
    end


    Isto ainda não mostra o nome do mapa, precisamos criar a função que lê para a var os nomes dos mapas. Para isso, logo baixo da função acima, declare assim:

    Código:
    class Scene_Title
      $map_infos = load_data("Data/MapInfos.rxdata")
      for key in $map_infos.keys
        $map_infos[key] = $map_infos[key].name
      end
    end


    O que fizemos?

    Criamos uma estrutura for para ler os nomes dos mapas e gravá-los na var $map_infos. E na Classe Game_map criamos o procedimento. Agora, sempre que você quiser, na janela ou não, basta chamar $game_map[id].name.
    Para facilitar, vou por aqui o código da janela:

    Código:
    class Window_Mapname < Window_Base
      def initialize
        super(0, 0, 640, 96)
        self.contents = Bitmap.new(width - 32, height - 32)
        self.contents.font.name = $fontface
        self.contents.font.size = 24
        refresh
      end
      def refresh
        self.contents.clear
        self.contents.draw_text(4, 16, 608, 32, $game_map.name.to_s, 1)
      end
    end


    Agora sim, você pode remover o # das linhas:

    Código:
    @mapname_window = Window_Mapname.new
        @mapname_window.y = 480 - 96
    ...
    @mapname_window.dispose


    Agora, o menu está quase pronto:



    A ultima janela, que iria mostrar as Habilidades equipadas no SBAS, eu não vou fazer. Decidi isso porque recebi uma msg muito estranha de um Maker que se dizia "inconformado" por eu estar usando um sistema de batalha para dar aulas que não fosse um de minha autoria. O Criador do Sistema, com certeza disponibilizou o código por saber que ele seria bem usado, não me importo, e espero que você também não.

    Corrigindo o funcionamento do Menu

    Depois de muito mexermos com os códigos, tenho certeza que seu menu está uma bagunça. As opções não funcionam, ou dão erro. Vamos começar pelo principal:

    Agora, você não possui mais um menu de Status, que recebia o foco para selecionar um heroi. no procedimento update há a seguinte definição:

    Código:
    if @command_window.active
          update_command
          return
        end
        # Se a janela de Status estiver ativa: call update_status
        if @status_window.active
          update_status
          return
        end


    Aqui, quando o menu de comandos está ativo, a scene se direciona para o procedimento update_command, quando é a janela de Status, para a update_status. Como nosso menu não terá mais a janela de Status, não precisaremos verificar se ele está ativo, e não precisaremos verificar se a de Status está ativa. remova todo este código e deixe somente a chamadaupdate_command. Seu procedimento update deve estar assim:

    Código:
    def update
        @command_window.update
        @playtime_window.update
        @steps_window.update
        @gold_window.update
        @status_window.update
        @mapname_window.update
        @equip_window.update
        @stats_window.update
        update_command
      end


    Muito bem. Sabendo que o procedimento update_status não será mais usado, você pode removê-lo, para diminuir código inútil. Ele está na linha 185 do menu original.

    Feito isso vamos corrigir o update_command. houve um maker ae que achou que eu estava "perdido" e não sabia o que estava fazendo, até se disponibilizou para arrumar o "problema" se eu não soubesse como o fazer... Como tem pessoas ingenuas nesse mundo...  ;D

    Observe o procedimento update_command:

    Código:
    def update_command
        # Se o botão B for pressionado
        if Input.trigger?(Input::B)
          # Reproduzir SE de cancelamento
          $game_system.se_play($data_system.cancel_se)
          # Alternar para a tela do mapa
          $scene = Scene_Map.new
          return
        end
        # Se o botão C for pressionado
        if Input.trigger?(Input::C)
          # Se o comando for outro senão Salvar, Fim de Jogo e o número de Heróis no
          # Grupo for 0
          if $game_party.actors.size == 0 and @command_window.index < 4
            # Reproduzir SE de erro
            $game_system.se_play($data_system.buzzer_se)
            return
          end
          # Ramificação por posição do cursor na janela de comandos
          case @command_window.index
          when 0  # Itens
            # Reproduzir SE de OK
            $game_system.se_play($data_system.decision_se)
            # Alternar para a tela de Itens
            $scene = Scene_Item.new
          when 1  # Habilidades
            # Play decision SE
            $game_system.se_play($data_system.decision_se)
            # Ativar o status da janela
            @command_window.active = false
            @status_window.active = true
            @status_window.index = 0
          when 2  # Equipamentos
            # Reproduzir SE de OK
            $game_system.se_play($data_system.decision_se)
            # Ativar o status da janela
            @command_window.active = false
            @status_window.active = true
            @status_window.index = 0
          when 3  # Status
            # Reproduzir SE de OK
            $game_system.se_play($data_system.decision_se)
            # Ativar o status da janela
            @command_window.active = false
            @status_window.active = true
            @status_window.index = 0
          when 4  # Salvar
            # Se Salvar for proibido
            if $game_system.save_disabled
              # Reproduzir SE de erro
              $game_system.se_play($data_system.buzzer_se)
              return
            end
            # Reproduzir SE de OK
            $game_system.se_play($data_system.decision_se)
            # Alternar para a tela de save
            $scene = Scene_Save.new
          when 5  # Fim de Jogo
            # Reproduzir SE de OK
            $game_system.se_play($data_system.decision_se)
            # Alternar para a tela de Fim de Jogo
            $scene = Scene_End.new
          end
          return
        end
      end


    Procure pela linha case @command_window.index. É aqui que a mágica acontece. Sempre que a janela de comandos está ativa e você pressiona a tecla Enter/Espaço o Scene vem aqui neste case, procura saber qual comando estava selecionado através do index da janela, e executa o comando. A primeira coisa que devemos fazer é trocar o conteúdo dowhen 3  # Status pelo do when 4  # Salvar, e o do  when 5  # Fim de Jogo, pelo do when 4  # Salvar. Podemos apagar o  when 5  # Fim de Jogo, pois nossa janela de comandos não possui mais 6 itens, apenas 5. Outra coisa importante. Observe que when 1 e when 2 direcionam para a janela de Status:



    Como não estamos mais usando a janela de Status, vamos chamar diretamente as Scenes de Skill e Equip aqui. Mas como? Se você ainda não deletou o procedimento update_status, verá nele que ele passa como parâmetro para essas Scenes o ID do herói na indexação da $game_party, em forma do index da janela, observe:

    Código:
    $scene = Scene_Equip.new(@status_window.index)
    $scene = Scene_Status.new(@status_window.index)


    Ao invés de passarmos o index da janela, como sabemos que nosso herói é o ID do herói na indexação da $game_party é 0 (zero), basta colocarmos assim:

    Código:
    $scene = Scene_Equip.new(0)
    $scene = Scene_Status.new(0)


    e colocar as linhas nas respectivas when. O código completo do procedimento:

    Código:
    def update_command
        if Input.trigger?(Input::B)
          $game_system.se_play($data_system.cancel_se)
          $scene = Scene_Map.new
          return
        end
        if Input.trigger?(Input::C)
          if $game_party.actors.size == 0 and @command_window.index < 4
            $game_system.se_play($data_system.buzzer_se)
            return
          end
          case @command_window.index
          when 0  
            $game_system.se_play($data_system.decision_se)
            $scene = Scene_Item.new
          when 1  # Habilidades
            #-------------------------------------------------------#
            if $game_party.actors[0].restriction >= 2
              $game_system.se_play($data_system.buzzer_se)
              return
            end
            $game_system.se_play($data_system.decision_se)
            $scene = Scene_Skill.new(0)
            #-------------------------------------------------------#
          when 2  # Equipamentos
            #-------------------------------------------------------#
            $game_system.se_play($data_system.decision_se)
            $scene = Scene_Equip.new(0)
            #-------------------------------------------------------#
          when 3  # Salvar
            if $game_system.save_disabled
              $game_system.se_play($data_system.buzzer_se)
              return
            end
            $game_system.se_play($data_system.decision_se)
            $scene = Scene_Save.new
          when 4  # Fim de Jogo
            $game_system.se_play($data_system.decision_se)
            $scene = Scene_End.new
          end
          return
        end
      end


    Se foi tudo feito de maneira correta, seu menu está funcionando, e com todas as funções direcionadas ao primeiro herói.
    A área que ficou vazia? bem, coloque o que quiser, uma janela de fome, ou algo parecido, ela ia ficar assim:

    Código:
    class Window_Dummy < Window_Base
      def initialize(actor)
        super(0, 0, 160, 192)
        self.contents = Bitmap.new(width - 32, height - 32)
        self.contents.font.name = $fontface
        self.contents.font.size = $fontsize
        @actor = actor
        refresh
      end
      def refresh
        self.contents.clear
        bitmap = RPG::Cache.windowskin($game_system.windowskin_name)
        src_rect = Rect.new(128,64,32,32)
        self.contents.blt(0, 0, bitmap, src_rect)
        self.contents.blt(0, 42, bitmap, src_rect)
        self.contents.blt(0, 84, bitmap, src_rect)
        self.contents.blt(0, 126, bitmap, src_rect)
        self.contents.draw_text(0,8,32,32,"H",0)
        self.contents.draw_text(0,50,32,32,"J",0)
        self.contents.draw_text(0,92,32,32,"K",0)
        self.contents.draw_text(0,132,32,32,"L",0)
      end
    end


    Mas mude-a de acordo com o seu gosto.

    Eu sei, foi terrível. Para uma aula que seria esclarecedora, acho que surgiram muito mais dúvidas. eu pretendo voltar no assunto janelas, exemplificar melhor, mostrar tudo que pode e não pode ser feito com elas. Se você tem seguido as aulas com empenho, já sabe bastante coisa suficiente para aprofundarmos mais nos códigos.

    Tentarei não me demorar tanto para postar uma aula e, mais uma vez eu peço desculpas. Estou pensando em algo bem interessante para a próxima aula, para que essa impressão ruim saia.

    Até lá, e obrigado.

    Ah sim, o código completo da Scene, do jeito que eu fiz aqui:

    Código:
    class Game_Map
      def name
        $map_infos[@map_id]
      end
    end
    class Scene_Title
      $map_infos = load_data("Data/MapInfos.rxdata")
      for key in $map_infos.keys
        $map_infos[key] = $map_infos[key].name
      end
    end
    #################################################################
    class Window_Base
      def draw_actor_name2(actor, x, y,align=0)
        self.contents.font.color = normal_color
        self.contents.draw_text(x, y, 64, 32, actor.name ,align)
      end
      def draw_actor_parameter(actor, x, y, type)
        case type
        when 0
          parameter_name = $data_system.words.atk
          parameter_value = actor.atk
        when 1
          parameter_name = $data_system.words.pdef
          parameter_value = actor.pdef
        when 2
          parameter_name = $data_system.words.mdef
          parameter_value = actor.mdef
        when 3
          parameter_name = $data_system.words.str
          parameter_value = actor.str
        when 4
          parameter_name = $data_system.words.dex
          parameter_value = actor.dex
        when 5
          parameter_name = $data_system.words.agi
          parameter_value = actor.agi
        when 6
          parameter_name = $data_system.words.int
          parameter_value = actor.int
        end
        self.contents.font.color = system_color
        self.contents.draw_text(x, y, 120, 32, parameter_name)
        self.contents.font.color = normal_color
        self.contents.draw_text(x + 164, y, 36, 32, parameter_value.to_s, 2)
      end
      alias cbs_draw_actor_hp draw_actor_hp
      def draw_actor_hp(actor, x, y, width = 146, height = 15)
        bg = Color.new(  0,   0,   0, 160)
        c1 = Color.new(255,   0,   0, 0)
        c2 = Color.new(255, 255,   0, 160)
        self.contents.fill_rect(x, y, width, height, bg)
        width2 = width * actor.hp / actor.maxhp
        gradient(x + 1, y + 1, width2 - 2, height - 2, c1, c2)
        cbs_draw_actor_hp(actor, x, y, width)
      end
      alias cbs_draw_actor_sp draw_actor_sp
      def draw_actor_sp(actor, x, y, width = 146, height = 15)
        bg = Color.new(  0,   0,   0, 160)
        c1 = Color.new(  0,   0, 255, 0)
        c2 = Color.new(  0, 255, 255, 160)
        self.contents.fill_rect(x, y, width, height, bg)
        if actor.maxsp != 0
          width2 = width * actor.sp / actor.maxsp
        else
          width2 = width * actor.sp / 1
        end
        gradient(x + 1, y + 1, width2 - 2, height - 2, c1, c2)
        cbs_draw_actor_sp(actor, x, y, width)
      end
      def gradient(x, y, width, height, c1, c2)
        for i in 1..width
          x2 = x + i - 1
          r = c1.red * (width - i) / width + c2.red * i / width
          g = c1.green * (width - i) / width + c2.green * i / width
          b = c1.blue * (width - i) / width + c2.blue * i / width
          a = c1.alpha * (width - i) / width + c2.alpha * i / width
          self.contents.fill_rect(x2, y, 1, height, Color.new(r, g, b, a))
        end
      end
    end
    #################################################################
    class Window_Steps < Window_Base
      def initialize
        super(0, 0, 160, 64)
        self.contents = Bitmap.new(width - 32, height - 32)
            self.contents.font.name = $fontface
        self.contents.font.size = $fontsize
        refresh
      end
      def refresh
        self.contents.clear
        self.contents.font.color = system_color
        self.contents.draw_text(4, 0, 120, 32, "Passos")
        self.contents.font.color = normal_color
        self.contents.draw_text(4, 0, 120, 32, $game_party.steps.to_s, 2)
      end
    end
    #==============================================================================
    class Window_PlayTime < Window_Base
      def initialize
        super(0, 0, 160, 64)
        self.contents = Bitmap.new(width - 32, height - 32)
            self.contents.font.name = $fontface
        self.contents.font.size = $fontsize
        refresh
      end
      def refresh
        self.contents.clear
        @total_sec = Graphics.frame_count / Graphics.frame_rate
        hour = @total_sec / 60 / 60
        min = @total_sec / 60 % 60
        sec = @total_sec % 60
        text = sprintf("%02d:%02d:%02d", hour, min, sec)
        self.contents.font.color = normal_color
        self.contents.draw_text(4, 4, 120, 24, text, 1)
      end
      def update
        super
        if Graphics.frame_count / Graphics.frame_rate != @total_sec
          refresh
        end
      end
    end
    #==============================================================================
    class Window_Gold < Window_Base
      def initialize
        super(0, 0, 160, 64)
        self.contents = Bitmap.new(width - 32, height - 32)
            self.contents.font.name = $fontface
        self.contents.font.size = $fontsize
        refresh
      end
      def refresh
        self.contents.clear
        cx = contents.text_size($data_system.words.gold).width
        self.contents.font.color = normal_color
        self.contents.draw_text(4, 0, 120-cx-2, 32, $game_party.gold.to_s, 2)
        self.contents.font.color = system_color
        self.contents.draw_text(124-cx, 0, cx, 32, $data_system.words.gold, 2)
      end
    end
    #==============================================================================
    class Window_Equipamento < Window_Base
      def initialize(actor)
        super(0, 0, 240, 192)
        self.contents = Bitmap.new(width - 32, height - 32)
        self.contents.font.name = $fontface
        self.contents.font.size = $fontsize
        @actor = actor
        refresh
      end
      def refresh
        self.contents.clear
        draw_item_name($data_weapons[@actor.weapon_id], 0, 0)
        draw_item_name($data_armors[@actor.armor1_id], 0, 32)
        draw_item_name($data_armors[@actor.armor2_id], 0, 64)
        draw_item_name($data_armors[@actor.armor3_id], 0, 96)
        draw_item_name($data_armors[@actor.armor4_id], 0, 128)
      end
    end
    #==============================================================================
    class Window_Status2 < Window_Base
      def initialize(actor)
        super(0, 0, 240, 192)
        self.contents = Bitmap.new(width - 32, height - 32)
        self.contents.font.name = $fontface
        self.contents.font.size = $fontsize
        @actor = actor
        refresh
      end
      def refresh
        self.contents.clear
        draw_actor_parameter(@actor, 0, 0, 0)
        draw_actor_parameter(@actor, 0, 21, 1)
        draw_actor_parameter(@actor, 0, 42, 2)
        draw_actor_parameter(@actor, 0, 63, 3)
        draw_actor_parameter(@actor, 0, 84, 4)
        draw_actor_parameter(@actor, 0, 105, 5)
        draw_actor_parameter(@actor, 0, 126, 6)
      end
    end
    #==============================================================================
    class Window_Hero_Status < Window_Base
      def initialize(actor)
        super(0, 0, 320, 192)
        self.contents = Bitmap.new(width - 32, height - 32)
        self.contents.font.name = $fontface
        self.contents.font.size = $fontsize
        @actor = actor
        @frame = 0
        @pose = 0
        refresh
      end
      def refresh
        self.contents.clear
        draw_actor_sprite
        draw_actor_name2(@actor, 8, 0, 1)
        draw_actor_class(@actor, 96, 0)
        draw_actor_level(@actor, 96, 24)
        draw_actor_state(@actor, 96, 48)
        self.contents.font.color = system_color
        self.contents.draw_text(96, 72, 80, 32, "EXP:")
        self.contents.font.color = normal_color
        self.contents.draw_text(96, 72, 160, 32, @actor.exp_s + "/" + @actor.next_exp_s , 2)
        draw_actor_hp(@actor, 96, 100, 172)
        draw_actor_sp(@actor, 96, 124, 172)
      end
      def draw_actor_sprite
        self.contents.fill_rect(0, 32, 80, 120, Color.new(0, 0, 0, 0))
        bitmap = RPG::Cache.character(@actor.character_name, @actor.character_hue)
        self.contents.stretch_blt(Rect.new(0, 32, 80, 120), bitmap,
        Rect.new(bitmap.width / 4 * @frame,  bitmap.height / 4 * @pose , bitmap.width / 4 , bitmap.height / 4))
      end
     def update
        super
        if Graphics.frame_count % 10 == 0
          if @frame == 3
            #@pose == 3 ? @pose = 0 : @pose += 1
          end
          @frame == 3 ? @frame = 0 : @frame += 1
          draw_actor_sprite
        end
      end
    end
    #==============================================================================
    class Window_Dummy < Window_Base
      def initialize(actor)
        super(0, 0, 160, 192)
        self.contents = Bitmap.new(width - 32, height - 32)
        self.contents.font.name = $fontface
        self.contents.font.size = $fontsize
        @actor = actor
        refresh
      end
      def refresh
        self.contents.clear
        bitmap = RPG::Cache.windowskin($game_system.windowskin_name)
        src_rect = Rect.new(128,64,32,32)
        self.contents.blt(0, 0, bitmap, src_rect)
        self.contents.blt(0, 42, bitmap, src_rect)
        self.contents.blt(0, 84, bitmap, src_rect)
        self.contents.blt(0, 126, bitmap, src_rect)
        self.contents.draw_text(0,8,32,32,"H",0)
        self.contents.draw_text(0,50,32,32,"J",0)
        self.contents.draw_text(0,92,32,32,"K",0)
        self.contents.draw_text(0,132,32,32,"L",0)
      end
    end
    #==============================================================================
    class Window_Mapname < Window_Base
      def initialize
        super(0, 0, 640, 96)
        self.contents = Bitmap.new(width - 32, height - 32)
        self.contents.font.name = $fontface
        self.contents.font.size = 24
        refresh
      end
      def refresh
        self.contents.clear
        self.contents.draw_text(4, 16, 608, 32, $game_map.name.to_s, 1)
      end
    end
    #==============================================================================
    # Scene_Menu
    #==============================================================================

    class Scene_Menu
      def initialize(menu_index = 0)
        @menu_index = menu_index
      end
      def main
        s1 = $data_system.words.item
        s2 = $data_system.words.skill
        s3 = $data_system.words.equip
        s4 = "Salvar"
        s5 = "Fim de Jogo"
        @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5])
        @command_window.index = @menu_index
        @command_window.x = 640 - 160
        @command_window.y = 192 
        if $game_party.actors.size == 0
          @command_window.disable_item(0)
          @command_window.disable_item(1)
          @command_window.disable_item(2)
          @command_window.disable_item(3)
        end
        if $game_system.save_disabled
          @command_window.disable_item(4)
        end
        @playtime_window = Window_PlayTime.new
        @playtime_window.x = 640 - @playtime_window.width
        @steps_window = Window_Steps.new
        @steps_window.x = 640 - @steps_window.width
        @steps_window.y = 64
        @gold_window = Window_Gold.new
        @gold_window.x = 640 - @gold_window.width
        @gold_window.y = 128
        
        @mapname_window = Window_Mapname.new
        @mapname_window.y = 480 - 96
        #@mapname_window.visible = false
        @status_window = Window_Hero_Status.new($game_party.actors[0])
        @status_window.y = 0
        @equip_window = Window_Equipamento.new($game_party.actors[0])
        @equip_window.y = 192
        @stats_window = Window_Status2.new($game_party.actors[0])
        @stats_window.x = 240
        @stats_window.y = 192
        @dummy_window = Window_Dummy.new($game_party.actors[0])
        @dummy_window.x = 320
        @dummy_window.visible = false
        Graphics.transition
        loop do
          Graphics.update
          Input.update
          update
          if $scene != self
            break
          end
        end
        Graphics.freeze

        @command_window.dispose
        @playtime_window.dispose
        @steps_window.dispose
        @gold_window.dispose
        
        @status_window.dispose
        @mapname_window.dispose
        @equip_window.dispose
        @stats_window.dispose
        @dummy_window.dispose
      end
      def update
        
        @command_window.update
        @playtime_window.update
        @steps_window.update
        @gold_window.update
        @status_window.update
        @mapname_window.update
        @equip_window.update
        @stats_window.update
        @dummy_window.update
        
        update_command
      end
      
      def update_command
        if Input.trigger?(Input::B)
          $game_system.se_play($data_system.cancel_se)
          $scene = Scene_Map.new
          return
        end
        if Input.trigger?(Input::C)
          if $game_party.actors.size == 0 and @command_window.index < 4
            $game_system.se_play($data_system.buzzer_se)
            return
          end
          case @command_window.index
          when 0  
            $game_system.se_play($data_system.decision_se)
            $scene = Scene_Item.new
          when 1  # Habilidades
            #-------------------------------------------------------#
            if $game_party.actors[0].restriction >= 2
              $game_system.se_play($data_system.buzzer_se)
              return
            end
            $game_system.se_play($data_system.decision_se)
            $scene = Scene_Skill.new(0)
            #-------------------------------------------------------#
          when 2  # Equipamentos
            #-------------------------------------------------------#
            $game_system.se_play($data_system.decision_se)
            $scene = Scene_Equip.new(0)
            #-------------------------------------------------------#
          when 3  # Salvar
            if $game_system.save_disabled
              $game_system.se_play($data_system.buzzer_se)
              return
            end
            $game_system.se_play($data_system.decision_se)
            $scene = Scene_Save.new
          when 4  # Fim de Jogo
            $game_system.se_play($data_system.decision_se)
            $scene = Scene_End.new
          end
          return
        end
      end
    end


     
    ;D ;D ;D