#============================================================================== # Colosseum - Scene_Menu # # por Masked #------------------------------------------------------------------------------ # O script modifica a cena do menu para um menu em Anel, que gira conforme as # opções forem selecionadas, é possível customizá-lo de várias formas #============================================================================== #============================================================================== # Configurações #============================================================================== module Colosseum_SceneMenu #---------------------------------------------------------------------------- # Tipo de Fundo #---------------------------------------------------------------------------- # Se o menu tiver um fundo com a imagem do mapa, deixe como 'Map', se não, # mude para 'Image' e defina o nome da imagem de fundo #---------------------------------------------------------------------------- Bg_Type = 'Map' #---------------------------------------------------------------------------- # Imagem de Fundo #---------------------------------------------------------------------------- # Nome da imagem a ser usada caso Bg_Type for 'Image' #---------------------------------------------------------------------------- Bg_Image = 'Menu_Background' #---------------------------------------------------------------------------- # Fundo Embaçado #---------------------------------------------------------------------------- # Se o fundo for ficar embaçado, deixe como true, se não, deixe como false #---------------------------------------------------------------------------- Bg_Blur = false #---------------------------------------------------------------------------- # Tom do fundo #---------------------------------------------------------------------------- # O tom do fundo, deixe como Tone.new(0,0,0,0) para não alterar o tom, se for # alterar, siga o modelo: BG_Tone = Tone.new(vermelho, verde, azul, cinza) # Pode-se usar valores negativos, que criam um tom mais escuro, # Tone.new(-255,-255,-255,0) é um tom preto e Tone.new(255,255,255,0) é um # branco #---------------------------------------------------------------------------- Bg_Tone = Tone.new(0,0,0,0) #---------------------------------------------------------------------------- # Nome da Fonte #---------------------------------------------------------------------------- # O nome das fontes a serem usadas no menu, elas serão usadas conforme a # ordem em que estão, a primeira será usada se existir, se não, a segunda # será usada, e se esta também não existir, a terceira será usada e assim por # diante #---------------------------------------------------------------------------- Font_Name = ["Verdana", "Arial", "Courier New"] #---------------------------------------------------------------------------- # Cor do Texto #---------------------------------------------------------------------------- # A cor usada no texto comum #---------------------------------------------------------------------------- Text_Color = Color.new(255,255,255) #---------------------------------------------------------------------------- # Cor das opções #---------------------------------------------------------------------------- # A cor usada no texto das opções #---------------------------------------------------------------------------- Option_Color = Color.new(132, 170, 255) #---------------------------------------------------------------------------- # Cor das Janelas #---------------------------------------------------------------------------- # As cores das janelas, a primeira é a cor do fundo e a segunda a cor das # bordas # A primeira caixa define as cores da caixa quando esta não está selecionada, # e a segunda de quando ela está selecionada #---------------------------------------------------------------------------- Window_Colors = [[Color.new(190, 190, 190), Color.new(200, 200, 200)], [Color.new(245, 245, 245), Color.new(255, 255, 255)]] #---------------------------------------------------------------------------- # Opacidade das janelas #---------------------------------------------------------------------------- # A opacidade das janelas, vai de 0 a 255, quanto maior o número, mais opaco. # O primeiro valor é a opacidade da janela deselecionada, e a segunda é dela # selecionada #---------------------------------------------------------------------------- Window_Opacity = [150, 255] #---------------------------------------------------------------------------- # Tamanho das janelas #---------------------------------------------------------------------------- # O tamanho das janelas, o primeiro valor é o tamanho horizontal e o segundo # é o tamanho vertical #---------------------------------------------------------------------------- Window_Size = [100, 48] #---------------------------------------------------------------------------- # Tamanho das Bordas das Janelas #---------------------------------------------------------------------------- # O tamanho das bordas das janelas em pixels #---------------------------------------------------------------------------- Window_Border = 2 #---------------------------------------------------------------------------- # Opções do Menu #---------------------------------------------------------------------------- # Opções que serão usadas no menu, para adicionar alguma, use o modelo: # 'opção' => ["Texto da Opção", ícone, x, y, 'comandos'] # Lembre-se de sempre separar duas opções com uma vírgula #---------------------------------------------------------------------------- Options = { 'itens' => ["Itens", 192, 425, 15, 'SceneManager.call(Scene_Item)'], 'skill' => ["Habilidades", 143, 425, 71, 'SceneManager.call(Scene_Skill)'], 'equip' => ["Equipamentos", 170, 425, 127, 'SceneManager.call(Scene_Equip)'], 'status' => ["Status", 121, 425, 183, 'SceneManager.call(Scene_Status)'], 'formation' => ["Formação", 11, 425, 239, 'command_formation'], 'save' => ["Salvar", 224, 425, 292, 'SceneManager.call(Scene_Save)'], 'end' => ["Sair do Jogo", 339, 425, 351, 'SceneManager.call(Scene_End)'] } #---------------------------------------------------------------------------- # Posições das janelas de Status #---------------------------------------------------------------------------- # Aqui se define a posição das janelas de status, a primeira caixa com # valores se refere à primeira janela, a segunda à segunda janela e assim por # diante, o primeiro valor da caixa se refere à posição horizontal e o # segundo se refere à horiizontal #---------------------------------------------------------------------------- Status_Windows_Positions = [ [45, 10], [45, 115], [45, 220], [45, 325]] #---------------------------------------------------------------------------- # Tamanho das Janela de Status #---------------------------------------------------------------------------- # O primeiro valor é o tamanho horizontal e o segundo o tamanho vertical #---------------------------------------------------------------------------- Status_Windows_Size = [335, 83] #---------------------------------------------------------------------------- # Cor das Janelas #---------------------------------------------------------------------------- # As cores das janelas de status, a primeira é a cor do fundo e a segunda # a cor das bordas # A primeira caixa define as cores da caixa quando esta não está selecionada, # e a segunda de quando ela está selecionada #---------------------------------------------------------------------------- Status_Windows_Colors = [[Color.new(190, 190, 190), Color.new(200, 200, 200)], [Color.new(245, 245, 245), Color.new(255, 255, 255)]] #---------------------------------------------------------------------------- # Cor da Barra de HP #---------------------------------------------------------------------------- # Essa será a cor da barra de HP nas caixas de status, para modificar, use o # modelo: Color.new(tom de vermelho, tom de verde, tom de azul, opacidade) # a opacidade é opcional, cada valor vai de 0 a 255 #---------------------------------------------------------------------------- Hp_Bar_Color = Color.new(25, 230, 0) #---------------------------------------------------------------------------- # Cor da Barra de MP #---------------------------------------------------------------------------- # Essa será a cor da barra de MP nas caixas de status, para modificar, use o # modelo: Color.new(tom de vermelho, tom de verde, tom de azul, opacidade) # a opacidade é opcional, cada valor vai de 0 a 255 #---------------------------------------------------------------------------- Mp_Bar_Color = Color.new(0, 25, 230) end #============================================================================== # Fim das configurações #============================================================================== #============================================================================== # ** Scene_Menu #------------------------------------------------------------------------------ # Aqui serão feitas as modificações na tela de menu, a classe será quase # totalmente reescrita devido às grandes modificações que serão feitas #============================================================================== class Scene_Menu < Scene_MenuBase include Colosseum_SceneMenu # Inclusão do método de configuração #---------------------------------------------------------------------------- # * Início do processo #---------------------------------------------------------------------------- # Aqui é iniciado toda a cena e os metodos de criação dos objetos são # chamados #---------------------------------------------------------------------------- def start super create_background create_boxes create_status_boxes @index = 0 @commands = [] Options.each {|i| @commands.push(i[1][4])} @formation = false end #---------------------------------------------------------------------------- # * Criação das Caixas de Opção #---------------------------------------------------------------------------- # Aqui são criadas as caixas com as opções do menu, são desenhados os ícones, # os textos, o fundo das caixas e suas bordas e as caixas são posicionadas #---------------------------------------------------------------------------- def create_boxes @boxes = [] i = 0 Options.each {|opt| @boxes[i] = Sprite.new @boxes[i].x = opt[1][2] @boxes[i].y = opt[1][3] @boxes[i].opacity = Window_Opacity[0] @boxes[i].bitmap = Bitmap.new(Window_Size[0], Window_Size[1]) @boxes[i].bitmap.font.name = Font_Name @boxes[i].bitmap.fill_rect(0, 0, Window_Size[0], Window_Size[1], Window_Colors[0][0]) @boxes[i].bitmap.fill_rect(Window_Border, Window_Border, Window_Size[0]-Window_Border*2, Window_Size[1]-Window_Border*2, Window_Colors[0][1]) @boxes[i].bitmap.draw_icon(opt[1][1], Window_Size[0]/2-12, Window_Size[1]/2-20) @boxes[i].bitmap.font.color = Option_Color @boxes[i].bitmap.draw_text(0,Window_Size[1]/2-20,Window_Size[0], Window_Size[1], opt[1][0], 1) i += 1} end #---------------------------------------------------------------------------- # * Criação do Fundo #---------------------------------------------------------------------------- # Aqui se verifica se o fundo do menu será por imagens ou uma imagem do mapa # e se cria ele dependendo do resultado e aplicando os efeitos configurados #---------------------------------------------------------------------------- def create_background @background_sprite = Sprite.new @background_sprite.bitmap = SceneManager.bg_bitmap @background_sprite.bitmap.blur if Bg_Blur @background_sprite.tone = Bg_Tone end #---------------------------------------------------------------------------- # * Criação das caixas de status dos personagens #---------------------------------------------------------------------------- # Aqui são criadas as caixas com oss status dos personagens, desenhadas as # barras de HP e MP, a face e o char do personagem (conforme configurado), # seu nome e estado #---------------------------------------------------------------------------- def create_status_boxes @status_boxes = [] for i in 0...$game_party.members.size @status_boxes[i] = Status_Box.new(Status_Windows_Positions[i][0],Status_Windows_Positions[i][1], Status_Windows_Size[0], Status_Windows_Size[1], $game_party.members[i]) break if i == 3 end end #---------------------------------------------------------------------------- # * Atualização do processo #---------------------------------------------------------------------------- # Aqui é verificado se algum botão foi apertado e executa a ação definida # para aquele botão #---------------------------------------------------------------------------- def update super if !@formation #------------------------------------------------------------------------ # * Aplicação do efeito de mudança de opacidade das caixas conforme o # index para criar o efeito de a caixa estar selecionada #------------------------------------------------------------------------ i = 0 @boxes.each {|box| i == @index ? box.opacity = Window_Opacity[1] : box.opacity = Window_Opacity[0] i += 1 } #------------------------------------------------------------------------ # * Verificação dos botões pressionados #------------------------------------------------------------------------ @index += 1 if (Input.repeat?(:DOWN) or Input.repeat?(:RIGHT)) and @index < @boxes.size - 1 @index -= 1 if (Input.repeat?(:UP) or Input.repeat?(:LEFT)) and @index > 0 if Input.trigger?(:C) eval(@commands[@index]) end SceneManager.return if Input.trigger?(:B) #-------------------------------------------------------------------------- # * Atualização do processo de alteração de formação caso a caixa com o # ator a ter sua posição alterada já tenha sido selecionada #-------------------------------------------------------------------------- elsif @formation and !@selected_index.nil? #------------------------------------------------------------------------ # * Verificação dos botões pressionados #------------------------------------------------------------------------ @index += 1 if (Input.repeat?(:DOWN) or Input.repeat?(:RIGHT)) and @index < @status_boxes.size - 1 @index -= 1 if (Input.repeat?(:UP) or Input.repeat?(:LEFT)) and @index > 0 @status_boxes[@selected_index].z = 2 @status_boxes[@selected_index].move(Status_Windows_Positions[@index][0], Status_Windows_Positions[@index][1], 5) cancel_formation if Input.trigger?(:B) change_position if Input.trigger?(:C) else #-------------------------------------------------------------------------- # * Atualização do processo de alteração de formação #-------------------------------------------------------------------------- #------------------------------------------------------------------------ # * Aplicação do efeito de mudança de opacidade das caixas conforme o # index para criar o efeito de a caixa estar selecionada #------------------------------------------------------------------------ i = 0 @status_boxes.each{ |box| i == @index ? box.opacity = Window_Opacity[1] : box.opacity = Window_Opacity[0] i += 1 } #------------------------------------------------------------------------ # * Verificação dos botões pressionados #------------------------------------------------------------------------ @index += 1 if (Input.repeat?(:DOWN) or Input.repeat?(:RIGHT)) and @index < @status_boxes.size - 1 @index -= 1 if (Input.repeat?(:UP) or Input.repeat?(:LEFT)) and @index > 0 if Input.trigger?(:B) @status_boxes.each {|box| box.opacity = Window_Opacity[0]} @formation = false @index = @old_index end @selected_index = @index if Input.trigger?(:C) end end #---------------------------------------------------------------------------- # * Cancelamento da Alteração na Formação #---------------------------------------------------------------------------- # Aqui se processa o concelamento da alteração na formação do grupo, as # caixas voltam para seu devido lugar e a index é redefinida para esta caixa #---------------------------------------------------------------------------- def cancel_formation @status_boxes[@selected_index].move(Status_Windows_Positions[@selected_index][0], Status_Windows_Positions[@selected_index][1], 3) @index = @selected_index @selected_index = nil end #---------------------------------------------------------------------------- # #---------------------------------------------------------------------------- # #---------------------------------------------------------------------------- def change_position @status_boxes[@index].move(Status_Windows_Positions[@selected_index][0], Status_Windows_Positions[@selected_index][1], 5) @status_boxes[@selected_index].z = 0 box = @status_boxes[@selected_index] $game_party.swap_order(@selected_index, @index) @status_boxes[@selected_index] = @status_boxes[@index] @status_boxes[@index] = box @selected_index = nil end alias colosseum_terminate terminate #---------------------------------------------------------------------------- # * Finalização do processo #---------------------------------------------------------------------------- # Aqui são apagados todos os gráficos da cena #---------------------------------------------------------------------------- def terminate colosseum_terminate @boxes.each {|box| box.dispose} @status_boxes.each {|box| box.dispose} end #---------------------------------------------------------------------------- # * Comando de Alteração de Formação adaptado #---------------------------------------------------------------------------- # Aqui é processada a mudança de posição dos personagens no grupo, o método # foi adaptado para usar as caixas ao invés das janelas do menu padrão #---------------------------------------------------------------------------- def command_formation @old_index = @index @boxes.each {|box| box.opacity = Window_Opacity[0]} @formation = true @index = 0 end end #============================================================================== # ** Status_Box #------------------------------------------------------------------------------ # Essa é a classe das caixas de status do menu #============================================================================== class Status_Box < Sprite include Colosseum_SceneMenu attr_accessor :activate #---------------------------------------------------------------------------- # * Inicialização do Processo #---------------------------------------------------------------------------- # Aqui são chamados os métodos de criação e as principais variáveis são # criadas #---------------------------------------------------------------------------- def initialize(x,y,width,height,actor) super(nil) #-------------------------------------------------------------------------- # * Criação dos Gráficos #-------------------------------------------------------------------------- self.bitmap = Bitmap.new(width,height) self.bitmap.fill_rect(0, 0, width, height, Window_Colors[0][0]) self.bitmap.fill_rect(Window_Border, Window_Border, width-Window_Border*2, height-Window_Border*2, Window_Colors[0][1]) self.x = x self.y = y self.bitmap.font.name = Font_Name self.opacity = Window_Opacity[0] self.bitmap.draw_face(actor.face_name, actor.face_index, Window_Border + 23, height/2-48) self.bitmap.draw_character(actor.character_name, actor.character_index, Window_Border + 101, height) self.bitmap.font.color = Text_Color self.bitmap.draw_text(124 + Window_Border, self.height/2-32,self.width, 24, actor.name) self.bitmap.fill_rect(124 + Window_Border, self.height/2+2, self.width-Window_Border-144 * (actor.mhp / actor.hp),8,Hp_Bar_Color) self.bitmap.fill_rect(124 + Window_Border, self.height/2+22, self.width-Window_Border-144 * (actor.mmp / actor.mp),8,Mp_Bar_Color) self.bitmap.font.color = Option_Color self.bitmap.draw_text(124 + Window_Border, self.height/2-8, self.width, 24, Vocab.hp_a) self.bitmap.draw_text(124 + Window_Border, self.height/2+12, self.width, 24, Vocab.mp_a) #-------------------------------------------------------------------------- # * Criação das Variáveis #-------------------------------------------------------------------------- @activate = false @target_x = x @target_y = y @movement_speed = 0 end #---------------------------------------------------------------------------- # * Atualização da posição da caixa #---------------------------------------------------------------------------- # Aqui é verificado se o destino está mais à direita ou à esquerda e mais # acima ou abaixo e a caixa é movimentada conforme o resultado #---------------------------------------------------------------------------- def update_movement self.x += @movement_speed if @target_x > self.x self.x -= @movement_speed if @target_x < self.x self.y += @movement_speed if @target_y > self.y self.y -= @movement_speed if @target_y < self.y end #---------------------------------------------------------------------------- # * Movimento da janela #---------------------------------------------------------------------------- # Esse é o método usado para mover uma caixa para o ponto x 'target_x', # ponto y 'target_y', 'speed' pixels por vez #---------------------------------------------------------------------------- def move(target_x,target_y,speed) #-------------------------------------------------------------------------- # * Definição das variáveis #-------------------------------------------------------------------------- @target_x = target_x @target_y = target_y @movement_speed = speed #-------------------------------------------------------------------------- # * Efeito de Movimentação #-------------------------------------------------------------------------- until self.x == @target_x and self.y == @target_y Graphics.update update_movement end end end #============================================================================== # ** Bitmap #------------------------------------------------------------------------------ # Nessa classe é adicionado um método que permite que se desenhe um ícone em um # Bitmap #============================================================================== class Bitmap #---------------------------------------------------------------------------- # * Método de desenho de um ícone no bitmap # icon_index : O índice do ícone no arquivo "Iconset" # x : A posição horizontal do ícone no Bitmap # y : A posição vertical do ícone no Bitmap #---------------------------------------------------------------------------- def draw_icon(icon_index,x,y,enabled=true) bitmap = Cache.system("Iconset") rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24) self.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha) end #-------------------------------------------------------------------------- # * Desenho do gráfico de rosto # face_name : nome do gráfico de face # face_index : índice do gráfico de face # x : coordenada X # y : coordenada Y # enabled : habilitar flag, translucido quando false #-------------------------------------------------------------------------- def draw_face(face_name, face_index, x, y, enabled = true) face = Cache.face(face_name) rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96, 96, 96) self.blt(x, y, face, rect, enabled ? 255 : translucent_alpha) face.dispose end #-------------------------------------------------------------------------- # * Desenho do gráfico do personagem # character_name : nome do gráfico do personagem # character_index : índice do gráfico de personagem # x : coordenada X # y : coordenada Y #-------------------------------------------------------------------------- def draw_character(character_name, character_index, x, y) return unless character_name bitmap = Cache.character(character_name) sign = character_name[/^[\!\$]./] if sign && sign.include?('$') cw = bitmap.width / 3 ch = bitmap.height / 4 else cw = bitmap.width / 12 ch = bitmap.height / 8 end n = character_index src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch) self.blt(x - cw / 2, y - ch, bitmap, src_rect) end #-------------------------------------------------------------------------- # * Aquisção do valor de transparência #-------------------------------------------------------------------------- def translucent_alpha return 160 end end #============================================================================== # ** SceneManager #------------------------------------------------------------------------------ # Nesse módulo será editado o método snapshot_for_background para que crie uma # versão pura do snapshot, sem aplicação de efeitos, e adicionado um método # para acesso do mesmo #============================================================================== module SceneManager #-------------------------------------------------------------------------- # * Snapshot para usar como fundo #-------------------------------------------------------------------------- def self.snapshot_for_background @background_bitmap.dispose if @background_bitmap @bg_bitmap.dispose if @bg_bitmap @background_bitmap = Graphics.snap_to_bitmap @bg_bitmap = Graphics.snap_to_bitmap @background_bitmap.blur end #---------------------------------------------------------------------------- # * Método para acesso do bitmap com o fundo puro #---------------------------------------------------------------------------- def self.bg_bitmap @bg_bitmap end end